@earendil-works/pi-coding-agent 0.74.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 (711) hide show
  1. package/CHANGELOG.md +4164 -0
  2. package/README.md +651 -0
  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 +9 -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/bun/restore-sandbox-env.d.ts +13 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +32 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +53 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +340 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +14 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +83 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/session-picker.d.ts +9 -0
  36. package/dist/cli/session-picker.d.ts.map +1 -0
  37. package/dist/cli/session-picker.js +35 -0
  38. package/dist/cli/session-picker.js.map +1 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +20 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/config.d.ts +92 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +402 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/core/agent-session-runtime.d.ts +117 -0
  48. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  49. package/dist/core/agent-session-runtime.js +300 -0
  50. package/dist/core/agent-session-runtime.js.map +1 -0
  51. package/dist/core/agent-session-services.d.ts +86 -0
  52. package/dist/core/agent-session-services.d.ts.map +1 -0
  53. package/dist/core/agent-session-services.js +117 -0
  54. package/dist/core/agent-session-services.js.map +1 -0
  55. package/dist/core/agent-session.d.ts +595 -0
  56. package/dist/core/agent-session.d.ts.map +1 -0
  57. package/dist/core/agent-session.js +2521 -0
  58. package/dist/core/agent-session.js.map +1 -0
  59. package/dist/core/auth-guidance.d.ts +5 -0
  60. package/dist/core/auth-guidance.d.ts.map +1 -0
  61. package/dist/core/auth-guidance.js +21 -0
  62. package/dist/core/auth-guidance.js.map +1 -0
  63. package/dist/core/auth-storage.d.ts +141 -0
  64. package/dist/core/auth-storage.d.ts.map +1 -0
  65. package/dist/core/auth-storage.js +441 -0
  66. package/dist/core/auth-storage.js.map +1 -0
  67. package/dist/core/bash-executor.d.ts +32 -0
  68. package/dist/core/bash-executor.d.ts.map +1 -0
  69. package/dist/core/bash-executor.js +111 -0
  70. package/dist/core/bash-executor.js.map +1 -0
  71. package/dist/core/compaction/branch-summarization.d.ts +88 -0
  72. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  73. package/dist/core/compaction/branch-summarization.js +243 -0
  74. package/dist/core/compaction/branch-summarization.js.map +1 -0
  75. package/dist/core/compaction/compaction.d.ts +121 -0
  76. package/dist/core/compaction/compaction.d.ts.map +1 -0
  77. package/dist/core/compaction/compaction.js +615 -0
  78. package/dist/core/compaction/compaction.js.map +1 -0
  79. package/dist/core/compaction/index.d.ts +7 -0
  80. package/dist/core/compaction/index.d.ts.map +1 -0
  81. package/dist/core/compaction/index.js +7 -0
  82. package/dist/core/compaction/index.js.map +1 -0
  83. package/dist/core/compaction/utils.d.ts +38 -0
  84. package/dist/core/compaction/utils.d.ts.map +1 -0
  85. package/dist/core/compaction/utils.js +153 -0
  86. package/dist/core/compaction/utils.js.map +1 -0
  87. package/dist/core/defaults.d.ts +3 -0
  88. package/dist/core/defaults.d.ts.map +1 -0
  89. package/dist/core/defaults.js +2 -0
  90. package/dist/core/defaults.js.map +1 -0
  91. package/dist/core/diagnostics.d.ts +15 -0
  92. package/dist/core/diagnostics.d.ts.map +1 -0
  93. package/dist/core/diagnostics.js +2 -0
  94. package/dist/core/diagnostics.js.map +1 -0
  95. package/dist/core/event-bus.d.ts +9 -0
  96. package/dist/core/event-bus.d.ts.map +1 -0
  97. package/dist/core/event-bus.js +25 -0
  98. package/dist/core/event-bus.js.map +1 -0
  99. package/dist/core/exec.d.ts +29 -0
  100. package/dist/core/exec.d.ts.map +1 -0
  101. package/dist/core/exec.js +75 -0
  102. package/dist/core/exec.js.map +1 -0
  103. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  104. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  105. package/dist/core/export-html/ansi-to-html.js +249 -0
  106. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  107. package/dist/core/export-html/index.d.ts +37 -0
  108. package/dist/core/export-html/index.d.ts.map +1 -0
  109. package/dist/core/export-html/index.js +224 -0
  110. package/dist/core/export-html/index.js.map +1 -0
  111. package/dist/core/export-html/template.css +1066 -0
  112. package/dist/core/export-html/template.html +55 -0
  113. package/dist/core/export-html/template.js +1834 -0
  114. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  115. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  116. package/dist/core/export-html/tool-renderer.js +108 -0
  117. package/dist/core/export-html/tool-renderer.js.map +1 -0
  118. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  119. package/dist/core/export-html/vendor/marked.min.js +6 -0
  120. package/dist/core/extensions/index.d.ts +12 -0
  121. package/dist/core/extensions/index.d.ts.map +1 -0
  122. package/dist/core/extensions/index.js +9 -0
  123. package/dist/core/extensions/index.js.map +1 -0
  124. package/dist/core/extensions/loader.d.ts +24 -0
  125. package/dist/core/extensions/loader.d.ts.map +1 -0
  126. package/dist/core/extensions/loader.js +498 -0
  127. package/dist/core/extensions/loader.js.map +1 -0
  128. package/dist/core/extensions/runner.d.ts +159 -0
  129. package/dist/core/extensions/runner.d.ts.map +1 -0
  130. package/dist/core/extensions/runner.js +824 -0
  131. package/dist/core/extensions/runner.js.map +1 -0
  132. package/dist/core/extensions/types.d.ts +1173 -0
  133. package/dist/core/extensions/types.d.ts.map +1 -0
  134. package/dist/core/extensions/types.js +45 -0
  135. package/dist/core/extensions/types.js.map +1 -0
  136. package/dist/core/extensions/wrapper.d.ts +20 -0
  137. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  138. package/dist/core/extensions/wrapper.js +22 -0
  139. package/dist/core/extensions/wrapper.js.map +1 -0
  140. package/dist/core/footer-data-provider.d.ts +52 -0
  141. package/dist/core/footer-data-provider.d.ts.map +1 -0
  142. package/dist/core/footer-data-provider.js +310 -0
  143. package/dist/core/footer-data-provider.js.map +1 -0
  144. package/dist/core/index.d.ts +12 -0
  145. package/dist/core/index.d.ts.map +1 -0
  146. package/dist/core/index.js +12 -0
  147. package/dist/core/index.js.map +1 -0
  148. package/dist/core/keybindings.d.ts +353 -0
  149. package/dist/core/keybindings.d.ts.map +1 -0
  150. package/dist/core/keybindings.js +295 -0
  151. package/dist/core/keybindings.js.map +1 -0
  152. package/dist/core/messages.d.ts +77 -0
  153. package/dist/core/messages.d.ts.map +1 -0
  154. package/dist/core/messages.js +123 -0
  155. package/dist/core/messages.js.map +1 -0
  156. package/dist/core/model-registry.d.ts +150 -0
  157. package/dist/core/model-registry.d.ts.map +1 -0
  158. package/dist/core/model-registry.js +727 -0
  159. package/dist/core/model-registry.js.map +1 -0
  160. package/dist/core/model-resolver.d.ts +110 -0
  161. package/dist/core/model-resolver.d.ts.map +1 -0
  162. package/dist/core/model-resolver.js +494 -0
  163. package/dist/core/model-resolver.js.map +1 -0
  164. package/dist/core/output-guard.d.ts +6 -0
  165. package/dist/core/output-guard.d.ts.map +1 -0
  166. package/dist/core/output-guard.js +59 -0
  167. package/dist/core/output-guard.js.map +1 -0
  168. package/dist/core/package-manager.d.ts +198 -0
  169. package/dist/core/package-manager.d.ts.map +1 -0
  170. package/dist/core/package-manager.js +1958 -0
  171. package/dist/core/package-manager.js.map +1 -0
  172. package/dist/core/prompt-templates.d.ts +52 -0
  173. package/dist/core/prompt-templates.d.ts.map +1 -0
  174. package/dist/core/prompt-templates.js +250 -0
  175. package/dist/core/prompt-templates.js.map +1 -0
  176. package/dist/core/provider-display-names.d.ts +2 -0
  177. package/dist/core/provider-display-names.d.ts.map +1 -0
  178. package/dist/core/provider-display-names.js +32 -0
  179. package/dist/core/provider-display-names.js.map +1 -0
  180. package/dist/core/resolve-config-value.d.ts +23 -0
  181. package/dist/core/resolve-config-value.d.ts.map +1 -0
  182. package/dist/core/resolve-config-value.js +126 -0
  183. package/dist/core/resolve-config-value.js.map +1 -0
  184. package/dist/core/resource-loader.d.ts +194 -0
  185. package/dist/core/resource-loader.d.ts.map +1 -0
  186. package/dist/core/resource-loader.js +727 -0
  187. package/dist/core/resource-loader.js.map +1 -0
  188. package/dist/core/sdk.d.ts +107 -0
  189. package/dist/core/sdk.d.ts.map +1 -0
  190. package/dist/core/sdk.js +282 -0
  191. package/dist/core/sdk.js.map +1 -0
  192. package/dist/core/session-cwd.d.ts +19 -0
  193. package/dist/core/session-cwd.d.ts.map +1 -0
  194. package/dist/core/session-cwd.js +38 -0
  195. package/dist/core/session-cwd.js.map +1 -0
  196. package/dist/core/session-manager.d.ts +333 -0
  197. package/dist/core/session-manager.d.ts.map +1 -0
  198. package/dist/core/session-manager.js +1109 -0
  199. package/dist/core/session-manager.js.map +1 -0
  200. package/dist/core/settings-manager.d.ts +261 -0
  201. package/dist/core/settings-manager.d.ts.map +1 -0
  202. package/dist/core/settings-manager.js +782 -0
  203. package/dist/core/settings-manager.js.map +1 -0
  204. package/dist/core/skills.d.ts +60 -0
  205. package/dist/core/skills.d.ts.map +1 -0
  206. package/dist/core/skills.js +404 -0
  207. package/dist/core/skills.js.map +1 -0
  208. package/dist/core/slash-commands.d.ts +14 -0
  209. package/dist/core/slash-commands.d.ts.map +1 -0
  210. package/dist/core/slash-commands.js +25 -0
  211. package/dist/core/slash-commands.js.map +1 -0
  212. package/dist/core/source-info.d.ts +18 -0
  213. package/dist/core/source-info.d.ts.map +1 -0
  214. package/dist/core/source-info.js +19 -0
  215. package/dist/core/source-info.js.map +1 -0
  216. package/dist/core/system-prompt.d.ts +28 -0
  217. package/dist/core/system-prompt.d.ts.map +1 -0
  218. package/dist/core/system-prompt.js +120 -0
  219. package/dist/core/system-prompt.js.map +1 -0
  220. package/dist/core/telemetry.d.ts +3 -0
  221. package/dist/core/telemetry.d.ts.map +1 -0
  222. package/dist/core/telemetry.js +9 -0
  223. package/dist/core/telemetry.js.map +1 -0
  224. package/dist/core/timings.d.ts +8 -0
  225. package/dist/core/timings.d.ts.map +1 -0
  226. package/dist/core/timings.js +31 -0
  227. package/dist/core/timings.js.map +1 -0
  228. package/dist/core/tools/bash.d.ts +68 -0
  229. package/dist/core/tools/bash.d.ts.map +1 -0
  230. package/dist/core/tools/bash.js +335 -0
  231. package/dist/core/tools/bash.js.map +1 -0
  232. package/dist/core/tools/edit-diff.d.ts +85 -0
  233. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  234. package/dist/core/tools/edit-diff.js +338 -0
  235. package/dist/core/tools/edit-diff.js.map +1 -0
  236. package/dist/core/tools/edit.d.ts +49 -0
  237. package/dist/core/tools/edit.d.ts.map +1 -0
  238. package/dist/core/tools/edit.js +324 -0
  239. package/dist/core/tools/edit.js.map +1 -0
  240. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  241. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  242. package/dist/core/tools/file-mutation-queue.js +37 -0
  243. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  244. package/dist/core/tools/find.d.ts +35 -0
  245. package/dist/core/tools/find.d.ts.map +1 -0
  246. package/dist/core/tools/find.js +298 -0
  247. package/dist/core/tools/find.js.map +1 -0
  248. package/dist/core/tools/grep.d.ts +37 -0
  249. package/dist/core/tools/grep.d.ts.map +1 -0
  250. package/dist/core/tools/grep.js +304 -0
  251. package/dist/core/tools/grep.js.map +1 -0
  252. package/dist/core/tools/index.d.ts +40 -0
  253. package/dist/core/tools/index.d.ts.map +1 -0
  254. package/dist/core/tools/index.js +112 -0
  255. package/dist/core/tools/index.js.map +1 -0
  256. package/dist/core/tools/ls.d.ts +37 -0
  257. package/dist/core/tools/ls.d.ts.map +1 -0
  258. package/dist/core/tools/ls.js +169 -0
  259. package/dist/core/tools/ls.js.map +1 -0
  260. package/dist/core/tools/output-accumulator.d.ts +50 -0
  261. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  262. package/dist/core/tools/output-accumulator.js +178 -0
  263. package/dist/core/tools/output-accumulator.js.map +1 -0
  264. package/dist/core/tools/path-utils.d.ts +8 -0
  265. package/dist/core/tools/path-utils.d.ts.map +1 -0
  266. package/dist/core/tools/path-utils.js +81 -0
  267. package/dist/core/tools/path-utils.js.map +1 -0
  268. package/dist/core/tools/read.d.ts +35 -0
  269. package/dist/core/tools/read.d.ts.map +1 -0
  270. package/dist/core/tools/read.js +288 -0
  271. package/dist/core/tools/read.js.map +1 -0
  272. package/dist/core/tools/render-utils.d.ts +21 -0
  273. package/dist/core/tools/render-utils.d.ts.map +1 -0
  274. package/dist/core/tools/render-utils.js +49 -0
  275. package/dist/core/tools/render-utils.js.map +1 -0
  276. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  277. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  278. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  279. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  280. package/dist/core/tools/truncate.d.ts +70 -0
  281. package/dist/core/tools/truncate.d.ts.map +1 -0
  282. package/dist/core/tools/truncate.js +205 -0
  283. package/dist/core/tools/truncate.js.map +1 -0
  284. package/dist/core/tools/write.d.ts +26 -0
  285. package/dist/core/tools/write.d.ts.map +1 -0
  286. package/dist/core/tools/write.js +213 -0
  287. package/dist/core/tools/write.js.map +1 -0
  288. package/dist/index.d.ts +28 -0
  289. package/dist/index.d.ts.map +1 -0
  290. package/dist/index.js +41 -0
  291. package/dist/index.js.map +1 -0
  292. package/dist/main.d.ts +12 -0
  293. package/dist/main.d.ts.map +1 -0
  294. package/dist/main.js +583 -0
  295. package/dist/main.js.map +1 -0
  296. package/dist/migrations.d.ts +33 -0
  297. package/dist/migrations.d.ts.map +1 -0
  298. package/dist/migrations.js +281 -0
  299. package/dist/migrations.js.map +1 -0
  300. package/dist/modes/index.d.ts +9 -0
  301. package/dist/modes/index.d.ts.map +1 -0
  302. package/dist/modes/index.js +8 -0
  303. package/dist/modes/index.js.map +1 -0
  304. package/dist/modes/interactive/assets/clankolas.png +0 -0
  305. package/dist/modes/interactive/components/armin.d.ts +34 -0
  306. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  307. package/dist/modes/interactive/components/armin.js +333 -0
  308. package/dist/modes/interactive/components/armin.js.map +1 -0
  309. package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
  310. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  311. package/dist/modes/interactive/components/assistant-message.js +121 -0
  312. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  313. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  314. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  315. package/dist/modes/interactive/components/bash-execution.js +175 -0
  316. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  317. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  318. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  319. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  320. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  321. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  322. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  323. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  324. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  325. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  326. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  327. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  328. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  329. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  330. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  331. package/dist/modes/interactive/components/config-selector.js +481 -0
  332. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  333. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  334. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  335. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  336. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  337. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  338. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  339. package/dist/modes/interactive/components/custom-editor.js +70 -0
  340. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  341. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  342. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  343. package/dist/modes/interactive/components/custom-message.js +79 -0
  344. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  345. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  346. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  347. package/dist/modes/interactive/components/daxnuts.js +140 -0
  348. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  349. package/dist/modes/interactive/components/diff.d.ts +12 -0
  350. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  351. package/dist/modes/interactive/components/diff.js +133 -0
  352. package/dist/modes/interactive/components/diff.js.map +1 -0
  353. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  354. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  355. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  356. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  357. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  358. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  359. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  360. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  361. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  362. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  363. package/dist/modes/interactive/components/extension-editor.js +111 -0
  364. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  365. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  366. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  367. package/dist/modes/interactive/components/extension-input.js +61 -0
  368. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  369. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  370. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  371. package/dist/modes/interactive/components/extension-selector.js +78 -0
  372. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  373. package/dist/modes/interactive/components/footer.d.ts +27 -0
  374. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  375. package/dist/modes/interactive/components/footer.js +201 -0
  376. package/dist/modes/interactive/components/footer.js.map +1 -0
  377. package/dist/modes/interactive/components/index.d.ts +32 -0
  378. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  379. package/dist/modes/interactive/components/index.js +33 -0
  380. package/dist/modes/interactive/components/index.js.map +1 -0
  381. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
  382. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  383. package/dist/modes/interactive/components/keybinding-hints.js +22 -0
  384. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  385. package/dist/modes/interactive/components/login-dialog.d.ts +46 -0
  386. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  387. package/dist/modes/interactive/components/login-dialog.js +160 -0
  388. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  389. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  390. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  391. package/dist/modes/interactive/components/model-selector.js +278 -0
  392. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  393. package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
  394. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  395. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  396. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  397. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  398. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  399. package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
  400. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  401. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  402. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  403. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  404. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  405. package/dist/modes/interactive/components/session-selector.d.ts +96 -0
  406. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  407. package/dist/modes/interactive/components/session-selector.js +861 -0
  408. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  409. package/dist/modes/interactive/components/settings-selector.d.ts +67 -0
  410. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  411. package/dist/modes/interactive/components/settings-selector.js +373 -0
  412. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  413. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  414. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  416. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  417. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  418. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  420. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  421. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  422. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/theme-selector.js +50 -0
  424. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  425. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  426. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  428. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  429. package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  430. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/tool-execution.js +295 -0
  432. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  433. package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
  434. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/tree-selector.js +1092 -0
  436. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  437. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  438. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  440. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  441. package/dist/modes/interactive/components/user-message.d.ts +10 -0
  442. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/user-message.js +29 -0
  444. package/dist/modes/interactive/components/user-message.js.map +1 -0
  445. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  446. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  448. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  449. package/dist/modes/interactive/interactive-mode.d.ts +361 -0
  450. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  451. package/dist/modes/interactive/interactive-mode.js +4585 -0
  452. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  453. package/dist/modes/interactive/theme/dark.json +85 -0
  454. package/dist/modes/interactive/theme/light.json +84 -0
  455. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  456. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  457. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  458. package/dist/modes/interactive/theme/theme.js +971 -0
  459. package/dist/modes/interactive/theme/theme.js.map +1 -0
  460. package/dist/modes/print-mode.d.ts +28 -0
  461. package/dist/modes/print-mode.d.ts.map +1 -0
  462. package/dist/modes/print-mode.js +131 -0
  463. package/dist/modes/print-mode.js.map +1 -0
  464. package/dist/modes/rpc/jsonl.d.ts +17 -0
  465. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  466. package/dist/modes/rpc/jsonl.js +49 -0
  467. package/dist/modes/rpc/jsonl.js.map +1 -0
  468. package/dist/modes/rpc/rpc-client.d.ts +224 -0
  469. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  470. package/dist/modes/rpc/rpc-client.js +410 -0
  471. package/dist/modes/rpc/rpc-client.js.map +1 -0
  472. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  473. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  474. package/dist/modes/rpc/rpc-mode.js +601 -0
  475. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  476. package/dist/modes/rpc/rpc-types.d.ts +419 -0
  477. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  478. package/dist/modes/rpc/rpc-types.js +8 -0
  479. package/dist/modes/rpc/rpc-types.js.map +1 -0
  480. package/dist/package-manager-cli.d.ts +4 -0
  481. package/dist/package-manager-cli.d.ts.map +1 -0
  482. package/dist/package-manager-cli.js +460 -0
  483. package/dist/package-manager-cli.js.map +1 -0
  484. package/dist/utils/changelog.d.ts +21 -0
  485. package/dist/utils/changelog.d.ts.map +1 -0
  486. package/dist/utils/changelog.js +87 -0
  487. package/dist/utils/changelog.js.map +1 -0
  488. package/dist/utils/child-process.d.ts +12 -0
  489. package/dist/utils/child-process.d.ts.map +1 -0
  490. package/dist/utils/child-process.js +86 -0
  491. package/dist/utils/child-process.js.map +1 -0
  492. package/dist/utils/clipboard-image.d.ts +11 -0
  493. package/dist/utils/clipboard-image.d.ts.map +1 -0
  494. package/dist/utils/clipboard-image.js +245 -0
  495. package/dist/utils/clipboard-image.js.map +1 -0
  496. package/dist/utils/clipboard-native.d.ts +8 -0
  497. package/dist/utils/clipboard-native.d.ts.map +1 -0
  498. package/dist/utils/clipboard-native.js +14 -0
  499. package/dist/utils/clipboard-native.js.map +1 -0
  500. package/dist/utils/clipboard.d.ts +2 -0
  501. package/dist/utils/clipboard.d.ts.map +1 -0
  502. package/dist/utils/clipboard.js +117 -0
  503. package/dist/utils/clipboard.js.map +1 -0
  504. package/dist/utils/exif-orientation.d.ts +5 -0
  505. package/dist/utils/exif-orientation.d.ts.map +1 -0
  506. package/dist/utils/exif-orientation.js +158 -0
  507. package/dist/utils/exif-orientation.js.map +1 -0
  508. package/dist/utils/frontmatter.d.ts +8 -0
  509. package/dist/utils/frontmatter.d.ts.map +1 -0
  510. package/dist/utils/frontmatter.js +26 -0
  511. package/dist/utils/frontmatter.js.map +1 -0
  512. package/dist/utils/fs-watch.d.ts +5 -0
  513. package/dist/utils/fs-watch.d.ts.map +1 -0
  514. package/dist/utils/fs-watch.js +25 -0
  515. package/dist/utils/fs-watch.js.map +1 -0
  516. package/dist/utils/git.d.ts +26 -0
  517. package/dist/utils/git.d.ts.map +1 -0
  518. package/dist/utils/git.js +163 -0
  519. package/dist/utils/git.js.map +1 -0
  520. package/dist/utils/image-convert.d.ts +9 -0
  521. package/dist/utils/image-convert.d.ts.map +1 -0
  522. package/dist/utils/image-convert.js +39 -0
  523. package/dist/utils/image-convert.js.map +1 -0
  524. package/dist/utils/image-resize.d.ts +36 -0
  525. package/dist/utils/image-resize.d.ts.map +1 -0
  526. package/dist/utils/image-resize.js +137 -0
  527. package/dist/utils/image-resize.js.map +1 -0
  528. package/dist/utils/mime.d.ts +2 -0
  529. package/dist/utils/mime.d.ts.map +1 -0
  530. package/dist/utils/mime.js +26 -0
  531. package/dist/utils/mime.js.map +1 -0
  532. package/dist/utils/paths.d.ts +14 -0
  533. package/dist/utils/paths.d.ts.map +1 -0
  534. package/dist/utils/paths.js +34 -0
  535. package/dist/utils/paths.js.map +1 -0
  536. package/dist/utils/photon.d.ts +21 -0
  537. package/dist/utils/photon.d.ts.map +1 -0
  538. package/dist/utils/photon.js +121 -0
  539. package/dist/utils/photon.js.map +1 -0
  540. package/dist/utils/pi-user-agent.d.ts +2 -0
  541. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  542. package/dist/utils/pi-user-agent.js +5 -0
  543. package/dist/utils/pi-user-agent.js.map +1 -0
  544. package/dist/utils/shell.d.ts +30 -0
  545. package/dist/utils/shell.d.ts.map +1 -0
  546. package/dist/utils/shell.js +190 -0
  547. package/dist/utils/shell.js.map +1 -0
  548. package/dist/utils/sleep.d.ts +5 -0
  549. package/dist/utils/sleep.d.ts.map +1 -0
  550. package/dist/utils/sleep.js +17 -0
  551. package/dist/utils/sleep.js.map +1 -0
  552. package/dist/utils/tools-manager.d.ts +3 -0
  553. package/dist/utils/tools-manager.d.ts.map +1 -0
  554. package/dist/utils/tools-manager.js +256 -0
  555. package/dist/utils/tools-manager.js.map +1 -0
  556. package/dist/utils/version-check.d.ts +14 -0
  557. package/dist/utils/version-check.d.ts.map +1 -0
  558. package/dist/utils/version-check.js +77 -0
  559. package/dist/utils/version-check.js.map +1 -0
  560. package/docs/compaction.md +394 -0
  561. package/docs/custom-provider.md +646 -0
  562. package/docs/development.md +71 -0
  563. package/docs/docs.json +148 -0
  564. package/docs/extensions.md +2596 -0
  565. package/docs/images/doom-extension.png +0 -0
  566. package/docs/images/exy.png +0 -0
  567. package/docs/images/interactive-mode.png +0 -0
  568. package/docs/images/tree-view.png +0 -0
  569. package/docs/index.md +64 -0
  570. package/docs/json.md +82 -0
  571. package/docs/keybindings.md +197 -0
  572. package/docs/models.md +474 -0
  573. package/docs/packages.md +223 -0
  574. package/docs/prompt-templates.md +88 -0
  575. package/docs/providers.md +241 -0
  576. package/docs/quickstart.md +142 -0
  577. package/docs/rpc.md +1407 -0
  578. package/docs/sdk.md +1149 -0
  579. package/docs/session-format.md +412 -0
  580. package/docs/sessions.md +137 -0
  581. package/docs/settings.md +279 -0
  582. package/docs/shell-aliases.md +13 -0
  583. package/docs/skills.md +232 -0
  584. package/docs/terminal-setup.md +106 -0
  585. package/docs/termux.md +127 -0
  586. package/docs/themes.md +295 -0
  587. package/docs/tmux.md +61 -0
  588. package/docs/tui.md +918 -0
  589. package/docs/usage.md +277 -0
  590. package/docs/windows.md +17 -0
  591. package/examples/README.md +25 -0
  592. package/examples/extensions/README.md +208 -0
  593. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  594. package/examples/extensions/bash-spawn-hook.ts +30 -0
  595. package/examples/extensions/bookmark.ts +50 -0
  596. package/examples/extensions/border-status-editor.ts +150 -0
  597. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  598. package/examples/extensions/claude-rules.ts +86 -0
  599. package/examples/extensions/commands.ts +72 -0
  600. package/examples/extensions/confirm-destructive.ts +59 -0
  601. package/examples/extensions/custom-compaction.ts +127 -0
  602. package/examples/extensions/custom-footer.ts +64 -0
  603. package/examples/extensions/custom-header.ts +73 -0
  604. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  605. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  606. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  607. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  608. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  609. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  610. package/examples/extensions/dirty-repo-guard.ts +56 -0
  611. package/examples/extensions/doom-overlay/README.md +46 -0
  612. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  613. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  614. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  615. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  616. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  617. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  618. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  619. package/examples/extensions/doom-overlay/index.ts +74 -0
  620. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  621. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  622. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  623. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  624. package/examples/extensions/dynamic-resources/index.ts +15 -0
  625. package/examples/extensions/dynamic-tools.ts +74 -0
  626. package/examples/extensions/event-bus.ts +43 -0
  627. package/examples/extensions/file-trigger.ts +41 -0
  628. package/examples/extensions/git-checkpoint.ts +53 -0
  629. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  630. package/examples/extensions/handoff.ts +191 -0
  631. package/examples/extensions/hello.ts +26 -0
  632. package/examples/extensions/hidden-thinking-label.ts +53 -0
  633. package/examples/extensions/inline-bash.ts +94 -0
  634. package/examples/extensions/input-transform.ts +43 -0
  635. package/examples/extensions/interactive-shell.ts +196 -0
  636. package/examples/extensions/mac-system-theme.ts +47 -0
  637. package/examples/extensions/message-renderer.ts +59 -0
  638. package/examples/extensions/minimal-mode.ts +426 -0
  639. package/examples/extensions/modal-editor.ts +85 -0
  640. package/examples/extensions/model-status.ts +31 -0
  641. package/examples/extensions/notify.ts +55 -0
  642. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  643. package/examples/extensions/overlay-test.ts +150 -0
  644. package/examples/extensions/permission-gate.ts +34 -0
  645. package/examples/extensions/pirate.ts +47 -0
  646. package/examples/extensions/plan-mode/README.md +65 -0
  647. package/examples/extensions/plan-mode/index.ts +340 -0
  648. package/examples/extensions/plan-mode/utils.ts +168 -0
  649. package/examples/extensions/preset.ts +430 -0
  650. package/examples/extensions/prompt-customizer.ts +97 -0
  651. package/examples/extensions/protected-paths.ts +30 -0
  652. package/examples/extensions/provider-payload.ts +18 -0
  653. package/examples/extensions/qna.ts +122 -0
  654. package/examples/extensions/question.ts +264 -0
  655. package/examples/extensions/questionnaire.ts +427 -0
  656. package/examples/extensions/rainbow-editor.ts +88 -0
  657. package/examples/extensions/reload-runtime.ts +37 -0
  658. package/examples/extensions/rpc-demo.ts +118 -0
  659. package/examples/extensions/sandbox/index.ts +321 -0
  660. package/examples/extensions/sandbox/package-lock.json +92 -0
  661. package/examples/extensions/sandbox/package.json +19 -0
  662. package/examples/extensions/send-user-message.ts +97 -0
  663. package/examples/extensions/session-name.ts +27 -0
  664. package/examples/extensions/shutdown-command.ts +63 -0
  665. package/examples/extensions/snake.ts +343 -0
  666. package/examples/extensions/space-invaders.ts +560 -0
  667. package/examples/extensions/ssh.ts +220 -0
  668. package/examples/extensions/status-line.ts +32 -0
  669. package/examples/extensions/structured-output.ts +65 -0
  670. package/examples/extensions/subagent/README.md +172 -0
  671. package/examples/extensions/subagent/agents/planner.md +37 -0
  672. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  673. package/examples/extensions/subagent/agents/scout.md +50 -0
  674. package/examples/extensions/subagent/agents/worker.md +24 -0
  675. package/examples/extensions/subagent/agents.ts +126 -0
  676. package/examples/extensions/subagent/index.ts +987 -0
  677. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  678. package/examples/extensions/subagent/prompts/implement.md +10 -0
  679. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  680. package/examples/extensions/summarize.ts +206 -0
  681. package/examples/extensions/system-prompt-header.ts +17 -0
  682. package/examples/extensions/tic-tac-toe.ts +1008 -0
  683. package/examples/extensions/timed-confirm.ts +70 -0
  684. package/examples/extensions/titlebar-spinner.ts +58 -0
  685. package/examples/extensions/todo.ts +297 -0
  686. package/examples/extensions/tool-override.ts +144 -0
  687. package/examples/extensions/tools.ts +141 -0
  688. package/examples/extensions/trigger-compact.ts +50 -0
  689. package/examples/extensions/truncated-tool.ts +195 -0
  690. package/examples/extensions/widget-placement.ts +9 -0
  691. package/examples/extensions/with-deps/index.ts +32 -0
  692. package/examples/extensions/with-deps/package-lock.json +31 -0
  693. package/examples/extensions/with-deps/package.json +22 -0
  694. package/examples/extensions/working-indicator.ts +123 -0
  695. package/examples/extensions/working-message-test.ts +25 -0
  696. package/examples/rpc-extension-ui.ts +632 -0
  697. package/examples/sdk/01-minimal.ts +22 -0
  698. package/examples/sdk/02-custom-model.ts +49 -0
  699. package/examples/sdk/03-custom-prompt.ts +67 -0
  700. package/examples/sdk/04-skills.ts +55 -0
  701. package/examples/sdk/05-tools.ts +44 -0
  702. package/examples/sdk/06-extensions.ts +95 -0
  703. package/examples/sdk/07-context-files.ts +47 -0
  704. package/examples/sdk/08-prompt-templates.ts +51 -0
  705. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  706. package/examples/sdk/10-settings.ts +53 -0
  707. package/examples/sdk/11-sessions.ts +48 -0
  708. package/examples/sdk/12-full-control.ts +73 -0
  709. package/examples/sdk/13-session-runtime.ts +67 -0
  710. package/examples/sdk/README.md +147 -0
  711. package/package.json +100 -0
@@ -0,0 +1,373 @@
1
+ import { Container, getCapabilities, SelectList, SettingsList, Spacer, Text, } from "@earendil-works/pi-tui";
2
+ import { getSelectListTheme, getSettingsListTheme, theme } from "../theme/theme.js";
3
+ import { DynamicBorder } from "./dynamic-border.js";
4
+ const SETTINGS_SUBMENU_SELECT_LIST_LAYOUT = {
5
+ minPrimaryColumnWidth: 12,
6
+ maxPrimaryColumnWidth: 32,
7
+ };
8
+ const THINKING_DESCRIPTIONS = {
9
+ off: "No reasoning",
10
+ minimal: "Very brief reasoning (~1k tokens)",
11
+ low: "Light reasoning (~2k tokens)",
12
+ medium: "Moderate reasoning (~8k tokens)",
13
+ high: "Deep reasoning (~16k tokens)",
14
+ xhigh: "Maximum reasoning (~32k tokens)",
15
+ };
16
+ /**
17
+ * A submenu component for selecting from a list of options.
18
+ */
19
+ class WarningSettingsSubmenu extends Container {
20
+ settingsList;
21
+ state;
22
+ constructor(warnings, onChange, onCancel) {
23
+ super();
24
+ this.state = { ...warnings };
25
+ const items = [
26
+ {
27
+ id: "anthropic-extra-usage",
28
+ label: "Anthropic extra usage",
29
+ description: "Warn when Anthropic subscription auth may use paid extra usage",
30
+ currentValue: (this.state.anthropicExtraUsage ?? true) ? "true" : "false",
31
+ values: ["true", "false"],
32
+ },
33
+ ];
34
+ this.settingsList = new SettingsList(items, Math.min(items.length, 10), getSettingsListTheme(), (id, newValue) => {
35
+ switch (id) {
36
+ case "anthropic-extra-usage":
37
+ this.state = { ...this.state, anthropicExtraUsage: newValue === "true" };
38
+ onChange({ ...this.state });
39
+ break;
40
+ }
41
+ }, onCancel);
42
+ this.addChild(this.settingsList);
43
+ }
44
+ handleInput(data) {
45
+ this.settingsList.handleInput(data);
46
+ }
47
+ }
48
+ class SelectSubmenu extends Container {
49
+ selectList;
50
+ constructor(title, description, options, currentValue, onSelect, onCancel, onSelectionChange) {
51
+ super();
52
+ // Title
53
+ this.addChild(new Text(theme.bold(theme.fg("accent", title)), 0, 0));
54
+ // Description
55
+ if (description) {
56
+ this.addChild(new Spacer(1));
57
+ this.addChild(new Text(theme.fg("muted", description), 0, 0));
58
+ }
59
+ // Spacer
60
+ this.addChild(new Spacer(1));
61
+ // Select list
62
+ this.selectList = new SelectList(options, Math.min(options.length, 10), getSelectListTheme(), SETTINGS_SUBMENU_SELECT_LIST_LAYOUT);
63
+ // Pre-select current value
64
+ const currentIndex = options.findIndex((o) => o.value === currentValue);
65
+ if (currentIndex !== -1) {
66
+ this.selectList.setSelectedIndex(currentIndex);
67
+ }
68
+ this.selectList.onSelect = (item) => {
69
+ onSelect(item.value);
70
+ };
71
+ this.selectList.onCancel = onCancel;
72
+ if (onSelectionChange) {
73
+ this.selectList.onSelectionChange = (item) => {
74
+ onSelectionChange(item.value);
75
+ };
76
+ }
77
+ this.addChild(this.selectList);
78
+ // Hint
79
+ this.addChild(new Spacer(1));
80
+ this.addChild(new Text(theme.fg("dim", " Enter to select · Esc to go back"), 0, 0));
81
+ }
82
+ handleInput(data) {
83
+ this.selectList.handleInput(data);
84
+ }
85
+ }
86
+ /**
87
+ * Main settings selector component.
88
+ */
89
+ export class SettingsSelectorComponent extends Container {
90
+ settingsList;
91
+ constructor(config, callbacks) {
92
+ super();
93
+ const supportsImages = getCapabilities().images;
94
+ let currentWarnings = { ...config.warnings };
95
+ const items = [
96
+ {
97
+ id: "autocompact",
98
+ label: "Auto-compact",
99
+ description: "Automatically compact context when it gets too large",
100
+ currentValue: config.autoCompact ? "true" : "false",
101
+ values: ["true", "false"],
102
+ },
103
+ {
104
+ id: "steering-mode",
105
+ label: "Steering mode",
106
+ description: "Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.",
107
+ currentValue: config.steeringMode,
108
+ values: ["one-at-a-time", "all"],
109
+ },
110
+ {
111
+ id: "follow-up-mode",
112
+ label: "Follow-up mode",
113
+ description: "Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.",
114
+ currentValue: config.followUpMode,
115
+ values: ["one-at-a-time", "all"],
116
+ },
117
+ {
118
+ id: "transport",
119
+ label: "Transport",
120
+ description: "Preferred transport for providers that support multiple transports",
121
+ currentValue: config.transport,
122
+ values: ["sse", "websocket", "websocket-cached", "auto"],
123
+ },
124
+ {
125
+ id: "hide-thinking",
126
+ label: "Hide thinking",
127
+ description: "Hide thinking blocks in assistant responses",
128
+ currentValue: config.hideThinkingBlock ? "true" : "false",
129
+ values: ["true", "false"],
130
+ },
131
+ {
132
+ id: "collapse-changelog",
133
+ label: "Collapse changelog",
134
+ description: "Show condensed changelog after updates",
135
+ currentValue: config.collapseChangelog ? "true" : "false",
136
+ values: ["true", "false"],
137
+ },
138
+ {
139
+ id: "quiet-startup",
140
+ label: "Quiet startup",
141
+ description: "Disable verbose printing at startup",
142
+ currentValue: config.quietStartup ? "true" : "false",
143
+ values: ["true", "false"],
144
+ },
145
+ {
146
+ id: "install-telemetry",
147
+ label: "Install telemetry",
148
+ description: "Send an anonymous version/update ping after changelog-detected updates",
149
+ currentValue: config.enableInstallTelemetry ? "true" : "false",
150
+ values: ["true", "false"],
151
+ },
152
+ {
153
+ id: "double-escape-action",
154
+ label: "Double-escape action",
155
+ description: "Action when pressing Escape twice with empty editor",
156
+ currentValue: config.doubleEscapeAction,
157
+ values: ["tree", "fork", "none"],
158
+ },
159
+ {
160
+ id: "tree-filter-mode",
161
+ label: "Tree filter mode",
162
+ description: "Default filter when opening /tree",
163
+ currentValue: config.treeFilterMode,
164
+ values: ["default", "no-tools", "user-only", "labeled-only", "all"],
165
+ },
166
+ {
167
+ id: "warnings",
168
+ label: "Warnings",
169
+ description: "Enable or disable individual warnings",
170
+ currentValue: "configure",
171
+ submenu: (_currentValue, done) => new WarningSettingsSubmenu(currentWarnings, (warnings) => {
172
+ currentWarnings = warnings;
173
+ callbacks.onWarningsChange(warnings);
174
+ }, () => done()),
175
+ },
176
+ {
177
+ id: "thinking",
178
+ label: "Thinking level",
179
+ description: "Reasoning depth for thinking-capable models",
180
+ currentValue: config.thinkingLevel,
181
+ submenu: (currentValue, done) => new SelectSubmenu("Thinking Level", "Select reasoning depth for thinking-capable models", config.availableThinkingLevels.map((level) => ({
182
+ value: level,
183
+ label: level,
184
+ description: THINKING_DESCRIPTIONS[level],
185
+ })), currentValue, (value) => {
186
+ callbacks.onThinkingLevelChange(value);
187
+ done(value);
188
+ }, () => done()),
189
+ },
190
+ {
191
+ id: "theme",
192
+ label: "Theme",
193
+ description: "Color theme for the interface",
194
+ currentValue: config.currentTheme,
195
+ submenu: (currentValue, done) => new SelectSubmenu("Theme", "Select color theme", config.availableThemes.map((t) => ({
196
+ value: t,
197
+ label: t,
198
+ })), currentValue, (value) => {
199
+ callbacks.onThemeChange(value);
200
+ done(value);
201
+ }, () => {
202
+ // Restore original theme on cancel
203
+ callbacks.onThemePreview?.(currentValue);
204
+ done();
205
+ }, (value) => {
206
+ // Preview theme on selection change
207
+ callbacks.onThemePreview?.(value);
208
+ }),
209
+ },
210
+ ];
211
+ // Only show image toggle if terminal supports it
212
+ if (supportsImages) {
213
+ // Insert after autocompact
214
+ items.splice(1, 0, {
215
+ id: "show-images",
216
+ label: "Show images",
217
+ description: "Render images inline in terminal",
218
+ currentValue: config.showImages ? "true" : "false",
219
+ values: ["true", "false"],
220
+ });
221
+ items.splice(2, 0, {
222
+ id: "image-width-cells",
223
+ label: "Image width",
224
+ description: "Preferred inline image width in terminal cells",
225
+ currentValue: String(config.imageWidthCells),
226
+ values: ["60", "80", "120"],
227
+ });
228
+ }
229
+ // Image auto-resize toggle (always available, affects both attached and read images)
230
+ items.splice(supportsImages ? 3 : 1, 0, {
231
+ id: "auto-resize-images",
232
+ label: "Auto-resize images",
233
+ description: "Resize large images to 2000x2000 max for better model compatibility",
234
+ currentValue: config.autoResizeImages ? "true" : "false",
235
+ values: ["true", "false"],
236
+ });
237
+ // Block images toggle (always available, insert after auto-resize-images)
238
+ const autoResizeIndex = items.findIndex((item) => item.id === "auto-resize-images");
239
+ items.splice(autoResizeIndex + 1, 0, {
240
+ id: "block-images",
241
+ label: "Block images",
242
+ description: "Prevent images from being sent to LLM providers",
243
+ currentValue: config.blockImages ? "true" : "false",
244
+ values: ["true", "false"],
245
+ });
246
+ // Skill commands toggle (insert after block-images)
247
+ const blockImagesIndex = items.findIndex((item) => item.id === "block-images");
248
+ items.splice(blockImagesIndex + 1, 0, {
249
+ id: "skill-commands",
250
+ label: "Skill commands",
251
+ description: "Register skills as /skill:name commands",
252
+ currentValue: config.enableSkillCommands ? "true" : "false",
253
+ values: ["true", "false"],
254
+ });
255
+ // Hardware cursor toggle (insert after skill-commands)
256
+ const skillCommandsIndex = items.findIndex((item) => item.id === "skill-commands");
257
+ items.splice(skillCommandsIndex + 1, 0, {
258
+ id: "show-hardware-cursor",
259
+ label: "Show hardware cursor",
260
+ description: "Show the terminal cursor while still positioning it for IME support",
261
+ currentValue: config.showHardwareCursor ? "true" : "false",
262
+ values: ["true", "false"],
263
+ });
264
+ // Editor padding toggle (insert after show-hardware-cursor)
265
+ const hardwareCursorIndex = items.findIndex((item) => item.id === "show-hardware-cursor");
266
+ items.splice(hardwareCursorIndex + 1, 0, {
267
+ id: "editor-padding",
268
+ label: "Editor padding",
269
+ description: "Horizontal padding for input editor (0-3)",
270
+ currentValue: String(config.editorPaddingX),
271
+ values: ["0", "1", "2", "3"],
272
+ });
273
+ // Autocomplete max visible toggle (insert after editor-padding)
274
+ const editorPaddingIndex = items.findIndex((item) => item.id === "editor-padding");
275
+ items.splice(editorPaddingIndex + 1, 0, {
276
+ id: "autocomplete-max-visible",
277
+ label: "Autocomplete max items",
278
+ description: "Max visible items in autocomplete dropdown (3-20)",
279
+ currentValue: String(config.autocompleteMaxVisible),
280
+ values: ["3", "5", "7", "10", "15", "20"],
281
+ });
282
+ // Clear on shrink toggle (insert after autocomplete-max-visible)
283
+ const autocompleteIndex = items.findIndex((item) => item.id === "autocomplete-max-visible");
284
+ items.splice(autocompleteIndex + 1, 0, {
285
+ id: "clear-on-shrink",
286
+ label: "Clear on shrink",
287
+ description: "Clear empty rows when content shrinks (may cause flicker)",
288
+ currentValue: config.clearOnShrink ? "true" : "false",
289
+ values: ["true", "false"],
290
+ });
291
+ // Terminal progress toggle (insert after clear-on-shrink)
292
+ const clearOnShrinkIndex = items.findIndex((item) => item.id === "clear-on-shrink");
293
+ items.splice(clearOnShrinkIndex + 1, 0, {
294
+ id: "terminal-progress",
295
+ label: "Terminal progress",
296
+ description: "Show OSC 9;4 progress indicators in the terminal tab bar",
297
+ currentValue: config.showTerminalProgress ? "true" : "false",
298
+ values: ["true", "false"],
299
+ });
300
+ // Add borders
301
+ this.addChild(new DynamicBorder());
302
+ this.settingsList = new SettingsList(items, 10, getSettingsListTheme(), (id, newValue) => {
303
+ switch (id) {
304
+ case "autocompact":
305
+ callbacks.onAutoCompactChange(newValue === "true");
306
+ break;
307
+ case "show-images":
308
+ callbacks.onShowImagesChange(newValue === "true");
309
+ break;
310
+ case "image-width-cells":
311
+ callbacks.onImageWidthCellsChange(parseInt(newValue, 10));
312
+ break;
313
+ case "auto-resize-images":
314
+ callbacks.onAutoResizeImagesChange(newValue === "true");
315
+ break;
316
+ case "block-images":
317
+ callbacks.onBlockImagesChange(newValue === "true");
318
+ break;
319
+ case "skill-commands":
320
+ callbacks.onEnableSkillCommandsChange(newValue === "true");
321
+ break;
322
+ case "steering-mode":
323
+ callbacks.onSteeringModeChange(newValue);
324
+ break;
325
+ case "follow-up-mode":
326
+ callbacks.onFollowUpModeChange(newValue);
327
+ break;
328
+ case "transport":
329
+ callbacks.onTransportChange(newValue);
330
+ break;
331
+ case "hide-thinking":
332
+ callbacks.onHideThinkingBlockChange(newValue === "true");
333
+ break;
334
+ case "collapse-changelog":
335
+ callbacks.onCollapseChangelogChange(newValue === "true");
336
+ break;
337
+ case "quiet-startup":
338
+ callbacks.onQuietStartupChange(newValue === "true");
339
+ break;
340
+ case "install-telemetry":
341
+ callbacks.onEnableInstallTelemetryChange(newValue === "true");
342
+ break;
343
+ case "double-escape-action":
344
+ callbacks.onDoubleEscapeActionChange(newValue);
345
+ break;
346
+ case "tree-filter-mode":
347
+ callbacks.onTreeFilterModeChange(newValue);
348
+ break;
349
+ case "show-hardware-cursor":
350
+ callbacks.onShowHardwareCursorChange(newValue === "true");
351
+ break;
352
+ case "editor-padding":
353
+ callbacks.onEditorPaddingXChange(parseInt(newValue, 10));
354
+ break;
355
+ case "autocomplete-max-visible":
356
+ callbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));
357
+ break;
358
+ case "clear-on-shrink":
359
+ callbacks.onClearOnShrinkChange(newValue === "true");
360
+ break;
361
+ case "terminal-progress":
362
+ callbacks.onShowTerminalProgressChange(newValue === "true");
363
+ break;
364
+ }
365
+ }, callbacks.onCancel, { enableSearch: true });
366
+ this.addChild(this.settingsList);
367
+ this.addChild(new DynamicBorder());
368
+ }
369
+ getSettingsList() {
370
+ return this.settingsList;
371
+ }
372
+ }
373
+ //# sourceMappingURL=settings-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/settings-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Transport } from \"@earendil-works/pi-ai\";\nimport {\n\tContainer,\n\tgetCapabilities,\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SettingItem,\n\tSettingsList,\n\tSpacer,\n\tText,\n} from \"@earendil-works/pi-tui\";\nimport type { WarningSettings } from \"../../../core/settings-manager.js\";\nimport { getSelectListTheme, getSettingsListTheme, theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SETTINGS_SUBMENU_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {\n\toff: \"No reasoning\",\n\tminimal: \"Very brief reasoning (~1k tokens)\",\n\tlow: \"Light reasoning (~2k tokens)\",\n\tmedium: \"Moderate reasoning (~8k tokens)\",\n\thigh: \"Deep reasoning (~16k tokens)\",\n\txhigh: \"Maximum reasoning (~32k tokens)\",\n};\n\nexport interface SettingsConfig {\n\tautoCompact: boolean;\n\tshowImages: boolean;\n\timageWidthCells: number;\n\tautoResizeImages: boolean;\n\tblockImages: boolean;\n\tenableSkillCommands: boolean;\n\tsteeringMode: \"all\" | \"one-at-a-time\";\n\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\ttransport: Transport;\n\tthinkingLevel: ThinkingLevel;\n\tavailableThinkingLevels: ThinkingLevel[];\n\tcurrentTheme: string;\n\tavailableThemes: string[];\n\thideThinkingBlock: boolean;\n\tcollapseChangelog: boolean;\n\tenableInstallTelemetry: boolean;\n\tdoubleEscapeAction: \"fork\" | \"tree\" | \"none\";\n\ttreeFilterMode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tshowHardwareCursor: boolean;\n\teditorPaddingX: number;\n\tautocompleteMaxVisible: number;\n\tquietStartup: boolean;\n\tclearOnShrink: boolean;\n\tshowTerminalProgress: boolean;\n\twarnings: WarningSettings;\n}\n\nexport interface SettingsCallbacks {\n\tonAutoCompactChange: (enabled: boolean) => void;\n\tonShowImagesChange: (enabled: boolean) => void;\n\tonImageWidthCellsChange: (width: number) => void;\n\tonAutoResizeImagesChange: (enabled: boolean) => void;\n\tonBlockImagesChange: (blocked: boolean) => void;\n\tonEnableSkillCommandsChange: (enabled: boolean) => void;\n\tonSteeringModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonFollowUpModeChange: (mode: \"all\" | \"one-at-a-time\") => void;\n\tonTransportChange: (transport: Transport) => void;\n\tonThinkingLevelChange: (level: ThinkingLevel) => void;\n\tonThemeChange: (theme: string) => void;\n\tonThemePreview?: (theme: string) => void;\n\tonHideThinkingBlockChange: (hidden: boolean) => void;\n\tonCollapseChangelogChange: (collapsed: boolean) => void;\n\tonEnableInstallTelemetryChange: (enabled: boolean) => void;\n\tonDoubleEscapeActionChange: (action: \"fork\" | \"tree\" | \"none\") => void;\n\tonTreeFilterModeChange: (mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\") => void;\n\tonShowHardwareCursorChange: (enabled: boolean) => void;\n\tonEditorPaddingXChange: (padding: number) => void;\n\tonAutocompleteMaxVisibleChange: (maxVisible: number) => void;\n\tonQuietStartupChange: (enabled: boolean) => void;\n\tonClearOnShrinkChange: (enabled: boolean) => void;\n\tonShowTerminalProgressChange: (enabled: boolean) => void;\n\tonWarningsChange: (warnings: WarningSettings) => void;\n\tonCancel: () => void;\n}\n\n/**\n * A submenu component for selecting from a list of options.\n */\nclass WarningSettingsSubmenu extends Container {\n\tprivate settingsList: SettingsList;\n\tprivate state: WarningSettings;\n\n\tconstructor(warnings: WarningSettings, onChange: (warnings: WarningSettings) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.state = { ...warnings };\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"anthropic-extra-usage\",\n\t\t\t\tlabel: \"Anthropic extra usage\",\n\t\t\t\tdescription: \"Warn when Anthropic subscription auth may use paid extra usage\",\n\t\t\t\tcurrentValue: (this.state.anthropicExtraUsage ?? true) ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t];\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\tMath.min(items.length, 10),\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"anthropic-extra-usage\":\n\t\t\t\t\t\tthis.state = { ...this.state, anthropicExtraUsage: newValue === \"true\" };\n\t\t\t\t\t\tonChange({ ...this.state });\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCancel,\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.settingsList.handleInput(data);\n\t}\n}\n\nclass SelectSubmenu extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\ttitle: string,\n\t\tdescription: string,\n\t\toptions: SelectItem[],\n\t\tcurrentValue: string,\n\t\tonSelect: (value: string) => void,\n\t\tonCancel: () => void,\n\t\tonSelectionChange?: (value: string) => void,\n\t) {\n\t\tsuper();\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", title)), 0, 0));\n\n\t\t// Description\n\t\tif (description) {\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", description), 0, 0));\n\t\t}\n\n\t\t// Spacer\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Select list\n\t\tthis.selectList = new SelectList(\n\t\t\toptions,\n\t\t\tMath.min(options.length, 10),\n\t\t\tgetSelectListTheme(),\n\t\t\tSETTINGS_SUBMENU_SELECT_LIST_LAYOUT,\n\t\t);\n\n\t\t// Pre-select current value\n\t\tconst currentIndex = options.findIndex((o) => o.value === currentValue);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = onCancel;\n\n\t\tif (onSelectionChange) {\n\t\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\t\tonSelectionChange(item.value);\n\t\t\t};\n\t\t}\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"dim\", \" Enter to select · Esc to go back\"), 0, 0));\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n\n/**\n * Main settings selector component.\n */\nexport class SettingsSelectorComponent extends Container {\n\tprivate settingsList: SettingsList;\n\n\tconstructor(config: SettingsConfig, callbacks: SettingsCallbacks) {\n\t\tsuper();\n\n\t\tconst supportsImages = getCapabilities().images;\n\t\tlet currentWarnings = { ...config.warnings };\n\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"autocompact\",\n\t\t\t\tlabel: \"Auto-compact\",\n\t\t\t\tdescription: \"Automatically compact context when it gets too large\",\n\t\t\t\tcurrentValue: config.autoCompact ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"steering-mode\",\n\t\t\t\tlabel: \"Steering mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.steeringMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"follow-up-mode\",\n\t\t\t\tlabel: \"Follow-up mode\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Alt+Enter queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\",\n\t\t\t\tcurrentValue: config.followUpMode,\n\t\t\t\tvalues: [\"one-at-a-time\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"transport\",\n\t\t\t\tlabel: \"Transport\",\n\t\t\t\tdescription: \"Preferred transport for providers that support multiple transports\",\n\t\t\t\tcurrentValue: config.transport,\n\t\t\t\tvalues: [\"sse\", \"websocket\", \"websocket-cached\", \"auto\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"hide-thinking\",\n\t\t\t\tlabel: \"Hide thinking\",\n\t\t\t\tdescription: \"Hide thinking blocks in assistant responses\",\n\t\t\t\tcurrentValue: config.hideThinkingBlock ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"collapse-changelog\",\n\t\t\t\tlabel: \"Collapse changelog\",\n\t\t\t\tdescription: \"Show condensed changelog after updates\",\n\t\t\t\tcurrentValue: config.collapseChangelog ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"quiet-startup\",\n\t\t\t\tlabel: \"Quiet startup\",\n\t\t\t\tdescription: \"Disable verbose printing at startup\",\n\t\t\t\tcurrentValue: config.quietStartup ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"install-telemetry\",\n\t\t\t\tlabel: \"Install telemetry\",\n\t\t\t\tdescription: \"Send an anonymous version/update ping after changelog-detected updates\",\n\t\t\t\tcurrentValue: config.enableInstallTelemetry ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"double-escape-action\",\n\t\t\t\tlabel: \"Double-escape action\",\n\t\t\t\tdescription: \"Action when pressing Escape twice with empty editor\",\n\t\t\t\tcurrentValue: config.doubleEscapeAction,\n\t\t\t\tvalues: [\"tree\", \"fork\", \"none\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"tree-filter-mode\",\n\t\t\t\tlabel: \"Tree filter mode\",\n\t\t\t\tdescription: \"Default filter when opening /tree\",\n\t\t\t\tcurrentValue: config.treeFilterMode,\n\t\t\t\tvalues: [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"warnings\",\n\t\t\t\tlabel: \"Warnings\",\n\t\t\t\tdescription: \"Enable or disable individual warnings\",\n\t\t\t\tcurrentValue: \"configure\",\n\t\t\t\tsubmenu: (_currentValue, done) =>\n\t\t\t\t\tnew WarningSettingsSubmenu(\n\t\t\t\t\t\tcurrentWarnings,\n\t\t\t\t\t\t(warnings) => {\n\t\t\t\t\t\t\tcurrentWarnings = warnings;\n\t\t\t\t\t\t\tcallbacks.onWarningsChange(warnings);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"thinking\",\n\t\t\t\tlabel: \"Thinking level\",\n\t\t\t\tdescription: \"Reasoning depth for thinking-capable models\",\n\t\t\t\tcurrentValue: config.thinkingLevel,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Thinking Level\",\n\t\t\t\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\t\t\t\tconfig.availableThinkingLevels.map((level) => ({\n\t\t\t\t\t\t\tvalue: level,\n\t\t\t\t\t\t\tlabel: level,\n\t\t\t\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThinkingLevelChange(value as ThinkingLevel);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => done(),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"theme\",\n\t\t\t\tlabel: \"Theme\",\n\t\t\t\tdescription: \"Color theme for the interface\",\n\t\t\t\tcurrentValue: config.currentTheme,\n\t\t\t\tsubmenu: (currentValue, done) =>\n\t\t\t\t\tnew SelectSubmenu(\n\t\t\t\t\t\t\"Theme\",\n\t\t\t\t\t\t\"Select color theme\",\n\t\t\t\t\t\tconfig.availableThemes.map((t) => ({\n\t\t\t\t\t\t\tvalue: t,\n\t\t\t\t\t\t\tlabel: t,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\tcallbacks.onThemeChange(value);\n\t\t\t\t\t\t\tdone(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// Restore original theme on cancel\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(currentValue);\n\t\t\t\t\t\t\tdone();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(value) => {\n\t\t\t\t\t\t\t// Preview theme on selection change\n\t\t\t\t\t\t\tcallbacks.onThemePreview?.(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t},\n\t\t];\n\n\t\t// Only show image toggle if terminal supports it\n\t\tif (supportsImages) {\n\t\t\t// Insert after autocompact\n\t\t\titems.splice(1, 0, {\n\t\t\t\tid: \"show-images\",\n\t\t\t\tlabel: \"Show images\",\n\t\t\t\tdescription: \"Render images inline in terminal\",\n\t\t\t\tcurrentValue: config.showImages ? \"true\" : \"false\",\n\t\t\t\tvalues: [\"true\", \"false\"],\n\t\t\t});\n\t\t\titems.splice(2, 0, {\n\t\t\t\tid: \"image-width-cells\",\n\t\t\t\tlabel: \"Image width\",\n\t\t\t\tdescription: \"Preferred inline image width in terminal cells\",\n\t\t\t\tcurrentValue: String(config.imageWidthCells),\n\t\t\t\tvalues: [\"60\", \"80\", \"120\"],\n\t\t\t});\n\t\t}\n\n\t\t// Image auto-resize toggle (always available, affects both attached and read images)\n\t\titems.splice(supportsImages ? 3 : 1, 0, {\n\t\t\tid: \"auto-resize-images\",\n\t\t\tlabel: \"Auto-resize images\",\n\t\t\tdescription: \"Resize large images to 2000x2000 max for better model compatibility\",\n\t\t\tcurrentValue: config.autoResizeImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Block images toggle (always available, insert after auto-resize-images)\n\t\tconst autoResizeIndex = items.findIndex((item) => item.id === \"auto-resize-images\");\n\t\titems.splice(autoResizeIndex + 1, 0, {\n\t\t\tid: \"block-images\",\n\t\t\tlabel: \"Block images\",\n\t\t\tdescription: \"Prevent images from being sent to LLM providers\",\n\t\t\tcurrentValue: config.blockImages ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Skill commands toggle (insert after block-images)\n\t\tconst blockImagesIndex = items.findIndex((item) => item.id === \"block-images\");\n\t\titems.splice(blockImagesIndex + 1, 0, {\n\t\t\tid: \"skill-commands\",\n\t\t\tlabel: \"Skill commands\",\n\t\t\tdescription: \"Register skills as /skill:name commands\",\n\t\t\tcurrentValue: config.enableSkillCommands ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Hardware cursor toggle (insert after skill-commands)\n\t\tconst skillCommandsIndex = items.findIndex((item) => item.id === \"skill-commands\");\n\t\titems.splice(skillCommandsIndex + 1, 0, {\n\t\t\tid: \"show-hardware-cursor\",\n\t\t\tlabel: \"Show hardware cursor\",\n\t\t\tdescription: \"Show the terminal cursor while still positioning it for IME support\",\n\t\t\tcurrentValue: config.showHardwareCursor ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Editor padding toggle (insert after show-hardware-cursor)\n\t\tconst hardwareCursorIndex = items.findIndex((item) => item.id === \"show-hardware-cursor\");\n\t\titems.splice(hardwareCursorIndex + 1, 0, {\n\t\t\tid: \"editor-padding\",\n\t\t\tlabel: \"Editor padding\",\n\t\t\tdescription: \"Horizontal padding for input editor (0-3)\",\n\t\t\tcurrentValue: String(config.editorPaddingX),\n\t\t\tvalues: [\"0\", \"1\", \"2\", \"3\"],\n\t\t});\n\n\t\t// Autocomplete max visible toggle (insert after editor-padding)\n\t\tconst editorPaddingIndex = items.findIndex((item) => item.id === \"editor-padding\");\n\t\titems.splice(editorPaddingIndex + 1, 0, {\n\t\t\tid: \"autocomplete-max-visible\",\n\t\t\tlabel: \"Autocomplete max items\",\n\t\t\tdescription: \"Max visible items in autocomplete dropdown (3-20)\",\n\t\t\tcurrentValue: String(config.autocompleteMaxVisible),\n\t\t\tvalues: [\"3\", \"5\", \"7\", \"10\", \"15\", \"20\"],\n\t\t});\n\n\t\t// Clear on shrink toggle (insert after autocomplete-max-visible)\n\t\tconst autocompleteIndex = items.findIndex((item) => item.id === \"autocomplete-max-visible\");\n\t\titems.splice(autocompleteIndex + 1, 0, {\n\t\t\tid: \"clear-on-shrink\",\n\t\t\tlabel: \"Clear on shrink\",\n\t\t\tdescription: \"Clear empty rows when content shrinks (may cause flicker)\",\n\t\t\tcurrentValue: config.clearOnShrink ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Terminal progress toggle (insert after clear-on-shrink)\n\t\tconst clearOnShrinkIndex = items.findIndex((item) => item.id === \"clear-on-shrink\");\n\t\titems.splice(clearOnShrinkIndex + 1, 0, {\n\t\t\tid: \"terminal-progress\",\n\t\t\tlabel: \"Terminal progress\",\n\t\t\tdescription: \"Show OSC 9;4 progress indicators in the terminal tab bar\",\n\t\t\tcurrentValue: config.showTerminalProgress ? \"true\" : \"false\",\n\t\t\tvalues: [\"true\", \"false\"],\n\t\t});\n\n\t\t// Add borders\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.settingsList = new SettingsList(\n\t\t\titems,\n\t\t\t10,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, newValue) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase \"autocompact\":\n\t\t\t\t\t\tcallbacks.onAutoCompactChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-images\":\n\t\t\t\t\t\tcallbacks.onShowImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image-width-cells\":\n\t\t\t\t\t\tcallbacks.onImageWidthCellsChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"auto-resize-images\":\n\t\t\t\t\t\tcallbacks.onAutoResizeImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"block-images\":\n\t\t\t\t\t\tcallbacks.onBlockImagesChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"skill-commands\":\n\t\t\t\t\t\tcallbacks.onEnableSkillCommandsChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"steering-mode\":\n\t\t\t\t\t\tcallbacks.onSteeringModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"follow-up-mode\":\n\t\t\t\t\t\tcallbacks.onFollowUpModeChange(newValue as \"all\" | \"one-at-a-time\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"transport\":\n\t\t\t\t\t\tcallbacks.onTransportChange(newValue as Transport);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"hide-thinking\":\n\t\t\t\t\t\tcallbacks.onHideThinkingBlockChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"collapse-changelog\":\n\t\t\t\t\t\tcallbacks.onCollapseChangelogChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"quiet-startup\":\n\t\t\t\t\t\tcallbacks.onQuietStartupChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"install-telemetry\":\n\t\t\t\t\t\tcallbacks.onEnableInstallTelemetryChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"double-escape-action\":\n\t\t\t\t\t\tcallbacks.onDoubleEscapeActionChange(newValue as \"fork\" | \"tree\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tree-filter-mode\":\n\t\t\t\t\t\tcallbacks.onTreeFilterModeChange(\n\t\t\t\t\t\t\tnewValue as \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"show-hardware-cursor\":\n\t\t\t\t\t\tcallbacks.onShowHardwareCursorChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"editor-padding\":\n\t\t\t\t\t\tcallbacks.onEditorPaddingXChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"autocomplete-max-visible\":\n\t\t\t\t\t\tcallbacks.onAutocompleteMaxVisibleChange(parseInt(newValue, 10));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"clear-on-shrink\":\n\t\t\t\t\t\tcallbacks.onClearOnShrinkChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"terminal-progress\":\n\t\t\t\t\t\tcallbacks.onShowTerminalProgressChange(newValue === \"true\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallbacks.onCancel,\n\t\t\t{ enableSearch: true },\n\t\t);\n\n\t\tthis.addChild(this.settingsList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSettingsList(): SettingsList {\n\t\treturn this.settingsList;\n\t}\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { Container, SelectList } from "@earendil-works/pi-tui";
2
+ /**
3
+ * Component that renders a show images selector with borders
4
+ */
5
+ export declare class ShowImagesSelectorComponent extends Container {
6
+ private selectList;
7
+ constructor(currentValue: boolean, onSelect: (show: boolean) => void, onCancel: () => void);
8
+ getSelectList(): SelectList;
9
+ }
10
+ //# sourceMappingURL=show-images-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-images-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/show-images-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAgC,MAAM,wBAAwB,CAAC;AAS9G;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,SAAS;IACzD,OAAO,CAAC,UAAU,CAAa;IAE/B,YAAY,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,EA6BzF;IAED,aAAa,IAAI,UAAU,CAE1B;CACD","sourcesContent":["import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from \"@earendil-works/pi-tui\";\nimport { getSelectListTheme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SHOW_IMAGES_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\n/**\n * Component that renders a show images selector with borders\n */\nexport class ShowImagesSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(currentValue: boolean, onSelect: (show: boolean) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tconst items: SelectItem[] = [\n\t\t\t{ value: \"yes\", label: \"Yes\", description: \"Show images inline in terminal\" },\n\t\t\t{ value: \"no\", label: \"No\", description: \"Show text placeholder instead\" },\n\t\t];\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Create selector\n\t\tthis.selectList = new SelectList(items, 5, getSelectListTheme(), SHOW_IMAGES_SELECT_LIST_LAYOUT);\n\n\t\t// Preselect current value\n\t\tthis.selectList.setSelectedIndex(currentValue ? 0 : 1);\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value === \"yes\");\n\t\t};\n\n\t\tthis.selectList.onCancel = () => {\n\t\t\tonCancel();\n\t\t};\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSelectList(): SelectList {\n\t\treturn this.selectList;\n\t}\n}\n"]}
@@ -0,0 +1,39 @@
1
+ import { Container, SelectList } from "@earendil-works/pi-tui";
2
+ import { getSelectListTheme } from "../theme/theme.js";
3
+ import { DynamicBorder } from "./dynamic-border.js";
4
+ const SHOW_IMAGES_SELECT_LIST_LAYOUT = {
5
+ minPrimaryColumnWidth: 12,
6
+ maxPrimaryColumnWidth: 32,
7
+ };
8
+ /**
9
+ * Component that renders a show images selector with borders
10
+ */
11
+ export class ShowImagesSelectorComponent extends Container {
12
+ selectList;
13
+ constructor(currentValue, onSelect, onCancel) {
14
+ super();
15
+ const items = [
16
+ { value: "yes", label: "Yes", description: "Show images inline in terminal" },
17
+ { value: "no", label: "No", description: "Show text placeholder instead" },
18
+ ];
19
+ // Add top border
20
+ this.addChild(new DynamicBorder());
21
+ // Create selector
22
+ this.selectList = new SelectList(items, 5, getSelectListTheme(), SHOW_IMAGES_SELECT_LIST_LAYOUT);
23
+ // Preselect current value
24
+ this.selectList.setSelectedIndex(currentValue ? 0 : 1);
25
+ this.selectList.onSelect = (item) => {
26
+ onSelect(item.value === "yes");
27
+ };
28
+ this.selectList.onCancel = () => {
29
+ onCancel();
30
+ };
31
+ this.addChild(this.selectList);
32
+ // Add bottom border
33
+ this.addChild(new DynamicBorder());
34
+ }
35
+ getSelectList() {
36
+ return this.selectList;
37
+ }
38
+ }
39
+ //# sourceMappingURL=show-images-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-images-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/show-images-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAgC,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,8BAA8B,GAA4B;IAC/D,qBAAqB,EAAE,EAAE;IACzB,qBAAqB,EAAE,EAAE;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,SAAS;IACjD,UAAU,CAAa;IAE/B,YAAY,YAAqB,EAAE,QAAiC,EAAE,QAAoB,EAAE;QAC3F,KAAK,EAAE,CAAC;QAER,MAAM,KAAK,GAAiB;YAC3B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,gCAAgC,EAAE;YAC7E,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,+BAA+B,EAAE;SAC1E,CAAC;QAEF,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,kBAAkB;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,kBAAkB,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAEjG,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAAA,CAC/B,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;YAChC,QAAQ,EAAE,CAAC;QAAA,CACX,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/B,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAAA,CACnC;IAED,aAAa,GAAe;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC;IAAA,CACvB;CACD","sourcesContent":["import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from \"@earendil-works/pi-tui\";\nimport { getSelectListTheme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst SHOW_IMAGES_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\n/**\n * Component that renders a show images selector with borders\n */\nexport class ShowImagesSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(currentValue: boolean, onSelect: (show: boolean) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tconst items: SelectItem[] = [\n\t\t\t{ value: \"yes\", label: \"Yes\", description: \"Show images inline in terminal\" },\n\t\t\t{ value: \"no\", label: \"No\", description: \"Show text placeholder instead\" },\n\t\t];\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Create selector\n\t\tthis.selectList = new SelectList(items, 5, getSelectListTheme(), SHOW_IMAGES_SELECT_LIST_LAYOUT);\n\n\t\t// Preselect current value\n\t\tthis.selectList.setSelectedIndex(currentValue ? 0 : 1);\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value === \"yes\");\n\t\t};\n\n\t\tthis.selectList.onCancel = () => {\n\t\t\tonCancel();\n\t\t};\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSelectList(): SelectList {\n\t\treturn this.selectList;\n\t}\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import { Box, type MarkdownTheme } from "@earendil-works/pi-tui";
2
+ import type { ParsedSkillBlock } from "../../../core/agent-session.js";
3
+ /**
4
+ * Component that renders a skill invocation message with collapsed/expanded state.
5
+ * Uses same background color as custom messages for visual consistency.
6
+ * Only renders the skill block itself - user message is rendered separately.
7
+ */
8
+ export declare class SkillInvocationMessageComponent extends Box {
9
+ private expanded;
10
+ private skillBlock;
11
+ private markdownTheme;
12
+ constructor(skillBlock: ParsedSkillBlock, markdownTheme?: MarkdownTheme);
13
+ setExpanded(expanded: boolean): void;
14
+ invalidate(): void;
15
+ private updateDisplay;
16
+ }
17
+ //# sourceMappingURL=skill-invocation-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-invocation-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/skill-invocation-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,KAAK,aAAa,EAAQ,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAIvE;;;;GAIG;AACH,qBAAa,+BAAgC,SAAQ,GAAG;IACvD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,aAAa,CAAgB;IAErC,YAAY,UAAU,EAAE,gBAAgB,EAAE,aAAa,GAAE,aAAkC,EAK1F;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAGnC;IAEQ,UAAU,IAAI,IAAI,CAG1B;IAED,OAAO,CAAC,aAAa;CAsBrB","sourcesContent":["import { Box, Markdown, type MarkdownTheme, Text } from \"@earendil-works/pi-tui\";\nimport type { ParsedSkillBlock } from \"../../../core/agent-session.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { keyText } from \"./keybinding-hints.js\";\n\n/**\n * Component that renders a skill invocation message with collapsed/expanded state.\n * Uses same background color as custom messages for visual consistency.\n * Only renders the skill block itself - user message is rendered separately.\n */\nexport class SkillInvocationMessageComponent extends Box {\n\tprivate expanded = false;\n\tprivate skillBlock: ParsedSkillBlock;\n\tprivate markdownTheme: MarkdownTheme;\n\n\tconstructor(skillBlock: ParsedSkillBlock, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\t\tthis.skillBlock = skillBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.updateDisplay();\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.updateDisplay();\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tthis.clear();\n\n\t\tif (this.expanded) {\n\t\t\t// Expanded: label + skill name header + full content\n\t\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m`);\n\t\t\tthis.addChild(new Text(label, 0, 0));\n\t\t\tconst header = `**${this.skillBlock.name}**\\n\\n`;\n\t\t\tthis.addChild(\n\t\t\t\tnew Markdown(header + this.skillBlock.content, 0, 0, this.markdownTheme, {\n\t\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\t// Collapsed: single line - [skill] name (hint to expand)\n\t\t\tconst line =\n\t\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\t\ttheme.fg(\"customMessageText\", this.skillBlock.name) +\n\t\t\t\ttheme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\t\t\tthis.addChild(new Text(line, 0, 0));\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { Box, Markdown, Text } from "@earendil-works/pi-tui";
2
+ import { getMarkdownTheme, theme } from "../theme/theme.js";
3
+ import { keyText } from "./keybinding-hints.js";
4
+ /**
5
+ * Component that renders a skill invocation message with collapsed/expanded state.
6
+ * Uses same background color as custom messages for visual consistency.
7
+ * Only renders the skill block itself - user message is rendered separately.
8
+ */
9
+ export class SkillInvocationMessageComponent extends Box {
10
+ expanded = false;
11
+ skillBlock;
12
+ markdownTheme;
13
+ constructor(skillBlock, markdownTheme = getMarkdownTheme()) {
14
+ super(1, 1, (t) => theme.bg("customMessageBg", t));
15
+ this.skillBlock = skillBlock;
16
+ this.markdownTheme = markdownTheme;
17
+ this.updateDisplay();
18
+ }
19
+ setExpanded(expanded) {
20
+ this.expanded = expanded;
21
+ this.updateDisplay();
22
+ }
23
+ invalidate() {
24
+ super.invalidate();
25
+ this.updateDisplay();
26
+ }
27
+ updateDisplay() {
28
+ this.clear();
29
+ if (this.expanded) {
30
+ // Expanded: label + skill name header + full content
31
+ const label = theme.fg("customMessageLabel", `\x1b[1m[skill]\x1b[22m`);
32
+ this.addChild(new Text(label, 0, 0));
33
+ const header = `**${this.skillBlock.name}**\n\n`;
34
+ this.addChild(new Markdown(header + this.skillBlock.content, 0, 0, this.markdownTheme, {
35
+ color: (text) => theme.fg("customMessageText", text),
36
+ }));
37
+ }
38
+ else {
39
+ // Collapsed: single line - [skill] name (hint to expand)
40
+ const line = theme.fg("customMessageLabel", `\x1b[1m[skill]\x1b[22m `) +
41
+ theme.fg("customMessageText", this.skillBlock.name) +
42
+ theme.fg("dim", ` (${keyText("app.tools.expand")} to expand)`);
43
+ this.addChild(new Text(line, 0, 0));
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=skill-invocation-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-invocation-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/skill-invocation-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAsB,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,OAAO,+BAAgC,SAAQ,GAAG;IAC/C,QAAQ,GAAG,KAAK,CAAC;IACjB,UAAU,CAAmB;IAC7B,aAAa,CAAgB;IAErC,YAAY,UAA4B,EAAE,aAAa,GAAkB,gBAAgB,EAAE,EAAE;QAC5F,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,aAAa,EAAE,CAAC;IAAA,CACrB;IAED,WAAW,CAAC,QAAiB,EAAQ;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;IAAA,CACrB;IAEQ,UAAU,GAAS;QAC3B,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,EAAE,CAAC;IAAA,CACrB;IAEO,aAAa,GAAS;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,qDAAqD;YACrD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,oBAAoB,EAAE,wBAAwB,CAAC,CAAC;YACvE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC;YACjD,IAAI,CAAC,QAAQ,CACZ,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE;gBACxE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC;aAC5D,CAAC,CACF,CAAC;QACH,CAAC;aAAM,CAAC;YACP,yDAAyD;YACzD,MAAM,IAAI,GACT,KAAK,CAAC,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;gBACzD,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACnD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;IAAA,CACD;CACD","sourcesContent":["import { Box, Markdown, type MarkdownTheme, Text } from \"@earendil-works/pi-tui\";\nimport type { ParsedSkillBlock } from \"../../../core/agent-session.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { keyText } from \"./keybinding-hints.js\";\n\n/**\n * Component that renders a skill invocation message with collapsed/expanded state.\n * Uses same background color as custom messages for visual consistency.\n * Only renders the skill block itself - user message is rendered separately.\n */\nexport class SkillInvocationMessageComponent extends Box {\n\tprivate expanded = false;\n\tprivate skillBlock: ParsedSkillBlock;\n\tprivate markdownTheme: MarkdownTheme;\n\n\tconstructor(skillBlock: ParsedSkillBlock, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\t\tthis.skillBlock = skillBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.updateDisplay();\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.updateDisplay();\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tthis.clear();\n\n\t\tif (this.expanded) {\n\t\t\t// Expanded: label + skill name header + full content\n\t\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m`);\n\t\t\tthis.addChild(new Text(label, 0, 0));\n\t\t\tconst header = `**${this.skillBlock.name}**\\n\\n`;\n\t\t\tthis.addChild(\n\t\t\t\tnew Markdown(header + this.skillBlock.content, 0, 0, this.markdownTheme, {\n\t\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\t// Collapsed: single line - [skill] name (hint to expand)\n\t\t\tconst line =\n\t\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\t\ttheme.fg(\"customMessageText\", this.skillBlock.name) +\n\t\t\t\ttheme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\t\t\tthis.addChild(new Text(line, 0, 0));\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { Container, SelectList } from "@earendil-works/pi-tui";
2
+ /**
3
+ * Component that renders a theme selector
4
+ */
5
+ export declare class ThemeSelectorComponent extends Container {
6
+ private selectList;
7
+ private onPreview;
8
+ constructor(currentTheme: string, onSelect: (themeName: string) => void, onCancel: () => void, onPreview: (themeName: string) => void);
9
+ getSelectList(): SelectList;
10
+ }
11
+ //# sourceMappingURL=theme-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/theme-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAgC,MAAM,wBAAwB,CAAC;AAS9G;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAA8B;IAE/C,YACC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EACrC,QAAQ,EAAE,MAAM,IAAI,EACpB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EAyCtC;IAED,aAAa,IAAI,UAAU,CAE1B;CACD","sourcesContent":["import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from \"@earendil-works/pi-tui\";\nimport { getAvailableThemes, getSelectListTheme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst THEME_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\n/**\n * Component that renders a theme selector\n */\nexport class ThemeSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\tprivate onPreview: (themeName: string) => void;\n\n\tconstructor(\n\t\tcurrentTheme: string,\n\t\tonSelect: (themeName: string) => void,\n\t\tonCancel: () => void,\n\t\tonPreview: (themeName: string) => void,\n\t) {\n\t\tsuper();\n\t\tthis.onPreview = onPreview;\n\n\t\t// Get available themes and create select items\n\t\tconst themes = getAvailableThemes();\n\t\tconst themeItems: SelectItem[] = themes.map((name) => ({\n\t\t\tvalue: name,\n\t\t\tlabel: name,\n\t\t\tdescription: name === currentTheme ? \"(current)\" : undefined,\n\t\t}));\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Create selector\n\t\tthis.selectList = new SelectList(themeItems, 10, getSelectListTheme(), THEME_SELECT_LIST_LAYOUT);\n\n\t\t// Preselect current theme\n\t\tconst currentIndex = themes.indexOf(currentTheme);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = () => {\n\t\t\tonCancel();\n\t\t};\n\n\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\tthis.onPreview(item.value);\n\t\t};\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSelectList(): SelectList {\n\t\treturn this.selectList;\n\t}\n}\n"]}