@vandeepunk/pi-coding-agent 0.0.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/CHANGELOG.md +814 -16
  2. package/README.md +66 -27
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +7 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/cli/args.d.ts +9 -4
  12. package/dist/cli/args.d.ts.map +1 -1
  13. package/dist/cli/args.js +61 -22
  14. package/dist/cli/args.js.map +1 -1
  15. package/dist/cli/file-processor.d.ts.map +1 -1
  16. package/dist/cli/file-processor.js +4 -0
  17. package/dist/cli/file-processor.js.map +1 -1
  18. package/dist/cli/initial-message.d.ts +18 -0
  19. package/dist/cli/initial-message.d.ts.map +1 -0
  20. package/dist/cli/initial-message.js +22 -0
  21. package/dist/cli/initial-message.js.map +1 -0
  22. package/dist/cli/session-picker.d.ts.map +1 -1
  23. package/dist/cli/session-picker.js +2 -1
  24. package/dist/cli/session-picker.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +3 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config.d.ts +1 -1
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +2 -2
  31. package/dist/config.js.map +1 -1
  32. package/dist/core/agent-session-runtime.d.ts +83 -0
  33. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  34. package/dist/core/agent-session-runtime.js +236 -0
  35. package/dist/core/agent-session-runtime.js.map +1 -0
  36. package/dist/core/agent-session-services.d.ts +86 -0
  37. package/dist/core/agent-session-services.d.ts.map +1 -0
  38. package/dist/core/agent-session-services.js +116 -0
  39. package/dist/core/agent-session-services.js.map +1 -0
  40. package/dist/core/agent-session.d.ts +63 -49
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +599 -370
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/auth-storage.d.ts +38 -8
  45. package/dist/core/auth-storage.d.ts.map +1 -1
  46. package/dist/core/auth-storage.js +220 -96
  47. package/dist/core/auth-storage.js.map +1 -1
  48. package/dist/core/bash-executor.d.ts +6 -7
  49. package/dist/core/bash-executor.d.ts.map +1 -1
  50. package/dist/core/bash-executor.js +27 -114
  51. package/dist/core/bash-executor.js.map +1 -1
  52. package/dist/core/compaction/branch-summarization.d.ts +2 -0
  53. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  54. package/dist/core/compaction/branch-summarization.js +3 -2
  55. package/dist/core/compaction/branch-summarization.js.map +1 -1
  56. package/dist/core/compaction/compaction.d.ts +3 -3
  57. package/dist/core/compaction/compaction.d.ts.map +1 -1
  58. package/dist/core/compaction/compaction.js +31 -25
  59. package/dist/core/compaction/compaction.js.map +1 -1
  60. package/dist/core/compaction/utils.d.ts +3 -0
  61. package/dist/core/compaction/utils.d.ts.map +1 -1
  62. package/dist/core/compaction/utils.js +16 -1
  63. package/dist/core/compaction/utils.js.map +1 -1
  64. package/dist/core/exec.d.ts.map +1 -1
  65. package/dist/core/exec.js +7 -3
  66. package/dist/core/exec.js.map +1 -1
  67. package/dist/core/export-html/index.d.ts +7 -4
  68. package/dist/core/export-html/index.d.ts.map +1 -1
  69. package/dist/core/export-html/index.js +10 -8
  70. package/dist/core/export-html/index.js.map +1 -1
  71. package/dist/core/export-html/template.css +43 -13
  72. package/dist/core/export-html/template.html +1 -0
  73. package/dist/core/export-html/template.js +118 -14
  74. package/dist/core/export-html/tool-renderer.d.ts +9 -4
  75. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  76. package/dist/core/export-html/tool-renderer.js +48 -10
  77. package/dist/core/export-html/tool-renderer.js.map +1 -1
  78. package/dist/core/extensions/index.d.ts +5 -4
  79. package/dist/core/extensions/index.d.ts.map +1 -1
  80. package/dist/core/extensions/index.js +2 -2
  81. package/dist/core/extensions/index.js.map +1 -1
  82. package/dist/core/extensions/loader.d.ts.map +1 -1
  83. package/dist/core/extensions/loader.js +49 -13
  84. package/dist/core/extensions/loader.js.map +1 -1
  85. package/dist/core/extensions/runner.d.ts +13 -11
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +139 -64
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +174 -34
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js +10 -0
  92. package/dist/core/extensions/types.js.map +1 -1
  93. package/dist/core/extensions/wrapper.d.ts +4 -11
  94. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  95. package/dist/core/extensions/wrapper.js +6 -86
  96. package/dist/core/extensions/wrapper.js.map +1 -1
  97. package/dist/core/footer-data-provider.d.ts +18 -2
  98. package/dist/core/footer-data-provider.d.ts.map +1 -1
  99. package/dist/core/footer-data-provider.js +220 -40
  100. package/dist/core/footer-data-provider.js.map +1 -1
  101. package/dist/core/index.d.ts +4 -1
  102. package/dist/core/index.d.ts.map +1 -1
  103. package/dist/core/index.js +4 -1
  104. package/dist/core/index.js.map +1 -1
  105. package/dist/core/keybindings.d.ts +283 -50
  106. package/dist/core/keybindings.d.ts.map +1 -1
  107. package/dist/core/keybindings.js +221 -134
  108. package/dist/core/keybindings.js.map +1 -1
  109. package/dist/core/model-registry.d.ts +33 -3
  110. package/dist/core/model-registry.d.ts.map +1 -1
  111. package/dist/core/model-registry.js +165 -97
  112. package/dist/core/model-registry.js.map +1 -1
  113. package/dist/core/model-resolver.d.ts +35 -1
  114. package/dist/core/model-resolver.d.ts.map +1 -1
  115. package/dist/core/model-resolver.js +205 -32
  116. package/dist/core/model-resolver.js.map +1 -1
  117. package/dist/core/output-guard.d.ts +6 -0
  118. package/dist/core/output-guard.d.ts.map +1 -0
  119. package/dist/core/output-guard.js +59 -0
  120. package/dist/core/output-guard.js.map +1 -0
  121. package/dist/core/package-manager.d.ts +43 -2
  122. package/dist/core/package-manager.d.ts.map +1 -1
  123. package/dist/core/package-manager.js +541 -102
  124. package/dist/core/package-manager.js.map +1 -1
  125. package/dist/core/prompt-templates.d.ts +5 -4
  126. package/dist/core/prompt-templates.d.ts.map +1 -1
  127. package/dist/core/prompt-templates.js +35 -37
  128. package/dist/core/prompt-templates.js.map +1 -1
  129. package/dist/core/resolve-config-value.d.ts +6 -0
  130. package/dist/core/resolve-config-value.d.ts.map +1 -1
  131. package/dist/core/resolve-config-value.js +75 -8
  132. package/dist/core/resolve-config-value.js.map +1 -1
  133. package/dist/core/resource-loader.d.ts +6 -5
  134. package/dist/core/resource-loader.d.ts.map +1 -1
  135. package/dist/core/resource-loader.js +166 -119
  136. package/dist/core/resource-loader.js.map +1 -1
  137. package/dist/core/sdk.d.ts +11 -8
  138. package/dist/core/sdk.d.ts.map +1 -1
  139. package/dist/core/sdk.js +31 -29
  140. package/dist/core/sdk.js.map +1 -1
  141. package/dist/core/session-cwd.d.ts +19 -0
  142. package/dist/core/session-cwd.d.ts.map +1 -0
  143. package/dist/core/session-cwd.js +38 -0
  144. package/dist/core/session-cwd.js.map +1 -0
  145. package/dist/core/session-manager.d.ts +11 -1
  146. package/dist/core/session-manager.d.ts.map +1 -1
  147. package/dist/core/session-manager.js +39 -25
  148. package/dist/core/session-manager.js.map +1 -1
  149. package/dist/core/settings-manager.d.ts +60 -10
  150. package/dist/core/settings-manager.d.ts.map +1 -1
  151. package/dist/core/settings-manager.js +291 -140
  152. package/dist/core/settings-manager.js.map +1 -1
  153. package/dist/core/skills.d.ts +5 -3
  154. package/dist/core/skills.d.ts.map +1 -1
  155. package/dist/core/skills.js +54 -9
  156. package/dist/core/skills.js.map +1 -1
  157. package/dist/core/slash-commands.d.ts +2 -3
  158. package/dist/core/slash-commands.d.ts.map +1 -1
  159. package/dist/core/slash-commands.js +3 -2
  160. package/dist/core/slash-commands.js.map +1 -1
  161. package/dist/core/source-info.d.ts +18 -0
  162. package/dist/core/source-info.d.ts.map +1 -0
  163. package/dist/core/source-info.js +19 -0
  164. package/dist/core/source-info.js.map +1 -0
  165. package/dist/core/system-prompt.d.ts +4 -0
  166. package/dist/core/system-prompt.d.ts.map +1 -1
  167. package/dist/core/system-prompt.js +31 -52
  168. package/dist/core/system-prompt.js.map +1 -1
  169. package/dist/core/timings.d.ts +1 -0
  170. package/dist/core/timings.d.ts.map +1 -1
  171. package/dist/core/timings.js +6 -0
  172. package/dist/core/timings.js.map +1 -1
  173. package/dist/core/tools/bash.d.ts +24 -6
  174. package/dist/core/tools/bash.d.ts.map +1 -1
  175. package/dist/core/tools/bash.js +225 -115
  176. package/dist/core/tools/bash.js.map +1 -1
  177. package/dist/core/tools/edit-diff.d.ts +23 -1
  178. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  179. package/dist/core/tools/edit-diff.js +151 -57
  180. package/dist/core/tools/edit-diff.js.map +1 -1
  181. package/dist/core/tools/edit.d.ts +20 -6
  182. package/dist/core/tools/edit.d.ts.map +1 -1
  183. package/dist/core/tools/edit.js +111 -61
  184. package/dist/core/tools/edit.js.map +1 -1
  185. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  186. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  187. package/dist/core/tools/file-mutation-queue.js +37 -0
  188. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  189. package/dist/core/tools/find.d.ts +11 -4
  190. package/dist/core/tools/find.d.ts.map +1 -1
  191. package/dist/core/tools/find.js +82 -30
  192. package/dist/core/tools/find.js.map +1 -1
  193. package/dist/core/tools/grep.d.ts +15 -4
  194. package/dist/core/tools/grep.d.ts.map +1 -1
  195. package/dist/core/tools/grep.js +83 -29
  196. package/dist/core/tools/grep.js.map +1 -1
  197. package/dist/core/tools/index.d.ts +63 -21
  198. package/dist/core/tools/index.d.ts.map +1 -1
  199. package/dist/core/tools/index.js +51 -26
  200. package/dist/core/tools/index.js.map +1 -1
  201. package/dist/core/tools/ls.d.ts +9 -3
  202. package/dist/core/tools/ls.d.ts.map +1 -1
  203. package/dist/core/tools/ls.js +67 -13
  204. package/dist/core/tools/ls.js.map +1 -1
  205. package/dist/core/tools/read.d.ts +10 -3
  206. package/dist/core/tools/read.d.ts.map +1 -1
  207. package/dist/core/tools/read.js +110 -51
  208. package/dist/core/tools/read.js.map +1 -1
  209. package/dist/core/tools/render-utils.d.ts +21 -0
  210. package/dist/core/tools/render-utils.d.ts.map +1 -0
  211. package/dist/core/tools/render-utils.js +49 -0
  212. package/dist/core/tools/render-utils.js.map +1 -0
  213. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  214. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  215. package/dist/core/tools/tool-definition-wrapper.js +32 -0
  216. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  217. package/dist/core/tools/write.d.ts +9 -3
  218. package/dist/core/tools/write.d.ts.map +1 -1
  219. package/dist/core/tools/write.js +168 -30
  220. package/dist/core/tools/write.js.map +1 -1
  221. package/dist/index.d.ts +7 -6
  222. package/dist/index.d.ts.map +1 -1
  223. package/dist/index.js +7 -6
  224. package/dist/index.js.map +1 -1
  225. package/dist/main.d.ts.map +1 -1
  226. package/dist/main.js +354 -379
  227. package/dist/main.js.map +1 -1
  228. package/dist/migrations.d.ts.map +1 -1
  229. package/dist/migrations.js +31 -11
  230. package/dist/migrations.js.map +1 -1
  231. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  232. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  233. package/dist/modes/interactive/components/assistant-message.js +14 -3
  234. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  235. package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
  236. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  237. package/dist/modes/interactive/components/bash-execution.js +22 -9
  238. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  239. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  241. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  242. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  243. package/dist/modes/interactive/components/branch-summary-message.js +2 -2
  244. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  245. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  246. package/dist/modes/interactive/components/compaction-summary-message.js +2 -2
  247. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  248. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  249. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  250. package/dist/modes/interactive/components/config-selector.js +14 -14
  251. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  252. package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
  253. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  254. package/dist/modes/interactive/components/custom-editor.js +6 -6
  255. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  256. package/dist/modes/interactive/components/extension-editor.d.ts +5 -2
  257. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  258. package/dist/modes/interactive/components/extension-editor.js +18 -9
  259. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  260. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  261. package/dist/modes/interactive/components/extension-input.js +5 -5
  262. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  263. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  264. package/dist/modes/interactive/components/extension-selector.js +8 -8
  265. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  266. package/dist/modes/interactive/components/footer.d.ts +1 -0
  267. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/footer.js +21 -40
  269. package/dist/modes/interactive/components/footer.js.map +1 -1
  270. package/dist/modes/interactive/components/index.d.ts +1 -1
  271. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/index.js +1 -1
  273. package/dist/modes/interactive/components/index.js.map +1 -1
  274. package/dist/modes/interactive/components/keybinding-hints.d.ts +3 -36
  275. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  276. package/dist/modes/interactive/components/keybinding-hints.js +5 -44
  277. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  278. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  279. package/dist/modes/interactive/components/login-dialog.js +7 -7
  280. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  281. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  282. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/model-selector.js +13 -9
  284. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  285. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  286. package/dist/modes/interactive/components/oauth-selector.js +7 -7
  287. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  288. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  289. package/dist/modes/interactive/components/scoped-models-selector.js +4 -4
  290. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  291. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/session-selector.js +33 -36
  293. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  294. package/dist/modes/interactive/components/settings-selector.d.ts +5 -0
  295. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  296. package/dist/modes/interactive/components/settings-selector.js +25 -1
  297. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  298. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  299. package/dist/modes/interactive/components/show-images-selector.js +5 -1
  300. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  301. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  303. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  304. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  305. package/dist/modes/interactive/components/theme-selector.js +5 -1
  306. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  307. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  308. package/dist/modes/interactive/components/thinking-selector.js +5 -1
  309. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  310. package/dist/modes/interactive/components/tool-execution.d.ts +17 -29
  311. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  312. package/dist/modes/interactive/components/tool-execution.js +139 -501
  313. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  314. package/dist/modes/interactive/components/tree-selector.d.ts +25 -4
  315. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  316. package/dist/modes/interactive/components/tree-selector.js +184 -34
  317. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  318. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/user-message-selector.js +6 -6
  320. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  321. package/dist/modes/interactive/components/user-message.d.ts +1 -0
  322. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  323. package/dist/modes/interactive/components/user-message.js +12 -0
  324. package/dist/modes/interactive/components/user-message.js.map +1 -1
  325. package/dist/modes/interactive/interactive-mode.d.ts +25 -17
  326. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  327. package/dist/modes/interactive/interactive-mode.js +669 -385
  328. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  329. package/dist/modes/interactive/theme/theme.d.ts +3 -0
  330. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  331. package/dist/modes/interactive/theme/theme.js +83 -48
  332. package/dist/modes/interactive/theme/theme.js.map +1 -1
  333. package/dist/modes/print-mode.d.ts +2 -2
  334. package/dist/modes/print-mode.d.ts.map +1 -1
  335. package/dist/modes/print-mode.js +90 -79
  336. package/dist/modes/print-mode.js.map +1 -1
  337. package/dist/modes/rpc/jsonl.d.ts +17 -0
  338. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  339. package/dist/modes/rpc/jsonl.js +49 -0
  340. package/dist/modes/rpc/jsonl.js.map +1 -0
  341. package/dist/modes/rpc/rpc-client.d.ts +1 -1
  342. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  343. package/dist/modes/rpc/rpc-client.js +8 -11
  344. package/dist/modes/rpc/rpc-client.js.map +1 -1
  345. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  346. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  347. package/dist/modes/rpc/rpc-mode.js +130 -87
  348. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  349. package/dist/modes/rpc/rpc-types.d.ts +3 -4
  350. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  351. package/dist/modes/rpc/rpc-types.js.map +1 -1
  352. package/dist/package-manager-cli.d.ts +4 -0
  353. package/dist/package-manager-cli.d.ts.map +1 -0
  354. package/dist/package-manager-cli.js +234 -0
  355. package/dist/package-manager-cli.js.map +1 -0
  356. package/dist/utils/child-process.d.ts +11 -0
  357. package/dist/utils/child-process.d.ts.map +1 -0
  358. package/dist/utils/child-process.js +78 -0
  359. package/dist/utils/child-process.js.map +1 -0
  360. package/dist/utils/clipboard-image.d.ts.map +1 -1
  361. package/dist/utils/clipboard-image.js +94 -11
  362. package/dist/utils/clipboard-image.js.map +1 -1
  363. package/dist/utils/clipboard-native.d.ts +1 -0
  364. package/dist/utils/clipboard-native.d.ts.map +1 -1
  365. package/dist/utils/clipboard-native.js.map +1 -1
  366. package/dist/utils/clipboard.d.ts +1 -1
  367. package/dist/utils/clipboard.d.ts.map +1 -1
  368. package/dist/utils/clipboard.js +27 -16
  369. package/dist/utils/clipboard.js.map +1 -1
  370. package/dist/utils/exif-orientation.d.ts +5 -0
  371. package/dist/utils/exif-orientation.d.ts.map +1 -0
  372. package/dist/utils/exif-orientation.js +158 -0
  373. package/dist/utils/exif-orientation.js.map +1 -0
  374. package/dist/utils/git.d.ts +5 -1
  375. package/dist/utils/git.d.ts.map +1 -1
  376. package/dist/utils/git.js +14 -3
  377. package/dist/utils/git.js.map +1 -1
  378. package/dist/utils/image-convert.d.ts.map +1 -1
  379. package/dist/utils/image-convert.js +5 -1
  380. package/dist/utils/image-convert.js.map +1 -1
  381. package/dist/utils/image-resize.d.ts +5 -5
  382. package/dist/utils/image-resize.d.ts.map +1 -1
  383. package/dist/utils/image-resize.js +51 -95
  384. package/dist/utils/image-resize.js.map +1 -1
  385. package/dist/utils/paths.d.ts +7 -0
  386. package/dist/utils/paths.d.ts.map +1 -0
  387. package/dist/utils/paths.js +19 -0
  388. package/dist/utils/paths.js.map +1 -0
  389. package/dist/utils/tools-manager.d.ts.map +1 -1
  390. package/dist/utils/tools-manager.js +67 -22
  391. package/dist/utils/tools-manager.js.map +1 -1
  392. package/docs/compaction.md +6 -2
  393. package/docs/custom-provider.md +57 -9
  394. package/docs/development.md +3 -1
  395. package/docs/extensions.md +437 -67
  396. package/docs/json.md +5 -2
  397. package/docs/keybindings.md +108 -107
  398. package/docs/models.md +50 -2
  399. package/docs/packages.md +17 -10
  400. package/docs/prompt-templates.md +6 -6
  401. package/docs/providers.md +10 -1
  402. package/docs/rpc.md +78 -18
  403. package/docs/sdk.md +261 -96
  404. package/docs/settings.md +28 -3
  405. package/docs/skills.md +9 -4
  406. package/docs/terminal-setup.md +39 -3
  407. package/docs/tmux.md +61 -0
  408. package/docs/tree.md +15 -3
  409. package/docs/tui.md +2 -2
  410. package/examples/extensions/README.md +3 -0
  411. package/examples/extensions/antigravity-image-gen.ts +12 -7
  412. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  413. package/examples/extensions/commands.ts +3 -3
  414. package/examples/extensions/custom-compaction.ts +17 -4
  415. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  416. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  417. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  418. package/examples/extensions/custom-provider-gitlab-duo/test.ts +2 -2
  419. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  420. package/examples/extensions/doom-overlay/doom/build.sh +2 -2
  421. package/examples/extensions/dynamic-tools.ts +74 -0
  422. package/examples/extensions/handoff.ts +5 -2
  423. package/examples/extensions/hello.ts +18 -17
  424. package/examples/extensions/hidden-thinking-label.ts +53 -0
  425. package/examples/extensions/minimal-mode.ts +14 -14
  426. package/examples/extensions/overlay-qa-tests.ts +468 -1
  427. package/examples/extensions/preset.ts +2 -3
  428. package/examples/extensions/provider-payload.ts +14 -0
  429. package/examples/extensions/qna.ts +5 -2
  430. package/examples/extensions/question.ts +2 -2
  431. package/examples/extensions/questionnaire.ts +2 -2
  432. package/examples/extensions/rpc-demo.ts +3 -9
  433. package/examples/extensions/sandbox/index.ts +6 -3
  434. package/examples/extensions/status-line.ts +0 -8
  435. package/examples/extensions/subagent/README.md +4 -4
  436. package/examples/extensions/subagent/agents.ts +2 -3
  437. package/examples/extensions/subagent/index.ts +30 -8
  438. package/examples/extensions/summarize.ts +15 -4
  439. package/examples/extensions/todo.ts +2 -4
  440. package/examples/extensions/tool-override.ts +10 -9
  441. package/examples/extensions/tools.ts +0 -5
  442. package/examples/extensions/trigger-compact.ts +11 -1
  443. package/examples/extensions/truncated-tool.ts +8 -5
  444. package/examples/extensions/widget-placement.ts +4 -12
  445. package/examples/extensions/with-deps/index.ts +1 -5
  446. package/examples/extensions/with-deps/package-lock.json +2 -2
  447. package/examples/extensions/with-deps/package.json +1 -1
  448. package/examples/sdk/02-custom-model.ts +2 -2
  449. package/examples/sdk/04-skills.ts +8 -2
  450. package/examples/sdk/08-prompt-templates.ts +4 -3
  451. package/examples/sdk/09-api-keys-and-oauth.ts +5 -5
  452. package/examples/sdk/10-settings.ts +13 -0
  453. package/examples/sdk/12-full-control.ts +2 -3
  454. package/examples/sdk/13-session-runtime.ts +67 -0
  455. package/examples/sdk/README.md +10 -7
  456. package/package.json +98 -94
  457. /package/examples/extensions/subagent/{commands → prompts}/implement-and-review.md +0 -0
  458. /package/examples/extensions/subagent/{commands → prompts}/implement.md +0 -0
  459. /package/examples/extensions/subagent/{commands → prompts}/scout-and-plan.md +0 -0
@@ -1,7 +1,7 @@
1
- import { Container, getEditorKeybindings, Input, matchesKey, Spacer, Text, TruncatedText, truncateToWidth, } from "@mariozechner/pi-tui";
1
+ import { Container, getKeybindings, Input, matchesKey, Spacer, Text, TruncatedText, truncateToWidth, } from "@mariozechner/pi-tui";
2
2
  import { theme } from "../theme/theme.js";
3
3
  import { DynamicBorder } from "./dynamic-border.js";
4
- import { keyHint } from "./keybinding-hints.js";
4
+ import { keyHint, keyText } from "./keybinding-hints.js";
5
5
  class TreeList {
6
6
  flatNodes = [];
7
7
  filteredNodes = [];
@@ -12,14 +12,19 @@ class TreeList {
12
12
  searchQuery = "";
13
13
  toolCallMap = new Map();
14
14
  multipleRoots = false;
15
+ showLabelTimestamps = false;
15
16
  activePathIds = new Set();
17
+ visibleParentMap = new Map();
18
+ visibleChildrenMap = new Map();
16
19
  lastSelectedId = null;
20
+ foldedNodes = new Set();
17
21
  onSelect;
18
22
  onCancel;
19
23
  onLabelEdit;
20
- constructor(tree, currentLeafId, maxVisibleLines, initialSelectedId) {
24
+ constructor(tree, currentLeafId, maxVisibleLines, initialSelectedId, initialFilterMode) {
21
25
  this.currentLeafId = currentLeafId;
22
26
  this.maxVisibleLines = maxVisibleLines;
27
+ this.filterMode = initialFilterMode ?? "default";
23
28
  this.multipleRoots = tree.length > 1;
24
29
  this.flatNodes = this.flattenTree(tree);
25
30
  this.buildActivePath();
@@ -217,7 +222,8 @@ class TreeList {
217
222
  const isSettingsEntry = entry.type === "label" ||
218
223
  entry.type === "custom" ||
219
224
  entry.type === "model_change" ||
220
- entry.type === "thinking_level_change";
225
+ entry.type === "thinking_level_change" ||
226
+ entry.type === "session_info";
221
227
  switch (this.filterMode) {
222
228
  case "user-only":
223
229
  // Just user messages
@@ -249,6 +255,17 @@ class TreeList {
249
255
  }
250
256
  return true;
251
257
  });
258
+ // Filter out descendants of folded nodes.
259
+ if (this.foldedNodes.size > 0) {
260
+ const skipSet = new Set();
261
+ for (const flatNode of this.flatNodes) {
262
+ const { id, parentId } = flatNode.node.entry;
263
+ if (parentId != null && (this.foldedNodes.has(parentId) || skipSet.has(parentId))) {
264
+ skipSet.add(id);
265
+ }
266
+ }
267
+ this.filteredNodes = this.filteredNodes.filter((flatNode) => !skipSet.has(flatNode.node.entry.id));
268
+ }
252
269
  // Recalculate visual structure (indent, connectors, gutters) based on visible tree
253
270
  this.recalculateVisualStructure();
254
271
  // Try to preserve cursor on the same node, or find nearest visible ancestor
@@ -373,6 +390,9 @@ class TreeList {
373
390
  ]);
374
391
  }
375
392
  }
393
+ // Store visible tree maps for ancestor/descendant lookups in navigation
394
+ this.visibleParentMap = visibleParent;
395
+ this.visibleChildrenMap = visibleChildren;
376
396
  }
377
397
  /** Get searchable text content from a node */
378
398
  getSearchableText(node) {
@@ -411,6 +431,11 @@ class TreeList {
411
431
  case "branch_summary":
412
432
  parts.push("branch summary", entry.summary);
413
433
  break;
434
+ case "session_info":
435
+ parts.push("title");
436
+ if (entry.name)
437
+ parts.push(entry.name);
438
+ break;
414
439
  case "model_change":
415
440
  parts.push("model", entry.modelId);
416
441
  break;
@@ -433,33 +458,41 @@ class TreeList {
433
458
  getSelectedNode() {
434
459
  return this.filteredNodes[this.selectedIndex]?.node;
435
460
  }
436
- updateNodeLabel(entryId, label) {
461
+ updateNodeLabel(entryId, label, labelTimestamp) {
437
462
  for (const flatNode of this.flatNodes) {
438
463
  if (flatNode.node.entry.id === entryId) {
439
464
  flatNode.node.label = label;
465
+ flatNode.node.labelTimestamp = label ? (labelTimestamp ?? new Date().toISOString()) : undefined;
440
466
  break;
441
467
  }
442
468
  }
443
469
  }
444
- getFilterLabel() {
470
+ getStatusLabels() {
471
+ let labels = "";
445
472
  switch (this.filterMode) {
446
473
  case "no-tools":
447
- return " [no-tools]";
474
+ labels += " [no-tools]";
475
+ break;
448
476
  case "user-only":
449
- return " [user]";
477
+ labels += " [user]";
478
+ break;
450
479
  case "labeled-only":
451
- return " [labeled]";
480
+ labels += " [labeled]";
481
+ break;
452
482
  case "all":
453
- return " [all]";
454
- default:
455
- return "";
483
+ labels += " [all]";
484
+ break;
485
+ }
486
+ if (this.showLabelTimestamps) {
487
+ labels += " [+label time]";
456
488
  }
489
+ return labels;
457
490
  }
458
491
  render(width) {
459
492
  const lines = [];
460
493
  if (this.filteredNodes.length === 0) {
461
494
  lines.push(truncateToWidth(theme.fg("muted", " No entries found"), width));
462
- lines.push(truncateToWidth(theme.fg("muted", ` (0/0)${this.getFilterLabel()}`), width));
495
+ lines.push(truncateToWidth(theme.fg("muted", ` (0/0)${this.getStatusLabels()}`), width));
463
496
  return lines;
464
497
  }
465
498
  const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisibleLines / 2), this.filteredNodes.length - this.maxVisibleLines));
@@ -479,6 +512,7 @@ class TreeList {
479
512
  // Build prefix char by char, placing gutters and connector at their positions
480
513
  const totalChars = displayIndent * 3;
481
514
  const prefixChars = [];
515
+ const isFolded = this.foldedNodes.has(entry.id);
482
516
  for (let i = 0; i < totalChars; i++) {
483
517
  const level = Math.floor(i / 3);
484
518
  const posInLevel = i % 3;
@@ -493,12 +527,13 @@ class TreeList {
493
527
  }
494
528
  }
495
529
  else if (connector && level === connectorPosition) {
496
- // Connector at this level
530
+ // Connector at this level, with fold indicator
497
531
  if (posInLevel === 0) {
498
532
  prefixChars.push(flatNode.isLast ? "└" : "├");
499
533
  }
500
534
  else if (posInLevel === 1) {
501
- prefixChars.push("─");
535
+ const foldable = this.isFoldable(entry.id);
536
+ prefixChars.push(isFolded ? "⊞" : foldable ? "⊟" : "─");
502
537
  }
503
538
  else {
504
539
  prefixChars.push(" ");
@@ -509,18 +544,24 @@ class TreeList {
509
544
  }
510
545
  }
511
546
  const prefix = prefixChars.join("");
547
+ // Fold marker for nodes without connectors (roots)
548
+ const showsFoldInConnector = flatNode.showConnector && !flatNode.isVirtualRootChild;
549
+ const foldMarker = isFolded && !showsFoldInConnector ? theme.fg("accent", "⊞ ") : "";
512
550
  // Active path marker - shown right before the entry text
513
551
  const isOnActivePath = this.activePathIds.has(entry.id);
514
552
  const pathMarker = isOnActivePath ? theme.fg("accent", "• ") : "";
515
553
  const label = flatNode.node.label ? theme.fg("warning", `[${flatNode.node.label}] `) : "";
554
+ const labelTimestamp = this.showLabelTimestamps && flatNode.node.label && flatNode.node.labelTimestamp
555
+ ? theme.fg("muted", `${this.formatLabelTimestamp(flatNode.node.labelTimestamp)} `)
556
+ : "";
516
557
  const content = this.getEntryDisplayText(flatNode.node, isSelected);
517
- let line = cursor + theme.fg("dim", prefix) + pathMarker + label + content;
558
+ let line = cursor + theme.fg("dim", prefix) + foldMarker + pathMarker + label + labelTimestamp + content;
518
559
  if (isSelected) {
519
560
  line = theme.bg("selectedBg", line);
520
561
  }
521
562
  lines.push(truncateToWidth(line, width));
522
563
  }
523
- lines.push(truncateToWidth(theme.fg("muted", ` (${this.selectedIndex + 1}/${this.filteredNodes.length})${this.getFilterLabel()}`), width));
564
+ lines.push(truncateToWidth(theme.fg("muted", ` (${this.selectedIndex + 1}/${this.filteredNodes.length})${this.getStatusLabels()}`), width));
524
565
  return lines;
525
566
  }
526
567
  getEntryDisplayText(node, isSelected) {
@@ -602,11 +643,35 @@ class TreeList {
602
643
  case "label":
603
644
  result = theme.fg("dim", `[label: ${entry.label ?? "(cleared)"}]`);
604
645
  break;
646
+ case "session_info":
647
+ result = entry.name
648
+ ? [theme.fg("dim", "[title: "), theme.fg("dim", entry.name), theme.fg("dim", "]")].join("")
649
+ : [theme.fg("dim", "[title: "), theme.italic(theme.fg("dim", "empty")), theme.fg("dim", "]")].join("");
650
+ break;
605
651
  default:
606
652
  result = "";
607
653
  }
608
654
  return isSelected ? theme.bold(result) : result;
609
655
  }
656
+ formatLabelTimestamp(timestamp) {
657
+ const date = new Date(timestamp);
658
+ const now = new Date();
659
+ const hours = date.getHours().toString().padStart(2, "0");
660
+ const minutes = date.getMinutes().toString().padStart(2, "0");
661
+ const time = `${hours}:${minutes}`;
662
+ if (date.getFullYear() === now.getFullYear() &&
663
+ date.getMonth() === now.getMonth() &&
664
+ date.getDate() === now.getDate()) {
665
+ return time;
666
+ }
667
+ const month = date.getMonth() + 1;
668
+ const day = date.getDate();
669
+ if (date.getFullYear() === now.getFullYear()) {
670
+ return `${month}/${day} ${time}`;
671
+ }
672
+ const year = date.getFullYear().toString().slice(-2);
673
+ return `${year}/${month}/${day} ${time}`;
674
+ }
610
675
  extractContent(content) {
611
676
  const maxLen = 200;
612
677
  if (typeof content === "string")
@@ -696,30 +761,51 @@ class TreeList {
696
761
  }
697
762
  }
698
763
  handleInput(keyData) {
699
- const kb = getEditorKeybindings();
700
- if (kb.matches(keyData, "selectUp")) {
764
+ const kb = getKeybindings();
765
+ if (kb.matches(keyData, "tui.select.up")) {
701
766
  this.selectedIndex = this.selectedIndex === 0 ? this.filteredNodes.length - 1 : this.selectedIndex - 1;
702
767
  }
703
- else if (kb.matches(keyData, "selectDown")) {
768
+ else if (kb.matches(keyData, "tui.select.down")) {
704
769
  this.selectedIndex = this.selectedIndex === this.filteredNodes.length - 1 ? 0 : this.selectedIndex + 1;
705
770
  }
706
- else if (kb.matches(keyData, "cursorLeft")) {
771
+ else if (kb.matches(keyData, "app.tree.foldOrUp")) {
772
+ const currentId = this.filteredNodes[this.selectedIndex]?.node.entry.id;
773
+ if (currentId && this.isFoldable(currentId) && !this.foldedNodes.has(currentId)) {
774
+ this.foldedNodes.add(currentId);
775
+ this.applyFilter();
776
+ }
777
+ else {
778
+ this.selectedIndex = this.findBranchSegmentStart("up");
779
+ }
780
+ }
781
+ else if (kb.matches(keyData, "app.tree.unfoldOrDown")) {
782
+ const currentId = this.filteredNodes[this.selectedIndex]?.node.entry.id;
783
+ if (currentId && this.foldedNodes.has(currentId)) {
784
+ this.foldedNodes.delete(currentId);
785
+ this.applyFilter();
786
+ }
787
+ else {
788
+ this.selectedIndex = this.findBranchSegmentStart("down");
789
+ }
790
+ }
791
+ else if (kb.matches(keyData, "tui.editor.cursorLeft") || kb.matches(keyData, "tui.select.pageUp")) {
707
792
  // Page up
708
793
  this.selectedIndex = Math.max(0, this.selectedIndex - this.maxVisibleLines);
709
794
  }
710
- else if (kb.matches(keyData, "cursorRight")) {
795
+ else if (kb.matches(keyData, "tui.editor.cursorRight") || kb.matches(keyData, "tui.select.pageDown")) {
711
796
  // Page down
712
797
  this.selectedIndex = Math.min(this.filteredNodes.length - 1, this.selectedIndex + this.maxVisibleLines);
713
798
  }
714
- else if (kb.matches(keyData, "selectConfirm")) {
799
+ else if (kb.matches(keyData, "tui.select.confirm")) {
715
800
  const selected = this.filteredNodes[this.selectedIndex];
716
801
  if (selected && this.onSelect) {
717
802
  this.onSelect(selected.node.entry.id);
718
803
  }
719
804
  }
720
- else if (kb.matches(keyData, "selectCancel")) {
805
+ else if (kb.matches(keyData, "tui.select.cancel")) {
721
806
  if (this.searchQuery) {
722
807
  this.searchQuery = "";
808
+ this.foldedNodes.clear();
723
809
  this.applyFilter();
724
810
  }
725
811
  else {
@@ -729,26 +815,31 @@ class TreeList {
729
815
  else if (matchesKey(keyData, "ctrl+d")) {
730
816
  // Direct filter: default
731
817
  this.filterMode = "default";
818
+ this.foldedNodes.clear();
732
819
  this.applyFilter();
733
820
  }
734
821
  else if (matchesKey(keyData, "ctrl+t")) {
735
822
  // Toggle filter: no-tools ↔ default
736
823
  this.filterMode = this.filterMode === "no-tools" ? "default" : "no-tools";
824
+ this.foldedNodes.clear();
737
825
  this.applyFilter();
738
826
  }
739
827
  else if (matchesKey(keyData, "ctrl+u")) {
740
828
  // Toggle filter: user-only ↔ default
741
829
  this.filterMode = this.filterMode === "user-only" ? "default" : "user-only";
830
+ this.foldedNodes.clear();
742
831
  this.applyFilter();
743
832
  }
744
833
  else if (matchesKey(keyData, "ctrl+l")) {
745
834
  // Toggle filter: labeled-only ↔ default
746
835
  this.filterMode = this.filterMode === "labeled-only" ? "default" : "labeled-only";
836
+ this.foldedNodes.clear();
747
837
  this.applyFilter();
748
838
  }
749
839
  else if (matchesKey(keyData, "ctrl+a")) {
750
840
  // Toggle filter: all ↔ default
751
841
  this.filterMode = this.filterMode === "all" ? "default" : "all";
842
+ this.foldedNodes.clear();
752
843
  this.applyFilter();
753
844
  }
754
845
  else if (matchesKey(keyData, "shift+ctrl+o")) {
@@ -756,6 +847,7 @@ class TreeList {
756
847
  const modes = ["default", "no-tools", "user-only", "labeled-only", "all"];
757
848
  const currentIndex = modes.indexOf(this.filterMode);
758
849
  this.filterMode = modes[(currentIndex - 1 + modes.length) % modes.length];
850
+ this.foldedNodes.clear();
759
851
  this.applyFilter();
760
852
  }
761
853
  else if (matchesKey(keyData, "ctrl+o")) {
@@ -763,20 +855,25 @@ class TreeList {
763
855
  const modes = ["default", "no-tools", "user-only", "labeled-only", "all"];
764
856
  const currentIndex = modes.indexOf(this.filterMode);
765
857
  this.filterMode = modes[(currentIndex + 1) % modes.length];
858
+ this.foldedNodes.clear();
766
859
  this.applyFilter();
767
860
  }
768
- else if (kb.matches(keyData, "deleteCharBackward")) {
861
+ else if (kb.matches(keyData, "tui.editor.deleteCharBackward")) {
769
862
  if (this.searchQuery.length > 0) {
770
863
  this.searchQuery = this.searchQuery.slice(0, -1);
864
+ this.foldedNodes.clear();
771
865
  this.applyFilter();
772
866
  }
773
867
  }
774
- else if (matchesKey(keyData, "shift+l")) {
868
+ else if (kb.matches(keyData, "app.tree.editLabel")) {
775
869
  const selected = this.filteredNodes[this.selectedIndex];
776
870
  if (selected && this.onLabelEdit) {
777
871
  this.onLabelEdit(selected.node.entry.id, selected.node.label);
778
872
  }
779
873
  }
874
+ else if (kb.matches(keyData, "app.tree.toggleLabelTimestamp")) {
875
+ this.showLabelTimestamps = !this.showLabelTimestamps;
876
+ }
780
877
  else {
781
878
  const hasControlChars = [...keyData].some((ch) => {
782
879
  const code = ch.charCodeAt(0);
@@ -784,10 +881,64 @@ class TreeList {
784
881
  });
785
882
  if (!hasControlChars && keyData.length > 0) {
786
883
  this.searchQuery += keyData;
884
+ this.foldedNodes.clear();
787
885
  this.applyFilter();
788
886
  }
789
887
  }
790
888
  }
889
+ /**
890
+ * Whether a node can be folded. A node is foldable if it has visible children
891
+ * and is either a root (no visible parent) or a segment start (visible parent
892
+ * has multiple visible children).
893
+ */
894
+ isFoldable(entryId) {
895
+ const children = this.visibleChildrenMap.get(entryId);
896
+ if (!children || children.length === 0)
897
+ return false;
898
+ const parentId = this.visibleParentMap.get(entryId);
899
+ if (parentId === null || parentId === undefined)
900
+ return true;
901
+ const siblings = this.visibleChildrenMap.get(parentId);
902
+ return siblings !== undefined && siblings.length > 1;
903
+ }
904
+ /**
905
+ * Find the index of the next branch segment start in the given direction.
906
+ * A segment start is the first child of a branch point.
907
+ *
908
+ * "up" walks the visible parent chain; "down" walks visible children
909
+ * (always following the first child).
910
+ */
911
+ findBranchSegmentStart(direction) {
912
+ const selectedId = this.filteredNodes[this.selectedIndex]?.node.entry.id;
913
+ if (!selectedId)
914
+ return this.selectedIndex;
915
+ const indexByEntryId = new Map(this.filteredNodes.map((node, i) => [node.node.entry.id, i]));
916
+ let currentId = selectedId;
917
+ if (direction === "down") {
918
+ while (true) {
919
+ const children = this.visibleChildrenMap.get(currentId) ?? [];
920
+ if (children.length === 0)
921
+ return indexByEntryId.get(currentId);
922
+ if (children.length > 1)
923
+ return indexByEntryId.get(children[0]);
924
+ currentId = children[0];
925
+ }
926
+ }
927
+ // direction === "up"
928
+ while (true) {
929
+ const parentId = this.visibleParentMap.get(currentId) ?? null;
930
+ if (parentId === null)
931
+ return indexByEntryId.get(currentId);
932
+ const children = this.visibleChildrenMap.get(parentId) ?? [];
933
+ if (children.length > 1) {
934
+ const segmentStart = indexByEntryId.get(currentId);
935
+ if (segmentStart < this.selectedIndex) {
936
+ return segmentStart;
937
+ }
938
+ }
939
+ currentId = parentId;
940
+ }
941
+ }
791
942
  }
792
943
  /** Component that displays the current search query */
793
944
  class SearchLine {
@@ -834,16 +985,16 @@ class LabelInput {
834
985
  const availableWidth = width - indent.length;
835
986
  lines.push(truncateToWidth(`${indent}${theme.fg("muted", "Label (empty to remove):")}`, width));
836
987
  lines.push(...this.input.render(availableWidth).map((line) => truncateToWidth(`${indent}${line}`, width)));
837
- lines.push(truncateToWidth(`${indent}${keyHint("selectConfirm", "save")} ${keyHint("selectCancel", "cancel")}`, width));
988
+ lines.push(truncateToWidth(`${indent}${keyHint("tui.select.confirm", "save")} ${keyHint("tui.select.cancel", "cancel")}`, width));
838
989
  return lines;
839
990
  }
840
991
  handleInput(keyData) {
841
- const kb = getEditorKeybindings();
842
- if (kb.matches(keyData, "selectConfirm")) {
992
+ const kb = getKeybindings();
993
+ if (kb.matches(keyData, "tui.select.confirm")) {
843
994
  const value = this.input.getValue().trim();
844
995
  this.onSubmit?.(this.entryId, value || undefined);
845
996
  }
846
- else if (kb.matches(keyData, "selectCancel")) {
997
+ else if (kb.matches(keyData, "tui.select.cancel")) {
847
998
  this.onCancel?.();
848
999
  }
849
1000
  else {
@@ -872,11 +1023,11 @@ export class TreeSelectorComponent extends Container {
872
1023
  this.labelInput.focused = value;
873
1024
  }
874
1025
  }
875
- constructor(tree, currentLeafId, terminalHeight, onSelect, onCancel, onLabelChange, initialSelectedId) {
1026
+ constructor(tree, currentLeafId, terminalHeight, onSelect, onCancel, onLabelChange, initialSelectedId, initialFilterMode) {
876
1027
  super();
877
1028
  this.onLabelChangeCallback = onLabelChange;
878
1029
  const maxVisibleLines = Math.max(5, Math.floor(terminalHeight / 2));
879
- this.treeList = new TreeList(tree, currentLeafId, maxVisibleLines, initialSelectedId);
1030
+ this.treeList = new TreeList(tree, currentLeafId, maxVisibleLines, initialSelectedId, initialFilterMode);
880
1031
  this.treeList.onSelect = onSelect;
881
1032
  this.treeList.onCancel = onCancel;
882
1033
  this.treeList.onLabelEdit = (entryId, currentLabel) => this.showLabelInput(entryId, currentLabel);
@@ -886,8 +1037,7 @@ export class TreeSelectorComponent extends Container {
886
1037
  this.addChild(new Spacer(1));
887
1038
  this.addChild(new DynamicBorder());
888
1039
  this.addChild(new Text(theme.bold(" Session Tree"), 1, 0));
889
- this.addChild(new TruncatedText(theme.fg("muted", " ↑/↓: move. ←/→: page. Shift+L: label. ") +
890
- theme.fg("muted", "^D/^T/^U/^L/^A: filters (^O/⇧^O cycle)"), 0, 0));
1040
+ this.addChild(new TruncatedText(theme.fg("muted", ` ↑/↓: move. ←/→: page. ^←/^→ or Alt+←/Alt+→: fold/branch. ${keyText("app.tree.editLabel")}: label. ^D/^T/^U/^L/^A: filters (^O/⇧^O cycle). ${keyText("app.tree.toggleLabelTimestamp")}: label time`), 0, 0));
891
1041
  this.addChild(new SearchLine(this.treeList));
892
1042
  this.addChild(new DynamicBorder());
893
1043
  this.addChild(new Spacer(1));