@akon-labs/nexus-cli 0.1.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 (1073) hide show
  1. package/CHANGELOG.md +5342 -0
  2. package/LICENSE +22 -0
  3. package/README.md +677 -0
  4. package/dist/bun/cli.d.ts +3 -0
  5. package/dist/bun/cli.d.ts.map +1 -0
  6. package/dist/bun/cli.js +11 -0
  7. package/dist/bun/cli.js.map +1 -0
  8. package/dist/bun/register-bedrock.d.ts +2 -0
  9. package/dist/bun/register-bedrock.d.ts.map +1 -0
  10. package/dist/bun/register-bedrock.js +4 -0
  11. package/dist/bun/register-bedrock.js.map +1 -0
  12. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  13. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  14. package/dist/bun/restore-sandbox-env.js +36 -0
  15. package/dist/bun/restore-sandbox-env.js.map +1 -0
  16. package/dist/cli/args.d.ts +59 -0
  17. package/dist/cli/args.d.ts.map +1 -0
  18. package/dist/cli/args.js +408 -0
  19. package/dist/cli/args.js.map +1 -0
  20. package/dist/cli/config-selector.d.ts +16 -0
  21. package/dist/cli/config-selector.d.ts.map +1 -0
  22. package/dist/cli/config-selector.js +31 -0
  23. package/dist/cli/config-selector.js.map +1 -0
  24. package/dist/cli/credential-print.d.ts +23 -0
  25. package/dist/cli/credential-print.d.ts.map +1 -0
  26. package/dist/cli/credential-print.js +118 -0
  27. package/dist/cli/credential-print.js.map +1 -0
  28. package/dist/cli/experimental/auth.d.ts +16 -0
  29. package/dist/cli/experimental/auth.d.ts.map +1 -0
  30. package/dist/cli/experimental/auth.js +13 -0
  31. package/dist/cli/experimental/auth.js.map +1 -0
  32. package/dist/cli/experimental/cli.d.ts +6 -0
  33. package/dist/cli/experimental/cli.d.ts.map +1 -0
  34. package/dist/cli/experimental/cli.js +5 -0
  35. package/dist/cli/experimental/cli.js.map +1 -0
  36. package/dist/cli/experimental/command-options.d.ts +17 -0
  37. package/dist/cli/experimental/command-options.d.ts.map +1 -0
  38. package/dist/cli/experimental/command-options.js +35 -0
  39. package/dist/cli/experimental/command-options.js.map +1 -0
  40. package/dist/cli/experimental/command.d.ts +63 -0
  41. package/dist/cli/experimental/command.d.ts.map +1 -0
  42. package/dist/cli/experimental/command.js +130 -0
  43. package/dist/cli/experimental/command.js.map +1 -0
  44. package/dist/cli/experimental/commands/client.d.ts +13 -0
  45. package/dist/cli/experimental/commands/client.d.ts.map +1 -0
  46. package/dist/cli/experimental/commands/client.js +25 -0
  47. package/dist/cli/experimental/commands/client.js.map +1 -0
  48. package/dist/cli/experimental/commands/pi.d.ts +15 -0
  49. package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
  50. package/dist/cli/experimental/commands/pi.js +28 -0
  51. package/dist/cli/experimental/commands/pi.js.map +1 -0
  52. package/dist/cli/experimental/commands/server.d.ts +13 -0
  53. package/dist/cli/experimental/commands/server.d.ts.map +1 -0
  54. package/dist/cli/experimental/commands/server.js +25 -0
  55. package/dist/cli/experimental/commands/server.js.map +1 -0
  56. package/dist/cli/experimental/transport-address.d.ts +10 -0
  57. package/dist/cli/experimental/transport-address.d.ts.map +1 -0
  58. package/dist/cli/experimental/transport-address.js +38 -0
  59. package/dist/cli/experimental/transport-address.js.map +1 -0
  60. package/dist/cli/file-processor.d.ts +15 -0
  61. package/dist/cli/file-processor.d.ts.map +1 -0
  62. package/dist/cli/file-processor.js +70 -0
  63. package/dist/cli/file-processor.js.map +1 -0
  64. package/dist/cli/initial-message.d.ts +18 -0
  65. package/dist/cli/initial-message.d.ts.map +1 -0
  66. package/dist/cli/initial-message.js +22 -0
  67. package/dist/cli/initial-message.js.map +1 -0
  68. package/dist/cli/list-models.d.ts +9 -0
  69. package/dist/cli/list-models.d.ts.map +1 -0
  70. package/dist/cli/list-models.js +98 -0
  71. package/dist/cli/list-models.js.map +1 -0
  72. package/dist/cli/project-trust.d.ts +10 -0
  73. package/dist/cli/project-trust.d.ts.map +1 -0
  74. package/dist/cli/project-trust.js +48 -0
  75. package/dist/cli/project-trust.js.map +1 -0
  76. package/dist/cli/require-login.d.ts +30 -0
  77. package/dist/cli/require-login.d.ts.map +1 -0
  78. package/dist/cli/require-login.js +96 -0
  79. package/dist/cli/require-login.js.map +1 -0
  80. package/dist/cli/session-picker.d.ts +10 -0
  81. package/dist/cli/session-picker.d.ts.map +1 -0
  82. package/dist/cli/session-picker.js +36 -0
  83. package/dist/cli/session-picker.js.map +1 -0
  84. package/dist/cli/startup-ui.d.ts +20 -0
  85. package/dist/cli/startup-ui.d.ts.map +1 -0
  86. package/dist/cli/startup-ui.js +185 -0
  87. package/dist/cli/startup-ui.js.map +1 -0
  88. package/dist/cli.d.ts +3 -0
  89. package/dist/cli.d.ts.map +1 -0
  90. package/dist/cli.js +69740 -0
  91. package/dist/cli.js.map +1 -0
  92. package/dist/client/index.d.ts +3 -0
  93. package/dist/client/index.d.ts.map +1 -0
  94. package/dist/client/index.js +425 -0
  95. package/dist/client/index.js.map +1 -0
  96. package/dist/client/remote-session.d.ts +53 -0
  97. package/dist/client/remote-session.d.ts.map +1 -0
  98. package/dist/client/remote-session.js +340 -0
  99. package/dist/client/remote-session.js.map +1 -0
  100. package/dist/client/transcript.d.ts +12 -0
  101. package/dist/client/transcript.d.ts.map +1 -0
  102. package/dist/client/transcript.js +98 -0
  103. package/dist/client/transcript.js.map +1 -0
  104. package/dist/config.d.ts +99 -0
  105. package/dist/config.d.ts.map +1 -0
  106. package/dist/config.js +482 -0
  107. package/dist/config.js.map +1 -0
  108. package/dist/core/agent-session-runtime.d.ts +119 -0
  109. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  110. package/dist/core/agent-session-runtime.js +309 -0
  111. package/dist/core/agent-session-runtime.js.map +1 -0
  112. package/dist/core/agent-session-services.d.ts +86 -0
  113. package/dist/core/agent-session-services.d.ts.map +1 -0
  114. package/dist/core/agent-session-services.js +134 -0
  115. package/dist/core/agent-session-services.js.map +1 -0
  116. package/dist/core/agent-session.d.ts +644 -0
  117. package/dist/core/agent-session.d.ts.map +1 -0
  118. package/dist/core/agent-session.js +2687 -0
  119. package/dist/core/agent-session.js.map +1 -0
  120. package/dist/core/auth-guidance.d.ts +5 -0
  121. package/dist/core/auth-guidance.d.ts.map +1 -0
  122. package/dist/core/auth-guidance.js +39 -0
  123. package/dist/core/auth-guidance.js.map +1 -0
  124. package/dist/core/auth-storage.d.ts +62 -0
  125. package/dist/core/auth-storage.d.ts.map +1 -0
  126. package/dist/core/auth-storage.js +350 -0
  127. package/dist/core/auth-storage.js.map +1 -0
  128. package/dist/core/bash-executor.d.ts +32 -0
  129. package/dist/core/bash-executor.d.ts.map +1 -0
  130. package/dist/core/bash-executor.js +111 -0
  131. package/dist/core/bash-executor.js.map +1 -0
  132. package/dist/core/cache-stats.d.ts +49 -0
  133. package/dist/core/cache-stats.d.ts.map +1 -0
  134. package/dist/core/cache-stats.js +101 -0
  135. package/dist/core/cache-stats.js.map +1 -0
  136. package/dist/core/compaction/branch-summarization.d.ts +98 -0
  137. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  138. package/dist/core/compaction/branch-summarization.js +246 -0
  139. package/dist/core/compaction/branch-summarization.js.map +1 -0
  140. package/dist/core/compaction/compaction.d.ts +137 -0
  141. package/dist/core/compaction/compaction.d.ts.map +1 -0
  142. package/dist/core/compaction/compaction.js +645 -0
  143. package/dist/core/compaction/compaction.js.map +1 -0
  144. package/dist/core/compaction/index.d.ts +7 -0
  145. package/dist/core/compaction/index.d.ts.map +1 -0
  146. package/dist/core/compaction/index.js +7 -0
  147. package/dist/core/compaction/index.js.map +1 -0
  148. package/dist/core/compaction/utils.d.ts +38 -0
  149. package/dist/core/compaction/utils.d.ts.map +1 -0
  150. package/dist/core/compaction/utils.js +142 -0
  151. package/dist/core/compaction/utils.js.map +1 -0
  152. package/dist/core/defaults.d.ts +3 -0
  153. package/dist/core/defaults.d.ts.map +1 -0
  154. package/dist/core/defaults.js +2 -0
  155. package/dist/core/defaults.js.map +1 -0
  156. package/dist/core/diagnostics.d.ts +15 -0
  157. package/dist/core/diagnostics.d.ts.map +1 -0
  158. package/dist/core/diagnostics.js +2 -0
  159. package/dist/core/diagnostics.js.map +1 -0
  160. package/dist/core/event-bus.d.ts +9 -0
  161. package/dist/core/event-bus.d.ts.map +1 -0
  162. package/dist/core/event-bus.js +25 -0
  163. package/dist/core/event-bus.js.map +1 -0
  164. package/dist/core/exec.d.ts +29 -0
  165. package/dist/core/exec.d.ts.map +1 -0
  166. package/dist/core/exec.js +75 -0
  167. package/dist/core/exec.js.map +1 -0
  168. package/dist/core/experimental.d.ts +2 -0
  169. package/dist/core/experimental.d.ts.map +1 -0
  170. package/dist/core/experimental.js +5 -0
  171. package/dist/core/experimental.js.map +1 -0
  172. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  173. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  174. package/dist/core/export-html/ansi-to-html.js +249 -0
  175. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  176. package/dist/core/export-html/index.d.ts +37 -0
  177. package/dist/core/export-html/index.d.ts.map +1 -0
  178. package/dist/core/export-html/index.js +226 -0
  179. package/dist/core/export-html/index.js.map +1 -0
  180. package/dist/core/export-html/template.css +1066 -0
  181. package/dist/core/export-html/template.html +55 -0
  182. package/dist/core/export-html/template.js +1864 -0
  183. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  184. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  185. package/dist/core/export-html/tool-renderer.js +108 -0
  186. package/dist/core/export-html/tool-renderer.js.map +1 -0
  187. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  188. package/dist/core/export-html/vendor/marked.min.js +78 -0
  189. package/dist/core/extensions/index.d.ts +12 -0
  190. package/dist/core/extensions/index.d.ts.map +1 -0
  191. package/dist/core/extensions/index.js +9 -0
  192. package/dist/core/extensions/index.js.map +1 -0
  193. package/dist/core/extensions/loader.d.ts +23 -0
  194. package/dist/core/extensions/loader.d.ts.map +1 -0
  195. package/dist/core/extensions/loader.js +581 -0
  196. package/dist/core/extensions/loader.js.map +1 -0
  197. package/dist/core/extensions/runner.d.ts +173 -0
  198. package/dist/core/extensions/runner.d.ts.map +1 -0
  199. package/dist/core/extensions/runner.js +967 -0
  200. package/dist/core/extensions/runner.js.map +1 -0
  201. package/dist/core/extensions/types.d.ts +1288 -0
  202. package/dist/core/extensions/types.d.ts.map +1 -0
  203. package/dist/core/extensions/types.js +45 -0
  204. package/dist/core/extensions/types.js.map +1 -0
  205. package/dist/core/extensions/wrapper.d.ts +20 -0
  206. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  207. package/dist/core/extensions/wrapper.js +41 -0
  208. package/dist/core/extensions/wrapper.js.map +1 -0
  209. package/dist/core/footer-data-provider.d.ts +64 -0
  210. package/dist/core/footer-data-provider.d.ts.map +1 -0
  211. package/dist/core/footer-data-provider.js +338 -0
  212. package/dist/core/footer-data-provider.js.map +1 -0
  213. package/dist/core/graph-rail-store.d.ts +94 -0
  214. package/dist/core/graph-rail-store.d.ts.map +1 -0
  215. package/dist/core/graph-rail-store.js +86 -0
  216. package/dist/core/graph-rail-store.js.map +1 -0
  217. package/dist/core/http-dispatcher.d.ts +22 -0
  218. package/dist/core/http-dispatcher.d.ts.map +1 -0
  219. package/dist/core/http-dispatcher.js +96 -0
  220. package/dist/core/http-dispatcher.js.map +1 -0
  221. package/dist/core/index.d.ts +13 -0
  222. package/dist/core/index.d.ts.map +1 -0
  223. package/dist/core/index.js +13 -0
  224. package/dist/core/index.js.map +1 -0
  225. package/dist/core/keybindings.d.ts +395 -0
  226. package/dist/core/keybindings.d.ts.map +1 -0
  227. package/dist/core/keybindings.js +297 -0
  228. package/dist/core/keybindings.js.map +1 -0
  229. package/dist/core/messages.d.ts +77 -0
  230. package/dist/core/messages.d.ts.map +1 -0
  231. package/dist/core/messages.js +123 -0
  232. package/dist/core/messages.js.map +1 -0
  233. package/dist/core/model-config.d.ts +566 -0
  234. package/dist/core/model-config.d.ts.map +1 -0
  235. package/dist/core/model-config.js +253 -0
  236. package/dist/core/model-config.js.map +1 -0
  237. package/dist/core/model-registry.d.ts +45 -0
  238. package/dist/core/model-registry.d.ts.map +1 -0
  239. package/dist/core/model-registry.js +107 -0
  240. package/dist/core/model-registry.js.map +1 -0
  241. package/dist/core/model-resolver.d.ts +127 -0
  242. package/dist/core/model-resolver.d.ts.map +1 -0
  243. package/dist/core/model-resolver.js +541 -0
  244. package/dist/core/model-resolver.js.map +1 -0
  245. package/dist/core/model-runtime.d.ts +97 -0
  246. package/dist/core/model-runtime.d.ts.map +1 -0
  247. package/dist/core/model-runtime.js +594 -0
  248. package/dist/core/model-runtime.js.map +1 -0
  249. package/dist/core/models-dev-catalog.d.ts +63 -0
  250. package/dist/core/models-dev-catalog.d.ts.map +1 -0
  251. package/dist/core/models-dev-catalog.js +105 -0
  252. package/dist/core/models-dev-catalog.js.map +1 -0
  253. package/dist/core/models-store.d.ts +22 -0
  254. package/dist/core/models-store.d.ts.map +1 -0
  255. package/dist/core/models-store.js +114 -0
  256. package/dist/core/models-store.js.map +1 -0
  257. package/dist/core/observatory-cache.d.ts +16 -0
  258. package/dist/core/observatory-cache.d.ts.map +1 -0
  259. package/dist/core/observatory-cache.js +55 -0
  260. package/dist/core/observatory-cache.js.map +1 -0
  261. package/dist/core/output-guard.d.ts +7 -0
  262. package/dist/core/output-guard.d.ts.map +1 -0
  263. package/dist/core/output-guard.js +89 -0
  264. package/dist/core/output-guard.js.map +1 -0
  265. package/dist/core/package-manager.d.ts +213 -0
  266. package/dist/core/package-manager.d.ts.map +1 -0
  267. package/dist/core/package-manager.js +2169 -0
  268. package/dist/core/package-manager.js.map +1 -0
  269. package/dist/core/pi-manifest.d.ts +8 -0
  270. package/dist/core/pi-manifest.d.ts.map +1 -0
  271. package/dist/core/pi-manifest.js +25 -0
  272. package/dist/core/pi-manifest.js.map +1 -0
  273. package/dist/core/project-trust.d.ts +15 -0
  274. package/dist/core/project-trust.d.ts.map +1 -0
  275. package/dist/core/project-trust.js +59 -0
  276. package/dist/core/project-trust.js.map +1 -0
  277. package/dist/core/prompt-templates.d.ts +54 -0
  278. package/dist/core/prompt-templates.d.ts.map +1 -0
  279. package/dist/core/prompt-templates.js +236 -0
  280. package/dist/core/prompt-templates.js.map +1 -0
  281. package/dist/core/provider-attribution.d.ts +4 -0
  282. package/dist/core/provider-attribution.d.ts.map +1 -0
  283. package/dist/core/provider-attribution.js +73 -0
  284. package/dist/core/provider-attribution.js.map +1 -0
  285. package/dist/core/provider-composer.d.ts +56 -0
  286. package/dist/core/provider-composer.d.ts.map +1 -0
  287. package/dist/core/provider-composer.js +395 -0
  288. package/dist/core/provider-composer.js.map +1 -0
  289. package/dist/core/radius.d.ts +2 -0
  290. package/dist/core/radius.d.ts.map +1 -0
  291. package/dist/core/radius.js +2 -0
  292. package/dist/core/radius.js.map +1 -0
  293. package/dist/core/remote-catalog-provider.d.ts +5 -0
  294. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  295. package/dist/core/remote-catalog-provider.js +106 -0
  296. package/dist/core/remote-catalog-provider.js.map +1 -0
  297. package/dist/core/resolve-config-value.d.ts +30 -0
  298. package/dist/core/resolve-config-value.d.ts.map +1 -0
  299. package/dist/core/resolve-config-value.js +247 -0
  300. package/dist/core/resolve-config-value.js.map +1 -0
  301. package/dist/core/resource-loader.d.ts +221 -0
  302. package/dist/core/resource-loader.d.ts.map +1 -0
  303. package/dist/core/resource-loader.js +874 -0
  304. package/dist/core/resource-loader.js.map +1 -0
  305. package/dist/core/runtime-credentials.d.ts +15 -0
  306. package/dist/core/runtime-credentials.d.ts.map +1 -0
  307. package/dist/core/runtime-credentials.js +39 -0
  308. package/dist/core/runtime-credentials.js.map +1 -0
  309. package/dist/core/sdk.d.ts +106 -0
  310. package/dist/core/sdk.d.ts.map +1 -0
  311. package/dist/core/sdk.js +267 -0
  312. package/dist/core/sdk.js.map +1 -0
  313. package/dist/core/session-cwd.d.ts +19 -0
  314. package/dist/core/session-cwd.d.ts.map +1 -0
  315. package/dist/core/session-cwd.js +38 -0
  316. package/dist/core/session-cwd.js.map +1 -0
  317. package/dist/core/session-manager.d.ts +356 -0
  318. package/dist/core/session-manager.d.ts.map +1 -0
  319. package/dist/core/session-manager.js +1340 -0
  320. package/dist/core/session-manager.js.map +1 -0
  321. package/dist/core/settings-manager.d.ts +304 -0
  322. package/dist/core/settings-manager.d.ts.map +1 -0
  323. package/dist/core/settings-manager.js +912 -0
  324. package/dist/core/settings-manager.js.map +1 -0
  325. package/dist/core/skills.d.ts +60 -0
  326. package/dist/core/skills.d.ts.map +1 -0
  327. package/dist/core/skills.js +387 -0
  328. package/dist/core/skills.js.map +1 -0
  329. package/dist/core/slash-commands.d.ts +21 -0
  330. package/dist/core/slash-commands.d.ts.map +1 -0
  331. package/dist/core/slash-commands.js +39 -0
  332. package/dist/core/slash-commands.js.map +1 -0
  333. package/dist/core/source-info.d.ts +18 -0
  334. package/dist/core/source-info.d.ts.map +1 -0
  335. package/dist/core/source-info.js +19 -0
  336. package/dist/core/source-info.js.map +1 -0
  337. package/dist/core/system-prompt.d.ts +28 -0
  338. package/dist/core/system-prompt.d.ts.map +1 -0
  339. package/dist/core/system-prompt.js +130 -0
  340. package/dist/core/system-prompt.js.map +1 -0
  341. package/dist/core/telemetry.d.ts +3 -0
  342. package/dist/core/telemetry.d.ts.map +1 -0
  343. package/dist/core/telemetry.js +10 -0
  344. package/dist/core/telemetry.js.map +1 -0
  345. package/dist/core/timings.d.ts +6 -0
  346. package/dist/core/timings.d.ts.map +1 -0
  347. package/dist/core/timings.js +42 -0
  348. package/dist/core/timings.js.map +1 -0
  349. package/dist/core/tools/bash.d.ts +70 -0
  350. package/dist/core/tools/bash.d.ts.map +1 -0
  351. package/dist/core/tools/bash.js +389 -0
  352. package/dist/core/tools/bash.js.map +1 -0
  353. package/dist/core/tools/edit-diff.d.ts +106 -0
  354. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  355. package/dist/core/tools/edit-diff.js +424 -0
  356. package/dist/core/tools/edit-diff.js.map +1 -0
  357. package/dist/core/tools/edit.d.ts +51 -0
  358. package/dist/core/tools/edit.d.ts.map +1 -0
  359. package/dist/core/tools/edit.js +284 -0
  360. package/dist/core/tools/edit.js.map +1 -0
  361. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  362. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  363. package/dist/core/tools/file-mutation-queue.js +52 -0
  364. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  365. package/dist/core/tools/find.d.ts +38 -0
  366. package/dist/core/tools/find.d.ts.map +1 -0
  367. package/dist/core/tools/find.js +298 -0
  368. package/dist/core/tools/find.js.map +1 -0
  369. package/dist/core/tools/grep.d.ts +37 -0
  370. package/dist/core/tools/grep.d.ts.map +1 -0
  371. package/dist/core/tools/grep.js +304 -0
  372. package/dist/core/tools/grep.js.map +1 -0
  373. package/dist/core/tools/index.d.ts +43 -0
  374. package/dist/core/tools/index.d.ts.map +1 -0
  375. package/dist/core/tools/index.js +129 -0
  376. package/dist/core/tools/index.js.map +1 -0
  377. package/dist/core/tools/ls.d.ts +37 -0
  378. package/dist/core/tools/ls.d.ts.map +1 -0
  379. package/dist/core/tools/ls.js +167 -0
  380. package/dist/core/tools/ls.js.map +1 -0
  381. package/dist/core/tools/output-accumulator.d.ts +52 -0
  382. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  383. package/dist/core/tools/output-accumulator.js +185 -0
  384. package/dist/core/tools/output-accumulator.js.map +1 -0
  385. package/dist/core/tools/path-utils.d.ts +10 -0
  386. package/dist/core/tools/path-utils.d.ts.map +1 -0
  387. package/dist/core/tools/path-utils.js +99 -0
  388. package/dist/core/tools/path-utils.js.map +1 -0
  389. package/dist/core/tools/read.d.ts +35 -0
  390. package/dist/core/tools/read.d.ts.map +1 -0
  391. package/dist/core/tools/read.js +284 -0
  392. package/dist/core/tools/read.js.map +1 -0
  393. package/dist/core/tools/render-utils.d.ts +24 -0
  394. package/dist/core/tools/render-utils.d.ts.map +1 -0
  395. package/dist/core/tools/render-utils.js +65 -0
  396. package/dist/core/tools/render-utils.js.map +1 -0
  397. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  398. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  399. package/dist/core/tools/tool-definition-wrapper.js +36 -0
  400. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  401. package/dist/core/tools/truncate.d.ts +70 -0
  402. package/dist/core/tools/truncate.d.ts.map +1 -0
  403. package/dist/core/tools/truncate.js +215 -0
  404. package/dist/core/tools/truncate.js.map +1 -0
  405. package/dist/core/tools/websearch.d.ts +29 -0
  406. package/dist/core/tools/websearch.d.ts.map +1 -0
  407. package/dist/core/tools/websearch.js +145 -0
  408. package/dist/core/tools/websearch.js.map +1 -0
  409. package/dist/core/tools/write.d.ts +26 -0
  410. package/dist/core/tools/write.d.ts.map +1 -0
  411. package/dist/core/tools/write.js +197 -0
  412. package/dist/core/tools/write.js.map +1 -0
  413. package/dist/core/trust-manager.d.ts +36 -0
  414. package/dist/core/trust-manager.d.ts.map +1 -0
  415. package/dist/core/trust-manager.js +202 -0
  416. package/dist/core/trust-manager.js.map +1 -0
  417. package/dist/core/usage-totals.d.ts +19 -0
  418. package/dist/core/usage-totals.d.ts.map +1 -0
  419. package/dist/core/usage-totals.js +52 -0
  420. package/dist/core/usage-totals.js.map +1 -0
  421. package/dist/extensions/gitnexus/augment.d.ts +4 -0
  422. package/dist/extensions/gitnexus/augment.d.ts.map +1 -0
  423. package/dist/extensions/gitnexus/augment.js +60 -0
  424. package/dist/extensions/gitnexus/augment.js.map +1 -0
  425. package/dist/extensions/gitnexus/changes.d.ts +3 -0
  426. package/dist/extensions/gitnexus/changes.d.ts.map +1 -0
  427. package/dist/extensions/gitnexus/changes.js +58 -0
  428. package/dist/extensions/gitnexus/changes.js.map +1 -0
  429. package/dist/extensions/gitnexus/client.d.ts +39 -0
  430. package/dist/extensions/gitnexus/client.d.ts.map +1 -0
  431. package/dist/extensions/gitnexus/client.js +173 -0
  432. package/dist/extensions/gitnexus/client.js.map +1 -0
  433. package/dist/extensions/gitnexus/config.d.ts +25 -0
  434. package/dist/extensions/gitnexus/config.d.ts.map +1 -0
  435. package/dist/extensions/gitnexus/config.js +42 -0
  436. package/dist/extensions/gitnexus/config.js.map +1 -0
  437. package/dist/extensions/gitnexus/device-auth.d.ts +60 -0
  438. package/dist/extensions/gitnexus/device-auth.d.ts.map +1 -0
  439. package/dist/extensions/gitnexus/device-auth.js +130 -0
  440. package/dist/extensions/gitnexus/device-auth.js.map +1 -0
  441. package/dist/extensions/gitnexus/gateway.d.ts +57 -0
  442. package/dist/extensions/gitnexus/gateway.d.ts.map +1 -0
  443. package/dist/extensions/gitnexus/gateway.js +139 -0
  444. package/dist/extensions/gitnexus/gateway.js.map +1 -0
  445. package/dist/extensions/gitnexus/index.d.ts +14 -0
  446. package/dist/extensions/gitnexus/index.d.ts.map +1 -0
  447. package/dist/extensions/gitnexus/index.js +189 -0
  448. package/dist/extensions/gitnexus/index.js.map +1 -0
  449. package/dist/extensions/gitnexus/observatory.d.ts +13 -0
  450. package/dist/extensions/gitnexus/observatory.d.ts.map +1 -0
  451. package/dist/extensions/gitnexus/observatory.js +189 -0
  452. package/dist/extensions/gitnexus/observatory.js.map +1 -0
  453. package/dist/extensions/gitnexus/prompt.d.ts +11 -0
  454. package/dist/extensions/gitnexus/prompt.d.ts.map +1 -0
  455. package/dist/extensions/gitnexus/prompt.js +50 -0
  456. package/dist/extensions/gitnexus/prompt.js.map +1 -0
  457. package/dist/extensions/gitnexus/render.d.ts +61 -0
  458. package/dist/extensions/gitnexus/render.d.ts.map +1 -0
  459. package/dist/extensions/gitnexus/render.js +391 -0
  460. package/dist/extensions/gitnexus/render.js.map +1 -0
  461. package/dist/extensions/gitnexus/resolve.d.ts +22 -0
  462. package/dist/extensions/gitnexus/resolve.d.ts.map +1 -0
  463. package/dist/extensions/gitnexus/resolve.js +54 -0
  464. package/dist/extensions/gitnexus/resolve.js.map +1 -0
  465. package/dist/extensions/gitnexus/skills/gitnexus-debugging/SKILL.md +89 -0
  466. package/dist/extensions/gitnexus/skills/gitnexus-debugging/mcp.json +8 -0
  467. package/dist/extensions/gitnexus/skills/gitnexus-exploring/SKILL.md +78 -0
  468. package/dist/extensions/gitnexus/skills/gitnexus-exploring/mcp.json +8 -0
  469. package/dist/extensions/gitnexus/skills/gitnexus-guide/SKILL.md +64 -0
  470. package/dist/extensions/gitnexus/skills/gitnexus-guide/mcp.json +8 -0
  471. package/dist/extensions/gitnexus/skills/gitnexus-impact-analysis/SKILL.md +97 -0
  472. package/dist/extensions/gitnexus/skills/gitnexus-impact-analysis/mcp.json +8 -0
  473. package/dist/extensions/gitnexus/skills/gitnexus-pr-review/SKILL.md +163 -0
  474. package/dist/extensions/gitnexus/skills/gitnexus-refactoring/SKILL.md +121 -0
  475. package/dist/extensions/gitnexus/skills/gitnexus-refactoring/mcp.json +8 -0
  476. package/dist/extensions/gitnexus/tools.d.ts +15 -0
  477. package/dist/extensions/gitnexus/tools.d.ts.map +1 -0
  478. package/dist/extensions/gitnexus/tools.js +187 -0
  479. package/dist/extensions/gitnexus/tools.js.map +1 -0
  480. package/dist/extensions/index.d.ts +3 -0
  481. package/dist/extensions/index.d.ts.map +1 -0
  482. package/dist/extensions/index.js +10 -0
  483. package/dist/extensions/index.js.map +1 -0
  484. package/dist/extensions/llama/client.d.ts +61 -0
  485. package/dist/extensions/llama/client.d.ts.map +1 -0
  486. package/dist/extensions/llama/client.js +302 -0
  487. package/dist/extensions/llama/client.js.map +1 -0
  488. package/dist/extensions/llama/huggingface.d.ts +23 -0
  489. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  490. package/dist/extensions/llama/huggingface.js +141 -0
  491. package/dist/extensions/llama/huggingface.js.map +1 -0
  492. package/dist/extensions/llama/index.d.ts +3 -0
  493. package/dist/extensions/llama/index.d.ts.map +1 -0
  494. package/dist/extensions/llama/index.js +217 -0
  495. package/dist/extensions/llama/index.js.map +1 -0
  496. package/dist/extensions/llama/provider.d.ts +10 -0
  497. package/dist/extensions/llama/provider.d.ts.map +1 -0
  498. package/dist/extensions/llama/provider.js +121 -0
  499. package/dist/extensions/llama/provider.js.map +1 -0
  500. package/dist/extensions/llama/ui.d.ts +42 -0
  501. package/dist/extensions/llama/ui.d.ts.map +1 -0
  502. package/dist/extensions/llama/ui.js +416 -0
  503. package/dist/extensions/llama/ui.js.map +1 -0
  504. package/dist/extensions/mcp/client.d.ts +86 -0
  505. package/dist/extensions/mcp/client.d.ts.map +1 -0
  506. package/dist/extensions/mcp/client.js +275 -0
  507. package/dist/extensions/mcp/client.js.map +1 -0
  508. package/dist/extensions/mcp/config.d.ts +41 -0
  509. package/dist/extensions/mcp/config.d.ts.map +1 -0
  510. package/dist/extensions/mcp/config.js +85 -0
  511. package/dist/extensions/mcp/config.js.map +1 -0
  512. package/dist/extensions/mcp/index.d.ts +18 -0
  513. package/dist/extensions/mcp/index.d.ts.map +1 -0
  514. package/dist/extensions/mcp/index.js +95 -0
  515. package/dist/extensions/mcp/index.js.map +1 -0
  516. package/dist/index.d.ts +35 -0
  517. package/dist/index.d.ts.map +1 -0
  518. package/dist/index.js +69874 -0
  519. package/dist/index.js.map +1 -0
  520. package/dist/main.d.ts +12 -0
  521. package/dist/main.d.ts.map +1 -0
  522. package/dist/main.js +792 -0
  523. package/dist/main.js.map +1 -0
  524. package/dist/migrations.d.ts +33 -0
  525. package/dist/migrations.d.ts.map +1 -0
  526. package/dist/migrations.js +281 -0
  527. package/dist/migrations.js.map +1 -0
  528. package/dist/modes/index.d.ts +10 -0
  529. package/dist/modes/index.d.ts.map +1 -0
  530. package/dist/modes/index.js +8 -0
  531. package/dist/modes/index.js.map +1 -0
  532. package/dist/modes/interactive/components/assistant-message.d.ts +32 -0
  533. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  534. package/dist/modes/interactive/components/assistant-message.js +177 -0
  535. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  536. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  537. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  538. package/dist/modes/interactive/components/bash-execution.js +175 -0
  539. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  540. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  541. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  542. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  543. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  544. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  545. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  546. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  547. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  548. package/dist/modes/interactive/components/command-palette.d.ts +12 -0
  549. package/dist/modes/interactive/components/command-palette.d.ts.map +1 -0
  550. package/dist/modes/interactive/components/command-palette.js +67 -0
  551. package/dist/modes/interactive/components/command-palette.js.map +1 -0
  552. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  553. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  554. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  555. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  556. package/dist/modes/interactive/components/config-selector.d.ts +102 -0
  557. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  558. package/dist/modes/interactive/components/config-selector.js +761 -0
  559. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  560. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  561. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  562. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  563. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  564. package/dist/modes/interactive/components/custom-editor.d.ts +23 -0
  565. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  566. package/dist/modes/interactive/components/custom-editor.js +85 -0
  567. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  568. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  569. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  570. package/dist/modes/interactive/components/custom-entry.js +52 -0
  571. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  572. package/dist/modes/interactive/components/custom-message.d.ts +22 -0
  573. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  574. package/dist/modes/interactive/components/custom-message.js +87 -0
  575. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  576. package/dist/modes/interactive/components/dialog-frame.d.ts +37 -0
  577. package/dist/modes/interactive/components/dialog-frame.d.ts.map +1 -0
  578. package/dist/modes/interactive/components/dialog-frame.js +53 -0
  579. package/dist/modes/interactive/components/dialog-frame.js.map +1 -0
  580. package/dist/modes/interactive/components/diff.d.ts +12 -0
  581. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  582. package/dist/modes/interactive/components/diff.js +133 -0
  583. package/dist/modes/interactive/components/diff.js.map +1 -0
  584. package/dist/modes/interactive/components/dynamic-border.d.ts +19 -0
  585. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  586. package/dist/modes/interactive/components/dynamic-border.js +36 -0
  587. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  588. package/dist/modes/interactive/components/extension-editor.d.ts +21 -0
  589. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  590. package/dist/modes/interactive/components/extension-editor.js +98 -0
  591. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  592. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  593. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  594. package/dist/modes/interactive/components/extension-input.js +61 -0
  595. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  596. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  597. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  598. package/dist/modes/interactive/components/extension-selector.js +83 -0
  599. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  600. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  601. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  602. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  603. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  604. package/dist/modes/interactive/components/footer.d.ts +30 -0
  605. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  606. package/dist/modes/interactive/components/footer.js +108 -0
  607. package/dist/modes/interactive/components/footer.js.map +1 -0
  608. package/dist/modes/interactive/components/graph-rail.d.ts +44 -0
  609. package/dist/modes/interactive/components/graph-rail.d.ts.map +1 -0
  610. package/dist/modes/interactive/components/graph-rail.js +332 -0
  611. package/dist/modes/interactive/components/graph-rail.js.map +1 -0
  612. package/dist/modes/interactive/components/index.d.ts +33 -0
  613. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  614. package/dist/modes/interactive/components/index.js +34 -0
  615. package/dist/modes/interactive/components/index.js.map +1 -0
  616. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  617. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  618. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  619. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  620. package/dist/modes/interactive/components/landing-panel.d.ts +14 -0
  621. package/dist/modes/interactive/components/landing-panel.d.ts.map +1 -0
  622. package/dist/modes/interactive/components/landing-panel.js +141 -0
  623. package/dist/modes/interactive/components/landing-panel.js.map +1 -0
  624. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  625. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  626. package/dist/modes/interactive/components/login-dialog.js +188 -0
  627. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  628. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  629. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  630. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  631. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  632. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  633. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  634. package/dist/modes/interactive/components/mermaid.js +80 -0
  635. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  636. package/dist/modes/interactive/components/message-layout.d.ts +4 -0
  637. package/dist/modes/interactive/components/message-layout.d.ts.map +1 -0
  638. package/dist/modes/interactive/components/message-layout.js +4 -0
  639. package/dist/modes/interactive/components/message-layout.js.map +1 -0
  640. package/dist/modes/interactive/components/model-selector.d.ts +54 -0
  641. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  642. package/dist/modes/interactive/components/model-selector.js +325 -0
  643. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  644. package/dist/modes/interactive/components/nexus-logo.d.ts +25 -0
  645. package/dist/modes/interactive/components/nexus-logo.d.ts.map +1 -0
  646. package/dist/modes/interactive/components/nexus-logo.js +115 -0
  647. package/dist/modes/interactive/components/nexus-logo.js.map +1 -0
  648. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  649. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  650. package/dist/modes/interactive/components/oauth-selector.js +163 -0
  651. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  652. package/dist/modes/interactive/components/panel.d.ts +7 -0
  653. package/dist/modes/interactive/components/panel.d.ts.map +1 -0
  654. package/dist/modes/interactive/components/panel.js +18 -0
  655. package/dist/modes/interactive/components/panel.js.map +1 -0
  656. package/dist/modes/interactive/components/response-separator.d.ts +13 -0
  657. package/dist/modes/interactive/components/response-separator.d.ts.map +1 -0
  658. package/dist/modes/interactive/components/response-separator.js +23 -0
  659. package/dist/modes/interactive/components/response-separator.js.map +1 -0
  660. package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
  661. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  662. package/dist/modes/interactive/components/scoped-models-selector.js +328 -0
  663. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  664. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  665. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  666. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  667. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  668. package/dist/modes/interactive/components/session-selector.d.ts +99 -0
  669. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  670. package/dist/modes/interactive/components/session-selector.js +887 -0
  671. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  672. package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
  673. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  674. package/dist/modes/interactive/components/settings-selector.js +613 -0
  675. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  676. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  677. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  678. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  679. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  680. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  681. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  682. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  683. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  684. package/dist/modes/interactive/components/status-indicator.d.ts +37 -0
  685. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  686. package/dist/modes/interactive/components/status-indicator.js +116 -0
  687. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  688. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  689. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  690. package/dist/modes/interactive/components/theme-selector.js +50 -0
  691. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  692. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  693. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  694. package/dist/modes/interactive/components/thinking-selector.js +52 -0
  695. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  696. package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
  697. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  698. package/dist/modes/interactive/components/tool-execution.js +384 -0
  699. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  700. package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  701. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  702. package/dist/modes/interactive/components/tree-selector.js +1245 -0
  703. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  704. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  705. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  706. package/dist/modes/interactive/components/trust-selector.js +91 -0
  707. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  708. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  709. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  710. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  711. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  712. package/dist/modes/interactive/components/user-message.d.ts +17 -0
  713. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  714. package/dist/modes/interactive/components/user-message.js +51 -0
  715. package/dist/modes/interactive/components/user-message.js.map +1 -0
  716. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  717. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  718. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  719. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  720. package/dist/modes/interactive/external-editor.d.ts +12 -0
  721. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  722. package/dist/modes/interactive/external-editor.js +37 -0
  723. package/dist/modes/interactive/external-editor.js.map +1 -0
  724. package/dist/modes/interactive/interactive-mode.d.ts +436 -0
  725. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  726. package/dist/modes/interactive/interactive-mode.js +5462 -0
  727. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  728. package/dist/modes/interactive/model-search.d.ts +12 -0
  729. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  730. package/dist/modes/interactive/model-search.js +15 -0
  731. package/dist/modes/interactive/model-search.js.map +1 -0
  732. package/dist/modes/interactive/theme/brand.d.ts +38 -0
  733. package/dist/modes/interactive/theme/brand.d.ts.map +1 -0
  734. package/dist/modes/interactive/theme/brand.js +108 -0
  735. package/dist/modes/interactive/theme/brand.js.map +1 -0
  736. package/dist/modes/interactive/theme/catppuccin-mocha.json +66 -0
  737. package/dist/modes/interactive/theme/dark.json +93 -0
  738. package/dist/modes/interactive/theme/dracula.json +66 -0
  739. package/dist/modes/interactive/theme/ember.json +85 -0
  740. package/dist/modes/interactive/theme/gruvbox.json +66 -0
  741. package/dist/modes/interactive/theme/light.json +91 -0
  742. package/dist/modes/interactive/theme/nord.json +66 -0
  743. package/dist/modes/interactive/theme/theme-controller.d.ts +32 -0
  744. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  745. package/dist/modes/interactive/theme/theme-controller.js +111 -0
  746. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  747. package/dist/modes/interactive/theme/theme-schema.json +344 -0
  748. package/dist/modes/interactive/theme/theme.d.ts +129 -0
  749. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  750. package/dist/modes/interactive/theme/theme.js +1101 -0
  751. package/dist/modes/interactive/theme/theme.js.map +1 -0
  752. package/dist/modes/interactive/theme/tokyonight.json +66 -0
  753. package/dist/modes/json-event.d.ts +28 -0
  754. package/dist/modes/json-event.d.ts.map +1 -0
  755. package/dist/modes/json-event.js +12 -0
  756. package/dist/modes/json-event.js.map +1 -0
  757. package/dist/modes/print-mode.d.ts +28 -0
  758. package/dist/modes/print-mode.d.ts.map +1 -0
  759. package/dist/modes/print-mode.js +153 -0
  760. package/dist/modes/print-mode.js.map +1 -0
  761. package/dist/modes/rpc/jsonl.d.ts +17 -0
  762. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  763. package/dist/modes/rpc/jsonl.js +49 -0
  764. package/dist/modes/rpc/jsonl.js.map +1 -0
  765. package/dist/modes/rpc/rpc-client.d.ts +247 -0
  766. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  767. package/dist/modes/rpc/rpc-client.js +488 -0
  768. package/dist/modes/rpc/rpc-client.js.map +1 -0
  769. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  770. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  771. package/dist/modes/rpc/rpc-mode.js +654 -0
  772. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  773. package/dist/modes/rpc/rpc-types.d.ts +457 -0
  774. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  775. package/dist/modes/rpc/rpc-types.js +8 -0
  776. package/dist/modes/rpc/rpc-types.js.map +1 -0
  777. package/dist/package-manager-cli.d.ts +8 -0
  778. package/dist/package-manager-cli.d.ts.map +1 -0
  779. package/dist/package-manager-cli.js +777 -0
  780. package/dist/package-manager-cli.js.map +1 -0
  781. package/dist/rpc-entry.d.ts +3 -0
  782. package/dist/rpc-entry.d.ts.map +1 -0
  783. package/dist/rpc-entry.js +69740 -0
  784. package/dist/rpc-entry.js.map +1 -0
  785. package/dist/utils/abort.d.ts +5 -0
  786. package/dist/utils/abort.d.ts.map +1 -0
  787. package/dist/utils/abort.js +48 -0
  788. package/dist/utils/abort.js.map +1 -0
  789. package/dist/utils/ansi.d.ts +2 -0
  790. package/dist/utils/ansi.d.ts.map +1 -0
  791. package/dist/utils/ansi.js +52 -0
  792. package/dist/utils/ansi.js.map +1 -0
  793. package/dist/utils/child-process.d.ts +18 -0
  794. package/dist/utils/child-process.d.ts.map +1 -0
  795. package/dist/utils/child-process.js +106 -0
  796. package/dist/utils/child-process.js.map +1 -0
  797. package/dist/utils/clipboard-image.d.ts +11 -0
  798. package/dist/utils/clipboard-image.d.ts.map +1 -0
  799. package/dist/utils/clipboard-image.js +245 -0
  800. package/dist/utils/clipboard-image.js.map +1 -0
  801. package/dist/utils/clipboard-native.d.ts +11 -0
  802. package/dist/utils/clipboard-native.d.ts.map +1 -0
  803. package/dist/utils/clipboard-native.js +20 -0
  804. package/dist/utils/clipboard-native.js.map +1 -0
  805. package/dist/utils/clipboard.d.ts +4 -0
  806. package/dist/utils/clipboard.d.ts.map +1 -0
  807. package/dist/utils/clipboard.js +161 -0
  808. package/dist/utils/clipboard.js.map +1 -0
  809. package/dist/utils/deprecation.d.ts +4 -0
  810. package/dist/utils/deprecation.d.ts.map +1 -0
  811. package/dist/utils/deprecation.js +13 -0
  812. package/dist/utils/deprecation.js.map +1 -0
  813. package/dist/utils/exif-orientation.d.ts +5 -0
  814. package/dist/utils/exif-orientation.d.ts.map +1 -0
  815. package/dist/utils/exif-orientation.js +158 -0
  816. package/dist/utils/exif-orientation.js.map +1 -0
  817. package/dist/utils/frontmatter.d.ts +8 -0
  818. package/dist/utils/frontmatter.d.ts.map +1 -0
  819. package/dist/utils/frontmatter.js +26 -0
  820. package/dist/utils/frontmatter.js.map +1 -0
  821. package/dist/utils/fs-watch.d.ts +5 -0
  822. package/dist/utils/fs-watch.d.ts.map +1 -0
  823. package/dist/utils/fs-watch.js +25 -0
  824. package/dist/utils/fs-watch.js.map +1 -0
  825. package/dist/utils/git.d.ts +26 -0
  826. package/dist/utils/git.d.ts.map +1 -0
  827. package/dist/utils/git.js +195 -0
  828. package/dist/utils/git.js.map +1 -0
  829. package/dist/utils/html.d.ts +7 -0
  830. package/dist/utils/html.d.ts.map +1 -0
  831. package/dist/utils/html.js +40 -0
  832. package/dist/utils/html.js.map +1 -0
  833. package/dist/utils/image-convert.d.ts +10 -0
  834. package/dist/utils/image-convert.d.ts.map +1 -0
  835. package/dist/utils/image-convert.js +45 -0
  836. package/dist/utils/image-convert.js.map +1 -0
  837. package/dist/utils/image-process.d.ts +18 -0
  838. package/dist/utils/image-process.d.ts.map +1 -0
  839. package/dist/utils/image-process.js +83 -0
  840. package/dist/utils/image-process.js.map +1 -0
  841. package/dist/utils/image-resize-core.d.ts +30 -0
  842. package/dist/utils/image-resize-core.d.ts.map +1 -0
  843. package/dist/utils/image-resize-core.js +124 -0
  844. package/dist/utils/image-resize-core.js.map +1 -0
  845. package/dist/utils/image-resize-worker.d.ts +2 -0
  846. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  847. package/dist/utils/image-resize-worker.js +31 -0
  848. package/dist/utils/image-resize-worker.js.map +1 -0
  849. package/dist/utils/image-resize.d.ts +16 -0
  850. package/dist/utils/image-resize.d.ts.map +1 -0
  851. package/dist/utils/image-resize.js +97 -0
  852. package/dist/utils/image-resize.js.map +1 -0
  853. package/dist/utils/json.d.ts +3 -0
  854. package/dist/utils/json.d.ts.map +1 -0
  855. package/dist/utils/json.js +7 -0
  856. package/dist/utils/json.js.map +1 -0
  857. package/dist/utils/management-http.d.ts +23 -0
  858. package/dist/utils/management-http.d.ts.map +1 -0
  859. package/dist/utils/management-http.js +50 -0
  860. package/dist/utils/management-http.js.map +1 -0
  861. package/dist/utils/mime.d.ts +3 -0
  862. package/dist/utils/mime.d.ts.map +1 -0
  863. package/dist/utils/mime.js +110 -0
  864. package/dist/utils/mime.js.map +1 -0
  865. package/dist/utils/open-browser.d.ts +9 -0
  866. package/dist/utils/open-browser.d.ts.map +1 -0
  867. package/dist/utils/open-browser.js +22 -0
  868. package/dist/utils/open-browser.js.map +1 -0
  869. package/dist/utils/paths.d.ts +34 -0
  870. package/dist/utils/paths.d.ts.map +1 -0
  871. package/dist/utils/paths.js +114 -0
  872. package/dist/utils/paths.js.map +1 -0
  873. package/dist/utils/photon.d.ts +21 -0
  874. package/dist/utils/photon.d.ts.map +1 -0
  875. package/dist/utils/photon.js +121 -0
  876. package/dist/utils/photon.js.map +1 -0
  877. package/dist/utils/pi-user-agent.d.ts +2 -0
  878. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  879. package/dist/utils/pi-user-agent.js +5 -0
  880. package/dist/utils/pi-user-agent.js.map +1 -0
  881. package/dist/utils/shell.d.ts +31 -0
  882. package/dist/utils/shell.d.ts.map +1 -0
  883. package/dist/utils/shell.js +202 -0
  884. package/dist/utils/shell.js.map +1 -0
  885. package/dist/utils/sleep.d.ts +5 -0
  886. package/dist/utils/sleep.d.ts.map +1 -0
  887. package/dist/utils/sleep.js +17 -0
  888. package/dist/utils/sleep.js.map +1 -0
  889. package/dist/utils/syntax-highlight.d.ts +12 -0
  890. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  891. package/dist/utils/syntax-highlight.js +118 -0
  892. package/dist/utils/syntax-highlight.js.map +1 -0
  893. package/dist/utils/tool-result-images.d.ts +19 -0
  894. package/dist/utils/tool-result-images.d.ts.map +1 -0
  895. package/dist/utils/tool-result-images.js +45 -0
  896. package/dist/utils/tool-result-images.js.map +1 -0
  897. package/dist/utils/tools-manager.d.ts +3 -0
  898. package/dist/utils/tools-manager.d.ts.map +1 -0
  899. package/dist/utils/tools-manager.js +326 -0
  900. package/dist/utils/tools-manager.js.map +1 -0
  901. package/dist/utils/version-check.d.ts +19 -0
  902. package/dist/utils/version-check.d.ts.map +1 -0
  903. package/dist/utils/version-check.js +98 -0
  904. package/dist/utils/version-check.js.map +1 -0
  905. package/dist/utils/windows-self-update.d.ts +3 -0
  906. package/dist/utils/windows-self-update.d.ts.map +1 -0
  907. package/dist/utils/windows-self-update.js +77 -0
  908. package/dist/utils/windows-self-update.js.map +1 -0
  909. package/docs/compaction.md +401 -0
  910. package/docs/containerization.md +111 -0
  911. package/docs/custom-provider.md +774 -0
  912. package/docs/development.md +71 -0
  913. package/docs/docs.json +156 -0
  914. package/docs/environment-variables.md +98 -0
  915. package/docs/extensions.md +2987 -0
  916. package/docs/images/doom-extension.png +0 -0
  917. package/docs/images/exy.png +0 -0
  918. package/docs/images/interactive-mode.png +0 -0
  919. package/docs/images/tree-view.png +0 -0
  920. package/docs/index.md +84 -0
  921. package/docs/json.md +91 -0
  922. package/docs/keybindings.md +226 -0
  923. package/docs/llama-cpp.md +99 -0
  924. package/docs/models.md +565 -0
  925. package/docs/packages.md +228 -0
  926. package/docs/prompt-templates.md +96 -0
  927. package/docs/providers.md +310 -0
  928. package/docs/quickstart.md +167 -0
  929. package/docs/rpc.md +1578 -0
  930. package/docs/sdk.md +1205 -0
  931. package/docs/security.md +59 -0
  932. package/docs/session-format.md +438 -0
  933. package/docs/sessions.md +145 -0
  934. package/docs/settings.md +322 -0
  935. package/docs/shell-aliases.md +13 -0
  936. package/docs/skills.md +231 -0
  937. package/docs/terminal-setup.md +142 -0
  938. package/docs/termux.md +127 -0
  939. package/docs/themes.md +299 -0
  940. package/docs/tmux.md +63 -0
  941. package/docs/tui.md +942 -0
  942. package/docs/usage.md +305 -0
  943. package/docs/windows.md +17 -0
  944. package/examples/README.md +25 -0
  945. package/examples/extensions/README.md +213 -0
  946. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  947. package/examples/extensions/bash-spawn-hook.ts +30 -0
  948. package/examples/extensions/bookmark.ts +50 -0
  949. package/examples/extensions/border-status-editor.ts +150 -0
  950. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  951. package/examples/extensions/claude-rules.ts +86 -0
  952. package/examples/extensions/commands.ts +72 -0
  953. package/examples/extensions/confirm-destructive.ts +59 -0
  954. package/examples/extensions/custom-compaction.ts +117 -0
  955. package/examples/extensions/custom-footer.ts +64 -0
  956. package/examples/extensions/custom-header.ts +73 -0
  957. package/examples/extensions/custom-provider-anthropic/index.ts +611 -0
  958. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  959. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  960. package/examples/extensions/custom-provider-gitlab-duo/index.ts +405 -0
  961. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  962. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  963. package/examples/extensions/dirty-repo-guard.ts +56 -0
  964. package/examples/extensions/doom-overlay/README.md +46 -0
  965. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  966. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  967. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  968. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  969. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  970. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  971. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  972. package/examples/extensions/doom-overlay/index.ts +74 -0
  973. package/examples/extensions/doom-overlay/wad-finder.ts +55 -0
  974. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  975. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  976. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  977. package/examples/extensions/dynamic-resources/index.ts +15 -0
  978. package/examples/extensions/dynamic-tools.ts +74 -0
  979. package/examples/extensions/entry-renderer.ts +41 -0
  980. package/examples/extensions/event-bus.ts +43 -0
  981. package/examples/extensions/file-trigger.ts +41 -0
  982. package/examples/extensions/git-checkpoint.ts +53 -0
  983. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  984. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  985. package/examples/extensions/gondolin/index.ts +531 -0
  986. package/examples/extensions/gondolin/package-lock.json +185 -0
  987. package/examples/extensions/gondolin/package.json +19 -0
  988. package/examples/extensions/handoff.ts +190 -0
  989. package/examples/extensions/hello.ts +26 -0
  990. package/examples/extensions/hidden-thinking-label.ts +53 -0
  991. package/examples/extensions/inline-bash.ts +94 -0
  992. package/examples/extensions/input-transform-streaming.ts +39 -0
  993. package/examples/extensions/input-transform.ts +43 -0
  994. package/examples/extensions/interactive-shell.ts +196 -0
  995. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  996. package/examples/extensions/mac-system-theme.ts +47 -0
  997. package/examples/extensions/message-renderer.ts +59 -0
  998. package/examples/extensions/minimal-mode.ts +426 -0
  999. package/examples/extensions/modal-editor.ts +85 -0
  1000. package/examples/extensions/model-status.ts +31 -0
  1001. package/examples/extensions/notify.ts +55 -0
  1002. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  1003. package/examples/extensions/overlay-test.ts +153 -0
  1004. package/examples/extensions/permission-gate.ts +34 -0
  1005. package/examples/extensions/pirate.ts +47 -0
  1006. package/examples/extensions/plan-mode/README.md +66 -0
  1007. package/examples/extensions/plan-mode/index.ts +390 -0
  1008. package/examples/extensions/plan-mode/utils.ts +168 -0
  1009. package/examples/extensions/preset.ts +436 -0
  1010. package/examples/extensions/project-trust.ts +64 -0
  1011. package/examples/extensions/prompt-customizer.ts +97 -0
  1012. package/examples/extensions/protected-paths.ts +30 -0
  1013. package/examples/extensions/provider-payload.ts +18 -0
  1014. package/examples/extensions/qna.ts +118 -0
  1015. package/examples/extensions/question.ts +286 -0
  1016. package/examples/extensions/questionnaire.ts +448 -0
  1017. package/examples/extensions/rainbow-editor.ts +88 -0
  1018. package/examples/extensions/reload-runtime.ts +37 -0
  1019. package/examples/extensions/rpc-demo.ts +118 -0
  1020. package/examples/extensions/sandbox/index.ts +321 -0
  1021. package/examples/extensions/sandbox/package-lock.json +92 -0
  1022. package/examples/extensions/sandbox/package.json +19 -0
  1023. package/examples/extensions/send-user-message.ts +97 -0
  1024. package/examples/extensions/session-name.ts +27 -0
  1025. package/examples/extensions/shutdown-command.ts +63 -0
  1026. package/examples/extensions/snake.ts +343 -0
  1027. package/examples/extensions/space-invaders.ts +560 -0
  1028. package/examples/extensions/ssh.ts +220 -0
  1029. package/examples/extensions/status-line.ts +32 -0
  1030. package/examples/extensions/structured-output.ts +65 -0
  1031. package/examples/extensions/subagent/README.md +175 -0
  1032. package/examples/extensions/subagent/agents/planner.md +37 -0
  1033. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1034. package/examples/extensions/subagent/agents/scout.md +50 -0
  1035. package/examples/extensions/subagent/agents/worker.md +24 -0
  1036. package/examples/extensions/subagent/agents.ts +126 -0
  1037. package/examples/extensions/subagent/index.ts +1015 -0
  1038. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1039. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1040. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1041. package/examples/extensions/summarize.ts +199 -0
  1042. package/examples/extensions/system-prompt-header.ts +17 -0
  1043. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1044. package/examples/extensions/timed-confirm.ts +70 -0
  1045. package/examples/extensions/titlebar-spinner.ts +58 -0
  1046. package/examples/extensions/todo.ts +297 -0
  1047. package/examples/extensions/tool-override.ts +144 -0
  1048. package/examples/extensions/tools.ts +146 -0
  1049. package/examples/extensions/trigger-compact.ts +50 -0
  1050. package/examples/extensions/truncated-tool.ts +195 -0
  1051. package/examples/extensions/widget-placement.ts +9 -0
  1052. package/examples/extensions/with-deps/index.ts +32 -0
  1053. package/examples/extensions/with-deps/package-lock.json +31 -0
  1054. package/examples/extensions/with-deps/package.json +22 -0
  1055. package/examples/extensions/working-indicator.ts +123 -0
  1056. package/examples/extensions/working-message-test.ts +25 -0
  1057. package/examples/rpc-extension-ui.ts +641 -0
  1058. package/examples/sdk/01-minimal.ts +26 -0
  1059. package/examples/sdk/02-custom-model.ts +49 -0
  1060. package/examples/sdk/03-custom-prompt.ts +75 -0
  1061. package/examples/sdk/04-skills.ts +55 -0
  1062. package/examples/sdk/05-tools.ts +48 -0
  1063. package/examples/sdk/06-extensions.ts +99 -0
  1064. package/examples/sdk/07-context-files.ts +47 -0
  1065. package/examples/sdk/08-prompt-templates.ts +51 -0
  1066. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  1067. package/examples/sdk/10-settings.ts +53 -0
  1068. package/examples/sdk/11-sessions.ts +52 -0
  1069. package/examples/sdk/12-full-control.ts +74 -0
  1070. package/examples/sdk/13-session-runtime.ts +67 -0
  1071. package/examples/sdk/README.md +140 -0
  1072. package/npm-shrinkwrap.json +1817 -0
  1073. package/package.json +145 -0
@@ -0,0 +1,37 @@
1
+ import { type Component } from "@earendil-works/pi-tui";
2
+ /**
3
+ * Rounded dialog chrome shared by every centered overlay.
4
+ *
5
+ * Selectors used to render bare, so the border the command palette drew
6
+ * appeared to vanish the moment the user entered one of its options. Wrapping
7
+ * every overlay in this frame keeps the chrome continuous across the whole
8
+ * dialog flow.
9
+ *
10
+ * The frame is the component handed to `showOverlay`, and therefore the
11
+ * component that must receive focus: the TUI treats focus landing outside the
12
+ * visible overlay as "the user moved on" and parks the overlay in a blocked
13
+ * focus-restore state. The frame proxies input and the `Focusable` contract
14
+ * through to the real target so the wrapped component behaves as before.
15
+ *
16
+ * The frame also forwards a height budget to children that know how to shrink
17
+ * (see {@link HeightAware}). Overlays taller than their allowance are sliced
18
+ * by the TUI, which would otherwise eat the closing border.
19
+ */
20
+ /** Component that can shrink itself to fit a line budget. */
21
+ export interface HeightAware {
22
+ setMaxHeight(lines: number): void;
23
+ }
24
+ export declare class DialogFrame implements Component {
25
+ private readonly child;
26
+ /** Component that should behave as focused; defaults to the wrapped child. */
27
+ private readonly focusTarget;
28
+ constructor(child: Component, focusTarget?: Component);
29
+ get focused(): boolean;
30
+ set focused(value: boolean);
31
+ setMaxHeight(lines: number): void;
32
+ render(width: number): string[];
33
+ handleInput(data: string): void;
34
+ handleClick(x: number, y: number): boolean | undefined;
35
+ invalidate(): void;
36
+ }
37
+ //# sourceMappingURL=dialog-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-frame.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/dialog-frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,wBAAwB,CAAC;AAGnF;;;;;;;;;;;;;;;;;GAiBG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC3B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AASD,qBAAa,WAAY,YAAW,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IAExC,YAAY,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,EAGpD;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAIzB;IAED,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAW9B;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9B;IAED,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAIrD;IAED,UAAU,IAAI,IAAI,CAEjB;CACD","sourcesContent":["import { type Component, isFocusable, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Rounded dialog chrome shared by every centered overlay.\n *\n * Selectors used to render bare, so the border the command palette drew\n * appeared to vanish the moment the user entered one of its options. Wrapping\n * every overlay in this frame keeps the chrome continuous across the whole\n * dialog flow.\n *\n * The frame is the component handed to `showOverlay`, and therefore the\n * component that must receive focus: the TUI treats focus landing outside the\n * visible overlay as \"the user moved on\" and parks the overlay in a blocked\n * focus-restore state. The frame proxies input and the `Focusable` contract\n * through to the real target so the wrapped component behaves as before.\n *\n * The frame also forwards a height budget to children that know how to shrink\n * (see {@link HeightAware}). Overlays taller than their allowance are sliced\n * by the TUI, which would otherwise eat the closing border.\n */\n\n/** Component that can shrink itself to fit a line budget. */\nexport interface HeightAware {\n\tsetMaxHeight(lines: number): void;\n}\n\nfunction isHeightAware(component: Component): component is Component & HeightAware {\n\treturn typeof (component as Partial<HeightAware>).setMaxHeight === \"function\";\n}\n\n/** Rows the frame itself consumes: top border + bottom border. */\nconst FRAME_ROWS = 2;\n\nexport class DialogFrame implements Component {\n\tprivate readonly child: Component;\n\t/** Component that should behave as focused; defaults to the wrapped child. */\n\tprivate readonly focusTarget: Component;\n\n\tconstructor(child: Component, focusTarget?: Component) {\n\t\tthis.child = child;\n\t\tthis.focusTarget = focusTarget ?? child;\n\t}\n\n\tget focused(): boolean {\n\t\treturn isFocusable(this.focusTarget) ? this.focusTarget.focused : false;\n\t}\n\n\tset focused(value: boolean) {\n\t\tif (isFocusable(this.focusTarget)) {\n\t\t\tthis.focusTarget.focused = value;\n\t\t}\n\t}\n\n\tsetMaxHeight(lines: number): void {\n\t\tif (isHeightAware(this.child)) {\n\t\t\tthis.child.setMaxHeight(Math.max(1, lines - FRAME_ROWS));\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst innerWidth = Math.max(10, width - 4);\n\t\tconst content = this.child.render(innerWidth);\n\t\tconst border = (s: string) => theme.fg(\"accent\", s);\n\t\tconst lines: string[] = [border(`╭${\"─\".repeat(Math.max(0, width - 2))}╮`)];\n\t\tfor (const line of content) {\n\t\t\tconst pad = \" \".repeat(Math.max(0, innerWidth - visibleWidth(line)));\n\t\t\tlines.push(`${border(\"│\")} ${line}${pad} ${border(\"│\")}`);\n\t\t}\n\t\tlines.push(border(`╰${\"─\".repeat(Math.max(0, width - 2))}╯`));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.focusTarget.handleInput?.(data);\n\t}\n\n\thandleClick(x: number, y: number): boolean | undefined {\n\t\t// Children see coordinates in their own space: strip the border row and\n\t\t// the border column plus its padding space.\n\t\treturn this.child.handleClick?.(x - 2, y - 1);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.child.invalidate();\n\t}\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import { isFocusable, visibleWidth } from "@earendil-works/pi-tui";
2
+ import { theme } from "../theme/theme.js";
3
+ function isHeightAware(component) {
4
+ return typeof component.setMaxHeight === "function";
5
+ }
6
+ /** Rows the frame itself consumes: top border + bottom border. */
7
+ const FRAME_ROWS = 2;
8
+ export class DialogFrame {
9
+ child;
10
+ /** Component that should behave as focused; defaults to the wrapped child. */
11
+ focusTarget;
12
+ constructor(child, focusTarget) {
13
+ this.child = child;
14
+ this.focusTarget = focusTarget ?? child;
15
+ }
16
+ get focused() {
17
+ return isFocusable(this.focusTarget) ? this.focusTarget.focused : false;
18
+ }
19
+ set focused(value) {
20
+ if (isFocusable(this.focusTarget)) {
21
+ this.focusTarget.focused = value;
22
+ }
23
+ }
24
+ setMaxHeight(lines) {
25
+ if (isHeightAware(this.child)) {
26
+ this.child.setMaxHeight(Math.max(1, lines - FRAME_ROWS));
27
+ }
28
+ }
29
+ render(width) {
30
+ const innerWidth = Math.max(10, width - 4);
31
+ const content = this.child.render(innerWidth);
32
+ const border = (s) => theme.fg("accent", s);
33
+ const lines = [border(`╭${"─".repeat(Math.max(0, width - 2))}╮`)];
34
+ for (const line of content) {
35
+ const pad = " ".repeat(Math.max(0, innerWidth - visibleWidth(line)));
36
+ lines.push(`${border("│")} ${line}${pad} ${border("│")}`);
37
+ }
38
+ lines.push(border(`╰${"─".repeat(Math.max(0, width - 2))}╯`));
39
+ return lines;
40
+ }
41
+ handleInput(data) {
42
+ this.focusTarget.handleInput?.(data);
43
+ }
44
+ handleClick(x, y) {
45
+ // Children see coordinates in their own space: strip the border row and
46
+ // the border column plus its padding space.
47
+ return this.child.handleClick?.(x - 2, y - 1);
48
+ }
49
+ invalidate() {
50
+ this.child.invalidate();
51
+ }
52
+ }
53
+ //# sourceMappingURL=dialog-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-frame.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/dialog-frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AA0B1C,SAAS,aAAa,CAAC,SAAoB,EAAwC;IAClF,OAAO,OAAQ,SAAkC,CAAC,YAAY,KAAK,UAAU,CAAC;AAAA,CAC9E;AAED,kEAAkE;AAClE,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,MAAM,OAAO,WAAW;IACN,KAAK,CAAY;IAClC,8EAA8E;IAC7D,WAAW,CAAY;IAExC,YAAY,KAAgB,EAAE,WAAuB,EAAE;QACtD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,KAAK,CAAC;IAAA,CACxC;IAED,IAAI,OAAO,GAAY;QACtB,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAAA,CACxE;IAED,IAAI,OAAO,CAAC,KAAc,EAAE;QAC3B,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;QAClC,CAAC;IAAA,CACD;IAED,YAAY,CAAC,KAAa,EAAQ;QACjC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;QAC1D,CAAC;IAAA,CACD;IAED,MAAM,CAAC,KAAa,EAAY;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,MAAI,KAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAG,CAAC,CAAC,CAAC;QAC5E,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAG,CAAC,IAAI,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC,KAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAI,KAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAG,CAAC,CAAC,CAAC;QAC9D,OAAO,KAAK,CAAC;IAAA,CACb;IAED,WAAW,CAAC,IAAY,EAAQ;QAC/B,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;IAAA,CACrC;IAED,WAAW,CAAC,CAAS,EAAE,CAAS,EAAuB;QACtD,wEAAwE;QACxE,4CAA4C;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAAA,CAC9C;IAED,UAAU,GAAS;QAClB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAAA,CACxB;CACD","sourcesContent":["import { type Component, isFocusable, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Rounded dialog chrome shared by every centered overlay.\n *\n * Selectors used to render bare, so the border the command palette drew\n * appeared to vanish the moment the user entered one of its options. Wrapping\n * every overlay in this frame keeps the chrome continuous across the whole\n * dialog flow.\n *\n * The frame is the component handed to `showOverlay`, and therefore the\n * component that must receive focus: the TUI treats focus landing outside the\n * visible overlay as \"the user moved on\" and parks the overlay in a blocked\n * focus-restore state. The frame proxies input and the `Focusable` contract\n * through to the real target so the wrapped component behaves as before.\n *\n * The frame also forwards a height budget to children that know how to shrink\n * (see {@link HeightAware}). Overlays taller than their allowance are sliced\n * by the TUI, which would otherwise eat the closing border.\n */\n\n/** Component that can shrink itself to fit a line budget. */\nexport interface HeightAware {\n\tsetMaxHeight(lines: number): void;\n}\n\nfunction isHeightAware(component: Component): component is Component & HeightAware {\n\treturn typeof (component as Partial<HeightAware>).setMaxHeight === \"function\";\n}\n\n/** Rows the frame itself consumes: top border + bottom border. */\nconst FRAME_ROWS = 2;\n\nexport class DialogFrame implements Component {\n\tprivate readonly child: Component;\n\t/** Component that should behave as focused; defaults to the wrapped child. */\n\tprivate readonly focusTarget: Component;\n\n\tconstructor(child: Component, focusTarget?: Component) {\n\t\tthis.child = child;\n\t\tthis.focusTarget = focusTarget ?? child;\n\t}\n\n\tget focused(): boolean {\n\t\treturn isFocusable(this.focusTarget) ? this.focusTarget.focused : false;\n\t}\n\n\tset focused(value: boolean) {\n\t\tif (isFocusable(this.focusTarget)) {\n\t\t\tthis.focusTarget.focused = value;\n\t\t}\n\t}\n\n\tsetMaxHeight(lines: number): void {\n\t\tif (isHeightAware(this.child)) {\n\t\t\tthis.child.setMaxHeight(Math.max(1, lines - FRAME_ROWS));\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst innerWidth = Math.max(10, width - 4);\n\t\tconst content = this.child.render(innerWidth);\n\t\tconst border = (s: string) => theme.fg(\"accent\", s);\n\t\tconst lines: string[] = [border(`╭${\"─\".repeat(Math.max(0, width - 2))}╮`)];\n\t\tfor (const line of content) {\n\t\t\tconst pad = \" \".repeat(Math.max(0, innerWidth - visibleWidth(line)));\n\t\t\tlines.push(`${border(\"│\")} ${line}${pad} ${border(\"│\")}`);\n\t\t}\n\t\tlines.push(border(`╰${\"─\".repeat(Math.max(0, width - 2))}╯`));\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.focusTarget.handleInput?.(data);\n\t}\n\n\thandleClick(x: number, y: number): boolean | undefined {\n\t\t// Children see coordinates in their own space: strip the border row and\n\t\t// the border column plus its padding space.\n\t\treturn this.child.handleClick?.(x - 2, y - 1);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.child.invalidate();\n\t}\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export interface RenderDiffOptions {
2
+ /** File path (unused, kept for API compatibility) */
3
+ filePath?: string;
4
+ }
5
+ /**
6
+ * Render a diff string with colored lines and intra-line change highlighting.
7
+ * - Context lines: dim/gray
8
+ * - Removed lines: red, with inverse on changed tokens
9
+ * - Added lines: green, with inverse on changed tokens
10
+ */
11
+ export declare function renderDiff(diffText: string, _options?: RenderDiffOptions): string;
12
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/diff.ts"],"names":[],"mappings":"AAmEA,MAAM,WAAW,iBAAiB;IACjC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,iBAAsB,GAAG,MAAM,CAoErF","sourcesContent":["import * as Diff from \"diff\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Parse diff line to extract prefix, line number, and content.\n * Format: \"+123 content\" or \"-123 content\" or \" 123 content\" or \" ...\"\n */\nfunction parseDiffLine(line: string): { prefix: string; lineNum: string; content: string } | null {\n\tconst match = line.match(/^([+-\\s])(\\s*\\d*)\\s(.*)$/);\n\tif (!match) return null;\n\treturn { prefix: match[1], lineNum: match[2], content: match[3] };\n}\n\n/**\n * Replace tabs with spaces for consistent rendering.\n */\nfunction replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\n/**\n * Compute word-level diff and render with inverse on changed parts.\n * Uses diffWords which groups whitespace with adjacent words for cleaner highlighting.\n * Strips leading whitespace from inverse to avoid highlighting indentation.\n */\nfunction renderIntraLineDiff(oldContent: string, newContent: string): { removedLine: string; addedLine: string } {\n\tconst wordDiff = Diff.diffWords(oldContent, newContent);\n\n\tlet removedLine = \"\";\n\tlet addedLine = \"\";\n\tlet isFirstRemoved = true;\n\tlet isFirstAdded = true;\n\n\tfor (const part of wordDiff) {\n\t\tif (part.removed) {\n\t\t\tlet value = part.value;\n\t\t\t// Strip leading whitespace from the first removed part\n\t\t\tif (isFirstRemoved) {\n\t\t\t\tconst leadingWs = value.match(/^(\\s*)/)?.[1] || \"\";\n\t\t\t\tvalue = value.slice(leadingWs.length);\n\t\t\t\tremovedLine += leadingWs;\n\t\t\t\tisFirstRemoved = false;\n\t\t\t}\n\t\t\tif (value) {\n\t\t\t\tremovedLine += theme.inverse(value);\n\t\t\t}\n\t\t} else if (part.added) {\n\t\t\tlet value = part.value;\n\t\t\t// Strip leading whitespace from the first added part\n\t\t\tif (isFirstAdded) {\n\t\t\t\tconst leadingWs = value.match(/^(\\s*)/)?.[1] || \"\";\n\t\t\t\tvalue = value.slice(leadingWs.length);\n\t\t\t\taddedLine += leadingWs;\n\t\t\t\tisFirstAdded = false;\n\t\t\t}\n\t\t\tif (value) {\n\t\t\t\taddedLine += theme.inverse(value);\n\t\t\t}\n\t\t} else {\n\t\t\tremovedLine += part.value;\n\t\t\taddedLine += part.value;\n\t\t}\n\t}\n\n\treturn { removedLine, addedLine };\n}\n\nexport interface RenderDiffOptions {\n\t/** File path (unused, kept for API compatibility) */\n\tfilePath?: string;\n}\n\n/**\n * Render a diff string with colored lines and intra-line change highlighting.\n * - Context lines: dim/gray\n * - Removed lines: red, with inverse on changed tokens\n * - Added lines: green, with inverse on changed tokens\n */\nexport function renderDiff(diffText: string, _options: RenderDiffOptions = {}): string {\n\tconst lines = diffText.split(\"\\n\");\n\tconst result: string[] = [];\n\n\tlet i = 0;\n\twhile (i < lines.length) {\n\t\tconst line = lines[i];\n\t\tconst parsed = parseDiffLine(line);\n\n\t\tif (!parsed) {\n\t\t\tresult.push(theme.fg(\"toolDiffContext\", line));\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (parsed.prefix === \"-\") {\n\t\t\t// Collect consecutive removed lines\n\t\t\tconst removedLines: { lineNum: string; content: string }[] = [];\n\t\t\twhile (i < lines.length) {\n\t\t\t\tconst p = parseDiffLine(lines[i]);\n\t\t\t\tif (!p || p.prefix !== \"-\") break;\n\t\t\t\tremovedLines.push({ lineNum: p.lineNum, content: p.content });\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\t// Collect consecutive added lines\n\t\t\tconst addedLines: { lineNum: string; content: string }[] = [];\n\t\t\twhile (i < lines.length) {\n\t\t\t\tconst p = parseDiffLine(lines[i]);\n\t\t\t\tif (!p || p.prefix !== \"+\") break;\n\t\t\t\taddedLines.push({ lineNum: p.lineNum, content: p.content });\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\t// Only do intra-line diffing when there's exactly one removed and one added line\n\t\t\t// (indicating a single line modification). Otherwise, show lines as-is.\n\t\t\tif (removedLines.length === 1 && addedLines.length === 1) {\n\t\t\t\tconst removed = removedLines[0];\n\t\t\t\tconst added = addedLines[0];\n\n\t\t\t\tconst { removedLine, addedLine } = renderIntraLineDiff(\n\t\t\t\t\treplaceTabs(removed.content),\n\t\t\t\t\treplaceTabs(added.content),\n\t\t\t\t);\n\n\t\t\t\tresult.push(theme.fg(\"toolDiffRemoved\", `-${removed.lineNum} ${removedLine}`));\n\t\t\t\tresult.push(theme.fg(\"toolDiffAdded\", `+${added.lineNum} ${addedLine}`));\n\t\t\t} else {\n\t\t\t\t// Show all removed lines first, then all added lines\n\t\t\t\tfor (const removed of removedLines) {\n\t\t\t\t\tresult.push(theme.fg(\"toolDiffRemoved\", `-${removed.lineNum} ${replaceTabs(removed.content)}`));\n\t\t\t\t}\n\t\t\t\tfor (const added of addedLines) {\n\t\t\t\t\tresult.push(theme.fg(\"toolDiffAdded\", `+${added.lineNum} ${replaceTabs(added.content)}`));\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (parsed.prefix === \"+\") {\n\t\t\t// Standalone added line\n\t\t\tresult.push(theme.fg(\"toolDiffAdded\", `+${parsed.lineNum} ${replaceTabs(parsed.content)}`));\n\t\t\ti++;\n\t\t} else {\n\t\t\t// Context line\n\t\t\tresult.push(theme.fg(\"toolDiffContext\", ` ${parsed.lineNum} ${replaceTabs(parsed.content)}`));\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn result.join(\"\\n\");\n}\n"]}
@@ -0,0 +1,133 @@
1
+ import * as Diff from "diff";
2
+ import { theme } from "../theme/theme.js";
3
+ /**
4
+ * Parse diff line to extract prefix, line number, and content.
5
+ * Format: "+123 content" or "-123 content" or " 123 content" or " ..."
6
+ */
7
+ function parseDiffLine(line) {
8
+ const match = line.match(/^([+-\s])(\s*\d*)\s(.*)$/);
9
+ if (!match)
10
+ return null;
11
+ return { prefix: match[1], lineNum: match[2], content: match[3] };
12
+ }
13
+ /**
14
+ * Replace tabs with spaces for consistent rendering.
15
+ */
16
+ function replaceTabs(text) {
17
+ return text.replace(/\t/g, " ");
18
+ }
19
+ /**
20
+ * Compute word-level diff and render with inverse on changed parts.
21
+ * Uses diffWords which groups whitespace with adjacent words for cleaner highlighting.
22
+ * Strips leading whitespace from inverse to avoid highlighting indentation.
23
+ */
24
+ function renderIntraLineDiff(oldContent, newContent) {
25
+ const wordDiff = Diff.diffWords(oldContent, newContent);
26
+ let removedLine = "";
27
+ let addedLine = "";
28
+ let isFirstRemoved = true;
29
+ let isFirstAdded = true;
30
+ for (const part of wordDiff) {
31
+ if (part.removed) {
32
+ let value = part.value;
33
+ // Strip leading whitespace from the first removed part
34
+ if (isFirstRemoved) {
35
+ const leadingWs = value.match(/^(\s*)/)?.[1] || "";
36
+ value = value.slice(leadingWs.length);
37
+ removedLine += leadingWs;
38
+ isFirstRemoved = false;
39
+ }
40
+ if (value) {
41
+ removedLine += theme.inverse(value);
42
+ }
43
+ }
44
+ else if (part.added) {
45
+ let value = part.value;
46
+ // Strip leading whitespace from the first added part
47
+ if (isFirstAdded) {
48
+ const leadingWs = value.match(/^(\s*)/)?.[1] || "";
49
+ value = value.slice(leadingWs.length);
50
+ addedLine += leadingWs;
51
+ isFirstAdded = false;
52
+ }
53
+ if (value) {
54
+ addedLine += theme.inverse(value);
55
+ }
56
+ }
57
+ else {
58
+ removedLine += part.value;
59
+ addedLine += part.value;
60
+ }
61
+ }
62
+ return { removedLine, addedLine };
63
+ }
64
+ /**
65
+ * Render a diff string with colored lines and intra-line change highlighting.
66
+ * - Context lines: dim/gray
67
+ * - Removed lines: red, with inverse on changed tokens
68
+ * - Added lines: green, with inverse on changed tokens
69
+ */
70
+ export function renderDiff(diffText, _options = {}) {
71
+ const lines = diffText.split("\n");
72
+ const result = [];
73
+ let i = 0;
74
+ while (i < lines.length) {
75
+ const line = lines[i];
76
+ const parsed = parseDiffLine(line);
77
+ if (!parsed) {
78
+ result.push(theme.fg("toolDiffContext", line));
79
+ i++;
80
+ continue;
81
+ }
82
+ if (parsed.prefix === "-") {
83
+ // Collect consecutive removed lines
84
+ const removedLines = [];
85
+ while (i < lines.length) {
86
+ const p = parseDiffLine(lines[i]);
87
+ if (!p || p.prefix !== "-")
88
+ break;
89
+ removedLines.push({ lineNum: p.lineNum, content: p.content });
90
+ i++;
91
+ }
92
+ // Collect consecutive added lines
93
+ const addedLines = [];
94
+ while (i < lines.length) {
95
+ const p = parseDiffLine(lines[i]);
96
+ if (!p || p.prefix !== "+")
97
+ break;
98
+ addedLines.push({ lineNum: p.lineNum, content: p.content });
99
+ i++;
100
+ }
101
+ // Only do intra-line diffing when there's exactly one removed and one added line
102
+ // (indicating a single line modification). Otherwise, show lines as-is.
103
+ if (removedLines.length === 1 && addedLines.length === 1) {
104
+ const removed = removedLines[0];
105
+ const added = addedLines[0];
106
+ const { removedLine, addedLine } = renderIntraLineDiff(replaceTabs(removed.content), replaceTabs(added.content));
107
+ result.push(theme.fg("toolDiffRemoved", `-${removed.lineNum} ${removedLine}`));
108
+ result.push(theme.fg("toolDiffAdded", `+${added.lineNum} ${addedLine}`));
109
+ }
110
+ else {
111
+ // Show all removed lines first, then all added lines
112
+ for (const removed of removedLines) {
113
+ result.push(theme.fg("toolDiffRemoved", `-${removed.lineNum} ${replaceTabs(removed.content)}`));
114
+ }
115
+ for (const added of addedLines) {
116
+ result.push(theme.fg("toolDiffAdded", `+${added.lineNum} ${replaceTabs(added.content)}`));
117
+ }
118
+ }
119
+ }
120
+ else if (parsed.prefix === "+") {
121
+ // Standalone added line
122
+ result.push(theme.fg("toolDiffAdded", `+${parsed.lineNum} ${replaceTabs(parsed.content)}`));
123
+ i++;
124
+ }
125
+ else {
126
+ // Context line
127
+ result.push(theme.fg("toolDiffContext", ` ${parsed.lineNum} ${replaceTabs(parsed.content)}`));
128
+ i++;
129
+ }
130
+ }
131
+ return result.join("\n");
132
+ }
133
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/diff.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Diff from \"diff\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Parse diff line to extract prefix, line number, and content.\n * Format: \"+123 content\" or \"-123 content\" or \" 123 content\" or \" ...\"\n */\nfunction parseDiffLine(line: string): { prefix: string; lineNum: string; content: string } | null {\n\tconst match = line.match(/^([+-\\s])(\\s*\\d*)\\s(.*)$/);\n\tif (!match) return null;\n\treturn { prefix: match[1], lineNum: match[2], content: match[3] };\n}\n\n/**\n * Replace tabs with spaces for consistent rendering.\n */\nfunction replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\n/**\n * Compute word-level diff and render with inverse on changed parts.\n * Uses diffWords which groups whitespace with adjacent words for cleaner highlighting.\n * Strips leading whitespace from inverse to avoid highlighting indentation.\n */\nfunction renderIntraLineDiff(oldContent: string, newContent: string): { removedLine: string; addedLine: string } {\n\tconst wordDiff = Diff.diffWords(oldContent, newContent);\n\n\tlet removedLine = \"\";\n\tlet addedLine = \"\";\n\tlet isFirstRemoved = true;\n\tlet isFirstAdded = true;\n\n\tfor (const part of wordDiff) {\n\t\tif (part.removed) {\n\t\t\tlet value = part.value;\n\t\t\t// Strip leading whitespace from the first removed part\n\t\t\tif (isFirstRemoved) {\n\t\t\t\tconst leadingWs = value.match(/^(\\s*)/)?.[1] || \"\";\n\t\t\t\tvalue = value.slice(leadingWs.length);\n\t\t\t\tremovedLine += leadingWs;\n\t\t\t\tisFirstRemoved = false;\n\t\t\t}\n\t\t\tif (value) {\n\t\t\t\tremovedLine += theme.inverse(value);\n\t\t\t}\n\t\t} else if (part.added) {\n\t\t\tlet value = part.value;\n\t\t\t// Strip leading whitespace from the first added part\n\t\t\tif (isFirstAdded) {\n\t\t\t\tconst leadingWs = value.match(/^(\\s*)/)?.[1] || \"\";\n\t\t\t\tvalue = value.slice(leadingWs.length);\n\t\t\t\taddedLine += leadingWs;\n\t\t\t\tisFirstAdded = false;\n\t\t\t}\n\t\t\tif (value) {\n\t\t\t\taddedLine += theme.inverse(value);\n\t\t\t}\n\t\t} else {\n\t\t\tremovedLine += part.value;\n\t\t\taddedLine += part.value;\n\t\t}\n\t}\n\n\treturn { removedLine, addedLine };\n}\n\nexport interface RenderDiffOptions {\n\t/** File path (unused, kept for API compatibility) */\n\tfilePath?: string;\n}\n\n/**\n * Render a diff string with colored lines and intra-line change highlighting.\n * - Context lines: dim/gray\n * - Removed lines: red, with inverse on changed tokens\n * - Added lines: green, with inverse on changed tokens\n */\nexport function renderDiff(diffText: string, _options: RenderDiffOptions = {}): string {\n\tconst lines = diffText.split(\"\\n\");\n\tconst result: string[] = [];\n\n\tlet i = 0;\n\twhile (i < lines.length) {\n\t\tconst line = lines[i];\n\t\tconst parsed = parseDiffLine(line);\n\n\t\tif (!parsed) {\n\t\t\tresult.push(theme.fg(\"toolDiffContext\", line));\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (parsed.prefix === \"-\") {\n\t\t\t// Collect consecutive removed lines\n\t\t\tconst removedLines: { lineNum: string; content: string }[] = [];\n\t\t\twhile (i < lines.length) {\n\t\t\t\tconst p = parseDiffLine(lines[i]);\n\t\t\t\tif (!p || p.prefix !== \"-\") break;\n\t\t\t\tremovedLines.push({ lineNum: p.lineNum, content: p.content });\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\t// Collect consecutive added lines\n\t\t\tconst addedLines: { lineNum: string; content: string }[] = [];\n\t\t\twhile (i < lines.length) {\n\t\t\t\tconst p = parseDiffLine(lines[i]);\n\t\t\t\tif (!p || p.prefix !== \"+\") break;\n\t\t\t\taddedLines.push({ lineNum: p.lineNum, content: p.content });\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\t// Only do intra-line diffing when there's exactly one removed and one added line\n\t\t\t// (indicating a single line modification). Otherwise, show lines as-is.\n\t\t\tif (removedLines.length === 1 && addedLines.length === 1) {\n\t\t\t\tconst removed = removedLines[0];\n\t\t\t\tconst added = addedLines[0];\n\n\t\t\t\tconst { removedLine, addedLine } = renderIntraLineDiff(\n\t\t\t\t\treplaceTabs(removed.content),\n\t\t\t\t\treplaceTabs(added.content),\n\t\t\t\t);\n\n\t\t\t\tresult.push(theme.fg(\"toolDiffRemoved\", `-${removed.lineNum} ${removedLine}`));\n\t\t\t\tresult.push(theme.fg(\"toolDiffAdded\", `+${added.lineNum} ${addedLine}`));\n\t\t\t} else {\n\t\t\t\t// Show all removed lines first, then all added lines\n\t\t\t\tfor (const removed of removedLines) {\n\t\t\t\t\tresult.push(theme.fg(\"toolDiffRemoved\", `-${removed.lineNum} ${replaceTabs(removed.content)}`));\n\t\t\t\t}\n\t\t\t\tfor (const added of addedLines) {\n\t\t\t\t\tresult.push(theme.fg(\"toolDiffAdded\", `+${added.lineNum} ${replaceTabs(added.content)}`));\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (parsed.prefix === \"+\") {\n\t\t\t// Standalone added line\n\t\t\tresult.push(theme.fg(\"toolDiffAdded\", `+${parsed.lineNum} ${replaceTabs(parsed.content)}`));\n\t\t\ti++;\n\t\t} else {\n\t\t\t// Context line\n\t\t\tresult.push(theme.fg(\"toolDiffContext\", ` ${parsed.lineNum} ${replaceTabs(parsed.content)}`));\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn result.join(\"\\n\");\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { Component } from "@earendil-works/pi-tui";
2
+ /**
3
+ * Dynamic border component that adjusts to viewport width.
4
+ *
5
+ * Optionally renders an embedded label: `── label ───────────`.
6
+ *
7
+ * Note: When used from extensions loaded via jiti, the global `theme` may be undefined
8
+ * because jiti creates a separate module cache. Always pass an explicit color
9
+ * function when using DynamicBorder in components exported for extension use.
10
+ */
11
+ export declare class DynamicBorder implements Component {
12
+ private color;
13
+ private label;
14
+ constructor(color?: (str: string) => string, label?: string);
15
+ setLabel(label: string | undefined): void;
16
+ invalidate(): void;
17
+ render(width: number): string[];
18
+ }
19
+ //# sourceMappingURL=dynamic-border.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-border.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/dynamic-border.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC9C,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,KAAK,CAAqB;IAElC,YAAY,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAyC,EAAE,KAAK,CAAC,EAAE,MAAM,EAG5F;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAExC;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ9B;CACD","sourcesContent":["import type { Component } from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Dynamic border component that adjusts to viewport width.\n *\n * Optionally renders an embedded label: `── label ───────────`.\n *\n * Note: When used from extensions loaded via jiti, the global `theme` may be undefined\n * because jiti creates a separate module cache. Always pass an explicit color\n * function when using DynamicBorder in components exported for extension use.\n */\nexport class DynamicBorder implements Component {\n\tprivate color: (str: string) => string;\n\tprivate label: string | undefined;\n\n\tconstructor(color: (str: string) => string = (str) => theme.fg(\"border\", str), label?: string) {\n\t\tthis.color = color;\n\t\tthis.label = label;\n\t}\n\n\tsetLabel(label: string | undefined): void {\n\t\tthis.label = label;\n\t}\n\n\tinvalidate(): void {\n\t\t// No cached state to invalidate currently\n\t}\n\n\trender(width: number): string[] {\n\t\tconst w = Math.max(1, width);\n\t\tif (!this.label) return [this.color(\"─\".repeat(w))];\n\t\tconst labelLen = [...this.label].length;\n\t\t// Too narrow for `── label ─` — fall back to a plain rule.\n\t\tif (w < labelLen + 6) return [this.color(\"─\".repeat(w))];\n\t\tconst fill = w - labelLen - 4;\n\t\treturn [this.color(\"── \") + theme.bold(theme.fg(\"muted\", this.label)) + this.color(` ${\"─\".repeat(fill)}`)];\n\t}\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { theme } from "../theme/theme.js";
2
+ /**
3
+ * Dynamic border component that adjusts to viewport width.
4
+ *
5
+ * Optionally renders an embedded label: `── label ───────────`.
6
+ *
7
+ * Note: When used from extensions loaded via jiti, the global `theme` may be undefined
8
+ * because jiti creates a separate module cache. Always pass an explicit color
9
+ * function when using DynamicBorder in components exported for extension use.
10
+ */
11
+ export class DynamicBorder {
12
+ color;
13
+ label;
14
+ constructor(color = (str) => theme.fg("border", str), label) {
15
+ this.color = color;
16
+ this.label = label;
17
+ }
18
+ setLabel(label) {
19
+ this.label = label;
20
+ }
21
+ invalidate() {
22
+ // No cached state to invalidate currently
23
+ }
24
+ render(width) {
25
+ const w = Math.max(1, width);
26
+ if (!this.label)
27
+ return [this.color("─".repeat(w))];
28
+ const labelLen = [...this.label].length;
29
+ // Too narrow for `── label ─` — fall back to a plain rule.
30
+ if (w < labelLen + 6)
31
+ return [this.color("─".repeat(w))];
32
+ const fill = w - labelLen - 4;
33
+ return [this.color("── ") + theme.bold(theme.fg("muted", this.label)) + this.color(` ${"─".repeat(fill)}`)];
34
+ }
35
+ }
36
+ //# sourceMappingURL=dynamic-border.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-border.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/dynamic-border.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IACjB,KAAK,CAA0B;IAC/B,KAAK,CAAqB;IAElC,YAAY,KAAK,GAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAc,EAAE;QAC9F,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAAA,CACnB;IAED,QAAQ,CAAC,KAAyB,EAAQ;QACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAAA,CACnB;IAED,UAAU,GAAS;QAClB,0CAA0C;IADvB,CAEnB;IAED,MAAM,CAAC,KAAa,EAAY;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QACxC,mEAA2D;QAC3D,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAAA,CAC5G;CACD","sourcesContent":["import type { Component } from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Dynamic border component that adjusts to viewport width.\n *\n * Optionally renders an embedded label: `── label ───────────`.\n *\n * Note: When used from extensions loaded via jiti, the global `theme` may be undefined\n * because jiti creates a separate module cache. Always pass an explicit color\n * function when using DynamicBorder in components exported for extension use.\n */\nexport class DynamicBorder implements Component {\n\tprivate color: (str: string) => string;\n\tprivate label: string | undefined;\n\n\tconstructor(color: (str: string) => string = (str) => theme.fg(\"border\", str), label?: string) {\n\t\tthis.color = color;\n\t\tthis.label = label;\n\t}\n\n\tsetLabel(label: string | undefined): void {\n\t\tthis.label = label;\n\t}\n\n\tinvalidate(): void {\n\t\t// No cached state to invalidate currently\n\t}\n\n\trender(width: number): string[] {\n\t\tconst w = Math.max(1, width);\n\t\tif (!this.label) return [this.color(\"─\".repeat(w))];\n\t\tconst labelLen = [...this.label].length;\n\t\t// Too narrow for `── label ─` — fall back to a plain rule.\n\t\tif (w < labelLen + 6) return [this.color(\"─\".repeat(w))];\n\t\tconst fill = w - labelLen - 4;\n\t\treturn [this.color(\"── \") + theme.bold(theme.fg(\"muted\", this.label)) + this.color(` ${\"─\".repeat(fill)}`)];\n\t}\n}\n"]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Multi-line editor component for extensions.
3
+ * Supports Ctrl+G for external editor.
4
+ */
5
+ import { Container, type EditorOptions, type Focusable, type TUI } from "@earendil-works/pi-tui";
6
+ import type { KeybindingsManager } from "../../../core/keybindings.ts";
7
+ export declare class ExtensionEditorComponent extends Container implements Focusable {
8
+ private editor;
9
+ private onSubmitCallback;
10
+ private onCancelCallback;
11
+ private tui;
12
+ private keybindings;
13
+ private externalEditorCommand;
14
+ private _focused;
15
+ get focused(): boolean;
16
+ set focused(value: boolean);
17
+ constructor(tui: TUI, keybindings: KeybindingsManager, title: string, prefill: string | undefined, onSubmit: (value: string) => void, onCancel: () => void, options?: EditorOptions, externalEditorCommand?: string);
18
+ handleInput(keyData: string): void;
19
+ private handleOpenExternalEditor;
20
+ }
21
+ //# sourceMappingURL=extension-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-editor.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-editor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,SAAS,EAET,KAAK,aAAa,EAClB,KAAK,SAAS,EAId,KAAK,GAAG,EACR,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAMvE,qBAAa,wBAAyB,SAAQ,SAAU,YAAW,SAAS;IAC3E,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,qBAAqB,CAAS;IAEtC,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,YACC,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,kBAAkB,EAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACjC,QAAQ,EAAE,MAAM,IAAI,EACpB,OAAO,CAAC,EAAE,aAAa,EACvB,qBAAqB,CAAC,EAAE,MAAM,EAiD9B;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAgBjC;YAEa,wBAAwB;CAgBtC","sourcesContent":["/**\n * Multi-line editor component for extensions.\n * Supports Ctrl+G for external editor.\n */\n\nimport {\n\tContainer,\n\tEditor,\n\ttype EditorOptions,\n\ttype Focusable,\n\tgetKeybindings,\n\tSpacer,\n\tText,\n\ttype TUI,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { editInExternalEditor } from \"../external-editor.ts\";\nimport { getEditorTheme, theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint } from \"./keybinding-hints.ts\";\n\nexport class ExtensionEditorComponent extends Container implements Focusable {\n\tprivate editor: Editor;\n\tprivate onSubmitCallback: (value: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate tui: TUI;\n\tprivate keybindings: KeybindingsManager;\n\tprivate externalEditorCommand: string;\n\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.editor.focused = value;\n\t}\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tkeybindings: KeybindingsManager,\n\t\ttitle: string,\n\t\tprefill: string | undefined,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t\toptions?: EditorOptions,\n\t\texternalEditorCommand?: string,\n\t) {\n\t\tsuper();\n\n\t\tthis.tui = tui;\n\t\tthis.keybindings = keybindings;\n\t\tthis.externalEditorCommand =\n\t\t\texternalEditorCommand ||\n\t\t\tprocess.env.VISUAL ||\n\t\t\tprocess.env.EDITOR ||\n\t\t\t(process.platform === \"win32\" ? \"notepad\" : \"nano\");\n\t\tthis.onSubmitCallback = onSubmit;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tthis.addChild(new Text(theme.fg(\"accent\", title), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create editor\n\t\tthis.editor = new Editor(tui, getEditorTheme(), options);\n\t\tif (prefill) {\n\t\t\tthis.editor.setText(prefill);\n\t\t}\n\t\t// Wire up Enter to submit (Shift+Enter for newlines, like the main editor)\n\t\tthis.editor.onSubmit = (text: string) => {\n\t\t\tthis.onSubmitCallback(text);\n\t\t};\n\t\tthis.addChild(this.editor);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add hint\n\t\tconst hint =\n\t\t\tkeyHint(\"tui.select.confirm\", \"submit\") +\n\t\t\t\" \" +\n\t\t\tkeyHint(\"tui.input.newLine\", \"newline\") +\n\t\t\t\" \" +\n\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\") +\n\t\t\t` ${keyHint(\"app.editor.external\", \"external editor\")}`;\n\t\tthis.addChild(new Text(hint, 1, 0));\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\t// Escape or Ctrl+C to cancel\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t\treturn;\n\t\t}\n\n\t\t// External editor (app keybinding)\n\t\tif (this.keybindings.matches(keyData, \"app.editor.external\")) {\n\t\t\tvoid this.handleOpenExternalEditor();\n\t\t\treturn;\n\t\t}\n\n\t\t// Forward to editor\n\t\tthis.editor.handleInput(keyData);\n\t}\n\n\tprivate async handleOpenExternalEditor(): Promise<void> {\n\t\tconst content = this.editor.getText();\n\t\tthis.tui.stop();\n\t\ttry {\n\t\t\tconst result = await editInExternalEditor({\n\t\t\t\tcommand: this.externalEditorCommand,\n\t\t\t\tcontent,\n\t\t\t});\n\t\t\tif (result.status === \"complete\") {\n\t\t\t\tthis.editor.setText(result.content);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.tui.start();\n\t\t\tthis.tui.requestRender(true);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Multi-line editor component for extensions.
3
+ * Supports Ctrl+G for external editor.
4
+ */
5
+ import { Container, Editor, getKeybindings, Spacer, Text, } from "@earendil-works/pi-tui";
6
+ import { editInExternalEditor } from "../external-editor.js";
7
+ import { getEditorTheme, theme } from "../theme/theme.js";
8
+ import { DynamicBorder } from "./dynamic-border.js";
9
+ import { keyHint } from "./keybinding-hints.js";
10
+ export class ExtensionEditorComponent extends Container {
11
+ editor;
12
+ onSubmitCallback;
13
+ onCancelCallback;
14
+ tui;
15
+ keybindings;
16
+ externalEditorCommand;
17
+ _focused = false;
18
+ get focused() {
19
+ return this._focused;
20
+ }
21
+ set focused(value) {
22
+ this._focused = value;
23
+ this.editor.focused = value;
24
+ }
25
+ constructor(tui, keybindings, title, prefill, onSubmit, onCancel, options, externalEditorCommand) {
26
+ super();
27
+ this.tui = tui;
28
+ this.keybindings = keybindings;
29
+ this.externalEditorCommand =
30
+ externalEditorCommand ||
31
+ process.env.VISUAL ||
32
+ process.env.EDITOR ||
33
+ (process.platform === "win32" ? "notepad" : "nano");
34
+ this.onSubmitCallback = onSubmit;
35
+ this.onCancelCallback = onCancel;
36
+ // Add top border
37
+ this.addChild(new DynamicBorder());
38
+ this.addChild(new Spacer(1));
39
+ // Add title
40
+ this.addChild(new Text(theme.fg("accent", title), 1, 0));
41
+ this.addChild(new Spacer(1));
42
+ // Create editor
43
+ this.editor = new Editor(tui, getEditorTheme(), options);
44
+ if (prefill) {
45
+ this.editor.setText(prefill);
46
+ }
47
+ // Wire up Enter to submit (Shift+Enter for newlines, like the main editor)
48
+ this.editor.onSubmit = (text) => {
49
+ this.onSubmitCallback(text);
50
+ };
51
+ this.addChild(this.editor);
52
+ this.addChild(new Spacer(1));
53
+ // Add hint
54
+ const hint = keyHint("tui.select.confirm", "submit") +
55
+ " " +
56
+ keyHint("tui.input.newLine", "newline") +
57
+ " " +
58
+ keyHint("tui.select.cancel", "cancel") +
59
+ ` ${keyHint("app.editor.external", "external editor")}`;
60
+ this.addChild(new Text(hint, 1, 0));
61
+ this.addChild(new Spacer(1));
62
+ // Add bottom border
63
+ this.addChild(new DynamicBorder());
64
+ }
65
+ handleInput(keyData) {
66
+ const kb = getKeybindings();
67
+ // Escape or Ctrl+C to cancel
68
+ if (kb.matches(keyData, "tui.select.cancel")) {
69
+ this.onCancelCallback();
70
+ return;
71
+ }
72
+ // External editor (app keybinding)
73
+ if (this.keybindings.matches(keyData, "app.editor.external")) {
74
+ void this.handleOpenExternalEditor();
75
+ return;
76
+ }
77
+ // Forward to editor
78
+ this.editor.handleInput(keyData);
79
+ }
80
+ async handleOpenExternalEditor() {
81
+ const content = this.editor.getText();
82
+ this.tui.stop();
83
+ try {
84
+ const result = await editInExternalEditor({
85
+ command: this.externalEditorCommand,
86
+ content,
87
+ });
88
+ if (result.status === "complete") {
89
+ this.editor.setText(result.content);
90
+ }
91
+ }
92
+ finally {
93
+ this.tui.start();
94
+ this.tui.requestRender(true);
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=extension-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-editor.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-editor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Multi-line editor component for extensions.\n * Supports Ctrl+G for external editor.\n */\n\nimport {\n\tContainer,\n\tEditor,\n\ttype EditorOptions,\n\ttype Focusable,\n\tgetKeybindings,\n\tSpacer,\n\tText,\n\ttype TUI,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { editInExternalEditor } from \"../external-editor.ts\";\nimport { getEditorTheme, theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint } from \"./keybinding-hints.ts\";\n\nexport class ExtensionEditorComponent extends Container implements Focusable {\n\tprivate editor: Editor;\n\tprivate onSubmitCallback: (value: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate tui: TUI;\n\tprivate keybindings: KeybindingsManager;\n\tprivate externalEditorCommand: string;\n\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.editor.focused = value;\n\t}\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tkeybindings: KeybindingsManager,\n\t\ttitle: string,\n\t\tprefill: string | undefined,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t\toptions?: EditorOptions,\n\t\texternalEditorCommand?: string,\n\t) {\n\t\tsuper();\n\n\t\tthis.tui = tui;\n\t\tthis.keybindings = keybindings;\n\t\tthis.externalEditorCommand =\n\t\t\texternalEditorCommand ||\n\t\t\tprocess.env.VISUAL ||\n\t\t\tprocess.env.EDITOR ||\n\t\t\t(process.platform === \"win32\" ? \"notepad\" : \"nano\");\n\t\tthis.onSubmitCallback = onSubmit;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tthis.addChild(new Text(theme.fg(\"accent\", title), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create editor\n\t\tthis.editor = new Editor(tui, getEditorTheme(), options);\n\t\tif (prefill) {\n\t\t\tthis.editor.setText(prefill);\n\t\t}\n\t\t// Wire up Enter to submit (Shift+Enter for newlines, like the main editor)\n\t\tthis.editor.onSubmit = (text: string) => {\n\t\t\tthis.onSubmitCallback(text);\n\t\t};\n\t\tthis.addChild(this.editor);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add hint\n\t\tconst hint =\n\t\t\tkeyHint(\"tui.select.confirm\", \"submit\") +\n\t\t\t\" \" +\n\t\t\tkeyHint(\"tui.input.newLine\", \"newline\") +\n\t\t\t\" \" +\n\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\") +\n\t\t\t` ${keyHint(\"app.editor.external\", \"external editor\")}`;\n\t\tthis.addChild(new Text(hint, 1, 0));\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\t// Escape or Ctrl+C to cancel\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t\treturn;\n\t\t}\n\n\t\t// External editor (app keybinding)\n\t\tif (this.keybindings.matches(keyData, \"app.editor.external\")) {\n\t\t\tvoid this.handleOpenExternalEditor();\n\t\t\treturn;\n\t\t}\n\n\t\t// Forward to editor\n\t\tthis.editor.handleInput(keyData);\n\t}\n\n\tprivate async handleOpenExternalEditor(): Promise<void> {\n\t\tconst content = this.editor.getText();\n\t\tthis.tui.stop();\n\t\ttry {\n\t\t\tconst result = await editInExternalEditor({\n\t\t\t\tcommand: this.externalEditorCommand,\n\t\t\t\tcontent,\n\t\t\t});\n\t\t\tif (result.status === \"complete\") {\n\t\t\t\tthis.editor.setText(result.content);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.tui.start();\n\t\t\tthis.tui.requestRender(true);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Simple text input component for extensions.
3
+ */
4
+ import { Container, type Focusable, type TUI } from "@earendil-works/pi-tui";
5
+ export interface ExtensionInputOptions {
6
+ tui?: TUI;
7
+ timeout?: number;
8
+ }
9
+ export declare class ExtensionInputComponent extends Container implements Focusable {
10
+ private input;
11
+ private onSubmitCallback;
12
+ private onCancelCallback;
13
+ private titleText;
14
+ private baseTitle;
15
+ private countdown;
16
+ private _focused;
17
+ get focused(): boolean;
18
+ set focused(value: boolean);
19
+ constructor(title: string, _placeholder: string | undefined, onSubmit: (value: string) => void, onCancel: () => void, opts?: ExtensionInputOptions);
20
+ handleInput(keyData: string): void;
21
+ dispose(): void;
22
+ }
23
+ //# sourceMappingURL=extension-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-input.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-input.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAuC,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAMlH,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,uBAAwB,SAAQ,SAAU,YAAW,SAAS;IAC1E,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAA6B;IAG9C,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,YACC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACjC,QAAQ,EAAE,MAAM,IAAI,EACpB,IAAI,CAAC,EAAE,qBAAqB,EAgC5B;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CASjC;IAED,OAAO,IAAI,IAAI,CAEd;CACD","sourcesContent":["/**\n * Simple text input component for extensions.\n */\n\nimport { Container, type Focusable, getKeybindings, Input, Spacer, Text, type TUI } from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { CountdownTimer } from \"./countdown-timer.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint } from \"./keybinding-hints.ts\";\n\nexport interface ExtensionInputOptions {\n\ttui?: TUI;\n\ttimeout?: number;\n}\n\nexport class ExtensionInputComponent extends Container implements Focusable {\n\tprivate input: Input;\n\tprivate onSubmitCallback: (value: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate titleText: Text;\n\tprivate baseTitle: string;\n\tprivate countdown: CountdownTimer | undefined;\n\n\t// Focusable implementation - propagate to input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttitle: string,\n\t\t_placeholder: string | undefined,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t\topts?: ExtensionInputOptions,\n\t) {\n\t\tsuper();\n\n\t\tthis.onSubmitCallback = onSubmit;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.baseTitle = title;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.titleText = new Text(theme.fg(\"accent\", title), 1, 0);\n\t\tthis.addChild(this.titleText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (opts?.timeout && opts.timeout > 0 && opts.tui) {\n\t\t\tthis.countdown = new CountdownTimer(\n\t\t\t\topts.timeout,\n\t\t\t\topts.tui,\n\t\t\t\t(s) => this.titleText.setText(theme.fg(\"accent\", `${this.baseTitle} (${s}s)`)),\n\t\t\t\t() => this.onCancelCallback(),\n\t\t\t);\n\t\t}\n\n\t\tthis.input = new Input();\n\t\tthis.addChild(this.input);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(`${keyHint(\"tui.select.confirm\", \"submit\")} ${keyHint(\"tui.select.cancel\", \"cancel\")}`, 1, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tthis.onSubmitCallback(this.input.getValue());\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t} else {\n\t\t\tthis.input.handleInput(keyData);\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.countdown?.dispose();\n\t}\n}\n"]}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Simple text input component for extensions.
3
+ */
4
+ import { Container, getKeybindings, Input, Spacer, Text } from "@earendil-works/pi-tui";
5
+ import { theme } from "../theme/theme.js";
6
+ import { CountdownTimer } from "./countdown-timer.js";
7
+ import { DynamicBorder } from "./dynamic-border.js";
8
+ import { keyHint } from "./keybinding-hints.js";
9
+ export class ExtensionInputComponent extends Container {
10
+ input;
11
+ onSubmitCallback;
12
+ onCancelCallback;
13
+ titleText;
14
+ baseTitle;
15
+ countdown;
16
+ // Focusable implementation - propagate to input for IME cursor positioning
17
+ _focused = false;
18
+ get focused() {
19
+ return this._focused;
20
+ }
21
+ set focused(value) {
22
+ this._focused = value;
23
+ this.input.focused = value;
24
+ }
25
+ constructor(title, _placeholder, onSubmit, onCancel, opts) {
26
+ super();
27
+ this.onSubmitCallback = onSubmit;
28
+ this.onCancelCallback = onCancel;
29
+ this.baseTitle = title;
30
+ this.addChild(new DynamicBorder());
31
+ this.addChild(new Spacer(1));
32
+ this.titleText = new Text(theme.fg("accent", title), 1, 0);
33
+ this.addChild(this.titleText);
34
+ this.addChild(new Spacer(1));
35
+ if (opts?.timeout && opts.timeout > 0 && opts.tui) {
36
+ this.countdown = new CountdownTimer(opts.timeout, opts.tui, (s) => this.titleText.setText(theme.fg("accent", `${this.baseTitle} (${s}s)`)), () => this.onCancelCallback());
37
+ }
38
+ this.input = new Input();
39
+ this.addChild(this.input);
40
+ this.addChild(new Spacer(1));
41
+ this.addChild(new Text(`${keyHint("tui.select.confirm", "submit")} ${keyHint("tui.select.cancel", "cancel")}`, 1, 0));
42
+ this.addChild(new Spacer(1));
43
+ this.addChild(new DynamicBorder());
44
+ }
45
+ handleInput(keyData) {
46
+ const kb = getKeybindings();
47
+ if (kb.matches(keyData, "tui.select.confirm") || keyData === "\n") {
48
+ this.onSubmitCallback(this.input.getValue());
49
+ }
50
+ else if (kb.matches(keyData, "tui.select.cancel")) {
51
+ this.onCancelCallback();
52
+ }
53
+ else {
54
+ this.input.handleInput(keyData);
55
+ }
56
+ }
57
+ dispose() {
58
+ this.countdown?.dispose();
59
+ }
60
+ }
61
+ //# sourceMappingURL=extension-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-input.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-input.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Simple text input component for extensions.\n */\n\nimport { Container, type Focusable, getKeybindings, Input, Spacer, Text, type TUI } from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { CountdownTimer } from \"./countdown-timer.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint } from \"./keybinding-hints.ts\";\n\nexport interface ExtensionInputOptions {\n\ttui?: TUI;\n\ttimeout?: number;\n}\n\nexport class ExtensionInputComponent extends Container implements Focusable {\n\tprivate input: Input;\n\tprivate onSubmitCallback: (value: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate titleText: Text;\n\tprivate baseTitle: string;\n\tprivate countdown: CountdownTimer | undefined;\n\n\t// Focusable implementation - propagate to input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttitle: string,\n\t\t_placeholder: string | undefined,\n\t\tonSubmit: (value: string) => void,\n\t\tonCancel: () => void,\n\t\topts?: ExtensionInputOptions,\n\t) {\n\t\tsuper();\n\n\t\tthis.onSubmitCallback = onSubmit;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.baseTitle = title;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.titleText = new Text(theme.fg(\"accent\", title), 1, 0);\n\t\tthis.addChild(this.titleText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (opts?.timeout && opts.timeout > 0 && opts.tui) {\n\t\t\tthis.countdown = new CountdownTimer(\n\t\t\t\topts.timeout,\n\t\t\t\topts.tui,\n\t\t\t\t(s) => this.titleText.setText(theme.fg(\"accent\", `${this.baseTitle} (${s}s)`)),\n\t\t\t\t() => this.onCancelCallback(),\n\t\t\t);\n\t\t}\n\n\t\tthis.input = new Input();\n\t\tthis.addChild(this.input);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(`${keyHint(\"tui.select.confirm\", \"submit\")} ${keyHint(\"tui.select.cancel\", \"cancel\")}`, 1, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tthis.onSubmitCallback(this.input.getValue());\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t} else {\n\t\t\tthis.input.handleInput(keyData);\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.countdown?.dispose();\n\t}\n}\n"]}