@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,573 @@
1
+ // ============================================
2
+ // Sidebar Layout — icon rail, hamburger cycling, mobile backdrop & swipe
3
+ // ============================================
4
+
5
+ let _syncRailSideFn = null;
6
+
7
+ /**
8
+ * Get the current syncRailSide function reference.
9
+ * Needed because it gets patched after initial setup.
10
+ */
11
+ export function syncRailSide() {
12
+ if (_syncRailSideFn) _syncRailSideFn();
13
+ }
14
+
15
+ /**
16
+ * Initialize sidebar layout: icon rail, hamburger cycling, mobile backdrop, swipe gestures.
17
+ * @param {Object} Storage - Storage module
18
+ * @param {Object} opts
19
+ * @param {Object} opts.documentModule - Document module (for swapSide)
20
+ * @param {Function} opts._closeCompareIfActive
21
+ * @param {Function} opts._deactivateIncognito
22
+ * @param {Object} opts.presetsModule
23
+ * @param {Object} opts.sessionModule
24
+ * @param {Function} opts.el - Element lookup helper
25
+ * @param {*} opts._defaultChat - Default chat config
26
+ * @param {Function} opts._syncResearchIndicator
27
+ */
28
+ export function initSidebarLayout(Storage, opts) {
29
+ const {
30
+ documentModule, _closeCompareIfActive, _deactivateIncognito,
31
+ presetsModule, sessionModule, el, _defaultChat, _syncResearchIndicator
32
+ } = opts;
33
+
34
+ // ── Icon rail + sidebar toggle ──
35
+ const iconRail = document.getElementById('icon-rail');
36
+ const hamburgerBtn = document.getElementById('hamburger-btn');
37
+
38
+ function _syncRailSideCore() {
39
+ const sidebar = document.getElementById('sidebar');
40
+ if (!iconRail) return;
41
+ const isRight = sidebar.classList.contains('right-side');
42
+ const sidebarHidden = sidebar.classList.contains('hidden');
43
+ const railHidden = iconRail.classList.contains('rail-hidden');
44
+ const isMobileMini = iconRail.classList.contains('mobile-mini');
45
+ iconRail.classList.toggle('right-side', isRight);
46
+ // On mobile mini mode, JS already set inline styles — don't touch
47
+ if (isMobileMini) {
48
+ // Just update side positioning
49
+ if (isRight) {
50
+ iconRail.style.left = 'auto';
51
+ iconRail.style.right = '0';
52
+ } else {
53
+ iconRail.style.left = '0';
54
+ iconRail.style.right = 'auto';
55
+ }
56
+ } else {
57
+ iconRail.style.display = (sidebarHidden && !railHidden) ? '' : 'none';
58
+ }
59
+ // Hamburger is always visible — just update body classes for CSS layout adjustments
60
+ if (hamburgerBtn) {
61
+ document.body.classList.toggle('hamburger-right', isRight);
62
+ document.body.classList.toggle('hamburger-left', !isRight);
63
+ document.body.classList.toggle('hamburger-only', sidebarHidden && railHidden);
64
+ document.body.classList.toggle('sidebar-collapsed', sidebarHidden);
65
+ }
66
+ // Keep incognito button clear of hamburger
67
+ const incogBtn = document.getElementById('incognito-btn');
68
+ if (incogBtn) {
69
+ if (isRight && sidebarHidden) {
70
+ incogBtn.style.right = '48px';
71
+ } else {
72
+ incogBtn.style.right = '';
73
+ }
74
+ }
75
+ }
76
+
77
+ // Set initial reference and expose globally
78
+ _syncRailSideFn = _syncRailSideCore;
79
+ window.syncRailSide = syncRailSide;
80
+
81
+ // Restore sidebar side preference
82
+ if (Storage.get(Storage.KEYS.SIDEBAR_SIDE) === 'right') {
83
+ document.getElementById('sidebar').classList.add('right-side');
84
+ }
85
+ syncRailSide();
86
+
87
+ // In-sidebar toggle button — same behavior as hamburger
88
+ const sidebarToggleBtn = document.getElementById('sidebar-toggle-btn');
89
+ if (sidebarToggleBtn) {
90
+ sidebarToggleBtn.addEventListener('click', (e) => {
91
+ if (hamburgerBtn) hamburgerBtn.click();
92
+ });
93
+ }
94
+
95
+ // New chat buttons — same as clicking brand
96
+ const chatNewBtn = document.getElementById('chat-new-btn');
97
+ const sidebarNewChat = document.getElementById('sidebar-new-chat-btn');
98
+ [chatNewBtn, sidebarNewChat].forEach(btn => {
99
+ if (btn) btn.addEventListener('click', () => {
100
+ const brandBtn = document.getElementById('sidebar-brand-btn');
101
+ if (brandBtn) brandBtn.click();
102
+ });
103
+ });
104
+
105
+ // Hamburger cycles: full sidebar → mini → off → full
106
+ // Shift-click swaps sidebar side
107
+ let _userToggledSidebar = false;
108
+ let _wasAutoCollapsed = false;
109
+
110
+ // Deliberate "open the sidebar" used by the mobile swipe gesture (wired at
111
+ // module scope). It MUST set _userToggledSidebar so the auto-collapse
112
+ // MutationObserver doesn't immediately re-hide it (the swipe was opening it,
113
+ // then checkSidebarAutoCollapse re-added .hidden because this flag was unset
114
+ // — looked like nothing happened). Mirrors the hamburger's mobile-open path.
115
+ window._odyOpenSidebar = function(side) {
116
+ const sidebar = document.getElementById('sidebar');
117
+ if (!sidebar) return;
118
+ // On mobile, never open the sidebar while Compare is running — the panes
119
+ // own the screen and stray gestures (swipe, dragging a dock chip to the X)
120
+ // were popping it open. Blocking the open helper covers every path.
121
+ const cc = document.getElementById('chat-container');
122
+ if (window.innerWidth < 768 && cc && cc.classList.contains('compare-active')) return;
123
+ _userToggledSidebar = true;
124
+ // Optionally place the sidebar on a specific edge (the swipe gesture passes
125
+ // the direction). Persist it + re-anchor the doc panel, same as a
126
+ // shift-click on the hamburger.
127
+ if (side === 'left' || side === 'right') {
128
+ const wantRight = side === 'right';
129
+ if (sidebar.classList.contains('right-side') !== wantRight) {
130
+ sidebar.classList.toggle('right-side', wantRight);
131
+ try { Storage.set(Storage.KEYS.SIDEBAR_SIDE, side); } catch (_) {}
132
+ if (documentModule && documentModule.swapSide) { try { documentModule.swapSide(); } catch (_) {} }
133
+ }
134
+ }
135
+ const backdrop = document.getElementById('sidebar-backdrop');
136
+ if (window.innerWidth < 768 && iconRail) { iconRail.classList.remove('mobile-mini'); iconRail.style.cssText = ''; }
137
+ sidebar.classList.remove('hidden');
138
+ if (backdrop && window.innerWidth < 768) backdrop.classList.add('visible');
139
+ syncRailSide();
140
+ };
141
+
142
+ if (hamburgerBtn) {
143
+ hamburgerBtn.addEventListener('click', (e) => {
144
+ e.stopPropagation();
145
+ const sidebar = document.getElementById('sidebar');
146
+ if (e.shiftKey) {
147
+ sidebar.classList.toggle('right-side');
148
+ Storage.set(Storage.KEYS.SIDEBAR_SIDE, sidebar.classList.contains('right-side') ? 'right' : 'left');
149
+ syncRailSide();
150
+ if (documentModule && documentModule.swapSide) documentModule.swapSide();
151
+ return;
152
+ }
153
+
154
+ _userToggledSidebar = true;
155
+ const isSidebarVisible = !sidebar.classList.contains('hidden');
156
+
157
+ if (window.innerWidth < 768) {
158
+ // Mobile: full sidebar ↔ hidden — simple toggle, no mini rail
159
+ const backdrop = document.getElementById('sidebar-backdrop');
160
+ if (iconRail) { iconRail.classList.remove('mobile-mini'); iconRail.style.cssText = ''; }
161
+
162
+ if (isSidebarVisible) {
163
+ // Closing sidebar
164
+ sidebar.classList.add('hidden');
165
+ if (backdrop) backdrop.classList.remove('visible');
166
+ } else {
167
+ // Mobile: the hamburger always opens the sidebar from the RIGHT.
168
+ // (Not persisted — keeps the desktop side preference untouched.)
169
+ if (!sidebar.classList.contains('right-side')) {
170
+ sidebar.classList.add('right-side');
171
+ if (documentModule && documentModule.swapSide) { try { documentModule.swapSide(); } catch (_) {} }
172
+ }
173
+ // Opening sidebar — blur keyboard first, then open after layout settles
174
+ if (document.activeElement && document.activeElement !== document.body
175
+ && (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA')) {
176
+ document.activeElement.blur();
177
+ // Wait for keyboard dismiss to settle, then open
178
+ setTimeout(() => {
179
+ sidebar.classList.remove('hidden');
180
+ if (backdrop) backdrop.classList.add('visible');
181
+ syncRailSide();
182
+ }, 250);
183
+ } else {
184
+ sidebar.classList.remove('hidden');
185
+ if (backdrop) backdrop.classList.add('visible');
186
+ }
187
+ }
188
+ syncRailSide();
189
+ return;
190
+ }
191
+
192
+ // Desktop: full sidebar ↔ mini (icon rail) — simple toggle
193
+ if (isSidebarVisible) {
194
+ sidebar.classList.add('hidden');
195
+ } else {
196
+ _wasAutoCollapsed = false;
197
+ iconRail.classList.remove('rail-hidden');
198
+ sidebar.classList.remove('hidden');
199
+ }
200
+ syncRailSide();
201
+ });
202
+ }
203
+
204
+ // Icon rail section clicks — open sidebar and scroll to section
205
+ if (iconRail) {
206
+ iconRail.addEventListener('click', (e) => {
207
+ const btn = e.target.closest('.icon-rail-btn');
208
+ if (!btn || btn.id === 'rail-new-session' || btn.id === 'rail-delete-session' || btn.id === 'rail-search-btn' || btn.id === 'rail-settings' || btn.id === 'rail-admin') return;
209
+ const sectionId = btn.dataset.section;
210
+ if (!sectionId) return;
211
+ const sidebar = document.getElementById('sidebar');
212
+ sidebar.classList.remove('hidden');
213
+ syncRailSide();
214
+ const section = document.getElementById(sectionId);
215
+ if (section) {
216
+ section.scrollIntoView({ behavior: 'smooth', block: 'start' });
217
+ section.classList.remove('collapsed');
218
+ }
219
+ });
220
+ }
221
+
222
+ // Auto-collapse sidebar when window gets small or chat area is squeezed
223
+ const AUTO_COLLAPSE_WIDTH = 700;
224
+ const MIN_CHAT_WIDTH = 380; // collapse sidebar if chat gets narrower than this
225
+
226
+ function checkSidebarAutoCollapse() {
227
+ if (_userToggledSidebar) return;
228
+ const sidebar = document.getElementById('sidebar');
229
+ if (!sidebar) return;
230
+ const isHidden = sidebar.classList.contains('hidden');
231
+
232
+ // Check if chat area is too narrow (e.g. sidebar + doc panel both open).
233
+ // BUT — if a tile-snapped modal exists, IT is what's making chat narrow,
234
+ // and that's the user's explicit choice. Don't auto-collapse the sidebar
235
+ // in response, or we get a reactive loop: snap → narrow chat → hide
236
+ // sidebar → safe-rect changes → reclamp modal → new chat width → ...
237
+ const chatContainer = document.querySelector('.chat-container');
238
+ const hasTileSnapped = document.querySelector('.modal-content[data-_tile-zone], .research-pane[data-_tile-zone]');
239
+ const chatTooNarrow = chatContainer && chatContainer.offsetWidth < MIN_CHAT_WIDTH && !isHidden && !hasTileSnapped;
240
+
241
+ if ((window.innerWidth < AUTO_COLLAPSE_WIDTH || chatTooNarrow) && !isHidden) {
242
+ sidebar.classList.add('hidden');
243
+ _wasAutoCollapsed = true;
244
+ syncRailSide();
245
+ } else if (window.innerWidth >= AUTO_COLLAPSE_WIDTH && isHidden && _wasAutoCollapsed) {
246
+ // Only restore if chat won't be too narrow
247
+ sidebar.classList.remove('hidden');
248
+ void document.body.offsetWidth; // reflow
249
+ if (chatContainer && chatContainer.offsetWidth < MIN_CHAT_WIDTH) {
250
+ sidebar.classList.add('hidden');
251
+ } else {
252
+ _wasAutoCollapsed = false;
253
+ }
254
+ syncRailSide();
255
+ }
256
+ }
257
+
258
+ window.addEventListener('resize', () => {
259
+ _userToggledSidebar = false; // allow auto-collapse on actual resize
260
+ requestAnimationFrame(checkSidebarAutoCollapse);
261
+ });
262
+ // Also re-check when doc panel toggles
263
+ new MutationObserver(() => requestAnimationFrame(checkSidebarAutoCollapse))
264
+ .observe(document.body, { attributes: true, attributeFilter: ['class'] });
265
+
266
+ // Auto-collapse on initial load if window is small
267
+ if (window.innerWidth < AUTO_COLLAPSE_WIDTH) {
268
+ const sidebar = document.getElementById('sidebar');
269
+ if (sidebar && !sidebar.classList.contains('hidden')) {
270
+ sidebar.classList.add('hidden');
271
+ _wasAutoCollapsed = true;
272
+ syncRailSide();
273
+ }
274
+ }
275
+
276
+ // ── Mobile sidebar backdrop + swipe-to-close ──
277
+ // Backdrop overlay: tapping it closes the sidebar
278
+ const mobileBackdrop = document.createElement('div');
279
+ mobileBackdrop.id = 'sidebar-backdrop';
280
+ document.body.appendChild(mobileBackdrop);
281
+
282
+ function updateMobileBackdrop() {
283
+ if (window.innerWidth >= 768) { mobileBackdrop.classList.remove('visible'); return; }
284
+ const sb = document.getElementById('sidebar');
285
+ const rail = document.getElementById('icon-rail');
286
+ const sidebarOpen = sb && !sb.classList.contains('hidden');
287
+ const miniOpen = rail && rail.classList.contains('mobile-mini');
288
+ mobileBackdrop.classList.toggle('visible', sidebarOpen || miniOpen);
289
+ }
290
+
291
+ // Suppress sidebar close briefly after dropdown actions
292
+ window._suppressSidebarClose = false;
293
+ mobileBackdrop.addEventListener('click', (e) => {
294
+ if (window._suppressSidebarClose) return;
295
+ // Don't close while a session is being renamed inline — the rename input
296
+ // lives inside the sidebar, and a backdrop tap (e.g. to dismiss the
297
+ // keyboard) would otherwise kick the user out mid-rename.
298
+ if (document.querySelector('.session-rename-input')) return;
299
+ // Don't close if a dropdown or submenu is visible
300
+ const openDD = document.querySelector('.session-dropdown-menu[style*="display: block"], .session-dropdown-menu[style*="display:block"]');
301
+ const openSub = document.querySelector('.session-folder-submenu[style*="display: block"], .session-folder-submenu[style*="display:block"]');
302
+ if (openDD || openSub) {
303
+ if (openSub) openSub.style.display = 'none';
304
+ if (openDD) openDD.style.display = 'none';
305
+ return;
306
+ }
307
+ const sb = document.getElementById('sidebar');
308
+ if (sb && !sb.classList.contains('hidden')) {
309
+ sb.classList.add('hidden');
310
+ }
311
+ mobileBackdrop.classList.remove('visible');
312
+ syncRailSide();
313
+ });
314
+
315
+ // Patch syncRailSide to also update backdrop
316
+ const _origSyncRailSideCore = _syncRailSideCore;
317
+ _syncRailSideFn = function() { _origSyncRailSideCore(); updateMobileBackdrop(); };
318
+ window.syncRailSide = syncRailSide;
319
+
320
+ // Swipe sidebar toward edge to close
321
+ const sidebar = document.getElementById('sidebar');
322
+ if (sidebar && 'ontouchstart' in window) {
323
+ let _swStartX = 0, _swStartY = 0, _swSwiping = false;
324
+ sidebar.addEventListener('touchstart', (e) => {
325
+ if (e.target.closest('.list-item')) { _swSwiping = false; return; }
326
+ _swStartX = e.touches[0].clientX;
327
+ _swStartY = e.touches[0].clientY;
328
+ _swSwiping = true;
329
+ }, { passive: true });
330
+ sidebar.addEventListener('touchmove', (e) => {
331
+ if (!_swSwiping) return;
332
+ const dx = e.touches[0].clientX - _swStartX;
333
+ const dy = Math.abs(e.touches[0].clientY - _swStartY);
334
+ if (dy > 40) { _swSwiping = false; return; }
335
+ const isRight = sidebar.classList.contains('right-side');
336
+ if ((!isRight && dx < -60) || (isRight && dx > 60)) {
337
+ _swSwiping = false;
338
+ const _backdrop = document.getElementById('sidebar-backdrop');
339
+ if (_backdrop) _backdrop.classList.remove('visible');
340
+ sidebar.classList.add('hidden');
341
+ syncRailSide();
342
+ }
343
+ }, { passive: true });
344
+ sidebar.addEventListener('touchend', () => { _swSwiping = false; }, { passive: true });
345
+ }
346
+
347
+ // ── Click outside sidebar / icon rail to close (mobile only) ──
348
+ document.addEventListener('click', (e) => {
349
+ if (window.innerWidth >= 700) return; // desktop keeps sidebar open
350
+ const sb = document.getElementById('sidebar');
351
+ const rail = document.getElementById('icon-rail');
352
+ // Ignore clicks on elements removed from DOM (e.g. session list re-render during folder toggle)
353
+ if (!e.target.isConnected) return;
354
+ // Ignore clicks on the sidebar, icon rail, or hamburger button itself
355
+ if (e.target.closest('#sidebar') || e.target.closest('#icon-rail') || e.target.closest('#hamburger-btn')) return;
356
+ // Ignore clicks inside modals or the chat input area
357
+ if (e.target.closest('.modal') || e.target.closest('.input-bar') || e.target.closest('#message')) return;
358
+ // Ignore clicks on session/folder dropdowns and the styled prompt
359
+ // overlay — they're body-level elements logically tied to a sidebar
360
+ // action (e.g. "Move to folder → New Folder…"), so closing the
361
+ // sidebar when the user clicks one yanks the action mid-flight.
362
+ if (e.target.closest('.session-dropdown, .folder-submenu, #styled-prompt-overlay, #styled-confirm-overlay')) return;
363
+ // Close full sidebar if open (with animation)
364
+ if (sb && !sb.classList.contains('hidden')) {
365
+ const backdrop = document.getElementById('sidebar-backdrop');
366
+ if (backdrop) backdrop.classList.remove('visible');
367
+ sb.classList.add('hidden');
368
+ syncRailSide();
369
+ return;
370
+ }
371
+ // Close mobile-mini icon rail overlay if open
372
+ if (rail && rail.classList.contains('mobile-mini')) {
373
+ rail.classList.remove('mobile-mini');
374
+ rail.style.cssText = '';
375
+ const backdrop = document.getElementById('sidebar-backdrop');
376
+ if (backdrop) backdrop.classList.remove('visible');
377
+ syncRailSide();
378
+ }
379
+ });
380
+
381
+ // ── Mobile: close sidebar/rail when a tool button is tapped ──
382
+ // The user expects the sidebar to get out of the way the moment a tool
383
+ // window opens — otherwise the modal lands behind the sidebar on phones.
384
+ // We remember whether the sidebar was open at the moment the tool was
385
+ // tapped so we can re-open it when the tool's modal is dismissed; that
386
+ // way clicking around the app doesn't leave the sidebar permanently
387
+ // shut.
388
+ let _sidebarWasOpenBeforeTool = false;
389
+ let _railWasOpenBeforeTool = false;
390
+ document.addEventListener('click', (e) => {
391
+ if (window.innerWidth >= 700) return;
392
+ const btn = e.target.closest('[id^="tool-"], [id^="rail-"]');
393
+ if (!btn) return;
394
+ setTimeout(() => {
395
+ const sb = document.getElementById('sidebar');
396
+ const rail = document.getElementById('icon-rail');
397
+ const backdrop = document.getElementById('sidebar-backdrop');
398
+ let changed = false;
399
+ if (sb && !sb.classList.contains('hidden')) {
400
+ _sidebarWasOpenBeforeTool = true;
401
+ sb.classList.add('hidden');
402
+ changed = true;
403
+ }
404
+ if (rail && rail.classList.contains('mobile-mini')) {
405
+ _railWasOpenBeforeTool = true;
406
+ rail.classList.remove('mobile-mini');
407
+ rail.style.cssText = '';
408
+ changed = true;
409
+ }
410
+ if (changed) {
411
+ if (backdrop) backdrop.classList.remove('visible');
412
+ syncRailSide();
413
+ }
414
+ }, 0);
415
+ });
416
+
417
+ // When a tool is dismissed by swiping it down (ui.js fires `modal-dismissed`),
418
+ // don't bounce the sidebar back open — the swipe should just dismiss the tool.
419
+ // Button-close still restores the prior sidebar state (no event fired there).
420
+ window.addEventListener('modal-dismissed', () => {
421
+ _sidebarWasOpenBeforeTool = false;
422
+ _railWasOpenBeforeTool = false;
423
+ });
424
+
425
+ // ── Mobile: when a tool modal closes, restore the sidebar/rail to
426
+ // whatever state it was in before the tool was opened. ──
427
+ // We watch every .modal for the .hidden class going on, and if our
428
+ // remembered "sidebar-was-open" flag is set, undo the auto-close.
429
+ if (window.innerWidth < 700) {
430
+ const _restoreSidebar = () => {
431
+ const sb = document.getElementById('sidebar');
432
+ const rail = document.getElementById('icon-rail');
433
+ const backdrop = document.getElementById('sidebar-backdrop');
434
+ // Skip if any modal is still visible (.modal without .hidden) — we only
435
+ // restore once the user is back to bare chat. A tool swiped DOWN to a
436
+ // dock chip is minimized (display:none via .modal-minimized), not closed
437
+ // — it's still "around", so don't bounce the sidebar open behind it. Only
438
+ // a full close (no minimized modal, no dock chips) should restore.
439
+ const anyOpen = [...document.querySelectorAll('.modal')]
440
+ .some(m => (!m.classList.contains('hidden') && getComputedStyle(m).display !== 'none')
441
+ || m.classList.contains('modal-minimized'));
442
+ const anyDocked = document.querySelectorAll('.minimized-dock-chip').length > 0;
443
+ if (anyOpen || anyDocked) {
444
+ // A tool is still minimized/docked. The user has left the "launched
445
+ // from the sidebar" context — drop the restore intent so that later
446
+ // FULLY closing the tool (e.g. dragging its chip to the trash) doesn't
447
+ // bounce the sidebar open. (The modal-dismissed listener that normally
448
+ // clears these gets blocked by modalManager's stopImmediatePropagation.)
449
+ _sidebarWasOpenBeforeTool = false;
450
+ _railWasOpenBeforeTool = false;
451
+ return;
452
+ }
453
+ if (_sidebarWasOpenBeforeTool && sb && sb.classList.contains('hidden')) {
454
+ sb.classList.remove('hidden');
455
+ if (backdrop) backdrop.classList.add('visible');
456
+ }
457
+ if (_railWasOpenBeforeTool && rail && !rail.classList.contains('mobile-mini')) {
458
+ rail.classList.add('mobile-mini');
459
+ }
460
+ _sidebarWasOpenBeforeTool = false;
461
+ _railWasOpenBeforeTool = false;
462
+ if (_sidebarWasOpenBeforeTool || _railWasOpenBeforeTool) syncRailSide();
463
+ };
464
+ const _modalObs = new MutationObserver((muts) => {
465
+ let triggered = false;
466
+ for (const m of muts) {
467
+ if (m.type !== 'attributes' || m.attributeName !== 'class') continue;
468
+ const t = m.target;
469
+ if (!(t instanceof HTMLElement) || !t.classList) continue;
470
+ if (t.classList.contains('modal')) { triggered = true; break; }
471
+ }
472
+ if (triggered) setTimeout(_restoreSidebar, 50);
473
+ });
474
+ _modalObs.observe(document.body, { subtree: true, attributes: true, attributeFilter: ['class'] });
475
+ }
476
+
477
+ // (Mobile swipe-to-open-sidebar is wired at MODULE scope — see
478
+ // _initChatSwipeToOpenSidebar() at the bottom of this file — so it attaches
479
+ // independently of this init function completing.)
480
+ }
481
+
482
+ // ── Mobile: swipe horizontally on the splash/chat to open the sidebar ──
483
+ // Wired at MODULE scope (not inside initSidebarLayout) so a throw anywhere in
484
+ // that init can't drop this listener. Bound on `document` so it catches the
485
+ // touch regardless of which child element is under the finger. touchmove is
486
+ // NON-passive and calls preventDefault() once the gesture is locked
487
+ // horizontal — without that, Firefox (and others) treat the horizontal swipe
488
+ // as their own scroll/navigation gesture and our handler never gets to act.
489
+ function _initChatSwipeToOpenSidebar() {
490
+ if (window.__odySwipeWired) return;
491
+ window.__odySwipeWired = true;
492
+
493
+ // Areas where a horizontal drag means something else (their own scroll/drag).
494
+ const EXCLUDE = [
495
+ '#sidebar', '#icon-rail', '.modal', '.input-bar', '#message',
496
+ '#minimized-dock', '.minimized-dock-chip', '#dock-trash-zone',
497
+ 'pre', 'table', '.agent-tool-output', '.agent-thread-cmd',
498
+ 'input', 'textarea', 'select',
499
+ ].join(', ');
500
+
501
+ let sx = 0, sy = 0, track = false, decided = false;
502
+
503
+ const reset = () => { track = false; decided = false; };
504
+
505
+ document.addEventListener('touchstart', (e) => {
506
+ reset();
507
+ if (window.innerWidth >= 768) return;
508
+ if (!e.touches || e.touches.length !== 1) return;
509
+ if (window._chipDragging) return;
510
+ const sb = document.getElementById('sidebar');
511
+ if (sb && !sb.classList.contains('hidden')) return; // already open
512
+ // Only in the chat / empty-chat view. Not when a document or PDF is open
513
+ // (body.doc-view), notes is open (body.notes-view), or a tool modal is up.
514
+ if (document.body.classList.contains('doc-view') ||
515
+ document.body.classList.contains('notes-view')) return;
516
+ // Not while Compare is running — it takes over #chat-container with its own
517
+ // panes/scroll, and the swipe-to-open-sidebar gesture gets in the way there.
518
+ const cc = document.getElementById('chat-container');
519
+ if (cc && cc.classList.contains('compare-active')) return;
520
+ const anyModalOpen = [...document.querySelectorAll('.modal')].some(
521
+ m => !m.classList.contains('hidden') && getComputedStyle(m).display !== 'none');
522
+ if (anyModalOpen) return;
523
+ const t = e.target;
524
+ if (t && t.closest && t.closest(EXCLUDE)) return;
525
+ // The gesture must start within the chat area itself.
526
+ if (!(t && t.closest && t.closest('#chat-container'))) return;
527
+ sx = e.touches[0].clientX;
528
+ sy = e.touches[0].clientY;
529
+ track = true;
530
+ }, { passive: true, capture: true });
531
+
532
+ document.addEventListener('touchmove', (e) => {
533
+ if (!track) return;
534
+ if (window._chipDragging) { track = false; return; }
535
+ if (!e.touches || !e.touches.length) return;
536
+ const dx = e.touches[0].clientX - sx;
537
+ const dy = e.touches[0].clientY - sy;
538
+ const adx = Math.abs(dx), ady = Math.abs(dy);
539
+ if (!decided) {
540
+ if (adx < 10 && ady < 10) return; // not enough travel to judge
541
+ if (ady > adx) { track = false; return; } // vertical-dominant → let it scroll
542
+ decided = true; // locked into a horizontal swipe
543
+ }
544
+ // Claim the gesture from the browser so it doesn't scroll/navigate instead.
545
+ if (e.cancelable) e.preventDefault();
546
+ if (adx >= 40) {
547
+ track = false;
548
+ // Direction picks the side (per user preference): swipe LEFT → sidebar
549
+ // on the left, swipe RIGHT → sidebar on the right. dx<0 is a leftward
550
+ // finger motion; mapping it to 'right' (and dx>0 to 'left') is what makes
551
+ // it feel correct in practice.
552
+ const side = dx < 0 ? 'right' : 'left';
553
+ // Use the deliberate-open helper (sets _userToggledSidebar so the
554
+ // auto-collapse observer doesn't instantly re-hide it). Fall back to a
555
+ // plain unhide if the helper isn't wired yet.
556
+ if (typeof window._odyOpenSidebar === 'function') {
557
+ window._odyOpenSidebar(side);
558
+ } else {
559
+ const sb = document.getElementById('sidebar');
560
+ if (sb) { sb.classList.remove('hidden'); try { syncRailSide(); } catch (_) {} }
561
+ }
562
+ }
563
+ }, { passive: false, capture: true });
564
+
565
+ document.addEventListener('touchend', reset, { passive: true, capture: true });
566
+ document.addEventListener('touchcancel', reset, { passive: true, capture: true });
567
+ }
568
+
569
+ if (document.readyState === 'loading') {
570
+ document.addEventListener('DOMContentLoaded', _initChatSwipeToOpenSidebar);
571
+ } else {
572
+ _initChatSwipeToOpenSidebar();
573
+ }