@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,271 @@
1
+ /**
2
+ * Editor keyboard shortcuts — bound to `document` so shortcuts work
3
+ * without first clicking into the canvas. Gated by `state.editorOpen`
4
+ * so they don't leak into chat input when the editor is closed.
5
+ *
6
+ * Covers:
7
+ * ? toggle the shortcuts cheatsheet
8
+ * Enter confirm in-progress transform
9
+ * Esc cancel transform / lasso / crop (in priority order)
10
+ * Ctrl+Z undo (Shift adds redo)
11
+ * Ctrl+Shift+D deselect (clears wand + lasso)
12
+ * Ctrl+S save (Shift = save as / export to gallery)
13
+ * Ctrl+Shift+T open resize popup
14
+ * Ctrl+Alt+T start free transform
15
+ * Ctrl+Alt+I invert wand / lasso selection
16
+ * Ctrl+Alt+J new empty layer
17
+ * Ctrl+Alt+A select all canvas (lasso polygon = full bounds)
18
+ * Ctrl+C/X copy / cut wand or lasso selection (image clipboard
19
+ * + internal clipboard)
20
+ * Ctrl+V (handled by the paste event listener)
21
+ * Tool keys (V, B, E, L, …) → toolbar click
22
+ * [ / ] shrink / grow brush size proportionally
23
+ * D, C, M (when lasso has 3+ points) → delete / copy / convert mask
24
+ * Delete / Backspace (wand or lasso) → delete pixels
25
+ *
26
+ * @param {{
27
+ * toolbar: HTMLDivElement,
28
+ * toolKeyMap: Record<string, string>,
29
+ * composite: () => void,
30
+ * saveState: (label?: string) => void,
31
+ * undo: () => void,
32
+ * redo: () => void,
33
+ * toggleShortcuts: (show?: boolean) => void,
34
+ * confirmTransform: () => void,
35
+ * cancelTransform: () => void,
36
+ * startTransform: () => void,
37
+ * resizeCustomPrompt: () => void,
38
+ * addEmptyLayer: () => void,
39
+ * brushSizeSync: (source: HTMLInputElement | null) => void,
40
+ * invertSelection: () => boolean,
41
+ * wandDeleteSelection: () => void,
42
+ * wandCopyToNewLayer: () => void,
43
+ * lassoDeleteSelection: () => void,
44
+ * lassoCopyToLayer: () => void,
45
+ * lassoToMask: () => void,
46
+ * buildLassoMask: (w: number, h: number, offX: number, offY: number, feather: number, grow: number) => HTMLCanvasElement,
47
+ * drawLassoOverlay: () => void,
48
+ * activeLayer: () => object | null,
49
+ * uiModule: object,
50
+ * }} deps
51
+ */
52
+ import { state } from './state.js';
53
+ import { isAltGrEvent } from '../platform.js';
54
+
55
+ export function wireKeyboardShortcuts(deps) {
56
+ const {
57
+ toolbar, toolKeyMap,
58
+ composite, saveState, undo, redo,
59
+ toggleShortcuts, confirmTransform, cancelTransform, startTransform,
60
+ resizeCustomPrompt, addEmptyLayer, brushSizeSync,
61
+ invertSelection,
62
+ wandDeleteSelection, wandCopyToNewLayer,
63
+ lassoDeleteSelection, lassoCopyToLayer, lassoToMask,
64
+ buildLassoMask, drawLassoOverlay,
65
+ activeLayer, uiModule,
66
+ } = deps;
67
+
68
+ document.addEventListener('keydown', (e) => {
69
+ if (!state.editorOpen) return;
70
+ // `?` toggles the cheatsheet. Don't fire while typing in a text
71
+ // field — the user might be typing a prompt with a `?`.
72
+ if (e.key === '?' && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA') {
73
+ e.preventDefault();
74
+ toggleShortcuts();
75
+ return;
76
+ }
77
+ if (e.key === 'Enter' && state.transformActive) {
78
+ e.preventDefault();
79
+ confirmTransform();
80
+ return;
81
+ }
82
+ if (e.key === 'Escape') return;
83
+ // Skip the Ctrl+Alt editor chords for an AltGr keystroke (see platform.js);
84
+ // only the chord block is skipped, so the layout-character handlers below
85
+ // still act — AltGr+5 / AltGr+8 stay as the [ ] brush-size shortcut on
86
+ // AZERTY / QWERTZ.
87
+ if ((e.ctrlKey || e.metaKey) && !isAltGrEvent(e)) {
88
+ if (e.key === 'z') { e.preventDefault(); if (e.shiftKey) redo(); else undo(); }
89
+ // Ctrl+Shift+D = Deselect: clears the wand selection (and
90
+ // lasso if active) without affecting layers.
91
+ if (e.shiftKey && (e.key === 'D' || e.key === 'd')) {
92
+ if (state.wandMask || state.lassoPoints.length) {
93
+ e.preventDefault();
94
+ if (state.wandMask) {
95
+ saveState();
96
+ state.wandMask = null;
97
+ state.wandLayerId = null;
98
+ state.wandLastSeed = null;
99
+ }
100
+ if (state.lassoPoints.length) {
101
+ state.lassoPoints = [];
102
+ state.lassoActive = false;
103
+ }
104
+ composite();
105
+ }
106
+ }
107
+ // Save shortcuts — match the hints shown in the Save dropdown.
108
+ if ((e.key === 's' || e.key === 'S') && !e.altKey) {
109
+ e.preventDefault();
110
+ document.getElementById(e.shiftKey ? 'ge-export-gallery' : 'ge-save')?.click();
111
+ }
112
+ if (e.shiftKey && e.key === 'T') { e.preventDefault(); resizeCustomPrompt(); }
113
+ if (e.altKey && e.key === 't') { e.preventDefault(); startTransform(); }
114
+ // Ctrl+Alt+I — invert current selection. Uses e.code so
115
+ // Alt-modified key values (e.g. `ˆ` on Mac with Option+I)
116
+ // don't break the match.
117
+ if (e.altKey && e.code === 'KeyI') {
118
+ if (invertSelection()) {
119
+ e.preventDefault();
120
+ e.stopPropagation();
121
+ }
122
+ }
123
+ // Ctrl+Alt+J — new empty layer.
124
+ if (e.altKey && e.code === 'KeyJ') {
125
+ e.preventDefault();
126
+ e.stopPropagation();
127
+ addEmptyLayer();
128
+ }
129
+ // Wand selection: Delete = erase pixels. Ctrl+X = cut to
130
+ // clipboard + new layer + erase. Ctrl+C = copy.
131
+ // (Legacy `&& !_wandActive` clause referenced an undeclared
132
+ // variable — removed; the wand is selection-only and has no
133
+ // "active drag" state.)
134
+ if (state.wandMask) {
135
+ if (e.key === 'Delete' || e.key === 'Backspace') {
136
+ e.preventDefault();
137
+ wandDeleteSelection();
138
+ return;
139
+ }
140
+ if ((e.ctrlKey || e.metaKey) && (e.key === 'x' || e.key === 'c')) {
141
+ e.preventDefault();
142
+ const isCut = e.key === 'x';
143
+ const src = state.layers.find(l => l.id === state.wandLayerId);
144
+ if (!src) return;
145
+ // Clip source by wand mask into a temp canvas.
146
+ const w = src.canvas.width, h = src.canvas.height;
147
+ const tmp = document.createElement('canvas');
148
+ tmp.width = w; tmp.height = h;
149
+ const tCtx = tmp.getContext('2d');
150
+ tCtx.drawImage(src.canvas, 0, 0);
151
+ tCtx.globalCompositeOperation = 'destination-in';
152
+ tCtx.drawImage(state.wandMask, 0, 0);
153
+ state.internalClipboard = tmp;
154
+ tmp.toBlob(blob => {
155
+ if (blob && navigator.clipboard?.write) {
156
+ navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]).then(() => {
157
+ uiModule.showToast(isCut ? 'Cut to clipboard' : 'Copied to clipboard');
158
+ }).catch(() => uiModule.showToast(isCut ? 'Cut (editor only)' : 'Copied (editor only)'));
159
+ }
160
+ }, 'image/png');
161
+ if (isCut) {
162
+ // Cut also moves the selection to a new layer + erases source.
163
+ wandCopyToNewLayer();
164
+ wandDeleteSelection();
165
+ }
166
+ return;
167
+ }
168
+ }
169
+ if ((e.key === 'x' || e.key === 'c') && state.lassoPoints.length >= 3) {
170
+ e.preventDefault();
171
+ const layer = activeLayer();
172
+ if (!layer) return;
173
+ const off = state.layerOffsets.get(layer.id) || { x: 0, y: 0 };
174
+ const feather = parseInt(document.getElementById('ge-lasso-feather')?.value || '0');
175
+ const grow = parseInt(document.getElementById('ge-lasso-grow')?.value || '0');
176
+ const w = layer.canvas.width, h = layer.canvas.height;
177
+ const mask = buildLassoMask(w, h, off.x, off.y, feather, grow);
178
+ const srcData = layer.ctx.getImageData(0, 0, w, h);
179
+ const maskData = mask.getContext('2d').getImageData(0, 0, w, h);
180
+ // Build clipped image.
181
+ const tmp = document.createElement('canvas');
182
+ tmp.width = w; tmp.height = h;
183
+ const tCtx = tmp.getContext('2d');
184
+ const outData = tCtx.createImageData(w, h);
185
+ for (let i = 0; i < w * h; i++) {
186
+ const mv = maskData.data[i * 4] / 255;
187
+ if (mv > 0) {
188
+ outData.data[i*4] = srcData.data[i*4];
189
+ outData.data[i*4+1] = srcData.data[i*4+1];
190
+ outData.data[i*4+2] = srcData.data[i*4+2];
191
+ outData.data[i*4+3] = Math.round(srcData.data[i*4+3] * mv);
192
+ }
193
+ }
194
+ tCtx.putImageData(outData, 0, 0);
195
+ state.internalClipboard = tmp;
196
+ const isCut = e.key === 'x';
197
+ tmp.toBlob(blob => {
198
+ if (blob && navigator.clipboard?.write) {
199
+ navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]).then(() => {
200
+ uiModule.showToast(isCut ? 'Cut to clipboard' : 'Copied to clipboard');
201
+ }).catch(() => uiModule.showToast(isCut ? 'Cut (editor only)' : 'Copied (editor only)'));
202
+ }
203
+ }, 'image/png');
204
+ if (e.key === 'x') {
205
+ const savedPts = [...state.lassoPoints];
206
+ state.lassoPoints = savedPts;
207
+ lassoDeleteSelection();
208
+ } else {
209
+ state.lassoPoints = [];
210
+ composite();
211
+ }
212
+ }
213
+ // Ctrl+C with no active selection → copy the entire active layer
214
+ // to the system clipboard as a PNG. Gives a "just copy this image"
215
+ // shortcut without having to lasso-select-all first. The
216
+ // selection-aware Ctrl+C paths above run first (wand + lasso),
217
+ // so this only fires when neither is active.
218
+ if (e.key === 'c' && !e.shiftKey && !state.wandMask && state.lassoPoints.length < 3) {
219
+ const layer = activeLayer();
220
+ if (layer && layer.canvas && layer.canvas.width > 0) {
221
+ e.preventDefault();
222
+ layer.canvas.toBlob(blob => {
223
+ if (blob && navigator.clipboard?.write) {
224
+ navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })])
225
+ .then(() => uiModule.showToast('Layer copied to clipboard'))
226
+ .catch(() => uiModule.showToast('Copy failed (clipboard permission denied?)'));
227
+ }
228
+ }, 'image/png');
229
+ return;
230
+ }
231
+ }
232
+ // Ctrl+Alt+A = select all canvas.
233
+ if (e.altKey && e.key === 'a' && state.imgWidth > 0 && state.imgHeight > 0) {
234
+ e.preventDefault();
235
+ state.lassoPoints = [
236
+ { x: 0, y: 0 }, { x: state.imgWidth, y: 0 },
237
+ { x: state.imgWidth, y: state.imgHeight }, { x: 0, y: state.imgHeight },
238
+ ];
239
+ state.lassoActive = false;
240
+ composite();
241
+ drawLassoOverlay();
242
+ uiModule.showToast('All selected — Ctrl+C to copy, Del to delete');
243
+ }
244
+ // Ctrl+V handled by the paste event listener.
245
+ if (e.key === 'v') { /* no-op here */ }
246
+ return;
247
+ }
248
+ // Tool shortcuts (only when not typing in an input).
249
+ if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return;
250
+ const toolId = toolKeyMap[e.key.toLowerCase()];
251
+ if (toolId) {
252
+ const toolBtn = toolbar.querySelector(`[data-tool="${toolId}"]`);
253
+ if (toolBtn) toolBtn.click();
254
+ }
255
+ // Bracket keys for brush size — ±10% multiplier mirrors the
256
+ // exponential slider curve so each press feels the same at any
257
+ // size.
258
+ if (e.key === '[' || e.key === ']') {
259
+ const factor = e.key === '[' ? 0.9 : 1.1;
260
+ state.brushSize = Math.max(1, Math.min(800, Math.round(state.brushSize * factor)));
261
+ try { brushSizeSync(null); } catch {}
262
+ }
263
+ // Lasso shortcuts (when selection exists).
264
+ if (state.lassoPoints.length >= 3) {
265
+ if (e.key === 'Delete' || e.key === 'Backspace') { e.preventDefault(); lassoDeleteSelection(); }
266
+ if (e.key === 'd') { e.preventDefault(); lassoDeleteSelection(); }
267
+ if (e.key === 'c') { e.preventDefault(); lassoCopyToLayer(); }
268
+ if (e.key === 'm') { e.preventDefault(); lassoToMask(); }
269
+ }
270
+ });
271
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Pure helpers + constants for layers and adjustment sub-layers.
3
+ *
4
+ * Everything in this module is stateless — feed in a layer object and
5
+ * get back a value. The legacy gallery editor's module-level helpers
6
+ * re-export from here so existing call sites keep working unchanged.
7
+ */
8
+
9
+ /** True if the layer has at least one FX/adjustment sub-layer. */
10
+ export function layerHasAdjustments(layer) {
11
+ return !!(layer && layer.adjLayers && layer.adjLayers.length > 0);
12
+ }
13
+
14
+
15
+ /**
16
+ * True if the layer carries a non-identity Levels OR Color-Balance
17
+ * adjustment that needs the per-pixel pass (vs the cheap CSS-filter
18
+ * path for plain B/C/H/S).
19
+ */
20
+ export function layerNeedsPixelPass(layer) {
21
+ if (!layer || !layer.adjustments) return false;
22
+ const a = layer.adjustments;
23
+ if (a.levels && (a.levels.inBlack !== 0 || a.levels.inWhite !== 255 ||
24
+ a.levels.gamma !== 1 ||
25
+ a.levels.outBlack !== 0 || a.levels.outWhite !== 255)) return true;
26
+ if (a.colorBalance) {
27
+ for (const tone of ['shadows', 'midtones', 'highlights']) {
28
+ const v = a.colorBalance[tone];
29
+ if (v && (v.r || v.g || v.b)) return true;
30
+ }
31
+ }
32
+ return false;
33
+ }
34
+
35
+
36
+ /**
37
+ * Compact hash of a layer's Levels + Color-Balance values. Used to
38
+ * key the per-pixel adjustment cache so we can skip recomputing when
39
+ * nothing changed.
40
+ */
41
+ export function adjustmentsKey(adj) {
42
+ const l = adj.levels || {};
43
+ const cb = adj.colorBalance || {};
44
+ const s = cb.shadows || {}, m = cb.midtones || {}, h = cb.highlights || {};
45
+ return [
46
+ l.inBlack|0, l.inWhite|0, l.gamma || 1, l.outBlack|0, l.outWhite|0,
47
+ s.r|0, s.g|0, s.b|0, m.r|0, m.g|0, m.b|0, h.r|0, h.g|0, h.b|0,
48
+ ].join('|');
49
+ }
50
+
51
+
52
+ /** Identity params for each adjustment type. */
53
+ export function defaultAdjParams(type) {
54
+ switch (type) {
55
+ case 'brightness-contrast': return { brightness: 1, contrast: 1 };
56
+ case 'hue-saturation': return { hue: 0, saturation: 1 };
57
+ case 'levels': return { inBlack: 0, inWhite: 255, gamma: 1.0, outBlack: 0, outWhite: 255 };
58
+ case 'color-balance': return {
59
+ shadows: { r: 0, g: 0, b: 0 },
60
+ midtones: { r: 0, g: 0, b: 0 },
61
+ highlights: { r: 0, g: 0, b: 0 },
62
+ };
63
+ }
64
+ return {};
65
+ }
66
+
67
+
68
+ /** Human-readable name for an adjustment type. */
69
+ export function adjLayerLabel(type) {
70
+ return {
71
+ 'brightness-contrast': 'Brightness/Contrast',
72
+ 'hue-saturation': 'Hue/Saturation',
73
+ 'levels': 'Levels',
74
+ 'color-balance': 'Color Balance',
75
+ }[type] || type;
76
+ }
77
+
78
+
79
+ /**
80
+ * Per-type SVG icon strings. Used in popup title bars, the minimised
81
+ * FX-dock chips, and the layer-panel sub-row name so the same glyph
82
+ * shows up everywhere a given adjustment type appears.
83
+ */
84
+ export const ADJ_ICONS = {
85
+ 'brightness-contrast': '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 3a9 9 0 0 1 0 18Z" fill="currentColor" stroke="none"/></svg>',
86
+ 'hue-saturation': '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="9" cy="12" r="4"/><circle cx="15" cy="9.5" r="4"/><circle cx="15" cy="14.5" r="4"/></svg>',
87
+ 'levels': '<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><rect x="3" y="14" width="3" height="6" rx="0.5"/><rect x="8" y="9" width="3" height="11" rx="0.5"/><rect x="13" y="11" width="3" height="9" rx="0.5"/><rect x="18" y="6" width="3" height="14" rx="0.5"/></svg>',
88
+ 'color-balance': '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9"/><path d="M12 3v18M3 12a9 9 0 0 1 9-9v18a9 9 0 0 1-9-9z" fill="currentColor" stroke="none"/></svg>',
89
+ };
90
+
91
+
92
+ /** SVG used in the topbar/history button glyphs. */
93
+ export const HISTORY_ICON = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/><polyline points="12 7 12 12 16 14"/></svg>';
94
+
95
+
96
+ /** Quick downsampled-alpha check: are there any opaque pixels on this canvas? */
97
+ export function isMaskCanvasEmpty(canvas) {
98
+ if (!canvas) return true;
99
+ try {
100
+ const w = canvas.width, h = canvas.height;
101
+ if (!w || !h) return true;
102
+ const sw = Math.min(200, w), sh = Math.min(200, h);
103
+ const tmp = document.createElement('canvas');
104
+ tmp.width = sw; tmp.height = sh;
105
+ tmp.getContext('2d').drawImage(canvas, 0, 0, sw, sh);
106
+ const d = tmp.getContext('2d').getImageData(0, 0, sw, sh).data;
107
+ for (let i = 3; i < d.length; i += 4) if (d[i] > 0) return false;
108
+ return true;
109
+ } catch { return false; }
110
+ }
111
+
112
+
113
+ /** Same as `isMaskCanvasEmpty` but accepts a layer wrapper. */
114
+ export function isLayerEmpty(layer) {
115
+ if (!layer || !layer.canvas) return true;
116
+ return isMaskCanvasEmpty(layer.canvas);
117
+ }
118
+
119
+
120
+ /**
121
+ * Compact "now / 30s / 12m / 4h" relative-time string. Used in the
122
+ * editor's history panel labels.
123
+ */
124
+ export function relTime(ts) {
125
+ if (!ts) return '';
126
+ const dt = (Date.now() - ts) / 1000;
127
+ if (dt < 5) return 'now';
128
+ if (dt < 60) return Math.round(dt) + 's';
129
+ if (dt < 3600) return Math.round(dt / 60) + 'm';
130
+ return Math.round(dt / 3600) + 'h';
131
+ }