@eminent337/aery 0.1.57 → 0.1.59

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 (688) 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 +0 -0
  5. package/docs/development.md +0 -0
  6. package/docs/docs.json +133 -0
  7. package/docs/extensions.md +0 -0
  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 +61 -0
  13. package/docs/json.md +0 -0
  14. package/docs/keybindings.md +0 -0
  15. package/docs/models.md +0 -0
  16. package/docs/packages.md +0 -0
  17. package/docs/prompt-templates.md +0 -0
  18. package/docs/providers.md +1 -1
  19. package/docs/quickstart.md +142 -0
  20. package/docs/rpc.md +0 -0
  21. package/docs/sdk.md +0 -0
  22. package/docs/session.md +0 -0
  23. package/docs/settings.md +0 -0
  24. package/docs/shell-aliases.md +0 -0
  25. package/docs/skills.md +0 -0
  26. package/docs/terminal-setup.md +0 -0
  27. package/docs/termux.md +0 -0
  28. package/docs/themes.md +0 -0
  29. package/docs/tmux.md +0 -0
  30. package/docs/tree.md +0 -0
  31. package/docs/tui.md +0 -0
  32. package/docs/usage.md +275 -0
  33. package/docs/windows.md +0 -0
  34. package/examples/README.md +0 -0
  35. package/examples/extensions/README.md +0 -0
  36. package/examples/extensions/antigravity-image-gen.ts +0 -0
  37. package/examples/extensions/auto-commit-on-exit.ts +0 -0
  38. package/examples/extensions/bash-spawn-hook.ts +0 -0
  39. package/examples/extensions/bookmark.ts +0 -0
  40. package/examples/extensions/built-in-tool-renderer.ts +0 -0
  41. package/examples/extensions/claude-rules.ts +0 -0
  42. package/examples/extensions/commands.ts +0 -0
  43. package/examples/extensions/confirm-destructive.ts +0 -0
  44. package/examples/extensions/custom-compaction.ts +0 -0
  45. package/examples/extensions/custom-footer.ts +0 -0
  46. package/examples/extensions/custom-header.ts +0 -0
  47. package/examples/extensions/custom-provider-anthropic/index.ts +0 -0
  48. package/examples/extensions/custom-provider-anthropic/package-lock.json +0 -0
  49. package/examples/extensions/custom-provider-anthropic/package.json +0 -0
  50. package/examples/extensions/custom-provider-gitlab-duo/index.ts +0 -0
  51. package/examples/extensions/custom-provider-gitlab-duo/package.json +0 -0
  52. package/examples/extensions/custom-provider-gitlab-duo/test.ts +0 -0
  53. package/examples/extensions/custom-provider-qwen-cli/index.ts +0 -0
  54. package/examples/extensions/custom-provider-qwen-cli/package.json +0 -0
  55. package/examples/extensions/dirty-repo-guard.ts +0 -0
  56. package/examples/extensions/doom-overlay/README.md +0 -0
  57. package/examples/extensions/doom-overlay/doom/build/doom.js +0 -0
  58. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +0 -0
  59. package/examples/extensions/doom-overlay/doom-component.ts +0 -0
  60. package/examples/extensions/doom-overlay/doom-engine.ts +0 -0
  61. package/examples/extensions/doom-overlay/doom-keys.ts +0 -0
  62. package/examples/extensions/doom-overlay/index.ts +0 -0
  63. package/examples/extensions/doom-overlay/wad-finder.ts +0 -0
  64. package/examples/extensions/dynamic-resources/SKILL.md +0 -0
  65. package/examples/extensions/dynamic-resources/dynamic.json +0 -0
  66. package/examples/extensions/dynamic-resources/dynamic.md +0 -0
  67. package/examples/extensions/dynamic-resources/index.ts +0 -0
  68. package/examples/extensions/dynamic-tools.ts +0 -0
  69. package/examples/extensions/event-bus.ts +0 -0
  70. package/examples/extensions/file-trigger.ts +0 -0
  71. package/examples/extensions/git-checkpoint.ts +0 -0
  72. package/examples/extensions/handoff.ts +0 -0
  73. package/examples/extensions/hello.ts +0 -0
  74. package/examples/extensions/hidden-thinking-label.ts +0 -0
  75. package/examples/extensions/inline-bash.ts +0 -0
  76. package/examples/extensions/input-transform.ts +0 -0
  77. package/examples/extensions/interactive-shell.ts +0 -0
  78. package/examples/extensions/mac-system-theme.ts +0 -0
  79. package/examples/extensions/message-renderer.ts +0 -0
  80. package/examples/extensions/minimal-mode.ts +0 -0
  81. package/examples/extensions/modal-editor.ts +0 -0
  82. package/examples/extensions/model-status.ts +0 -0
  83. package/examples/extensions/notify.ts +0 -0
  84. package/examples/extensions/overlay-qa-tests.ts +0 -0
  85. package/examples/extensions/overlay-test.ts +0 -0
  86. package/examples/extensions/permission-gate.ts +0 -0
  87. package/examples/extensions/pirate.ts +0 -0
  88. package/examples/extensions/plan-mode/README.md +0 -0
  89. package/examples/extensions/plan-mode/index.ts +0 -0
  90. package/examples/extensions/plan-mode/utils.ts +0 -0
  91. package/examples/extensions/preset.ts +0 -0
  92. package/examples/extensions/protected-paths.ts +0 -0
  93. package/examples/extensions/provider-payload.ts +0 -0
  94. package/examples/extensions/qna.ts +0 -0
  95. package/examples/extensions/question.ts +0 -0
  96. package/examples/extensions/questionnaire.ts +0 -0
  97. package/examples/extensions/rainbow-editor.ts +0 -0
  98. package/examples/extensions/reload-runtime.ts +0 -0
  99. package/examples/extensions/rpc-demo.ts +0 -0
  100. package/examples/extensions/sandbox/index.ts +0 -0
  101. package/examples/extensions/sandbox/package-lock.json +0 -0
  102. package/examples/extensions/sandbox/package.json +0 -0
  103. package/examples/extensions/send-user-message.ts +0 -0
  104. package/examples/extensions/session-name.ts +0 -0
  105. package/examples/extensions/shutdown-command.ts +0 -0
  106. package/examples/extensions/snake.ts +0 -0
  107. package/examples/extensions/space-invaders.ts +0 -0
  108. package/examples/extensions/ssh.ts +0 -0
  109. package/examples/extensions/status-line.ts +0 -0
  110. package/examples/extensions/subagent/README.md +0 -0
  111. package/examples/extensions/subagent/agents/planner.md +0 -0
  112. package/examples/extensions/subagent/agents/reviewer.md +0 -0
  113. package/examples/extensions/subagent/agents/scout.md +0 -0
  114. package/examples/extensions/subagent/agents/worker.md +0 -0
  115. package/examples/extensions/subagent/agents.ts +0 -0
  116. package/examples/extensions/subagent/index.ts +0 -0
  117. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -0
  118. package/examples/extensions/subagent/prompts/implement.md +0 -0
  119. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -0
  120. package/examples/extensions/summarize.ts +0 -0
  121. package/examples/extensions/system-prompt-header.ts +0 -0
  122. package/examples/extensions/tic-tac-toe.ts +0 -0
  123. package/examples/extensions/timed-confirm.ts +0 -0
  124. package/examples/extensions/titlebar-spinner.ts +0 -0
  125. package/examples/extensions/todo.ts +0 -0
  126. package/examples/extensions/tool-override.ts +0 -0
  127. package/examples/extensions/tools.ts +0 -0
  128. package/examples/extensions/trigger-compact.ts +0 -0
  129. package/examples/extensions/truncated-tool.ts +0 -0
  130. package/examples/extensions/widget-placement.ts +0 -0
  131. package/examples/extensions/with-deps/index.ts +0 -0
  132. package/examples/extensions/with-deps/package-lock.json +0 -0
  133. package/examples/extensions/with-deps/package.json +0 -0
  134. package/examples/extensions/working-indicator.ts +0 -0
  135. package/examples/rpc-extension-ui.ts +0 -0
  136. package/examples/sdk/01-minimal.ts +0 -0
  137. package/examples/sdk/02-custom-model.ts +0 -0
  138. package/examples/sdk/03-custom-prompt.ts +0 -0
  139. package/examples/sdk/04-skills.ts +0 -0
  140. package/examples/sdk/05-tools.ts +0 -0
  141. package/examples/sdk/06-extensions.ts +0 -0
  142. package/examples/sdk/07-context-files.ts +0 -0
  143. package/examples/sdk/08-prompt-templates.ts +0 -0
  144. package/examples/sdk/09-api-keys-and-oauth.ts +0 -0
  145. package/examples/sdk/10-settings.ts +0 -0
  146. package/examples/sdk/11-sessions.ts +0 -0
  147. package/examples/sdk/12-full-control.ts +0 -0
  148. package/examples/sdk/13-session-runtime.ts +0 -0
  149. package/examples/sdk/README.md +0 -0
  150. package/package.json +3 -3
  151. package/dist/bun/cli.d.ts +0 -3
  152. package/dist/bun/cli.d.ts.map +0 -1
  153. package/dist/bun/cli.js +0 -7
  154. package/dist/bun/cli.js.map +0 -1
  155. package/dist/bun/register-bedrock.d.ts +0 -2
  156. package/dist/bun/register-bedrock.d.ts.map +0 -1
  157. package/dist/bun/register-bedrock.js +0 -4
  158. package/dist/bun/register-bedrock.js.map +0 -1
  159. package/dist/cli/args.d.ts +0 -52
  160. package/dist/cli/args.d.ts.map +0 -1
  161. package/dist/cli/args.js +0 -321
  162. package/dist/cli/args.js.map +0 -1
  163. package/dist/cli/config-selector.d.ts +0 -14
  164. package/dist/cli/config-selector.d.ts.map +0 -1
  165. package/dist/cli/config-selector.js +0 -31
  166. package/dist/cli/config-selector.js.map +0 -1
  167. package/dist/cli/file-processor.d.ts +0 -15
  168. package/dist/cli/file-processor.d.ts.map +0 -1
  169. package/dist/cli/file-processor.js +0 -83
  170. package/dist/cli/file-processor.js.map +0 -1
  171. package/dist/cli/initial-message.d.ts +0 -18
  172. package/dist/cli/initial-message.d.ts.map +0 -1
  173. package/dist/cli/initial-message.js +0 -22
  174. package/dist/cli/initial-message.js.map +0 -1
  175. package/dist/cli/list-models.d.ts +0 -9
  176. package/dist/cli/list-models.d.ts.map +0 -1
  177. package/dist/cli/list-models.js +0 -97
  178. package/dist/cli/list-models.js.map +0 -1
  179. package/dist/cli/session-picker.d.ts +0 -9
  180. package/dist/cli/session-picker.d.ts.map +0 -1
  181. package/dist/cli/session-picker.js +0 -35
  182. package/dist/cli/session-picker.js.map +0 -1
  183. package/dist/cli.d.ts +0 -3
  184. package/dist/cli.d.ts.map +0 -1
  185. package/dist/cli.js +0 -15
  186. package/dist/cli.js.map +0 -1
  187. package/dist/config.d.ts +0 -77
  188. package/dist/config.d.ts.map +0 -1
  189. package/dist/config.js +0 -221
  190. package/dist/config.js.map +0 -1
  191. package/dist/core/agent-session-runtime.d.ts +0 -99
  192. package/dist/core/agent-session-runtime.d.ts.map +0 -1
  193. package/dist/core/agent-session-runtime.js +0 -261
  194. package/dist/core/agent-session-runtime.js.map +0 -1
  195. package/dist/core/agent-session-services.d.ts +0 -85
  196. package/dist/core/agent-session-services.d.ts.map +0 -1
  197. package/dist/core/agent-session-services.js +0 -116
  198. package/dist/core/agent-session-services.js.map +0 -1
  199. package/dist/core/agent-session.d.ts +0 -590
  200. package/dist/core/agent-session.d.ts.map +0 -1
  201. package/dist/core/agent-session.js +0 -2505
  202. package/dist/core/agent-session.js.map +0 -1
  203. package/dist/core/auth-storage.d.ts +0 -132
  204. package/dist/core/auth-storage.d.ts.map +0 -1
  205. package/dist/core/auth-storage.js +0 -422
  206. package/dist/core/auth-storage.js.map +0 -1
  207. package/dist/core/bash-executor.d.ts +0 -32
  208. package/dist/core/bash-executor.d.ts.map +0 -1
  209. package/dist/core/bash-executor.js +0 -108
  210. package/dist/core/bash-executor.js.map +0 -1
  211. package/dist/core/compaction/branch-summarization.d.ts +0 -88
  212. package/dist/core/compaction/branch-summarization.d.ts.map +0 -1
  213. package/dist/core/compaction/branch-summarization.js +0 -243
  214. package/dist/core/compaction/branch-summarization.js.map +0 -1
  215. package/dist/core/compaction/compaction.d.ts +0 -121
  216. package/dist/core/compaction/compaction.d.ts.map +0 -1
  217. package/dist/core/compaction/compaction.js +0 -615
  218. package/dist/core/compaction/compaction.js.map +0 -1
  219. package/dist/core/compaction/index.d.ts +0 -7
  220. package/dist/core/compaction/index.d.ts.map +0 -1
  221. package/dist/core/compaction/index.js +0 -7
  222. package/dist/core/compaction/index.js.map +0 -1
  223. package/dist/core/compaction/utils.d.ts +0 -38
  224. package/dist/core/compaction/utils.d.ts.map +0 -1
  225. package/dist/core/compaction/utils.js +0 -153
  226. package/dist/core/compaction/utils.js.map +0 -1
  227. package/dist/core/defaults.d.ts +0 -3
  228. package/dist/core/defaults.d.ts.map +0 -1
  229. package/dist/core/defaults.js +0 -2
  230. package/dist/core/defaults.js.map +0 -1
  231. package/dist/core/diagnostics.d.ts +0 -15
  232. package/dist/core/diagnostics.d.ts.map +0 -1
  233. package/dist/core/diagnostics.js +0 -2
  234. package/dist/core/diagnostics.js.map +0 -1
  235. package/dist/core/event-bus.d.ts +0 -9
  236. package/dist/core/event-bus.d.ts.map +0 -1
  237. package/dist/core/event-bus.js +0 -25
  238. package/dist/core/event-bus.js.map +0 -1
  239. package/dist/core/exec.d.ts +0 -29
  240. package/dist/core/exec.d.ts.map +0 -1
  241. package/dist/core/exec.js +0 -75
  242. package/dist/core/exec.js.map +0 -1
  243. package/dist/core/export-html/ansi-to-html.d.ts +0 -22
  244. package/dist/core/export-html/ansi-to-html.d.ts.map +0 -1
  245. package/dist/core/export-html/ansi-to-html.js +0 -249
  246. package/dist/core/export-html/ansi-to-html.js.map +0 -1
  247. package/dist/core/export-html/index.d.ts +0 -37
  248. package/dist/core/export-html/index.d.ts.map +0 -1
  249. package/dist/core/export-html/index.js +0 -224
  250. package/dist/core/export-html/index.js.map +0 -1
  251. package/dist/core/export-html/template.css +0 -1017
  252. package/dist/core/export-html/template.html +0 -55
  253. package/dist/core/export-html/template.js +0 -1729
  254. package/dist/core/export-html/tool-renderer.d.ts +0 -40
  255. package/dist/core/export-html/tool-renderer.d.ts.map +0 -1
  256. package/dist/core/export-html/tool-renderer.js +0 -95
  257. package/dist/core/export-html/tool-renderer.js.map +0 -1
  258. package/dist/core/export-html/vendor/highlight.min.js +0 -1213
  259. package/dist/core/export-html/vendor/marked.min.js +0 -6
  260. package/dist/core/extensions/index.d.ts +0 -12
  261. package/dist/core/extensions/index.d.ts.map +0 -1
  262. package/dist/core/extensions/index.js +0 -9
  263. package/dist/core/extensions/index.js.map +0 -1
  264. package/dist/core/extensions/loader.d.ts +0 -25
  265. package/dist/core/extensions/loader.d.ts.map +0 -1
  266. package/dist/core/extensions/loader.js +0 -436
  267. package/dist/core/extensions/loader.js.map +0 -1
  268. package/dist/core/extensions/runner.d.ts +0 -150
  269. package/dist/core/extensions/runner.d.ts.map +0 -1
  270. package/dist/core/extensions/runner.js +0 -706
  271. package/dist/core/extensions/runner.js.map +0 -1
  272. package/dist/core/extensions/types.d.ts +0 -1111
  273. package/dist/core/extensions/types.d.ts.map +0 -1
  274. package/dist/core/extensions/types.js +0 -45
  275. package/dist/core/extensions/types.js.map +0 -1
  276. package/dist/core/extensions/wrapper.d.ts +0 -20
  277. package/dist/core/extensions/wrapper.d.ts.map +0 -1
  278. package/dist/core/extensions/wrapper.js +0 -22
  279. package/dist/core/extensions/wrapper.js.map +0 -1
  280. package/dist/core/footer-data-provider.d.ts +0 -48
  281. package/dist/core/footer-data-provider.d.ts.map +0 -1
  282. package/dist/core/footer-data-provider.js +0 -314
  283. package/dist/core/footer-data-provider.js.map +0 -1
  284. package/dist/core/index.d.ts +0 -12
  285. package/dist/core/index.d.ts.map +0 -1
  286. package/dist/core/index.js +0 -12
  287. package/dist/core/index.js.map +0 -1
  288. package/dist/core/keybindings.d.ts +0 -353
  289. package/dist/core/keybindings.d.ts.map +0 -1
  290. package/dist/core/keybindings.js +0 -295
  291. package/dist/core/keybindings.js.map +0 -1
  292. package/dist/core/messages.d.ts +0 -77
  293. package/dist/core/messages.d.ts.map +0 -1
  294. package/dist/core/messages.js +0 -123
  295. package/dist/core/messages.js.map +0 -1
  296. package/dist/core/model-registry.d.ts +0 -132
  297. package/dist/core/model-registry.d.ts.map +0 -1
  298. package/dist/core/model-registry.js +0 -635
  299. package/dist/core/model-registry.js.map +0 -1
  300. package/dist/core/model-resolver.d.ts +0 -110
  301. package/dist/core/model-resolver.d.ts.map +0 -1
  302. package/dist/core/model-resolver.js +0 -486
  303. package/dist/core/model-resolver.js.map +0 -1
  304. package/dist/core/output-guard.d.ts +0 -6
  305. package/dist/core/output-guard.d.ts.map +0 -1
  306. package/dist/core/output-guard.js +0 -59
  307. package/dist/core/output-guard.js.map +0 -1
  308. package/dist/core/package-manager.d.ts +0 -194
  309. package/dist/core/package-manager.d.ts.map +0 -1
  310. package/dist/core/package-manager.js +0 -1882
  311. package/dist/core/package-manager.js.map +0 -1
  312. package/dist/core/prompt-templates.d.ts +0 -52
  313. package/dist/core/prompt-templates.d.ts.map +0 -1
  314. package/dist/core/prompt-templates.js +0 -250
  315. package/dist/core/prompt-templates.js.map +0 -1
  316. package/dist/core/resolve-config-value.d.ts +0 -23
  317. package/dist/core/resolve-config-value.d.ts.map +0 -1
  318. package/dist/core/resolve-config-value.js +0 -126
  319. package/dist/core/resolve-config-value.js.map +0 -1
  320. package/dist/core/resource-loader.d.ts +0 -194
  321. package/dist/core/resource-loader.d.ts.map +0 -1
  322. package/dist/core/resource-loader.js +0 -726
  323. package/dist/core/resource-loader.js.map +0 -1
  324. package/dist/core/sdk.d.ts +0 -99
  325. package/dist/core/sdk.d.ts.map +0 -1
  326. package/dist/core/sdk.js +0 -261
  327. package/dist/core/sdk.js.map +0 -1
  328. package/dist/core/session-cwd.d.ts +0 -19
  329. package/dist/core/session-cwd.d.ts.map +0 -1
  330. package/dist/core/session-cwd.js +0 -38
  331. package/dist/core/session-cwd.js.map +0 -1
  332. package/dist/core/session-manager.d.ts +0 -333
  333. package/dist/core/session-manager.d.ts.map +0 -1
  334. package/dist/core/session-manager.js +0 -1109
  335. package/dist/core/session-manager.js.map +0 -1
  336. package/dist/core/settings-manager.d.ts +0 -240
  337. package/dist/core/settings-manager.d.ts.map +0 -1
  338. package/dist/core/settings-manager.js +0 -711
  339. package/dist/core/settings-manager.js.map +0 -1
  340. package/dist/core/skills.d.ts +0 -60
  341. package/dist/core/skills.d.ts.map +0 -1
  342. package/dist/core/skills.js +0 -409
  343. package/dist/core/skills.js.map +0 -1
  344. package/dist/core/slash-commands.d.ts +0 -14
  345. package/dist/core/slash-commands.d.ts.map +0 -1
  346. package/dist/core/slash-commands.js +0 -24
  347. package/dist/core/slash-commands.js.map +0 -1
  348. package/dist/core/source-info.d.ts +0 -18
  349. package/dist/core/source-info.d.ts.map +0 -1
  350. package/dist/core/source-info.js +0 -19
  351. package/dist/core/source-info.js.map +0 -1
  352. package/dist/core/system-prompt.d.ts +0 -28
  353. package/dist/core/system-prompt.d.ts.map +0 -1
  354. package/dist/core/system-prompt.js +0 -120
  355. package/dist/core/system-prompt.js.map +0 -1
  356. package/dist/core/telemetry.d.ts +0 -3
  357. package/dist/core/telemetry.d.ts.map +0 -1
  358. package/dist/core/telemetry.js +0 -9
  359. package/dist/core/telemetry.js.map +0 -1
  360. package/dist/core/timings.d.ts +0 -8
  361. package/dist/core/timings.d.ts.map +0 -1
  362. package/dist/core/timings.js +0 -31
  363. package/dist/core/timings.js.map +0 -1
  364. package/dist/core/tools/bash.d.ts +0 -64
  365. package/dist/core/tools/bash.d.ts.map +0 -1
  366. package/dist/core/tools/bash.js +0 -355
  367. package/dist/core/tools/bash.js.map +0 -1
  368. package/dist/core/tools/edit-diff.d.ts +0 -85
  369. package/dist/core/tools/edit-diff.d.ts.map +0 -1
  370. package/dist/core/tools/edit-diff.js +0 -337
  371. package/dist/core/tools/edit-diff.js.map +0 -1
  372. package/dist/core/tools/edit.d.ts +0 -49
  373. package/dist/core/tools/edit.d.ts.map +0 -1
  374. package/dist/core/tools/edit.js +0 -323
  375. package/dist/core/tools/edit.js.map +0 -1
  376. package/dist/core/tools/file-mutation-queue.d.ts +0 -6
  377. package/dist/core/tools/file-mutation-queue.d.ts.map +0 -1
  378. package/dist/core/tools/file-mutation-queue.js +0 -37
  379. package/dist/core/tools/file-mutation-queue.js.map +0 -1
  380. package/dist/core/tools/find.d.ts +0 -35
  381. package/dist/core/tools/find.d.ts.map +0 -1
  382. package/dist/core/tools/find.js +0 -298
  383. package/dist/core/tools/find.js.map +0 -1
  384. package/dist/core/tools/grep.d.ts +0 -37
  385. package/dist/core/tools/grep.d.ts.map +0 -1
  386. package/dist/core/tools/grep.js +0 -304
  387. package/dist/core/tools/grep.js.map +0 -1
  388. package/dist/core/tools/index.d.ts +0 -40
  389. package/dist/core/tools/index.d.ts.map +0 -1
  390. package/dist/core/tools/index.js +0 -112
  391. package/dist/core/tools/index.js.map +0 -1
  392. package/dist/core/tools/ls.d.ts +0 -37
  393. package/dist/core/tools/ls.d.ts.map +0 -1
  394. package/dist/core/tools/ls.js +0 -169
  395. package/dist/core/tools/ls.js.map +0 -1
  396. package/dist/core/tools/path-utils.d.ts +0 -8
  397. package/dist/core/tools/path-utils.d.ts.map +0 -1
  398. package/dist/core/tools/path-utils.js +0 -81
  399. package/dist/core/tools/path-utils.js.map +0 -1
  400. package/dist/core/tools/read.d.ts +0 -35
  401. package/dist/core/tools/read.d.ts.map +0 -1
  402. package/dist/core/tools/read.js +0 -232
  403. package/dist/core/tools/read.js.map +0 -1
  404. package/dist/core/tools/render-utils.d.ts +0 -21
  405. package/dist/core/tools/render-utils.d.ts.map +0 -1
  406. package/dist/core/tools/render-utils.js +0 -49
  407. package/dist/core/tools/render-utils.js.map +0 -1
  408. package/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  409. package/dist/core/tools/tool-definition-wrapper.d.ts.map +0 -1
  410. package/dist/core/tools/tool-definition-wrapper.js +0 -34
  411. package/dist/core/tools/tool-definition-wrapper.js.map +0 -1
  412. package/dist/core/tools/truncate.d.ts +0 -70
  413. package/dist/core/tools/truncate.d.ts.map +0 -1
  414. package/dist/core/tools/truncate.js +0 -205
  415. package/dist/core/tools/truncate.js.map +0 -1
  416. package/dist/core/tools/write.d.ts +0 -26
  417. package/dist/core/tools/write.d.ts.map +0 -1
  418. package/dist/core/tools/write.js +0 -213
  419. package/dist/core/tools/write.js.map +0 -1
  420. package/dist/index.d.ts +0 -28
  421. package/dist/index.d.ts.map +0 -1
  422. package/dist/index.js +0 -41
  423. package/dist/index.js.map +0 -1
  424. package/dist/main.d.ts +0 -12
  425. package/dist/main.d.ts.map +0 -1
  426. package/dist/main.js +0 -589
  427. package/dist/main.js.map +0 -1
  428. package/dist/migrations.d.ts +0 -33
  429. package/dist/migrations.d.ts.map +0 -1
  430. package/dist/migrations.js +0 -281
  431. package/dist/migrations.js.map +0 -1
  432. package/dist/modes/index.d.ts +0 -9
  433. package/dist/modes/index.d.ts.map +0 -1
  434. package/dist/modes/index.js +0 -8
  435. package/dist/modes/index.js.map +0 -1
  436. package/dist/modes/interactive/assets/clankolas.png +0 -0
  437. package/dist/modes/interactive/components/aery-splash.d.ts +0 -18
  438. package/dist/modes/interactive/components/aery-splash.d.ts.map +0 -1
  439. package/dist/modes/interactive/components/aery-splash.js +0 -60
  440. package/dist/modes/interactive/components/aery-splash.js.map +0 -1
  441. package/dist/modes/interactive/components/armin.d.ts +0 -34
  442. package/dist/modes/interactive/components/armin.d.ts.map +0 -1
  443. package/dist/modes/interactive/components/armin.js +0 -333
  444. package/dist/modes/interactive/components/armin.js.map +0 -1
  445. package/dist/modes/interactive/components/assistant-message.d.ts +0 -20
  446. package/dist/modes/interactive/components/assistant-message.d.ts.map +0 -1
  447. package/dist/modes/interactive/components/assistant-message.js +0 -121
  448. package/dist/modes/interactive/components/assistant-message.js.map +0 -1
  449. package/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  450. package/dist/modes/interactive/components/bash-execution.d.ts.map +0 -1
  451. package/dist/modes/interactive/components/bash-execution.js +0 -175
  452. package/dist/modes/interactive/components/bash-execution.js.map +0 -1
  453. package/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  454. package/dist/modes/interactive/components/bordered-loader.d.ts.map +0 -1
  455. package/dist/modes/interactive/components/bordered-loader.js +0 -54
  456. package/dist/modes/interactive/components/bordered-loader.js.map +0 -1
  457. package/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  458. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +0 -1
  459. package/dist/modes/interactive/components/branch-summary-message.js +0 -44
  460. package/dist/modes/interactive/components/branch-summary-message.js.map +0 -1
  461. package/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  462. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
  463. package/dist/modes/interactive/components/compaction-summary-message.js +0 -45
  464. package/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
  465. package/dist/modes/interactive/components/config-selector.d.ts +0 -71
  466. package/dist/modes/interactive/components/config-selector.d.ts.map +0 -1
  467. package/dist/modes/interactive/components/config-selector.js +0 -479
  468. package/dist/modes/interactive/components/config-selector.js.map +0 -1
  469. package/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  470. package/dist/modes/interactive/components/countdown-timer.d.ts.map +0 -1
  471. package/dist/modes/interactive/components/countdown-timer.js +0 -33
  472. package/dist/modes/interactive/components/countdown-timer.js.map +0 -1
  473. package/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  474. package/dist/modes/interactive/components/custom-editor.d.ts.map +0 -1
  475. package/dist/modes/interactive/components/custom-editor.js +0 -70
  476. package/dist/modes/interactive/components/custom-editor.js.map +0 -1
  477. package/dist/modes/interactive/components/custom-message.d.ts +0 -20
  478. package/dist/modes/interactive/components/custom-message.d.ts.map +0 -1
  479. package/dist/modes/interactive/components/custom-message.js +0 -79
  480. package/dist/modes/interactive/components/custom-message.js.map +0 -1
  481. package/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  482. package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  483. package/dist/modes/interactive/components/daxnuts.js +0 -140
  484. package/dist/modes/interactive/components/daxnuts.js.map +0 -1
  485. package/dist/modes/interactive/components/diff.d.ts +0 -12
  486. package/dist/modes/interactive/components/diff.d.ts.map +0 -1
  487. package/dist/modes/interactive/components/diff.js +0 -133
  488. package/dist/modes/interactive/components/diff.js.map +0 -1
  489. package/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  490. package/dist/modes/interactive/components/dynamic-border.d.ts.map +0 -1
  491. package/dist/modes/interactive/components/dynamic-border.js +0 -21
  492. package/dist/modes/interactive/components/dynamic-border.js.map +0 -1
  493. package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  494. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
  495. package/dist/modes/interactive/components/earendil-announcement.js +0 -40
  496. package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
  497. package/dist/modes/interactive/components/extension-editor.d.ts +0 -20
  498. package/dist/modes/interactive/components/extension-editor.d.ts.map +0 -1
  499. package/dist/modes/interactive/components/extension-editor.js +0 -111
  500. package/dist/modes/interactive/components/extension-editor.js.map +0 -1
  501. package/dist/modes/interactive/components/extension-input.d.ts +0 -23
  502. package/dist/modes/interactive/components/extension-input.d.ts.map +0 -1
  503. package/dist/modes/interactive/components/extension-input.js +0 -61
  504. package/dist/modes/interactive/components/extension-input.js.map +0 -1
  505. package/dist/modes/interactive/components/extension-selector.d.ts +0 -24
  506. package/dist/modes/interactive/components/extension-selector.d.ts.map +0 -1
  507. package/dist/modes/interactive/components/extension-selector.js +0 -78
  508. package/dist/modes/interactive/components/extension-selector.js.map +0 -1
  509. package/dist/modes/interactive/components/footer.d.ts +0 -27
  510. package/dist/modes/interactive/components/footer.d.ts.map +0 -1
  511. package/dist/modes/interactive/components/footer.js +0 -201
  512. package/dist/modes/interactive/components/footer.js.map +0 -1
  513. package/dist/modes/interactive/components/index.d.ts +0 -32
  514. package/dist/modes/interactive/components/index.d.ts.map +0 -1
  515. package/dist/modes/interactive/components/index.js +0 -33
  516. package/dist/modes/interactive/components/index.js.map +0 -1
  517. package/dist/modes/interactive/components/keybinding-hints.d.ts +0 -8
  518. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +0 -1
  519. package/dist/modes/interactive/components/keybinding-hints.js +0 -22
  520. package/dist/modes/interactive/components/keybinding-hints.js.map +0 -1
  521. package/dist/modes/interactive/components/login-dialog.d.ts +0 -42
  522. package/dist/modes/interactive/components/login-dialog.d.ts.map +0 -1
  523. package/dist/modes/interactive/components/login-dialog.js +0 -145
  524. package/dist/modes/interactive/components/login-dialog.js.map +0 -1
  525. package/dist/modes/interactive/components/model-selector.d.ts +0 -47
  526. package/dist/modes/interactive/components/model-selector.d.ts.map +0 -1
  527. package/dist/modes/interactive/components/model-selector.js +0 -278
  528. package/dist/modes/interactive/components/model-selector.js.map +0 -1
  529. package/dist/modes/interactive/components/oauth-selector.d.ts +0 -19
  530. package/dist/modes/interactive/components/oauth-selector.d.ts.map +0 -1
  531. package/dist/modes/interactive/components/oauth-selector.js +0 -97
  532. package/dist/modes/interactive/components/oauth-selector.js.map +0 -1
  533. package/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  534. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +0 -1
  535. package/dist/modes/interactive/components/scoped-models-selector.js +0 -290
  536. package/dist/modes/interactive/components/scoped-models-selector.js.map +0 -1
  537. package/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  538. package/dist/modes/interactive/components/session-selector-search.d.ts.map +0 -1
  539. package/dist/modes/interactive/components/session-selector-search.js +0 -155
  540. package/dist/modes/interactive/components/session-selector-search.js.map +0 -1
  541. package/dist/modes/interactive/components/session-selector.d.ts +0 -96
  542. package/dist/modes/interactive/components/session-selector.d.ts.map +0 -1
  543. package/dist/modes/interactive/components/session-selector.js +0 -865
  544. package/dist/modes/interactive/components/session-selector.js.map +0 -1
  545. package/dist/modes/interactive/components/settings-selector.d.ts +0 -60
  546. package/dist/modes/interactive/components/settings-selector.d.ts.map +0 -1
  547. package/dist/modes/interactive/components/settings-selector.js +0 -311
  548. package/dist/modes/interactive/components/settings-selector.js.map +0 -1
  549. package/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  550. package/dist/modes/interactive/components/show-images-selector.d.ts.map +0 -1
  551. package/dist/modes/interactive/components/show-images-selector.js +0 -39
  552. package/dist/modes/interactive/components/show-images-selector.js.map +0 -1
  553. package/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  554. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +0 -1
  555. package/dist/modes/interactive/components/skill-invocation-message.js +0 -47
  556. package/dist/modes/interactive/components/skill-invocation-message.js.map +0 -1
  557. package/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  558. package/dist/modes/interactive/components/theme-selector.d.ts.map +0 -1
  559. package/dist/modes/interactive/components/theme-selector.js +0 -50
  560. package/dist/modes/interactive/components/theme-selector.js.map +0 -1
  561. package/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  562. package/dist/modes/interactive/components/thinking-selector.d.ts.map +0 -1
  563. package/dist/modes/interactive/components/thinking-selector.js +0 -51
  564. package/dist/modes/interactive/components/thinking-selector.js.map +0 -1
  565. package/dist/modes/interactive/components/tool-execution.d.ts +0 -60
  566. package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
  567. package/dist/modes/interactive/components/tool-execution.js +0 -289
  568. package/dist/modes/interactive/components/tool-execution.js.map +0 -1
  569. package/dist/modes/interactive/components/tree-selector.d.ts +0 -89
  570. package/dist/modes/interactive/components/tree-selector.d.ts.map +0 -1
  571. package/dist/modes/interactive/components/tree-selector.js +0 -1092
  572. package/dist/modes/interactive/components/tree-selector.js.map +0 -1
  573. package/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  574. package/dist/modes/interactive/components/user-message-selector.d.ts.map +0 -1
  575. package/dist/modes/interactive/components/user-message-selector.js +0 -114
  576. package/dist/modes/interactive/components/user-message-selector.js.map +0 -1
  577. package/dist/modes/interactive/components/user-message.d.ts +0 -10
  578. package/dist/modes/interactive/components/user-message.d.ts.map +0 -1
  579. package/dist/modes/interactive/components/user-message.js +0 -29
  580. package/dist/modes/interactive/components/user-message.js.map +0 -1
  581. package/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  582. package/dist/modes/interactive/components/visual-truncate.d.ts.map +0 -1
  583. package/dist/modes/interactive/components/visual-truncate.js +0 -33
  584. package/dist/modes/interactive/components/visual-truncate.js.map +0 -1
  585. package/dist/modes/interactive/interactive-mode.d.ts +0 -344
  586. package/dist/modes/interactive/interactive-mode.d.ts.map +0 -1
  587. package/dist/modes/interactive/interactive-mode.js +0 -4352
  588. package/dist/modes/interactive/interactive-mode.js.map +0 -1
  589. package/dist/modes/interactive/theme/aery.json +0 -84
  590. package/dist/modes/interactive/theme/catppuccin-mocha.json +0 -81
  591. package/dist/modes/interactive/theme/dark.json +0 -85
  592. package/dist/modes/interactive/theme/dracula.json +0 -81
  593. package/dist/modes/interactive/theme/light.json +0 -84
  594. package/dist/modes/interactive/theme/nord.json +0 -81
  595. package/dist/modes/interactive/theme/theme-schema.json +0 -335
  596. package/dist/modes/interactive/theme/theme.d.ts +0 -81
  597. package/dist/modes/interactive/theme/theme.d.ts.map +0 -1
  598. package/dist/modes/interactive/theme/theme.js +0 -983
  599. package/dist/modes/interactive/theme/theme.js.map +0 -1
  600. package/dist/modes/interactive/theme/tokyo-night.json +0 -81
  601. package/dist/modes/print-mode.d.ts +0 -28
  602. package/dist/modes/print-mode.d.ts.map +0 -1
  603. package/dist/modes/print-mode.js +0 -141
  604. package/dist/modes/print-mode.js.map +0 -1
  605. package/dist/modes/rpc/jsonl.d.ts +0 -17
  606. package/dist/modes/rpc/jsonl.d.ts.map +0 -1
  607. package/dist/modes/rpc/jsonl.js +0 -49
  608. package/dist/modes/rpc/jsonl.js.map +0 -1
  609. package/dist/modes/rpc/rpc-client.d.ts +0 -224
  610. package/dist/modes/rpc/rpc-client.d.ts.map +0 -1
  611. package/dist/modes/rpc/rpc-client.js +0 -410
  612. package/dist/modes/rpc/rpc-client.js.map +0 -1
  613. package/dist/modes/rpc/rpc-mode.d.ts +0 -20
  614. package/dist/modes/rpc/rpc-mode.d.ts.map +0 -1
  615. package/dist/modes/rpc/rpc-mode.js +0 -601
  616. package/dist/modes/rpc/rpc-mode.js.map +0 -1
  617. package/dist/modes/rpc/rpc-types.d.ts +0 -419
  618. package/dist/modes/rpc/rpc-types.d.ts.map +0 -1
  619. package/dist/modes/rpc/rpc-types.js +0 -8
  620. package/dist/modes/rpc/rpc-types.js.map +0 -1
  621. package/dist/package-manager-cli.d.ts +0 -4
  622. package/dist/package-manager-cli.d.ts.map +0 -1
  623. package/dist/package-manager-cli.js +0 -234
  624. package/dist/package-manager-cli.js.map +0 -1
  625. package/dist/utils/changelog.d.ts +0 -21
  626. package/dist/utils/changelog.d.ts.map +0 -1
  627. package/dist/utils/changelog.js +0 -87
  628. package/dist/utils/changelog.js.map +0 -1
  629. package/dist/utils/child-process.d.ts +0 -11
  630. package/dist/utils/child-process.d.ts.map +0 -1
  631. package/dist/utils/child-process.js +0 -78
  632. package/dist/utils/child-process.js.map +0 -1
  633. package/dist/utils/clipboard-image.d.ts +0 -11
  634. package/dist/utils/clipboard-image.d.ts.map +0 -1
  635. package/dist/utils/clipboard-image.js +0 -245
  636. package/dist/utils/clipboard-image.js.map +0 -1
  637. package/dist/utils/clipboard-native.d.ts +0 -8
  638. package/dist/utils/clipboard-native.d.ts.map +0 -1
  639. package/dist/utils/clipboard-native.js +0 -14
  640. package/dist/utils/clipboard-native.js.map +0 -1
  641. package/dist/utils/clipboard.d.ts +0 -2
  642. package/dist/utils/clipboard.d.ts.map +0 -1
  643. package/dist/utils/clipboard.js +0 -78
  644. package/dist/utils/clipboard.js.map +0 -1
  645. package/dist/utils/exif-orientation.d.ts +0 -5
  646. package/dist/utils/exif-orientation.d.ts.map +0 -1
  647. package/dist/utils/exif-orientation.js +0 -158
  648. package/dist/utils/exif-orientation.js.map +0 -1
  649. package/dist/utils/frontmatter.d.ts +0 -8
  650. package/dist/utils/frontmatter.d.ts.map +0 -1
  651. package/dist/utils/frontmatter.js +0 -26
  652. package/dist/utils/frontmatter.js.map +0 -1
  653. package/dist/utils/git.d.ts +0 -26
  654. package/dist/utils/git.d.ts.map +0 -1
  655. package/dist/utils/git.js +0 -163
  656. package/dist/utils/git.js.map +0 -1
  657. package/dist/utils/image-convert.d.ts +0 -9
  658. package/dist/utils/image-convert.d.ts.map +0 -1
  659. package/dist/utils/image-convert.js +0 -39
  660. package/dist/utils/image-convert.js.map +0 -1
  661. package/dist/utils/image-resize.d.ts +0 -36
  662. package/dist/utils/image-resize.d.ts.map +0 -1
  663. package/dist/utils/image-resize.js +0 -137
  664. package/dist/utils/image-resize.js.map +0 -1
  665. package/dist/utils/mime.d.ts +0 -2
  666. package/dist/utils/mime.d.ts.map +0 -1
  667. package/dist/utils/mime.js +0 -26
  668. package/dist/utils/mime.js.map +0 -1
  669. package/dist/utils/paths.d.ts +0 -7
  670. package/dist/utils/paths.d.ts.map +0 -1
  671. package/dist/utils/paths.js +0 -19
  672. package/dist/utils/paths.js.map +0 -1
  673. package/dist/utils/photon.d.ts +0 -21
  674. package/dist/utils/photon.d.ts.map +0 -1
  675. package/dist/utils/photon.js +0 -121
  676. package/dist/utils/photon.js.map +0 -1
  677. package/dist/utils/shell.d.ts +0 -29
  678. package/dist/utils/shell.d.ts.map +0 -1
  679. package/dist/utils/shell.js +0 -203
  680. package/dist/utils/shell.js.map +0 -1
  681. package/dist/utils/sleep.d.ts +0 -5
  682. package/dist/utils/sleep.d.ts.map +0 -1
  683. package/dist/utils/sleep.js +0 -17
  684. package/dist/utils/sleep.js.map +0 -1
  685. package/dist/utils/tools-manager.d.ts +0 -3
  686. package/dist/utils/tools-manager.d.ts.map +0 -1
  687. package/dist/utils/tools-manager.js +0 -252
  688. package/dist/utils/tools-manager.js.map +0 -1
@@ -1,34 +0,0 @@
1
- /**
2
- * Armin says hi! A fun easter egg with animated XBM art.
3
- */
4
- import type { Component, TUI } from "@eminent337/aery-tui";
5
- export declare class ArminComponent implements Component {
6
- private ui;
7
- private interval;
8
- private effect;
9
- private finalGrid;
10
- private currentGrid;
11
- private effectState;
12
- private cachedLines;
13
- private cachedWidth;
14
- private gridVersion;
15
- private cachedVersion;
16
- constructor(ui: TUI);
17
- invalidate(): void;
18
- render(width: number): string[];
19
- private createEmptyGrid;
20
- private initEffect;
21
- private startAnimation;
22
- private stopAnimation;
23
- private tickEffect;
24
- private tickTypewriter;
25
- private tickScanline;
26
- private tickRain;
27
- private tickFade;
28
- private tickCrt;
29
- private tickGlitch;
30
- private tickDissolve;
31
- private updateDisplay;
32
- dispose(): void;
33
- }
34
- //# sourceMappingURL=armin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"armin.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/armin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAuD3D,qBAAa,cAAe,YAAW,SAAS;IAC/C,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAM;IAE3B,YAAY,EAAE,EAAE,GAAG,EAQlB;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB9B;IAED,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,UAAU;IAgElB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,QAAQ;IAmDhB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,UAAU;IAgClB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,aAAa;IAIrB,OAAO,IAAI,IAAI,CAEd;CACD","sourcesContent":["/**\n * Armin says hi! A fun easter egg with animated XBM art.\n */\n\nimport type { Component, TUI } from \"@eminent337/aery-tui\";\nimport { theme } from \"../theme/theme.js\";\n\n// XBM image: 31x36 pixels, LSB first, 1=background, 0=foreground\nconst WIDTH = 31;\nconst HEIGHT = 36;\nconst BITS = [\n\t0xff, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0xff, 0x7f, 0xff, 0xed, 0xff, 0x7f, 0xff, 0xdb, 0xff, 0x7f, 0xff, 0xb7, 0xff,\n\t0x7f, 0xff, 0x77, 0xfe, 0x7f, 0x3f, 0xf8, 0xfe, 0x7f, 0xdf, 0xff, 0xfe, 0x7f, 0xdf, 0x3f, 0xfc, 0x7f, 0x9f, 0xc3,\n\t0xfb, 0x7f, 0x6f, 0xfc, 0xf4, 0x7f, 0xf7, 0x0f, 0xf7, 0x7f, 0xf7, 0xff, 0xf7, 0x7f, 0xf7, 0xff, 0xe3, 0x7f, 0xf7,\n\t0x07, 0xe8, 0x7f, 0xef, 0xf8, 0x67, 0x70, 0x0f, 0xff, 0xbb, 0x6f, 0xf1, 0x00, 0xd0, 0x5b, 0xfd, 0x3f, 0xec, 0x53,\n\t0xc1, 0xff, 0xef, 0x57, 0x9f, 0xfd, 0xee, 0x5f, 0x9f, 0xfc, 0xae, 0x5f, 0x1f, 0x78, 0xac, 0x5f, 0x3f, 0x00, 0x50,\n\t0x6c, 0x7f, 0x00, 0xdc, 0x77, 0xff, 0xc0, 0x3f, 0x78, 0xff, 0x01, 0xf8, 0x7f, 0xff, 0x03, 0x9c, 0x78, 0xff, 0x07,\n\t0x8c, 0x7c, 0xff, 0x0f, 0xce, 0x78, 0xff, 0xff, 0xcf, 0x7f, 0xff, 0xff, 0xcf, 0x78, 0xff, 0xff, 0xdf, 0x78, 0xff,\n\t0xff, 0xdf, 0x7d, 0xff, 0xff, 0x3f, 0x7e, 0xff, 0xff, 0xff, 0x7f,\n];\n\nconst BYTES_PER_ROW = Math.ceil(WIDTH / 8);\nconst DISPLAY_HEIGHT = Math.ceil(HEIGHT / 2); // Half-block rendering\n\ntype Effect = \"typewriter\" | \"scanline\" | \"rain\" | \"fade\" | \"crt\" | \"glitch\" | \"dissolve\";\n\nconst EFFECTS: Effect[] = [\"typewriter\", \"scanline\", \"rain\", \"fade\", \"crt\", \"glitch\", \"dissolve\"];\n\n// Get pixel at (x, y): true = foreground, false = background\nfunction getPixel(x: number, y: number): boolean {\n\tif (y >= HEIGHT) return false;\n\tconst byteIndex = y * BYTES_PER_ROW + Math.floor(x / 8);\n\tconst bitIndex = x % 8;\n\treturn ((BITS[byteIndex] >> bitIndex) & 1) === 0;\n}\n\n// Get the character for a cell (2 vertical pixels packed)\nfunction getChar(x: number, row: number): string {\n\tconst upper = getPixel(x, row * 2);\n\tconst lower = getPixel(x, row * 2 + 1);\n\tif (upper && lower) return \"█\";\n\tif (upper) return \"▀\";\n\tif (lower) return \"▄\";\n\treturn \" \";\n}\n\n// Build the final image grid\nfunction buildFinalGrid(): string[][] {\n\tconst grid: string[][] = [];\n\tfor (let row = 0; row < DISPLAY_HEIGHT; row++) {\n\t\tconst line: string[] = [];\n\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\tline.push(getChar(x, row));\n\t\t}\n\t\tgrid.push(line);\n\t}\n\treturn grid;\n}\n\nexport class ArminComponent implements Component {\n\tprivate ui: TUI;\n\tprivate interval: ReturnType<typeof setInterval> | null = null;\n\tprivate effect: Effect;\n\tprivate finalGrid: string[][];\n\tprivate currentGrid: string[][];\n\tprivate effectState: Record<string, unknown> = {};\n\tprivate cachedLines: string[] = [];\n\tprivate cachedWidth = 0;\n\tprivate gridVersion = 0;\n\tprivate cachedVersion = -1;\n\n\tconstructor(ui: TUI) {\n\t\tthis.ui = ui;\n\t\tthis.effect = EFFECTS[Math.floor(Math.random() * EFFECTS.length)];\n\t\tthis.finalGrid = buildFinalGrid();\n\t\tthis.currentGrid = this.createEmptyGrid();\n\n\t\tthis.initEffect();\n\t\tthis.startAnimation();\n\t}\n\n\tinvalidate(): void {\n\t\tthis.cachedWidth = 0;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (width === this.cachedWidth && this.cachedVersion === this.gridVersion) {\n\t\t\treturn this.cachedLines;\n\t\t}\n\n\t\tconst padding = 1;\n\t\tconst availableWidth = width - padding;\n\n\t\tthis.cachedLines = this.currentGrid.map((row) => {\n\t\t\t// Clip row to available width before applying color\n\t\t\tconst clipped = row.slice(0, availableWidth).join(\"\");\n\t\t\tconst padRight = Math.max(0, width - padding - clipped.length);\n\t\t\treturn ` ${theme.fg(\"accent\", clipped)}${\" \".repeat(padRight)}`;\n\t\t});\n\n\t\t// Add \"ARMIN SAYS HI\" at the end\n\t\tconst message = \"ARMIN SAYS HI\";\n\t\tconst msgPadRight = Math.max(0, width - padding - message.length);\n\t\tthis.cachedLines.push(` ${theme.fg(\"accent\", message)}${\" \".repeat(msgPadRight)}`);\n\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedVersion = this.gridVersion;\n\n\t\treturn this.cachedLines;\n\t}\n\n\tprivate createEmptyGrid(): string[][] {\n\t\treturn Array.from({ length: DISPLAY_HEIGHT }, () => Array(WIDTH).fill(\" \"));\n\t}\n\n\tprivate initEffect(): void {\n\t\tswitch (this.effect) {\n\t\t\tcase \"typewriter\":\n\t\t\t\tthis.effectState = { pos: 0 };\n\t\t\t\tbreak;\n\t\t\tcase \"scanline\":\n\t\t\t\tthis.effectState = { row: 0 };\n\t\t\t\tbreak;\n\t\t\tcase \"rain\":\n\t\t\t\t// Track falling position for each column\n\t\t\t\tthis.effectState = {\n\t\t\t\t\tdrops: Array.from({ length: WIDTH }, () => ({\n\t\t\t\t\t\ty: -Math.floor(Math.random() * DISPLAY_HEIGHT * 2),\n\t\t\t\t\t\tsettled: 0,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase \"fade\": {\n\t\t\t\t// Shuffle all pixel positions\n\t\t\t\tconst positions: [number, number][] = [];\n\t\t\t\tfor (let row = 0; row < DISPLAY_HEIGHT; row++) {\n\t\t\t\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\t\t\t\tpositions.push([row, x]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Fisher-Yates shuffle\n\t\t\t\tfor (let i = positions.length - 1; i > 0; i--) {\n\t\t\t\t\tconst j = Math.floor(Math.random() * (i + 1));\n\t\t\t\t\t[positions[i], positions[j]] = [positions[j], positions[i]];\n\t\t\t\t}\n\t\t\t\tthis.effectState = { positions, idx: 0 };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"crt\":\n\t\t\t\tthis.effectState = { expansion: 0 };\n\t\t\t\tbreak;\n\t\t\tcase \"glitch\":\n\t\t\t\tthis.effectState = { phase: 0, glitchFrames: 8 };\n\t\t\t\tbreak;\n\t\t\tcase \"dissolve\": {\n\t\t\t\t// Start with random noise\n\t\t\t\tthis.currentGrid = Array.from({ length: DISPLAY_HEIGHT }, () =>\n\t\t\t\t\tArray.from({ length: WIDTH }, () => {\n\t\t\t\t\t\tconst chars = [\" \", \"░\", \"▒\", \"▓\", \"█\", \"▀\", \"▄\"];\n\t\t\t\t\t\treturn chars[Math.floor(Math.random() * chars.length)];\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\t// Shuffle positions for gradual resolve\n\t\t\t\tconst dissolvePositions: [number, number][] = [];\n\t\t\t\tfor (let row = 0; row < DISPLAY_HEIGHT; row++) {\n\t\t\t\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\t\t\t\tdissolvePositions.push([row, x]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let i = dissolvePositions.length - 1; i > 0; i--) {\n\t\t\t\t\tconst j = Math.floor(Math.random() * (i + 1));\n\t\t\t\t\t[dissolvePositions[i], dissolvePositions[j]] = [dissolvePositions[j], dissolvePositions[i]];\n\t\t\t\t}\n\t\t\t\tthis.effectState = { positions: dissolvePositions, idx: 0 };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate startAnimation(): void {\n\t\tconst fps = this.effect === \"glitch\" ? 60 : 30;\n\t\tthis.interval = setInterval(() => {\n\t\t\tconst done = this.tickEffect();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t\tif (done) {\n\t\t\t\tthis.stopAnimation();\n\t\t\t}\n\t\t}, 1000 / fps);\n\t}\n\n\tprivate stopAnimation(): void {\n\t\tif (this.interval) {\n\t\t\tclearInterval(this.interval);\n\t\t\tthis.interval = null;\n\t\t}\n\t}\n\n\tprivate tickEffect(): boolean {\n\t\tswitch (this.effect) {\n\t\t\tcase \"typewriter\":\n\t\t\t\treturn this.tickTypewriter();\n\t\t\tcase \"scanline\":\n\t\t\t\treturn this.tickScanline();\n\t\t\tcase \"rain\":\n\t\t\t\treturn this.tickRain();\n\t\t\tcase \"fade\":\n\t\t\t\treturn this.tickFade();\n\t\t\tcase \"crt\":\n\t\t\t\treturn this.tickCrt();\n\t\t\tcase \"glitch\":\n\t\t\t\treturn this.tickGlitch();\n\t\t\tcase \"dissolve\":\n\t\t\t\treturn this.tickDissolve();\n\t\t\tdefault:\n\t\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate tickTypewriter(): boolean {\n\t\tconst state = this.effectState as { pos: number };\n\t\tconst pixelsPerFrame = 3;\n\n\t\tfor (let i = 0; i < pixelsPerFrame; i++) {\n\t\t\tconst row = Math.floor(state.pos / WIDTH);\n\t\t\tconst x = state.pos % WIDTH;\n\t\t\tif (row >= DISPLAY_HEIGHT) return true;\n\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\tstate.pos++;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate tickScanline(): boolean {\n\t\tconst state = this.effectState as { row: number };\n\t\tif (state.row >= DISPLAY_HEIGHT) return true;\n\n\t\t// Copy row\n\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\tthis.currentGrid[state.row][x] = this.finalGrid[state.row][x];\n\t\t}\n\t\tstate.row++;\n\t\treturn false;\n\t}\n\n\tprivate tickRain(): boolean {\n\t\tconst state = this.effectState as {\n\t\t\tdrops: { y: number; settled: number }[];\n\t\t};\n\n\t\tlet allSettled = true;\n\t\tthis.currentGrid = this.createEmptyGrid();\n\n\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\tconst drop = state.drops[x];\n\n\t\t\t// Draw settled pixels\n\t\t\tfor (let row = DISPLAY_HEIGHT - 1; row >= DISPLAY_HEIGHT - drop.settled; row--) {\n\t\t\t\tif (row >= 0) {\n\t\t\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if this column is done\n\t\t\tif (drop.settled >= DISPLAY_HEIGHT) continue;\n\n\t\t\tallSettled = false;\n\n\t\t\t// Find the target row for this column (lowest non-space pixel)\n\t\t\tlet targetRow = -1;\n\t\t\tfor (let row = DISPLAY_HEIGHT - 1 - drop.settled; row >= 0; row--) {\n\t\t\t\tif (this.finalGrid[row][x] !== \" \") {\n\t\t\t\t\ttargetRow = row;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Move drop down\n\t\t\tdrop.y++;\n\n\t\t\t// Draw falling drop\n\t\t\tif (drop.y >= 0 && drop.y < DISPLAY_HEIGHT) {\n\t\t\t\tif (targetRow >= 0 && drop.y >= targetRow) {\n\t\t\t\t\t// Settle\n\t\t\t\t\tdrop.settled = DISPLAY_HEIGHT - targetRow;\n\t\t\t\t\tdrop.y = -Math.floor(Math.random() * 5) - 1;\n\t\t\t\t} else {\n\t\t\t\t\t// Still falling\n\t\t\t\t\tthis.currentGrid[drop.y][x] = \"▓\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn allSettled;\n\t}\n\n\tprivate tickFade(): boolean {\n\t\tconst state = this.effectState as { positions: [number, number][]; idx: number };\n\t\tconst pixelsPerFrame = 15;\n\n\t\tfor (let i = 0; i < pixelsPerFrame; i++) {\n\t\t\tif (state.idx >= state.positions.length) return true;\n\t\t\tconst [row, x] = state.positions[state.idx];\n\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\tstate.idx++;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate tickCrt(): boolean {\n\t\tconst state = this.effectState as { expansion: number };\n\t\tconst midRow = Math.floor(DISPLAY_HEIGHT / 2);\n\n\t\tthis.currentGrid = this.createEmptyGrid();\n\n\t\t// Draw from middle expanding outward\n\t\tconst top = midRow - state.expansion;\n\t\tconst bottom = midRow + state.expansion;\n\n\t\tfor (let row = Math.max(0, top); row <= Math.min(DISPLAY_HEIGHT - 1, bottom); row++) {\n\t\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\t}\n\t\t}\n\n\t\tstate.expansion++;\n\t\treturn state.expansion > DISPLAY_HEIGHT;\n\t}\n\n\tprivate tickGlitch(): boolean {\n\t\tconst state = this.effectState as { phase: number; glitchFrames: number };\n\n\t\tif (state.phase < state.glitchFrames) {\n\t\t\t// Glitch phase: show corrupted version\n\t\t\tthis.currentGrid = this.finalGrid.map((row) => {\n\t\t\t\tconst offset = Math.floor(Math.random() * 7) - 3;\n\t\t\t\tconst glitchRow = [...row];\n\n\t\t\t\t// Random horizontal offset\n\t\t\t\tif (Math.random() < 0.3) {\n\t\t\t\t\tconst shifted = glitchRow.slice(offset).concat(glitchRow.slice(0, offset));\n\t\t\t\t\treturn shifted.slice(0, WIDTH);\n\t\t\t\t}\n\n\t\t\t\t// Random vertical swap\n\t\t\t\tif (Math.random() < 0.2) {\n\t\t\t\t\tconst swapRow = Math.floor(Math.random() * DISPLAY_HEIGHT);\n\t\t\t\t\treturn [...this.finalGrid[swapRow]];\n\t\t\t\t}\n\n\t\t\t\treturn glitchRow;\n\t\t\t});\n\t\t\tstate.phase++;\n\t\t\treturn false;\n\t\t}\n\n\t\t// Final frame: show clean image\n\t\tthis.currentGrid = this.finalGrid.map((row) => [...row]);\n\t\treturn true;\n\t}\n\n\tprivate tickDissolve(): boolean {\n\t\tconst state = this.effectState as { positions: [number, number][]; idx: number };\n\t\tconst pixelsPerFrame = 20;\n\n\t\tfor (let i = 0; i < pixelsPerFrame; i++) {\n\t\t\tif (state.idx >= state.positions.length) return true;\n\t\t\tconst [row, x] = state.positions[state.idx];\n\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\tstate.idx++;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tthis.gridVersion++;\n\t}\n\n\tdispose(): void {\n\t\tthis.stopAnimation();\n\t}\n}\n"]}
@@ -1,333 +0,0 @@
1
- /**
2
- * Armin says hi! A fun easter egg with animated XBM art.
3
- */
4
- import { theme } from "../theme/theme.js";
5
- // XBM image: 31x36 pixels, LSB first, 1=background, 0=foreground
6
- const WIDTH = 31;
7
- const HEIGHT = 36;
8
- const BITS = [
9
- 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0xff, 0x7f, 0xff, 0xed, 0xff, 0x7f, 0xff, 0xdb, 0xff, 0x7f, 0xff, 0xb7, 0xff,
10
- 0x7f, 0xff, 0x77, 0xfe, 0x7f, 0x3f, 0xf8, 0xfe, 0x7f, 0xdf, 0xff, 0xfe, 0x7f, 0xdf, 0x3f, 0xfc, 0x7f, 0x9f, 0xc3,
11
- 0xfb, 0x7f, 0x6f, 0xfc, 0xf4, 0x7f, 0xf7, 0x0f, 0xf7, 0x7f, 0xf7, 0xff, 0xf7, 0x7f, 0xf7, 0xff, 0xe3, 0x7f, 0xf7,
12
- 0x07, 0xe8, 0x7f, 0xef, 0xf8, 0x67, 0x70, 0x0f, 0xff, 0xbb, 0x6f, 0xf1, 0x00, 0xd0, 0x5b, 0xfd, 0x3f, 0xec, 0x53,
13
- 0xc1, 0xff, 0xef, 0x57, 0x9f, 0xfd, 0xee, 0x5f, 0x9f, 0xfc, 0xae, 0x5f, 0x1f, 0x78, 0xac, 0x5f, 0x3f, 0x00, 0x50,
14
- 0x6c, 0x7f, 0x00, 0xdc, 0x77, 0xff, 0xc0, 0x3f, 0x78, 0xff, 0x01, 0xf8, 0x7f, 0xff, 0x03, 0x9c, 0x78, 0xff, 0x07,
15
- 0x8c, 0x7c, 0xff, 0x0f, 0xce, 0x78, 0xff, 0xff, 0xcf, 0x7f, 0xff, 0xff, 0xcf, 0x78, 0xff, 0xff, 0xdf, 0x78, 0xff,
16
- 0xff, 0xdf, 0x7d, 0xff, 0xff, 0x3f, 0x7e, 0xff, 0xff, 0xff, 0x7f,
17
- ];
18
- const BYTES_PER_ROW = Math.ceil(WIDTH / 8);
19
- const DISPLAY_HEIGHT = Math.ceil(HEIGHT / 2); // Half-block rendering
20
- const EFFECTS = ["typewriter", "scanline", "rain", "fade", "crt", "glitch", "dissolve"];
21
- // Get pixel at (x, y): true = foreground, false = background
22
- function getPixel(x, y) {
23
- if (y >= HEIGHT)
24
- return false;
25
- const byteIndex = y * BYTES_PER_ROW + Math.floor(x / 8);
26
- const bitIndex = x % 8;
27
- return ((BITS[byteIndex] >> bitIndex) & 1) === 0;
28
- }
29
- // Get the character for a cell (2 vertical pixels packed)
30
- function getChar(x, row) {
31
- const upper = getPixel(x, row * 2);
32
- const lower = getPixel(x, row * 2 + 1);
33
- if (upper && lower)
34
- return "█";
35
- if (upper)
36
- return "▀";
37
- if (lower)
38
- return "▄";
39
- return " ";
40
- }
41
- // Build the final image grid
42
- function buildFinalGrid() {
43
- const grid = [];
44
- for (let row = 0; row < DISPLAY_HEIGHT; row++) {
45
- const line = [];
46
- for (let x = 0; x < WIDTH; x++) {
47
- line.push(getChar(x, row));
48
- }
49
- grid.push(line);
50
- }
51
- return grid;
52
- }
53
- export class ArminComponent {
54
- ui;
55
- interval = null;
56
- effect;
57
- finalGrid;
58
- currentGrid;
59
- effectState = {};
60
- cachedLines = [];
61
- cachedWidth = 0;
62
- gridVersion = 0;
63
- cachedVersion = -1;
64
- constructor(ui) {
65
- this.ui = ui;
66
- this.effect = EFFECTS[Math.floor(Math.random() * EFFECTS.length)];
67
- this.finalGrid = buildFinalGrid();
68
- this.currentGrid = this.createEmptyGrid();
69
- this.initEffect();
70
- this.startAnimation();
71
- }
72
- invalidate() {
73
- this.cachedWidth = 0;
74
- }
75
- render(width) {
76
- if (width === this.cachedWidth && this.cachedVersion === this.gridVersion) {
77
- return this.cachedLines;
78
- }
79
- const padding = 1;
80
- const availableWidth = width - padding;
81
- this.cachedLines = this.currentGrid.map((row) => {
82
- // Clip row to available width before applying color
83
- const clipped = row.slice(0, availableWidth).join("");
84
- const padRight = Math.max(0, width - padding - clipped.length);
85
- return ` ${theme.fg("accent", clipped)}${" ".repeat(padRight)}`;
86
- });
87
- // Add "ARMIN SAYS HI" at the end
88
- const message = "ARMIN SAYS HI";
89
- const msgPadRight = Math.max(0, width - padding - message.length);
90
- this.cachedLines.push(` ${theme.fg("accent", message)}${" ".repeat(msgPadRight)}`);
91
- this.cachedWidth = width;
92
- this.cachedVersion = this.gridVersion;
93
- return this.cachedLines;
94
- }
95
- createEmptyGrid() {
96
- return Array.from({ length: DISPLAY_HEIGHT }, () => Array(WIDTH).fill(" "));
97
- }
98
- initEffect() {
99
- switch (this.effect) {
100
- case "typewriter":
101
- this.effectState = { pos: 0 };
102
- break;
103
- case "scanline":
104
- this.effectState = { row: 0 };
105
- break;
106
- case "rain":
107
- // Track falling position for each column
108
- this.effectState = {
109
- drops: Array.from({ length: WIDTH }, () => ({
110
- y: -Math.floor(Math.random() * DISPLAY_HEIGHT * 2),
111
- settled: 0,
112
- })),
113
- };
114
- break;
115
- case "fade": {
116
- // Shuffle all pixel positions
117
- const positions = [];
118
- for (let row = 0; row < DISPLAY_HEIGHT; row++) {
119
- for (let x = 0; x < WIDTH; x++) {
120
- positions.push([row, x]);
121
- }
122
- }
123
- // Fisher-Yates shuffle
124
- for (let i = positions.length - 1; i > 0; i--) {
125
- const j = Math.floor(Math.random() * (i + 1));
126
- [positions[i], positions[j]] = [positions[j], positions[i]];
127
- }
128
- this.effectState = { positions, idx: 0 };
129
- break;
130
- }
131
- case "crt":
132
- this.effectState = { expansion: 0 };
133
- break;
134
- case "glitch":
135
- this.effectState = { phase: 0, glitchFrames: 8 };
136
- break;
137
- case "dissolve": {
138
- // Start with random noise
139
- this.currentGrid = Array.from({ length: DISPLAY_HEIGHT }, () => Array.from({ length: WIDTH }, () => {
140
- const chars = [" ", "░", "▒", "▓", "█", "▀", "▄"];
141
- return chars[Math.floor(Math.random() * chars.length)];
142
- }));
143
- // Shuffle positions for gradual resolve
144
- const dissolvePositions = [];
145
- for (let row = 0; row < DISPLAY_HEIGHT; row++) {
146
- for (let x = 0; x < WIDTH; x++) {
147
- dissolvePositions.push([row, x]);
148
- }
149
- }
150
- for (let i = dissolvePositions.length - 1; i > 0; i--) {
151
- const j = Math.floor(Math.random() * (i + 1));
152
- [dissolvePositions[i], dissolvePositions[j]] = [dissolvePositions[j], dissolvePositions[i]];
153
- }
154
- this.effectState = { positions: dissolvePositions, idx: 0 };
155
- break;
156
- }
157
- }
158
- }
159
- startAnimation() {
160
- const fps = this.effect === "glitch" ? 60 : 30;
161
- this.interval = setInterval(() => {
162
- const done = this.tickEffect();
163
- this.updateDisplay();
164
- this.ui.requestRender();
165
- if (done) {
166
- this.stopAnimation();
167
- }
168
- }, 1000 / fps);
169
- }
170
- stopAnimation() {
171
- if (this.interval) {
172
- clearInterval(this.interval);
173
- this.interval = null;
174
- }
175
- }
176
- tickEffect() {
177
- switch (this.effect) {
178
- case "typewriter":
179
- return this.tickTypewriter();
180
- case "scanline":
181
- return this.tickScanline();
182
- case "rain":
183
- return this.tickRain();
184
- case "fade":
185
- return this.tickFade();
186
- case "crt":
187
- return this.tickCrt();
188
- case "glitch":
189
- return this.tickGlitch();
190
- case "dissolve":
191
- return this.tickDissolve();
192
- default:
193
- return true;
194
- }
195
- }
196
- tickTypewriter() {
197
- const state = this.effectState;
198
- const pixelsPerFrame = 3;
199
- for (let i = 0; i < pixelsPerFrame; i++) {
200
- const row = Math.floor(state.pos / WIDTH);
201
- const x = state.pos % WIDTH;
202
- if (row >= DISPLAY_HEIGHT)
203
- return true;
204
- this.currentGrid[row][x] = this.finalGrid[row][x];
205
- state.pos++;
206
- }
207
- return false;
208
- }
209
- tickScanline() {
210
- const state = this.effectState;
211
- if (state.row >= DISPLAY_HEIGHT)
212
- return true;
213
- // Copy row
214
- for (let x = 0; x < WIDTH; x++) {
215
- this.currentGrid[state.row][x] = this.finalGrid[state.row][x];
216
- }
217
- state.row++;
218
- return false;
219
- }
220
- tickRain() {
221
- const state = this.effectState;
222
- let allSettled = true;
223
- this.currentGrid = this.createEmptyGrid();
224
- for (let x = 0; x < WIDTH; x++) {
225
- const drop = state.drops[x];
226
- // Draw settled pixels
227
- for (let row = DISPLAY_HEIGHT - 1; row >= DISPLAY_HEIGHT - drop.settled; row--) {
228
- if (row >= 0) {
229
- this.currentGrid[row][x] = this.finalGrid[row][x];
230
- }
231
- }
232
- // Check if this column is done
233
- if (drop.settled >= DISPLAY_HEIGHT)
234
- continue;
235
- allSettled = false;
236
- // Find the target row for this column (lowest non-space pixel)
237
- let targetRow = -1;
238
- for (let row = DISPLAY_HEIGHT - 1 - drop.settled; row >= 0; row--) {
239
- if (this.finalGrid[row][x] !== " ") {
240
- targetRow = row;
241
- break;
242
- }
243
- }
244
- // Move drop down
245
- drop.y++;
246
- // Draw falling drop
247
- if (drop.y >= 0 && drop.y < DISPLAY_HEIGHT) {
248
- if (targetRow >= 0 && drop.y >= targetRow) {
249
- // Settle
250
- drop.settled = DISPLAY_HEIGHT - targetRow;
251
- drop.y = -Math.floor(Math.random() * 5) - 1;
252
- }
253
- else {
254
- // Still falling
255
- this.currentGrid[drop.y][x] = "▓";
256
- }
257
- }
258
- }
259
- return allSettled;
260
- }
261
- tickFade() {
262
- const state = this.effectState;
263
- const pixelsPerFrame = 15;
264
- for (let i = 0; i < pixelsPerFrame; i++) {
265
- if (state.idx >= state.positions.length)
266
- return true;
267
- const [row, x] = state.positions[state.idx];
268
- this.currentGrid[row][x] = this.finalGrid[row][x];
269
- state.idx++;
270
- }
271
- return false;
272
- }
273
- tickCrt() {
274
- const state = this.effectState;
275
- const midRow = Math.floor(DISPLAY_HEIGHT / 2);
276
- this.currentGrid = this.createEmptyGrid();
277
- // Draw from middle expanding outward
278
- const top = midRow - state.expansion;
279
- const bottom = midRow + state.expansion;
280
- for (let row = Math.max(0, top); row <= Math.min(DISPLAY_HEIGHT - 1, bottom); row++) {
281
- for (let x = 0; x < WIDTH; x++) {
282
- this.currentGrid[row][x] = this.finalGrid[row][x];
283
- }
284
- }
285
- state.expansion++;
286
- return state.expansion > DISPLAY_HEIGHT;
287
- }
288
- tickGlitch() {
289
- const state = this.effectState;
290
- if (state.phase < state.glitchFrames) {
291
- // Glitch phase: show corrupted version
292
- this.currentGrid = this.finalGrid.map((row) => {
293
- const offset = Math.floor(Math.random() * 7) - 3;
294
- const glitchRow = [...row];
295
- // Random horizontal offset
296
- if (Math.random() < 0.3) {
297
- const shifted = glitchRow.slice(offset).concat(glitchRow.slice(0, offset));
298
- return shifted.slice(0, WIDTH);
299
- }
300
- // Random vertical swap
301
- if (Math.random() < 0.2) {
302
- const swapRow = Math.floor(Math.random() * DISPLAY_HEIGHT);
303
- return [...this.finalGrid[swapRow]];
304
- }
305
- return glitchRow;
306
- });
307
- state.phase++;
308
- return false;
309
- }
310
- // Final frame: show clean image
311
- this.currentGrid = this.finalGrid.map((row) => [...row]);
312
- return true;
313
- }
314
- tickDissolve() {
315
- const state = this.effectState;
316
- const pixelsPerFrame = 20;
317
- for (let i = 0; i < pixelsPerFrame; i++) {
318
- if (state.idx >= state.positions.length)
319
- return true;
320
- const [row, x] = state.positions[state.idx];
321
- this.currentGrid[row][x] = this.finalGrid[row][x];
322
- state.idx++;
323
- }
324
- return false;
325
- }
326
- updateDisplay() {
327
- this.gridVersion++;
328
- }
329
- dispose() {
330
- this.stopAnimation();
331
- }
332
- }
333
- //# sourceMappingURL=armin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"armin.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/armin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Armin says hi! A fun easter egg with animated XBM art.\n */\n\nimport type { Component, TUI } from \"@eminent337/aery-tui\";\nimport { theme } from \"../theme/theme.js\";\n\n// XBM image: 31x36 pixels, LSB first, 1=background, 0=foreground\nconst WIDTH = 31;\nconst HEIGHT = 36;\nconst BITS = [\n\t0xff, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0xff, 0x7f, 0xff, 0xed, 0xff, 0x7f, 0xff, 0xdb, 0xff, 0x7f, 0xff, 0xb7, 0xff,\n\t0x7f, 0xff, 0x77, 0xfe, 0x7f, 0x3f, 0xf8, 0xfe, 0x7f, 0xdf, 0xff, 0xfe, 0x7f, 0xdf, 0x3f, 0xfc, 0x7f, 0x9f, 0xc3,\n\t0xfb, 0x7f, 0x6f, 0xfc, 0xf4, 0x7f, 0xf7, 0x0f, 0xf7, 0x7f, 0xf7, 0xff, 0xf7, 0x7f, 0xf7, 0xff, 0xe3, 0x7f, 0xf7,\n\t0x07, 0xe8, 0x7f, 0xef, 0xf8, 0x67, 0x70, 0x0f, 0xff, 0xbb, 0x6f, 0xf1, 0x00, 0xd0, 0x5b, 0xfd, 0x3f, 0xec, 0x53,\n\t0xc1, 0xff, 0xef, 0x57, 0x9f, 0xfd, 0xee, 0x5f, 0x9f, 0xfc, 0xae, 0x5f, 0x1f, 0x78, 0xac, 0x5f, 0x3f, 0x00, 0x50,\n\t0x6c, 0x7f, 0x00, 0xdc, 0x77, 0xff, 0xc0, 0x3f, 0x78, 0xff, 0x01, 0xf8, 0x7f, 0xff, 0x03, 0x9c, 0x78, 0xff, 0x07,\n\t0x8c, 0x7c, 0xff, 0x0f, 0xce, 0x78, 0xff, 0xff, 0xcf, 0x7f, 0xff, 0xff, 0xcf, 0x78, 0xff, 0xff, 0xdf, 0x78, 0xff,\n\t0xff, 0xdf, 0x7d, 0xff, 0xff, 0x3f, 0x7e, 0xff, 0xff, 0xff, 0x7f,\n];\n\nconst BYTES_PER_ROW = Math.ceil(WIDTH / 8);\nconst DISPLAY_HEIGHT = Math.ceil(HEIGHT / 2); // Half-block rendering\n\ntype Effect = \"typewriter\" | \"scanline\" | \"rain\" | \"fade\" | \"crt\" | \"glitch\" | \"dissolve\";\n\nconst EFFECTS: Effect[] = [\"typewriter\", \"scanline\", \"rain\", \"fade\", \"crt\", \"glitch\", \"dissolve\"];\n\n// Get pixel at (x, y): true = foreground, false = background\nfunction getPixel(x: number, y: number): boolean {\n\tif (y >= HEIGHT) return false;\n\tconst byteIndex = y * BYTES_PER_ROW + Math.floor(x / 8);\n\tconst bitIndex = x % 8;\n\treturn ((BITS[byteIndex] >> bitIndex) & 1) === 0;\n}\n\n// Get the character for a cell (2 vertical pixels packed)\nfunction getChar(x: number, row: number): string {\n\tconst upper = getPixel(x, row * 2);\n\tconst lower = getPixel(x, row * 2 + 1);\n\tif (upper && lower) return \"█\";\n\tif (upper) return \"▀\";\n\tif (lower) return \"▄\";\n\treturn \" \";\n}\n\n// Build the final image grid\nfunction buildFinalGrid(): string[][] {\n\tconst grid: string[][] = [];\n\tfor (let row = 0; row < DISPLAY_HEIGHT; row++) {\n\t\tconst line: string[] = [];\n\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\tline.push(getChar(x, row));\n\t\t}\n\t\tgrid.push(line);\n\t}\n\treturn grid;\n}\n\nexport class ArminComponent implements Component {\n\tprivate ui: TUI;\n\tprivate interval: ReturnType<typeof setInterval> | null = null;\n\tprivate effect: Effect;\n\tprivate finalGrid: string[][];\n\tprivate currentGrid: string[][];\n\tprivate effectState: Record<string, unknown> = {};\n\tprivate cachedLines: string[] = [];\n\tprivate cachedWidth = 0;\n\tprivate gridVersion = 0;\n\tprivate cachedVersion = -1;\n\n\tconstructor(ui: TUI) {\n\t\tthis.ui = ui;\n\t\tthis.effect = EFFECTS[Math.floor(Math.random() * EFFECTS.length)];\n\t\tthis.finalGrid = buildFinalGrid();\n\t\tthis.currentGrid = this.createEmptyGrid();\n\n\t\tthis.initEffect();\n\t\tthis.startAnimation();\n\t}\n\n\tinvalidate(): void {\n\t\tthis.cachedWidth = 0;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (width === this.cachedWidth && this.cachedVersion === this.gridVersion) {\n\t\t\treturn this.cachedLines;\n\t\t}\n\n\t\tconst padding = 1;\n\t\tconst availableWidth = width - padding;\n\n\t\tthis.cachedLines = this.currentGrid.map((row) => {\n\t\t\t// Clip row to available width before applying color\n\t\t\tconst clipped = row.slice(0, availableWidth).join(\"\");\n\t\t\tconst padRight = Math.max(0, width - padding - clipped.length);\n\t\t\treturn ` ${theme.fg(\"accent\", clipped)}${\" \".repeat(padRight)}`;\n\t\t});\n\n\t\t// Add \"ARMIN SAYS HI\" at the end\n\t\tconst message = \"ARMIN SAYS HI\";\n\t\tconst msgPadRight = Math.max(0, width - padding - message.length);\n\t\tthis.cachedLines.push(` ${theme.fg(\"accent\", message)}${\" \".repeat(msgPadRight)}`);\n\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedVersion = this.gridVersion;\n\n\t\treturn this.cachedLines;\n\t}\n\n\tprivate createEmptyGrid(): string[][] {\n\t\treturn Array.from({ length: DISPLAY_HEIGHT }, () => Array(WIDTH).fill(\" \"));\n\t}\n\n\tprivate initEffect(): void {\n\t\tswitch (this.effect) {\n\t\t\tcase \"typewriter\":\n\t\t\t\tthis.effectState = { pos: 0 };\n\t\t\t\tbreak;\n\t\t\tcase \"scanline\":\n\t\t\t\tthis.effectState = { row: 0 };\n\t\t\t\tbreak;\n\t\t\tcase \"rain\":\n\t\t\t\t// Track falling position for each column\n\t\t\t\tthis.effectState = {\n\t\t\t\t\tdrops: Array.from({ length: WIDTH }, () => ({\n\t\t\t\t\t\ty: -Math.floor(Math.random() * DISPLAY_HEIGHT * 2),\n\t\t\t\t\t\tsettled: 0,\n\t\t\t\t\t})),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase \"fade\": {\n\t\t\t\t// Shuffle all pixel positions\n\t\t\t\tconst positions: [number, number][] = [];\n\t\t\t\tfor (let row = 0; row < DISPLAY_HEIGHT; row++) {\n\t\t\t\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\t\t\t\tpositions.push([row, x]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Fisher-Yates shuffle\n\t\t\t\tfor (let i = positions.length - 1; i > 0; i--) {\n\t\t\t\t\tconst j = Math.floor(Math.random() * (i + 1));\n\t\t\t\t\t[positions[i], positions[j]] = [positions[j], positions[i]];\n\t\t\t\t}\n\t\t\t\tthis.effectState = { positions, idx: 0 };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"crt\":\n\t\t\t\tthis.effectState = { expansion: 0 };\n\t\t\t\tbreak;\n\t\t\tcase \"glitch\":\n\t\t\t\tthis.effectState = { phase: 0, glitchFrames: 8 };\n\t\t\t\tbreak;\n\t\t\tcase \"dissolve\": {\n\t\t\t\t// Start with random noise\n\t\t\t\tthis.currentGrid = Array.from({ length: DISPLAY_HEIGHT }, () =>\n\t\t\t\t\tArray.from({ length: WIDTH }, () => {\n\t\t\t\t\t\tconst chars = [\" \", \"░\", \"▒\", \"▓\", \"█\", \"▀\", \"▄\"];\n\t\t\t\t\t\treturn chars[Math.floor(Math.random() * chars.length)];\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\t// Shuffle positions for gradual resolve\n\t\t\t\tconst dissolvePositions: [number, number][] = [];\n\t\t\t\tfor (let row = 0; row < DISPLAY_HEIGHT; row++) {\n\t\t\t\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\t\t\t\tdissolvePositions.push([row, x]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let i = dissolvePositions.length - 1; i > 0; i--) {\n\t\t\t\t\tconst j = Math.floor(Math.random() * (i + 1));\n\t\t\t\t\t[dissolvePositions[i], dissolvePositions[j]] = [dissolvePositions[j], dissolvePositions[i]];\n\t\t\t\t}\n\t\t\t\tthis.effectState = { positions: dissolvePositions, idx: 0 };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate startAnimation(): void {\n\t\tconst fps = this.effect === \"glitch\" ? 60 : 30;\n\t\tthis.interval = setInterval(() => {\n\t\t\tconst done = this.tickEffect();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t\tif (done) {\n\t\t\t\tthis.stopAnimation();\n\t\t\t}\n\t\t}, 1000 / fps);\n\t}\n\n\tprivate stopAnimation(): void {\n\t\tif (this.interval) {\n\t\t\tclearInterval(this.interval);\n\t\t\tthis.interval = null;\n\t\t}\n\t}\n\n\tprivate tickEffect(): boolean {\n\t\tswitch (this.effect) {\n\t\t\tcase \"typewriter\":\n\t\t\t\treturn this.tickTypewriter();\n\t\t\tcase \"scanline\":\n\t\t\t\treturn this.tickScanline();\n\t\t\tcase \"rain\":\n\t\t\t\treturn this.tickRain();\n\t\t\tcase \"fade\":\n\t\t\t\treturn this.tickFade();\n\t\t\tcase \"crt\":\n\t\t\t\treturn this.tickCrt();\n\t\t\tcase \"glitch\":\n\t\t\t\treturn this.tickGlitch();\n\t\t\tcase \"dissolve\":\n\t\t\t\treturn this.tickDissolve();\n\t\t\tdefault:\n\t\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate tickTypewriter(): boolean {\n\t\tconst state = this.effectState as { pos: number };\n\t\tconst pixelsPerFrame = 3;\n\n\t\tfor (let i = 0; i < pixelsPerFrame; i++) {\n\t\t\tconst row = Math.floor(state.pos / WIDTH);\n\t\t\tconst x = state.pos % WIDTH;\n\t\t\tif (row >= DISPLAY_HEIGHT) return true;\n\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\tstate.pos++;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate tickScanline(): boolean {\n\t\tconst state = this.effectState as { row: number };\n\t\tif (state.row >= DISPLAY_HEIGHT) return true;\n\n\t\t// Copy row\n\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\tthis.currentGrid[state.row][x] = this.finalGrid[state.row][x];\n\t\t}\n\t\tstate.row++;\n\t\treturn false;\n\t}\n\n\tprivate tickRain(): boolean {\n\t\tconst state = this.effectState as {\n\t\t\tdrops: { y: number; settled: number }[];\n\t\t};\n\n\t\tlet allSettled = true;\n\t\tthis.currentGrid = this.createEmptyGrid();\n\n\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\tconst drop = state.drops[x];\n\n\t\t\t// Draw settled pixels\n\t\t\tfor (let row = DISPLAY_HEIGHT - 1; row >= DISPLAY_HEIGHT - drop.settled; row--) {\n\t\t\t\tif (row >= 0) {\n\t\t\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if this column is done\n\t\t\tif (drop.settled >= DISPLAY_HEIGHT) continue;\n\n\t\t\tallSettled = false;\n\n\t\t\t// Find the target row for this column (lowest non-space pixel)\n\t\t\tlet targetRow = -1;\n\t\t\tfor (let row = DISPLAY_HEIGHT - 1 - drop.settled; row >= 0; row--) {\n\t\t\t\tif (this.finalGrid[row][x] !== \" \") {\n\t\t\t\t\ttargetRow = row;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Move drop down\n\t\t\tdrop.y++;\n\n\t\t\t// Draw falling drop\n\t\t\tif (drop.y >= 0 && drop.y < DISPLAY_HEIGHT) {\n\t\t\t\tif (targetRow >= 0 && drop.y >= targetRow) {\n\t\t\t\t\t// Settle\n\t\t\t\t\tdrop.settled = DISPLAY_HEIGHT - targetRow;\n\t\t\t\t\tdrop.y = -Math.floor(Math.random() * 5) - 1;\n\t\t\t\t} else {\n\t\t\t\t\t// Still falling\n\t\t\t\t\tthis.currentGrid[drop.y][x] = \"▓\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn allSettled;\n\t}\n\n\tprivate tickFade(): boolean {\n\t\tconst state = this.effectState as { positions: [number, number][]; idx: number };\n\t\tconst pixelsPerFrame = 15;\n\n\t\tfor (let i = 0; i < pixelsPerFrame; i++) {\n\t\t\tif (state.idx >= state.positions.length) return true;\n\t\t\tconst [row, x] = state.positions[state.idx];\n\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\tstate.idx++;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate tickCrt(): boolean {\n\t\tconst state = this.effectState as { expansion: number };\n\t\tconst midRow = Math.floor(DISPLAY_HEIGHT / 2);\n\n\t\tthis.currentGrid = this.createEmptyGrid();\n\n\t\t// Draw from middle expanding outward\n\t\tconst top = midRow - state.expansion;\n\t\tconst bottom = midRow + state.expansion;\n\n\t\tfor (let row = Math.max(0, top); row <= Math.min(DISPLAY_HEIGHT - 1, bottom); row++) {\n\t\t\tfor (let x = 0; x < WIDTH; x++) {\n\t\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\t}\n\t\t}\n\n\t\tstate.expansion++;\n\t\treturn state.expansion > DISPLAY_HEIGHT;\n\t}\n\n\tprivate tickGlitch(): boolean {\n\t\tconst state = this.effectState as { phase: number; glitchFrames: number };\n\n\t\tif (state.phase < state.glitchFrames) {\n\t\t\t// Glitch phase: show corrupted version\n\t\t\tthis.currentGrid = this.finalGrid.map((row) => {\n\t\t\t\tconst offset = Math.floor(Math.random() * 7) - 3;\n\t\t\t\tconst glitchRow = [...row];\n\n\t\t\t\t// Random horizontal offset\n\t\t\t\tif (Math.random() < 0.3) {\n\t\t\t\t\tconst shifted = glitchRow.slice(offset).concat(glitchRow.slice(0, offset));\n\t\t\t\t\treturn shifted.slice(0, WIDTH);\n\t\t\t\t}\n\n\t\t\t\t// Random vertical swap\n\t\t\t\tif (Math.random() < 0.2) {\n\t\t\t\t\tconst swapRow = Math.floor(Math.random() * DISPLAY_HEIGHT);\n\t\t\t\t\treturn [...this.finalGrid[swapRow]];\n\t\t\t\t}\n\n\t\t\t\treturn glitchRow;\n\t\t\t});\n\t\t\tstate.phase++;\n\t\t\treturn false;\n\t\t}\n\n\t\t// Final frame: show clean image\n\t\tthis.currentGrid = this.finalGrid.map((row) => [...row]);\n\t\treturn true;\n\t}\n\n\tprivate tickDissolve(): boolean {\n\t\tconst state = this.effectState as { positions: [number, number][]; idx: number };\n\t\tconst pixelsPerFrame = 20;\n\n\t\tfor (let i = 0; i < pixelsPerFrame; i++) {\n\t\t\tif (state.idx >= state.positions.length) return true;\n\t\t\tconst [row, x] = state.positions[state.idx];\n\t\t\tthis.currentGrid[row][x] = this.finalGrid[row][x];\n\t\t\tstate.idx++;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tthis.gridVersion++;\n\t}\n\n\tdispose(): void {\n\t\tthis.stopAnimation();\n\t}\n}\n"]}
@@ -1,20 +0,0 @@
1
- import type { AssistantMessage } from "@eminent337/aery-ai";
2
- import { Container, type MarkdownTheme } from "@eminent337/aery-tui";
3
- /**
4
- * Component that renders a complete assistant message
5
- */
6
- export declare class AssistantMessageComponent extends Container {
7
- private contentContainer;
8
- private hideThinkingBlock;
9
- private markdownTheme;
10
- private hiddenThinkingLabel;
11
- private lastMessage?;
12
- private hasToolCalls;
13
- constructor(message?: AssistantMessage, hideThinkingBlock?: boolean, markdownTheme?: MarkdownTheme, hiddenThinkingLabel?: string);
14
- invalidate(): void;
15
- setHideThinkingBlock(hide: boolean): void;
16
- setHiddenThinkingLabel(label: string): void;
17
- render(width: number): string[];
18
- updateContent(message: AssistantMessage): void;
19
- }
20
- //# sourceMappingURL=assistant-message.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistant-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAY,KAAK,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AAO7F;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACvD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,YAAY,CAAS;IAE7B,YACC,OAAO,CAAC,EAAE,gBAAgB,EAC1B,iBAAiB,UAAQ,EACzB,aAAa,GAAE,aAAkC,EACjD,mBAAmB,SAAgB,EAenC;IAEQ,UAAU,IAAI,IAAI,CAK1B;IAED,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAKxC;IAED,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAK1C;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASvC;IAED,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAyE7C;CACD","sourcesContent":["import type { AssistantMessage } from \"@eminent337/aery-ai\";\nimport { Container, Markdown, type MarkdownTheme, Spacer, Text } from \"@eminent337/aery-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\nconst OSC133_ZONE_FINAL = \"\\x1b]133;C\\x07\";\n\n/**\n * Component that renders a complete assistant message\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate hiddenThinkingLabel: string;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate hasToolCalls = false;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\thiddenThinkingLabel = \"Thinking...\",\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.hiddenThinkingLabel = hiddenThinkingLabel;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\tsetHiddenThinkingLabel(label: string): void {\n\t\tthis.hiddenThinkingLabel = label;\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines = super.render(width);\n\t\tif (this.hasToolCalls || lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n\t\treturn lines;\n\t}\n\n\tupdateContent(message: AssistantMessage): void {\n\t\tthis.lastMessage = message;\n\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\n\t\tconst hasVisibleContent = message.content.some(\n\t\t\t(c) => (c.type === \"text\" && c.text.trim()) || (c.type === \"thinking\" && c.thinking.trim()),\n\t\t);\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tthis.contentContainer.addChild(new Markdown(content.text.trim(), 1, 0, this.markdownTheme));\n\t\t\t} else if (content.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content\n\t\t\t\t\t.slice(i + 1)\n\t\t\t\t\t.some((c) => (c.type === \"text\" && c.text.trim()) || (c.type === \"thinking\" && c.thinking.trim()));\n\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Show static thinking label when hidden\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Text(theme.italic(theme.fg(\"thinkingText\", this.hiddenThinkingLabel)), 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Thinking traces in thinkingText color, italic\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Markdown(content.thinking.trim(), 1, 0, this.markdownTheme, {\n\t\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\t\titalic: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if aborted - show after partial content\n\t\t// But only if there are no tool calls (tool execution components will show the error)\n\t\tconst hasToolCalls = message.content.some((c) => c.type === \"toolCall\");\n\t\tthis.hasToolCalls = hasToolCalls;\n\t\tif (!hasToolCalls) {\n\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\tconst abortMessage =\n\t\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\tif (hasVisibleContent) {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t} else {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t}\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", abortMessage), 1, 0));\n\t\t\t} else if (message.stopReason === \"error\") {\n\t\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", `Error: ${errorMsg}`), 1, 0));\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1,121 +0,0 @@
1
- import { Container, Markdown, Spacer, Text } from "@eminent337/aery-tui";
2
- import { getMarkdownTheme, theme } from "../theme/theme.js";
3
- const OSC133_ZONE_START = "\x1b]133;A\x07";
4
- const OSC133_ZONE_END = "\x1b]133;B\x07";
5
- const OSC133_ZONE_FINAL = "\x1b]133;C\x07";
6
- /**
7
- * Component that renders a complete assistant message
8
- */
9
- export class AssistantMessageComponent extends Container {
10
- contentContainer;
11
- hideThinkingBlock;
12
- markdownTheme;
13
- hiddenThinkingLabel;
14
- lastMessage;
15
- hasToolCalls = false;
16
- constructor(message, hideThinkingBlock = false, markdownTheme = getMarkdownTheme(), hiddenThinkingLabel = "Thinking...") {
17
- super();
18
- this.hideThinkingBlock = hideThinkingBlock;
19
- this.markdownTheme = markdownTheme;
20
- this.hiddenThinkingLabel = hiddenThinkingLabel;
21
- // Container for text/thinking content
22
- this.contentContainer = new Container();
23
- this.addChild(this.contentContainer);
24
- if (message) {
25
- this.updateContent(message);
26
- }
27
- }
28
- invalidate() {
29
- super.invalidate();
30
- if (this.lastMessage) {
31
- this.updateContent(this.lastMessage);
32
- }
33
- }
34
- setHideThinkingBlock(hide) {
35
- this.hideThinkingBlock = hide;
36
- if (this.lastMessage) {
37
- this.updateContent(this.lastMessage);
38
- }
39
- }
40
- setHiddenThinkingLabel(label) {
41
- this.hiddenThinkingLabel = label;
42
- if (this.lastMessage) {
43
- this.updateContent(this.lastMessage);
44
- }
45
- }
46
- render(width) {
47
- const lines = super.render(width);
48
- if (this.hasToolCalls || lines.length === 0) {
49
- return lines;
50
- }
51
- lines[0] = OSC133_ZONE_START + lines[0];
52
- lines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];
53
- return lines;
54
- }
55
- updateContent(message) {
56
- this.lastMessage = message;
57
- // Clear content container
58
- this.contentContainer.clear();
59
- const hasVisibleContent = message.content.some((c) => (c.type === "text" && c.text.trim()) || (c.type === "thinking" && c.thinking.trim()));
60
- if (hasVisibleContent) {
61
- this.contentContainer.addChild(new Spacer(1));
62
- }
63
- // Render content in order
64
- for (let i = 0; i < message.content.length; i++) {
65
- const content = message.content[i];
66
- if (content.type === "text" && content.text.trim()) {
67
- // Assistant text messages with no background - trim the text
68
- // Set paddingY=0 to avoid extra spacing before tool executions
69
- this.contentContainer.addChild(new Markdown(content.text.trim(), 1, 0, this.markdownTheme));
70
- }
71
- else if (content.type === "thinking" && content.thinking.trim()) {
72
- // Add spacing only when another visible assistant content block follows.
73
- // This avoids a superfluous blank line before separately-rendered tool execution blocks.
74
- const hasVisibleContentAfter = message.content
75
- .slice(i + 1)
76
- .some((c) => (c.type === "text" && c.text.trim()) || (c.type === "thinking" && c.thinking.trim()));
77
- if (this.hideThinkingBlock) {
78
- // Show static thinking label when hidden
79
- this.contentContainer.addChild(new Text(theme.italic(theme.fg("thinkingText", this.hiddenThinkingLabel)), 1, 0));
80
- if (hasVisibleContentAfter) {
81
- this.contentContainer.addChild(new Spacer(1));
82
- }
83
- }
84
- else {
85
- // Thinking traces in thinkingText color, italic
86
- this.contentContainer.addChild(new Markdown(content.thinking.trim(), 1, 0, this.markdownTheme, {
87
- color: (text) => theme.fg("thinkingText", text),
88
- italic: true,
89
- }));
90
- if (hasVisibleContentAfter) {
91
- this.contentContainer.addChild(new Spacer(1));
92
- }
93
- }
94
- }
95
- }
96
- // Check if aborted - show after partial content
97
- // But only if there are no tool calls (tool execution components will show the error)
98
- const hasToolCalls = message.content.some((c) => c.type === "toolCall");
99
- this.hasToolCalls = hasToolCalls;
100
- if (!hasToolCalls) {
101
- if (message.stopReason === "aborted") {
102
- const abortMessage = message.errorMessage && message.errorMessage !== "Request was aborted"
103
- ? message.errorMessage
104
- : "Operation aborted";
105
- if (hasVisibleContent) {
106
- this.contentContainer.addChild(new Spacer(1));
107
- }
108
- else {
109
- this.contentContainer.addChild(new Spacer(1));
110
- }
111
- this.contentContainer.addChild(new Text(theme.fg("error", abortMessage), 1, 0));
112
- }
113
- else if (message.stopReason === "error") {
114
- const errorMsg = message.errorMessage || "Unknown error";
115
- this.contentContainer.addChild(new Spacer(1));
116
- this.contentContainer.addChild(new Text(theme.fg("error", `Error: ${errorMsg}`), 1, 0));
117
- }
118
- }
119
- }
120
- }
121
- //# sourceMappingURL=assistant-message.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@eminent337/aery-ai\";\nimport { Container, Markdown, type MarkdownTheme, Spacer, Text } from \"@eminent337/aery-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\nconst OSC133_ZONE_FINAL = \"\\x1b]133;C\\x07\";\n\n/**\n * Component that renders a complete assistant message\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate hiddenThinkingLabel: string;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate hasToolCalls = false;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\thiddenThinkingLabel = \"Thinking...\",\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.hiddenThinkingLabel = hiddenThinkingLabel;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\tsetHiddenThinkingLabel(label: string): void {\n\t\tthis.hiddenThinkingLabel = label;\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines = super.render(width);\n\t\tif (this.hasToolCalls || lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = OSC133_ZONE_END + OSC133_ZONE_FINAL + lines[lines.length - 1];\n\t\treturn lines;\n\t}\n\n\tupdateContent(message: AssistantMessage): void {\n\t\tthis.lastMessage = message;\n\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\n\t\tconst hasVisibleContent = message.content.some(\n\t\t\t(c) => (c.type === \"text\" && c.text.trim()) || (c.type === \"thinking\" && c.thinking.trim()),\n\t\t);\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tthis.contentContainer.addChild(new Markdown(content.text.trim(), 1, 0, this.markdownTheme));\n\t\t\t} else if (content.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content\n\t\t\t\t\t.slice(i + 1)\n\t\t\t\t\t.some((c) => (c.type === \"text\" && c.text.trim()) || (c.type === \"thinking\" && c.thinking.trim()));\n\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Show static thinking label when hidden\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Text(theme.italic(theme.fg(\"thinkingText\", this.hiddenThinkingLabel)), 1, 0),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Thinking traces in thinkingText color, italic\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Markdown(content.thinking.trim(), 1, 0, this.markdownTheme, {\n\t\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\t\titalic: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if aborted - show after partial content\n\t\t// But only if there are no tool calls (tool execution components will show the error)\n\t\tconst hasToolCalls = message.content.some((c) => c.type === \"toolCall\");\n\t\tthis.hasToolCalls = hasToolCalls;\n\t\tif (!hasToolCalls) {\n\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\tconst abortMessage =\n\t\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\tif (hasVisibleContent) {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t} else {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t}\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", abortMessage), 1, 0));\n\t\t\t} else if (message.stopReason === \"error\") {\n\t\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", `Error: ${errorMsg}`), 1, 0));\n\t\t\t}\n\t\t}\n\t}\n}\n"]}