@eminent337/aery 0.1.62 → 0.1.64

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 (714) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/README.md +0 -0
  3. package/docs/compaction.md +0 -0
  4. package/docs/custom-provider.md +1 -1
  5. package/docs/development.md +0 -0
  6. package/docs/docs.json +0 -0
  7. package/docs/extensions.md +18 -18
  8. package/docs/images/doom-extension.png +0 -0
  9. package/docs/images/exy.png +0 -0
  10. package/docs/images/interactive-mode.png +0 -0
  11. package/docs/images/tree-view.png +0 -0
  12. package/docs/index.md +5 -5
  13. package/docs/json.md +1 -1
  14. package/docs/keybindings.md +2 -2
  15. package/docs/models.md +2 -2
  16. package/docs/packages.md +13 -13
  17. package/docs/prompt-templates.md +0 -0
  18. package/docs/providers.md +5 -5
  19. package/docs/quickstart.md +19 -19
  20. package/docs/rpc.md +3 -3
  21. package/docs/sdk.md +1 -1
  22. package/docs/session-format.md +3 -3
  23. package/docs/sessions.md +10 -10
  24. package/docs/settings.md +7 -5
  25. package/docs/shell-aliases.md +0 -0
  26. package/docs/skills.md +2 -2
  27. package/docs/terminal-setup.md +6 -6
  28. package/docs/termux.md +3 -3
  29. package/docs/themes.md +3 -3
  30. package/docs/tmux.md +1 -1
  31. package/docs/tui.md +2 -2
  32. package/docs/usage.md +33 -33
  33. package/docs/windows.md +0 -0
  34. package/examples/README.md +0 -0
  35. package/examples/extensions/README.md +3 -3
  36. package/examples/extensions/antigravity-image-gen.ts +6 -6
  37. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  38. package/examples/extensions/bash-spawn-hook.ts +1 -1
  39. package/examples/extensions/bookmark.ts +0 -0
  40. package/examples/extensions/border-status-editor.ts +0 -0
  41. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  42. package/examples/extensions/claude-rules.ts +1 -1
  43. package/examples/extensions/commands.ts +1 -1
  44. package/examples/extensions/confirm-destructive.ts +0 -0
  45. package/examples/extensions/custom-compaction.ts +1 -1
  46. package/examples/extensions/custom-footer.ts +0 -0
  47. package/examples/extensions/custom-header.ts +2 -2
  48. package/examples/extensions/custom-provider-anthropic/index.ts +2 -2
  49. package/examples/extensions/custom-provider-anthropic/package-lock.json +0 -0
  50. package/examples/extensions/custom-provider-anthropic/package.json +0 -0
  51. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  52. package/examples/extensions/custom-provider-gitlab-duo/package.json +0 -0
  53. package/examples/extensions/custom-provider-gitlab-duo/test.ts +0 -0
  54. package/examples/extensions/custom-provider-qwen-cli/index.ts +1 -1
  55. package/examples/extensions/custom-provider-qwen-cli/package.json +0 -0
  56. package/examples/extensions/dirty-repo-guard.ts +0 -0
  57. package/examples/extensions/doom-overlay/README.md +2 -2
  58. package/examples/extensions/doom-overlay/doom/build/doom.js +0 -0
  59. package/examples/extensions/doom-overlay/doom/build.sh +2 -2
  60. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +0 -0
  61. package/examples/extensions/doom-overlay/doom-component.ts +0 -0
  62. package/examples/extensions/doom-overlay/doom-engine.ts +0 -0
  63. package/examples/extensions/doom-overlay/doom-keys.ts +0 -0
  64. package/examples/extensions/doom-overlay/index.ts +1 -1
  65. package/examples/extensions/doom-overlay/wad-finder.ts +0 -0
  66. package/examples/extensions/dynamic-resources/SKILL.md +0 -0
  67. package/examples/extensions/dynamic-resources/dynamic.json +0 -0
  68. package/examples/extensions/dynamic-resources/dynamic.md +0 -0
  69. package/examples/extensions/dynamic-resources/index.ts +0 -0
  70. package/examples/extensions/dynamic-tools.ts +0 -0
  71. package/examples/extensions/event-bus.ts +0 -0
  72. package/examples/extensions/file-trigger.ts +0 -0
  73. package/examples/extensions/git-checkpoint.ts +0 -0
  74. package/examples/extensions/github-issue-autocomplete.ts +0 -0
  75. package/examples/extensions/handoff.ts +0 -0
  76. package/examples/extensions/hello.ts +0 -0
  77. package/examples/extensions/hidden-thinking-label.ts +1 -1
  78. package/examples/extensions/inline-bash.ts +2 -2
  79. package/examples/extensions/input-transform.ts +3 -3
  80. package/examples/extensions/interactive-shell.ts +1 -1
  81. package/examples/extensions/mac-system-theme.ts +2 -2
  82. package/examples/extensions/message-renderer.ts +0 -0
  83. package/examples/extensions/minimal-mode.ts +1 -1
  84. package/examples/extensions/modal-editor.ts +1 -1
  85. package/examples/extensions/model-status.ts +1 -1
  86. package/examples/extensions/notify.ts +0 -0
  87. package/examples/extensions/overlay-qa-tests.ts +1 -1
  88. package/examples/extensions/overlay-test.ts +1 -1
  89. package/examples/extensions/permission-gate.ts +0 -0
  90. package/examples/extensions/pirate.ts +1 -1
  91. package/examples/extensions/plan-mode/README.md +0 -0
  92. package/examples/extensions/plan-mode/index.ts +0 -0
  93. package/examples/extensions/plan-mode/utils.ts +0 -0
  94. package/examples/extensions/preset.ts +12 -6
  95. package/examples/extensions/prompt-customizer.ts +1 -1
  96. package/examples/extensions/protected-paths.ts +0 -0
  97. package/examples/extensions/provider-payload.ts +1 -1
  98. package/examples/extensions/qna.ts +0 -0
  99. package/examples/extensions/question.ts +0 -0
  100. package/examples/extensions/questionnaire.ts +0 -0
  101. package/examples/extensions/rainbow-editor.ts +1 -1
  102. package/examples/extensions/reload-runtime.ts +0 -0
  103. package/examples/extensions/rpc-demo.ts +1 -1
  104. package/examples/extensions/sandbox/index.ts +8 -8
  105. package/examples/extensions/sandbox/package-lock.json +0 -0
  106. package/examples/extensions/sandbox/package.json +0 -0
  107. package/examples/extensions/send-user-message.ts +0 -0
  108. package/examples/extensions/session-name.ts +0 -0
  109. package/examples/extensions/shutdown-command.ts +5 -5
  110. package/examples/extensions/snake.ts +0 -0
  111. package/examples/extensions/space-invaders.ts +0 -0
  112. package/examples/extensions/ssh.ts +2 -2
  113. package/examples/extensions/status-line.ts +0 -0
  114. package/examples/extensions/structured-output.ts +0 -0
  115. package/examples/extensions/subagent/README.md +13 -13
  116. package/examples/extensions/subagent/agents/planner.md +0 -0
  117. package/examples/extensions/subagent/agents/reviewer.md +0 -0
  118. package/examples/extensions/subagent/agents/scout.md +0 -0
  119. package/examples/extensions/subagent/agents/worker.md +0 -0
  120. package/examples/extensions/subagent/agents.ts +1 -1
  121. package/examples/extensions/subagent/index.ts +5 -5
  122. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -0
  123. package/examples/extensions/subagent/prompts/implement.md +0 -0
  124. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -0
  125. package/examples/extensions/summarize.ts +0 -0
  126. package/examples/extensions/system-prompt-header.ts +0 -0
  127. package/examples/extensions/tic-tac-toe.ts +0 -0
  128. package/examples/extensions/timed-confirm.ts +0 -0
  129. package/examples/extensions/titlebar-spinner.ts +1 -1
  130. package/examples/extensions/todo.ts +0 -0
  131. package/examples/extensions/tool-override.ts +2 -2
  132. package/examples/extensions/tools.ts +1 -1
  133. package/examples/extensions/trigger-compact.ts +0 -0
  134. package/examples/extensions/truncated-tool.ts +1 -1
  135. package/examples/extensions/widget-placement.ts +0 -0
  136. package/examples/extensions/with-deps/index.ts +0 -0
  137. package/examples/extensions/with-deps/package-lock.json +0 -0
  138. package/examples/extensions/with-deps/package.json +0 -0
  139. package/examples/extensions/working-indicator.ts +4 -4
  140. package/examples/extensions/working-message-test.ts +1 -1
  141. package/examples/rpc-extension-ui.ts +0 -0
  142. package/examples/sdk/01-minimal.ts +1 -1
  143. package/examples/sdk/02-custom-model.ts +0 -0
  144. package/examples/sdk/03-custom-prompt.ts +1 -1
  145. package/examples/sdk/04-skills.ts +1 -1
  146. package/examples/sdk/05-tools.ts +0 -0
  147. package/examples/sdk/06-extensions.ts +2 -2
  148. package/examples/sdk/07-context-files.ts +0 -0
  149. package/examples/sdk/08-prompt-templates.ts +1 -1
  150. package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
  151. package/examples/sdk/10-settings.ts +0 -0
  152. package/examples/sdk/11-sessions.ts +0 -0
  153. package/examples/sdk/12-full-control.ts +0 -0
  154. package/examples/sdk/13-session-runtime.ts +0 -0
  155. package/examples/sdk/README.md +1 -1
  156. package/package.json +4 -4
  157. package/dist/bun/cli.d.ts +0 -3
  158. package/dist/bun/cli.d.ts.map +0 -1
  159. package/dist/bun/cli.js +0 -8
  160. package/dist/bun/cli.js.map +0 -1
  161. package/dist/bun/register-bedrock.d.ts +0 -2
  162. package/dist/bun/register-bedrock.d.ts.map +0 -1
  163. package/dist/bun/register-bedrock.js +0 -4
  164. package/dist/bun/register-bedrock.js.map +0 -1
  165. package/dist/bun/restore-sandbox-env.d.ts +0 -13
  166. package/dist/bun/restore-sandbox-env.d.ts.map +0 -1
  167. package/dist/bun/restore-sandbox-env.js +0 -32
  168. package/dist/bun/restore-sandbox-env.js.map +0 -1
  169. package/dist/cli/args.d.ts +0 -53
  170. package/dist/cli/args.d.ts.map +0 -1
  171. package/dist/cli/args.js +0 -329
  172. package/dist/cli/args.js.map +0 -1
  173. package/dist/cli/config-selector.d.ts +0 -14
  174. package/dist/cli/config-selector.d.ts.map +0 -1
  175. package/dist/cli/config-selector.js +0 -31
  176. package/dist/cli/config-selector.js.map +0 -1
  177. package/dist/cli/file-processor.d.ts +0 -15
  178. package/dist/cli/file-processor.d.ts.map +0 -1
  179. package/dist/cli/file-processor.js +0 -83
  180. package/dist/cli/file-processor.js.map +0 -1
  181. package/dist/cli/initial-message.d.ts +0 -18
  182. package/dist/cli/initial-message.d.ts.map +0 -1
  183. package/dist/cli/initial-message.js +0 -22
  184. package/dist/cli/initial-message.js.map +0 -1
  185. package/dist/cli/list-models.d.ts +0 -9
  186. package/dist/cli/list-models.d.ts.map +0 -1
  187. package/dist/cli/list-models.js +0 -98
  188. package/dist/cli/list-models.js.map +0 -1
  189. package/dist/cli/session-picker.d.ts +0 -9
  190. package/dist/cli/session-picker.d.ts.map +0 -1
  191. package/dist/cli/session-picker.js +0 -35
  192. package/dist/cli/session-picker.js.map +0 -1
  193. package/dist/cli.d.ts +0 -3
  194. package/dist/cli.d.ts.map +0 -1
  195. package/dist/cli.js +0 -19
  196. package/dist/cli.js.map +0 -1
  197. package/dist/config.d.ts +0 -86
  198. package/dist/config.d.ts.map +0 -1
  199. package/dist/config.js +0 -332
  200. package/dist/config.js.map +0 -1
  201. package/dist/core/agent-session-runtime.d.ts +0 -117
  202. package/dist/core/agent-session-runtime.d.ts.map +0 -1
  203. package/dist/core/agent-session-runtime.js +0 -300
  204. package/dist/core/agent-session-runtime.js.map +0 -1
  205. package/dist/core/agent-session-services.d.ts +0 -86
  206. package/dist/core/agent-session-services.d.ts.map +0 -1
  207. package/dist/core/agent-session-services.js +0 -117
  208. package/dist/core/agent-session-services.js.map +0 -1
  209. package/dist/core/agent-session.d.ts +0 -595
  210. package/dist/core/agent-session.d.ts.map +0 -1
  211. package/dist/core/agent-session.js +0 -2520
  212. package/dist/core/agent-session.js.map +0 -1
  213. package/dist/core/auth-guidance.d.ts +0 -5
  214. package/dist/core/auth-guidance.d.ts.map +0 -1
  215. package/dist/core/auth-guidance.js +0 -21
  216. package/dist/core/auth-guidance.js.map +0 -1
  217. package/dist/core/auth-storage.d.ts +0 -141
  218. package/dist/core/auth-storage.d.ts.map +0 -1
  219. package/dist/core/auth-storage.js +0 -441
  220. package/dist/core/auth-storage.js.map +0 -1
  221. package/dist/core/bash-executor.d.ts +0 -32
  222. package/dist/core/bash-executor.d.ts.map +0 -1
  223. package/dist/core/bash-executor.js +0 -111
  224. package/dist/core/bash-executor.js.map +0 -1
  225. package/dist/core/compaction/branch-summarization.d.ts +0 -88
  226. package/dist/core/compaction/branch-summarization.d.ts.map +0 -1
  227. package/dist/core/compaction/branch-summarization.js +0 -243
  228. package/dist/core/compaction/branch-summarization.js.map +0 -1
  229. package/dist/core/compaction/compaction.d.ts +0 -121
  230. package/dist/core/compaction/compaction.d.ts.map +0 -1
  231. package/dist/core/compaction/compaction.js +0 -615
  232. package/dist/core/compaction/compaction.js.map +0 -1
  233. package/dist/core/compaction/index.d.ts +0 -7
  234. package/dist/core/compaction/index.d.ts.map +0 -1
  235. package/dist/core/compaction/index.js +0 -7
  236. package/dist/core/compaction/index.js.map +0 -1
  237. package/dist/core/compaction/utils.d.ts +0 -38
  238. package/dist/core/compaction/utils.d.ts.map +0 -1
  239. package/dist/core/compaction/utils.js +0 -153
  240. package/dist/core/compaction/utils.js.map +0 -1
  241. package/dist/core/defaults.d.ts +0 -3
  242. package/dist/core/defaults.d.ts.map +0 -1
  243. package/dist/core/defaults.js +0 -2
  244. package/dist/core/defaults.js.map +0 -1
  245. package/dist/core/diagnostics.d.ts +0 -15
  246. package/dist/core/diagnostics.d.ts.map +0 -1
  247. package/dist/core/diagnostics.js +0 -2
  248. package/dist/core/diagnostics.js.map +0 -1
  249. package/dist/core/event-bus.d.ts +0 -9
  250. package/dist/core/event-bus.d.ts.map +0 -1
  251. package/dist/core/event-bus.js +0 -25
  252. package/dist/core/event-bus.js.map +0 -1
  253. package/dist/core/exec.d.ts +0 -29
  254. package/dist/core/exec.d.ts.map +0 -1
  255. package/dist/core/exec.js +0 -75
  256. package/dist/core/exec.js.map +0 -1
  257. package/dist/core/export-html/ansi-to-html.d.ts +0 -22
  258. package/dist/core/export-html/ansi-to-html.d.ts.map +0 -1
  259. package/dist/core/export-html/ansi-to-html.js +0 -249
  260. package/dist/core/export-html/ansi-to-html.js.map +0 -1
  261. package/dist/core/export-html/index.d.ts +0 -37
  262. package/dist/core/export-html/index.d.ts.map +0 -1
  263. package/dist/core/export-html/index.js +0 -224
  264. package/dist/core/export-html/index.js.map +0 -1
  265. package/dist/core/export-html/template.css +0 -1022
  266. package/dist/core/export-html/template.html +0 -55
  267. package/dist/core/export-html/template.js +0 -1770
  268. package/dist/core/export-html/tool-renderer.d.ts +0 -34
  269. package/dist/core/export-html/tool-renderer.d.ts.map +0 -1
  270. package/dist/core/export-html/tool-renderer.js +0 -108
  271. package/dist/core/export-html/tool-renderer.js.map +0 -1
  272. package/dist/core/export-html/vendor/highlight.min.js +0 -1213
  273. package/dist/core/export-html/vendor/marked.min.js +0 -6
  274. package/dist/core/extensions/index.d.ts +0 -12
  275. package/dist/core/extensions/index.d.ts.map +0 -1
  276. package/dist/core/extensions/index.js +0 -9
  277. package/dist/core/extensions/index.js.map +0 -1
  278. package/dist/core/extensions/loader.d.ts +0 -25
  279. package/dist/core/extensions/loader.d.ts.map +0 -1
  280. package/dist/core/extensions/loader.js +0 -476
  281. package/dist/core/extensions/loader.js.map +0 -1
  282. package/dist/core/extensions/runner.d.ts +0 -158
  283. package/dist/core/extensions/runner.d.ts.map +0 -1
  284. package/dist/core/extensions/runner.js +0 -784
  285. package/dist/core/extensions/runner.js.map +0 -1
  286. package/dist/core/extensions/types.d.ts +0 -1153
  287. package/dist/core/extensions/types.d.ts.map +0 -1
  288. package/dist/core/extensions/types.js +0 -45
  289. package/dist/core/extensions/types.js.map +0 -1
  290. package/dist/core/extensions/wrapper.d.ts +0 -20
  291. package/dist/core/extensions/wrapper.d.ts.map +0 -1
  292. package/dist/core/extensions/wrapper.js +0 -22
  293. package/dist/core/extensions/wrapper.js.map +0 -1
  294. package/dist/core/footer-data-provider.d.ts +0 -52
  295. package/dist/core/footer-data-provider.d.ts.map +0 -1
  296. package/dist/core/footer-data-provider.js +0 -310
  297. package/dist/core/footer-data-provider.js.map +0 -1
  298. package/dist/core/index.d.ts +0 -12
  299. package/dist/core/index.d.ts.map +0 -1
  300. package/dist/core/index.js +0 -12
  301. package/dist/core/index.js.map +0 -1
  302. package/dist/core/keybindings.d.ts +0 -353
  303. package/dist/core/keybindings.d.ts.map +0 -1
  304. package/dist/core/keybindings.js +0 -295
  305. package/dist/core/keybindings.js.map +0 -1
  306. package/dist/core/messages.d.ts +0 -77
  307. package/dist/core/messages.d.ts.map +0 -1
  308. package/dist/core/messages.js +0 -123
  309. package/dist/core/messages.js.map +0 -1
  310. package/dist/core/model-registry.d.ts +0 -144
  311. package/dist/core/model-registry.d.ts.map +0 -1
  312. package/dist/core/model-registry.js +0 -699
  313. package/dist/core/model-registry.js.map +0 -1
  314. package/dist/core/model-resolver.d.ts +0 -110
  315. package/dist/core/model-resolver.d.ts.map +0 -1
  316. package/dist/core/model-resolver.js +0 -489
  317. package/dist/core/model-resolver.js.map +0 -1
  318. package/dist/core/output-guard.d.ts +0 -6
  319. package/dist/core/output-guard.d.ts.map +0 -1
  320. package/dist/core/output-guard.js +0 -59
  321. package/dist/core/output-guard.js.map +0 -1
  322. package/dist/core/package-manager.d.ts +0 -199
  323. package/dist/core/package-manager.d.ts.map +0 -1
  324. package/dist/core/package-manager.js +0 -1973
  325. package/dist/core/package-manager.js.map +0 -1
  326. package/dist/core/prompt-templates.d.ts +0 -52
  327. package/dist/core/prompt-templates.d.ts.map +0 -1
  328. package/dist/core/prompt-templates.js +0 -250
  329. package/dist/core/prompt-templates.js.map +0 -1
  330. package/dist/core/resolve-config-value.d.ts +0 -23
  331. package/dist/core/resolve-config-value.d.ts.map +0 -1
  332. package/dist/core/resolve-config-value.js +0 -126
  333. package/dist/core/resolve-config-value.js.map +0 -1
  334. package/dist/core/resource-loader.d.ts +0 -194
  335. package/dist/core/resource-loader.d.ts.map +0 -1
  336. package/dist/core/resource-loader.js +0 -727
  337. package/dist/core/resource-loader.js.map +0 -1
  338. package/dist/core/sdk.d.ts +0 -107
  339. package/dist/core/sdk.d.ts.map +0 -1
  340. package/dist/core/sdk.js +0 -274
  341. package/dist/core/sdk.js.map +0 -1
  342. package/dist/core/session-cwd.d.ts +0 -19
  343. package/dist/core/session-cwd.d.ts.map +0 -1
  344. package/dist/core/session-cwd.js +0 -38
  345. package/dist/core/session-cwd.js.map +0 -1
  346. package/dist/core/session-manager.d.ts +0 -333
  347. package/dist/core/session-manager.d.ts.map +0 -1
  348. package/dist/core/session-manager.js +0 -1109
  349. package/dist/core/session-manager.js.map +0 -1
  350. package/dist/core/settings-manager.d.ts +0 -261
  351. package/dist/core/settings-manager.d.ts.map +0 -1
  352. package/dist/core/settings-manager.js +0 -782
  353. package/dist/core/settings-manager.js.map +0 -1
  354. package/dist/core/skills.d.ts +0 -60
  355. package/dist/core/skills.d.ts.map +0 -1
  356. package/dist/core/skills.js +0 -404
  357. package/dist/core/skills.js.map +0 -1
  358. package/dist/core/slash-commands.d.ts +0 -14
  359. package/dist/core/slash-commands.d.ts.map +0 -1
  360. package/dist/core/slash-commands.js +0 -25
  361. package/dist/core/slash-commands.js.map +0 -1
  362. package/dist/core/source-info.d.ts +0 -18
  363. package/dist/core/source-info.d.ts.map +0 -1
  364. package/dist/core/source-info.js +0 -19
  365. package/dist/core/source-info.js.map +0 -1
  366. package/dist/core/system-prompt.d.ts +0 -28
  367. package/dist/core/system-prompt.d.ts.map +0 -1
  368. package/dist/core/system-prompt.js +0 -120
  369. package/dist/core/system-prompt.js.map +0 -1
  370. package/dist/core/telemetry.d.ts +0 -3
  371. package/dist/core/telemetry.d.ts.map +0 -1
  372. package/dist/core/telemetry.js +0 -9
  373. package/dist/core/telemetry.js.map +0 -1
  374. package/dist/core/timings.d.ts +0 -8
  375. package/dist/core/timings.d.ts.map +0 -1
  376. package/dist/core/timings.js +0 -31
  377. package/dist/core/timings.js.map +0 -1
  378. package/dist/core/tools/bash.d.ts +0 -68
  379. package/dist/core/tools/bash.d.ts.map +0 -1
  380. package/dist/core/tools/bash.js +0 -355
  381. package/dist/core/tools/bash.js.map +0 -1
  382. package/dist/core/tools/edit-diff.d.ts +0 -85
  383. package/dist/core/tools/edit-diff.d.ts.map +0 -1
  384. package/dist/core/tools/edit-diff.js +0 -337
  385. package/dist/core/tools/edit-diff.js.map +0 -1
  386. package/dist/core/tools/edit.d.ts +0 -49
  387. package/dist/core/tools/edit.d.ts.map +0 -1
  388. package/dist/core/tools/edit.js +0 -323
  389. package/dist/core/tools/edit.js.map +0 -1
  390. package/dist/core/tools/file-mutation-queue.d.ts +0 -6
  391. package/dist/core/tools/file-mutation-queue.d.ts.map +0 -1
  392. package/dist/core/tools/file-mutation-queue.js +0 -37
  393. package/dist/core/tools/file-mutation-queue.js.map +0 -1
  394. package/dist/core/tools/find.d.ts +0 -35
  395. package/dist/core/tools/find.d.ts.map +0 -1
  396. package/dist/core/tools/find.js +0 -298
  397. package/dist/core/tools/find.js.map +0 -1
  398. package/dist/core/tools/grep.d.ts +0 -37
  399. package/dist/core/tools/grep.d.ts.map +0 -1
  400. package/dist/core/tools/grep.js +0 -304
  401. package/dist/core/tools/grep.js.map +0 -1
  402. package/dist/core/tools/index.d.ts +0 -40
  403. package/dist/core/tools/index.d.ts.map +0 -1
  404. package/dist/core/tools/index.js +0 -112
  405. package/dist/core/tools/index.js.map +0 -1
  406. package/dist/core/tools/ls.d.ts +0 -37
  407. package/dist/core/tools/ls.d.ts.map +0 -1
  408. package/dist/core/tools/ls.js +0 -169
  409. package/dist/core/tools/ls.js.map +0 -1
  410. package/dist/core/tools/path-utils.d.ts +0 -8
  411. package/dist/core/tools/path-utils.d.ts.map +0 -1
  412. package/dist/core/tools/path-utils.js +0 -81
  413. package/dist/core/tools/path-utils.js.map +0 -1
  414. package/dist/core/tools/read.d.ts +0 -35
  415. package/dist/core/tools/read.d.ts.map +0 -1
  416. package/dist/core/tools/read.js +0 -232
  417. package/dist/core/tools/read.js.map +0 -1
  418. package/dist/core/tools/render-utils.d.ts +0 -21
  419. package/dist/core/tools/render-utils.d.ts.map +0 -1
  420. package/dist/core/tools/render-utils.js +0 -49
  421. package/dist/core/tools/render-utils.js.map +0 -1
  422. package/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  423. package/dist/core/tools/tool-definition-wrapper.d.ts.map +0 -1
  424. package/dist/core/tools/tool-definition-wrapper.js +0 -34
  425. package/dist/core/tools/tool-definition-wrapper.js.map +0 -1
  426. package/dist/core/tools/truncate.d.ts +0 -70
  427. package/dist/core/tools/truncate.d.ts.map +0 -1
  428. package/dist/core/tools/truncate.js +0 -205
  429. package/dist/core/tools/truncate.js.map +0 -1
  430. package/dist/core/tools/write.d.ts +0 -26
  431. package/dist/core/tools/write.d.ts.map +0 -1
  432. package/dist/core/tools/write.js +0 -213
  433. package/dist/core/tools/write.js.map +0 -1
  434. package/dist/index.d.ts +0 -28
  435. package/dist/index.d.ts.map +0 -1
  436. package/dist/index.js +0 -41
  437. package/dist/index.js.map +0 -1
  438. package/dist/main.d.ts +0 -12
  439. package/dist/main.d.ts.map +0 -1
  440. package/dist/main.js +0 -589
  441. package/dist/main.js.map +0 -1
  442. package/dist/migrations.d.ts +0 -33
  443. package/dist/migrations.d.ts.map +0 -1
  444. package/dist/migrations.js +0 -281
  445. package/dist/migrations.js.map +0 -1
  446. package/dist/modes/index.d.ts +0 -9
  447. package/dist/modes/index.d.ts.map +0 -1
  448. package/dist/modes/index.js +0 -8
  449. package/dist/modes/index.js.map +0 -1
  450. package/dist/modes/interactive/assets/clankolas.png +0 -0
  451. package/dist/modes/interactive/components/aery-splash.d.ts +0 -18
  452. package/dist/modes/interactive/components/aery-splash.d.ts.map +0 -1
  453. package/dist/modes/interactive/components/aery-splash.js +0 -60
  454. package/dist/modes/interactive/components/aery-splash.js.map +0 -1
  455. package/dist/modes/interactive/components/armin.d.ts +0 -34
  456. package/dist/modes/interactive/components/armin.d.ts.map +0 -1
  457. package/dist/modes/interactive/components/armin.js +0 -333
  458. package/dist/modes/interactive/components/armin.js.map +0 -1
  459. package/dist/modes/interactive/components/assistant-message.d.ts +0 -20
  460. package/dist/modes/interactive/components/assistant-message.d.ts.map +0 -1
  461. package/dist/modes/interactive/components/assistant-message.js +0 -121
  462. package/dist/modes/interactive/components/assistant-message.js.map +0 -1
  463. package/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  464. package/dist/modes/interactive/components/bash-execution.d.ts.map +0 -1
  465. package/dist/modes/interactive/components/bash-execution.js +0 -175
  466. package/dist/modes/interactive/components/bash-execution.js.map +0 -1
  467. package/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  468. package/dist/modes/interactive/components/bordered-loader.d.ts.map +0 -1
  469. package/dist/modes/interactive/components/bordered-loader.js +0 -54
  470. package/dist/modes/interactive/components/bordered-loader.js.map +0 -1
  471. package/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  472. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +0 -1
  473. package/dist/modes/interactive/components/branch-summary-message.js +0 -44
  474. package/dist/modes/interactive/components/branch-summary-message.js.map +0 -1
  475. package/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  476. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
  477. package/dist/modes/interactive/components/compaction-summary-message.js +0 -45
  478. package/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
  479. package/dist/modes/interactive/components/config-selector.d.ts +0 -71
  480. package/dist/modes/interactive/components/config-selector.d.ts.map +0 -1
  481. package/dist/modes/interactive/components/config-selector.js +0 -481
  482. package/dist/modes/interactive/components/config-selector.js.map +0 -1
  483. package/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  484. package/dist/modes/interactive/components/countdown-timer.d.ts.map +0 -1
  485. package/dist/modes/interactive/components/countdown-timer.js +0 -33
  486. package/dist/modes/interactive/components/countdown-timer.js.map +0 -1
  487. package/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  488. package/dist/modes/interactive/components/custom-editor.d.ts.map +0 -1
  489. package/dist/modes/interactive/components/custom-editor.js +0 -70
  490. package/dist/modes/interactive/components/custom-editor.js.map +0 -1
  491. package/dist/modes/interactive/components/custom-message.d.ts +0 -20
  492. package/dist/modes/interactive/components/custom-message.d.ts.map +0 -1
  493. package/dist/modes/interactive/components/custom-message.js +0 -79
  494. package/dist/modes/interactive/components/custom-message.js.map +0 -1
  495. package/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  496. package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  497. package/dist/modes/interactive/components/daxnuts.js +0 -140
  498. package/dist/modes/interactive/components/daxnuts.js.map +0 -1
  499. package/dist/modes/interactive/components/diff.d.ts +0 -12
  500. package/dist/modes/interactive/components/diff.d.ts.map +0 -1
  501. package/dist/modes/interactive/components/diff.js +0 -133
  502. package/dist/modes/interactive/components/diff.js.map +0 -1
  503. package/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  504. package/dist/modes/interactive/components/dynamic-border.d.ts.map +0 -1
  505. package/dist/modes/interactive/components/dynamic-border.js +0 -21
  506. package/dist/modes/interactive/components/dynamic-border.js.map +0 -1
  507. package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  508. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
  509. package/dist/modes/interactive/components/earendil-announcement.js +0 -40
  510. package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
  511. package/dist/modes/interactive/components/extension-editor.d.ts +0 -20
  512. package/dist/modes/interactive/components/extension-editor.d.ts.map +0 -1
  513. package/dist/modes/interactive/components/extension-editor.js +0 -111
  514. package/dist/modes/interactive/components/extension-editor.js.map +0 -1
  515. package/dist/modes/interactive/components/extension-input.d.ts +0 -23
  516. package/dist/modes/interactive/components/extension-input.d.ts.map +0 -1
  517. package/dist/modes/interactive/components/extension-input.js +0 -61
  518. package/dist/modes/interactive/components/extension-input.js.map +0 -1
  519. package/dist/modes/interactive/components/extension-selector.d.ts +0 -24
  520. package/dist/modes/interactive/components/extension-selector.d.ts.map +0 -1
  521. package/dist/modes/interactive/components/extension-selector.js +0 -78
  522. package/dist/modes/interactive/components/extension-selector.js.map +0 -1
  523. package/dist/modes/interactive/components/footer.d.ts +0 -27
  524. package/dist/modes/interactive/components/footer.d.ts.map +0 -1
  525. package/dist/modes/interactive/components/footer.js +0 -201
  526. package/dist/modes/interactive/components/footer.js.map +0 -1
  527. package/dist/modes/interactive/components/index.d.ts +0 -32
  528. package/dist/modes/interactive/components/index.d.ts.map +0 -1
  529. package/dist/modes/interactive/components/index.js +0 -33
  530. package/dist/modes/interactive/components/index.js.map +0 -1
  531. package/dist/modes/interactive/components/keybinding-hints.d.ts +0 -8
  532. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +0 -1
  533. package/dist/modes/interactive/components/keybinding-hints.js +0 -22
  534. package/dist/modes/interactive/components/keybinding-hints.js.map +0 -1
  535. package/dist/modes/interactive/components/login-dialog.d.ts +0 -46
  536. package/dist/modes/interactive/components/login-dialog.d.ts.map +0 -1
  537. package/dist/modes/interactive/components/login-dialog.js +0 -158
  538. package/dist/modes/interactive/components/login-dialog.js.map +0 -1
  539. package/dist/modes/interactive/components/model-selector.d.ts +0 -47
  540. package/dist/modes/interactive/components/model-selector.d.ts.map +0 -1
  541. package/dist/modes/interactive/components/model-selector.js +0 -278
  542. package/dist/modes/interactive/components/model-selector.js.map +0 -1
  543. package/dist/modes/interactive/components/oauth-selector.d.ts +0 -29
  544. package/dist/modes/interactive/components/oauth-selector.d.ts.map +0 -1
  545. package/dist/modes/interactive/components/oauth-selector.js +0 -141
  546. package/dist/modes/interactive/components/oauth-selector.js.map +0 -1
  547. package/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  548. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +0 -1
  549. package/dist/modes/interactive/components/scoped-models-selector.js +0 -290
  550. package/dist/modes/interactive/components/scoped-models-selector.js.map +0 -1
  551. package/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  552. package/dist/modes/interactive/components/session-selector-search.d.ts.map +0 -1
  553. package/dist/modes/interactive/components/session-selector-search.js +0 -155
  554. package/dist/modes/interactive/components/session-selector-search.js.map +0 -1
  555. package/dist/modes/interactive/components/session-selector.d.ts +0 -96
  556. package/dist/modes/interactive/components/session-selector.d.ts.map +0 -1
  557. package/dist/modes/interactive/components/session-selector.js +0 -861
  558. package/dist/modes/interactive/components/session-selector.js.map +0 -1
  559. package/dist/modes/interactive/components/settings-selector.d.ts +0 -67
  560. package/dist/modes/interactive/components/settings-selector.d.ts.map +0 -1
  561. package/dist/modes/interactive/components/settings-selector.js +0 -373
  562. package/dist/modes/interactive/components/settings-selector.js.map +0 -1
  563. package/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  564. package/dist/modes/interactive/components/show-images-selector.d.ts.map +0 -1
  565. package/dist/modes/interactive/components/show-images-selector.js +0 -39
  566. package/dist/modes/interactive/components/show-images-selector.js.map +0 -1
  567. package/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  568. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +0 -1
  569. package/dist/modes/interactive/components/skill-invocation-message.js +0 -47
  570. package/dist/modes/interactive/components/skill-invocation-message.js.map +0 -1
  571. package/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  572. package/dist/modes/interactive/components/theme-selector.d.ts.map +0 -1
  573. package/dist/modes/interactive/components/theme-selector.js +0 -50
  574. package/dist/modes/interactive/components/theme-selector.js.map +0 -1
  575. package/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  576. package/dist/modes/interactive/components/thinking-selector.d.ts.map +0 -1
  577. package/dist/modes/interactive/components/thinking-selector.js +0 -51
  578. package/dist/modes/interactive/components/thinking-selector.js.map +0 -1
  579. package/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  580. package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
  581. package/dist/modes/interactive/components/tool-execution.js +0 -295
  582. package/dist/modes/interactive/components/tool-execution.js.map +0 -1
  583. package/dist/modes/interactive/components/tree-selector.d.ts +0 -89
  584. package/dist/modes/interactive/components/tree-selector.d.ts.map +0 -1
  585. package/dist/modes/interactive/components/tree-selector.js +0 -1092
  586. package/dist/modes/interactive/components/tree-selector.js.map +0 -1
  587. package/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  588. package/dist/modes/interactive/components/user-message-selector.d.ts.map +0 -1
  589. package/dist/modes/interactive/components/user-message-selector.js +0 -114
  590. package/dist/modes/interactive/components/user-message-selector.js.map +0 -1
  591. package/dist/modes/interactive/components/user-message.d.ts +0 -10
  592. package/dist/modes/interactive/components/user-message.d.ts.map +0 -1
  593. package/dist/modes/interactive/components/user-message.js +0 -29
  594. package/dist/modes/interactive/components/user-message.js.map +0 -1
  595. package/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  596. package/dist/modes/interactive/components/visual-truncate.d.ts.map +0 -1
  597. package/dist/modes/interactive/components/visual-truncate.js +0 -33
  598. package/dist/modes/interactive/components/visual-truncate.js.map +0 -1
  599. package/dist/modes/interactive/interactive-mode.d.ts +0 -359
  600. package/dist/modes/interactive/interactive-mode.d.ts.map +0 -1
  601. package/dist/modes/interactive/interactive-mode.js +0 -4573
  602. package/dist/modes/interactive/interactive-mode.js.map +0 -1
  603. package/dist/modes/interactive/theme/aery.json +0 -84
  604. package/dist/modes/interactive/theme/catppuccin-mocha.json +0 -81
  605. package/dist/modes/interactive/theme/dark.json +0 -85
  606. package/dist/modes/interactive/theme/dracula.json +0 -81
  607. package/dist/modes/interactive/theme/light.json +0 -84
  608. package/dist/modes/interactive/theme/nord.json +0 -81
  609. package/dist/modes/interactive/theme/theme-schema.json +0 -335
  610. package/dist/modes/interactive/theme/theme.d.ts +0 -81
  611. package/dist/modes/interactive/theme/theme.d.ts.map +0 -1
  612. package/dist/modes/interactive/theme/theme.js +0 -975
  613. package/dist/modes/interactive/theme/theme.js.map +0 -1
  614. package/dist/modes/interactive/theme/tokyo-night.json +0 -81
  615. package/dist/modes/print-mode.d.ts +0 -28
  616. package/dist/modes/print-mode.d.ts.map +0 -1
  617. package/dist/modes/print-mode.js +0 -131
  618. package/dist/modes/print-mode.js.map +0 -1
  619. package/dist/modes/rpc/jsonl.d.ts +0 -17
  620. package/dist/modes/rpc/jsonl.d.ts.map +0 -1
  621. package/dist/modes/rpc/jsonl.js +0 -49
  622. package/dist/modes/rpc/jsonl.js.map +0 -1
  623. package/dist/modes/rpc/rpc-client.d.ts +0 -224
  624. package/dist/modes/rpc/rpc-client.d.ts.map +0 -1
  625. package/dist/modes/rpc/rpc-client.js +0 -410
  626. package/dist/modes/rpc/rpc-client.js.map +0 -1
  627. package/dist/modes/rpc/rpc-mode.d.ts +0 -20
  628. package/dist/modes/rpc/rpc-mode.d.ts.map +0 -1
  629. package/dist/modes/rpc/rpc-mode.js +0 -597
  630. package/dist/modes/rpc/rpc-mode.js.map +0 -1
  631. package/dist/modes/rpc/rpc-types.d.ts +0 -419
  632. package/dist/modes/rpc/rpc-types.d.ts.map +0 -1
  633. package/dist/modes/rpc/rpc-types.js +0 -8
  634. package/dist/modes/rpc/rpc-types.js.map +0 -1
  635. package/dist/package-manager-cli.d.ts +0 -4
  636. package/dist/package-manager-cli.d.ts.map +0 -1
  637. package/dist/package-manager-cli.js +0 -468
  638. package/dist/package-manager-cli.js.map +0 -1
  639. package/dist/utils/aery-user-agent.d.ts +0 -2
  640. package/dist/utils/aery-user-agent.d.ts.map +0 -1
  641. package/dist/utils/aery-user-agent.js +0 -5
  642. package/dist/utils/aery-user-agent.js.map +0 -1
  643. package/dist/utils/changelog.d.ts +0 -21
  644. package/dist/utils/changelog.d.ts.map +0 -1
  645. package/dist/utils/changelog.js +0 -87
  646. package/dist/utils/changelog.js.map +0 -1
  647. package/dist/utils/child-process.d.ts +0 -11
  648. package/dist/utils/child-process.d.ts.map +0 -1
  649. package/dist/utils/child-process.js +0 -78
  650. package/dist/utils/child-process.js.map +0 -1
  651. package/dist/utils/clipboard-image.d.ts +0 -11
  652. package/dist/utils/clipboard-image.d.ts.map +0 -1
  653. package/dist/utils/clipboard-image.js +0 -245
  654. package/dist/utils/clipboard-image.js.map +0 -1
  655. package/dist/utils/clipboard-native.d.ts +0 -8
  656. package/dist/utils/clipboard-native.d.ts.map +0 -1
  657. package/dist/utils/clipboard-native.js +0 -14
  658. package/dist/utils/clipboard-native.js.map +0 -1
  659. package/dist/utils/clipboard.d.ts +0 -2
  660. package/dist/utils/clipboard.d.ts.map +0 -1
  661. package/dist/utils/clipboard.js +0 -110
  662. package/dist/utils/clipboard.js.map +0 -1
  663. package/dist/utils/exif-orientation.d.ts +0 -5
  664. package/dist/utils/exif-orientation.d.ts.map +0 -1
  665. package/dist/utils/exif-orientation.js +0 -158
  666. package/dist/utils/exif-orientation.js.map +0 -1
  667. package/dist/utils/frontmatter.d.ts +0 -8
  668. package/dist/utils/frontmatter.d.ts.map +0 -1
  669. package/dist/utils/frontmatter.js +0 -26
  670. package/dist/utils/frontmatter.js.map +0 -1
  671. package/dist/utils/fs-watch.d.ts +0 -5
  672. package/dist/utils/fs-watch.d.ts.map +0 -1
  673. package/dist/utils/fs-watch.js +0 -25
  674. package/dist/utils/fs-watch.js.map +0 -1
  675. package/dist/utils/git.d.ts +0 -26
  676. package/dist/utils/git.d.ts.map +0 -1
  677. package/dist/utils/git.js +0 -163
  678. package/dist/utils/git.js.map +0 -1
  679. package/dist/utils/image-convert.d.ts +0 -9
  680. package/dist/utils/image-convert.d.ts.map +0 -1
  681. package/dist/utils/image-convert.js +0 -39
  682. package/dist/utils/image-convert.js.map +0 -1
  683. package/dist/utils/image-resize.d.ts +0 -36
  684. package/dist/utils/image-resize.d.ts.map +0 -1
  685. package/dist/utils/image-resize.js +0 -137
  686. package/dist/utils/image-resize.js.map +0 -1
  687. package/dist/utils/mime.d.ts +0 -2
  688. package/dist/utils/mime.d.ts.map +0 -1
  689. package/dist/utils/mime.js +0 -26
  690. package/dist/utils/mime.js.map +0 -1
  691. package/dist/utils/paths.d.ts +0 -14
  692. package/dist/utils/paths.d.ts.map +0 -1
  693. package/dist/utils/paths.js +0 -34
  694. package/dist/utils/paths.js.map +0 -1
  695. package/dist/utils/photon.d.ts +0 -21
  696. package/dist/utils/photon.d.ts.map +0 -1
  697. package/dist/utils/photon.js +0 -121
  698. package/dist/utils/photon.js.map +0 -1
  699. package/dist/utils/shell.d.ts +0 -30
  700. package/dist/utils/shell.d.ts.map +0 -1
  701. package/dist/utils/shell.js +0 -190
  702. package/dist/utils/shell.js.map +0 -1
  703. package/dist/utils/sleep.d.ts +0 -5
  704. package/dist/utils/sleep.d.ts.map +0 -1
  705. package/dist/utils/sleep.js +0 -17
  706. package/dist/utils/sleep.js.map +0 -1
  707. package/dist/utils/tools-manager.d.ts +0 -3
  708. package/dist/utils/tools-manager.d.ts.map +0 -1
  709. package/dist/utils/tools-manager.js +0 -256
  710. package/dist/utils/tools-manager.js.map +0 -1
  711. package/dist/utils/version-check.d.ts +0 -7
  712. package/dist/utils/version-check.d.ts.map +0 -1
  713. package/dist/utils/version-check.js +0 -70
  714. package/dist/utils/version-check.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,SAAS,EACT,KAAK,SAAS,EAMd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAI7E,MAAM,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAU,YAAW,SAAS;IACzE,OAAO,CAAC,WAAW,CAAQ;IAG3B,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,gBAAgB,CAAa;IAErC,YACC,IAAI,EAAE,OAAO,GAAG,QAAQ,EACxB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,oBAAoB,EAAE,EACjC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,EACtC,QAAQ,EAAE,MAAM,IAAI,EACpB,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,UAAU,EAyCnD;IAED,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,UAAU;IAmDlB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CA8BjC;CACD","sourcesContent":["import {\n\tContainer,\n\ttype Focusable,\n\tfuzzyFilter,\n\tgetKeybindings,\n\tInput,\n\tSpacer,\n\tTruncatedText,\n} from \"@eminent337/aery-tui\";\nimport type { AuthStatus, AuthStorage } from \"../../../core/auth-storage.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nexport type AuthSelectorProvider = {\n\tid: string;\n\tname: string;\n\tauthType: \"oauth\" | \"api_key\";\n};\n\n/**\n * Component that renders an auth provider selector\n */\nexport class OAuthSelectorComponent extends Container implements Focusable {\n\tprivate searchInput: Input;\n\n\t// Focusable implementation - propagate to search input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\tprivate listContainer: Container;\n\tprivate allProviders: AuthSelectorProvider[];\n\tprivate filteredProviders: AuthSelectorProvider[];\n\tprivate selectedIndex: number = 0;\n\tprivate mode: \"login\" | \"logout\";\n\tprivate authStorage: AuthStorage;\n\tprivate onSelectCallback: (providerId: string) => void;\n\tprivate onCancelCallback: () => void;\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tauthStorage: AuthStorage,\n\t\tproviders: AuthSelectorProvider[],\n\t\tonSelect: (providerId: string) => void,\n\t\tonCancel: () => void,\n\t\t_getAuthStatus?: (providerId: string) => AuthStatus,\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\t\tthis.authStorage = authStorage;\n\t\tthis.allProviders = providers;\n\t\tthis.filteredProviders = providers;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title = mode === \"login\" ? \"Select provider to configure:\" : \"Select provider to logout:\";\n\t\tthis.addChild(new TruncatedText(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onSubmit = () => {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t};\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Initial render\n\t\tthis.filterProviders(\"\");\n\t}\n\n\tprivate filterProviders(query: string): void {\n\t\tthis.filteredProviders = query\n\t\t\t? fuzzyFilter(this.allProviders, query, (provider) => `${provider.name} ${provider.id} ${provider.authType}`)\n\t\t\t: this.allProviders;\n\t\tthis.selectedIndex = Math.max(0, Math.min(this.selectedIndex, Math.max(0, this.filteredProviders.length - 1)));\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tconst maxVisible = 8;\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredProviders.length - maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + maxVisible, this.filteredProviders.length);\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst provider = this.filteredProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\t// Check if user is configured for this provider\n\t\t\tconst credentials = this.authStorage.get(provider.id);\n\t\t\tconst statusIndicator = credentials\n\t\t\t\t? theme.fg(\"success\", \" ✓ configured\")\n\t\t\t\t: theme.fg(\"muted\", \" • unconfigured\");\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst prefix = theme.fg(\"accent\", \"→ \");\n\t\t\t\tconst text = theme.fg(\"accent\", provider.name);\n\t\t\t\tline = prefix + text + statusIndicator;\n\t\t\t} else {\n\t\t\t\tconst text = ` ${theme.fg(\"text\", provider.name)}`;\n\t\t\t\tline = text + statusIndicator;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new TruncatedText(line, 1, 0));\n\t\t}\n\n\t\tif (startIndex > 0 || endIndex < this.filteredProviders.length) {\n\t\t\tconst scrollInfo = theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredProviders.length})`);\n\t\t\tthis.listContainer.addChild(new TruncatedText(scrollInfo, 1, 0));\n\t\t}\n\n\t\t// Show \"no providers\" if empty\n\t\tif (this.filteredProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.allProviders.length === 0\n\t\t\t\t\t? this.mode === \"login\"\n\t\t\t\t\t\t? \"No providers available\"\n\t\t\t\t\t\t: \"No providers logged in. Use /login first.\"\n\t\t\t\t\t: \"No matching providers\";\n\t\t\tthis.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", ` ${message}`), 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\t// Up arrow\n\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (kb.matches(keyData, \"tui.select.down\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = Math.min(this.filteredProviders.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape or Ctrl+C\n\t\telse if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t\t// Pass everything else to search input\n\t\telse {\n\t\t\tthis.searchInput.handleInput(keyData);\n\t\t\tthis.filterProviders(this.searchInput.getValue());\n\t\t}\n\t}\n}\n"]}
@@ -1,141 +0,0 @@
1
- import { Container, fuzzyFilter, getKeybindings, Input, Spacer, TruncatedText, } from "@eminent337/aery-tui";
2
- import { theme } from "../theme/theme.js";
3
- import { DynamicBorder } from "./dynamic-border.js";
4
- /**
5
- * Component that renders an auth provider selector
6
- */
7
- export class OAuthSelectorComponent extends Container {
8
- searchInput;
9
- // Focusable implementation - propagate to search input for IME cursor positioning
10
- _focused = false;
11
- get focused() {
12
- return this._focused;
13
- }
14
- set focused(value) {
15
- this._focused = value;
16
- this.searchInput.focused = value;
17
- }
18
- listContainer;
19
- allProviders;
20
- filteredProviders;
21
- selectedIndex = 0;
22
- mode;
23
- authStorage;
24
- onSelectCallback;
25
- onCancelCallback;
26
- constructor(mode, authStorage, providers, onSelect, onCancel, _getAuthStatus) {
27
- super();
28
- this.mode = mode;
29
- this.authStorage = authStorage;
30
- this.allProviders = providers;
31
- this.filteredProviders = providers;
32
- this.onSelectCallback = onSelect;
33
- this.onCancelCallback = onCancel;
34
- // Add top border
35
- this.addChild(new DynamicBorder());
36
- this.addChild(new Spacer(1));
37
- // Add title
38
- const title = mode === "login" ? "Select provider to configure:" : "Select provider to logout:";
39
- this.addChild(new TruncatedText(theme.fg("accent", theme.bold(title)), 1, 0));
40
- this.addChild(new Spacer(1));
41
- this.searchInput = new Input();
42
- this.searchInput.onSubmit = () => {
43
- const selectedProvider = this.filteredProviders[this.selectedIndex];
44
- if (selectedProvider) {
45
- this.onSelectCallback(selectedProvider.id);
46
- }
47
- };
48
- this.addChild(this.searchInput);
49
- this.addChild(new Spacer(1));
50
- // Create list container
51
- this.listContainer = new Container();
52
- this.addChild(this.listContainer);
53
- this.addChild(new Spacer(1));
54
- // Add bottom border
55
- this.addChild(new DynamicBorder());
56
- // Initial render
57
- this.filterProviders("");
58
- }
59
- filterProviders(query) {
60
- this.filteredProviders = query
61
- ? fuzzyFilter(this.allProviders, query, (provider) => `${provider.name} ${provider.id} ${provider.authType}`)
62
- : this.allProviders;
63
- this.selectedIndex = Math.max(0, Math.min(this.selectedIndex, Math.max(0, this.filteredProviders.length - 1)));
64
- this.updateList();
65
- }
66
- updateList() {
67
- this.listContainer.clear();
68
- const maxVisible = 8;
69
- const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredProviders.length - maxVisible));
70
- const endIndex = Math.min(startIndex + maxVisible, this.filteredProviders.length);
71
- for (let i = startIndex; i < endIndex; i++) {
72
- const provider = this.filteredProviders[i];
73
- if (!provider)
74
- continue;
75
- const isSelected = i === this.selectedIndex;
76
- // Check if user is configured for this provider
77
- const credentials = this.authStorage.get(provider.id);
78
- const statusIndicator = credentials
79
- ? theme.fg("success", " ✓ configured")
80
- : theme.fg("muted", " • unconfigured");
81
- let line = "";
82
- if (isSelected) {
83
- const prefix = theme.fg("accent", "→ ");
84
- const text = theme.fg("accent", provider.name);
85
- line = prefix + text + statusIndicator;
86
- }
87
- else {
88
- const text = ` ${theme.fg("text", provider.name)}`;
89
- line = text + statusIndicator;
90
- }
91
- this.listContainer.addChild(new TruncatedText(line, 1, 0));
92
- }
93
- if (startIndex > 0 || endIndex < this.filteredProviders.length) {
94
- const scrollInfo = theme.fg("muted", ` (${this.selectedIndex + 1}/${this.filteredProviders.length})`);
95
- this.listContainer.addChild(new TruncatedText(scrollInfo, 1, 0));
96
- }
97
- // Show "no providers" if empty
98
- if (this.filteredProviders.length === 0) {
99
- const message = this.allProviders.length === 0
100
- ? this.mode === "login"
101
- ? "No providers available"
102
- : "No providers logged in. Use /login first."
103
- : "No matching providers";
104
- this.listContainer.addChild(new TruncatedText(theme.fg("muted", ` ${message}`), 1, 0));
105
- }
106
- }
107
- handleInput(keyData) {
108
- const kb = getKeybindings();
109
- // Up arrow
110
- if (kb.matches(keyData, "tui.select.up")) {
111
- if (this.filteredProviders.length === 0)
112
- return;
113
- this.selectedIndex = Math.max(0, this.selectedIndex - 1);
114
- this.updateList();
115
- }
116
- // Down arrow
117
- else if (kb.matches(keyData, "tui.select.down")) {
118
- if (this.filteredProviders.length === 0)
119
- return;
120
- this.selectedIndex = Math.min(this.filteredProviders.length - 1, this.selectedIndex + 1);
121
- this.updateList();
122
- }
123
- // Enter
124
- else if (kb.matches(keyData, "tui.select.confirm")) {
125
- const selectedProvider = this.filteredProviders[this.selectedIndex];
126
- if (selectedProvider) {
127
- this.onSelectCallback(selectedProvider.id);
128
- }
129
- }
130
- // Escape or Ctrl+C
131
- else if (kb.matches(keyData, "tui.select.cancel")) {
132
- this.onCancelCallback();
133
- }
134
- // Pass everything else to search input
135
- else {
136
- this.searchInput.handleInput(keyData);
137
- this.filterProviders(this.searchInput.getValue());
138
- }
139
- }
140
- }
141
- //# sourceMappingURL=oauth-selector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tContainer,\n\ttype Focusable,\n\tfuzzyFilter,\n\tgetKeybindings,\n\tInput,\n\tSpacer,\n\tTruncatedText,\n} from \"@eminent337/aery-tui\";\nimport type { AuthStatus, AuthStorage } from \"../../../core/auth-storage.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nexport type AuthSelectorProvider = {\n\tid: string;\n\tname: string;\n\tauthType: \"oauth\" | \"api_key\";\n};\n\n/**\n * Component that renders an auth provider selector\n */\nexport class OAuthSelectorComponent extends Container implements Focusable {\n\tprivate searchInput: Input;\n\n\t// Focusable implementation - propagate to search input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\tprivate listContainer: Container;\n\tprivate allProviders: AuthSelectorProvider[];\n\tprivate filteredProviders: AuthSelectorProvider[];\n\tprivate selectedIndex: number = 0;\n\tprivate mode: \"login\" | \"logout\";\n\tprivate authStorage: AuthStorage;\n\tprivate onSelectCallback: (providerId: string) => void;\n\tprivate onCancelCallback: () => void;\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tauthStorage: AuthStorage,\n\t\tproviders: AuthSelectorProvider[],\n\t\tonSelect: (providerId: string) => void,\n\t\tonCancel: () => void,\n\t\t_getAuthStatus?: (providerId: string) => AuthStatus,\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\t\tthis.authStorage = authStorage;\n\t\tthis.allProviders = providers;\n\t\tthis.filteredProviders = providers;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title = mode === \"login\" ? \"Select provider to configure:\" : \"Select provider to logout:\";\n\t\tthis.addChild(new TruncatedText(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onSubmit = () => {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t};\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Initial render\n\t\tthis.filterProviders(\"\");\n\t}\n\n\tprivate filterProviders(query: string): void {\n\t\tthis.filteredProviders = query\n\t\t\t? fuzzyFilter(this.allProviders, query, (provider) => `${provider.name} ${provider.id} ${provider.authType}`)\n\t\t\t: this.allProviders;\n\t\tthis.selectedIndex = Math.max(0, Math.min(this.selectedIndex, Math.max(0, this.filteredProviders.length - 1)));\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tconst maxVisible = 8;\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredProviders.length - maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + maxVisible, this.filteredProviders.length);\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst provider = this.filteredProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\t// Check if user is configured for this provider\n\t\t\tconst credentials = this.authStorage.get(provider.id);\n\t\t\tconst statusIndicator = credentials\n\t\t\t\t? theme.fg(\"success\", \" ✓ configured\")\n\t\t\t\t: theme.fg(\"muted\", \" • unconfigured\");\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst prefix = theme.fg(\"accent\", \"→ \");\n\t\t\t\tconst text = theme.fg(\"accent\", provider.name);\n\t\t\t\tline = prefix + text + statusIndicator;\n\t\t\t} else {\n\t\t\t\tconst text = ` ${theme.fg(\"text\", provider.name)}`;\n\t\t\t\tline = text + statusIndicator;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new TruncatedText(line, 1, 0));\n\t\t}\n\n\t\tif (startIndex > 0 || endIndex < this.filteredProviders.length) {\n\t\t\tconst scrollInfo = theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredProviders.length})`);\n\t\t\tthis.listContainer.addChild(new TruncatedText(scrollInfo, 1, 0));\n\t\t}\n\n\t\t// Show \"no providers\" if empty\n\t\tif (this.filteredProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.allProviders.length === 0\n\t\t\t\t\t? this.mode === \"login\"\n\t\t\t\t\t\t? \"No providers available\"\n\t\t\t\t\t\t: \"No providers logged in. Use /login first.\"\n\t\t\t\t\t: \"No matching providers\";\n\t\t\tthis.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", ` ${message}`), 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\t// Up arrow\n\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow\n\t\telse if (kb.matches(keyData, \"tui.select.down\")) {\n\t\t\tif (this.filteredProviders.length === 0) return;\n\t\t\tthis.selectedIndex = Math.min(this.filteredProviders.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\tconst selectedProvider = this.filteredProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape or Ctrl+C\n\t\telse if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t\t// Pass everything else to search input\n\t\telse {\n\t\t\tthis.searchInput.handleInput(keyData);\n\t\t\tthis.filterProviders(this.searchInput.getValue());\n\t\t}\n\t}\n}\n"]}
@@ -1,42 +0,0 @@
1
- import type { Model } from "@eminent337/aery-ai";
2
- import { Container, type Focusable, Input } from "@eminent337/aery-tui";
3
- export interface ModelsConfig {
4
- allModels: Model<any>[];
5
- enabledModelIds: string[] | null;
6
- }
7
- export interface ModelsCallbacks {
8
- /** Called whenever the enabled model set or order changes (session-only, no persist) */
9
- onChange: (enabledModelIds: string[] | null) => void | Promise<void>;
10
- /** Called when user wants to persist current selection to settings */
11
- onPersist: (enabledModelIds: string[] | null) => void | Promise<void>;
12
- onCancel: () => void;
13
- }
14
- /**
15
- * Component for enabling/disabling models for Ctrl+P cycling.
16
- * Changes are session-only until explicitly persisted with Ctrl+S.
17
- */
18
- export declare class ScopedModelsSelectorComponent extends Container implements Focusable {
19
- private modelsById;
20
- private allIds;
21
- private enabledIds;
22
- private filteredItems;
23
- private selectedIndex;
24
- private searchInput;
25
- private _focused;
26
- get focused(): boolean;
27
- set focused(value: boolean);
28
- private listContainer;
29
- private footerText;
30
- private callbacks;
31
- private maxVisible;
32
- private isDirty;
33
- constructor(config: ModelsConfig, callbacks: ModelsCallbacks);
34
- private buildItems;
35
- private getFooterText;
36
- private refresh;
37
- private notifyChange;
38
- private updateList;
39
- handleInput(data: string): void;
40
- getSearchInput(): Input;
41
- }
42
- //# sourceMappingURL=scoped-models-selector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoped-models-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/scoped-models-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACN,SAAS,EACT,KAAK,SAAS,EAGd,KAAK,EAKL,MAAM,sBAAsB,CAAC;AA6D9B,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC/B,wFAAwF;IACxF,QAAQ,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,sEAAsE;IACtE,SAAS,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,6BAA8B,SAAQ,SAAU,YAAW,SAAS;IAChF,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAG3B,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IACD,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAsC3D;IAED,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAuClB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAoH9B;IAED,cAAc,IAAI,KAAK,CAEtB;CACD","sourcesContent":["import type { Model } from \"@eminent337/aery-ai\";\nimport {\n\tContainer,\n\ttype Focusable,\n\tfuzzyFilter,\n\tgetKeybindings,\n\tInput,\n\tKey,\n\tmatchesKey,\n\tSpacer,\n\tText,\n} from \"@eminent337/aery-tui\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { keyText } from \"./keybinding-hints.js\";\n\n// EnabledIds: null = all enabled (no filter), string[] = explicit ordered list\ntype EnabledIds = string[] | null;\n\nfunction isEnabled(enabledIds: EnabledIds, id: string): boolean {\n\treturn enabledIds === null || enabledIds.includes(id);\n}\n\nfunction toggle(enabledIds: EnabledIds, id: string): EnabledIds {\n\tif (enabledIds === null) return [id]; // First toggle: start with only this one\n\tconst index = enabledIds.indexOf(id);\n\tif (index >= 0) return [...enabledIds.slice(0, index), ...enabledIds.slice(index + 1)];\n\treturn [...enabledIds, id];\n}\n\nfunction enableAll(enabledIds: EnabledIds, allIds: string[], targetIds?: string[]): EnabledIds {\n\tif (enabledIds === null) return null; // Already all enabled\n\tconst targets = targetIds ?? allIds;\n\tconst result = [...enabledIds];\n\tfor (const id of targets) {\n\t\tif (!result.includes(id)) result.push(id);\n\t}\n\treturn result.length === allIds.length ? null : result;\n}\n\nfunction clearAll(enabledIds: EnabledIds, allIds: string[], targetIds?: string[]): EnabledIds {\n\tif (enabledIds === null) {\n\t\treturn targetIds ? allIds.filter((id) => !targetIds.includes(id)) : [];\n\t}\n\tconst targets = new Set(targetIds ?? enabledIds);\n\treturn enabledIds.filter((id) => !targets.has(id));\n}\n\nfunction move(enabledIds: EnabledIds, id: string, delta: number): EnabledIds {\n\tif (enabledIds === null) return null;\n\tconst list = [...enabledIds];\n\tconst index = list.indexOf(id);\n\tif (index < 0) return list;\n\tconst newIndex = index + delta;\n\tif (newIndex < 0 || newIndex >= list.length) return list;\n\tconst result = [...list];\n\t[result[index], result[newIndex]] = [result[newIndex], result[index]];\n\treturn result;\n}\n\nfunction getSortedIds(enabledIds: EnabledIds, allIds: string[]): string[] {\n\tif (enabledIds === null) return allIds;\n\tconst enabledSet = new Set(enabledIds);\n\treturn [...enabledIds, ...allIds.filter((id) => !enabledSet.has(id))];\n}\n\ninterface ModelItem {\n\tfullId: string;\n\tmodel: Model<any>;\n\tenabled: boolean;\n}\n\nexport interface ModelsConfig {\n\tallModels: Model<any>[];\n\tenabledModelIds: string[] | null;\n}\n\nexport interface ModelsCallbacks {\n\t/** Called whenever the enabled model set or order changes (session-only, no persist) */\n\tonChange: (enabledModelIds: string[] | null) => void | Promise<void>;\n\t/** Called when user wants to persist current selection to settings */\n\tonPersist: (enabledModelIds: string[] | null) => void | Promise<void>;\n\tonCancel: () => void;\n}\n\n/**\n * Component for enabling/disabling models for Ctrl+P cycling.\n * Changes are session-only until explicitly persisted with Ctrl+S.\n */\nexport class ScopedModelsSelectorComponent extends Container implements Focusable {\n\tprivate modelsById: Map<string, Model<any>> = new Map();\n\tprivate allIds: string[] = [];\n\tprivate enabledIds: EnabledIds = null;\n\tprivate filteredItems: ModelItem[] = [];\n\tprivate selectedIndex = 0;\n\tprivate searchInput: Input;\n\n\t// Focusable implementation - propagate to searchInput for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\tprivate listContainer: Container;\n\tprivate footerText: Text;\n\tprivate callbacks: ModelsCallbacks;\n\tprivate maxVisible = 8;\n\tprivate isDirty = false;\n\n\tconstructor(config: ModelsConfig, callbacks: ModelsCallbacks) {\n\t\tsuper();\n\t\tthis.callbacks = callbacks;\n\n\t\tfor (const model of config.allModels) {\n\t\t\tconst fullId = `${model.provider}/${model.id}`;\n\t\t\tthis.modelsById.set(fullId, model);\n\t\t\tthis.allIds.push(fullId);\n\t\t}\n\n\t\tthis.enabledIds = config.enabledModelIds === null ? null : [...config.enabledModelIds];\n\t\tthis.filteredItems = this.buildItems();\n\n\t\t// Header\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Model Configuration\")), 0, 0));\n\t\tthis.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", `Session-only. ${keyText(\"app.models.save\")} to save to settings.`), 0, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Search input\n\t\tthis.searchInput = new Input();\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// List container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\t// Footer hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.footerText = new Text(this.getFooterText(), 0, 0);\n\t\tthis.addChild(this.footerText);\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.updateList();\n\t}\n\n\tprivate buildItems(): ModelItem[] {\n\t\t// Filter out IDs that no longer have a corresponding model (e.g., after logout)\n\t\treturn getSortedIds(this.enabledIds, this.allIds)\n\t\t\t.filter((id) => this.modelsById.has(id))\n\t\t\t.map((id) => ({\n\t\t\t\tfullId: id,\n\t\t\t\tmodel: this.modelsById.get(id)!,\n\t\t\t\tenabled: isEnabled(this.enabledIds, id),\n\t\t\t}));\n\t}\n\n\tprivate getFooterText(): string {\n\t\tconst enabledCount = this.enabledIds?.length ?? this.allIds.length;\n\t\tconst allEnabled = this.enabledIds === null;\n\t\tconst countText = allEnabled ? \"all enabled\" : `${enabledCount}/${this.allIds.length} enabled`;\n\t\tconst parts = [\n\t\t\t`${keyText(\"tui.select.confirm\")} toggle`,\n\t\t\t`${keyText(\"app.models.enableAll\")} all`,\n\t\t\t`${keyText(\"app.models.clearAll\")} clear`,\n\t\t\t`${keyText(\"app.models.toggleProvider\")} provider`,\n\t\t\t`${keyText(\"app.models.reorderUp\")}/${keyText(\"app.models.reorderDown\")} reorder`,\n\t\t\t`${keyText(\"app.models.save\")} save`,\n\t\t\tcountText,\n\t\t];\n\t\treturn this.isDirty\n\t\t\t? theme.fg(\"dim\", ` ${parts.join(\" · \")} `) + theme.fg(\"warning\", \"(unsaved)\")\n\t\t\t: theme.fg(\"dim\", ` ${parts.join(\" · \")}`);\n\t}\n\n\tprivate refresh(): void {\n\t\tconst query = this.searchInput.getValue();\n\t\tconst items = this.buildItems();\n\t\tthis.filteredItems = query ? fuzzyFilter(items, query, (i) => `${i.model.id} ${i.model.provider}`) : items;\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredItems.length - 1));\n\t\tthis.updateList();\n\t\tthis.footerText.setText(this.getFooterText());\n\t}\n\n\tprivate notifyChange(): void {\n\t\tthis.callbacks.onChange(this.enabledIds === null ? null : [...this.enabledIds]);\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.filteredItems.length === 0) {\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", \" No matching models\"), 0, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);\n\t\tconst allEnabled = this.enabledIds === null;\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst item = this.filteredItems[i]!;\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst modelText = isSelected ? theme.fg(\"accent\", item.model.id) : item.model.id;\n\t\t\tconst providerBadge = theme.fg(\"muted\", ` [${item.model.provider}]`);\n\t\t\tconst status = allEnabled ? \"\" : item.enabled ? theme.fg(\"success\", \" ✓\") : theme.fg(\"dim\", \" ✗\");\n\t\t\tthis.listContainer.addChild(new Text(`${prefix}${modelText}${providerBadge}${status}`, 0, 0));\n\t\t}\n\n\t\t// Add scroll indicator if needed\n\t\tif (startIndex > 0 || endIndex < this.filteredItems.length) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`), 0, 0),\n\t\t\t);\n\t\t}\n\n\t\tif (this.filteredItems.length > 0) {\n\t\t\tconst selected = this.filteredItems[this.selectedIndex];\n\t\t\tthis.listContainer.addChild(new Spacer(1));\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", ` Model Name: ${selected.model.name}`), 0, 0));\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\t// Navigation\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.filteredItems.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === this.filteredItems.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\n\t\t// Reorder enabled models\n\t\tconst reorderUp = kb.matches(data, \"app.models.reorderUp\");\n\t\tconst reorderDown = kb.matches(data, \"app.models.reorderDown\");\n\t\tif (reorderUp || reorderDown) {\n\t\t\tif (this.enabledIds === null) return;\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item && isEnabled(this.enabledIds, item.fullId)) {\n\t\t\t\tconst delta = reorderUp ? -1 : 1;\n\t\t\t\tconst currentIndex = this.enabledIds.indexOf(item.fullId);\n\t\t\t\tconst newIndex = currentIndex + delta;\n\t\t\t\t// Only move if within bounds\n\t\t\t\tif (newIndex >= 0 && newIndex < this.enabledIds.length) {\n\t\t\t\t\tthis.enabledIds = move(this.enabledIds, item.fullId, delta);\n\t\t\t\t\tthis.isDirty = true;\n\t\t\t\t\tthis.selectedIndex += delta;\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\tthis.notifyChange();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle on Enter\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tthis.enabledIds = toggle(this.enabledIds, item.fullId);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh();\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Enable all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.enableAll\")) {\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.enabledIds = enableAll(this.enabledIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh();\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.clearAll\")) {\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.enabledIds = clearAll(this.enabledIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh();\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle provider of current item\n\t\tif (kb.matches(data, \"app.models.toggleProvider\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tconst provider = item.model.provider;\n\t\t\t\tconst providerIds = this.allIds.filter((id) => this.modelsById.get(id)!.provider === provider);\n\t\t\t\tconst allEnabled = providerIds.every((id) => isEnabled(this.enabledIds, id));\n\t\t\t\tthis.enabledIds = allEnabled\n\t\t\t\t\t? clearAll(this.enabledIds, this.allIds, providerIds)\n\t\t\t\t\t: enableAll(this.enabledIds, this.allIds, providerIds);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh();\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Save/persist to settings\n\t\tif (kb.matches(data, \"app.models.save\")) {\n\t\t\tthis.callbacks.onPersist(this.enabledIds === null ? null : [...this.enabledIds]);\n\t\t\tthis.isDirty = false;\n\t\t\tthis.footerText.setText(this.getFooterText());\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+C - clear search or cancel if empty\n\t\tif (matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\tif (this.searchInput.getValue()) {\n\t\t\t\tthis.searchInput.setValue(\"\");\n\t\t\t\tthis.refresh();\n\t\t\t} else {\n\t\t\t\tthis.callbacks.onCancel();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Escape - cancel\n\t\tif (matchesKey(data, Key.escape)) {\n\t\t\tthis.callbacks.onCancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass everything else to search input\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.refresh();\n\t}\n\n\tgetSearchInput(): Input {\n\t\treturn this.searchInput;\n\t}\n}\n"]}
@@ -1,290 +0,0 @@
1
- import { Container, fuzzyFilter, getKeybindings, Input, Key, matchesKey, Spacer, Text, } from "@eminent337/aery-tui";
2
- import { theme } from "../theme/theme.js";
3
- import { DynamicBorder } from "./dynamic-border.js";
4
- import { keyText } from "./keybinding-hints.js";
5
- function isEnabled(enabledIds, id) {
6
- return enabledIds === null || enabledIds.includes(id);
7
- }
8
- function toggle(enabledIds, id) {
9
- if (enabledIds === null)
10
- return [id]; // First toggle: start with only this one
11
- const index = enabledIds.indexOf(id);
12
- if (index >= 0)
13
- return [...enabledIds.slice(0, index), ...enabledIds.slice(index + 1)];
14
- return [...enabledIds, id];
15
- }
16
- function enableAll(enabledIds, allIds, targetIds) {
17
- if (enabledIds === null)
18
- return null; // Already all enabled
19
- const targets = targetIds ?? allIds;
20
- const result = [...enabledIds];
21
- for (const id of targets) {
22
- if (!result.includes(id))
23
- result.push(id);
24
- }
25
- return result.length === allIds.length ? null : result;
26
- }
27
- function clearAll(enabledIds, allIds, targetIds) {
28
- if (enabledIds === null) {
29
- return targetIds ? allIds.filter((id) => !targetIds.includes(id)) : [];
30
- }
31
- const targets = new Set(targetIds ?? enabledIds);
32
- return enabledIds.filter((id) => !targets.has(id));
33
- }
34
- function move(enabledIds, id, delta) {
35
- if (enabledIds === null)
36
- return null;
37
- const list = [...enabledIds];
38
- const index = list.indexOf(id);
39
- if (index < 0)
40
- return list;
41
- const newIndex = index + delta;
42
- if (newIndex < 0 || newIndex >= list.length)
43
- return list;
44
- const result = [...list];
45
- [result[index], result[newIndex]] = [result[newIndex], result[index]];
46
- return result;
47
- }
48
- function getSortedIds(enabledIds, allIds) {
49
- if (enabledIds === null)
50
- return allIds;
51
- const enabledSet = new Set(enabledIds);
52
- return [...enabledIds, ...allIds.filter((id) => !enabledSet.has(id))];
53
- }
54
- /**
55
- * Component for enabling/disabling models for Ctrl+P cycling.
56
- * Changes are session-only until explicitly persisted with Ctrl+S.
57
- */
58
- export class ScopedModelsSelectorComponent extends Container {
59
- modelsById = new Map();
60
- allIds = [];
61
- enabledIds = null;
62
- filteredItems = [];
63
- selectedIndex = 0;
64
- searchInput;
65
- // Focusable implementation - propagate to searchInput for IME cursor positioning
66
- _focused = false;
67
- get focused() {
68
- return this._focused;
69
- }
70
- set focused(value) {
71
- this._focused = value;
72
- this.searchInput.focused = value;
73
- }
74
- listContainer;
75
- footerText;
76
- callbacks;
77
- maxVisible = 8;
78
- isDirty = false;
79
- constructor(config, callbacks) {
80
- super();
81
- this.callbacks = callbacks;
82
- for (const model of config.allModels) {
83
- const fullId = `${model.provider}/${model.id}`;
84
- this.modelsById.set(fullId, model);
85
- this.allIds.push(fullId);
86
- }
87
- this.enabledIds = config.enabledModelIds === null ? null : [...config.enabledModelIds];
88
- this.filteredItems = this.buildItems();
89
- // Header
90
- this.addChild(new DynamicBorder());
91
- this.addChild(new Spacer(1));
92
- this.addChild(new Text(theme.fg("accent", theme.bold("Model Configuration")), 0, 0));
93
- this.addChild(new Text(theme.fg("muted", `Session-only. ${keyText("app.models.save")} to save to settings.`), 0, 0));
94
- this.addChild(new Spacer(1));
95
- // Search input
96
- this.searchInput = new Input();
97
- this.addChild(this.searchInput);
98
- this.addChild(new Spacer(1));
99
- // List container
100
- this.listContainer = new Container();
101
- this.addChild(this.listContainer);
102
- // Footer hint
103
- this.addChild(new Spacer(1));
104
- this.footerText = new Text(this.getFooterText(), 0, 0);
105
- this.addChild(this.footerText);
106
- this.addChild(new DynamicBorder());
107
- this.updateList();
108
- }
109
- buildItems() {
110
- // Filter out IDs that no longer have a corresponding model (e.g., after logout)
111
- return getSortedIds(this.enabledIds, this.allIds)
112
- .filter((id) => this.modelsById.has(id))
113
- .map((id) => ({
114
- fullId: id,
115
- model: this.modelsById.get(id),
116
- enabled: isEnabled(this.enabledIds, id),
117
- }));
118
- }
119
- getFooterText() {
120
- const enabledCount = this.enabledIds?.length ?? this.allIds.length;
121
- const allEnabled = this.enabledIds === null;
122
- const countText = allEnabled ? "all enabled" : `${enabledCount}/${this.allIds.length} enabled`;
123
- const parts = [
124
- `${keyText("tui.select.confirm")} toggle`,
125
- `${keyText("app.models.enableAll")} all`,
126
- `${keyText("app.models.clearAll")} clear`,
127
- `${keyText("app.models.toggleProvider")} provider`,
128
- `${keyText("app.models.reorderUp")}/${keyText("app.models.reorderDown")} reorder`,
129
- `${keyText("app.models.save")} save`,
130
- countText,
131
- ];
132
- return this.isDirty
133
- ? theme.fg("dim", ` ${parts.join(" · ")} `) + theme.fg("warning", "(unsaved)")
134
- : theme.fg("dim", ` ${parts.join(" · ")}`);
135
- }
136
- refresh() {
137
- const query = this.searchInput.getValue();
138
- const items = this.buildItems();
139
- this.filteredItems = query ? fuzzyFilter(items, query, (i) => `${i.model.id} ${i.model.provider}`) : items;
140
- this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredItems.length - 1));
141
- this.updateList();
142
- this.footerText.setText(this.getFooterText());
143
- }
144
- notifyChange() {
145
- this.callbacks.onChange(this.enabledIds === null ? null : [...this.enabledIds]);
146
- }
147
- updateList() {
148
- this.listContainer.clear();
149
- if (this.filteredItems.length === 0) {
150
- this.listContainer.addChild(new Text(theme.fg("muted", " No matching models"), 0, 0));
151
- return;
152
- }
153
- const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible));
154
- const endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);
155
- const allEnabled = this.enabledIds === null;
156
- for (let i = startIndex; i < endIndex; i++) {
157
- const item = this.filteredItems[i];
158
- const isSelected = i === this.selectedIndex;
159
- const prefix = isSelected ? theme.fg("accent", "→ ") : " ";
160
- const modelText = isSelected ? theme.fg("accent", item.model.id) : item.model.id;
161
- const providerBadge = theme.fg("muted", ` [${item.model.provider}]`);
162
- const status = allEnabled ? "" : item.enabled ? theme.fg("success", " ✓") : theme.fg("dim", " ✗");
163
- this.listContainer.addChild(new Text(`${prefix}${modelText}${providerBadge}${status}`, 0, 0));
164
- }
165
- // Add scroll indicator if needed
166
- if (startIndex > 0 || endIndex < this.filteredItems.length) {
167
- this.listContainer.addChild(new Text(theme.fg("muted", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`), 0, 0));
168
- }
169
- if (this.filteredItems.length > 0) {
170
- const selected = this.filteredItems[this.selectedIndex];
171
- this.listContainer.addChild(new Spacer(1));
172
- this.listContainer.addChild(new Text(theme.fg("muted", ` Model Name: ${selected.model.name}`), 0, 0));
173
- }
174
- }
175
- handleInput(data) {
176
- const kb = getKeybindings();
177
- // Navigation
178
- if (kb.matches(data, "tui.select.up")) {
179
- if (this.filteredItems.length === 0)
180
- return;
181
- this.selectedIndex = this.selectedIndex === 0 ? this.filteredItems.length - 1 : this.selectedIndex - 1;
182
- this.updateList();
183
- return;
184
- }
185
- if (kb.matches(data, "tui.select.down")) {
186
- if (this.filteredItems.length === 0)
187
- return;
188
- this.selectedIndex = this.selectedIndex === this.filteredItems.length - 1 ? 0 : this.selectedIndex + 1;
189
- this.updateList();
190
- return;
191
- }
192
- // Reorder enabled models
193
- const reorderUp = kb.matches(data, "app.models.reorderUp");
194
- const reorderDown = kb.matches(data, "app.models.reorderDown");
195
- if (reorderUp || reorderDown) {
196
- if (this.enabledIds === null)
197
- return;
198
- const item = this.filteredItems[this.selectedIndex];
199
- if (item && isEnabled(this.enabledIds, item.fullId)) {
200
- const delta = reorderUp ? -1 : 1;
201
- const currentIndex = this.enabledIds.indexOf(item.fullId);
202
- const newIndex = currentIndex + delta;
203
- // Only move if within bounds
204
- if (newIndex >= 0 && newIndex < this.enabledIds.length) {
205
- this.enabledIds = move(this.enabledIds, item.fullId, delta);
206
- this.isDirty = true;
207
- this.selectedIndex += delta;
208
- this.refresh();
209
- this.notifyChange();
210
- }
211
- }
212
- return;
213
- }
214
- // Toggle on Enter
215
- if (kb.matches(data, "tui.select.confirm")) {
216
- const item = this.filteredItems[this.selectedIndex];
217
- if (item) {
218
- this.enabledIds = toggle(this.enabledIds, item.fullId);
219
- this.isDirty = true;
220
- this.refresh();
221
- this.notifyChange();
222
- }
223
- return;
224
- }
225
- // Enable all (filtered if search active, otherwise all)
226
- if (kb.matches(data, "app.models.enableAll")) {
227
- const targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;
228
- this.enabledIds = enableAll(this.enabledIds, this.allIds, targetIds);
229
- this.isDirty = true;
230
- this.refresh();
231
- this.notifyChange();
232
- return;
233
- }
234
- // Clear all (filtered if search active, otherwise all)
235
- if (kb.matches(data, "app.models.clearAll")) {
236
- const targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;
237
- this.enabledIds = clearAll(this.enabledIds, this.allIds, targetIds);
238
- this.isDirty = true;
239
- this.refresh();
240
- this.notifyChange();
241
- return;
242
- }
243
- // Toggle provider of current item
244
- if (kb.matches(data, "app.models.toggleProvider")) {
245
- const item = this.filteredItems[this.selectedIndex];
246
- if (item) {
247
- const provider = item.model.provider;
248
- const providerIds = this.allIds.filter((id) => this.modelsById.get(id).provider === provider);
249
- const allEnabled = providerIds.every((id) => isEnabled(this.enabledIds, id));
250
- this.enabledIds = allEnabled
251
- ? clearAll(this.enabledIds, this.allIds, providerIds)
252
- : enableAll(this.enabledIds, this.allIds, providerIds);
253
- this.isDirty = true;
254
- this.refresh();
255
- this.notifyChange();
256
- }
257
- return;
258
- }
259
- // Save/persist to settings
260
- if (kb.matches(data, "app.models.save")) {
261
- this.callbacks.onPersist(this.enabledIds === null ? null : [...this.enabledIds]);
262
- this.isDirty = false;
263
- this.footerText.setText(this.getFooterText());
264
- return;
265
- }
266
- // Ctrl+C - clear search or cancel if empty
267
- if (matchesKey(data, Key.ctrl("c"))) {
268
- if (this.searchInput.getValue()) {
269
- this.searchInput.setValue("");
270
- this.refresh();
271
- }
272
- else {
273
- this.callbacks.onCancel();
274
- }
275
- return;
276
- }
277
- // Escape - cancel
278
- if (matchesKey(data, Key.escape)) {
279
- this.callbacks.onCancel();
280
- return;
281
- }
282
- // Pass everything else to search input
283
- this.searchInput.handleInput(data);
284
- this.refresh();
285
- }
286
- getSearchInput() {
287
- return this.searchInput;
288
- }
289
- }
290
- //# sourceMappingURL=scoped-models-selector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoped-models-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/scoped-models-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Model } from \"@eminent337/aery-ai\";\nimport {\n\tContainer,\n\ttype Focusable,\n\tfuzzyFilter,\n\tgetKeybindings,\n\tInput,\n\tKey,\n\tmatchesKey,\n\tSpacer,\n\tText,\n} from \"@eminent337/aery-tui\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { keyText } from \"./keybinding-hints.js\";\n\n// EnabledIds: null = all enabled (no filter), string[] = explicit ordered list\ntype EnabledIds = string[] | null;\n\nfunction isEnabled(enabledIds: EnabledIds, id: string): boolean {\n\treturn enabledIds === null || enabledIds.includes(id);\n}\n\nfunction toggle(enabledIds: EnabledIds, id: string): EnabledIds {\n\tif (enabledIds === null) return [id]; // First toggle: start with only this one\n\tconst index = enabledIds.indexOf(id);\n\tif (index >= 0) return [...enabledIds.slice(0, index), ...enabledIds.slice(index + 1)];\n\treturn [...enabledIds, id];\n}\n\nfunction enableAll(enabledIds: EnabledIds, allIds: string[], targetIds?: string[]): EnabledIds {\n\tif (enabledIds === null) return null; // Already all enabled\n\tconst targets = targetIds ?? allIds;\n\tconst result = [...enabledIds];\n\tfor (const id of targets) {\n\t\tif (!result.includes(id)) result.push(id);\n\t}\n\treturn result.length === allIds.length ? null : result;\n}\n\nfunction clearAll(enabledIds: EnabledIds, allIds: string[], targetIds?: string[]): EnabledIds {\n\tif (enabledIds === null) {\n\t\treturn targetIds ? allIds.filter((id) => !targetIds.includes(id)) : [];\n\t}\n\tconst targets = new Set(targetIds ?? enabledIds);\n\treturn enabledIds.filter((id) => !targets.has(id));\n}\n\nfunction move(enabledIds: EnabledIds, id: string, delta: number): EnabledIds {\n\tif (enabledIds === null) return null;\n\tconst list = [...enabledIds];\n\tconst index = list.indexOf(id);\n\tif (index < 0) return list;\n\tconst newIndex = index + delta;\n\tif (newIndex < 0 || newIndex >= list.length) return list;\n\tconst result = [...list];\n\t[result[index], result[newIndex]] = [result[newIndex], result[index]];\n\treturn result;\n}\n\nfunction getSortedIds(enabledIds: EnabledIds, allIds: string[]): string[] {\n\tif (enabledIds === null) return allIds;\n\tconst enabledSet = new Set(enabledIds);\n\treturn [...enabledIds, ...allIds.filter((id) => !enabledSet.has(id))];\n}\n\ninterface ModelItem {\n\tfullId: string;\n\tmodel: Model<any>;\n\tenabled: boolean;\n}\n\nexport interface ModelsConfig {\n\tallModels: Model<any>[];\n\tenabledModelIds: string[] | null;\n}\n\nexport interface ModelsCallbacks {\n\t/** Called whenever the enabled model set or order changes (session-only, no persist) */\n\tonChange: (enabledModelIds: string[] | null) => void | Promise<void>;\n\t/** Called when user wants to persist current selection to settings */\n\tonPersist: (enabledModelIds: string[] | null) => void | Promise<void>;\n\tonCancel: () => void;\n}\n\n/**\n * Component for enabling/disabling models for Ctrl+P cycling.\n * Changes are session-only until explicitly persisted with Ctrl+S.\n */\nexport class ScopedModelsSelectorComponent extends Container implements Focusable {\n\tprivate modelsById: Map<string, Model<any>> = new Map();\n\tprivate allIds: string[] = [];\n\tprivate enabledIds: EnabledIds = null;\n\tprivate filteredItems: ModelItem[] = [];\n\tprivate selectedIndex = 0;\n\tprivate searchInput: Input;\n\n\t// Focusable implementation - propagate to searchInput for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\tprivate listContainer: Container;\n\tprivate footerText: Text;\n\tprivate callbacks: ModelsCallbacks;\n\tprivate maxVisible = 8;\n\tprivate isDirty = false;\n\n\tconstructor(config: ModelsConfig, callbacks: ModelsCallbacks) {\n\t\tsuper();\n\t\tthis.callbacks = callbacks;\n\n\t\tfor (const model of config.allModels) {\n\t\t\tconst fullId = `${model.provider}/${model.id}`;\n\t\t\tthis.modelsById.set(fullId, model);\n\t\t\tthis.allIds.push(fullId);\n\t\t}\n\n\t\tthis.enabledIds = config.enabledModelIds === null ? null : [...config.enabledModelIds];\n\t\tthis.filteredItems = this.buildItems();\n\n\t\t// Header\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Model Configuration\")), 0, 0));\n\t\tthis.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", `Session-only. ${keyText(\"app.models.save\")} to save to settings.`), 0, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Search input\n\t\tthis.searchInput = new Input();\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// List container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\t// Footer hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.footerText = new Text(this.getFooterText(), 0, 0);\n\t\tthis.addChild(this.footerText);\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.updateList();\n\t}\n\n\tprivate buildItems(): ModelItem[] {\n\t\t// Filter out IDs that no longer have a corresponding model (e.g., after logout)\n\t\treturn getSortedIds(this.enabledIds, this.allIds)\n\t\t\t.filter((id) => this.modelsById.has(id))\n\t\t\t.map((id) => ({\n\t\t\t\tfullId: id,\n\t\t\t\tmodel: this.modelsById.get(id)!,\n\t\t\t\tenabled: isEnabled(this.enabledIds, id),\n\t\t\t}));\n\t}\n\n\tprivate getFooterText(): string {\n\t\tconst enabledCount = this.enabledIds?.length ?? this.allIds.length;\n\t\tconst allEnabled = this.enabledIds === null;\n\t\tconst countText = allEnabled ? \"all enabled\" : `${enabledCount}/${this.allIds.length} enabled`;\n\t\tconst parts = [\n\t\t\t`${keyText(\"tui.select.confirm\")} toggle`,\n\t\t\t`${keyText(\"app.models.enableAll\")} all`,\n\t\t\t`${keyText(\"app.models.clearAll\")} clear`,\n\t\t\t`${keyText(\"app.models.toggleProvider\")} provider`,\n\t\t\t`${keyText(\"app.models.reorderUp\")}/${keyText(\"app.models.reorderDown\")} reorder`,\n\t\t\t`${keyText(\"app.models.save\")} save`,\n\t\t\tcountText,\n\t\t];\n\t\treturn this.isDirty\n\t\t\t? theme.fg(\"dim\", ` ${parts.join(\" · \")} `) + theme.fg(\"warning\", \"(unsaved)\")\n\t\t\t: theme.fg(\"dim\", ` ${parts.join(\" · \")}`);\n\t}\n\n\tprivate refresh(): void {\n\t\tconst query = this.searchInput.getValue();\n\t\tconst items = this.buildItems();\n\t\tthis.filteredItems = query ? fuzzyFilter(items, query, (i) => `${i.model.id} ${i.model.provider}`) : items;\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredItems.length - 1));\n\t\tthis.updateList();\n\t\tthis.footerText.setText(this.getFooterText());\n\t}\n\n\tprivate notifyChange(): void {\n\t\tthis.callbacks.onChange(this.enabledIds === null ? null : [...this.enabledIds]);\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.filteredItems.length === 0) {\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", \" No matching models\"), 0, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);\n\t\tconst allEnabled = this.enabledIds === null;\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst item = this.filteredItems[i]!;\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst modelText = isSelected ? theme.fg(\"accent\", item.model.id) : item.model.id;\n\t\t\tconst providerBadge = theme.fg(\"muted\", ` [${item.model.provider}]`);\n\t\t\tconst status = allEnabled ? \"\" : item.enabled ? theme.fg(\"success\", \" ✓\") : theme.fg(\"dim\", \" ✗\");\n\t\t\tthis.listContainer.addChild(new Text(`${prefix}${modelText}${providerBadge}${status}`, 0, 0));\n\t\t}\n\n\t\t// Add scroll indicator if needed\n\t\tif (startIndex > 0 || endIndex < this.filteredItems.length) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`), 0, 0),\n\t\t\t);\n\t\t}\n\n\t\tif (this.filteredItems.length > 0) {\n\t\t\tconst selected = this.filteredItems[this.selectedIndex];\n\t\t\tthis.listContainer.addChild(new Spacer(1));\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", ` Model Name: ${selected.model.name}`), 0, 0));\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\t// Navigation\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.filteredItems.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === this.filteredItems.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\n\t\t// Reorder enabled models\n\t\tconst reorderUp = kb.matches(data, \"app.models.reorderUp\");\n\t\tconst reorderDown = kb.matches(data, \"app.models.reorderDown\");\n\t\tif (reorderUp || reorderDown) {\n\t\t\tif (this.enabledIds === null) return;\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item && isEnabled(this.enabledIds, item.fullId)) {\n\t\t\t\tconst delta = reorderUp ? -1 : 1;\n\t\t\t\tconst currentIndex = this.enabledIds.indexOf(item.fullId);\n\t\t\t\tconst newIndex = currentIndex + delta;\n\t\t\t\t// Only move if within bounds\n\t\t\t\tif (newIndex >= 0 && newIndex < this.enabledIds.length) {\n\t\t\t\t\tthis.enabledIds = move(this.enabledIds, item.fullId, delta);\n\t\t\t\t\tthis.isDirty = true;\n\t\t\t\t\tthis.selectedIndex += delta;\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\tthis.notifyChange();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle on Enter\n\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tthis.enabledIds = toggle(this.enabledIds, item.fullId);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh();\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Enable all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.enableAll\")) {\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.enabledIds = enableAll(this.enabledIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh();\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear all (filtered if search active, otherwise all)\n\t\tif (kb.matches(data, \"app.models.clearAll\")) {\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.enabledIds = clearAll(this.enabledIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.refresh();\n\t\t\tthis.notifyChange();\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle provider of current item\n\t\tif (kb.matches(data, \"app.models.toggleProvider\")) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tconst provider = item.model.provider;\n\t\t\t\tconst providerIds = this.allIds.filter((id) => this.modelsById.get(id)!.provider === provider);\n\t\t\t\tconst allEnabled = providerIds.every((id) => isEnabled(this.enabledIds, id));\n\t\t\t\tthis.enabledIds = allEnabled\n\t\t\t\t\t? clearAll(this.enabledIds, this.allIds, providerIds)\n\t\t\t\t\t: enableAll(this.enabledIds, this.allIds, providerIds);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.refresh();\n\t\t\t\tthis.notifyChange();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Save/persist to settings\n\t\tif (kb.matches(data, \"app.models.save\")) {\n\t\t\tthis.callbacks.onPersist(this.enabledIds === null ? null : [...this.enabledIds]);\n\t\t\tthis.isDirty = false;\n\t\t\tthis.footerText.setText(this.getFooterText());\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+C - clear search or cancel if empty\n\t\tif (matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\tif (this.searchInput.getValue()) {\n\t\t\t\tthis.searchInput.setValue(\"\");\n\t\t\t\tthis.refresh();\n\t\t\t} else {\n\t\t\t\tthis.callbacks.onCancel();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Escape - cancel\n\t\tif (matchesKey(data, Key.escape)) {\n\t\t\tthis.callbacks.onCancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass everything else to search input\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.refresh();\n\t}\n\n\tgetSearchInput(): Input {\n\t\treturn this.searchInput;\n\t}\n}\n"]}
@@ -1,23 +0,0 @@
1
- import type { SessionInfo } from "../../../core/session-manager.js";
2
- export type SortMode = "threaded" | "recent" | "relevance";
3
- export type NameFilter = "all" | "named";
4
- export interface ParsedSearchQuery {
5
- mode: "tokens" | "regex";
6
- tokens: {
7
- kind: "fuzzy" | "phrase";
8
- value: string;
9
- }[];
10
- regex: RegExp | null;
11
- /** If set, parsing failed and we should treat query as non-matching. */
12
- error?: string;
13
- }
14
- export interface MatchResult {
15
- matches: boolean;
16
- /** Lower is better; only meaningful when matches === true */
17
- score: number;
18
- }
19
- export declare function hasSessionName(session: SessionInfo): boolean;
20
- export declare function parseSearchQuery(query: string): ParsedSearchQuery;
21
- export declare function matchSession(session: SessionInfo, parsed: ParsedSearchQuery): MatchResult;
22
- export declare function filterAndSortSessions(sessions: SessionInfo[], query: string, sortMode: SortMode, nameFilter?: NameFilter): SessionInfo[];
23
- //# sourceMappingURL=session-selector-search.d.ts.map