@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,26 @@
1
+ /**
2
+ * Generic selector component for extensions.
3
+ * Displays a list of string options with keyboard navigation.
4
+ */
5
+ import { Container, type TUI } from "@earendil-works/pi-tui";
6
+ export interface ExtensionSelectorOptions {
7
+ tui?: TUI;
8
+ timeout?: number;
9
+ onToggleToolsExpanded?: () => void;
10
+ }
11
+ export declare class ExtensionSelectorComponent extends Container {
12
+ private options;
13
+ private selectedIndex;
14
+ private listContainer;
15
+ private onSelectCallback;
16
+ private onCancelCallback;
17
+ private titleText;
18
+ private baseTitle;
19
+ private countdown;
20
+ private onToggleToolsExpanded;
21
+ constructor(title: string, options: string[], onSelect: (option: string) => void, onCancel: () => void, opts?: ExtensionSelectorOptions);
22
+ private updateList;
23
+ handleInput(keyData: string): void;
24
+ dispose(): void;
25
+ }
26
+ //# sourceMappingURL=extension-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-selector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAgC,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAM3F,MAAM,WAAW,wBAAwB;IACxC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;CACnC;AAED,qBAAa,0BAA2B,SAAQ,SAAS;IACxD,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,gBAAgB,CAA2B;IACnD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,qBAAqB,CAA2B;IAExD,YACC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAClC,QAAQ,EAAE,MAAM,IAAI,EACpB,IAAI,CAAC,EAAE,wBAAwB,EA4C/B;IAED,OAAO,CAAC,UAAU;IAWlB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAgBjC;IAED,OAAO,IAAI,IAAI,CAEd;CACD","sourcesContent":["/**\n * Generic selector component for extensions.\n * Displays a list of string options with keyboard navigation.\n */\n\nimport { Container, getKeybindings, 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, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface ExtensionSelectorOptions {\n\ttui?: TUI;\n\ttimeout?: number;\n\tonToggleToolsExpanded?: () => void;\n}\n\nexport class ExtensionSelectorComponent extends Container {\n\tprivate options: string[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onSelectCallback: (option: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate titleText: Text;\n\tprivate baseTitle: string;\n\tprivate countdown: CountdownTimer | undefined;\n\tprivate onToggleToolsExpanded: (() => void) | undefined;\n\n\tconstructor(\n\t\ttitle: string,\n\t\toptions: string[],\n\t\tonSelect: (option: string) => void,\n\t\tonCancel: () => void,\n\t\topts?: ExtensionSelectorOptions,\n\t) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.onToggleToolsExpanded = opts?.onToggleToolsExpanded;\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\", theme.bold(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\", theme.bold(`${this.baseTitle} (${s}s)`))),\n\t\t\t\t() => this.onCancelCallback(),\n\t\t\t);\n\t\t}\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"select\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.options.length; i++) {\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst text = isSelected\n\t\t\t\t? theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", this.options[i])\n\t\t\t\t: ` ${theme.fg(\"text\", this.options[i])}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"app.tools.expand\")) {\n\t\t\tthis.onToggleToolsExpanded?.();\n\t\t} else if (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(this.options.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tconst selected = this.options[this.selectedIndex];\n\t\t\tif (selected) this.onSelectCallback(selected);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.countdown?.dispose();\n\t}\n}\n"]}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Generic selector component for extensions.
3
+ * Displays a list of string options with keyboard navigation.
4
+ */
5
+ import { Container, getKeybindings, Spacer, Text } from "@earendil-works/pi-tui";
6
+ import { theme } from "../theme/theme.js";
7
+ import { CountdownTimer } from "./countdown-timer.js";
8
+ import { DynamicBorder } from "./dynamic-border.js";
9
+ import { keyHint, rawKeyHint } from "./keybinding-hints.js";
10
+ export class ExtensionSelectorComponent extends Container {
11
+ options;
12
+ selectedIndex = 0;
13
+ listContainer;
14
+ onSelectCallback;
15
+ onCancelCallback;
16
+ titleText;
17
+ baseTitle;
18
+ countdown;
19
+ onToggleToolsExpanded;
20
+ constructor(title, options, onSelect, onCancel, opts) {
21
+ super();
22
+ this.options = options;
23
+ this.onSelectCallback = onSelect;
24
+ this.onCancelCallback = onCancel;
25
+ this.onToggleToolsExpanded = opts?.onToggleToolsExpanded;
26
+ this.baseTitle = title;
27
+ this.addChild(new DynamicBorder());
28
+ this.addChild(new Spacer(1));
29
+ this.titleText = new Text(theme.fg("accent", theme.bold(title)), 1, 0);
30
+ this.addChild(this.titleText);
31
+ this.addChild(new Spacer(1));
32
+ if (opts?.timeout && opts.timeout > 0 && opts.tui) {
33
+ this.countdown = new CountdownTimer(opts.timeout, opts.tui, (s) => this.titleText.setText(theme.fg("accent", theme.bold(`${this.baseTitle} (${s}s)`))), () => this.onCancelCallback());
34
+ }
35
+ this.listContainer = new Container();
36
+ this.addChild(this.listContainer);
37
+ this.addChild(new Spacer(1));
38
+ this.addChild(new Text(rawKeyHint("↑↓", "navigate") +
39
+ " " +
40
+ keyHint("tui.select.confirm", "select") +
41
+ " " +
42
+ keyHint("tui.select.cancel", "cancel"), 1, 0));
43
+ this.addChild(new Spacer(1));
44
+ this.addChild(new DynamicBorder());
45
+ this.updateList();
46
+ }
47
+ updateList() {
48
+ this.listContainer.clear();
49
+ for (let i = 0; i < this.options.length; i++) {
50
+ const isSelected = i === this.selectedIndex;
51
+ const text = isSelected
52
+ ? theme.fg("accent", "→ ") + theme.fg("accent", this.options[i])
53
+ : ` ${theme.fg("text", this.options[i])}`;
54
+ this.listContainer.addChild(new Text(text, 1, 0));
55
+ }
56
+ }
57
+ handleInput(keyData) {
58
+ const kb = getKeybindings();
59
+ if (kb.matches(keyData, "app.tools.expand")) {
60
+ this.onToggleToolsExpanded?.();
61
+ }
62
+ else if (kb.matches(keyData, "tui.select.up") || keyData === "k") {
63
+ this.selectedIndex = Math.max(0, this.selectedIndex - 1);
64
+ this.updateList();
65
+ }
66
+ else if (kb.matches(keyData, "tui.select.down") || keyData === "j") {
67
+ this.selectedIndex = Math.min(this.options.length - 1, this.selectedIndex + 1);
68
+ this.updateList();
69
+ }
70
+ else if (kb.matches(keyData, "tui.select.confirm") || keyData === "\n") {
71
+ const selected = this.options[this.selectedIndex];
72
+ if (selected)
73
+ this.onSelectCallback(selected);
74
+ }
75
+ else if (kb.matches(keyData, "tui.select.cancel")) {
76
+ this.onCancelCallback();
77
+ }
78
+ }
79
+ dispose() {
80
+ this.countdown?.dispose();
81
+ }
82
+ }
83
+ //# sourceMappingURL=extension-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-selector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAY,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,MAAM,OAAO,0BAA2B,SAAQ,SAAS;IAChD,OAAO,CAAW;IAClB,aAAa,GAAG,CAAC,CAAC;IAClB,aAAa,CAAY;IACzB,gBAAgB,CAA2B;IAC3C,gBAAgB,CAAa;IAC7B,SAAS,CAAO;IAChB,SAAS,CAAS;IAClB,SAAS,CAA6B;IACtC,qBAAqB,CAA2B;IAExD,YACC,KAAa,EACb,OAAiB,EACjB,QAAkC,EAClC,QAAoB,EACpB,IAA+B,EAC9B;QACD,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,qBAAqB,GAAG,IAAI,EAAE,qBAAqB,CAAC;QACzD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACnD,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAClC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,GAAG,EACR,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAC1F,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAC7B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CACZ,IAAI,IAAI,CACP,UAAU,CAAC,QAAI,EAAE,UAAU,CAAC;YAC3B,IAAI;YACJ,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC;YACvC,IAAI;YACJ,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,EACvC,CAAC,EACD,CAAC,CACD,CACD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,UAAU,EAAE,CAAC;IAAA,CAClB;IAEO,UAAU,GAAS;QAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC;YAC5C,MAAM,IAAI,GAAG,UAAU;gBACtB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IAAA,CACD;IAED,WAAW,CAAC,OAAe,EAAQ;QAClC,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;QAC5B,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACtE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,UAAU,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClD,IAAI,QAAQ;gBAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzB,CAAC;IAAA,CACD;IAED,OAAO,GAAS;QACf,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IAAA,CAC1B;CACD","sourcesContent":["/**\n * Generic selector component for extensions.\n * Displays a list of string options with keyboard navigation.\n */\n\nimport { Container, getKeybindings, 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, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface ExtensionSelectorOptions {\n\ttui?: TUI;\n\ttimeout?: number;\n\tonToggleToolsExpanded?: () => void;\n}\n\nexport class ExtensionSelectorComponent extends Container {\n\tprivate options: string[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onSelectCallback: (option: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate titleText: Text;\n\tprivate baseTitle: string;\n\tprivate countdown: CountdownTimer | undefined;\n\tprivate onToggleToolsExpanded: (() => void) | undefined;\n\n\tconstructor(\n\t\ttitle: string,\n\t\toptions: string[],\n\t\tonSelect: (option: string) => void,\n\t\tonCancel: () => void,\n\t\topts?: ExtensionSelectorOptions,\n\t) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.onToggleToolsExpanded = opts?.onToggleToolsExpanded;\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\", theme.bold(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\", theme.bold(`${this.baseTitle} (${s}s)`))),\n\t\t\t\t() => this.onCancelCallback(),\n\t\t\t);\n\t\t}\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"select\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.options.length; i++) {\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst text = isSelected\n\t\t\t\t? theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", this.options[i])\n\t\t\t\t: ` ${theme.fg(\"text\", this.options[i])}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"app.tools.expand\")) {\n\t\t\tthis.onToggleToolsExpanded?.();\n\t\t} else if (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(this.options.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tconst selected = this.options[this.selectedIndex];\n\t\t\tif (selected) this.onSelectCallback(selected);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.countdown?.dispose();\n\t}\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { Container } from "@earendil-works/pi-tui";
2
+ import { type TerminalTheme } from "../theme/theme.ts";
3
+ export interface FirstTimeSetupResult {
4
+ theme: TerminalTheme;
5
+ shareAnalytics: boolean;
6
+ }
7
+ export interface FirstTimeSetupOptions {
8
+ detectedTheme: TerminalTheme;
9
+ onThemePreview: (themeName: TerminalTheme) => void;
10
+ onSubmit: (result: FirstTimeSetupResult) => void;
11
+ onCancel: () => void;
12
+ }
13
+ /** First-time setup dialog: theme choice and analytics opt-in. */
14
+ export declare class FirstTimeSetupComponent extends Container {
15
+ private step;
16
+ private themeIndex;
17
+ private analyticsIndex;
18
+ private readonly options;
19
+ constructor(options: FirstTimeSetupOptions);
20
+ private update;
21
+ private addOptionList;
22
+ private moveSelection;
23
+ handleInput(keyData: string): void;
24
+ }
25
+ //# sourceMappingURL=first-time-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-time-setup.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/first-time-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgC,MAAM,wBAAwB,CAAC;AAEjF,OAAO,EAAE,KAAK,aAAa,EAAS,MAAM,mBAAmB,CAAC;AAK9D,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,aAAa,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACjD,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAYD,kEAAkE;AAClE,qBAAa,uBAAwB,SAAQ,SAAS;IACrD,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAEhD,YAAY,OAAO,EAAE,qBAAqB,EAQzC;IAGD,OAAO,CAAC,MAAM;IAsDd,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;IAarB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAmBjC;CACD","sourcesContent":["import { Container, getKeybindings, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport { APP_NAME } from \"../../../config.ts\";\nimport { type TerminalTheme, theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\nimport { renderLogo } from \"./nexus-logo.ts\";\n\nexport interface FirstTimeSetupResult {\n\ttheme: TerminalTheme;\n\tshareAnalytics: boolean;\n}\n\nexport interface FirstTimeSetupOptions {\n\tdetectedTheme: TerminalTheme;\n\tonThemePreview: (themeName: TerminalTheme) => void;\n\tonSubmit: (result: FirstTimeSetupResult) => void;\n\tonCancel: () => void;\n}\n\nconst THEME_OPTIONS: Array<{ value: TerminalTheme; label: string }> = [\n\t{ value: \"dark\", label: \"Dark\" },\n\t{ value: \"light\", label: \"Light\" },\n];\n\nconst ANALYTICS_OPTIONS: Array<{ value: boolean; label: string }> = [\n\t{ value: true, label: \"Share anonymous usage data\" },\n\t{ value: false, label: \"Don't share\" },\n];\n\n/** First-time setup dialog: theme choice and analytics opt-in. */\nexport class FirstTimeSetupComponent extends Container {\n\tprivate step: \"theme\" | \"analytics\" = \"theme\";\n\tprivate themeIndex: number;\n\tprivate analyticsIndex = 0;\n\tprivate readonly options: FirstTimeSetupOptions;\n\n\tconstructor(options: FirstTimeSetupOptions) {\n\t\tsuper();\n\t\tthis.options = options;\n\t\tthis.themeIndex = Math.max(\n\t\t\t0,\n\t\t\tTHEME_OPTIONS.findIndex((option) => option.value === options.detectedTheme),\n\t\t);\n\t\tthis.update();\n\t}\n\n\t// Rebuild the whole dialog on every change so theme previews recolor all text.\n\tprivate update(): void {\n\t\tthis.clear();\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(renderLogo(Math.max(40, (process.stdout.columns ?? 80) - 4)).join(\"\\n\"), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(theme.fg(\"accent\", theme.bold(`Welcome to ${APP_NAME}, the minimal coding agent.`)), 1, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (this.step === \"theme\") {\n\t\t\tthis.addChild(new Text(theme.fg(\"text\", \"Pick a theme.\"), 1, 0));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", `Detected system appearance: ${this.options.detectedTheme}`), 1, 0));\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addOptionList(\n\t\t\t\tTHEME_OPTIONS.map((option) => option.label),\n\t\t\t\tthis.themeIndex,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.addChild(new Text(theme.fg(\"text\", \"Opt-in to anonymous usage data sharing?\"), 1, 0));\n\t\t\tthis.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"muted\",\n\t\t\t\t\t\t\"Opting in stores a tracking identifier in settings.json and enables anonymous\\nusage analytics. This helps us to better debug, reproduce, and resolve issues\\nand bugs within nexus. You can observe what is shared using /privacy and make\\nchanges anytime in settings.json.\",\n\t\t\t\t\t),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addOptionList(\n\t\t\t\tANALYTICS_OPTIONS.map((option) => option.label),\n\t\t\t\tthis.analyticsIndex,\n\t\t\t);\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", this.step === \"theme\" ? \"continue\" : \"finish\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"skip setup\"),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tprivate addOptionList(labels: string[], selectedIndex: number): void {\n\t\tfor (let i = 0; i < labels.length; i++) {\n\t\t\tconst isSelected = i === selectedIndex;\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst label = isSelected ? theme.fg(\"accent\", labels[i]) : theme.fg(\"text\", labels[i]);\n\t\t\tthis.addChild(new Text(`${prefix}${label}`, 1, 0));\n\t\t}\n\t}\n\n\tprivate moveSelection(delta: number): void {\n\t\tif (this.step === \"theme\") {\n\t\t\tconst next = Math.max(0, Math.min(THEME_OPTIONS.length - 1, this.themeIndex + delta));\n\t\t\tif (next !== this.themeIndex) {\n\t\t\t\tthis.themeIndex = next;\n\t\t\t\tthis.options.onThemePreview(THEME_OPTIONS[this.themeIndex].value);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.analyticsIndex = Math.max(0, Math.min(ANALYTICS_OPTIONS.length - 1, this.analyticsIndex + delta));\n\t\t}\n\t\tthis.update();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.moveSelection(-1);\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.moveSelection(1);\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tif (this.step === \"theme\") {\n\t\t\t\tthis.step = \"analytics\";\n\t\t\t\tthis.update();\n\t\t\t} else {\n\t\t\t\tthis.options.onSubmit({\n\t\t\t\t\ttheme: THEME_OPTIONS[this.themeIndex].value,\n\t\t\t\t\tshareAnalytics: ANALYTICS_OPTIONS[this.analyticsIndex].value,\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.options.onCancel();\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,103 @@
1
+ import { Container, getKeybindings, Spacer, Text } from "@earendil-works/pi-tui";
2
+ import { APP_NAME } from "../../../config.js";
3
+ import { theme } from "../theme/theme.js";
4
+ import { DynamicBorder } from "./dynamic-border.js";
5
+ import { keyHint, rawKeyHint } from "./keybinding-hints.js";
6
+ import { renderLogo } from "./nexus-logo.js";
7
+ const THEME_OPTIONS = [
8
+ { value: "dark", label: "Dark" },
9
+ { value: "light", label: "Light" },
10
+ ];
11
+ const ANALYTICS_OPTIONS = [
12
+ { value: true, label: "Share anonymous usage data" },
13
+ { value: false, label: "Don't share" },
14
+ ];
15
+ /** First-time setup dialog: theme choice and analytics opt-in. */
16
+ export class FirstTimeSetupComponent extends Container {
17
+ step = "theme";
18
+ themeIndex;
19
+ analyticsIndex = 0;
20
+ options;
21
+ constructor(options) {
22
+ super();
23
+ this.options = options;
24
+ this.themeIndex = Math.max(0, THEME_OPTIONS.findIndex((option) => option.value === options.detectedTheme));
25
+ this.update();
26
+ }
27
+ // Rebuild the whole dialog on every change so theme previews recolor all text.
28
+ update() {
29
+ this.clear();
30
+ this.addChild(new DynamicBorder());
31
+ this.addChild(new Spacer(1));
32
+ this.addChild(new Text(renderLogo(Math.max(40, (process.stdout.columns ?? 80) - 4)).join("\n"), 1, 0));
33
+ this.addChild(new Spacer(1));
34
+ this.addChild(new Text(theme.fg("accent", theme.bold(`Welcome to ${APP_NAME}, the minimal coding agent.`)), 1, 0));
35
+ this.addChild(new Spacer(1));
36
+ if (this.step === "theme") {
37
+ this.addChild(new Text(theme.fg("text", "Pick a theme."), 1, 0));
38
+ this.addChild(new Text(theme.fg("muted", `Detected system appearance: ${this.options.detectedTheme}`), 1, 0));
39
+ this.addChild(new Spacer(1));
40
+ this.addOptionList(THEME_OPTIONS.map((option) => option.label), this.themeIndex);
41
+ }
42
+ else {
43
+ this.addChild(new Text(theme.fg("text", "Opt-in to anonymous usage data sharing?"), 1, 0));
44
+ this.addChild(new Text(theme.fg("muted", "Opting in stores a tracking identifier in settings.json and enables anonymous\nusage analytics. This helps us to better debug, reproduce, and resolve issues\nand bugs within nexus. You can observe what is shared using /privacy and make\nchanges anytime in settings.json."), 1, 0));
45
+ this.addChild(new Spacer(1));
46
+ this.addOptionList(ANALYTICS_OPTIONS.map((option) => option.label), this.analyticsIndex);
47
+ }
48
+ this.addChild(new Spacer(1));
49
+ this.addChild(new Text(rawKeyHint("↑↓", "navigate") +
50
+ " " +
51
+ keyHint("tui.select.confirm", this.step === "theme" ? "continue" : "finish") +
52
+ " " +
53
+ keyHint("tui.select.cancel", "skip setup"), 1, 0));
54
+ this.addChild(new Spacer(1));
55
+ this.addChild(new DynamicBorder());
56
+ }
57
+ addOptionList(labels, selectedIndex) {
58
+ for (let i = 0; i < labels.length; i++) {
59
+ const isSelected = i === selectedIndex;
60
+ const prefix = isSelected ? theme.fg("accent", "→ ") : " ";
61
+ const label = isSelected ? theme.fg("accent", labels[i]) : theme.fg("text", labels[i]);
62
+ this.addChild(new Text(`${prefix}${label}`, 1, 0));
63
+ }
64
+ }
65
+ moveSelection(delta) {
66
+ if (this.step === "theme") {
67
+ const next = Math.max(0, Math.min(THEME_OPTIONS.length - 1, this.themeIndex + delta));
68
+ if (next !== this.themeIndex) {
69
+ this.themeIndex = next;
70
+ this.options.onThemePreview(THEME_OPTIONS[this.themeIndex].value);
71
+ }
72
+ }
73
+ else {
74
+ this.analyticsIndex = Math.max(0, Math.min(ANALYTICS_OPTIONS.length - 1, this.analyticsIndex + delta));
75
+ }
76
+ this.update();
77
+ }
78
+ handleInput(keyData) {
79
+ const kb = getKeybindings();
80
+ if (kb.matches(keyData, "tui.select.up") || keyData === "k") {
81
+ this.moveSelection(-1);
82
+ }
83
+ else if (kb.matches(keyData, "tui.select.down") || keyData === "j") {
84
+ this.moveSelection(1);
85
+ }
86
+ else if (kb.matches(keyData, "tui.select.confirm") || keyData === "\n") {
87
+ if (this.step === "theme") {
88
+ this.step = "analytics";
89
+ this.update();
90
+ }
91
+ else {
92
+ this.options.onSubmit({
93
+ theme: THEME_OPTIONS[this.themeIndex].value,
94
+ shareAnalytics: ANALYTICS_OPTIONS[this.analyticsIndex].value,
95
+ });
96
+ }
97
+ }
98
+ else if (kb.matches(keyData, "tui.select.cancel")) {
99
+ this.options.onCancel();
100
+ }
101
+ }
102
+ }
103
+ //# sourceMappingURL=first-time-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-time-setup.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/first-time-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, getKeybindings, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport { APP_NAME } from \"../../../config.ts\";\nimport { type TerminalTheme, theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\nimport { renderLogo } from \"./nexus-logo.ts\";\n\nexport interface FirstTimeSetupResult {\n\ttheme: TerminalTheme;\n\tshareAnalytics: boolean;\n}\n\nexport interface FirstTimeSetupOptions {\n\tdetectedTheme: TerminalTheme;\n\tonThemePreview: (themeName: TerminalTheme) => void;\n\tonSubmit: (result: FirstTimeSetupResult) => void;\n\tonCancel: () => void;\n}\n\nconst THEME_OPTIONS: Array<{ value: TerminalTheme; label: string }> = [\n\t{ value: \"dark\", label: \"Dark\" },\n\t{ value: \"light\", label: \"Light\" },\n];\n\nconst ANALYTICS_OPTIONS: Array<{ value: boolean; label: string }> = [\n\t{ value: true, label: \"Share anonymous usage data\" },\n\t{ value: false, label: \"Don't share\" },\n];\n\n/** First-time setup dialog: theme choice and analytics opt-in. */\nexport class FirstTimeSetupComponent extends Container {\n\tprivate step: \"theme\" | \"analytics\" = \"theme\";\n\tprivate themeIndex: number;\n\tprivate analyticsIndex = 0;\n\tprivate readonly options: FirstTimeSetupOptions;\n\n\tconstructor(options: FirstTimeSetupOptions) {\n\t\tsuper();\n\t\tthis.options = options;\n\t\tthis.themeIndex = Math.max(\n\t\t\t0,\n\t\t\tTHEME_OPTIONS.findIndex((option) => option.value === options.detectedTheme),\n\t\t);\n\t\tthis.update();\n\t}\n\n\t// Rebuild the whole dialog on every change so theme previews recolor all text.\n\tprivate update(): void {\n\t\tthis.clear();\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(renderLogo(Math.max(40, (process.stdout.columns ?? 80) - 4)).join(\"\\n\"), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(theme.fg(\"accent\", theme.bold(`Welcome to ${APP_NAME}, the minimal coding agent.`)), 1, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (this.step === \"theme\") {\n\t\t\tthis.addChild(new Text(theme.fg(\"text\", \"Pick a theme.\"), 1, 0));\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", `Detected system appearance: ${this.options.detectedTheme}`), 1, 0));\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addOptionList(\n\t\t\t\tTHEME_OPTIONS.map((option) => option.label),\n\t\t\t\tthis.themeIndex,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.addChild(new Text(theme.fg(\"text\", \"Opt-in to anonymous usage data sharing?\"), 1, 0));\n\t\t\tthis.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"muted\",\n\t\t\t\t\t\t\"Opting in stores a tracking identifier in settings.json and enables anonymous\\nusage analytics. This helps us to better debug, reproduce, and resolve issues\\nand bugs within nexus. You can observe what is shared using /privacy and make\\nchanges anytime in settings.json.\",\n\t\t\t\t\t),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addOptionList(\n\t\t\t\tANALYTICS_OPTIONS.map((option) => option.label),\n\t\t\t\tthis.analyticsIndex,\n\t\t\t);\n\t\t}\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", this.step === \"theme\" ? \"continue\" : \"finish\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"skip setup\"),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tprivate addOptionList(labels: string[], selectedIndex: number): void {\n\t\tfor (let i = 0; i < labels.length; i++) {\n\t\t\tconst isSelected = i === selectedIndex;\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst label = isSelected ? theme.fg(\"accent\", labels[i]) : theme.fg(\"text\", labels[i]);\n\t\t\tthis.addChild(new Text(`${prefix}${label}`, 1, 0));\n\t\t}\n\t}\n\n\tprivate moveSelection(delta: number): void {\n\t\tif (this.step === \"theme\") {\n\t\t\tconst next = Math.max(0, Math.min(THEME_OPTIONS.length - 1, this.themeIndex + delta));\n\t\t\tif (next !== this.themeIndex) {\n\t\t\t\tthis.themeIndex = next;\n\t\t\t\tthis.options.onThemePreview(THEME_OPTIONS[this.themeIndex].value);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.analyticsIndex = Math.max(0, Math.min(ANALYTICS_OPTIONS.length - 1, this.analyticsIndex + delta));\n\t\t}\n\t\tthis.update();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.moveSelection(-1);\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.moveSelection(1);\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tif (this.step === \"theme\") {\n\t\t\t\tthis.step = \"analytics\";\n\t\t\t\tthis.update();\n\t\t\t} else {\n\t\t\t\tthis.options.onSubmit({\n\t\t\t\t\ttheme: THEME_OPTIONS[this.themeIndex].value,\n\t\t\t\t\tshareAnalytics: ANALYTICS_OPTIONS[this.analyticsIndex].value,\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.options.onCancel();\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import { type Component } from "@earendil-works/pi-tui";
2
+ import type { AgentSession } from "../../../core/agent-session.ts";
3
+ import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provider.ts";
4
+ /**
5
+ * Format token counts for compact footer display.
6
+ */
7
+ export declare function formatTokens(count: number): string;
8
+ export declare function formatCwdForFooter(cwd: string, home: string | undefined): string;
9
+ /**
10
+ * Footer component that shows cwd, extension statuses, and command hints.
11
+ * Session metrics live in the fullscreen side rail instead of being duplicated here.
12
+ */
13
+ export declare class FooterComponent implements Component {
14
+ private session;
15
+ private footerData;
16
+ constructor(session: AgentSession, footerData: ReadonlyFooterDataProvider);
17
+ setSession(session: AgentSession): void;
18
+ /**
19
+ * No-op: git branch caching now handled by provider.
20
+ * Kept for compatibility with existing call sites in interactive-mode.
21
+ */
22
+ invalidate(): void;
23
+ /**
24
+ * Clean up resources.
25
+ * Git watcher cleanup now handled by provider.
26
+ */
27
+ dispose(): void;
28
+ render(width: number): string[];
29
+ }
30
+ //# sourceMappingURL=footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAexF;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYhF;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAChD,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,UAAU,CAA6B;IAE/C,YAAY,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,0BAA0B,EAGxE;IAED,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAEtC;IAED;;;OAGG;IACH,UAAU,IAAI,IAAI,CAEjB;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI,CAEd;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA2C9B;CACD","sourcesContent":["import { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { type Component, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\n/**\n * Format token counts for compact footer display.\n */\nexport function formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nexport function formatCwdForFooter(cwd: string, home: string | undefined): string {\n\tif (!home) return cwd;\n\n\tconst resolvedCwd = resolve(cwd);\n\tconst resolvedHome = resolve(home);\n\tconst relativeToHome = relative(resolvedHome, resolvedCwd);\n\tconst isInsideHome =\n\t\trelativeToHome === \"\" ||\n\t\t(relativeToHome !== \"..\" && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));\n\n\tif (!isInsideHome) return cwd;\n\treturn relativeToHome === \"\" ? \"~\" : `~${sep}${relativeToHome}`;\n}\n\n/**\n * Footer component that shows cwd, extension statuses, and command hints.\n * Session metrics live in the fullscreen side rail instead of being duplicated here.\n */\nexport class FooterComponent implements Component {\n\tprivate session: AgentSession;\n\tprivate footerData: ReadonlyFooterDataProvider;\n\n\tconstructor(session: AgentSession, footerData: ReadonlyFooterDataProvider) {\n\t\tthis.session = session;\n\t\tthis.footerData = footerData;\n\t}\n\n\tsetSession(session: AgentSession): void {\n\t\tthis.session = session;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\t// Replace home directory with ~\n\t\tlet pwd = formatCwdForFooter(this.session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\tconst pwdLine = truncateToWidth(theme.fg(\"dim\", pwd), width, theme.fg(\"dim\", \"...\"));\n\t\tconst lines = [pwdLine];\n\n\t\t// Add extension statuses on a single line, sorted by key alphabetically\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tif (extensionStatuses.size > 0) {\n\t\t\tconst sortedStatuses = Array.from(extensionStatuses.entries())\n\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t.map(([, text]) => sanitizeStatusText(text));\n\t\t\tconst statusLine = sortedStatuses.join(\" \");\n\t\t\t// Truncate to terminal width with dim ellipsis for consistency with footer style\n\t\t\tlines.push(truncateToWidth(statusLine, width, theme.fg(\"dim\", \"...\")));\n\t\t}\n\n\t\t// Crush-style key hints: bold keys, muted labels, • separators.\n\t\tconst hint = (key: string, label: string) => `${theme.bold(key)} ${theme.fg(\"muted\", label)}`;\n\t\tconst hintsLine = [\n\t\t\thint(\"/\", \"commands\"),\n\t\t\thint(\"!\", \"bash\"),\n\t\t\thint(\"ctrl+l\", \"models\"),\n\t\t\thint(\"ctrl+k\", \"palette\"),\n\t\t\thint(\"ctrl+o\", \"expand\"),\n\t\t\thint(\"ctrl+c\", \"quit\"),\n\t\t].join(theme.fg(\"dim\", \" • \"));\n\t\tlines.push(truncateToWidth(hintsLine, width, theme.fg(\"dim\", \"...\")));\n\n\t\treturn lines;\n\t}\n}\n"]}
@@ -0,0 +1,108 @@
1
+ import { isAbsolute, relative, resolve, sep } from "node:path";
2
+ import { truncateToWidth } from "@earendil-works/pi-tui";
3
+ import { theme } from "../theme/theme.js";
4
+ /**
5
+ * Sanitize text for display in a single-line status.
6
+ * Removes newlines, tabs, carriage returns, and other control characters.
7
+ */
8
+ function sanitizeStatusText(text) {
9
+ // Replace newlines, tabs, carriage returns with space, then collapse multiple spaces
10
+ return text
11
+ .replace(/[\r\n\t]/g, " ")
12
+ .replace(/ +/g, " ")
13
+ .trim();
14
+ }
15
+ /**
16
+ * Format token counts for compact footer display.
17
+ */
18
+ export function formatTokens(count) {
19
+ if (count < 1000)
20
+ return count.toString();
21
+ if (count < 10000)
22
+ return `${(count / 1000).toFixed(1)}k`;
23
+ if (count < 1000000)
24
+ return `${Math.round(count / 1000)}k`;
25
+ if (count < 10000000)
26
+ return `${(count / 1000000).toFixed(1)}M`;
27
+ return `${Math.round(count / 1000000)}M`;
28
+ }
29
+ export function formatCwdForFooter(cwd, home) {
30
+ if (!home)
31
+ return cwd;
32
+ const resolvedCwd = resolve(cwd);
33
+ const resolvedHome = resolve(home);
34
+ const relativeToHome = relative(resolvedHome, resolvedCwd);
35
+ const isInsideHome = relativeToHome === "" ||
36
+ (relativeToHome !== ".." && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));
37
+ if (!isInsideHome)
38
+ return cwd;
39
+ return relativeToHome === "" ? "~" : `~${sep}${relativeToHome}`;
40
+ }
41
+ /**
42
+ * Footer component that shows cwd, extension statuses, and command hints.
43
+ * Session metrics live in the fullscreen side rail instead of being duplicated here.
44
+ */
45
+ export class FooterComponent {
46
+ session;
47
+ footerData;
48
+ constructor(session, footerData) {
49
+ this.session = session;
50
+ this.footerData = footerData;
51
+ }
52
+ setSession(session) {
53
+ this.session = session;
54
+ }
55
+ /**
56
+ * No-op: git branch caching now handled by provider.
57
+ * Kept for compatibility with existing call sites in interactive-mode.
58
+ */
59
+ invalidate() {
60
+ // No-op: git branch is cached/invalidated by provider
61
+ }
62
+ /**
63
+ * Clean up resources.
64
+ * Git watcher cleanup now handled by provider.
65
+ */
66
+ dispose() {
67
+ // Git watcher cleanup handled by provider
68
+ }
69
+ render(width) {
70
+ // Replace home directory with ~
71
+ let pwd = formatCwdForFooter(this.session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);
72
+ // Add git branch if available
73
+ const branch = this.footerData.getGitBranch();
74
+ if (branch) {
75
+ pwd = `${pwd} (${branch})`;
76
+ }
77
+ // Add session name if set
78
+ const sessionName = this.session.sessionManager.getSessionName();
79
+ if (sessionName) {
80
+ pwd = `${pwd} • ${sessionName}`;
81
+ }
82
+ const pwdLine = truncateToWidth(theme.fg("dim", pwd), width, theme.fg("dim", "..."));
83
+ const lines = [pwdLine];
84
+ // Add extension statuses on a single line, sorted by key alphabetically
85
+ const extensionStatuses = this.footerData.getExtensionStatuses();
86
+ if (extensionStatuses.size > 0) {
87
+ const sortedStatuses = Array.from(extensionStatuses.entries())
88
+ .sort(([a], [b]) => a.localeCompare(b))
89
+ .map(([, text]) => sanitizeStatusText(text));
90
+ const statusLine = sortedStatuses.join(" ");
91
+ // Truncate to terminal width with dim ellipsis for consistency with footer style
92
+ lines.push(truncateToWidth(statusLine, width, theme.fg("dim", "...")));
93
+ }
94
+ // Crush-style key hints: bold keys, muted labels, • separators.
95
+ const hint = (key, label) => `${theme.bold(key)} ${theme.fg("muted", label)}`;
96
+ const hintsLine = [
97
+ hint("/", "commands"),
98
+ hint("!", "bash"),
99
+ hint("ctrl+l", "models"),
100
+ hint("ctrl+k", "palette"),
101
+ hint("ctrl+o", "expand"),
102
+ hint("ctrl+c", "quit"),
103
+ ].join(theme.fg("dim", " • "));
104
+ lines.push(truncateToWidth(hintsLine, width, theme.fg("dim", "...")));
105
+ return lines;
106
+ }
107
+ }
108
+ //# sourceMappingURL=footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { type Component, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport { theme } from \"../theme/theme.ts\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\n/**\n * Format token counts for compact footer display.\n */\nexport function formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nexport function formatCwdForFooter(cwd: string, home: string | undefined): string {\n\tif (!home) return cwd;\n\n\tconst resolvedCwd = resolve(cwd);\n\tconst resolvedHome = resolve(home);\n\tconst relativeToHome = relative(resolvedHome, resolvedCwd);\n\tconst isInsideHome =\n\t\trelativeToHome === \"\" ||\n\t\t(relativeToHome !== \"..\" && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));\n\n\tif (!isInsideHome) return cwd;\n\treturn relativeToHome === \"\" ? \"~\" : `~${sep}${relativeToHome}`;\n}\n\n/**\n * Footer component that shows cwd, extension statuses, and command hints.\n * Session metrics live in the fullscreen side rail instead of being duplicated here.\n */\nexport class FooterComponent implements Component {\n\tprivate session: AgentSession;\n\tprivate footerData: ReadonlyFooterDataProvider;\n\n\tconstructor(session: AgentSession, footerData: ReadonlyFooterDataProvider) {\n\t\tthis.session = session;\n\t\tthis.footerData = footerData;\n\t}\n\n\tsetSession(session: AgentSession): void {\n\t\tthis.session = session;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\t// Replace home directory with ~\n\t\tlet pwd = formatCwdForFooter(this.session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\tconst pwdLine = truncateToWidth(theme.fg(\"dim\", pwd), width, theme.fg(\"dim\", \"...\"));\n\t\tconst lines = [pwdLine];\n\n\t\t// Add extension statuses on a single line, sorted by key alphabetically\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tif (extensionStatuses.size > 0) {\n\t\t\tconst sortedStatuses = Array.from(extensionStatuses.entries())\n\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t.map(([, text]) => sanitizeStatusText(text));\n\t\t\tconst statusLine = sortedStatuses.join(\" \");\n\t\t\t// Truncate to terminal width with dim ellipsis for consistency with footer style\n\t\t\tlines.push(truncateToWidth(statusLine, width, theme.fg(\"dim\", \"...\")));\n\t\t}\n\n\t\t// Crush-style key hints: bold keys, muted labels, • separators.\n\t\tconst hint = (key: string, label: string) => `${theme.bold(key)} ${theme.fg(\"muted\", label)}`;\n\t\tconst hintsLine = [\n\t\t\thint(\"/\", \"commands\"),\n\t\t\thint(\"!\", \"bash\"),\n\t\t\thint(\"ctrl+l\", \"models\"),\n\t\t\thint(\"ctrl+k\", \"palette\"),\n\t\t\thint(\"ctrl+o\", \"expand\"),\n\t\t\thint(\"ctrl+c\", \"quit\"),\n\t\t].join(theme.fg(\"dim\", \" • \"));\n\t\tlines.push(truncateToWidth(hintsLine, width, theme.fg(\"dim\", \"...\")));\n\n\t\treturn lines;\n\t}\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import type { Component } from "@earendil-works/pi-tui";
2
+ /**
3
+ * GitNexus side rail (fullscreen UI mode, terminals >= MIN_TERMINAL_WIDTH).
4
+ * Renders repo status, the latest blast radius, latest flows, and session
5
+ * changes as stacked cards. Pure view over graphRailStore.
6
+ */
7
+ export declare const RAIL_WIDTH = 36;
8
+ export declare const MIN_TERMINAL_WIDTH = 110;
9
+ export type GraphRailCard = "status" | "repos" | "impact" | "flows" | "changes" | "skills";
10
+ export interface GraphRailSessionStatus {
11
+ title?: string;
12
+ cwd?: string;
13
+ model?: string;
14
+ provider?: string;
15
+ reasoning?: string;
16
+ context?: string;
17
+ cost?: string;
18
+ }
19
+ export interface GraphRailHostInfo {
20
+ skills: string[];
21
+ version: string;
22
+ /** Live session status for the crush-style sidebar header. */
23
+ getSessionStatus?: () => GraphRailSessionStatus;
24
+ }
25
+ export declare class GraphRailComponent implements Component {
26
+ /** Set by the host: invoked when a card is clicked (fullscreen mouse routing). */
27
+ onCardClick: ((card: GraphRailCard) => void) | undefined;
28
+ private hostInfo;
29
+ setHostInfo(info: GraphRailHostInfo): void;
30
+ getHostInfo(): GraphRailHostInfo | undefined;
31
+ private cardRanges;
32
+ invalidate(): void;
33
+ handleClick(_x: number, y: number): boolean;
34
+ render(width: number): string[];
35
+ private renderRepos;
36
+ private renderStatus;
37
+ private renderImpact;
38
+ private renderQuery;
39
+ private renderSkills;
40
+ private renderChanges;
41
+ }
42
+ /** Full-width expansion of a rail card, appended to the transcript on click. */
43
+ export declare function renderExpandedCard(card: GraphRailCard, hostInfo?: GraphRailHostInfo): string | undefined;
44
+ //# sourceMappingURL=graph-rail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-rail.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/graph-rail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAOxD;;;;GAIG;AAEH,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,kBAAkB,MAAM,CAAC;AA2BtC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAa3F,MAAM,WAAW,sBAAsB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,sBAAsB,CAAC;CAChD;AAED,qBAAa,kBAAmB,YAAW,SAAS;IACnD,kFAAkF;IAClF,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAEzD,OAAO,CAAC,QAAQ,CAAgC;IAEhD,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAEzC;IAED,WAAW,IAAI,iBAAiB,GAAG,SAAS,CAE3C;IAED,OAAO,CAAC,UAAU,CAAkE;IAEpF,UAAU,IAAI,IAAI,CAEjB;IAED,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAK1C;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAyE9B;IAED,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,YAAY;IA4CpB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;CAmBrB;AAMD,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAiFxG","sourcesContent":["import type { Component } from \"@earendil-works/pi-tui\";\nimport { visibleWidth } from \"@earendil-works/pi-tui\";\nimport { type GraphRailState, graphRailStore } from \"../../../core/graph-rail-store.ts\";\nimport { diagonalFill, gradientText } from \"../theme/brand.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { NEXUS_SMALL } from \"./nexus-logo.ts\";\n\n/**\n * GitNexus side rail (fullscreen UI mode, terminals >= MIN_TERMINAL_WIDTH).\n * Renders repo status, the latest blast radius, latest flows, and session\n * changes as stacked cards. Pure view over graphRailStore.\n */\n\nexport const RAIL_WIDTH = 36;\nexport const MIN_TERMINAL_WIDTH = 110;\n\nfunction clipVisible(line: string, width: number): string {\n\tif (visibleWidth(line) <= width) return line;\n\tlet out = \"\";\n\tlet visible = 0;\n\tfor (let i = 0; i < line.length; i++) {\n\t\tif (line[i] === \"\\x1b\") {\n\t\t\tconst match = line.slice(i).match(/^\\x1b\\[[0-9;]*m/);\n\t\t\tif (match) {\n\t\t\t\tout += match[0];\n\t\t\t\ti += match[0].length - 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (visible >= width) break;\n\t\tout += line[i];\n\t\tvisible++;\n\t}\n\treturn `${out}\\x1b[0m`;\n}\n\nfunction basename(filePath: string | undefined): string {\n\tif (!filePath) return \"\";\n\treturn filePath.split(\"/\").pop() ?? filePath;\n}\n\nexport type GraphRailCard = \"status\" | \"repos\" | \"impact\" | \"flows\" | \"changes\" | \"skills\";\n\n/** Dim low-confidence graph edges below this threshold. */\nconst CONFIDENCE_DIM_THRESHOLD = 0.7;\n\nfunction formatSymbolCount(symbols: string): string {\n\tconst n = Number(symbols.replace(/,/g, \"\"));\n\tif (Number.isNaN(n)) return symbols;\n\tif (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n\tif (n >= 1_000) return `${Math.round(n / 1_000)}k`;\n\treturn String(n);\n}\n\nexport interface GraphRailSessionStatus {\n\ttitle?: string;\n\tcwd?: string;\n\tmodel?: string;\n\tprovider?: string;\n\treasoning?: string;\n\tcontext?: string;\n\tcost?: string;\n}\n\nexport interface GraphRailHostInfo {\n\tskills: string[];\n\tversion: string;\n\t/** Live session status for the crush-style sidebar header. */\n\tgetSessionStatus?: () => GraphRailSessionStatus;\n}\n\nexport class GraphRailComponent implements Component {\n\t/** Set by the host: invoked when a card is clicked (fullscreen mouse routing). */\n\tonCardClick: ((card: GraphRailCard) => void) | undefined;\n\n\tprivate hostInfo: GraphRailHostInfo | undefined;\n\n\tsetHostInfo(info: GraphRailHostInfo): void {\n\t\tthis.hostInfo = info;\n\t}\n\n\tgetHostInfo(): GraphRailHostInfo | undefined {\n\t\treturn this.hostInfo;\n\t}\n\n\tprivate cardRanges: Array<{ start: number; end: number; card: GraphRailCard }> = [];\n\n\tinvalidate(): void {\n\t\t// Stateless view over graphRailStore — nothing cached.\n\t}\n\n\thandleClick(_x: number, y: number): boolean {\n\t\tconst hit = this.cardRanges.find((range) => y >= range.start && y < range.end);\n\t\tif (!hit || !this.onCardClick) return false;\n\t\tthis.onCardClick(hit.card);\n\t\treturn true;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (width < 20) return [];\n\t\tconst inner = Math.min(width, RAIL_WIDTH) - 2;\n\t\tconst s = graphRailStore.getState();\n\t\tconst lines: string[] = [];\n\t\tthis.cardRanges = [];\n\t\tlet cardStart = 0;\n\t\tconst beginCard = () => {\n\t\t\tcardStart = lines.length;\n\t\t};\n\t\tconst commitCard = (card: GraphRailCard) => {\n\t\t\tthis.cardRanges.push({ start: cardStart, end: lines.length, card });\n\t\t};\n\t\t// Crush-style section header: `Title ────────` (no card frames).\n\t\tconst rule = (title: string) =>\n\t\t\tlines.push(\n\t\t\t\t`${theme.fg(\"muted\", title)} ${theme.fg(\"dim\", \"─\".repeat(Math.max(0, inner - [...title].length - 1)))}`,\n\t\t\t);\n\t\tconst row = (text: string) => lines.push(clipVisible(text, inner));\n\t\tconst end = () => lines.push(\"\");\n\n\t\t// Logo band (small crush-style: hatch, wordmark, version).\n\t\tconst hatch = diagonalFill(inner + 2);\n\t\tlines.push(hatch);\n\t\tfor (const logoLine of NEXUS_SMALL) lines.push(` ${gradientText(logoLine)}`);\n\t\tif (this.hostInfo?.version) {\n\t\t\tlines.push(` ${theme.fg(\"muted\", `v${this.hostInfo.version}`)}`);\n\t\t}\n\t\tlines.push(hatch);\n\t\tlines.push(\"\");\n\n\t\t// Session header: title, cwd, model block (crush sidebar order).\n\t\tconst status = this.hostInfo?.getSessionStatus?.();\n\t\tif (status) {\n\t\t\tif (status.title) {\n\t\t\t\trow(theme.bold(status.title));\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\tif (status.cwd) {\n\t\t\t\trow(theme.fg(\"muted\", status.cwd));\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\tif (status.model) {\n\t\t\t\trow(\n\t\t\t\t\t`${theme.fg(\"muted\", \"◇\")} ${theme.bold(status.model)}${status.provider ? theme.fg(\"muted\", ` via ${status.provider}`) : \"\"}`,\n\t\t\t\t);\n\t\t\t\tif (status.reasoning) row(` ${theme.fg(\"muted\", `Reasoning ${status.reasoning}`)}`);\n\t\t\t\tif (status.context || status.cost) {\n\t\t\t\t\trow(` ${theme.fg(\"muted\", [status.context, status.cost].filter(Boolean).join(\" \"))}`);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t}\n\n\t\tbeginCard();\n\t\tthis.renderChanges(s, rule, row, end);\n\t\tcommitCard(\"changes\");\n\t\tbeginCard();\n\t\tthis.renderStatus(s, rule, row, end);\n\t\tcommitCard(\"status\");\n\t\tbeginCard();\n\t\tthis.renderRepos(s, rule, row, end);\n\t\tcommitCard(\"repos\");\n\t\tbeginCard();\n\t\tthis.renderImpact(s, rule, row, end);\n\t\tcommitCard(\"impact\");\n\t\tbeginCard();\n\t\tthis.renderQuery(s, rule, row, end);\n\t\tcommitCard(\"flows\");\n\t\tbeginCard();\n\t\tthis.renderSkills(rule, row, end);\n\t\tcommitCard(\"skills\");\n\t\treturn lines;\n\t}\n\n\tprivate renderRepos(\n\t\ts: Readonly<GraphRailState>,\n\t\trule: (t: string) => void,\n\t\trow: (t: string) => void,\n\t\tend: () => void,\n\t): void {\n\t\tif (s.repos.length === 0) return;\n\t\trule(\"Repos\");\n\t\tconst activeName = s.repo?.name;\n\t\tfor (const repo of s.repos.slice(0, 5)) {\n\t\t\tconst short = repo.name.split(\"/\").pop() ?? repo.name;\n\t\t\tconst count = theme.fg(\"muted\", formatSymbolCount(repo.symbols));\n\t\t\tif (repo.name === activeName) {\n\t\t\t\trow(`${theme.fg(\"accent\", \"●\")} ${theme.fg(\"accent\", short)} ${count}`);\n\t\t\t} else {\n\t\t\t\trow(`${theme.fg(\"muted\", \"○\")} ${theme.fg(\"muted\", short)} ${count}`);\n\t\t\t}\n\t\t}\n\t\tif (s.repos.length > 5) row(theme.fg(\"muted\", ` … +${s.repos.length - 5} more`));\n\t\tend();\n\t}\n\n\tprivate renderStatus(\n\t\ts: Readonly<GraphRailState>,\n\t\trule: (t: string) => void,\n\t\trow: (t: string) => void,\n\t\tend: () => void,\n\t): void {\n\t\trule(\"GitNexus\");\n\t\tif (!s.repo) {\n\t\t\trow(theme.fg(\"muted\", \"not connected\"));\n\t\t\tend();\n\t\t\treturn;\n\t\t}\n\t\tif (s.currentIndexed) {\n\t\t\trow(theme.bold(s.repo.name.split(\"/\").pop() ?? s.repo.name));\n\t\t\trow(theme.fg(\"muted\", `${s.repo.symbols} symbols · ${s.repo.repoCount} repos`));\n\t\t\trow(theme.fg(\"muted\", `indexed ${s.repo.indexedAt.split(\" GMT\")[0] ?? s.repo.indexedAt}`));\n\t\t} else {\n\t\t\trow(theme.fg(\"warning\", \"repo not indexed\"));\n\t\t\trow(theme.fg(\"muted\", `${s.repo.repoCount} repos queryable`));\n\t\t}\n\t\trow(theme.fg(\"muted\", `graph calls ${s.graphCalls} · impact ${s.impactChecks}`));\n\t\tend();\n\t}\n\n\tprivate renderImpact(\n\t\ts: Readonly<GraphRailState>,\n\t\trule: (t: string) => void,\n\t\trow: (t: string) => void,\n\t\tend: () => void,\n\t): void {\n\t\tconst impact = s.impact;\n\t\tif (!impact) return;\n\t\trule(\"Blast Radius\");\n\t\tconst risk = impact.risk.toUpperCase();\n\t\tconst riskColor = risk === \"HIGH\" || risk === \"CRITICAL\" ? \"error\" : risk === \"MEDIUM\" ? \"warning\" : \"success\";\n\t\trow(`${theme.fg(\"accent\", \"◉\")} ${theme.bold(impact.target)}`);\n\t\trow(theme.fg(riskColor, `risk: ${risk}`));\n\t\tconst depths = Object.keys(impact.byDepth)\n\t\t\t.map(Number)\n\t\t\t.filter((d) => !Number.isNaN(d))\n\t\t\t.sort((a, b) => a - b);\n\t\tfor (const depth of depths.slice(0, 3)) {\n\t\t\tconst nodes = impact.byDepth[String(depth)] ?? [];\n\t\t\tif (nodes.length === 0) continue;\n\t\t\tconst color = depth === 1 ? \"error\" : depth === 2 ? \"warning\" : \"muted\";\n\t\t\tconst label = depth === 1 ? \"breaks\" : depth === 2 ? \"test\" : \"transitive\";\n\t\t\trow(theme.fg(color, `d${depth} ${label} (${nodes.length})`));\n\t\t\tfor (const node of nodes.slice(0, 3)) {\n\t\t\t\tconst lowConfidence = node.confidence !== undefined && node.confidence < CONFIDENCE_DIM_THRESHOLD;\n\t\t\t\tconst name = lowConfidence ? theme.fg(\"dim\", `${node.name}?`) : node.name;\n\t\t\t\trow(` ${theme.fg(lowConfidence ? \"dim\" : color, depth === 1 ? \"●\" : \"○\")} ${name}`);\n\t\t\t}\n\t\t\tif (nodes.length > 3) row(theme.fg(\"muted\", ` … +${nodes.length - 3}`));\n\t\t}\n\t\tif (impact.processes.length > 0) row(theme.fg(\"muted\", `flows: ${impact.processes.slice(0, 2).join(\", \")}`));\n\t\tif (impact.modules.length > 0) {\n\t\t\tconst maxHits = Math.max(...impact.modules.map((m) => m.hits), 1);\n\t\t\tfor (const module of impact.modules.slice(0, 3)) {\n\t\t\t\tconst filled = Math.max(1, Math.round((module.hits / maxHits) * 5));\n\t\t\t\tconst bar =\n\t\t\t\t\ttheme.fg(module.direct ? \"accent\" : \"muted\", \"▮\".repeat(filled)) +\n\t\t\t\t\ttheme.fg(\"dim\", \"▯\".repeat(5 - filled));\n\t\t\t\trow(`${bar} ${theme.fg(\"muted\", module.name)} ${theme.fg(\"dim\", String(module.hits))}`);\n\t\t\t}\n\t\t}\n\t\tend();\n\t}\n\n\tprivate renderQuery(\n\t\ts: Readonly<GraphRailState>,\n\t\trule: (t: string) => void,\n\t\trow: (t: string) => void,\n\t\tend: () => void,\n\t): void {\n\t\tconst query = s.query;\n\t\tif (!query) return;\n\t\trule(\"Flows\");\n\t\trow(theme.fg(\"muted\", clipQuery(query.query)));\n\t\tquery.flows.slice(0, 3).forEach((flow, i) => {\n\t\t\tconst marker = i === 0 ? theme.fg(\"accent\", \"◉\") : theme.fg(\"muted\", \"○\");\n\t\t\tconst steps = flow.stepCount ? theme.fg(\"muted\", ` ·${flow.stepCount}`) : \"\";\n\t\t\trow(`${marker} ${flow.summary}${steps}`);\n\t\t});\n\t\tend();\n\t}\n\n\tprivate renderSkills(rule: (t: string) => void, row: (t: string) => void, end: () => void): void {\n\t\tconst skills = this.hostInfo?.skills ?? [];\n\t\tif (skills.length === 0) return;\n\t\trule(\"Skills\");\n\t\tfor (const skill of skills.slice(0, 8)) {\n\t\t\trow(`${theme.fg(\"success\", \"\\u25cf\")} ${theme.fg(\"muted\", skill)}`);\n\t\t}\n\t\tif (skills.length > 8) row(theme.fg(\"muted\", ` \\u2026 +${skills.length - 8} more`));\n\t\tend();\n\t}\n\n\tprivate renderChanges(\n\t\ts: Readonly<GraphRailState>,\n\t\trule: (t: string) => void,\n\t\trow: (t: string) => void,\n\t\tend: () => void,\n\t): void {\n\t\trule(\"Modified Files\");\n\t\tif (s.changes.length === 0) {\n\t\t\trow(theme.fg(\"muted\", \"None\"));\n\t\t\tend();\n\t\t\treturn;\n\t\t}\n\t\tfor (const change of s.changes.slice(-5)) {\n\t\t\trow(\n\t\t\t\t`${basename(change.path)} ${theme.fg(\"success\", `+${change.added}`)} ${theme.fg(\"error\", `-${change.removed}`)}`,\n\t\t\t);\n\t\t}\n\t\tend();\n\t}\n}\n\nfunction clipQuery(query: string): string {\n\treturn query.length > 30 ? `${query.slice(0, 29)}…` : `“${query}”`;\n}\n\n/** Full-width expansion of a rail card, appended to the transcript on click. */\nexport function renderExpandedCard(card: GraphRailCard, hostInfo?: GraphRailHostInfo): string | undefined {\n\tconst s = graphRailStore.getState();\n\tconst header = (title: string) => theme.bold(theme.fg(\"accent\", `── GitNexus · ${title} ──`));\n\tif (card === \"repos\" && s.repos.length > 0) {\n\t\tconst lines: string[] = [header(\"indexed repos\")];\n\t\tfor (const repo of s.repos) {\n\t\t\tconst marker = repo.name === s.repo?.name ? theme.fg(\"accent\", \"●\") : theme.fg(\"muted\", \"○\");\n\t\t\tlines.push(`${marker} ${repo.name} ${theme.fg(\"muted\", `${repo.symbols} symbols`)}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\tif (card === \"skills\" && hostInfo && hostInfo.skills.length > 0) {\n\t\tconst lines: string[] = [header(\"skills\")];\n\t\tfor (const skill of hostInfo.skills) {\n\t\t\tlines.push(`${theme.fg(\"success\", \"●\")} ${skill}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\tif (card === \"impact\" && s.impact) {\n\t\tconst lines: string[] = [header(\"blast radius\")];\n\t\tconst risk = s.impact.risk.toUpperCase();\n\t\tconst riskColor = risk === \"HIGH\" || risk === \"CRITICAL\" ? \"error\" : risk === \"MEDIUM\" ? \"warning\" : \"success\";\n\t\tlines.push(\n\t\t\t`${theme.fg(\"accent\", \"◉\")} ${theme.bold(s.impact.target)} ${theme.fg(\"muted\", s.impact.filePath ?? \"\")} ${theme.bold(theme.fg(riskColor, `RISK: ${risk}`))}`,\n\t\t);\n\t\tconst depths = Object.keys(s.impact.byDepth)\n\t\t\t.map(Number)\n\t\t\t.filter((d) => !Number.isNaN(d))\n\t\t\t.sort((a, b) => a - b);\n\t\tfor (const depth of depths) {\n\t\t\tconst nodes = s.impact.byDepth[String(depth)] ?? [];\n\t\t\tif (nodes.length === 0) continue;\n\t\t\tconst color = depth === 1 ? \"error\" : depth === 2 ? \"warning\" : \"muted\";\n\t\t\tconst label = depth === 1 ? \"WILL BREAK\" : depth === 2 ? \"should test\" : \"transitive\";\n\t\t\tlines.push(theme.fg(color, `d=${depth} ${label} (${nodes.length})`));\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst rel = node.relationType ? theme.fg(\"muted\", ` (${node.relationType})`) : \"\";\n\t\t\t\tlines.push(\n\t\t\t\t\t` ${theme.fg(color, depth === 1 ? \"●\" : \"○\")} ${node.name} ${theme.fg(\"muted\", node.filePath ?? \"\")}${rel}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (s.impact.processes.length > 0)\n\t\t\tlines.push(theme.fg(\"muted\", `flows affected: ${s.impact.processes.join(\", \")}`));\n\t\tif (s.impact.modules.length > 0)\n\t\t\tlines.push(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\t`modules: ${s.impact.modules.map((m) => `${m.name} (${m.hits}${m.direct ? \", direct\" : \"\"})`).join(\", \")}`,\n\t\t\t\t),\n\t\t\t);\n\t\treturn lines.join(\"\\n\");\n\t}\n\tif (card === \"flows\" && s.query) {\n\t\tconst lines: string[] = [header(\"flows\"), theme.fg(\"muted\", `query: “${s.query.query}”`)];\n\t\ts.query.flows.forEach((flow, i) => {\n\t\t\tconst marker = i === 0 ? theme.fg(\"accent\", \"◉\") : theme.fg(\"muted\", \"○\");\n\t\t\tlines.push(\n\t\t\t\t`${marker} ${flow.summary}${flow.stepCount ? theme.fg(\"muted\", ` · ${flow.stepCount} steps`) : \"\"}`,\n\t\t\t);\n\t\t});\n\t\treturn lines.join(\"\\n\");\n\t}\n\tif (card === \"changes\" && s.changes.length > 0) {\n\t\tconst lines: string[] = [header(\"session changes\")];\n\t\tfor (const change of s.changes) {\n\t\t\tlines.push(\n\t\t\t\t`${theme.fg(\"success\", `+${change.added}`)} ${theme.fg(\"error\", `-${change.removed}`)} ${change.path}`,\n\t\t\t);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\tif (card === \"status\" && s.repo) {\n\t\treturn [\n\t\t\theader(\"status\"),\n\t\t\t`repo: ${s.repo.name || \"(current dir not indexed)\"} · ${s.repo.symbols} symbols`,\n\t\t\t`indexed: ${s.repo.indexedAt || \"n/a\"} · ${s.repo.repoCount} repos on hub`,\n\t\t\t`graph calls: ${s.graphCalls} · impact checks: ${s.impactChecks}`,\n\t\t].join(\"\\n\");\n\t}\n\treturn undefined;\n}\n"]}