@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,475 @@
1
+ // Personal Assistant — sidebar entry, settings modal, and chat-header extras.
2
+ //
3
+ // The Assistant is just a specially-flagged CrewMember whose pinned Session
4
+ // lives alongside normal chats. The sidebar button resolves the per-user
5
+ // singleton via /api/assistant/session and hands it to selectSession() so we
6
+ // reuse the full existing chat render path.
7
+
8
+ import uiModule from './ui.js';
9
+ import { selectSession } from './sessions.js';
10
+ import { sortModelIds } from './modelSort.js';
11
+
12
+ const API = '/api/assistant';
13
+
14
+ let _cachedSettings = null; // most recent GET /api/assistant/settings payload
15
+ let _modalEl = null;
16
+
17
+ async function _fetchJSON(url, opts = {}) {
18
+ const res = await fetch(url, { credentials: 'same-origin', ...opts });
19
+ if (!res.ok) throw new Error(`${url} → ${res.status}`);
20
+ return res.json();
21
+ }
22
+
23
+ export async function openAssistantChat() {
24
+ try {
25
+ const info = await _fetchJSON(`${API}/session`);
26
+ if (!info?.session_id) {
27
+ uiModule.showToast('Assistant session unavailable');
28
+ return;
29
+ }
30
+ await selectSession(info.session_id);
31
+ // Refresh settings cache so the header buttons / gear act on fresh data.
32
+ _cachedSettings = null;
33
+ } catch (e) {
34
+ console.error('openAssistantChat failed:', e);
35
+ uiModule.showToast('Could not open assistant');
36
+ }
37
+ }
38
+
39
+ async function _getSettings(force = false) {
40
+ if (!force && _cachedSettings) return _cachedSettings;
41
+ _cachedSettings = await _fetchJSON(`${API}/settings`);
42
+ return _cachedSettings;
43
+ }
44
+
45
+ async function _saveSettings(payload) {
46
+ const res = await fetch(`${API}/settings`, {
47
+ method: 'PATCH',
48
+ credentials: 'same-origin',
49
+ headers: { 'Content-Type': 'application/json' },
50
+ body: JSON.stringify(payload),
51
+ });
52
+ if (!res.ok) throw new Error(`PATCH ${API}/settings → ${res.status}`);
53
+ _cachedSettings = await res.json();
54
+ return _cachedSettings;
55
+ }
56
+
57
+ async function _listTimezones() {
58
+ try {
59
+ const { timezones } = await _fetchJSON(`${API}/available-timezones`);
60
+ return timezones || ['UTC'];
61
+ } catch {
62
+ return ['UTC'];
63
+ }
64
+ }
65
+
66
+ async function _runCheckInNow(taskId) {
67
+ try {
68
+ await fetch(`${API}/run/${encodeURIComponent(taskId)}`, {
69
+ method: 'POST',
70
+ credentials: 'same-origin',
71
+ });
72
+ uiModule.showToast('Check-in running…');
73
+ } catch (e) {
74
+ console.error(e);
75
+ uiModule.showToast('Could not run check-in');
76
+ }
77
+ }
78
+
79
+ // ── Settings modal ─────────────────────────────────────────────────────────
80
+
81
+ function _closeModal() {
82
+ if (_modalEl) {
83
+ _modalEl.classList.add('hidden');
84
+ _modalEl.style.display = '';
85
+ }
86
+ }
87
+
88
+ function _ensureModalEl() {
89
+ if (_modalEl) return _modalEl;
90
+ const modal = document.createElement('div');
91
+ modal.id = 'assistant-settings-modal';
92
+ modal.className = 'modal hidden';
93
+ modal.innerHTML = `
94
+ <div class="modal-content" style="max-width:640px;width:96%;">
95
+ <div class="modal-header">
96
+ <h4>
97
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-2px;margin-right:6px;"><circle cx="12" cy="8" r="4"/><path d="M4 21a8 8 0 0 1 16 0"/></svg>
98
+ Assistant settings
99
+ </h4>
100
+ <button class="close-btn" id="assistant-settings-close">✖</button>
101
+ </div>
102
+ <div class="modal-body" id="assistant-settings-body">
103
+ <div class="hwfit-loading">Loading…</div>
104
+ </div>
105
+ </div>`;
106
+ document.body.appendChild(modal);
107
+ modal.querySelector('#assistant-settings-close').addEventListener('click', _closeModal);
108
+ modal.addEventListener('click', (e) => {
109
+ if (e.target === modal) _closeModal();
110
+ });
111
+ _modalEl = modal;
112
+ return modal;
113
+ }
114
+
115
+ function _esc(s) {
116
+ return (s || '').replace(/[&<>"']/g, (c) => ({
117
+ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;',
118
+ }[c]));
119
+ }
120
+
121
+ // Tool groups for the tool selector UI
122
+ const TOOL_GROUPS = {
123
+ 'Email': ['list_emails', 'read_email', 'send_email', 'reply_to_email', 'archive_email', 'delete_email', 'mark_email_read'],
124
+ 'Calendar & Notes': ['manage_calendar', 'manage_notes', 'manage_tasks'],
125
+ 'Knowledge': ['web_search', 'read_file', 'manage_memory', 'manage_rag', 'search_chats'],
126
+ 'Code': ['bash', 'python', 'write_file'],
127
+ 'Documents': ['create_document', 'edit_document', 'update_document', 'suggest_document'],
128
+ 'AI & Models': ['chat_with_model', 'second_opinion', 'ask_teacher', 'pipeline', 'list_models', 'generate_image'],
129
+ 'System': ['manage_session', 'manage_endpoints', 'manage_mcp', 'manage_settings', 'manage_skills', 'manage_webhooks', 'manage_tokens', 'manage_documents', 'create_session', 'list_sessions', 'send_to_session', 'ui_control'],
130
+ };
131
+
132
+ async function _fetchEndpoints() {
133
+ try {
134
+ const eps = await _fetchJSON('/api/model-endpoints');
135
+ return Array.isArray(eps) ? eps : [];
136
+ } catch { return []; }
137
+ }
138
+
139
+ function _renderSettingsBody(body, data, tzList) {
140
+ const crew = data.crew || {};
141
+ const checkIns = data.check_ins || [];
142
+ const enabledTools = new Set(crew.enabled_tools || []);
143
+ const tzOptions = tzList.map((z) =>
144
+ `<option value="${_esc(z)}"${z === crew.timezone ? ' selected' : ''}>${_esc(z)}</option>`
145
+ ).join('');
146
+ const checkInsHTML = checkIns.map((c) => `
147
+ <div class="assistant-checkin-row" data-task-id="${_esc(c.id)}">
148
+ <div class="assistant-checkin-head">
149
+ <input type="checkbox" class="assistant-checkin-enabled" ${c.enabled ? 'checked' : ''} title="Enable this check-in" />
150
+ <input type="text" class="assistant-checkin-name" value="${_esc(c.name)}" placeholder="Name" />
151
+ <input type="time" class="assistant-checkin-time" value="${_esc(c.scheduled_time || '')}" />
152
+ <button type="button" class="assistant-checkin-run" title="Run now">Run now</button>
153
+ </div>
154
+ <textarea class="assistant-checkin-prompt" rows="3" placeholder="Prompt for this check-in">${_esc(c.prompt || '')}</textarea>
155
+ <div class="assistant-checkin-meta">
156
+ ${c.next_run ? `next run: ${_esc(c.next_run)}` : ''}
157
+ ${c.last_run ? ` · last run: ${_esc(c.last_run)}` : ''}
158
+ ${typeof c.run_count === 'number' ? ` · ${c.run_count} runs` : ''}
159
+ </div>
160
+ </div>`).join('');
161
+
162
+ // Tool selector grouped by category
163
+ let toolsHTML = '';
164
+ for (const [group, tools] of Object.entries(TOOL_GROUPS)) {
165
+ toolsHTML += `<div class="assistant-tool-group"><span class="assistant-tool-group-label">${_esc(group)}</span>`;
166
+ for (const t of tools) {
167
+ const checked = enabledTools.has(t) ? ' checked' : '';
168
+ const label = t.replace(/_/g, ' ');
169
+ toolsHTML += `<label class="assistant-tool-item"><input type="checkbox" class="assistant-tool-cb" value="${_esc(t)}"${checked} /><span>${_esc(label)}</span></label>`;
170
+ }
171
+ toolsHTML += '</div>';
172
+ }
173
+
174
+ body.innerHTML = `
175
+ <div class="assistant-settings-form">
176
+ <label class="assistant-field">
177
+ <span>Name</span>
178
+ <input type="text" id="assistant-name" value="${_esc(crew.name)}" placeholder="Assistant" />
179
+ </label>
180
+ <div class="assistant-field">
181
+ <span style="display:flex;align-items:center;gap:8px;">Personality
182
+ <select id="assistant-character-pick" style="font-size:11px;padding:1px 6px;border:1px solid var(--border);border-radius:3px;background:var(--bg);color:var(--fg);max-width:180px;">
183
+ <option value="">-- pick from persona --</option>
184
+ </select>
185
+ </span>
186
+ <textarea id="assistant-personality" rows="6" placeholder="Describe the assistant's personality, tone, and behavior...">${_esc(crew.personality || '')}</textarea>
187
+ </div>
188
+ <div class="assistant-field-row">
189
+ <label class="assistant-field">
190
+ <span>Timezone</span>
191
+ <select id="assistant-timezone">
192
+ <option value=""${!crew.timezone ? ' selected' : ''}>(default -- UTC)</option>
193
+ ${tzOptions}
194
+ </select>
195
+ </label>
196
+ </div>
197
+ <div class="assistant-field-row">
198
+ <label class="assistant-field" style="flex:1;">
199
+ <span>Model endpoint</span>
200
+ <select id="assistant-endpoint" style="width:100%;">
201
+ <option value="">(loading...)</option>
202
+ </select>
203
+ </label>
204
+ <label class="assistant-field" style="flex:1;">
205
+ <span>Model</span>
206
+ <select id="assistant-model" style="width:100%;">
207
+ <option value="${_esc(crew.model || '')}">${_esc(crew.model || '(default)')}</option>
208
+ </select>
209
+ </label>
210
+ </div>
211
+ <div class="assistant-field">
212
+ <span style="display:flex;align-items:center;gap:8px;">Tools
213
+ <button type="button" id="assistant-tools-all" class="assistant-tools-toggle" style="font-size:10px;opacity:0.5;cursor:pointer;background:none;border:1px solid var(--border);border-radius:3px;padding:1px 6px;">all</button>
214
+ <button type="button" id="assistant-tools-none" class="assistant-tools-toggle" style="font-size:10px;opacity:0.5;cursor:pointer;background:none;border:1px solid var(--border);border-radius:3px;padding:1px 6px;">none</button>
215
+ </span>
216
+ <div class="assistant-tools-grid" id="assistant-tools-grid">
217
+ ${toolsHTML}
218
+ </div>
219
+ </div>
220
+ <div class="assistant-checkins">
221
+ <h5>Daily check-ins</h5>
222
+ ${checkInsHTML || '<div style="opacity:0.6;">No check-ins configured.</div>'}
223
+ </div>
224
+ <div class="assistant-settings-actions">
225
+ <button type="button" class="cal-btn" id="assistant-settings-cancel">Cancel</button>
226
+ <button type="button" class="cal-btn cal-btn-primary" id="assistant-settings-save">Save</button>
227
+ </div>
228
+ </div>
229
+ `;
230
+
231
+ // ── Populate model/endpoint dropdowns ──
232
+ const epSelect = body.querySelector('#assistant-endpoint');
233
+ const modelSelect = body.querySelector('#assistant-model');
234
+ _fetchEndpoints().then(endpoints => {
235
+ let epHTML = '<option value="">(use session default)</option>';
236
+ for (const ep of endpoints) {
237
+ if (!ep.is_enabled) continue;
238
+ const url = ep.base_url || '';
239
+ const name = ep.name || url;
240
+ const sel = (crew.endpoint_url && url.includes(crew.endpoint_url.replace('/v1', '').replace(/\/$/, ''))) ? ' selected' : '';
241
+ epHTML += `<option value="${_esc(url)}"${sel}>${_esc(name)}</option>`;
242
+ }
243
+ epSelect.innerHTML = epHTML;
244
+ // When endpoint changes, load its models
245
+ epSelect.addEventListener('change', async () => {
246
+ const url = epSelect.value;
247
+ if (!url) { modelSelect.innerHTML = '<option value="">(default)</option>'; return; }
248
+ const ep = endpoints.find(e => e.base_url === url);
249
+ if (!ep) return;
250
+ modelSelect.innerHTML = '<option value="">loading...</option>';
251
+ try {
252
+ const models = await _fetchJSON(`/api/model-endpoints/${ep.id}/models`);
253
+ let mHTML = '';
254
+ const modelIds = (models.models || models || []).map(m => typeof m === 'string' ? m : (m.id || m.name || '')).filter(Boolean);
255
+ for (const mid of sortModelIds(modelIds)) {
256
+ const sel = mid === crew.model ? ' selected' : '';
257
+ mHTML += `<option value="${_esc(mid)}"${sel}>${_esc(mid.split('/').pop())}</option>`;
258
+ }
259
+ modelSelect.innerHTML = mHTML || '<option value="">(no models)</option>';
260
+ } catch { modelSelect.innerHTML = '<option value="">(failed)</option>'; }
261
+ });
262
+ // Trigger initial model load if endpoint is pre-selected
263
+ if (epSelect.value) epSelect.dispatchEvent(new Event('change'));
264
+ });
265
+
266
+ // ── Tool toggle buttons ──
267
+ body.querySelector('#assistant-tools-all')?.addEventListener('click', () => {
268
+ body.querySelectorAll('.assistant-tool-cb').forEach(cb => { cb.checked = true; });
269
+ });
270
+ body.querySelector('#assistant-tools-none')?.addEventListener('click', () => {
271
+ body.querySelectorAll('.assistant-tool-cb').forEach(cb => { cb.checked = false; });
272
+ });
273
+
274
+ // ── Character picker — populate from presets + templates ──
275
+ const charPick = body.querySelector('#assistant-character-pick');
276
+ const personalityEl = body.querySelector('#assistant-personality');
277
+ if (charPick && personalityEl) {
278
+ (async () => {
279
+ try {
280
+ const [presetsRaw, templates] = await Promise.all([
281
+ _fetchJSON('/api/presets').catch(() => ({})),
282
+ _fetchJSON('/api/presets/templates').catch(() => []),
283
+ ]);
284
+ // Presets API returns a dict keyed by preset ID, not an array
285
+ const allPresets = [];
286
+ if (presetsRaw && typeof presetsRaw === 'object' && !Array.isArray(presetsRaw)) {
287
+ for (const [key, val] of Object.entries(presetsRaw)) {
288
+ if (val && typeof val === 'object' && val.system_prompt) {
289
+ allPresets.push({ ...val, _key: key });
290
+ }
291
+ }
292
+ } else if (Array.isArray(presetsRaw)) {
293
+ allPresets.push(...presetsRaw);
294
+ }
295
+ const allTemplates = Array.isArray(templates) ? templates : [];
296
+ let opts = '<option value="">-- pick from persona --</option>';
297
+ if (allPresets.length) {
298
+ opts += '<optgroup label="Presets">';
299
+ for (const p of allPresets) {
300
+ if (!p.system_prompt) continue;
301
+ const name = p.character_name || p.name || p._key || 'Unnamed';
302
+ opts += `<option value="preset:${_esc(p._key || p.name || '')}">${_esc(name)}</option>`;
303
+ }
304
+ opts += '</optgroup>';
305
+ }
306
+ if (allTemplates.length) {
307
+ opts += '<optgroup label="Personas">';
308
+ for (const t of allTemplates) {
309
+ if (!t.system_prompt && !t.personality) continue;
310
+ const name = t.character_name || t.name || 'Unnamed';
311
+ opts += `<option value="template:${_esc(t.id || t.name || '')}">${_esc(name)}</option>`;
312
+ }
313
+ opts += '</optgroup>';
314
+ }
315
+ charPick.innerHTML = opts;
316
+ charPick._presets = allPresets;
317
+ charPick._templates = allTemplates;
318
+ } catch {}
319
+ })();
320
+ charPick.addEventListener('change', () => {
321
+ const val = charPick.value;
322
+ if (!val) return;
323
+ const [type, id] = val.split(':', 2);
324
+ let prompt = '';
325
+ let name = '';
326
+ if (type === 'preset') {
327
+ const p = (charPick._presets || []).find(x => (x._key || x.name || x.id) === id);
328
+ if (p) { prompt = p.system_prompt || p.personality || ''; name = p.character_name || p.name || p._key || ''; }
329
+ } else if (type === 'template') {
330
+ const t = (charPick._templates || []).find(x => (x.id || x.name) === id);
331
+ if (t) { prompt = t.system_prompt || t.personality || ''; name = t.character_name || t.name || ''; }
332
+ }
333
+ if (prompt) personalityEl.value = prompt;
334
+ const nameEl = body.querySelector('#assistant-name');
335
+ if (name && nameEl) nameEl.value = name;
336
+ charPick.selectedIndex = 0;
337
+ });
338
+ }
339
+
340
+ // ── Event wiring ──
341
+ body.querySelector('#assistant-settings-cancel').addEventListener('click', _closeModal);
342
+ body.querySelector('#assistant-settings-save').addEventListener('click', async () => {
343
+ const selectedTools = [];
344
+ body.querySelectorAll('.assistant-tool-cb:checked').forEach(cb => selectedTools.push(cb.value));
345
+ const payload = {
346
+ name: body.querySelector('#assistant-name').value.trim(),
347
+ personality: body.querySelector('#assistant-personality').value,
348
+ timezone: body.querySelector('#assistant-timezone').value || null,
349
+ model: body.querySelector('#assistant-model').value || null,
350
+ endpoint_url: body.querySelector('#assistant-endpoint').value || null,
351
+ enabled_tools: selectedTools,
352
+ check_ins: Array.from(body.querySelectorAll('.assistant-checkin-row')).map((row) => ({
353
+ id: row.dataset.taskId,
354
+ name: row.querySelector('.assistant-checkin-name').value.trim(),
355
+ scheduled_time: row.querySelector('.assistant-checkin-time').value,
356
+ prompt: row.querySelector('.assistant-checkin-prompt').value,
357
+ enabled: row.querySelector('.assistant-checkin-enabled').checked,
358
+ })),
359
+ };
360
+ try {
361
+ await _saveSettings(payload);
362
+ uiModule.showToast('Assistant settings saved');
363
+ _closeModal();
364
+ } catch (e) {
365
+ console.error(e);
366
+ uiModule.showToast('Save failed');
367
+ }
368
+ });
369
+ body.querySelectorAll('.assistant-checkin-run').forEach((btn) => {
370
+ btn.addEventListener('click', async (e) => {
371
+ e.stopPropagation();
372
+ const row = btn.closest('.assistant-checkin-row');
373
+ if (!row?.dataset.taskId) return;
374
+ const taskId = row.dataset.taskId;
375
+ btn.disabled = true;
376
+ btn.textContent = 'Running...';
377
+ await _runCheckInNow(taskId);
378
+ _closeModal();
379
+ // Poll until done, then navigate to assistant chat
380
+ const sid = _cachedSettings?.crew?.session_id;
381
+ const _poll = setInterval(async () => {
382
+ try {
383
+ const res = await fetch(`${API}/run-status/${encodeURIComponent(taskId)}`, { credentials: 'same-origin' });
384
+ if (!res.ok) return;
385
+ const data = await res.json();
386
+ if (data.status === 'done' || data.status === 'error') {
387
+ clearInterval(_poll);
388
+ // Hard navigate to force full reload of the session
389
+ if (sid) {
390
+ window.location.href = window.location.pathname + '#' + sid;
391
+ window.location.reload();
392
+ }
393
+ }
394
+ } catch {}
395
+ }, 2000);
396
+ setTimeout(() => clearInterval(_poll), 90000);
397
+ });
398
+ });
399
+ }
400
+
401
+ export async function openAssistantSettings() {
402
+ const modal = _ensureModalEl();
403
+ modal.classList.remove('hidden');
404
+ modal.style.display = 'flex';
405
+ const body = modal.querySelector('#assistant-settings-body');
406
+ body.innerHTML = '<div class="hwfit-loading">Loading…</div>';
407
+ try {
408
+ const [data, tzList] = await Promise.all([_getSettings(true), _listTimezones()]);
409
+ _renderSettingsBody(body, data, tzList);
410
+ } catch (e) {
411
+ console.error(e);
412
+ body.innerHTML = '<div style="padding:12px;opacity:0.6;">Could not load assistant settings.</div>';
413
+ }
414
+ }
415
+
416
+ // Sidebar wiring removed — Assistant chat + settings now live as
417
+ // Activity / Settings tabs inside the Tasks modal (see tasks.js). The
418
+ // exports below are still used by tasks.js to surface those views.
419
+
420
+ // ── Chat-header affordances when the assistant session is active ───────────
421
+
422
+ async function _ensureHeaderAffordances(sessionId) {
423
+ try {
424
+ const settings = await _getSettings();
425
+ if (settings?.crew?.session_id !== sessionId) return;
426
+ } catch {
427
+ return;
428
+ }
429
+ const headerRight = document.querySelector('.chat-header-right, #chat-header .actions, .chat-header');
430
+ if (!headerRight) return;
431
+ if (headerRight.querySelector('#assistant-header-gear')) return;
432
+ const gear = document.createElement('button');
433
+ gear.id = 'assistant-header-gear';
434
+ gear.type = 'button';
435
+ gear.title = 'Assistant settings';
436
+ gear.className = 'chat-header-btn';
437
+ gear.innerHTML = '<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>';
438
+ gear.addEventListener('click', openAssistantSettings);
439
+ headerRight.appendChild(gear);
440
+ }
441
+
442
+ // Run a short polling check after session loads so we can add the gear button
443
+ // once the chat header DOM is in place. Fire-and-forget.
444
+ function _watchForAssistantActivation() {
445
+ let retries = 0;
446
+ const interval = setInterval(async () => {
447
+ retries += 1;
448
+ const activeSessionId = window.sessionModule?.getActiveSession?.()?.id
449
+ || document.body.dataset.activeSessionId
450
+ || null;
451
+ if (activeSessionId) {
452
+ await _ensureHeaderAffordances(activeSessionId);
453
+ }
454
+ if (retries > 120) clearInterval(interval); // ~2 minutes
455
+ }, 1000);
456
+ }
457
+
458
+ // ── Boot ───────────────────────────────────────────────────────────────────
459
+
460
+ function _boot() {
461
+ _watchForAssistantActivation();
462
+ }
463
+
464
+ if (document.readyState === 'loading') {
465
+ document.addEventListener('DOMContentLoaded', _boot);
466
+ } else {
467
+ _boot();
468
+ }
469
+
470
+ const assistantModule = {
471
+ openAssistantChat,
472
+ openAssistantSettings,
473
+ };
474
+
475
+ export default assistantModule;
@@ -0,0 +1,114 @@
1
+ // static/js/calendar/reminders.js
2
+ //
3
+ // Browser-notification poller for calendar reminder notes. Self-contained:
4
+ // module-private `_notifFired` Set tracks which note IDs we've already
5
+ // notified, persisted to localStorage. Polls `/api/notes?label=calendar`
6
+ // every 60 seconds and fires a Notification + toast for any note whose
7
+ // `due_date` is in the past but within the staleness window.
8
+ //
9
+ // `start()` kicks off the poll loop + permission request. Call once from
10
+ // the calendar's entry module.
11
+
12
+ import uiModule from '../ui.js';
13
+
14
+ const API_BASE = window.location.origin;
15
+
16
+ let _notifFired = new Set(JSON.parse(localStorage.getItem('cal-notif-fired') || '[]'));
17
+
18
+ // Compute a fresh, system-clock-accurate notification body. Tries the
19
+ // note's `event_dtstart` first (set by _createEventReminder); falls back
20
+ // to scrubbing stale time tokens out of items[0].text so legacy
21
+ // reminders don't show "in 29 min" at 9pm.
22
+ function _formatReminderBody(note) {
23
+ const dtstartRaw = note.event_dtstart || note.eventDtstart || null;
24
+ if (dtstartRaw) {
25
+ const start = new Date(dtstartRaw);
26
+ if (!isNaN(start.getTime())) {
27
+ const now = new Date();
28
+ const mins = Math.round((start - now) / 60000);
29
+ const when = start.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });
30
+ let when2 = '';
31
+ const sameDay = start.toDateString() === now.toDateString();
32
+ if (!sameDay) when2 = ' ' + start.toLocaleDateString([], { month: 'short', day: 'numeric' });
33
+ if (mins >= 1 && mins <= 60) return `Starts in ${mins} min (${when}${when2})`;
34
+ if (mins === 0) return `Starting now (${when}${when2})`;
35
+ if (mins > 60) {
36
+ const h = Math.round(mins / 60);
37
+ return `Starts in ${h} hour${h === 1 ? '' : 's'} (${when}${when2})`;
38
+ }
39
+ if (mins >= -60) return `Started ${Math.abs(mins)} min ago (${when}${when2})`;
40
+ return `Was scheduled for ${when}${when2}`;
41
+ }
42
+ }
43
+ // Legacy notes (no event_dtstart). Scrub stale relative-time strings.
44
+ let body = (note.items || []).map(i => i.text).join('\n') || note.content || '';
45
+ body = body.replace(/\bin\s+\d+\s*(min|minute|hour|hr|day)s?\b/gi, '').trim();
46
+ body = body.replace(/\(\s*\d{1,2}:\d{2}\s*\)/g, '').trim();
47
+ body = body.replace(/\s{2,}/g, ' ');
48
+ return body;
49
+ }
50
+
51
+ // Only fire a reminder if `due` was within this many minutes BEFORE now.
52
+ // Stops a fresh browser (empty `cal-notif-fired` localStorage) from spamming
53
+ // every 2-week-old reminder on first poll. Anything older is silently
54
+ // marked fired so it doesn't keep getting picked up.
55
+ const _REMINDER_STALENESS_MIN = 5;
56
+
57
+ async function _pollReminders() {
58
+ try {
59
+ const res = await fetch(`${API_BASE}/api/notes?label=calendar`, { credentials: 'same-origin' });
60
+ if (!res.ok) return;
61
+ const notes = await res.json();
62
+ const now = new Date();
63
+ const stalenessMs = _REMINDER_STALENESS_MIN * 60 * 1000;
64
+ for (const note of notes) {
65
+ if (!note.due_date || _notifFired.has(note.id)) continue;
66
+ const due = new Date(note.due_date);
67
+ if (isNaN(due)) continue;
68
+ if (due > now) continue; // not yet due
69
+ const ageMs = now - due;
70
+ if (ageMs > stalenessMs) {
71
+ // Too old to fire — mark as seen so we don't recheck every minute.
72
+ _notifFired.add(note.id);
73
+ continue;
74
+ }
75
+ _notifFired.add(note.id);
76
+ const body = _formatReminderBody(note);
77
+ fetch(`${API_BASE}/api/notes/fire-reminder`, {
78
+ method: 'POST',
79
+ credentials: 'same-origin',
80
+ headers: { 'Content-Type': 'application/json' },
81
+ body: JSON.stringify({
82
+ note_id: note.id,
83
+ title: note.title || 'Calendar Reminder',
84
+ body,
85
+ }),
86
+ }).catch(() => {});
87
+ if ('Notification' in window && Notification.permission === 'granted') {
88
+ new Notification(note.title || 'Calendar Reminder', {
89
+ body,
90
+ icon: '/static/favicon.png',
91
+ tag: `cal-remind-${note.id}`,
92
+ });
93
+ }
94
+ if (uiModule.showToast) uiModule.showToast((note.title || 'Calendar Reminder') + (body ? ' — ' + body : ''));
95
+ }
96
+ // Persist fired set (keep last 200)
97
+ const arr = [..._notifFired].slice(-200);
98
+ localStorage.setItem('cal-notif-fired', JSON.stringify(arr));
99
+ } catch (_) {}
100
+ }
101
+
102
+ let _started = false;
103
+
104
+ // Idempotent: safe to call multiple times. Kicks off permission request
105
+ // and the 60s poll loop on first call.
106
+ export function startReminderPoll() {
107
+ if (_started) return;
108
+ _started = true;
109
+ if ('Notification' in window && Notification.permission === 'default') {
110
+ Notification.requestPermission();
111
+ }
112
+ _pollReminders();
113
+ setInterval(_pollReminders, 60000);
114
+ }