@eminent337/aery 0.1.63 → 0.1.65

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 (626) hide show
  1. package/docs/custom-provider.md +1 -1
  2. package/docs/extensions.md +18 -18
  3. package/docs/index.md +5 -5
  4. package/docs/json.md +1 -1
  5. package/docs/keybindings.md +2 -2
  6. package/docs/models.md +2 -2
  7. package/docs/packages.md +13 -13
  8. package/docs/providers.md +5 -5
  9. package/docs/quickstart.md +19 -19
  10. package/docs/rpc.md +3 -3
  11. package/docs/sdk.md +1 -1
  12. package/docs/session-format.md +3 -3
  13. package/docs/sessions.md +10 -10
  14. package/docs/settings.md +4 -4
  15. package/docs/skills.md +2 -2
  16. package/docs/terminal-setup.md +6 -6
  17. package/docs/termux.md +3 -3
  18. package/docs/themes.md +3 -3
  19. package/docs/tmux.md +1 -1
  20. package/docs/tui.md +2 -2
  21. package/docs/usage.md +33 -33
  22. package/examples/extensions/README.md +3 -3
  23. package/examples/extensions/antigravity-image-gen.ts +6 -6
  24. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  25. package/examples/extensions/bash-spawn-hook.ts +1 -1
  26. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  27. package/examples/extensions/claude-rules.ts +1 -1
  28. package/examples/extensions/commands.ts +1 -1
  29. package/examples/extensions/custom-compaction.ts +1 -1
  30. package/examples/extensions/custom-header.ts +2 -2
  31. package/examples/extensions/custom-provider-anthropic/index.ts +2 -2
  32. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  33. package/examples/extensions/custom-provider-qwen-cli/index.ts +1 -1
  34. package/examples/extensions/doom-overlay/README.md +2 -2
  35. package/examples/extensions/doom-overlay/doom/build.sh +2 -2
  36. package/examples/extensions/doom-overlay/index.ts +1 -1
  37. package/examples/extensions/hidden-thinking-label.ts +1 -1
  38. package/examples/extensions/inline-bash.ts +2 -2
  39. package/examples/extensions/input-transform.ts +3 -3
  40. package/examples/extensions/interactive-shell.ts +1 -1
  41. package/examples/extensions/mac-system-theme.ts +2 -2
  42. package/examples/extensions/minimal-mode.ts +1 -1
  43. package/examples/extensions/modal-editor.ts +1 -1
  44. package/examples/extensions/model-status.ts +1 -1
  45. package/examples/extensions/overlay-qa-tests.ts +1 -1
  46. package/examples/extensions/overlay-test.ts +1 -1
  47. package/examples/extensions/pirate.ts +1 -1
  48. package/examples/extensions/preset.ts +12 -6
  49. package/examples/extensions/prompt-customizer.ts +1 -1
  50. package/examples/extensions/provider-payload.ts +1 -1
  51. package/examples/extensions/rainbow-editor.ts +1 -1
  52. package/examples/extensions/rpc-demo.ts +1 -1
  53. package/examples/extensions/sandbox/index.ts +8 -8
  54. package/examples/extensions/shutdown-command.ts +5 -5
  55. package/examples/extensions/ssh.ts +2 -2
  56. package/examples/extensions/subagent/README.md +13 -13
  57. package/examples/extensions/subagent/agents.ts +1 -1
  58. package/examples/extensions/subagent/index.ts +5 -5
  59. package/examples/extensions/titlebar-spinner.ts +1 -1
  60. package/examples/extensions/tool-override.ts +2 -2
  61. package/examples/extensions/tools.ts +1 -1
  62. package/examples/extensions/truncated-tool.ts +1 -1
  63. package/examples/extensions/working-indicator.ts +4 -4
  64. package/examples/extensions/working-message-test.ts +1 -1
  65. package/examples/sdk/01-minimal.ts +1 -1
  66. package/examples/sdk/03-custom-prompt.ts +1 -1
  67. package/examples/sdk/04-skills.ts +1 -1
  68. package/examples/sdk/06-extensions.ts +2 -2
  69. package/examples/sdk/08-prompt-templates.ts +1 -1
  70. package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
  71. package/examples/sdk/README.md +1 -1
  72. package/package.json +3 -3
  73. package/dist/bun/cli.d.ts +0 -3
  74. package/dist/bun/cli.d.ts.map +0 -1
  75. package/dist/bun/cli.js +0 -8
  76. package/dist/bun/cli.js.map +0 -1
  77. package/dist/bun/register-bedrock.d.ts +0 -2
  78. package/dist/bun/register-bedrock.d.ts.map +0 -1
  79. package/dist/bun/register-bedrock.js +0 -4
  80. package/dist/bun/register-bedrock.js.map +0 -1
  81. package/dist/bun/restore-sandbox-env.d.ts +0 -13
  82. package/dist/bun/restore-sandbox-env.d.ts.map +0 -1
  83. package/dist/bun/restore-sandbox-env.js +0 -32
  84. package/dist/bun/restore-sandbox-env.js.map +0 -1
  85. package/dist/cli/args.d.ts +0 -53
  86. package/dist/cli/args.d.ts.map +0 -1
  87. package/dist/cli/args.js +0 -329
  88. package/dist/cli/args.js.map +0 -1
  89. package/dist/cli/config-selector.d.ts +0 -14
  90. package/dist/cli/config-selector.d.ts.map +0 -1
  91. package/dist/cli/config-selector.js +0 -31
  92. package/dist/cli/config-selector.js.map +0 -1
  93. package/dist/cli/file-processor.d.ts +0 -15
  94. package/dist/cli/file-processor.d.ts.map +0 -1
  95. package/dist/cli/file-processor.js +0 -83
  96. package/dist/cli/file-processor.js.map +0 -1
  97. package/dist/cli/initial-message.d.ts +0 -18
  98. package/dist/cli/initial-message.d.ts.map +0 -1
  99. package/dist/cli/initial-message.js +0 -22
  100. package/dist/cli/initial-message.js.map +0 -1
  101. package/dist/cli/list-models.d.ts +0 -9
  102. package/dist/cli/list-models.d.ts.map +0 -1
  103. package/dist/cli/list-models.js +0 -98
  104. package/dist/cli/list-models.js.map +0 -1
  105. package/dist/cli/session-picker.d.ts +0 -9
  106. package/dist/cli/session-picker.d.ts.map +0 -1
  107. package/dist/cli/session-picker.js +0 -35
  108. package/dist/cli/session-picker.js.map +0 -1
  109. package/dist/cli.d.ts +0 -3
  110. package/dist/cli.d.ts.map +0 -1
  111. package/dist/cli.js +0 -19
  112. package/dist/cli.js.map +0 -1
  113. package/dist/config.d.ts +0 -86
  114. package/dist/config.d.ts.map +0 -1
  115. package/dist/config.js +0 -332
  116. package/dist/config.js.map +0 -1
  117. package/dist/core/agent-session-runtime.d.ts +0 -117
  118. package/dist/core/agent-session-runtime.d.ts.map +0 -1
  119. package/dist/core/agent-session-runtime.js +0 -300
  120. package/dist/core/agent-session-runtime.js.map +0 -1
  121. package/dist/core/agent-session-services.d.ts +0 -86
  122. package/dist/core/agent-session-services.d.ts.map +0 -1
  123. package/dist/core/agent-session-services.js +0 -117
  124. package/dist/core/agent-session-services.js.map +0 -1
  125. package/dist/core/agent-session.d.ts +0 -595
  126. package/dist/core/agent-session.d.ts.map +0 -1
  127. package/dist/core/agent-session.js +0 -2520
  128. package/dist/core/agent-session.js.map +0 -1
  129. package/dist/core/auth-guidance.d.ts +0 -5
  130. package/dist/core/auth-guidance.d.ts.map +0 -1
  131. package/dist/core/auth-guidance.js +0 -21
  132. package/dist/core/auth-guidance.js.map +0 -1
  133. package/dist/core/auth-storage.d.ts +0 -141
  134. package/dist/core/auth-storage.d.ts.map +0 -1
  135. package/dist/core/auth-storage.js +0 -441
  136. package/dist/core/auth-storage.js.map +0 -1
  137. package/dist/core/bash-executor.d.ts +0 -32
  138. package/dist/core/bash-executor.d.ts.map +0 -1
  139. package/dist/core/bash-executor.js +0 -111
  140. package/dist/core/bash-executor.js.map +0 -1
  141. package/dist/core/compaction/branch-summarization.d.ts +0 -88
  142. package/dist/core/compaction/branch-summarization.d.ts.map +0 -1
  143. package/dist/core/compaction/branch-summarization.js +0 -243
  144. package/dist/core/compaction/branch-summarization.js.map +0 -1
  145. package/dist/core/compaction/compaction.d.ts +0 -121
  146. package/dist/core/compaction/compaction.d.ts.map +0 -1
  147. package/dist/core/compaction/compaction.js +0 -615
  148. package/dist/core/compaction/compaction.js.map +0 -1
  149. package/dist/core/compaction/index.d.ts +0 -7
  150. package/dist/core/compaction/index.d.ts.map +0 -1
  151. package/dist/core/compaction/index.js +0 -7
  152. package/dist/core/compaction/index.js.map +0 -1
  153. package/dist/core/compaction/utils.d.ts +0 -38
  154. package/dist/core/compaction/utils.d.ts.map +0 -1
  155. package/dist/core/compaction/utils.js +0 -153
  156. package/dist/core/compaction/utils.js.map +0 -1
  157. package/dist/core/defaults.d.ts +0 -3
  158. package/dist/core/defaults.d.ts.map +0 -1
  159. package/dist/core/defaults.js +0 -2
  160. package/dist/core/defaults.js.map +0 -1
  161. package/dist/core/diagnostics.d.ts +0 -15
  162. package/dist/core/diagnostics.d.ts.map +0 -1
  163. package/dist/core/diagnostics.js +0 -2
  164. package/dist/core/diagnostics.js.map +0 -1
  165. package/dist/core/event-bus.d.ts +0 -9
  166. package/dist/core/event-bus.d.ts.map +0 -1
  167. package/dist/core/event-bus.js +0 -25
  168. package/dist/core/event-bus.js.map +0 -1
  169. package/dist/core/exec.d.ts +0 -29
  170. package/dist/core/exec.d.ts.map +0 -1
  171. package/dist/core/exec.js +0 -75
  172. package/dist/core/exec.js.map +0 -1
  173. package/dist/core/export-html/ansi-to-html.d.ts +0 -22
  174. package/dist/core/export-html/ansi-to-html.d.ts.map +0 -1
  175. package/dist/core/export-html/ansi-to-html.js +0 -249
  176. package/dist/core/export-html/ansi-to-html.js.map +0 -1
  177. package/dist/core/export-html/index.d.ts +0 -37
  178. package/dist/core/export-html/index.d.ts.map +0 -1
  179. package/dist/core/export-html/index.js +0 -224
  180. package/dist/core/export-html/index.js.map +0 -1
  181. package/dist/core/export-html/template.css +0 -1022
  182. package/dist/core/export-html/template.html +0 -55
  183. package/dist/core/export-html/template.js +0 -1770
  184. package/dist/core/export-html/tool-renderer.d.ts +0 -34
  185. package/dist/core/export-html/tool-renderer.d.ts.map +0 -1
  186. package/dist/core/export-html/tool-renderer.js +0 -108
  187. package/dist/core/export-html/tool-renderer.js.map +0 -1
  188. package/dist/core/export-html/vendor/highlight.min.js +0 -1213
  189. package/dist/core/export-html/vendor/marked.min.js +0 -6
  190. package/dist/core/extensions/index.d.ts +0 -12
  191. package/dist/core/extensions/index.d.ts.map +0 -1
  192. package/dist/core/extensions/index.js +0 -9
  193. package/dist/core/extensions/index.js.map +0 -1
  194. package/dist/core/extensions/loader.d.ts +0 -25
  195. package/dist/core/extensions/loader.d.ts.map +0 -1
  196. package/dist/core/extensions/loader.js +0 -476
  197. package/dist/core/extensions/loader.js.map +0 -1
  198. package/dist/core/extensions/runner.d.ts +0 -158
  199. package/dist/core/extensions/runner.d.ts.map +0 -1
  200. package/dist/core/extensions/runner.js +0 -784
  201. package/dist/core/extensions/runner.js.map +0 -1
  202. package/dist/core/extensions/types.d.ts +0 -1153
  203. package/dist/core/extensions/types.d.ts.map +0 -1
  204. package/dist/core/extensions/types.js +0 -45
  205. package/dist/core/extensions/types.js.map +0 -1
  206. package/dist/core/extensions/wrapper.d.ts +0 -20
  207. package/dist/core/extensions/wrapper.d.ts.map +0 -1
  208. package/dist/core/extensions/wrapper.js +0 -22
  209. package/dist/core/extensions/wrapper.js.map +0 -1
  210. package/dist/core/footer-data-provider.d.ts +0 -52
  211. package/dist/core/footer-data-provider.d.ts.map +0 -1
  212. package/dist/core/footer-data-provider.js +0 -310
  213. package/dist/core/footer-data-provider.js.map +0 -1
  214. package/dist/core/index.d.ts +0 -12
  215. package/dist/core/index.d.ts.map +0 -1
  216. package/dist/core/index.js +0 -12
  217. package/dist/core/index.js.map +0 -1
  218. package/dist/core/keybindings.d.ts +0 -353
  219. package/dist/core/keybindings.d.ts.map +0 -1
  220. package/dist/core/keybindings.js +0 -295
  221. package/dist/core/keybindings.js.map +0 -1
  222. package/dist/core/messages.d.ts +0 -77
  223. package/dist/core/messages.d.ts.map +0 -1
  224. package/dist/core/messages.js +0 -123
  225. package/dist/core/messages.js.map +0 -1
  226. package/dist/core/model-registry.d.ts +0 -144
  227. package/dist/core/model-registry.d.ts.map +0 -1
  228. package/dist/core/model-registry.js +0 -699
  229. package/dist/core/model-registry.js.map +0 -1
  230. package/dist/core/model-resolver.d.ts +0 -110
  231. package/dist/core/model-resolver.d.ts.map +0 -1
  232. package/dist/core/model-resolver.js +0 -489
  233. package/dist/core/model-resolver.js.map +0 -1
  234. package/dist/core/output-guard.d.ts +0 -6
  235. package/dist/core/output-guard.d.ts.map +0 -1
  236. package/dist/core/output-guard.js +0 -59
  237. package/dist/core/output-guard.js.map +0 -1
  238. package/dist/core/package-manager.d.ts +0 -199
  239. package/dist/core/package-manager.d.ts.map +0 -1
  240. package/dist/core/package-manager.js +0 -1974
  241. package/dist/core/package-manager.js.map +0 -1
  242. package/dist/core/prompt-templates.d.ts +0 -52
  243. package/dist/core/prompt-templates.d.ts.map +0 -1
  244. package/dist/core/prompt-templates.js +0 -250
  245. package/dist/core/prompt-templates.js.map +0 -1
  246. package/dist/core/resolve-config-value.d.ts +0 -23
  247. package/dist/core/resolve-config-value.d.ts.map +0 -1
  248. package/dist/core/resolve-config-value.js +0 -126
  249. package/dist/core/resolve-config-value.js.map +0 -1
  250. package/dist/core/resource-loader.d.ts +0 -194
  251. package/dist/core/resource-loader.d.ts.map +0 -1
  252. package/dist/core/resource-loader.js +0 -727
  253. package/dist/core/resource-loader.js.map +0 -1
  254. package/dist/core/sdk.d.ts +0 -107
  255. package/dist/core/sdk.d.ts.map +0 -1
  256. package/dist/core/sdk.js +0 -274
  257. package/dist/core/sdk.js.map +0 -1
  258. package/dist/core/session-cwd.d.ts +0 -19
  259. package/dist/core/session-cwd.d.ts.map +0 -1
  260. package/dist/core/session-cwd.js +0 -38
  261. package/dist/core/session-cwd.js.map +0 -1
  262. package/dist/core/session-manager.d.ts +0 -333
  263. package/dist/core/session-manager.d.ts.map +0 -1
  264. package/dist/core/session-manager.js +0 -1109
  265. package/dist/core/session-manager.js.map +0 -1
  266. package/dist/core/settings-manager.d.ts +0 -261
  267. package/dist/core/settings-manager.d.ts.map +0 -1
  268. package/dist/core/settings-manager.js +0 -782
  269. package/dist/core/settings-manager.js.map +0 -1
  270. package/dist/core/skills.d.ts +0 -60
  271. package/dist/core/skills.d.ts.map +0 -1
  272. package/dist/core/skills.js +0 -404
  273. package/dist/core/skills.js.map +0 -1
  274. package/dist/core/slash-commands.d.ts +0 -14
  275. package/dist/core/slash-commands.d.ts.map +0 -1
  276. package/dist/core/slash-commands.js +0 -25
  277. package/dist/core/slash-commands.js.map +0 -1
  278. package/dist/core/source-info.d.ts +0 -18
  279. package/dist/core/source-info.d.ts.map +0 -1
  280. package/dist/core/source-info.js +0 -19
  281. package/dist/core/source-info.js.map +0 -1
  282. package/dist/core/system-prompt.d.ts +0 -28
  283. package/dist/core/system-prompt.d.ts.map +0 -1
  284. package/dist/core/system-prompt.js +0 -120
  285. package/dist/core/system-prompt.js.map +0 -1
  286. package/dist/core/telemetry.d.ts +0 -3
  287. package/dist/core/telemetry.d.ts.map +0 -1
  288. package/dist/core/telemetry.js +0 -9
  289. package/dist/core/telemetry.js.map +0 -1
  290. package/dist/core/timings.d.ts +0 -8
  291. package/dist/core/timings.d.ts.map +0 -1
  292. package/dist/core/timings.js +0 -31
  293. package/dist/core/timings.js.map +0 -1
  294. package/dist/core/tools/bash.d.ts +0 -68
  295. package/dist/core/tools/bash.d.ts.map +0 -1
  296. package/dist/core/tools/bash.js +0 -355
  297. package/dist/core/tools/bash.js.map +0 -1
  298. package/dist/core/tools/edit-diff.d.ts +0 -85
  299. package/dist/core/tools/edit-diff.d.ts.map +0 -1
  300. package/dist/core/tools/edit-diff.js +0 -338
  301. package/dist/core/tools/edit-diff.js.map +0 -1
  302. package/dist/core/tools/edit.d.ts +0 -49
  303. package/dist/core/tools/edit.d.ts.map +0 -1
  304. package/dist/core/tools/edit.js +0 -324
  305. package/dist/core/tools/edit.js.map +0 -1
  306. package/dist/core/tools/file-mutation-queue.d.ts +0 -6
  307. package/dist/core/tools/file-mutation-queue.d.ts.map +0 -1
  308. package/dist/core/tools/file-mutation-queue.js +0 -37
  309. package/dist/core/tools/file-mutation-queue.js.map +0 -1
  310. package/dist/core/tools/find.d.ts +0 -35
  311. package/dist/core/tools/find.d.ts.map +0 -1
  312. package/dist/core/tools/find.js +0 -298
  313. package/dist/core/tools/find.js.map +0 -1
  314. package/dist/core/tools/grep.d.ts +0 -37
  315. package/dist/core/tools/grep.d.ts.map +0 -1
  316. package/dist/core/tools/grep.js +0 -304
  317. package/dist/core/tools/grep.js.map +0 -1
  318. package/dist/core/tools/index.d.ts +0 -40
  319. package/dist/core/tools/index.d.ts.map +0 -1
  320. package/dist/core/tools/index.js +0 -112
  321. package/dist/core/tools/index.js.map +0 -1
  322. package/dist/core/tools/ls.d.ts +0 -37
  323. package/dist/core/tools/ls.d.ts.map +0 -1
  324. package/dist/core/tools/ls.js +0 -169
  325. package/dist/core/tools/ls.js.map +0 -1
  326. package/dist/core/tools/path-utils.d.ts +0 -8
  327. package/dist/core/tools/path-utils.d.ts.map +0 -1
  328. package/dist/core/tools/path-utils.js +0 -81
  329. package/dist/core/tools/path-utils.js.map +0 -1
  330. package/dist/core/tools/read.d.ts +0 -35
  331. package/dist/core/tools/read.d.ts.map +0 -1
  332. package/dist/core/tools/read.js +0 -232
  333. package/dist/core/tools/read.js.map +0 -1
  334. package/dist/core/tools/render-utils.d.ts +0 -21
  335. package/dist/core/tools/render-utils.d.ts.map +0 -1
  336. package/dist/core/tools/render-utils.js +0 -49
  337. package/dist/core/tools/render-utils.js.map +0 -1
  338. package/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  339. package/dist/core/tools/tool-definition-wrapper.d.ts.map +0 -1
  340. package/dist/core/tools/tool-definition-wrapper.js +0 -34
  341. package/dist/core/tools/tool-definition-wrapper.js.map +0 -1
  342. package/dist/core/tools/truncate.d.ts +0 -70
  343. package/dist/core/tools/truncate.d.ts.map +0 -1
  344. package/dist/core/tools/truncate.js +0 -205
  345. package/dist/core/tools/truncate.js.map +0 -1
  346. package/dist/core/tools/write.d.ts +0 -26
  347. package/dist/core/tools/write.d.ts.map +0 -1
  348. package/dist/core/tools/write.js +0 -213
  349. package/dist/core/tools/write.js.map +0 -1
  350. package/dist/index.d.ts +0 -28
  351. package/dist/index.d.ts.map +0 -1
  352. package/dist/index.js +0 -41
  353. package/dist/index.js.map +0 -1
  354. package/dist/main.d.ts +0 -12
  355. package/dist/main.d.ts.map +0 -1
  356. package/dist/main.js +0 -589
  357. package/dist/main.js.map +0 -1
  358. package/dist/migrations.d.ts +0 -33
  359. package/dist/migrations.d.ts.map +0 -1
  360. package/dist/migrations.js +0 -281
  361. package/dist/migrations.js.map +0 -1
  362. package/dist/modes/index.d.ts +0 -9
  363. package/dist/modes/index.d.ts.map +0 -1
  364. package/dist/modes/index.js +0 -8
  365. package/dist/modes/index.js.map +0 -1
  366. package/dist/modes/interactive/assets/clankolas.png +0 -0
  367. package/dist/modes/interactive/components/armin.d.ts +0 -34
  368. package/dist/modes/interactive/components/armin.d.ts.map +0 -1
  369. package/dist/modes/interactive/components/armin.js +0 -333
  370. package/dist/modes/interactive/components/armin.js.map +0 -1
  371. package/dist/modes/interactive/components/assistant-message.d.ts +0 -20
  372. package/dist/modes/interactive/components/assistant-message.d.ts.map +0 -1
  373. package/dist/modes/interactive/components/assistant-message.js +0 -121
  374. package/dist/modes/interactive/components/assistant-message.js.map +0 -1
  375. package/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  376. package/dist/modes/interactive/components/bash-execution.d.ts.map +0 -1
  377. package/dist/modes/interactive/components/bash-execution.js +0 -175
  378. package/dist/modes/interactive/components/bash-execution.js.map +0 -1
  379. package/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  380. package/dist/modes/interactive/components/bordered-loader.d.ts.map +0 -1
  381. package/dist/modes/interactive/components/bordered-loader.js +0 -54
  382. package/dist/modes/interactive/components/bordered-loader.js.map +0 -1
  383. package/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  384. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +0 -1
  385. package/dist/modes/interactive/components/branch-summary-message.js +0 -44
  386. package/dist/modes/interactive/components/branch-summary-message.js.map +0 -1
  387. package/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  388. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
  389. package/dist/modes/interactive/components/compaction-summary-message.js +0 -45
  390. package/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
  391. package/dist/modes/interactive/components/config-selector.d.ts +0 -71
  392. package/dist/modes/interactive/components/config-selector.d.ts.map +0 -1
  393. package/dist/modes/interactive/components/config-selector.js +0 -481
  394. package/dist/modes/interactive/components/config-selector.js.map +0 -1
  395. package/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  396. package/dist/modes/interactive/components/countdown-timer.d.ts.map +0 -1
  397. package/dist/modes/interactive/components/countdown-timer.js +0 -33
  398. package/dist/modes/interactive/components/countdown-timer.js.map +0 -1
  399. package/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  400. package/dist/modes/interactive/components/custom-editor.d.ts.map +0 -1
  401. package/dist/modes/interactive/components/custom-editor.js +0 -70
  402. package/dist/modes/interactive/components/custom-editor.js.map +0 -1
  403. package/dist/modes/interactive/components/custom-message.d.ts +0 -20
  404. package/dist/modes/interactive/components/custom-message.d.ts.map +0 -1
  405. package/dist/modes/interactive/components/custom-message.js +0 -79
  406. package/dist/modes/interactive/components/custom-message.js.map +0 -1
  407. package/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  408. package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  409. package/dist/modes/interactive/components/daxnuts.js +0 -140
  410. package/dist/modes/interactive/components/daxnuts.js.map +0 -1
  411. package/dist/modes/interactive/components/diff.d.ts +0 -12
  412. package/dist/modes/interactive/components/diff.d.ts.map +0 -1
  413. package/dist/modes/interactive/components/diff.js +0 -133
  414. package/dist/modes/interactive/components/diff.js.map +0 -1
  415. package/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  416. package/dist/modes/interactive/components/dynamic-border.d.ts.map +0 -1
  417. package/dist/modes/interactive/components/dynamic-border.js +0 -21
  418. package/dist/modes/interactive/components/dynamic-border.js.map +0 -1
  419. package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  420. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
  421. package/dist/modes/interactive/components/earendil-announcement.js +0 -40
  422. package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
  423. package/dist/modes/interactive/components/extension-editor.d.ts +0 -20
  424. package/dist/modes/interactive/components/extension-editor.d.ts.map +0 -1
  425. package/dist/modes/interactive/components/extension-editor.js +0 -111
  426. package/dist/modes/interactive/components/extension-editor.js.map +0 -1
  427. package/dist/modes/interactive/components/extension-input.d.ts +0 -23
  428. package/dist/modes/interactive/components/extension-input.d.ts.map +0 -1
  429. package/dist/modes/interactive/components/extension-input.js +0 -61
  430. package/dist/modes/interactive/components/extension-input.js.map +0 -1
  431. package/dist/modes/interactive/components/extension-selector.d.ts +0 -24
  432. package/dist/modes/interactive/components/extension-selector.d.ts.map +0 -1
  433. package/dist/modes/interactive/components/extension-selector.js +0 -78
  434. package/dist/modes/interactive/components/extension-selector.js.map +0 -1
  435. package/dist/modes/interactive/components/footer.d.ts +0 -27
  436. package/dist/modes/interactive/components/footer.d.ts.map +0 -1
  437. package/dist/modes/interactive/components/footer.js +0 -201
  438. package/dist/modes/interactive/components/footer.js.map +0 -1
  439. package/dist/modes/interactive/components/index.d.ts +0 -32
  440. package/dist/modes/interactive/components/index.d.ts.map +0 -1
  441. package/dist/modes/interactive/components/index.js +0 -33
  442. package/dist/modes/interactive/components/index.js.map +0 -1
  443. package/dist/modes/interactive/components/keybinding-hints.d.ts +0 -8
  444. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +0 -1
  445. package/dist/modes/interactive/components/keybinding-hints.js +0 -22
  446. package/dist/modes/interactive/components/keybinding-hints.js.map +0 -1
  447. package/dist/modes/interactive/components/login-dialog.d.ts +0 -46
  448. package/dist/modes/interactive/components/login-dialog.d.ts.map +0 -1
  449. package/dist/modes/interactive/components/login-dialog.js +0 -158
  450. package/dist/modes/interactive/components/login-dialog.js.map +0 -1
  451. package/dist/modes/interactive/components/model-selector.d.ts +0 -47
  452. package/dist/modes/interactive/components/model-selector.d.ts.map +0 -1
  453. package/dist/modes/interactive/components/model-selector.js +0 -278
  454. package/dist/modes/interactive/components/model-selector.js.map +0 -1
  455. package/dist/modes/interactive/components/oauth-selector.d.ts +0 -29
  456. package/dist/modes/interactive/components/oauth-selector.d.ts.map +0 -1
  457. package/dist/modes/interactive/components/oauth-selector.js +0 -141
  458. package/dist/modes/interactive/components/oauth-selector.js.map +0 -1
  459. package/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  460. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +0 -1
  461. package/dist/modes/interactive/components/scoped-models-selector.js +0 -290
  462. package/dist/modes/interactive/components/scoped-models-selector.js.map +0 -1
  463. package/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  464. package/dist/modes/interactive/components/session-selector-search.d.ts.map +0 -1
  465. package/dist/modes/interactive/components/session-selector-search.js +0 -155
  466. package/dist/modes/interactive/components/session-selector-search.js.map +0 -1
  467. package/dist/modes/interactive/components/session-selector.d.ts +0 -96
  468. package/dist/modes/interactive/components/session-selector.d.ts.map +0 -1
  469. package/dist/modes/interactive/components/session-selector.js +0 -861
  470. package/dist/modes/interactive/components/session-selector.js.map +0 -1
  471. package/dist/modes/interactive/components/settings-selector.d.ts +0 -67
  472. package/dist/modes/interactive/components/settings-selector.d.ts.map +0 -1
  473. package/dist/modes/interactive/components/settings-selector.js +0 -373
  474. package/dist/modes/interactive/components/settings-selector.js.map +0 -1
  475. package/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  476. package/dist/modes/interactive/components/show-images-selector.d.ts.map +0 -1
  477. package/dist/modes/interactive/components/show-images-selector.js +0 -39
  478. package/dist/modes/interactive/components/show-images-selector.js.map +0 -1
  479. package/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  480. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +0 -1
  481. package/dist/modes/interactive/components/skill-invocation-message.js +0 -47
  482. package/dist/modes/interactive/components/skill-invocation-message.js.map +0 -1
  483. package/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  484. package/dist/modes/interactive/components/theme-selector.d.ts.map +0 -1
  485. package/dist/modes/interactive/components/theme-selector.js +0 -50
  486. package/dist/modes/interactive/components/theme-selector.js.map +0 -1
  487. package/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  488. package/dist/modes/interactive/components/thinking-selector.d.ts.map +0 -1
  489. package/dist/modes/interactive/components/thinking-selector.js +0 -51
  490. package/dist/modes/interactive/components/thinking-selector.js.map +0 -1
  491. package/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  492. package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
  493. package/dist/modes/interactive/components/tool-execution.js +0 -295
  494. package/dist/modes/interactive/components/tool-execution.js.map +0 -1
  495. package/dist/modes/interactive/components/tree-selector.d.ts +0 -89
  496. package/dist/modes/interactive/components/tree-selector.d.ts.map +0 -1
  497. package/dist/modes/interactive/components/tree-selector.js +0 -1092
  498. package/dist/modes/interactive/components/tree-selector.js.map +0 -1
  499. package/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  500. package/dist/modes/interactive/components/user-message-selector.d.ts.map +0 -1
  501. package/dist/modes/interactive/components/user-message-selector.js +0 -114
  502. package/dist/modes/interactive/components/user-message-selector.js.map +0 -1
  503. package/dist/modes/interactive/components/user-message.d.ts +0 -10
  504. package/dist/modes/interactive/components/user-message.d.ts.map +0 -1
  505. package/dist/modes/interactive/components/user-message.js +0 -29
  506. package/dist/modes/interactive/components/user-message.js.map +0 -1
  507. package/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  508. package/dist/modes/interactive/components/visual-truncate.d.ts.map +0 -1
  509. package/dist/modes/interactive/components/visual-truncate.js +0 -33
  510. package/dist/modes/interactive/components/visual-truncate.js.map +0 -1
  511. package/dist/modes/interactive/interactive-mode.d.ts +0 -359
  512. package/dist/modes/interactive/interactive-mode.d.ts.map +0 -1
  513. package/dist/modes/interactive/interactive-mode.js +0 -4573
  514. package/dist/modes/interactive/interactive-mode.js.map +0 -1
  515. package/dist/modes/interactive/theme/aery.json +0 -84
  516. package/dist/modes/interactive/theme/catppuccin-mocha.json +0 -81
  517. package/dist/modes/interactive/theme/dark.json +0 -85
  518. package/dist/modes/interactive/theme/dracula.json +0 -81
  519. package/dist/modes/interactive/theme/light.json +0 -84
  520. package/dist/modes/interactive/theme/nord.json +0 -81
  521. package/dist/modes/interactive/theme/theme-schema.json +0 -335
  522. package/dist/modes/interactive/theme/theme.d.ts +0 -81
  523. package/dist/modes/interactive/theme/theme.d.ts.map +0 -1
  524. package/dist/modes/interactive/theme/theme.js +0 -975
  525. package/dist/modes/interactive/theme/theme.js.map +0 -1
  526. package/dist/modes/interactive/theme/tokyo-night.json +0 -81
  527. package/dist/modes/print-mode.d.ts +0 -28
  528. package/dist/modes/print-mode.d.ts.map +0 -1
  529. package/dist/modes/print-mode.js +0 -131
  530. package/dist/modes/print-mode.js.map +0 -1
  531. package/dist/modes/rpc/jsonl.d.ts +0 -17
  532. package/dist/modes/rpc/jsonl.d.ts.map +0 -1
  533. package/dist/modes/rpc/jsonl.js +0 -49
  534. package/dist/modes/rpc/jsonl.js.map +0 -1
  535. package/dist/modes/rpc/rpc-client.d.ts +0 -224
  536. package/dist/modes/rpc/rpc-client.d.ts.map +0 -1
  537. package/dist/modes/rpc/rpc-client.js +0 -410
  538. package/dist/modes/rpc/rpc-client.js.map +0 -1
  539. package/dist/modes/rpc/rpc-mode.d.ts +0 -20
  540. package/dist/modes/rpc/rpc-mode.d.ts.map +0 -1
  541. package/dist/modes/rpc/rpc-mode.js +0 -597
  542. package/dist/modes/rpc/rpc-mode.js.map +0 -1
  543. package/dist/modes/rpc/rpc-types.d.ts +0 -419
  544. package/dist/modes/rpc/rpc-types.d.ts.map +0 -1
  545. package/dist/modes/rpc/rpc-types.js +0 -8
  546. package/dist/modes/rpc/rpc-types.js.map +0 -1
  547. package/dist/package-manager-cli.d.ts +0 -4
  548. package/dist/package-manager-cli.d.ts.map +0 -1
  549. package/dist/package-manager-cli.js +0 -468
  550. package/dist/package-manager-cli.js.map +0 -1
  551. package/dist/utils/aery-user-agent.d.ts +0 -2
  552. package/dist/utils/aery-user-agent.d.ts.map +0 -1
  553. package/dist/utils/aery-user-agent.js +0 -5
  554. package/dist/utils/aery-user-agent.js.map +0 -1
  555. package/dist/utils/changelog.d.ts +0 -21
  556. package/dist/utils/changelog.d.ts.map +0 -1
  557. package/dist/utils/changelog.js +0 -87
  558. package/dist/utils/changelog.js.map +0 -1
  559. package/dist/utils/child-process.d.ts +0 -11
  560. package/dist/utils/child-process.d.ts.map +0 -1
  561. package/dist/utils/child-process.js +0 -78
  562. package/dist/utils/child-process.js.map +0 -1
  563. package/dist/utils/clipboard-image.d.ts +0 -11
  564. package/dist/utils/clipboard-image.d.ts.map +0 -1
  565. package/dist/utils/clipboard-image.js +0 -245
  566. package/dist/utils/clipboard-image.js.map +0 -1
  567. package/dist/utils/clipboard-native.d.ts +0 -8
  568. package/dist/utils/clipboard-native.d.ts.map +0 -1
  569. package/dist/utils/clipboard-native.js +0 -14
  570. package/dist/utils/clipboard-native.js.map +0 -1
  571. package/dist/utils/clipboard.d.ts +0 -2
  572. package/dist/utils/clipboard.d.ts.map +0 -1
  573. package/dist/utils/clipboard.js +0 -110
  574. package/dist/utils/clipboard.js.map +0 -1
  575. package/dist/utils/exif-orientation.d.ts +0 -5
  576. package/dist/utils/exif-orientation.d.ts.map +0 -1
  577. package/dist/utils/exif-orientation.js +0 -158
  578. package/dist/utils/exif-orientation.js.map +0 -1
  579. package/dist/utils/frontmatter.d.ts +0 -8
  580. package/dist/utils/frontmatter.d.ts.map +0 -1
  581. package/dist/utils/frontmatter.js +0 -26
  582. package/dist/utils/frontmatter.js.map +0 -1
  583. package/dist/utils/fs-watch.d.ts +0 -5
  584. package/dist/utils/fs-watch.d.ts.map +0 -1
  585. package/dist/utils/fs-watch.js +0 -25
  586. package/dist/utils/fs-watch.js.map +0 -1
  587. package/dist/utils/git.d.ts +0 -26
  588. package/dist/utils/git.d.ts.map +0 -1
  589. package/dist/utils/git.js +0 -163
  590. package/dist/utils/git.js.map +0 -1
  591. package/dist/utils/image-convert.d.ts +0 -9
  592. package/dist/utils/image-convert.d.ts.map +0 -1
  593. package/dist/utils/image-convert.js +0 -39
  594. package/dist/utils/image-convert.js.map +0 -1
  595. package/dist/utils/image-resize.d.ts +0 -36
  596. package/dist/utils/image-resize.d.ts.map +0 -1
  597. package/dist/utils/image-resize.js +0 -137
  598. package/dist/utils/image-resize.js.map +0 -1
  599. package/dist/utils/mime.d.ts +0 -2
  600. package/dist/utils/mime.d.ts.map +0 -1
  601. package/dist/utils/mime.js +0 -26
  602. package/dist/utils/mime.js.map +0 -1
  603. package/dist/utils/paths.d.ts +0 -14
  604. package/dist/utils/paths.d.ts.map +0 -1
  605. package/dist/utils/paths.js +0 -34
  606. package/dist/utils/paths.js.map +0 -1
  607. package/dist/utils/photon.d.ts +0 -21
  608. package/dist/utils/photon.d.ts.map +0 -1
  609. package/dist/utils/photon.js +0 -121
  610. package/dist/utils/photon.js.map +0 -1
  611. package/dist/utils/shell.d.ts +0 -30
  612. package/dist/utils/shell.d.ts.map +0 -1
  613. package/dist/utils/shell.js +0 -190
  614. package/dist/utils/shell.js.map +0 -1
  615. package/dist/utils/sleep.d.ts +0 -5
  616. package/dist/utils/sleep.d.ts.map +0 -1
  617. package/dist/utils/sleep.js +0 -17
  618. package/dist/utils/sleep.js.map +0 -1
  619. package/dist/utils/tools-manager.d.ts +0 -3
  620. package/dist/utils/tools-manager.d.ts.map +0 -1
  621. package/dist/utils/tools-manager.js +0 -256
  622. package/dist/utils/tools-manager.js.map +0 -1
  623. package/dist/utils/version-check.d.ts +0 -7
  624. package/dist/utils/version-check.d.ts.map +0 -1
  625. package/dist/utils/version-check.js +0 -70
  626. package/dist/utils/version-check.js.map +0 -1
@@ -1,87 +0,0 @@
1
- import { existsSync, readFileSync } from "fs";
2
- /**
3
- * Parse changelog entries from CHANGELOG.md
4
- * Scans for ## lines and collects content until next ## or EOF
5
- */
6
- export function parseChangelog(changelogPath) {
7
- if (!existsSync(changelogPath)) {
8
- return [];
9
- }
10
- try {
11
- const content = readFileSync(changelogPath, "utf-8");
12
- const lines = content.split("\n");
13
- const entries = [];
14
- let currentLines = [];
15
- let currentVersion = null;
16
- for (const line of lines) {
17
- // Check if this is a version header (## [x.y.z] ...)
18
- if (line.startsWith("## ")) {
19
- // Save previous entry if exists
20
- if (currentVersion && currentLines.length > 0) {
21
- entries.push({
22
- ...currentVersion,
23
- content: currentLines.join("\n").trim(),
24
- });
25
- }
26
- // Try to parse version from this line
27
- const versionMatch = line.match(/##\s+\[?(\d+)\.(\d+)\.(\d+)\]?/);
28
- if (versionMatch) {
29
- currentVersion = {
30
- major: Number.parseInt(versionMatch[1], 10),
31
- minor: Number.parseInt(versionMatch[2], 10),
32
- patch: Number.parseInt(versionMatch[3], 10),
33
- };
34
- currentLines = [line];
35
- }
36
- else {
37
- // Reset if we can't parse version
38
- currentVersion = null;
39
- currentLines = [];
40
- }
41
- }
42
- else if (currentVersion) {
43
- // Collect lines for current version
44
- currentLines.push(line);
45
- }
46
- }
47
- // Save last entry
48
- if (currentVersion && currentLines.length > 0) {
49
- entries.push({
50
- ...currentVersion,
51
- content: currentLines.join("\n").trim(),
52
- });
53
- }
54
- return entries;
55
- }
56
- catch (error) {
57
- console.error(`Warning: Could not parse changelog: ${error}`);
58
- return [];
59
- }
60
- }
61
- /**
62
- * Compare versions. Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2
63
- */
64
- export function compareVersions(v1, v2) {
65
- if (v1.major !== v2.major)
66
- return v1.major - v2.major;
67
- if (v1.minor !== v2.minor)
68
- return v1.minor - v2.minor;
69
- return v1.patch - v2.patch;
70
- }
71
- /**
72
- * Get entries newer than lastVersion
73
- */
74
- export function getNewEntries(entries, lastVersion) {
75
- // Parse lastVersion
76
- const parts = lastVersion.split(".").map(Number);
77
- const last = {
78
- major: parts[0] || 0,
79
- minor: parts[1] || 0,
80
- patch: parts[2] || 0,
81
- content: "",
82
- };
83
- return entries.filter((entry) => compareVersions(entry, last) > 0);
84
- }
85
- // Re-export getChangelogPath from paths.ts for convenience
86
- export { getChangelogPath } from "../config.js";
87
- //# sourceMappingURL=changelog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/utils/changelog.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"fs\";\n\nexport interface ChangelogEntry {\n\tmajor: number;\n\tminor: number;\n\tpatch: number;\n\tcontent: string;\n}\n\n/**\n * Parse changelog entries from CHANGELOG.md\n * Scans for ## lines and collects content until next ## or EOF\n */\nexport function parseChangelog(changelogPath: string): ChangelogEntry[] {\n\tif (!existsSync(changelogPath)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(changelogPath, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\");\n\t\tconst entries: ChangelogEntry[] = [];\n\n\t\tlet currentLines: string[] = [];\n\t\tlet currentVersion: { major: number; minor: number; patch: number } | null = null;\n\n\t\tfor (const line of lines) {\n\t\t\t// Check if this is a version header (## [x.y.z] ...)\n\t\t\tif (line.startsWith(\"## \")) {\n\t\t\t\t// Save previous entry if exists\n\t\t\t\tif (currentVersion && currentLines.length > 0) {\n\t\t\t\t\tentries.push({\n\t\t\t\t\t\t...currentVersion,\n\t\t\t\t\t\tcontent: currentLines.join(\"\\n\").trim(),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Try to parse version from this line\n\t\t\t\tconst versionMatch = line.match(/##\\s+\\[?(\\d+)\\.(\\d+)\\.(\\d+)\\]?/);\n\t\t\t\tif (versionMatch) {\n\t\t\t\t\tcurrentVersion = {\n\t\t\t\t\t\tmajor: Number.parseInt(versionMatch[1], 10),\n\t\t\t\t\t\tminor: Number.parseInt(versionMatch[2], 10),\n\t\t\t\t\t\tpatch: Number.parseInt(versionMatch[3], 10),\n\t\t\t\t\t};\n\t\t\t\t\tcurrentLines = [line];\n\t\t\t\t} else {\n\t\t\t\t\t// Reset if we can't parse version\n\t\t\t\t\tcurrentVersion = null;\n\t\t\t\t\tcurrentLines = [];\n\t\t\t\t}\n\t\t\t} else if (currentVersion) {\n\t\t\t\t// Collect lines for current version\n\t\t\t\tcurrentLines.push(line);\n\t\t\t}\n\t\t}\n\n\t\t// Save last entry\n\t\tif (currentVersion && currentLines.length > 0) {\n\t\t\tentries.push({\n\t\t\t\t...currentVersion,\n\t\t\t\tcontent: currentLines.join(\"\\n\").trim(),\n\t\t\t});\n\t\t}\n\n\t\treturn entries;\n\t} catch (error) {\n\t\tconsole.error(`Warning: Could not parse changelog: ${error}`);\n\t\treturn [];\n\t}\n}\n\n/**\n * Compare versions. Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2\n */\nexport function compareVersions(v1: ChangelogEntry, v2: ChangelogEntry): number {\n\tif (v1.major !== v2.major) return v1.major - v2.major;\n\tif (v1.minor !== v2.minor) return v1.minor - v2.minor;\n\treturn v1.patch - v2.patch;\n}\n\n/**\n * Get entries newer than lastVersion\n */\nexport function getNewEntries(entries: ChangelogEntry[], lastVersion: string): ChangelogEntry[] {\n\t// Parse lastVersion\n\tconst parts = lastVersion.split(\".\").map(Number);\n\tconst last: ChangelogEntry = {\n\t\tmajor: parts[0] || 0,\n\t\tminor: parts[1] || 0,\n\t\tpatch: parts[2] || 0,\n\t\tcontent: \"\",\n\t};\n\n\treturn entries.filter((entry) => compareVersions(entry, last) > 0);\n}\n\n// Re-export getChangelogPath from paths.ts for convenience\nexport { getChangelogPath } from \"../config.js\";\n"]}
@@ -1,11 +0,0 @@
1
- import type { ChildProcess } from "node:child_process";
2
- /**
3
- * Wait for a child process to terminate without hanging on inherited stdio handles.
4
- *
5
- * On Windows, daemonized descendants can inherit the child's stdout/stderr pipe
6
- * handles. In that case the child emits `exit`, but `close` can hang forever even
7
- * though the original process is already gone. We wait briefly for stdio to end,
8
- * then forcibly stop tracking the inherited handles.
9
- */
10
- export declare function waitForChildProcess(child: ChildProcess): Promise<number | null>;
11
- //# sourceMappingURL=child-process.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"child-process.d.ts","sourceRoot":"","sources":["../../src/utils/child-process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyE/E","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\n\nconst EXIT_STDIO_GRACE_MS = 100;\n\n/**\n * Wait for a child process to terminate without hanging on inherited stdio handles.\n *\n * On Windows, daemonized descendants can inherit the child's stdout/stderr pipe\n * handles. In that case the child emits `exit`, but `close` can hang forever even\n * though the original process is already gone. We wait briefly for stdio to end,\n * then forcibly stop tracking the inherited handles.\n */\nexport function waitForChildProcess(child: ChildProcess): Promise<number | null> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet exited = false;\n\t\tlet exitCode: number | null = null;\n\t\tlet postExitTimer: NodeJS.Timeout | undefined;\n\t\tlet stdoutEnded = child.stdout === null;\n\t\tlet stderrEnded = child.stderr === null;\n\n\t\tconst cleanup = () => {\n\t\t\tif (postExitTimer) {\n\t\t\t\tclearTimeout(postExitTimer);\n\t\t\t\tpostExitTimer = undefined;\n\t\t\t}\n\t\t\tchild.removeListener(\"error\", onError);\n\t\t\tchild.removeListener(\"exit\", onExit);\n\t\t\tchild.removeListener(\"close\", onClose);\n\t\t\tchild.stdout?.removeListener(\"end\", onStdoutEnd);\n\t\t\tchild.stderr?.removeListener(\"end\", onStderrEnd);\n\t\t};\n\n\t\tconst finalize = (code: number | null) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tchild.stdout?.destroy();\n\t\t\tchild.stderr?.destroy();\n\t\t\tresolve(code);\n\t\t};\n\n\t\tconst maybeFinalizeAfterExit = () => {\n\t\t\tif (!exited || settled) return;\n\t\t\tif (stdoutEnded && stderrEnded) {\n\t\t\t\tfinalize(exitCode);\n\t\t\t}\n\t\t};\n\n\t\tconst onStdoutEnd = () => {\n\t\t\tstdoutEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onStderrEnd = () => {\n\t\t\tstderrEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onError = (err: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(err);\n\t\t};\n\n\t\tconst onExit = (code: number | null) => {\n\t\t\texited = true;\n\t\t\texitCode = code;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t\tif (!settled) {\n\t\t\t\tpostExitTimer = setTimeout(() => finalize(code), EXIT_STDIO_GRACE_MS);\n\t\t\t}\n\t\t};\n\n\t\tconst onClose = (code: number | null) => {\n\t\t\tfinalize(code);\n\t\t};\n\n\t\tchild.stdout?.once(\"end\", onStdoutEnd);\n\t\tchild.stderr?.once(\"end\", onStderrEnd);\n\t\tchild.once(\"error\", onError);\n\t\tchild.once(\"exit\", onExit);\n\t\tchild.once(\"close\", onClose);\n\t});\n}\n"]}
@@ -1,78 +0,0 @@
1
- const EXIT_STDIO_GRACE_MS = 100;
2
- /**
3
- * Wait for a child process to terminate without hanging on inherited stdio handles.
4
- *
5
- * On Windows, daemonized descendants can inherit the child's stdout/stderr pipe
6
- * handles. In that case the child emits `exit`, but `close` can hang forever even
7
- * though the original process is already gone. We wait briefly for stdio to end,
8
- * then forcibly stop tracking the inherited handles.
9
- */
10
- export function waitForChildProcess(child) {
11
- return new Promise((resolve, reject) => {
12
- let settled = false;
13
- let exited = false;
14
- let exitCode = null;
15
- let postExitTimer;
16
- let stdoutEnded = child.stdout === null;
17
- let stderrEnded = child.stderr === null;
18
- const cleanup = () => {
19
- if (postExitTimer) {
20
- clearTimeout(postExitTimer);
21
- postExitTimer = undefined;
22
- }
23
- child.removeListener("error", onError);
24
- child.removeListener("exit", onExit);
25
- child.removeListener("close", onClose);
26
- child.stdout?.removeListener("end", onStdoutEnd);
27
- child.stderr?.removeListener("end", onStderrEnd);
28
- };
29
- const finalize = (code) => {
30
- if (settled)
31
- return;
32
- settled = true;
33
- cleanup();
34
- child.stdout?.destroy();
35
- child.stderr?.destroy();
36
- resolve(code);
37
- };
38
- const maybeFinalizeAfterExit = () => {
39
- if (!exited || settled)
40
- return;
41
- if (stdoutEnded && stderrEnded) {
42
- finalize(exitCode);
43
- }
44
- };
45
- const onStdoutEnd = () => {
46
- stdoutEnded = true;
47
- maybeFinalizeAfterExit();
48
- };
49
- const onStderrEnd = () => {
50
- stderrEnded = true;
51
- maybeFinalizeAfterExit();
52
- };
53
- const onError = (err) => {
54
- if (settled)
55
- return;
56
- settled = true;
57
- cleanup();
58
- reject(err);
59
- };
60
- const onExit = (code) => {
61
- exited = true;
62
- exitCode = code;
63
- maybeFinalizeAfterExit();
64
- if (!settled) {
65
- postExitTimer = setTimeout(() => finalize(code), EXIT_STDIO_GRACE_MS);
66
- }
67
- };
68
- const onClose = (code) => {
69
- finalize(code);
70
- };
71
- child.stdout?.once("end", onStdoutEnd);
72
- child.stderr?.once("end", onStderrEnd);
73
- child.once("error", onError);
74
- child.once("exit", onExit);
75
- child.once("close", onClose);
76
- });
77
- }
78
- //# sourceMappingURL=child-process.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"child-process.js","sourceRoot":"","sources":["../../src/utils/child-process.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\n\nconst EXIT_STDIO_GRACE_MS = 100;\n\n/**\n * Wait for a child process to terminate without hanging on inherited stdio handles.\n *\n * On Windows, daemonized descendants can inherit the child's stdout/stderr pipe\n * handles. In that case the child emits `exit`, but `close` can hang forever even\n * though the original process is already gone. We wait briefly for stdio to end,\n * then forcibly stop tracking the inherited handles.\n */\nexport function waitForChildProcess(child: ChildProcess): Promise<number | null> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet exited = false;\n\t\tlet exitCode: number | null = null;\n\t\tlet postExitTimer: NodeJS.Timeout | undefined;\n\t\tlet stdoutEnded = child.stdout === null;\n\t\tlet stderrEnded = child.stderr === null;\n\n\t\tconst cleanup = () => {\n\t\t\tif (postExitTimer) {\n\t\t\t\tclearTimeout(postExitTimer);\n\t\t\t\tpostExitTimer = undefined;\n\t\t\t}\n\t\t\tchild.removeListener(\"error\", onError);\n\t\t\tchild.removeListener(\"exit\", onExit);\n\t\t\tchild.removeListener(\"close\", onClose);\n\t\t\tchild.stdout?.removeListener(\"end\", onStdoutEnd);\n\t\t\tchild.stderr?.removeListener(\"end\", onStderrEnd);\n\t\t};\n\n\t\tconst finalize = (code: number | null) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tchild.stdout?.destroy();\n\t\t\tchild.stderr?.destroy();\n\t\t\tresolve(code);\n\t\t};\n\n\t\tconst maybeFinalizeAfterExit = () => {\n\t\t\tif (!exited || settled) return;\n\t\t\tif (stdoutEnded && stderrEnded) {\n\t\t\t\tfinalize(exitCode);\n\t\t\t}\n\t\t};\n\n\t\tconst onStdoutEnd = () => {\n\t\t\tstdoutEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onStderrEnd = () => {\n\t\t\tstderrEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onError = (err: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(err);\n\t\t};\n\n\t\tconst onExit = (code: number | null) => {\n\t\t\texited = true;\n\t\t\texitCode = code;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t\tif (!settled) {\n\t\t\t\tpostExitTimer = setTimeout(() => finalize(code), EXIT_STDIO_GRACE_MS);\n\t\t\t}\n\t\t};\n\n\t\tconst onClose = (code: number | null) => {\n\t\t\tfinalize(code);\n\t\t};\n\n\t\tchild.stdout?.once(\"end\", onStdoutEnd);\n\t\tchild.stderr?.once(\"end\", onStderrEnd);\n\t\tchild.once(\"error\", onError);\n\t\tchild.once(\"exit\", onExit);\n\t\tchild.once(\"close\", onClose);\n\t});\n}\n"]}
@@ -1,11 +0,0 @@
1
- export type ClipboardImage = {
2
- bytes: Uint8Array;
3
- mimeType: string;
4
- };
5
- export declare function isWaylandSession(env?: NodeJS.ProcessEnv): boolean;
6
- export declare function extensionForImageMimeType(mimeType: string): string | null;
7
- export declare function readClipboardImage(options?: {
8
- env?: NodeJS.ProcessEnv;
9
- platform?: NodeJS.Platform;
10
- }): Promise<ClipboardImage | null>;
11
- //# sourceMappingURL=clipboard-image.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clipboard-image.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard-image.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AASF,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE9E;AAMD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAazE;AAmND,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA2CjC","sourcesContent":["import { spawnSync } from \"child_process\";\nimport { randomUUID } from \"crypto\";\nimport { readFileSync, unlinkSync } from \"fs\";\nimport { tmpdir } from \"os\";\nimport { join } from \"path\";\n\nimport { clipboard } from \"./clipboard-native.js\";\nimport { loadPhoton } from \"./photon.js\";\n\nexport type ClipboardImage = {\n\tbytes: Uint8Array;\n\tmimeType: string;\n};\n\nconst SUPPORTED_IMAGE_MIME_TYPES = [\"image/png\", \"image/jpeg\", \"image/webp\", \"image/gif\"] as const;\n\nconst DEFAULT_LIST_TIMEOUT_MS = 1000;\nconst DEFAULT_READ_TIMEOUT_MS = 3000;\nconst DEFAULT_POWERSHELL_TIMEOUT_MS = 5000;\nconst DEFAULT_MAX_BUFFER_BYTES = 50 * 1024 * 1024;\n\nexport function isWaylandSession(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn Boolean(env.WAYLAND_DISPLAY) || env.XDG_SESSION_TYPE === \"wayland\";\n}\n\nfunction baseMimeType(mimeType: string): string {\n\treturn mimeType.split(\";\")[0]?.trim().toLowerCase() ?? mimeType.toLowerCase();\n}\n\nexport function extensionForImageMimeType(mimeType: string): string | null {\n\tswitch (baseMimeType(mimeType)) {\n\t\tcase \"image/png\":\n\t\t\treturn \"png\";\n\t\tcase \"image/jpeg\":\n\t\t\treturn \"jpg\";\n\t\tcase \"image/webp\":\n\t\t\treturn \"webp\";\n\t\tcase \"image/gif\":\n\t\t\treturn \"gif\";\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nfunction selectPreferredImageMimeType(mimeTypes: string[]): string | null {\n\tconst normalized = mimeTypes\n\t\t.map((t) => t.trim())\n\t\t.filter(Boolean)\n\t\t.map((t) => ({ raw: t, base: baseMimeType(t) }));\n\n\tfor (const preferred of SUPPORTED_IMAGE_MIME_TYPES) {\n\t\tconst match = normalized.find((t) => t.base === preferred);\n\t\tif (match) {\n\t\t\treturn match.raw;\n\t\t}\n\t}\n\n\tconst anyImage = normalized.find((t) => t.base.startsWith(\"image/\"));\n\treturn anyImage?.raw ?? null;\n}\n\nfunction isSupportedImageMimeType(mimeType: string): boolean {\n\tconst base = baseMimeType(mimeType);\n\treturn SUPPORTED_IMAGE_MIME_TYPES.some((t) => t === base);\n}\n\n/**\n * Convert unsupported image formats to PNG using Photon.\n * Returns null if conversion is unavailable or fails.\n */\nasync function convertToPng(bytes: Uint8Array): Promise<Uint8Array | null> {\n\tconst photon = await loadPhoton();\n\tif (!photon) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst image = photon.PhotonImage.new_from_byteslice(bytes);\n\t\ttry {\n\t\t\treturn image.get_bytes();\n\t\t} finally {\n\t\t\timage.free();\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction runCommand(\n\tcommand: string,\n\targs: string[],\n\toptions?: { timeoutMs?: number; maxBufferBytes?: number; env?: NodeJS.ProcessEnv },\n): { stdout: Buffer; ok: boolean } {\n\tconst timeoutMs = options?.timeoutMs ?? DEFAULT_READ_TIMEOUT_MS;\n\tconst maxBufferBytes = options?.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;\n\n\tconst result = spawnSync(command, args, {\n\t\ttimeout: timeoutMs,\n\t\tmaxBuffer: maxBufferBytes,\n\t\tenv: options?.env,\n\t});\n\n\tif (result.error) {\n\t\treturn { ok: false, stdout: Buffer.alloc(0) };\n\t}\n\n\tif (result.status !== 0) {\n\t\treturn { ok: false, stdout: Buffer.alloc(0) };\n\t}\n\n\tconst stdout = Buffer.isBuffer(result.stdout)\n\t\t? result.stdout\n\t\t: Buffer.from(result.stdout ?? \"\", typeof result.stdout === \"string\" ? \"utf-8\" : undefined);\n\n\treturn { ok: true, stdout };\n}\n\nfunction readClipboardImageViaWlPaste(): ClipboardImage | null {\n\tconst list = runCommand(\"wl-paste\", [\"--list-types\"], { timeoutMs: DEFAULT_LIST_TIMEOUT_MS });\n\tif (!list.ok) {\n\t\treturn null;\n\t}\n\n\tconst types = list.stdout\n\t\t.toString(\"utf-8\")\n\t\t.split(/\\r?\\n/)\n\t\t.map((t) => t.trim())\n\t\t.filter(Boolean);\n\n\tconst selectedType = selectPreferredImageMimeType(types);\n\tif (!selectedType) {\n\t\treturn null;\n\t}\n\n\tconst data = runCommand(\"wl-paste\", [\"--type\", selectedType, \"--no-newline\"]);\n\tif (!data.ok || data.stdout.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn { bytes: data.stdout, mimeType: baseMimeType(selectedType) };\n}\n\nfunction isWSL(env: NodeJS.ProcessEnv = process.env): boolean {\n\tif (env.WSL_DISTRO_NAME || env.WSLENV) {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst release = readFileSync(\"/proc/version\", \"utf-8\");\n\t\treturn /microsoft|wsl/i.test(release);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * On WSL, the Linux clipboard (Wayland/X11) does not receive image data from\n * Windows screenshots (Win+Shift+S). PowerShell can access the Windows clipboard\n * directly, so we use it as a fallback.\n */\nfunction readClipboardImageViaPowerShell(): ClipboardImage | null {\n\tconst tmpFile = join(tmpdir(), `aery-wsl-clip-${randomUUID()}.png`);\n\n\ttry {\n\t\tconst winPathResult = runCommand(\"wslpath\", [\"-w\", tmpFile], { timeoutMs: DEFAULT_LIST_TIMEOUT_MS });\n\t\tif (!winPathResult.ok) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst winPath = winPathResult.stdout.toString(\"utf-8\").trim();\n\t\tif (!winPath) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst psScript = [\n\t\t\t\"Add-Type -AssemblyName System.Windows.Forms\",\n\t\t\t\"Add-Type -AssemblyName System.Drawing\",\n\t\t\t\"$path = $env:PI_WSL_CLIPBOARD_IMAGE_PATH\",\n\t\t\t\"$img = [System.Windows.Forms.Clipboard]::GetImage()\",\n\t\t\t\"if ($img) { $img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'ok' } else { Write-Output 'empty' }\",\n\t\t].join(\"; \");\n\n\t\tconst result = runCommand(\"powershell.exe\", [\"-NoProfile\", \"-Command\", psScript], {\n\t\t\ttimeoutMs: DEFAULT_POWERSHELL_TIMEOUT_MS,\n\t\t\tenv: { ...process.env, PI_WSL_CLIPBOARD_IMAGE_PATH: winPath },\n\t\t});\n\t\tif (!result.ok) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst output = result.stdout.toString(\"utf-8\").trim();\n\t\tif (output !== \"ok\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst bytes = readFileSync(tmpFile);\n\t\tif (bytes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn { bytes: new Uint8Array(bytes), mimeType: \"image/png\" };\n\t} catch {\n\t\treturn null;\n\t} finally {\n\t\ttry {\n\t\t\tunlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors.\n\t\t}\n\t}\n}\n\nfunction readClipboardImageViaXclip(): ClipboardImage | null {\n\tconst targets = runCommand(\"xclip\", [\"-selection\", \"clipboard\", \"-t\", \"TARGETS\", \"-o\"], {\n\t\ttimeoutMs: DEFAULT_LIST_TIMEOUT_MS,\n\t});\n\n\tlet candidateTypes: string[] = [];\n\tif (targets.ok) {\n\t\tcandidateTypes = targets.stdout\n\t\t\t.toString(\"utf-8\")\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.map((t) => t.trim())\n\t\t\t.filter(Boolean);\n\t}\n\n\tconst preferred = candidateTypes.length > 0 ? selectPreferredImageMimeType(candidateTypes) : null;\n\tconst tryTypes = preferred ? [preferred, ...SUPPORTED_IMAGE_MIME_TYPES] : [...SUPPORTED_IMAGE_MIME_TYPES];\n\n\tfor (const mimeType of tryTypes) {\n\t\tconst data = runCommand(\"xclip\", [\"-selection\", \"clipboard\", \"-t\", mimeType, \"-o\"]);\n\t\tif (data.ok && data.stdout.length > 0) {\n\t\t\treturn { bytes: data.stdout, mimeType: baseMimeType(mimeType) };\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function readClipboardImageViaNativeClipboard(): Promise<ClipboardImage | null> {\n\tif (!clipboard || !clipboard.hasImage()) {\n\t\treturn null;\n\t}\n\n\tconst imageData = await clipboard.getImageBinary();\n\tif (!imageData || imageData.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst bytes = imageData instanceof Uint8Array ? imageData : Uint8Array.from(imageData);\n\treturn { bytes, mimeType: \"image/png\" };\n}\n\nexport async function readClipboardImage(options?: {\n\tenv?: NodeJS.ProcessEnv;\n\tplatform?: NodeJS.Platform;\n}): Promise<ClipboardImage | null> {\n\tconst env = options?.env ?? process.env;\n\tconst platform = options?.platform ?? process.platform;\n\n\tif (env.TERMUX_VERSION) {\n\t\treturn null;\n\t}\n\n\tlet image: ClipboardImage | null = null;\n\n\tif (platform === \"linux\") {\n\t\tconst wsl = isWSL(env);\n\t\tconst wayland = isWaylandSession(env);\n\n\t\tif (wayland || wsl) {\n\t\t\timage = readClipboardImageViaWlPaste() ?? readClipboardImageViaXclip();\n\t\t}\n\n\t\tif (!image && wsl) {\n\t\t\timage = readClipboardImageViaPowerShell();\n\t\t}\n\n\t\tif (!image && !wayland) {\n\t\t\timage = await readClipboardImageViaNativeClipboard();\n\t\t}\n\t} else {\n\t\timage = await readClipboardImageViaNativeClipboard();\n\t}\n\n\tif (!image) {\n\t\treturn null;\n\t}\n\n\t// Convert unsupported formats (e.g., BMP from WSLg) to PNG\n\tif (!isSupportedImageMimeType(image.mimeType)) {\n\t\tconst pngBytes = await convertToPng(image.bytes);\n\t\tif (!pngBytes) {\n\t\t\treturn null;\n\t\t}\n\t\treturn { bytes: pngBytes, mimeType: \"image/png\" };\n\t}\n\n\treturn image;\n}\n"]}
@@ -1,245 +0,0 @@
1
- import { spawnSync } from "child_process";
2
- import { randomUUID } from "crypto";
3
- import { readFileSync, unlinkSync } from "fs";
4
- import { tmpdir } from "os";
5
- import { join } from "path";
6
- import { clipboard } from "./clipboard-native.js";
7
- import { loadPhoton } from "./photon.js";
8
- const SUPPORTED_IMAGE_MIME_TYPES = ["image/png", "image/jpeg", "image/webp", "image/gif"];
9
- const DEFAULT_LIST_TIMEOUT_MS = 1000;
10
- const DEFAULT_READ_TIMEOUT_MS = 3000;
11
- const DEFAULT_POWERSHELL_TIMEOUT_MS = 5000;
12
- const DEFAULT_MAX_BUFFER_BYTES = 50 * 1024 * 1024;
13
- export function isWaylandSession(env = process.env) {
14
- return Boolean(env.WAYLAND_DISPLAY) || env.XDG_SESSION_TYPE === "wayland";
15
- }
16
- function baseMimeType(mimeType) {
17
- return mimeType.split(";")[0]?.trim().toLowerCase() ?? mimeType.toLowerCase();
18
- }
19
- export function extensionForImageMimeType(mimeType) {
20
- switch (baseMimeType(mimeType)) {
21
- case "image/png":
22
- return "png";
23
- case "image/jpeg":
24
- return "jpg";
25
- case "image/webp":
26
- return "webp";
27
- case "image/gif":
28
- return "gif";
29
- default:
30
- return null;
31
- }
32
- }
33
- function selectPreferredImageMimeType(mimeTypes) {
34
- const normalized = mimeTypes
35
- .map((t) => t.trim())
36
- .filter(Boolean)
37
- .map((t) => ({ raw: t, base: baseMimeType(t) }));
38
- for (const preferred of SUPPORTED_IMAGE_MIME_TYPES) {
39
- const match = normalized.find((t) => t.base === preferred);
40
- if (match) {
41
- return match.raw;
42
- }
43
- }
44
- const anyImage = normalized.find((t) => t.base.startsWith("image/"));
45
- return anyImage?.raw ?? null;
46
- }
47
- function isSupportedImageMimeType(mimeType) {
48
- const base = baseMimeType(mimeType);
49
- return SUPPORTED_IMAGE_MIME_TYPES.some((t) => t === base);
50
- }
51
- /**
52
- * Convert unsupported image formats to PNG using Photon.
53
- * Returns null if conversion is unavailable or fails.
54
- */
55
- async function convertToPng(bytes) {
56
- const photon = await loadPhoton();
57
- if (!photon) {
58
- return null;
59
- }
60
- try {
61
- const image = photon.PhotonImage.new_from_byteslice(bytes);
62
- try {
63
- return image.get_bytes();
64
- }
65
- finally {
66
- image.free();
67
- }
68
- }
69
- catch {
70
- return null;
71
- }
72
- }
73
- function runCommand(command, args, options) {
74
- const timeoutMs = options?.timeoutMs ?? DEFAULT_READ_TIMEOUT_MS;
75
- const maxBufferBytes = options?.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;
76
- const result = spawnSync(command, args, {
77
- timeout: timeoutMs,
78
- maxBuffer: maxBufferBytes,
79
- env: options?.env,
80
- });
81
- if (result.error) {
82
- return { ok: false, stdout: Buffer.alloc(0) };
83
- }
84
- if (result.status !== 0) {
85
- return { ok: false, stdout: Buffer.alloc(0) };
86
- }
87
- const stdout = Buffer.isBuffer(result.stdout)
88
- ? result.stdout
89
- : Buffer.from(result.stdout ?? "", typeof result.stdout === "string" ? "utf-8" : undefined);
90
- return { ok: true, stdout };
91
- }
92
- function readClipboardImageViaWlPaste() {
93
- const list = runCommand("wl-paste", ["--list-types"], { timeoutMs: DEFAULT_LIST_TIMEOUT_MS });
94
- if (!list.ok) {
95
- return null;
96
- }
97
- const types = list.stdout
98
- .toString("utf-8")
99
- .split(/\r?\n/)
100
- .map((t) => t.trim())
101
- .filter(Boolean);
102
- const selectedType = selectPreferredImageMimeType(types);
103
- if (!selectedType) {
104
- return null;
105
- }
106
- const data = runCommand("wl-paste", ["--type", selectedType, "--no-newline"]);
107
- if (!data.ok || data.stdout.length === 0) {
108
- return null;
109
- }
110
- return { bytes: data.stdout, mimeType: baseMimeType(selectedType) };
111
- }
112
- function isWSL(env = process.env) {
113
- if (env.WSL_DISTRO_NAME || env.WSLENV) {
114
- return true;
115
- }
116
- try {
117
- const release = readFileSync("/proc/version", "utf-8");
118
- return /microsoft|wsl/i.test(release);
119
- }
120
- catch {
121
- return false;
122
- }
123
- }
124
- /**
125
- * On WSL, the Linux clipboard (Wayland/X11) does not receive image data from
126
- * Windows screenshots (Win+Shift+S). PowerShell can access the Windows clipboard
127
- * directly, so we use it as a fallback.
128
- */
129
- function readClipboardImageViaPowerShell() {
130
- const tmpFile = join(tmpdir(), `aery-wsl-clip-${randomUUID()}.png`);
131
- try {
132
- const winPathResult = runCommand("wslpath", ["-w", tmpFile], { timeoutMs: DEFAULT_LIST_TIMEOUT_MS });
133
- if (!winPathResult.ok) {
134
- return null;
135
- }
136
- const winPath = winPathResult.stdout.toString("utf-8").trim();
137
- if (!winPath) {
138
- return null;
139
- }
140
- const psScript = [
141
- "Add-Type -AssemblyName System.Windows.Forms",
142
- "Add-Type -AssemblyName System.Drawing",
143
- "$path = $env:PI_WSL_CLIPBOARD_IMAGE_PATH",
144
- "$img = [System.Windows.Forms.Clipboard]::GetImage()",
145
- "if ($img) { $img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'ok' } else { Write-Output 'empty' }",
146
- ].join("; ");
147
- const result = runCommand("powershell.exe", ["-NoProfile", "-Command", psScript], {
148
- timeoutMs: DEFAULT_POWERSHELL_TIMEOUT_MS,
149
- env: { ...process.env, PI_WSL_CLIPBOARD_IMAGE_PATH: winPath },
150
- });
151
- if (!result.ok) {
152
- return null;
153
- }
154
- const output = result.stdout.toString("utf-8").trim();
155
- if (output !== "ok") {
156
- return null;
157
- }
158
- const bytes = readFileSync(tmpFile);
159
- if (bytes.length === 0) {
160
- return null;
161
- }
162
- return { bytes: new Uint8Array(bytes), mimeType: "image/png" };
163
- }
164
- catch {
165
- return null;
166
- }
167
- finally {
168
- try {
169
- unlinkSync(tmpFile);
170
- }
171
- catch {
172
- // Ignore cleanup errors.
173
- }
174
- }
175
- }
176
- function readClipboardImageViaXclip() {
177
- const targets = runCommand("xclip", ["-selection", "clipboard", "-t", "TARGETS", "-o"], {
178
- timeoutMs: DEFAULT_LIST_TIMEOUT_MS,
179
- });
180
- let candidateTypes = [];
181
- if (targets.ok) {
182
- candidateTypes = targets.stdout
183
- .toString("utf-8")
184
- .split(/\r?\n/)
185
- .map((t) => t.trim())
186
- .filter(Boolean);
187
- }
188
- const preferred = candidateTypes.length > 0 ? selectPreferredImageMimeType(candidateTypes) : null;
189
- const tryTypes = preferred ? [preferred, ...SUPPORTED_IMAGE_MIME_TYPES] : [...SUPPORTED_IMAGE_MIME_TYPES];
190
- for (const mimeType of tryTypes) {
191
- const data = runCommand("xclip", ["-selection", "clipboard", "-t", mimeType, "-o"]);
192
- if (data.ok && data.stdout.length > 0) {
193
- return { bytes: data.stdout, mimeType: baseMimeType(mimeType) };
194
- }
195
- }
196
- return null;
197
- }
198
- async function readClipboardImageViaNativeClipboard() {
199
- if (!clipboard || !clipboard.hasImage()) {
200
- return null;
201
- }
202
- const imageData = await clipboard.getImageBinary();
203
- if (!imageData || imageData.length === 0) {
204
- return null;
205
- }
206
- const bytes = imageData instanceof Uint8Array ? imageData : Uint8Array.from(imageData);
207
- return { bytes, mimeType: "image/png" };
208
- }
209
- export async function readClipboardImage(options) {
210
- const env = options?.env ?? process.env;
211
- const platform = options?.platform ?? process.platform;
212
- if (env.TERMUX_VERSION) {
213
- return null;
214
- }
215
- let image = null;
216
- if (platform === "linux") {
217
- const wsl = isWSL(env);
218
- const wayland = isWaylandSession(env);
219
- if (wayland || wsl) {
220
- image = readClipboardImageViaWlPaste() ?? readClipboardImageViaXclip();
221
- }
222
- if (!image && wsl) {
223
- image = readClipboardImageViaPowerShell();
224
- }
225
- if (!image && !wayland) {
226
- image = await readClipboardImageViaNativeClipboard();
227
- }
228
- }
229
- else {
230
- image = await readClipboardImageViaNativeClipboard();
231
- }
232
- if (!image) {
233
- return null;
234
- }
235
- // Convert unsupported formats (e.g., BMP from WSLg) to PNG
236
- if (!isSupportedImageMimeType(image.mimeType)) {
237
- const pngBytes = await convertToPng(image.bytes);
238
- if (!pngBytes) {
239
- return null;
240
- }
241
- return { bytes: pngBytes, mimeType: "image/png" };
242
- }
243
- return image;
244
- }
245
- //# sourceMappingURL=clipboard-image.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clipboard-image.js","sourceRoot":"","sources":["../../src/utils/clipboard-image.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"child_process\";\nimport { randomUUID } from \"crypto\";\nimport { readFileSync, unlinkSync } from \"fs\";\nimport { tmpdir } from \"os\";\nimport { join } from \"path\";\n\nimport { clipboard } from \"./clipboard-native.js\";\nimport { loadPhoton } from \"./photon.js\";\n\nexport type ClipboardImage = {\n\tbytes: Uint8Array;\n\tmimeType: string;\n};\n\nconst SUPPORTED_IMAGE_MIME_TYPES = [\"image/png\", \"image/jpeg\", \"image/webp\", \"image/gif\"] as const;\n\nconst DEFAULT_LIST_TIMEOUT_MS = 1000;\nconst DEFAULT_READ_TIMEOUT_MS = 3000;\nconst DEFAULT_POWERSHELL_TIMEOUT_MS = 5000;\nconst DEFAULT_MAX_BUFFER_BYTES = 50 * 1024 * 1024;\n\nexport function isWaylandSession(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn Boolean(env.WAYLAND_DISPLAY) || env.XDG_SESSION_TYPE === \"wayland\";\n}\n\nfunction baseMimeType(mimeType: string): string {\n\treturn mimeType.split(\";\")[0]?.trim().toLowerCase() ?? mimeType.toLowerCase();\n}\n\nexport function extensionForImageMimeType(mimeType: string): string | null {\n\tswitch (baseMimeType(mimeType)) {\n\t\tcase \"image/png\":\n\t\t\treturn \"png\";\n\t\tcase \"image/jpeg\":\n\t\t\treturn \"jpg\";\n\t\tcase \"image/webp\":\n\t\t\treturn \"webp\";\n\t\tcase \"image/gif\":\n\t\t\treturn \"gif\";\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nfunction selectPreferredImageMimeType(mimeTypes: string[]): string | null {\n\tconst normalized = mimeTypes\n\t\t.map((t) => t.trim())\n\t\t.filter(Boolean)\n\t\t.map((t) => ({ raw: t, base: baseMimeType(t) }));\n\n\tfor (const preferred of SUPPORTED_IMAGE_MIME_TYPES) {\n\t\tconst match = normalized.find((t) => t.base === preferred);\n\t\tif (match) {\n\t\t\treturn match.raw;\n\t\t}\n\t}\n\n\tconst anyImage = normalized.find((t) => t.base.startsWith(\"image/\"));\n\treturn anyImage?.raw ?? null;\n}\n\nfunction isSupportedImageMimeType(mimeType: string): boolean {\n\tconst base = baseMimeType(mimeType);\n\treturn SUPPORTED_IMAGE_MIME_TYPES.some((t) => t === base);\n}\n\n/**\n * Convert unsupported image formats to PNG using Photon.\n * Returns null if conversion is unavailable or fails.\n */\nasync function convertToPng(bytes: Uint8Array): Promise<Uint8Array | null> {\n\tconst photon = await loadPhoton();\n\tif (!photon) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst image = photon.PhotonImage.new_from_byteslice(bytes);\n\t\ttry {\n\t\t\treturn image.get_bytes();\n\t\t} finally {\n\t\t\timage.free();\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction runCommand(\n\tcommand: string,\n\targs: string[],\n\toptions?: { timeoutMs?: number; maxBufferBytes?: number; env?: NodeJS.ProcessEnv },\n): { stdout: Buffer; ok: boolean } {\n\tconst timeoutMs = options?.timeoutMs ?? DEFAULT_READ_TIMEOUT_MS;\n\tconst maxBufferBytes = options?.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;\n\n\tconst result = spawnSync(command, args, {\n\t\ttimeout: timeoutMs,\n\t\tmaxBuffer: maxBufferBytes,\n\t\tenv: options?.env,\n\t});\n\n\tif (result.error) {\n\t\treturn { ok: false, stdout: Buffer.alloc(0) };\n\t}\n\n\tif (result.status !== 0) {\n\t\treturn { ok: false, stdout: Buffer.alloc(0) };\n\t}\n\n\tconst stdout = Buffer.isBuffer(result.stdout)\n\t\t? result.stdout\n\t\t: Buffer.from(result.stdout ?? \"\", typeof result.stdout === \"string\" ? \"utf-8\" : undefined);\n\n\treturn { ok: true, stdout };\n}\n\nfunction readClipboardImageViaWlPaste(): ClipboardImage | null {\n\tconst list = runCommand(\"wl-paste\", [\"--list-types\"], { timeoutMs: DEFAULT_LIST_TIMEOUT_MS });\n\tif (!list.ok) {\n\t\treturn null;\n\t}\n\n\tconst types = list.stdout\n\t\t.toString(\"utf-8\")\n\t\t.split(/\\r?\\n/)\n\t\t.map((t) => t.trim())\n\t\t.filter(Boolean);\n\n\tconst selectedType = selectPreferredImageMimeType(types);\n\tif (!selectedType) {\n\t\treturn null;\n\t}\n\n\tconst data = runCommand(\"wl-paste\", [\"--type\", selectedType, \"--no-newline\"]);\n\tif (!data.ok || data.stdout.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn { bytes: data.stdout, mimeType: baseMimeType(selectedType) };\n}\n\nfunction isWSL(env: NodeJS.ProcessEnv = process.env): boolean {\n\tif (env.WSL_DISTRO_NAME || env.WSLENV) {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst release = readFileSync(\"/proc/version\", \"utf-8\");\n\t\treturn /microsoft|wsl/i.test(release);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * On WSL, the Linux clipboard (Wayland/X11) does not receive image data from\n * Windows screenshots (Win+Shift+S). PowerShell can access the Windows clipboard\n * directly, so we use it as a fallback.\n */\nfunction readClipboardImageViaPowerShell(): ClipboardImage | null {\n\tconst tmpFile = join(tmpdir(), `aery-wsl-clip-${randomUUID()}.png`);\n\n\ttry {\n\t\tconst winPathResult = runCommand(\"wslpath\", [\"-w\", tmpFile], { timeoutMs: DEFAULT_LIST_TIMEOUT_MS });\n\t\tif (!winPathResult.ok) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst winPath = winPathResult.stdout.toString(\"utf-8\").trim();\n\t\tif (!winPath) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst psScript = [\n\t\t\t\"Add-Type -AssemblyName System.Windows.Forms\",\n\t\t\t\"Add-Type -AssemblyName System.Drawing\",\n\t\t\t\"$path = $env:PI_WSL_CLIPBOARD_IMAGE_PATH\",\n\t\t\t\"$img = [System.Windows.Forms.Clipboard]::GetImage()\",\n\t\t\t\"if ($img) { $img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'ok' } else { Write-Output 'empty' }\",\n\t\t].join(\"; \");\n\n\t\tconst result = runCommand(\"powershell.exe\", [\"-NoProfile\", \"-Command\", psScript], {\n\t\t\ttimeoutMs: DEFAULT_POWERSHELL_TIMEOUT_MS,\n\t\t\tenv: { ...process.env, PI_WSL_CLIPBOARD_IMAGE_PATH: winPath },\n\t\t});\n\t\tif (!result.ok) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst output = result.stdout.toString(\"utf-8\").trim();\n\t\tif (output !== \"ok\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst bytes = readFileSync(tmpFile);\n\t\tif (bytes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn { bytes: new Uint8Array(bytes), mimeType: \"image/png\" };\n\t} catch {\n\t\treturn null;\n\t} finally {\n\t\ttry {\n\t\t\tunlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors.\n\t\t}\n\t}\n}\n\nfunction readClipboardImageViaXclip(): ClipboardImage | null {\n\tconst targets = runCommand(\"xclip\", [\"-selection\", \"clipboard\", \"-t\", \"TARGETS\", \"-o\"], {\n\t\ttimeoutMs: DEFAULT_LIST_TIMEOUT_MS,\n\t});\n\n\tlet candidateTypes: string[] = [];\n\tif (targets.ok) {\n\t\tcandidateTypes = targets.stdout\n\t\t\t.toString(\"utf-8\")\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.map((t) => t.trim())\n\t\t\t.filter(Boolean);\n\t}\n\n\tconst preferred = candidateTypes.length > 0 ? selectPreferredImageMimeType(candidateTypes) : null;\n\tconst tryTypes = preferred ? [preferred, ...SUPPORTED_IMAGE_MIME_TYPES] : [...SUPPORTED_IMAGE_MIME_TYPES];\n\n\tfor (const mimeType of tryTypes) {\n\t\tconst data = runCommand(\"xclip\", [\"-selection\", \"clipboard\", \"-t\", mimeType, \"-o\"]);\n\t\tif (data.ok && data.stdout.length > 0) {\n\t\t\treturn { bytes: data.stdout, mimeType: baseMimeType(mimeType) };\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function readClipboardImageViaNativeClipboard(): Promise<ClipboardImage | null> {\n\tif (!clipboard || !clipboard.hasImage()) {\n\t\treturn null;\n\t}\n\n\tconst imageData = await clipboard.getImageBinary();\n\tif (!imageData || imageData.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst bytes = imageData instanceof Uint8Array ? imageData : Uint8Array.from(imageData);\n\treturn { bytes, mimeType: \"image/png\" };\n}\n\nexport async function readClipboardImage(options?: {\n\tenv?: NodeJS.ProcessEnv;\n\tplatform?: NodeJS.Platform;\n}): Promise<ClipboardImage | null> {\n\tconst env = options?.env ?? process.env;\n\tconst platform = options?.platform ?? process.platform;\n\n\tif (env.TERMUX_VERSION) {\n\t\treturn null;\n\t}\n\n\tlet image: ClipboardImage | null = null;\n\n\tif (platform === \"linux\") {\n\t\tconst wsl = isWSL(env);\n\t\tconst wayland = isWaylandSession(env);\n\n\t\tif (wayland || wsl) {\n\t\t\timage = readClipboardImageViaWlPaste() ?? readClipboardImageViaXclip();\n\t\t}\n\n\t\tif (!image && wsl) {\n\t\t\timage = readClipboardImageViaPowerShell();\n\t\t}\n\n\t\tif (!image && !wayland) {\n\t\t\timage = await readClipboardImageViaNativeClipboard();\n\t\t}\n\t} else {\n\t\timage = await readClipboardImageViaNativeClipboard();\n\t}\n\n\tif (!image) {\n\t\treturn null;\n\t}\n\n\t// Convert unsupported formats (e.g., BMP from WSLg) to PNG\n\tif (!isSupportedImageMimeType(image.mimeType)) {\n\t\tconst pngBytes = await convertToPng(image.bytes);\n\t\tif (!pngBytes) {\n\t\t\treturn null;\n\t\t}\n\t\treturn { bytes: pngBytes, mimeType: \"image/png\" };\n\t}\n\n\treturn image;\n}\n"]}
@@ -1,8 +0,0 @@
1
- export type ClipboardModule = {
2
- setText: (text: string) => Promise<void>;
3
- hasImage: () => boolean;
4
- getImageBinary: () => Promise<Array<number>>;
5
- };
6
- declare let clipboard: ClipboardModule | null;
7
- export { clipboard };
8
- //# sourceMappingURL=clipboard-native.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clipboard-native.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard-native.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAGF,QAAA,IAAI,SAAS,EAAE,eAAe,GAAG,IAAW,CAAC;AAY7C,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import { createRequire } from \"module\";\n\nexport type ClipboardModule = {\n\tsetText: (text: string) => Promise<void>;\n\thasImage: () => boolean;\n\tgetImageBinary: () => Promise<Array<number>>;\n};\n\nconst require = createRequire(import.meta.url);\nlet clipboard: ClipboardModule | null = null;\n\nconst hasDisplay = process.platform !== \"linux\" || Boolean(process.env.DISPLAY || process.env.WAYLAND_DISPLAY);\n\nif (!process.env.TERMUX_VERSION && hasDisplay) {\n\ttry {\n\t\tclipboard = require(\"@mariozechner/clipboard\") as ClipboardModule;\n\t} catch {\n\t\tclipboard = null;\n\t}\n}\n\nexport { clipboard };\n"]}
@@ -1,14 +0,0 @@
1
- import { createRequire } from "module";
2
- const require = createRequire(import.meta.url);
3
- let clipboard = null;
4
- const hasDisplay = process.platform !== "linux" || Boolean(process.env.DISPLAY || process.env.WAYLAND_DISPLAY);
5
- if (!process.env.TERMUX_VERSION && hasDisplay) {
6
- try {
7
- clipboard = require("@mariozechner/clipboard");
8
- }
9
- catch {
10
- clipboard = null;
11
- }
12
- }
13
- export { clipboard };
14
- //# sourceMappingURL=clipboard-native.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clipboard-native.js","sourceRoot":"","sources":["../../src/utils/clipboard-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAQvC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,IAAI,SAAS,GAA2B,IAAI,CAAC;AAE7C,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAE/G,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,UAAU,EAAE,CAAC;IAC/C,IAAI,CAAC;QACJ,SAAS,GAAG,OAAO,CAAC,yBAAyB,CAAoB,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACR,SAAS,GAAG,IAAI,CAAC;IAClB,CAAC;AACF,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import { createRequire } from \"module\";\n\nexport type ClipboardModule = {\n\tsetText: (text: string) => Promise<void>;\n\thasImage: () => boolean;\n\tgetImageBinary: () => Promise<Array<number>>;\n};\n\nconst require = createRequire(import.meta.url);\nlet clipboard: ClipboardModule | null = null;\n\nconst hasDisplay = process.platform !== \"linux\" || Boolean(process.env.DISPLAY || process.env.WAYLAND_DISPLAY);\n\nif (!process.env.TERMUX_VERSION && hasDisplay) {\n\ttry {\n\t\tclipboard = require(\"@mariozechner/clipboard\") as ClipboardModule;\n\t} catch {\n\t\tclipboard = null;\n\t}\n}\n\nexport { clipboard };\n"]}
@@ -1,2 +0,0 @@
1
- export declare function copyToClipboard(text: string): Promise<void>;
2
- //# sourceMappingURL=clipboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AAkCA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFjE","sourcesContent":["import { execSync, spawn } from \"child_process\";\nimport { platform } from \"os\";\nimport { isWaylandSession } from \"./clipboard-image.js\";\nimport { clipboard } from \"./clipboard-native.js\";\n\ntype NativeClipboardExecOptions = {\n\tinput: string;\n\ttimeout: number;\n\tstdio: [\"pipe\", \"ignore\", \"ignore\"];\n};\n\nfunction copyToX11Clipboard(options: NativeClipboardExecOptions): void {\n\ttry {\n\t\texecSync(\"xclip -selection clipboard\", options);\n\t} catch {\n\t\texecSync(\"xsel --clipboard --input\", options);\n\t}\n}\n\nconst MAX_OSC52_ENCODED_LENGTH = 100_000;\n\nfunction isRemoteSession(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn Boolean(env.SSH_CONNECTION || env.SSH_CLIENT || env.MOSH_CONNECTION);\n}\n\nfunction emitOsc52(text: string): boolean {\n\tconst encoded = Buffer.from(text).toString(\"base64\");\n\tif (encoded.length > MAX_OSC52_ENCODED_LENGTH) {\n\t\treturn false;\n\t}\n\tprocess.stdout.write(`\\x1b]52;c;${encoded}\\x07`);\n\treturn true;\n}\n\nexport async function copyToClipboard(text: string): Promise<void> {\n\tlet copied = false;\n\n\t// Prefer direct clipboard writes. Emitting OSC 52 first can make terminals\n\t// write the same native clipboard concurrently with the addon, and very large\n\t// OSC 52 payloads can desynchronize terminal rendering.\n\ttry {\n\t\tif (clipboard) {\n\t\t\tawait clipboard.setText(text);\n\t\t\tcopied = true;\n\t\t}\n\t} catch {\n\t\t// Fall through to platform-specific clipboard tools.\n\t}\n\n\tconst remote = isRemoteSession();\n\tif (copied && !remote) {\n\t\treturn;\n\t}\n\n\tconst p = platform();\n\tconst options: NativeClipboardExecOptions = { input: text, timeout: 5000, stdio: [\"pipe\", \"ignore\", \"ignore\"] };\n\n\tif (!copied) {\n\t\ttry {\n\t\t\tif (p === \"darwin\") {\n\t\t\t\texecSync(\"pbcopy\", options);\n\t\t\t\tcopied = true;\n\t\t\t} else if (p === \"win32\") {\n\t\t\t\texecSync(\"clip\", options);\n\t\t\t\tcopied = true;\n\t\t\t} else {\n\t\t\t\t// Linux. Try Termux, Wayland, or X11 clipboard tools.\n\t\t\t\tif (process.env.TERMUX_VERSION) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\texecSync(\"termux-clipboard-set\", options);\n\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Fall back to Wayland or X11 tools.\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!copied) {\n\t\t\t\t\tconst hasWaylandDisplay = Boolean(process.env.WAYLAND_DISPLAY);\n\t\t\t\t\tconst hasX11Display = Boolean(process.env.DISPLAY);\n\t\t\t\t\tconst isWayland = isWaylandSession();\n\t\t\t\t\tif (isWayland && hasWaylandDisplay) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Verify wl-copy exists (spawn errors are async and won't be caught)\n\t\t\t\t\t\t\texecSync(\"which wl-copy\", { stdio: \"ignore\" });\n\t\t\t\t\t\t\t// wl-copy with execSync hangs due to fork behavior; use spawn instead\n\t\t\t\t\t\t\tconst proc = spawn(\"wl-copy\", [], { stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n\t\t\t\t\t\t\tproc.stdin.on(\"error\", () => {\n\t\t\t\t\t\t\t\t// Ignore EPIPE errors if wl-copy exits early\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tproc.stdin.write(text);\n\t\t\t\t\t\t\tproc.stdin.end();\n\t\t\t\t\t\t\tproc.unref();\n\t\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tif (hasX11Display) {\n\t\t\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (hasX11Display) {\n\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall through to OSC 52 fallback.\n\t\t}\n\t}\n\n\tif (remote || !copied) {\n\t\tconst osc52Copied = emitOsc52(text);\n\t\tcopied = copied || osc52Copied;\n\t}\n\n\tif (!copied) {\n\t\tthrow new Error(\"Failed to copy to clipboard\");\n\t}\n}\n"]}