@fraziym/axoniz 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/agents/definition.d.ts +15 -0
  4. package/dist/agents/definition.d.ts.map +1 -0
  5. package/dist/agents/definition.js +41 -0
  6. package/dist/agents/definition.js.map +1 -0
  7. package/dist/agents/index.d.ts +12 -0
  8. package/dist/agents/index.d.ts.map +1 -0
  9. package/dist/agents/index.js +11 -0
  10. package/dist/agents/index.js.map +1 -0
  11. package/dist/agents/registry.d.ts +17 -0
  12. package/dist/agents/registry.d.ts.map +1 -0
  13. package/dist/agents/registry.js +23 -0
  14. package/dist/agents/registry.js.map +1 -0
  15. package/dist/agents/specialized.d.ts +31 -0
  16. package/dist/agents/specialized.d.ts.map +1 -0
  17. package/dist/agents/specialized.js +75 -0
  18. package/dist/agents/specialized.js.map +1 -0
  19. package/dist/awareness/index.d.ts +14 -0
  20. package/dist/awareness/index.d.ts.map +1 -0
  21. package/dist/awareness/index.js +22 -0
  22. package/dist/awareness/index.js.map +1 -0
  23. package/dist/awareness/service.d.ts +180 -0
  24. package/dist/awareness/service.d.ts.map +1 -0
  25. package/dist/awareness/service.js +789 -0
  26. package/dist/awareness/service.js.map +1 -0
  27. package/dist/cli/entry.d.ts +13 -0
  28. package/dist/cli/entry.d.ts.map +1 -0
  29. package/dist/cli/entry.js +35 -0
  30. package/dist/cli/entry.js.map +1 -0
  31. package/dist/comms/telegram.d.ts +41 -0
  32. package/dist/comms/telegram.d.ts.map +1 -0
  33. package/dist/comms/telegram.js +332 -0
  34. package/dist/comms/telegram.js.map +1 -0
  35. package/dist/core/agent.d.ts +252 -0
  36. package/dist/core/agent.d.ts.map +1 -0
  37. package/dist/core/agent.js +1399 -0
  38. package/dist/core/agent.js.map +1 -0
  39. package/dist/core/auth.d.ts +23 -0
  40. package/dist/core/auth.d.ts.map +1 -0
  41. package/dist/core/auth.js +113 -0
  42. package/dist/core/auth.js.map +1 -0
  43. package/dist/core/authority.d.ts +118 -0
  44. package/dist/core/authority.d.ts.map +1 -0
  45. package/dist/core/authority.js +402 -0
  46. package/dist/core/authority.js.map +1 -0
  47. package/dist/core/backend/async_queue.d.ts +17 -0
  48. package/dist/core/backend/async_queue.d.ts.map +1 -0
  49. package/dist/core/backend/async_queue.js +66 -0
  50. package/dist/core/backend/async_queue.js.map +1 -0
  51. package/dist/core/backend/index.d.ts +24 -0
  52. package/dist/core/backend/index.d.ts.map +1 -0
  53. package/dist/core/backend/index.js +128 -0
  54. package/dist/core/backend/index.js.map +1 -0
  55. package/dist/core/backend/llama_server.d.ts +39 -0
  56. package/dist/core/backend/llama_server.d.ts.map +1 -0
  57. package/dist/core/backend/llama_server.js +182 -0
  58. package/dist/core/backend/llama_server.js.map +1 -0
  59. package/dist/core/backend/llamacpp.d.ts +40 -0
  60. package/dist/core/backend/llamacpp.d.ts.map +1 -0
  61. package/dist/core/backend/llamacpp.js +200 -0
  62. package/dist/core/backend/llamacpp.js.map +1 -0
  63. package/dist/core/backend/lmstudio.d.ts +53 -0
  64. package/dist/core/backend/lmstudio.d.ts.map +1 -0
  65. package/dist/core/backend/lmstudio.js +274 -0
  66. package/dist/core/backend/lmstudio.js.map +1 -0
  67. package/dist/core/backend/ollama.d.ts +25 -0
  68. package/dist/core/backend/ollama.d.ts.map +1 -0
  69. package/dist/core/backend/ollama.js +86 -0
  70. package/dist/core/backend/ollama.js.map +1 -0
  71. package/dist/core/backend/openai.d.ts +27 -0
  72. package/dist/core/backend/openai.d.ts.map +1 -0
  73. package/dist/core/backend/openai.js +84 -0
  74. package/dist/core/backend/openai.js.map +1 -0
  75. package/dist/core/backend/types.d.ts +73 -0
  76. package/dist/core/backend/types.d.ts.map +1 -0
  77. package/dist/core/backend/types.js +137 -0
  78. package/dist/core/backend/types.js.map +1 -0
  79. package/dist/core/chat_store.d.ts +77 -0
  80. package/dist/core/chat_store.d.ts.map +1 -0
  81. package/dist/core/chat_store.js +332 -0
  82. package/dist/core/chat_store.js.map +1 -0
  83. package/dist/core/cli.d.ts +82 -0
  84. package/dist/core/cli.d.ts.map +1 -0
  85. package/dist/core/cli.js +602 -0
  86. package/dist/core/cli.js.map +1 -0
  87. package/dist/core/config.d.ts +127 -0
  88. package/dist/core/config.d.ts.map +1 -0
  89. package/dist/core/config.js +295 -0
  90. package/dist/core/config.js.map +1 -0
  91. package/dist/core/debug.d.ts +8 -0
  92. package/dist/core/debug.d.ts.map +1 -0
  93. package/dist/core/debug.js +8 -0
  94. package/dist/core/debug.js.map +1 -0
  95. package/dist/core/downloader.d.ts +31 -0
  96. package/dist/core/downloader.d.ts.map +1 -0
  97. package/dist/core/downloader.js +180 -0
  98. package/dist/core/downloader.js.map +1 -0
  99. package/dist/core/errors.d.ts +80 -0
  100. package/dist/core/errors.d.ts.map +1 -0
  101. package/dist/core/errors.js +134 -0
  102. package/dist/core/errors.js.map +1 -0
  103. package/dist/core/extras.d.ts +160 -0
  104. package/dist/core/extras.d.ts.map +1 -0
  105. package/dist/core/extras.js +553 -0
  106. package/dist/core/extras.js.map +1 -0
  107. package/dist/core/health.d.ts +27 -0
  108. package/dist/core/health.d.ts.map +1 -0
  109. package/dist/core/health.js +96 -0
  110. package/dist/core/health.js.map +1 -0
  111. package/dist/core/history.d.ts +50 -0
  112. package/dist/core/history.d.ts.map +1 -0
  113. package/dist/core/history.js +276 -0
  114. package/dist/core/history.js.map +1 -0
  115. package/dist/core/index.d.ts +6 -0
  116. package/dist/core/index.d.ts.map +1 -0
  117. package/dist/core/index.js +6 -0
  118. package/dist/core/index.js.map +1 -0
  119. package/dist/core/intelligence/ast_index.d.ts +255 -0
  120. package/dist/core/intelligence/ast_index.d.ts.map +1 -0
  121. package/dist/core/intelligence/ast_index.js +1369 -0
  122. package/dist/core/intelligence/ast_index.js.map +1 -0
  123. package/dist/core/intelligence/confidence.d.ts +113 -0
  124. package/dist/core/intelligence/confidence.d.ts.map +1 -0
  125. package/dist/core/intelligence/confidence.js +298 -0
  126. package/dist/core/intelligence/confidence.js.map +1 -0
  127. package/dist/core/intelligence/context_compressor.d.ts +80 -0
  128. package/dist/core/intelligence/context_compressor.d.ts.map +1 -0
  129. package/dist/core/intelligence/context_compressor.js +245 -0
  130. package/dist/core/intelligence/context_compressor.js.map +1 -0
  131. package/dist/core/intelligence/daemon.d.ts +247 -0
  132. package/dist/core/intelligence/daemon.d.ts.map +1 -0
  133. package/dist/core/intelligence/daemon.js +842 -0
  134. package/dist/core/intelligence/daemon.js.map +1 -0
  135. package/dist/core/intelligence/index.d.ts +60 -0
  136. package/dist/core/intelligence/index.d.ts.map +1 -0
  137. package/dist/core/intelligence/index.js +101 -0
  138. package/dist/core/intelligence/index.js.map +1 -0
  139. package/dist/core/intelligence/predictor.d.ts +246 -0
  140. package/dist/core/intelligence/predictor.d.ts.map +1 -0
  141. package/dist/core/intelligence/predictor.js +590 -0
  142. package/dist/core/intelligence/predictor.js.map +1 -0
  143. package/dist/core/intelligence/reflex.d.ts +84 -0
  144. package/dist/core/intelligence/reflex.d.ts.map +1 -0
  145. package/dist/core/intelligence/reflex.js +344 -0
  146. package/dist/core/intelligence/reflex.js.map +1 -0
  147. package/dist/core/intelligence/self_correction.d.ts +121 -0
  148. package/dist/core/intelligence/self_correction.d.ts.map +1 -0
  149. package/dist/core/intelligence/self_correction.js +327 -0
  150. package/dist/core/intelligence/self_correction.js.map +1 -0
  151. package/dist/core/intelligence/skill_distiller.d.ts +100 -0
  152. package/dist/core/intelligence/skill_distiller.d.ts.map +1 -0
  153. package/dist/core/intelligence/skill_distiller.js +246 -0
  154. package/dist/core/intelligence/skill_distiller.js.map +1 -0
  155. package/dist/core/intelligence/swarm.d.ts +330 -0
  156. package/dist/core/intelligence/swarm.d.ts.map +1 -0
  157. package/dist/core/intelligence/swarm.js +1064 -0
  158. package/dist/core/intelligence/swarm.js.map +1 -0
  159. package/dist/core/intelligence/trajectory.d.ts +107 -0
  160. package/dist/core/intelligence/trajectory.d.ts.map +1 -0
  161. package/dist/core/intelligence/trajectory.js +330 -0
  162. package/dist/core/intelligence/trajectory.js.map +1 -0
  163. package/dist/core/logger.d.ts +111 -0
  164. package/dist/core/logger.d.ts.map +1 -0
  165. package/dist/core/logger.js +640 -0
  166. package/dist/core/logger.js.map +1 -0
  167. package/dist/core/loop.d.ts +123 -0
  168. package/dist/core/loop.d.ts.map +1 -0
  169. package/dist/core/loop.js +423 -0
  170. package/dist/core/loop.js.map +1 -0
  171. package/dist/core/memory.d.ts +81 -0
  172. package/dist/core/memory.d.ts.map +1 -0
  173. package/dist/core/memory.js +328 -0
  174. package/dist/core/memory.js.map +1 -0
  175. package/dist/core/metrics.d.ts +29 -0
  176. package/dist/core/metrics.d.ts.map +1 -0
  177. package/dist/core/metrics.js +109 -0
  178. package/dist/core/metrics.js.map +1 -0
  179. package/dist/core/models.d.ts +51 -0
  180. package/dist/core/models.d.ts.map +1 -0
  181. package/dist/core/models.js +146 -0
  182. package/dist/core/models.js.map +1 -0
  183. package/dist/core/optimizer.d.ts +34 -0
  184. package/dist/core/optimizer.d.ts.map +1 -0
  185. package/dist/core/optimizer.js +131 -0
  186. package/dist/core/optimizer.js.map +1 -0
  187. package/dist/core/persona.d.ts +35 -0
  188. package/dist/core/persona.d.ts.map +1 -0
  189. package/dist/core/persona.js +126 -0
  190. package/dist/core/persona.js.map +1 -0
  191. package/dist/core/rate_limit.d.ts +23 -0
  192. package/dist/core/rate_limit.d.ts.map +1 -0
  193. package/dist/core/rate_limit.js +62 -0
  194. package/dist/core/rate_limit.js.map +1 -0
  195. package/dist/core/runner.d.ts +63 -0
  196. package/dist/core/runner.d.ts.map +1 -0
  197. package/dist/core/runner.js +671 -0
  198. package/dist/core/runner.js.map +1 -0
  199. package/dist/core/stream_parser.d.ts +43 -0
  200. package/dist/core/stream_parser.d.ts.map +1 -0
  201. package/dist/core/stream_parser.js +140 -0
  202. package/dist/core/stream_parser.js.map +1 -0
  203. package/dist/core/tool_schemas.d.ts +26 -0
  204. package/dist/core/tool_schemas.d.ts.map +1 -0
  205. package/dist/core/tool_schemas.js +124 -0
  206. package/dist/core/tool_schemas.js.map +1 -0
  207. package/dist/core/which.d.ts +2 -0
  208. package/dist/core/which.d.ts.map +1 -0
  209. package/dist/core/which.js +35 -0
  210. package/dist/core/which.js.map +1 -0
  211. package/dist/goals/index.d.ts +9 -0
  212. package/dist/goals/index.d.ts.map +1 -0
  213. package/dist/goals/index.js +17 -0
  214. package/dist/goals/index.js.map +1 -0
  215. package/dist/goals/service.d.ts +115 -0
  216. package/dist/goals/service.d.ts.map +1 -0
  217. package/dist/goals/service.js +415 -0
  218. package/dist/goals/service.js.map +1 -0
  219. package/dist/goals/types.d.ts +47 -0
  220. package/dist/goals/types.d.ts.map +1 -0
  221. package/dist/goals/types.js +66 -0
  222. package/dist/goals/types.js.map +1 -0
  223. package/dist/index.d.ts +22 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +22 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/integrations/autonomous_startup.d.ts +51 -0
  228. package/dist/integrations/autonomous_startup.d.ts.map +1 -0
  229. package/dist/integrations/autonomous_startup.js +419 -0
  230. package/dist/integrations/autonomous_startup.js.map +1 -0
  231. package/dist/integrations/goose.d.ts +105 -0
  232. package/dist/integrations/goose.d.ts.map +1 -0
  233. package/dist/integrations/goose.js +408 -0
  234. package/dist/integrations/goose.js.map +1 -0
  235. package/dist/integrations/index.d.ts +21 -0
  236. package/dist/integrations/index.d.ts.map +1 -0
  237. package/dist/integrations/index.js +17 -0
  238. package/dist/integrations/index.js.map +1 -0
  239. package/dist/integrations/mcp.d.ts +73 -0
  240. package/dist/integrations/mcp.d.ts.map +1 -0
  241. package/dist/integrations/mcp.js +307 -0
  242. package/dist/integrations/mcp.js.map +1 -0
  243. package/dist/integrations/mempalace.d.ts +18 -0
  244. package/dist/integrations/mempalace.d.ts.map +1 -0
  245. package/dist/integrations/mempalace.js +25 -0
  246. package/dist/integrations/mempalace.js.map +1 -0
  247. package/dist/integrations/multi_agent.d.ts +82 -0
  248. package/dist/integrations/multi_agent.d.ts.map +1 -0
  249. package/dist/integrations/multi_agent.js +280 -0
  250. package/dist/integrations/multi_agent.js.map +1 -0
  251. package/dist/integrations/unified_memory.d.ts +415 -0
  252. package/dist/integrations/unified_memory.d.ts.map +1 -0
  253. package/dist/integrations/unified_memory.js +1489 -0
  254. package/dist/integrations/unified_memory.js.map +1 -0
  255. package/dist/roles/beru.yaml +48 -0
  256. package/dist/sidecar/client.d.ts +63 -0
  257. package/dist/sidecar/client.d.ts.map +1 -0
  258. package/dist/sidecar/client.js +222 -0
  259. package/dist/sidecar/client.js.map +1 -0
  260. package/dist/sidecar/index.d.ts +7 -0
  261. package/dist/sidecar/index.d.ts.map +1 -0
  262. package/dist/sidecar/index.js +6 -0
  263. package/dist/sidecar/index.js.map +1 -0
  264. package/dist/startup.d.ts +22 -0
  265. package/dist/startup.d.ts.map +1 -0
  266. package/dist/startup.js +194 -0
  267. package/dist/startup.js.map +1 -0
  268. package/dist/tools/_internal.d.ts +90 -0
  269. package/dist/tools/_internal.d.ts.map +1 -0
  270. package/dist/tools/_internal.js +375 -0
  271. package/dist/tools/_internal.js.map +1 -0
  272. package/dist/tools/_smoke.d.ts +2 -0
  273. package/dist/tools/_smoke.d.ts.map +1 -0
  274. package/dist/tools/_smoke.js +203 -0
  275. package/dist/tools/_smoke.js.map +1 -0
  276. package/dist/tools/axodex_tools.d.ts +51 -0
  277. package/dist/tools/axodex_tools.d.ts.map +1 -0
  278. package/dist/tools/axodex_tools.js +181 -0
  279. package/dist/tools/axodex_tools.js.map +1 -0
  280. package/dist/tools/code_tools.d.ts +33 -0
  281. package/dist/tools/code_tools.d.ts.map +1 -0
  282. package/dist/tools/code_tools.js +191 -0
  283. package/dist/tools/code_tools.js.map +1 -0
  284. package/dist/tools/computer_tools.d.ts +59 -0
  285. package/dist/tools/computer_tools.d.ts.map +1 -0
  286. package/dist/tools/computer_tools.js +348 -0
  287. package/dist/tools/computer_tools.js.map +1 -0
  288. package/dist/tools/file_tools.d.ts +51 -0
  289. package/dist/tools/file_tools.d.ts.map +1 -0
  290. package/dist/tools/file_tools.js +424 -0
  291. package/dist/tools/file_tools.js.map +1 -0
  292. package/dist/tools/index.d.ts +13 -0
  293. package/dist/tools/index.d.ts.map +1 -0
  294. package/dist/tools/index.js +13 -0
  295. package/dist/tools/index.js.map +1 -0
  296. package/dist/tools/shell_tools.d.ts +39 -0
  297. package/dist/tools/shell_tools.d.ts.map +1 -0
  298. package/dist/tools/shell_tools.js +163 -0
  299. package/dist/tools/shell_tools.js.map +1 -0
  300. package/dist/tools/web_tools.d.ts +31 -0
  301. package/dist/tools/web_tools.d.ts.map +1 -0
  302. package/dist/tools/web_tools.js +117 -0
  303. package/dist/tools/web_tools.js.map +1 -0
  304. package/dist/voice/index.d.ts +41 -0
  305. package/dist/voice/index.d.ts.map +1 -0
  306. package/dist/voice/index.js +58 -0
  307. package/dist/voice/index.js.map +1 -0
  308. package/dist/voice/light_daemon.d.ts +197 -0
  309. package/dist/voice/light_daemon.d.ts.map +1 -0
  310. package/dist/voice/light_daemon.js +746 -0
  311. package/dist/voice/light_daemon.js.map +1 -0
  312. package/dist/voice/setup.d.ts +63 -0
  313. package/dist/voice/setup.d.ts.map +1 -0
  314. package/dist/voice/setup.js +443 -0
  315. package/dist/voice/setup.js.map +1 -0
  316. package/dist/voice/stt.d.ts +148 -0
  317. package/dist/voice/stt.d.ts.map +1 -0
  318. package/dist/voice/stt.js +361 -0
  319. package/dist/voice/stt.js.map +1 -0
  320. package/dist/voice/tts.d.ts +168 -0
  321. package/dist/voice/tts.d.ts.map +1 -0
  322. package/dist/voice/tts.js +698 -0
  323. package/dist/voice/tts.js.map +1 -0
  324. package/dist/voice/voice_loop.d.ts +101 -0
  325. package/dist/voice/voice_loop.d.ts.map +1 -0
  326. package/dist/voice/voice_loop.js +463 -0
  327. package/dist/voice/voice_loop.js.map +1 -0
  328. package/dist/voice/wake_word.d.ts +153 -0
  329. package/dist/voice/wake_word.d.ts.map +1 -0
  330. package/dist/voice/wake_word.js +458 -0
  331. package/dist/voice/wake_word.js.map +1 -0
  332. package/dist/voice/wav.d.ts +99 -0
  333. package/dist/voice/wav.d.ts.map +1 -0
  334. package/dist/voice/wav.js +306 -0
  335. package/dist/voice/wav.js.map +1 -0
  336. package/dist/web/broker.d.ts +33 -0
  337. package/dist/web/broker.d.ts.map +1 -0
  338. package/dist/web/broker.js +58 -0
  339. package/dist/web/broker.js.map +1 -0
  340. package/dist/web/open_browser.d.ts +2 -0
  341. package/dist/web/open_browser.d.ts.map +1 -0
  342. package/dist/web/open_browser.js +42 -0
  343. package/dist/web/open_browser.js.map +1 -0
  344. package/dist/web/server.d.ts +54 -0
  345. package/dist/web/server.d.ts.map +1 -0
  346. package/dist/web/server.js +831 -0
  347. package/dist/web/server.js.map +1 -0
  348. package/dist/web/static/app.js +4121 -0
  349. package/dist/web/static/index.html +2281 -0
  350. package/dist/web/static/js/MODULE_SUMMARY.md +124 -0
  351. package/dist/web/static/js/a11y.js +165 -0
  352. package/dist/web/static/js/admin.js +2145 -0
  353. package/dist/web/static/js/assistant.js +475 -0
  354. package/dist/web/static/js/calendar/reminders.js +114 -0
  355. package/dist/web/static/js/calendar/utils.js +166 -0
  356. package/dist/web/static/js/calendar.js +3348 -0
  357. package/dist/web/static/js/censor.js +356 -0
  358. package/dist/web/static/js/chat.js +4546 -0
  359. package/dist/web/static/js/chatRenderer.js +2294 -0
  360. package/dist/web/static/js/chatStream.js +276 -0
  361. package/dist/web/static/js/codeRunner.js +398 -0
  362. package/dist/web/static/js/color/hex.js +14 -0
  363. package/dist/web/static/js/colorPicker.js +453 -0
  364. package/dist/web/static/js/compare/icons.js +77 -0
  365. package/dist/web/static/js/compare/index.js +1482 -0
  366. package/dist/web/static/js/compare/models.js +104 -0
  367. package/dist/web/static/js/compare/panes.js +817 -0
  368. package/dist/web/static/js/compare/probe.js +78 -0
  369. package/dist/web/static/js/compare/scoreboard.js +223 -0
  370. package/dist/web/static/js/compare/selector.js +1335 -0
  371. package/dist/web/static/js/compare/state.js +58 -0
  372. package/dist/web/static/js/compare/stream.js +695 -0
  373. package/dist/web/static/js/compare/vote.js +254 -0
  374. package/dist/web/static/js/cookbook-diagnosis.js +694 -0
  375. package/dist/web/static/js/cookbook-hwfit.js +1888 -0
  376. package/dist/web/static/js/cookbook.js +2093 -0
  377. package/dist/web/static/js/cookbookDownload.js +633 -0
  378. package/dist/web/static/js/cookbookProgressSignal.js +29 -0
  379. package/dist/web/static/js/cookbookRunning.js +3506 -0
  380. package/dist/web/static/js/cookbookServe.js +2128 -0
  381. package/dist/web/static/js/document.js +9731 -0
  382. package/dist/web/static/js/documentLibrary.js +3376 -0
  383. package/dist/web/static/js/dragSort.js +265 -0
  384. package/dist/web/static/js/editor/ai-inpaint.js +374 -0
  385. package/dist/web/static/js/editor/ai-models.js +273 -0
  386. package/dist/web/static/js/editor/ai-rembg.js +230 -0
  387. package/dist/web/static/js/editor/ai-tool-runner.js +147 -0
  388. package/dist/web/static/js/editor/ai-tools-misc.js +216 -0
  389. package/dist/web/static/js/editor/build/controls.js +366 -0
  390. package/dist/web/static/js/editor/build/popups.js +112 -0
  391. package/dist/web/static/js/editor/build/right-panel.js +200 -0
  392. package/dist/web/static/js/editor/build/toolbar.js +73 -0
  393. package/dist/web/static/js/editor/build/topbar.js +131 -0
  394. package/dist/web/static/js/editor/build/transform-popup.js +109 -0
  395. package/dist/web/static/js/editor/canvas-coords.js +21 -0
  396. package/dist/web/static/js/editor/canvas-events.js +197 -0
  397. package/dist/web/static/js/editor/canvas-transforms.js +132 -0
  398. package/dist/web/static/js/editor/checkerboard.js +24 -0
  399. package/dist/web/static/js/editor/clipboard-and-drop.js +133 -0
  400. package/dist/web/static/js/editor/composite-helpers.js +83 -0
  401. package/dist/web/static/js/editor/filters/blur.js +118 -0
  402. package/dist/web/static/js/editor/filters/edge-feather.js +70 -0
  403. package/dist/web/static/js/editor/fx/adj-popup.js +677 -0
  404. package/dist/web/static/js/editor/fx/filter-string.js +38 -0
  405. package/dist/web/static/js/editor/fx/histogram.js +67 -0
  406. package/dist/web/static/js/editor/fx/pixel-pass.js +249 -0
  407. package/dist/web/static/js/editor/harmonize-masks.js +116 -0
  408. package/dist/web/static/js/editor/history-panel.js +176 -0
  409. package/dist/web/static/js/editor/keyboard-shortcuts.js +271 -0
  410. package/dist/web/static/js/editor/layer-helpers.js +131 -0
  411. package/dist/web/static/js/editor/layer-panel.js +600 -0
  412. package/dist/web/static/js/editor/mask-utils.js +91 -0
  413. package/dist/web/static/js/editor/shortcuts-popover.js +149 -0
  414. package/dist/web/static/js/editor/slider-ux.js +191 -0
  415. package/dist/web/static/js/editor/snap.js +107 -0
  416. package/dist/web/static/js/editor/state.js +257 -0
  417. package/dist/web/static/js/editor/stroke-pipeline.js +162 -0
  418. package/dist/web/static/js/editor/stroke-tool-sliders.js +64 -0
  419. package/dist/web/static/js/editor/tools/clone.js +81 -0
  420. package/dist/web/static/js/editor/tools/crop.js +137 -0
  421. package/dist/web/static/js/editor/tools/flood-fill.js +72 -0
  422. package/dist/web/static/js/editor/tools/lasso-mask.js +171 -0
  423. package/dist/web/static/js/editor/tools/lasso.js +65 -0
  424. package/dist/web/static/js/editor/tools/move.js +79 -0
  425. package/dist/web/static/js/editor/tools/stroke.js +123 -0
  426. package/dist/web/static/js/editor/tools/transform-drag.js +174 -0
  427. package/dist/web/static/js/editor/tools/transform-handles.js +271 -0
  428. package/dist/web/static/js/editor/tools/transform-session.js +381 -0
  429. package/dist/web/static/js/editor/tools/wand.js +46 -0
  430. package/dist/web/static/js/editor/wire-import.js +148 -0
  431. package/dist/web/static/js/editor/wire-inpaint-controls.js +164 -0
  432. package/dist/web/static/js/editor/wire-merge-buttons.js +103 -0
  433. package/dist/web/static/js/editor/wire-selection-controls.js +170 -0
  434. package/dist/web/static/js/editor/wire-topbar-menus.js +174 -0
  435. package/dist/web/static/js/editor/wire-topbar-overflow.js +49 -0
  436. package/dist/web/static/js/editor/wire-topbar.js +188 -0
  437. package/dist/web/static/js/emailInbox.js +1245 -0
  438. package/dist/web/static/js/emailLibrary/replyRecipients.js +27 -0
  439. package/dist/web/static/js/emailLibrary/signatureFold.js +339 -0
  440. package/dist/web/static/js/emailLibrary/state.js +34 -0
  441. package/dist/web/static/js/emailLibrary/utils.js +202 -0
  442. package/dist/web/static/js/emailLibrary.js +5217 -0
  443. package/dist/web/static/js/emojiPicker.js +311 -0
  444. package/dist/web/static/js/escMenuStack.js +102 -0
  445. package/dist/web/static/js/fileHandler.js +295 -0
  446. package/dist/web/static/js/gallery.js +2835 -0
  447. package/dist/web/static/js/galleryEditor.js +3798 -0
  448. package/dist/web/static/js/group.js +955 -0
  449. package/dist/web/static/js/init.js +405 -0
  450. package/dist/web/static/js/keyboard-shortcuts.js +292 -0
  451. package/dist/web/static/js/langIcons.js +187 -0
  452. package/dist/web/static/js/markdown/tableRow.js +19 -0
  453. package/dist/web/static/js/markdown.js +806 -0
  454. package/dist/web/static/js/memory.js +1418 -0
  455. package/dist/web/static/js/modalManager.js +1552 -0
  456. package/dist/web/static/js/modalSnap.js +782 -0
  457. package/dist/web/static/js/model/matchKey.js +19 -0
  458. package/dist/web/static/js/modelPicker.js +695 -0
  459. package/dist/web/static/js/modelSort.js +33 -0
  460. package/dist/web/static/js/models.js +642 -0
  461. package/dist/web/static/js/notes.js +5054 -0
  462. package/dist/web/static/js/package.json +1 -0
  463. package/dist/web/static/js/platform.js +47 -0
  464. package/dist/web/static/js/presets.js +1110 -0
  465. package/dist/web/static/js/providers.js +93 -0
  466. package/dist/web/static/js/rag.js +177 -0
  467. package/dist/web/static/js/research/jobs.js +335 -0
  468. package/dist/web/static/js/research/panel.js +1233 -0
  469. package/dist/web/static/js/researchSynapse.js +225 -0
  470. package/dist/web/static/js/search-chat.js +201 -0
  471. package/dist/web/static/js/search.js +52 -0
  472. package/dist/web/static/js/section-management.js +260 -0
  473. package/dist/web/static/js/sessions.js +3108 -0
  474. package/dist/web/static/js/settings.js +4991 -0
  475. package/dist/web/static/js/sidebar-layout.js +573 -0
  476. package/dist/web/static/js/signature.js +504 -0
  477. package/dist/web/static/js/skills.js +1908 -0
  478. package/dist/web/static/js/slashAutocomplete.js +267 -0
  479. package/dist/web/static/js/slashCommands.js +6099 -0
  480. package/dist/web/static/js/spinner.js +406 -0
  481. package/dist/web/static/js/storage.js +123 -0
  482. package/dist/web/static/js/tasks.js +2699 -0
  483. package/dist/web/static/js/theme.js +2086 -0
  484. package/dist/web/static/js/tileManager.js +386 -0
  485. package/dist/web/static/js/tourAutoplay.js +133 -0
  486. package/dist/web/static/js/tourHints.js +179 -0
  487. package/dist/web/static/js/tts-ai.js +521 -0
  488. package/dist/web/static/js/ui.js +1288 -0
  489. package/dist/web/static/js/util/ordinal.js +13 -0
  490. package/dist/web/static/js/voiceRecorder.js +283 -0
  491. package/dist/web/static/js/windowDrag.js +326 -0
  492. package/dist/web/static/js/windowResize.js +233 -0
  493. package/dist/web/static/landing.html +824 -0
  494. package/dist/web/static/lib/docx.umd.min.js +20116 -0
  495. package/dist/web/static/lib/highlight.min.js +1213 -0
  496. package/dist/web/static/lib/html2pdf.bundle.min.js +3 -0
  497. package/dist/web/static/lib/mammoth.browser.min.js +21 -0
  498. package/dist/web/static/lib/qrcode.min.js +8 -0
  499. package/dist/web/static/lib/xlsx.full.min.js +24 -0
  500. package/dist/web/static/login.html +582 -0
  501. package/dist/web/static/manifest.json +15 -0
  502. package/dist/web/static/style.css +35733 -0
  503. package/dist/web/static/sw.js +144 -0
  504. package/dist/workflows/engine.d.ts +162 -0
  505. package/dist/workflows/engine.d.ts.map +1 -0
  506. package/dist/workflows/engine.js +625 -0
  507. package/dist/workflows/engine.js.map +1 -0
  508. package/dist/workflows/index.d.ts +8 -0
  509. package/dist/workflows/index.d.ts.map +1 -0
  510. package/dist/workflows/index.js +14 -0
  511. package/dist/workflows/index.js.map +1 -0
  512. package/package.json +112 -0
@@ -0,0 +1,381 @@
1
+ /**
2
+ * Transform-tool session lifecycle + floating popup wiring.
3
+ *
4
+ * _startTransform snapshot the active layer + open popup
5
+ * _openTransformPopup build the W/H/rotation popup, wire inputs
6
+ * _wireTransformDrag header drag, mobile + desktop position handling
7
+ * _reapplyTransform live preview re-render from the snapshot
8
+ * _confirmTransform commit + clear session state
9
+ * _cancelTransform restore via undo() + clear session state
10
+ *
11
+ * Handle-drag interactions on the CANVAS (corner / rotation grip) live
12
+ * in `editor/tools/transform-drag.js` — those mutate the same staged
13
+ * `state.transformPending*` fields that the popup inputs do, so both
14
+ * surfaces stay in sync via `_reapplyTransform()`.
15
+ *
16
+ * @param {{
17
+ * activeLayer: () => object | null,
18
+ * saveState: (label?: string) => void,
19
+ * composite: () => void,
20
+ * fitZoom: () => void,
21
+ * drawTransformHandles: () => void,
22
+ * showCanvasLoading: (label: string) => void,
23
+ * hideCanvasLoading: () => void,
24
+ * undo: () => void,
25
+ * uiModule: object | null,
26
+ * }} deps
27
+ *
28
+ * @returns {{
29
+ * startTransform, openTransformPopup, closeTransformPopup,
30
+ * reapplyTransform, confirmTransform, cancelTransform,
31
+ * }}
32
+ */
33
+ import { state } from '../state.js';
34
+ import {
35
+ transformPopupHTML,
36
+ attachSpinRepeat,
37
+ } from '../build/transform-popup.js';
38
+
39
+ export function createTransformSession({
40
+ activeLayer, saveState, composite, fitZoom, drawTransformHandles,
41
+ showCanvasLoading, hideCanvasLoading, undo, uiModule,
42
+ }) {
43
+ function startTransform() {
44
+ const layer = activeLayer();
45
+ if (!layer || layer.locked) { uiModule.showToast('Select an unlocked layer'); return; }
46
+ if (state.transformActive) { cancelTransform(); return; } // toggle off
47
+ state.transformActive = true;
48
+ state.transformLayer = layer;
49
+ state.transformOrigW = layer.canvas.width;
50
+ state.transformOrigH = layer.canvas.height;
51
+ state.transformPendingW = state.transformOrigW;
52
+ state.transformPendingH = state.transformOrigH;
53
+ state.transformPendingRot = 0;
54
+ state.transformPendingFlipH = false;
55
+ state.transformPendingFlipV = false;
56
+ // Snapshot the layer so live preview can re-derive from the
57
+ // original pixels on every keystroke instead of stacking
58
+ // destructive edits.
59
+ state.transformOrigCanvas = document.createElement('canvas');
60
+ state.transformOrigCanvas.width = state.transformOrigW;
61
+ state.transformOrigCanvas.height = state.transformOrigH;
62
+ state.transformOrigCanvas.getContext('2d').drawImage(layer.canvas, 0, 0);
63
+ state.transformOrigOffset = { ...(state.layerOffsets.get(layer.id) || { x: 0, y: 0 }) };
64
+ saveState();
65
+ // Fit canvas to viewport so the corner handles are visible —
66
+ // without this, a layer larger than the viewport leaves the grab
67
+ // markers off-screen.
68
+ try { fitZoom(); } catch {}
69
+ composite();
70
+ drawTransformHandles();
71
+ openTransformPopup();
72
+ }
73
+
74
+ function closeTransformPopup() {
75
+ if (state.transformPopup) {
76
+ try { state.transformPopup.remove(); } catch {}
77
+ state.transformPopup = null;
78
+ }
79
+ }
80
+
81
+ // Floating Transform popup — horizontal layout, draggable via its
82
+ // header, anchored over the right panel (layers area) by default
83
+ // so it doesn't cover the canvas. Lets the user type exact W/H/Rot
84
+ // and flip via negative values.
85
+ function openTransformPopup() {
86
+ closeTransformPopup();
87
+ if (!state.container) return;
88
+ const pop = document.createElement('div');
89
+ pop.className = 'ge-transform-popup';
90
+ pop.innerHTML = transformPopupHTML();
91
+ state.container.appendChild(pop);
92
+ state.transformPopup = pop;
93
+ wireTransformDrag(pop);
94
+ const wInput = pop.querySelector('#ge-transform-w');
95
+ const hInput = pop.querySelector('#ge-transform-h');
96
+ const rotInput = pop.querySelector('#ge-transform-rot');
97
+ const aspectBtn = pop.querySelector('#ge-transform-aspect');
98
+ wInput.value = String(state.transformOrigW);
99
+ hInput.value = String(state.transformOrigH);
100
+ rotInput.value = '0';
101
+ aspectBtn.classList.toggle('active', state.transformAspectLock);
102
+ aspectBtn.setAttribute('aria-pressed', state.transformAspectLock ? 'true' : 'false');
103
+
104
+ // Aspect-lock follower model: while the lock is engaged, ONE
105
+ // field is the "driver" and the other is read-only + dimmed.
106
+ // Driver = whichever field the user last typed in. Toggling the
107
+ // chain releases the follower.
108
+ let driver = null;
109
+ const applyAspectVisuals = () => {
110
+ if (!state.transformAspectLock || !driver) {
111
+ wInput.readOnly = false;
112
+ hInput.readOnly = false;
113
+ wInput.classList.remove('ge-transform-input-locked');
114
+ hInput.classList.remove('ge-transform-input-locked');
115
+ return;
116
+ }
117
+ const followerW = driver === 'h';
118
+ const followerH = driver === 'w';
119
+ wInput.readOnly = followerW;
120
+ hInput.readOnly = followerH;
121
+ wInput.classList.toggle('ge-transform-input-locked', followerW);
122
+ hInput.classList.toggle('ge-transform-input-locked', followerH);
123
+ };
124
+ const refresh = () => {
125
+ let w = parseInt(wInput.value, 10);
126
+ let h = parseInt(hInput.value, 10);
127
+ const rot = parseInt(rotInput.value, 10) || 0;
128
+ state.transformPendingFlipH = w < 0;
129
+ state.transformPendingFlipV = h < 0;
130
+ w = Math.abs(w || state.transformOrigW);
131
+ h = Math.abs(h || state.transformOrigH);
132
+ state.transformPendingW = Math.max(1, w);
133
+ state.transformPendingH = Math.max(1, h);
134
+ state.transformPendingRot = rot;
135
+ reapplyTransform();
136
+ };
137
+ wInput.addEventListener('input', () => {
138
+ if (state.transformAspectLock) {
139
+ driver = 'w';
140
+ const w = parseInt(wInput.value, 10);
141
+ if (!Number.isNaN(w) && state.transformOrigW > 0) {
142
+ const sign = (parseInt(hInput.value, 10) || 1) < 0 ? -1 : 1;
143
+ const newH = Math.round((Math.abs(w) / state.transformOrigW) * state.transformOrigH) * sign;
144
+ hInput.value = String(newH);
145
+ }
146
+ applyAspectVisuals();
147
+ }
148
+ refresh();
149
+ });
150
+ hInput.addEventListener('input', () => {
151
+ if (state.transformAspectLock) {
152
+ driver = 'h';
153
+ const h = parseInt(hInput.value, 10);
154
+ if (!Number.isNaN(h) && state.transformOrigH > 0) {
155
+ const sign = (parseInt(wInput.value, 10) || 1) < 0 ? -1 : 1;
156
+ const newW = Math.round((Math.abs(h) / state.transformOrigH) * state.transformOrigW) * sign;
157
+ wInput.value = String(newW);
158
+ }
159
+ applyAspectVisuals();
160
+ }
161
+ refresh();
162
+ });
163
+ rotInput.addEventListener('input', refresh);
164
+ aspectBtn.addEventListener('click', () => {
165
+ state.transformAspectLock = !state.transformAspectLock;
166
+ aspectBtn.classList.toggle('active', state.transformAspectLock);
167
+ aspectBtn.setAttribute('aria-pressed', state.transformAspectLock ? 'true' : 'false');
168
+ // Reset follower the moment the user breaks the lock so both
169
+ // fields go editable; re-engaging means "next type sets the driver".
170
+ driver = null;
171
+ applyAspectVisuals();
172
+ });
173
+ pop.querySelector('#ge-transform-apply').addEventListener('click', () => confirmTransform());
174
+ pop.querySelector('#ge-transform-cancel').addEventListener('click', () => cancelTransform());
175
+ pop.querySelector('#ge-transform-cancel-btn')?.addEventListener('click', () => cancelTransform());
176
+ // Minimise — collapses the body so only the header is visible.
177
+ pop.querySelector('#ge-transform-min')?.addEventListener('click', (e) => {
178
+ e.stopPropagation();
179
+ pop.classList.toggle('ge-transform-popup-minimised');
180
+ });
181
+ // Quick actions: flip W/H via sign so the reapply pipeline picks
182
+ // up the new orientation. Rotate-90 nudges rotation ±90°.
183
+ pop.querySelector('#ge-transform-flip-h')?.addEventListener('click', () => {
184
+ const wIn = pop.querySelector('#ge-transform-w');
185
+ const cur = parseInt(wIn.value, 10) || state.transformOrigW;
186
+ wIn.value = String(-cur);
187
+ wIn.dispatchEvent(new Event('input', { bubbles: true }));
188
+ });
189
+ pop.querySelector('#ge-transform-flip-v')?.addEventListener('click', () => {
190
+ const hIn = pop.querySelector('#ge-transform-h');
191
+ const cur = parseInt(hIn.value, 10) || state.transformOrigH;
192
+ hIn.value = String(-cur);
193
+ hIn.dispatchEvent(new Event('input', { bubbles: true }));
194
+ });
195
+ pop.querySelector('#ge-transform-rot-90')?.addEventListener('click', (e) => {
196
+ const rIn = pop.querySelector('#ge-transform-rot');
197
+ const cur = parseInt(rIn.value, 10) || 0;
198
+ const delta = e.shiftKey ? -90 : 90;
199
+ let next = cur + delta;
200
+ while (next > 180) next -= 360;
201
+ while (next <= -180) next += 360;
202
+ rIn.value = String(next);
203
+ // Big images: rotation pass blocks UI ~0.5–2 s. Show a spinner
204
+ // so the user sees something happen. rAF defers the heavy work
205
+ // past the current frame so the overlay paints first.
206
+ showCanvasLoading('Rotating…');
207
+ requestAnimationFrame(() => {
208
+ try { rIn.dispatchEvent(new Event('input', { bubbles: true })); }
209
+ finally { hideCanvasLoading(); }
210
+ });
211
+ });
212
+ attachSpinRepeat(pop);
213
+ }
214
+
215
+ // Header-drag for the Transform popup. Default position: over the
216
+ // right panel (layers area). Mobile pins via stylesheet so we use
217
+ // setProperty 'important' to override during drag.
218
+ function wireTransformDrag(pop) {
219
+ const isMobile = window.matchMedia('(max-width: 820px)').matches;
220
+ const defaultRight = 20;
221
+ const defaultTop = 60;
222
+ if (isMobile) {
223
+ pop.style.setProperty('position', 'fixed', 'important');
224
+ } else {
225
+ pop.style.position = 'absolute';
226
+ pop.style.right = defaultRight + 'px';
227
+ pop.style.top = defaultTop + 'px';
228
+ pop.style.left = 'auto';
229
+ }
230
+ const dragSource = pop.querySelector('[data-transform-drag]') || pop;
231
+ let dragging = false;
232
+ let startX = 0, startY = 0, originLeft = 0, originTop = 0;
233
+ const NON_DRAG = 'input,button,select,textarea,a,[contenteditable]';
234
+
235
+ const setPos = (x, y) => {
236
+ if (isMobile) {
237
+ pop.style.setProperty('left', x + 'px', 'important');
238
+ pop.style.setProperty('top', y + 'px', 'important');
239
+ pop.style.setProperty('right', 'auto', 'important');
240
+ pop.style.setProperty('bottom', 'auto', 'important');
241
+ pop.style.setProperty('width', 'auto', 'important');
242
+ pop.style.setProperty('max-width', 'calc(100vw - 16px)', 'important');
243
+ } else {
244
+ pop.style.left = x + 'px';
245
+ pop.style.top = y + 'px';
246
+ pop.style.right = 'auto';
247
+ }
248
+ };
249
+
250
+ const beginDrag = (clientX, clientY) => {
251
+ dragging = true;
252
+ const rect = pop.getBoundingClientRect();
253
+ if (isMobile) {
254
+ originLeft = rect.left;
255
+ originTop = rect.top;
256
+ } else {
257
+ const parentRect = state.container.getBoundingClientRect();
258
+ originLeft = rect.left - parentRect.left;
259
+ originTop = rect.top - parentRect.top;
260
+ }
261
+ startX = clientX;
262
+ startY = clientY;
263
+ setPos(originLeft, originTop);
264
+ pop.classList.add('ge-transform-popup-dragging');
265
+ document.body.style.userSelect = 'none';
266
+ };
267
+
268
+ const moveDrag = (clientX, clientY) => {
269
+ if (!dragging) return;
270
+ const dx = clientX - startX;
271
+ const dy = clientY - startY;
272
+ let nx = originLeft + dx;
273
+ let ny = originTop + dy;
274
+ if (isMobile) {
275
+ const rect = pop.getBoundingClientRect();
276
+ nx = Math.max(0, Math.min(window.innerWidth - rect.width, nx));
277
+ ny = Math.max(0, Math.min(window.innerHeight - rect.height, ny));
278
+ }
279
+ setPos(nx, ny);
280
+ };
281
+
282
+ const endDrag = () => {
283
+ if (!dragging) return;
284
+ dragging = false;
285
+ document.body.style.userSelect = '';
286
+ pop.classList.remove('ge-transform-popup-dragging');
287
+ };
288
+
289
+ dragSource.addEventListener('mousedown', (e) => {
290
+ if (e.target.closest(NON_DRAG)) return;
291
+ e.preventDefault();
292
+ beginDrag(e.clientX, e.clientY);
293
+ });
294
+ document.addEventListener('mousemove', (e) => moveDrag(e.clientX, e.clientY));
295
+ document.addEventListener('mouseup', endDrag);
296
+
297
+ dragSource.addEventListener('touchstart', (e) => {
298
+ if (e.target.closest(NON_DRAG)) return;
299
+ if (!e.touches || e.touches.length !== 1) return;
300
+ e.preventDefault();
301
+ beginDrag(e.touches[0].clientX, e.touches[0].clientY);
302
+ }, { passive: false });
303
+ document.addEventListener('touchmove', (e) => {
304
+ if (!dragging) return;
305
+ if (!e.touches || e.touches.length !== 1) return;
306
+ e.preventDefault();
307
+ moveDrag(e.touches[0].clientX, e.touches[0].clientY);
308
+ }, { passive: false });
309
+ document.addEventListener('touchend', endDrag);
310
+ document.addEventListener('touchcancel', endDrag);
311
+ }
312
+
313
+ // Re-derive the active layer's pixels from the original snapshot
314
+ // with the popup's current W/H/flip/rotation applied. Cheap —
315
+ // paints into an off-screen canvas of the final size.
316
+ function reapplyTransform() {
317
+ const layer = state.transformLayer;
318
+ if (!layer || !state.transformOrigCanvas) return;
319
+ const w = state.transformPendingW;
320
+ const h = state.transformPendingH;
321
+ const rotDeg = state.transformPendingRot;
322
+ const rotRad = (rotDeg * Math.PI) / 180;
323
+ const cos = Math.abs(Math.cos(rotRad));
324
+ const sin = Math.abs(Math.sin(rotRad));
325
+ // Bounding box of the rotated W×H — canvas grows so corners
326
+ // don't clip.
327
+ const finalW = Math.max(1, Math.round(w * cos + h * sin));
328
+ const finalH = Math.max(1, Math.round(w * sin + h * cos));
329
+ const tmp = document.createElement('canvas');
330
+ tmp.width = finalW; tmp.height = finalH;
331
+ const tCtx = tmp.getContext('2d');
332
+ tCtx.imageSmoothingEnabled = true;
333
+ tCtx.imageSmoothingQuality = 'high';
334
+ tCtx.save();
335
+ tCtx.translate(finalW / 2, finalH / 2);
336
+ if (rotDeg) tCtx.rotate(rotRad);
337
+ tCtx.scale(state.transformPendingFlipH ? -1 : 1, state.transformPendingFlipV ? -1 : 1);
338
+ tCtx.drawImage(state.transformOrigCanvas, -w / 2, -h / 2, w, h);
339
+ tCtx.restore();
340
+ layer.canvas.width = finalW;
341
+ layer.canvas.height = finalH;
342
+ layer.ctx.clearRect(0, 0, finalW, finalH);
343
+ layer.ctx.drawImage(tmp, 0, 0);
344
+ // Recenter the layer so the rotation pivot stays put visually.
345
+ const origCenterX = state.transformOrigOffset.x + state.transformOrigW / 2;
346
+ const origCenterY = state.transformOrigOffset.y + state.transformOrigH / 2;
347
+ state.layerOffsets.set(layer.id, {
348
+ x: Math.round(origCenterX - finalW / 2),
349
+ y: Math.round(origCenterY - finalH / 2),
350
+ });
351
+ composite();
352
+ drawTransformHandles();
353
+ }
354
+
355
+ function confirmTransform() {
356
+ closeTransformPopup();
357
+ state.transformOrigCanvas = null;
358
+ state.transformOrigOffset = null;
359
+ state.transformActive = false;
360
+ state.transformLayer = null;
361
+ state.transformHandle = null;
362
+ composite();
363
+ uiModule.showToast('Transform applied');
364
+ }
365
+
366
+ function cancelTransform() {
367
+ closeTransformPopup();
368
+ state.transformOrigCanvas = null;
369
+ state.transformOrigOffset = null;
370
+ if (state.transformLayer) undo(); // restore saved state
371
+ state.transformActive = false;
372
+ state.transformLayer = null;
373
+ state.transformHandle = null;
374
+ composite();
375
+ }
376
+
377
+ return {
378
+ startTransform, openTransformPopup, closeTransformPopup,
379
+ reapplyTransform, confirmTransform, cancelTransform,
380
+ };
381
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Magic-wand tool — single-click flood-fill selection on the active
3
+ * layer's pixels. Shift/Alt modifiers override the persistent mode
4
+ * toggle for the duration of the click (add / subtract).
5
+ *
6
+ * Clicking inside an existing selection with no modifier deselects.
7
+ *
8
+ * Wand is selection-only — it doesn't mutate the layer until the user
9
+ * invokes an action (Erase / Copy / etc.) from the panel. That's why
10
+ * it has just a `click` handler instead of begin/drag/end.
11
+ *
12
+ * @param {{
13
+ * activeLayer: () => object | null,
14
+ * saveState: () => void,
15
+ * composite: () => void,
16
+ * wandHits: (cx: number, cy: number) => boolean,
17
+ * runMagicWand: (cx: number, cy: number, mode: 'replace'|'add'|'subtract') => void,
18
+ * }} deps
19
+ */
20
+ import { state } from '../state.js';
21
+ import { canvasCoords } from '../canvas-coords.js';
22
+
23
+ export function createWandTool({ activeLayer, saveState, composite, wandHits, runMagicWand }) {
24
+ return {
25
+ click(e) {
26
+ const layer = activeLayer();
27
+ if (!layer) return;
28
+ const coords = canvasCoords(e, state.mainCanvas);
29
+ // Persistent toggle sets the default mode; Shift forces add, Alt
30
+ // forces subtract regardless of the toggle (modifiers always win).
31
+ let mode = state.wandMode || 'replace';
32
+ if (e.shiftKey) mode = 'add';
33
+ else if (e.altKey) mode = 'subtract';
34
+ // Click INSIDE the existing selection with no modifier → deselect.
35
+ if (mode === 'replace' && wandHits(coords.x, coords.y)) {
36
+ saveState();
37
+ state.wandMask = null;
38
+ state.wandLayerId = null;
39
+ state.wandLastSeed = null;
40
+ composite();
41
+ return;
42
+ }
43
+ runMagicWand(coords.x, coords.y, mode);
44
+ },
45
+ };
46
+ }
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Image-import wiring — covers all four entry points that drop an
3
+ * image as a new layer:
4
+ *
5
+ * #ge-import-topbar topbar "+ Import" button
6
+ * #ge-import-file File button in the Import section
7
+ * #ge-import-paste Clipboard button (uses async clipboard API)
8
+ * #ge-import-gallery Gallery picker — fetches /api/gallery/library
9
+ * and shows a thumbnail grid overlay
10
+ *
11
+ * Plus the shared `handleImportedImage(img)` sink — scales to canvas,
12
+ * centres, creates a new layer, switches to Move tool, hides the
13
+ * import section, refreshes the panel. Returned so the drag-and-drop
14
+ * + paste paths (wired in editor/clipboard-and-drop.js) can use the
15
+ * same sink.
16
+ *
17
+ * @param {{
18
+ * container: HTMLElement,
19
+ * saveState: (label?: string) => void,
20
+ * createLayer: (name, w, h) => object,
21
+ * composite: () => void,
22
+ * renderLayerPanel: () => void,
23
+ * uiModule: object,
24
+ * }} deps
25
+ *
26
+ * @returns {{ handleImportedImage: (img: HTMLImageElement) => void }}
27
+ */
28
+ import { state } from './state.js';
29
+
30
+ export function wireImport({ container, saveState, createLayer, composite, renderLayerPanel, uiModule }) {
31
+ // Hidden <input type="file"> the topbar + File buttons both click.
32
+ const importFileInput = document.createElement('input');
33
+ importFileInput.type = 'file';
34
+ importFileInput.accept = 'image/*';
35
+ importFileInput.style.display = 'none';
36
+ container.appendChild(importFileInput);
37
+
38
+ function handleImportedImage(img) {
39
+ if (!state.editorOpen) return;
40
+ saveState('Import image');
41
+ // Scale down if larger than canvas.
42
+ let w = img.naturalWidth || img.width;
43
+ let h = img.naturalHeight || img.height;
44
+ if (w > state.imgWidth || h > state.imgHeight) {
45
+ const scale = Math.min(state.imgWidth / w, state.imgHeight / h);
46
+ w = Math.round(w * scale);
47
+ h = Math.round(h * scale);
48
+ }
49
+ const layer = createLayer('Imported', state.imgWidth, state.imgHeight);
50
+ // Centre on the canvas.
51
+ const ox = Math.round((state.imgWidth - w) / 2);
52
+ const oy = Math.round((state.imgHeight - h) / 2);
53
+ layer.ctx.drawImage(img, ox, oy, w, h);
54
+ state.layers.push(layer);
55
+ state.activeLayerId = layer.id;
56
+ // Switch to move tool so the imported layer is immediately
57
+ // repositionable.
58
+ state.tool = 'move';
59
+ const tb = container.querySelector('.ge-toolbar');
60
+ if (tb) tb.querySelectorAll('.ge-tool-btn').forEach(b => b.classList.toggle('active', b.dataset.tool === 'move'));
61
+ // Hide the import section now that the import is done.
62
+ const importSec = document.getElementById('ge-import-section');
63
+ if (importSec) importSec.style.display = 'none';
64
+ composite();
65
+ renderLayerPanel();
66
+ if (uiModule) uiModule.showToast('Image imported — drag to position');
67
+ }
68
+
69
+ importFileInput.addEventListener('change', (e) => {
70
+ const file = e.target.files[0];
71
+ if (!file) return;
72
+ const reader = new FileReader();
73
+ reader.onload = (ev) => {
74
+ const img = new Image();
75
+ img.onload = () => handleImportedImage(img);
76
+ img.src = ev.target.result;
77
+ };
78
+ reader.readAsDataURL(file);
79
+ importFileInput.value = '';
80
+ });
81
+
82
+ document.getElementById('ge-import-topbar')?.addEventListener('click', () => importFileInput.click());
83
+ document.getElementById('ge-import-file')?.addEventListener('click', () => importFileInput.click());
84
+
85
+ document.getElementById('ge-import-paste')?.addEventListener('click', async () => {
86
+ try {
87
+ const clipItems = await navigator.clipboard.read();
88
+ let blob = null;
89
+ for (const item of clipItems) {
90
+ const imgType = item.types.find(t => t.startsWith('image/'));
91
+ if (imgType) { blob = await item.getType(imgType); break; }
92
+ }
93
+ if (!blob) { if (uiModule) uiModule.showToast('No image found in clipboard'); return; }
94
+ const url = URL.createObjectURL(blob);
95
+ const img = new Image();
96
+ img.onload = () => { handleImportedImage(img); URL.revokeObjectURL(url); };
97
+ img.onerror = () => { URL.revokeObjectURL(url); if (uiModule) uiModule.showToast('Failed to load clipboard image'); };
98
+ img.src = url;
99
+ } catch (e) {
100
+ if (uiModule) uiModule.showToast('Clipboard access denied or no image available');
101
+ }
102
+ });
103
+
104
+ // Import from Gallery — fetch /api/gallery/library and show a
105
+ // thumbnail-grid picker overlay.
106
+ document.getElementById('ge-import-gallery')?.addEventListener('click', async () => {
107
+ try {
108
+ const res = await fetch('/api/gallery/library?limit=50', { credentials: 'same-origin' });
109
+ const data = await res.json();
110
+ const items = data.items || [];
111
+ if (!items.length) { if (uiModule) uiModule.showToast('No images in gallery'); return; }
112
+
113
+ // Picker overlay.
114
+ const overlay = document.createElement('div');
115
+ overlay.style.cssText = 'position:fixed;inset:0;z-index:10001;background:rgba(0,0,0,0.7);display:flex;align-items:center;justify-content:center;';
116
+ const panel = document.createElement('div');
117
+ panel.style.cssText = 'background:var(--panel,#1e1e1e);border-radius:12px;padding:16px;max-width:500px;max-height:70vh;overflow-y:auto;width:90%;';
118
+ panel.innerHTML = '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;"><span style="font-size:13px;font-weight:600;">Pick from Gallery</span><button id="ge-gallery-close" style="background:none;border:none;color:var(--fg);cursor:pointer;font-size:18px;">✕</button></div>';
119
+ const grid = document.createElement('div');
120
+ grid.style.cssText = 'display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:6px;';
121
+ for (const item of items) {
122
+ const thumb = document.createElement('img');
123
+ thumb.src = item.url;
124
+ thumb.style.cssText = 'width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;cursor:pointer;border:2px solid transparent;transition:border-color 0.15s;';
125
+ thumb.addEventListener('mouseenter', () => { thumb.style.borderColor = 'var(--accent,#61afef)'; });
126
+ thumb.addEventListener('mouseleave', () => { thumb.style.borderColor = 'transparent'; });
127
+ thumb.addEventListener('click', () => {
128
+ overlay.remove();
129
+ const img = new Image();
130
+ img.crossOrigin = 'anonymous';
131
+ img.onload = () => handleImportedImage(img);
132
+ img.onerror = () => { if (uiModule) uiModule.showToast('Failed to load gallery image'); };
133
+ img.src = item.url;
134
+ });
135
+ grid.appendChild(thumb);
136
+ }
137
+ panel.appendChild(grid);
138
+ overlay.appendChild(panel);
139
+ document.body.appendChild(overlay);
140
+ overlay.addEventListener('click', (e) => { if (e.target === overlay) overlay.remove(); });
141
+ panel.querySelector('#ge-gallery-close').addEventListener('click', () => overlay.remove());
142
+ } catch (e) {
143
+ if (uiModule) uiModule.showToast('Failed to load gallery: ' + e.message);
144
+ }
145
+ });
146
+
147
+ return { handleImportedImage };
148
+ }