agim-cli 1.4.9 → 1.5.1

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 (659) hide show
  1. package/CHANGELOG.md +437 -402
  2. package/README.md +43 -7
  3. package/README.zh-CN.md +42 -7
  4. package/bin/agim_rpc.py +12 -12
  5. package/dist/cli-ui/cmd-handlers.d.ts +25 -4
  6. package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
  7. package/dist/cli-ui/cmd-handlers.js +315 -59
  8. package/dist/cli-ui/cmd-handlers.js.map +1 -1
  9. package/dist/cli-ui/config-wizard.d.ts +13 -1
  10. package/dist/cli-ui/config-wizard.d.ts.map +1 -1
  11. package/dist/cli-ui/config-wizard.js +120 -48
  12. package/dist/cli-ui/config-wizard.js.map +1 -1
  13. package/dist/cli-ui/doctor.d.ts +15 -0
  14. package/dist/cli-ui/doctor.d.ts.map +1 -0
  15. package/dist/cli-ui/doctor.js +151 -0
  16. package/dist/cli-ui/doctor.js.map +1 -0
  17. package/dist/cli-ui/entry-menu.d.ts +6 -0
  18. package/dist/cli-ui/entry-menu.d.ts.map +1 -1
  19. package/dist/cli-ui/entry-menu.js +67 -30
  20. package/dist/cli-ui/entry-menu.js.map +1 -1
  21. package/dist/cli-ui/env-file.d.ts +4 -4
  22. package/dist/cli-ui/env-file.js +13 -13
  23. package/dist/cli-ui/env-file.js.map +1 -1
  24. package/dist/cli-ui/i18n.d.ts +17 -8
  25. package/dist/cli-ui/i18n.d.ts.map +1 -1
  26. package/dist/cli-ui/i18n.js +39 -21
  27. package/dist/cli-ui/i18n.js.map +1 -1
  28. package/dist/cli-ui/lang-picker.js +1 -1
  29. package/dist/cli-ui/lang-picker.js.map +1 -1
  30. package/dist/cli-ui/paths.d.ts.map +1 -1
  31. package/dist/cli-ui/paths.js +2 -4
  32. package/dist/cli-ui/paths.js.map +1 -1
  33. package/dist/cli-ui/quickstart.d.ts +3 -0
  34. package/dist/cli-ui/quickstart.d.ts.map +1 -0
  35. package/dist/cli-ui/quickstart.js +108 -0
  36. package/dist/cli-ui/quickstart.js.map +1 -0
  37. package/dist/cli-ui/readiness.d.ts +10 -0
  38. package/dist/cli-ui/readiness.d.ts.map +1 -0
  39. package/dist/cli-ui/readiness.js +75 -0
  40. package/dist/cli-ui/readiness.js.map +1 -0
  41. package/dist/cli-ui/service.d.ts +30 -7
  42. package/dist/cli-ui/service.d.ts.map +1 -1
  43. package/dist/cli-ui/service.js +171 -77
  44. package/dist/cli-ui/service.js.map +1 -1
  45. package/dist/cli-ui/tui/app.js +2 -2
  46. package/dist/cli-ui/tui/app.js.map +1 -1
  47. package/dist/cli-ui/tui/index.js +6 -6
  48. package/dist/cli-ui/tui/index.js.map +1 -1
  49. package/dist/cli-ui/tui/mouse-stdin.js +1 -1
  50. package/dist/cli-ui/tui/mouse-stdin.js.map +1 -1
  51. package/dist/cli-ui/tui/stream-reveal.d.ts +2 -2
  52. package/dist/cli-ui/tui/stream-reveal.d.ts.map +1 -1
  53. package/dist/cli-ui/tui/stream-reveal.js +4 -4
  54. package/dist/cli-ui/tui/stream-reveal.js.map +1 -1
  55. package/dist/cli.js +118 -436
  56. package/dist/cli.js.map +1 -1
  57. package/dist/core/a2a-notify.js +5 -5
  58. package/dist/core/a2a-notify.js.map +1 -1
  59. package/dist/core/a2a.d.ts +2 -2
  60. package/dist/core/a2a.d.ts.map +1 -1
  61. package/dist/core/a2a.js +12 -12
  62. package/dist/core/a2a.js.map +1 -1
  63. package/dist/core/access-token.d.ts +1 -1
  64. package/dist/core/access-token.js +7 -7
  65. package/dist/core/access-token.js.map +1 -1
  66. package/dist/core/acp-server.d.ts.map +1 -1
  67. package/dist/core/acp-server.js +21 -7
  68. package/dist/core/acp-server.js.map +1 -1
  69. package/dist/core/admin-allowlist.js +5 -5
  70. package/dist/core/admin-allowlist.js.map +1 -1
  71. package/dist/core/agent-base.d.ts +1 -1
  72. package/dist/core/agent-base.js +3 -3
  73. package/dist/core/agent-base.js.map +1 -1
  74. package/dist/core/agent-cwd.d.ts +13 -6
  75. package/dist/core/agent-cwd.d.ts.map +1 -1
  76. package/dist/core/agent-cwd.js +72 -23
  77. package/dist/core/agent-cwd.js.map +1 -1
  78. package/dist/core/agim-paths.d.ts +1 -4
  79. package/dist/core/agim-paths.d.ts.map +1 -1
  80. package/dist/core/agim-paths.js +18 -35
  81. package/dist/core/agim-paths.js.map +1 -1
  82. package/dist/core/approval-bus.d.ts +4 -4
  83. package/dist/core/approval-bus.d.ts.map +1 -1
  84. package/dist/core/approval-bus.js +14 -14
  85. package/dist/core/approval-bus.js.map +1 -1
  86. package/dist/core/approval-router.js +2 -2
  87. package/dist/core/artifacts.js +3 -3
  88. package/dist/core/artifacts.js.map +1 -1
  89. package/dist/core/ask-user-rpc.js +1 -1
  90. package/dist/core/ask-user-rpc.js.map +1 -1
  91. package/dist/core/audit-log.js +2 -2
  92. package/dist/core/audit-log.js.map +1 -1
  93. package/dist/core/bgjob-reader.d.ts +1 -1
  94. package/dist/core/bgjob-reader.js +4 -4
  95. package/dist/core/bgjob-reader.js.map +1 -1
  96. package/dist/core/commands/approval.js +2 -2
  97. package/dist/core/commands/approval.js.map +1 -1
  98. package/dist/core/commands/builtin.d.ts.map +1 -1
  99. package/dist/core/commands/builtin.js +12 -2
  100. package/dist/core/commands/builtin.js.map +1 -1
  101. package/dist/core/commands/heartbeat.js +2 -2
  102. package/dist/core/commands/heartbeat.js.map +1 -1
  103. package/dist/core/commands/memo.js +1 -1
  104. package/dist/core/commands/memo.js.map +1 -1
  105. package/dist/core/commands/model.d.ts.map +1 -1
  106. package/dist/core/commands/model.js +32 -3
  107. package/dist/core/commands/model.js.map +1 -1
  108. package/dist/core/commands/plan.js +3 -3
  109. package/dist/core/commands/plan.js.map +1 -1
  110. package/dist/core/commands/router-compare.js +3 -3
  111. package/dist/core/commands/router-compare.js.map +1 -1
  112. package/dist/core/commands/service.d.ts.map +1 -1
  113. package/dist/core/commands/service.js +1 -3
  114. package/dist/core/commands/service.js.map +1 -1
  115. package/dist/core/commands/sessions.js +4 -4
  116. package/dist/core/commands/sessions.js.map +1 -1
  117. package/dist/core/commands/skill.js +1 -1
  118. package/dist/core/commands/skill.js.map +1 -1
  119. package/dist/core/commands/stats.js +1 -1
  120. package/dist/core/commands/stats.js.map +1 -1
  121. package/dist/core/commands/web.js +5 -5
  122. package/dist/core/commands/web.js.map +1 -1
  123. package/dist/core/config-schema.js +1 -1
  124. package/dist/core/coord-systems.d.ts +1 -1
  125. package/dist/core/coord-systems.js +4 -4
  126. package/dist/core/coord-systems.js.map +1 -1
  127. package/dist/core/event-bus.d.ts +5 -5
  128. package/dist/core/event-bus.d.ts.map +1 -1
  129. package/dist/core/event-bus.js +3 -3
  130. package/dist/core/event-bus.js.map +1 -1
  131. package/dist/core/feature-flags.d.ts +2 -2
  132. package/dist/core/feature-flags.js +4 -4
  133. package/dist/core/feature-flags.js.map +1 -1
  134. package/dist/core/goal-rpc.js +2 -2
  135. package/dist/core/goal-rpc.js.map +1 -1
  136. package/dist/core/goals.d.ts +1 -1
  137. package/dist/core/goals.js +3 -3
  138. package/dist/core/goals.js.map +1 -1
  139. package/dist/core/heartbeat-store.d.ts +1 -1
  140. package/dist/core/heartbeat-store.d.ts.map +1 -1
  141. package/dist/core/heartbeat-store.js +3 -3
  142. package/dist/core/heartbeat-store.js.map +1 -1
  143. package/dist/core/heartbeat.js +4 -4
  144. package/dist/core/heartbeat.js.map +1 -1
  145. package/dist/core/intent-llm.d.ts +2 -2
  146. package/dist/core/intent-llm.js +5 -5
  147. package/dist/core/intent-llm.js.map +1 -1
  148. package/dist/core/job-board.d.ts +5 -5
  149. package/dist/core/job-board.d.ts.map +1 -1
  150. package/dist/core/job-board.js +17 -17
  151. package/dist/core/job-board.js.map +1 -1
  152. package/dist/core/llm/agent-loop.d.ts +3 -3
  153. package/dist/core/llm/agent-loop.js +14 -14
  154. package/dist/core/llm/agent-loop.js.map +1 -1
  155. package/dist/core/llm/{imhub-dispatcher.d.ts → agim-dispatcher.d.ts} +4 -4
  156. package/dist/core/llm/agim-dispatcher.d.ts.map +1 -0
  157. package/dist/core/llm/{imhub-dispatcher.js → agim-dispatcher.js} +43 -43
  158. package/dist/core/llm/agim-dispatcher.js.map +1 -0
  159. package/dist/core/llm/agim-rpc-server.js +17 -17
  160. package/dist/core/llm/agim-rpc-server.js.map +1 -1
  161. package/dist/core/llm/anthropic-provider.js +2 -1
  162. package/dist/core/llm/anthropic-provider.js.map +1 -1
  163. package/dist/core/llm/auto-compact.d.ts +3 -3
  164. package/dist/core/llm/auto-compact.d.ts.map +1 -1
  165. package/dist/core/llm/auto-compact.js +5 -5
  166. package/dist/core/llm/auto-compact.js.map +1 -1
  167. package/dist/core/llm/builtin-dispatcher.js +3 -3
  168. package/dist/core/llm/builtin-dispatcher.js.map +1 -1
  169. package/dist/core/llm/exec-dispatcher.d.ts +2 -2
  170. package/dist/core/llm/exec-dispatcher.d.ts.map +1 -1
  171. package/dist/core/llm/exec-dispatcher.js +20 -22
  172. package/dist/core/llm/exec-dispatcher.js.map +1 -1
  173. package/dist/core/llm/fs-dispatcher.js +8 -8
  174. package/dist/core/llm/fs-dispatcher.js.map +1 -1
  175. package/dist/core/llm/goal-critic.js +4 -4
  176. package/dist/core/llm/goal-critic.js.map +1 -1
  177. package/dist/core/llm/hallucination-detector.js +2 -2
  178. package/dist/core/llm/hallucination-detector.js.map +1 -1
  179. package/dist/core/llm/mcp-client.d.ts +1 -1
  180. package/dist/core/llm/mcp-client.js +3 -3
  181. package/dist/core/llm/mcp-client.js.map +1 -1
  182. package/dist/core/llm/mcp-registry.js +3 -3
  183. package/dist/core/llm/mcp-registry.js.map +1 -1
  184. package/dist/core/llm/openai-compat-provider.d.ts +1 -1
  185. package/dist/core/llm/openai-compat-provider.js +5 -4
  186. package/dist/core/llm/openai-compat-provider.js.map +1 -1
  187. package/dist/core/llm/provider-base.d.ts +5 -5
  188. package/dist/core/llm/provider-base.d.ts.map +1 -1
  189. package/dist/core/llm/provider-base.js +1 -1
  190. package/dist/core/llm/provider-base.js.map +1 -1
  191. package/dist/core/llm/secrets.d.ts +2 -2
  192. package/dist/core/llm/secrets.d.ts.map +1 -1
  193. package/dist/core/llm/tool-dispatcher.d.ts +1 -1
  194. package/dist/core/llm/web-dispatcher.d.ts +1 -1
  195. package/dist/core/llm/web-dispatcher.js +15 -15
  196. package/dist/core/llm/web-dispatcher.js.map +1 -1
  197. package/dist/core/logger.d.ts +1 -1
  198. package/dist/core/logger.js +3 -3
  199. package/dist/core/logger.js.map +1 -1
  200. package/dist/core/memo-rpc.js +3 -3
  201. package/dist/core/memo-rpc.js.map +1 -1
  202. package/dist/core/memory-consolidate.js +4 -4
  203. package/dist/core/memory-consolidate.js.map +1 -1
  204. package/dist/core/memory-distill.js +4 -4
  205. package/dist/core/memory-distill.js.map +1 -1
  206. package/dist/core/memory-distiller.js +9 -9
  207. package/dist/core/memory-distiller.js.map +1 -1
  208. package/dist/core/memory-vector.js +9 -9
  209. package/dist/core/memory-vector.js.map +1 -1
  210. package/dist/core/memory.js +2 -2
  211. package/dist/core/memory.js.map +1 -1
  212. package/dist/core/memos.js +6 -6
  213. package/dist/core/memos.js.map +1 -1
  214. package/dist/core/message-sink.js +13 -13
  215. package/dist/core/message-sink.js.map +1 -1
  216. package/dist/core/notification-evaluator.d.ts +2 -2
  217. package/dist/core/notification-evaluator.js +4 -4
  218. package/dist/core/notification-evaluator.js.map +1 -1
  219. package/dist/core/onboarding.js +3 -3
  220. package/dist/core/onboarding.js.map +1 -1
  221. package/dist/core/outbox.js +2 -2
  222. package/dist/core/outbox.js.map +1 -1
  223. package/dist/core/persona.d.ts +1 -1
  224. package/dist/core/persona.d.ts.map +1 -1
  225. package/dist/core/persona.js +2 -2
  226. package/dist/core/persona.js.map +1 -1
  227. package/dist/core/plan-history.js +1 -1
  228. package/dist/core/plan-history.js.map +1 -1
  229. package/dist/core/plan-intent.js +5 -5
  230. package/dist/core/plan-intent.js.map +1 -1
  231. package/dist/core/plan-mode-state.d.ts +1 -1
  232. package/dist/core/plan-mode-state.js +4 -4
  233. package/dist/core/plan-mode-state.js.map +1 -1
  234. package/dist/core/push-rpc.d.ts +1 -1
  235. package/dist/core/push-rpc.js +6 -6
  236. package/dist/core/push-rpc.js.map +1 -1
  237. package/dist/core/registry.d.ts +4 -4
  238. package/dist/core/registry.js +10 -10
  239. package/dist/core/registry.js.map +1 -1
  240. package/dist/core/reminders.js +1 -1
  241. package/dist/core/reminders.js.map +1 -1
  242. package/dist/core/restart-flow.d.ts.map +1 -1
  243. package/dist/core/restart-flow.js +5 -7
  244. package/dist/core/restart-flow.js.map +1 -1
  245. package/dist/core/router.d.ts +1 -1
  246. package/dist/core/router.js +5 -5
  247. package/dist/core/router.js.map +1 -1
  248. package/dist/core/schedule.d.ts +2 -2
  249. package/dist/core/schedule.js +4 -4
  250. package/dist/core/schedule.js.map +1 -1
  251. package/dist/core/self-protect.js +3 -3
  252. package/dist/core/self-protect.js.map +1 -1
  253. package/dist/core/sender-allowlist.js +7 -7
  254. package/dist/core/sender-allowlist.js.map +1 -1
  255. package/dist/core/sensitive-paths.d.ts.map +1 -1
  256. package/dist/core/sensitive-paths.js +1 -2
  257. package/dist/core/sensitive-paths.js.map +1 -1
  258. package/dist/core/session.js +2 -2
  259. package/dist/core/session.js.map +1 -1
  260. package/dist/core/skills/builtin/ECC_NOTICE.md +1 -1
  261. package/dist/core/skills/builtin/agim-memory/SKILL.md +1 -1
  262. package/dist/core/skills/builtin/agim-reminders/SKILL.md +2 -2
  263. package/dist/core/skills/builtin/agim-self/SKILL.md +9 -9
  264. package/dist/core/skills/builtin/agim-skill-discovery/SKILL.md +5 -5
  265. package/dist/core/skills/builtin/image-generation/SKILL.md +2 -2
  266. package/dist/core/skills/builtin/long-goal/SKILL.md +7 -7
  267. package/dist/core/skills/builtin/my/SKILL.md +2 -2
  268. package/dist/core/skills/builtin/skill-creator/SKILL.md +2 -2
  269. package/dist/core/skills/loader.d.ts +4 -4
  270. package/dist/core/skills/loader.js +22 -22
  271. package/dist/core/skills/loader.js.map +1 -1
  272. package/dist/core/skills-rpc.js +1 -1
  273. package/dist/core/skills-rpc.js.map +1 -1
  274. package/dist/core/transcribe.js +13 -13
  275. package/dist/core/transcribe.js.map +1 -1
  276. package/dist/core/tunnel.js +1 -1
  277. package/dist/core/tunnel.js.map +1 -1
  278. package/dist/core/types.d.ts +2 -2
  279. package/dist/core/types.d.ts.map +1 -1
  280. package/dist/core/user-coord-prefs.js +1 -1
  281. package/dist/core/user-coord-prefs.js.map +1 -1
  282. package/dist/core/viewer-config.d.ts +8 -8
  283. package/dist/core/viewer-config.js +17 -17
  284. package/dist/core/viewer-config.js.map +1 -1
  285. package/dist/core/viewer-local.js +4 -4
  286. package/dist/core/viewer-local.js.map +1 -1
  287. package/dist/core/viewer-remote.js +1 -1
  288. package/dist/core/viewer-remote.js.map +1 -1
  289. package/dist/plugins/agents/acp/url-guard.d.ts +1 -1
  290. package/dist/plugins/agents/acp/url-guard.js +2 -2
  291. package/dist/plugins/agents/acp/url-guard.js.map +1 -1
  292. package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts +6 -6
  293. package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts.map +1 -1
  294. package/dist/plugins/agents/antigravity/ensure-mcp-config.js +12 -12
  295. package/dist/plugins/agents/antigravity/ensure-mcp-config.js.map +1 -1
  296. package/dist/plugins/agents/antigravity/index.js +10 -10
  297. package/dist/plugins/agents/antigravity/index.js.map +1 -1
  298. package/dist/plugins/agents/claude-code/index.d.ts +2 -2
  299. package/dist/plugins/agents/claude-code/index.js +16 -16
  300. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  301. package/dist/plugins/agents/claude-code/mcp-approval-server.js +13 -13
  302. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  303. package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts +4 -4
  304. package/dist/plugins/agents/codex/build-mcp-cli-args.js +14 -14
  305. package/dist/plugins/agents/codex/build-mcp-cli-args.js.map +1 -1
  306. package/dist/plugins/agents/codex/index.d.ts +3 -3
  307. package/dist/plugins/agents/codex/index.js +14 -14
  308. package/dist/plugins/agents/codex/index.js.map +1 -1
  309. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +5 -5
  310. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -1
  311. package/dist/plugins/agents/cursor/ensure-mcp-config.js +11 -11
  312. package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -1
  313. package/dist/plugins/agents/cursor/index.d.ts +1 -1
  314. package/dist/plugins/agents/cursor/index.js +12 -12
  315. package/dist/plugins/agents/cursor/index.js.map +1 -1
  316. package/dist/plugins/agents/native/index.d.ts +1 -0
  317. package/dist/plugins/agents/native/index.d.ts.map +1 -1
  318. package/dist/plugins/agents/native/index.js +28 -14
  319. package/dist/plugins/agents/native/index.js.map +1 -1
  320. package/dist/plugins/agents/native/tool-registry.d.ts +3 -3
  321. package/dist/plugins/agents/native/tool-registry.d.ts.map +1 -1
  322. package/dist/plugins/agents/native/tool-registry.js +5 -5
  323. package/dist/plugins/agents/native/tool-registry.js.map +1 -1
  324. package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts +1 -1
  325. package/dist/plugins/agents/opencode/ensure-mcp-config.js +9 -9
  326. package/dist/plugins/agents/opencode/ensure-mcp-config.js.map +1 -1
  327. package/dist/plugins/agents/opencode/index.js +3 -3
  328. package/dist/plugins/agents/opencode/index.js.map +1 -1
  329. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +4 -0
  330. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -1
  331. package/dist/plugins/agents/opencode/opencode-http-adapter.js +16 -12
  332. package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -1
  333. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +2 -2
  334. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  335. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +7 -5
  336. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  337. package/dist/plugins/agents/opencode/serve-manager.d.ts +1 -1
  338. package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -1
  339. package/dist/plugins/agents/opencode/serve-manager.js +10 -10
  340. package/dist/plugins/agents/opencode/serve-manager.js.map +1 -1
  341. package/dist/plugins/agents/pi-native/factory.d.ts.map +1 -1
  342. package/dist/plugins/agents/pi-native/factory.js +29 -13
  343. package/dist/plugins/agents/pi-native/factory.js.map +1 -1
  344. package/dist/plugins/agents/pi-native/index.d.ts +14 -3
  345. package/dist/plugins/agents/pi-native/index.d.ts.map +1 -1
  346. package/dist/plugins/agents/pi-native/index.js +58 -4
  347. package/dist/plugins/agents/pi-native/index.js.map +1 -1
  348. package/dist/plugins/agents/pi-native/provider-resolver.d.ts +2 -0
  349. package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -1
  350. package/dist/plugins/agents/pi-native/provider-resolver.js +9 -1
  351. package/dist/plugins/agents/pi-native/provider-resolver.js.map +1 -1
  352. package/dist/plugins/agents/pi-native/tool-bridge.js +1 -1
  353. package/dist/plugins/agents/pi-native/tool-bridge.js.map +1 -1
  354. package/dist/plugins/agents/pi-native/tools.js +4 -4
  355. package/dist/plugins/agents/pi-native/tools.js.map +1 -1
  356. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts +1 -1
  357. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js +2 -2
  358. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js.map +1 -1
  359. package/dist/plugins/messengers/email/email-adapter.js +15 -15
  360. package/dist/plugins/messengers/email/email-adapter.js.map +1 -1
  361. package/dist/plugins/messengers/telegram/media-download.d.ts +1 -1
  362. package/dist/plugins/messengers/telegram/media-download.js +4 -4
  363. package/dist/plugins/messengers/telegram/media-download.js.map +1 -1
  364. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +1 -1
  365. package/dist/plugins/messengers/telegram/telegram-adapter.js +3 -3
  366. package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -1
  367. package/dist/plugins/messengers/wechat/context-store.js +1 -1
  368. package/dist/plugins/messengers/wechat/context-store.js.map +1 -1
  369. package/dist/plugins/messengers/wechat/ilink-adapter.js +1 -1
  370. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  371. package/dist/plugins/messengers/wechat/ilink-client.js +1 -1
  372. package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -1
  373. package/dist/plugins/messengers/wechat/media-download.js +1 -1
  374. package/dist/plugins/messengers/wechat/media-download.js.map +1 -1
  375. package/dist/scripts/migrate-gcj02-to-wgs84.js +1 -1
  376. package/dist/scripts/migrate-gcj02-to-wgs84.js.map +1 -1
  377. package/dist/web/public/assets/a2a-CTsDMefo.js +7 -0
  378. package/dist/web/public/assets/a2a-CTsDMefo.js.map +1 -0
  379. package/dist/web/public/assets/{activity-BnlFGipw.js → activity-ul8Os7Pz.js} +2 -2
  380. package/dist/web/public/assets/{activity-BnlFGipw.js.map → activity-ul8Os7Pz.js.map} +1 -1
  381. package/dist/web/public/assets/{admins-CH84Rw1d.js → admins-ByMAuquy.js} +3 -3
  382. package/dist/web/public/assets/{admins-CH84Rw1d.js.map → admins-ByMAuquy.js.map} +1 -1
  383. package/dist/web/public/assets/agents-Ds1zyxBj.js +2 -0
  384. package/dist/web/public/assets/agents-Ds1zyxBj.js.map +1 -0
  385. package/dist/web/public/assets/{approvals-DnzjbDR6.js → approvals-DOWlWI7Z.js} +3 -3
  386. package/dist/web/public/assets/{approvals-DnzjbDR6.js.map → approvals-DOWlWI7Z.js.map} +1 -1
  387. package/dist/web/public/assets/{arrow-down-DxlRHrs8.js → arrow-down-7i0xwCI2.js} +2 -2
  388. package/dist/web/public/assets/{arrow-down-DxlRHrs8.js.map → arrow-down-7i0xwCI2.js.map} +1 -1
  389. package/dist/web/public/assets/arrow-right-A889Wof8.js +7 -0
  390. package/dist/web/public/assets/arrow-right-A889Wof8.js.map +1 -0
  391. package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js → arrow-up-Dm0U4-6U.js} +2 -2
  392. package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js.map → arrow-up-Dm0U4-6U.js.map} +1 -1
  393. package/dist/web/public/assets/{asks-DyUQopay.js → asks-DGuBsrJ7.js} +3 -3
  394. package/dist/web/public/assets/{asks-DyUQopay.js.map → asks-DGuBsrJ7.js.map} +1 -1
  395. package/dist/web/public/assets/{audit-BVHTMS82.js → audit-BRXsplJ2.js} +2 -2
  396. package/dist/web/public/assets/{audit-BVHTMS82.js.map → audit-BRXsplJ2.js.map} +1 -1
  397. package/dist/web/public/assets/{bell-D7iS7ctN.js → bell-B-UdeJsp.js} +2 -2
  398. package/dist/web/public/assets/{bell-D7iS7ctN.js.map → bell-B-UdeJsp.js.map} +1 -1
  399. package/dist/web/public/assets/bgjobs-CcRiffyJ.js +2 -0
  400. package/dist/web/public/assets/bgjobs-CcRiffyJ.js.map +1 -0
  401. package/dist/web/public/assets/book-open-CSCq5cjL.js +7 -0
  402. package/dist/web/public/assets/book-open-CSCq5cjL.js.map +1 -0
  403. package/dist/web/public/assets/{brain-CCF25Egu.js → brain-Dl4DF5kX.js} +2 -2
  404. package/dist/web/public/assets/{brain-CCF25Egu.js.map → brain-Dl4DF5kX.js.map} +1 -1
  405. package/dist/web/public/assets/{briefcase-BMLMD8nM.js → briefcase-CeKUkFSq.js} +2 -2
  406. package/dist/web/public/assets/{briefcase-BMLMD8nM.js.map → briefcase-CeKUkFSq.js.map} +1 -1
  407. package/dist/web/public/assets/chat-rLJMdJBk.js +12 -0
  408. package/dist/web/public/assets/chat-rLJMdJBk.js.map +1 -0
  409. package/dist/web/public/assets/{chevron-left-BDO3vw8G.js → chevron-left-01fAFVpo.js} +2 -2
  410. package/dist/web/public/assets/{chevron-left-BDO3vw8G.js.map → chevron-left-01fAFVpo.js.map} +1 -1
  411. package/dist/web/public/assets/{chevron-right-5ZUC2opg.js → chevron-right-CFRb-SM_.js} +3 -3
  412. package/dist/web/public/assets/{chevron-right-5ZUC2opg.js.map → chevron-right-CFRb-SM_.js.map} +1 -1
  413. package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js → circle-check-big-DBg2BD6o.js} +2 -2
  414. package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js.map → circle-check-big-DBg2BD6o.js.map} +1 -1
  415. package/dist/web/public/assets/{circle-x-7VaoZ7dY.js → circle-x-CqFMzO-x.js} +2 -2
  416. package/dist/web/public/assets/{circle-x-7VaoZ7dY.js.map → circle-x-CqFMzO-x.js.map} +1 -1
  417. package/dist/web/public/assets/clipboard-list-lnqdk2_J.js +7 -0
  418. package/dist/web/public/assets/clipboard-list-lnqdk2_J.js.map +1 -0
  419. package/dist/web/public/assets/{clock-ZPVXnd6V.js → clock-4hd1joQe.js} +3 -3
  420. package/dist/web/public/assets/{clock-ZPVXnd6V.js.map → clock-4hd1joQe.js.map} +1 -1
  421. package/dist/web/public/assets/confirm-dialog-BDb0NLny.js +2 -0
  422. package/dist/web/public/assets/{confirm-dialog-CgpJL9oN.js.map → confirm-dialog-BDb0NLny.js.map} +1 -1
  423. package/dist/web/public/assets/{copy-BaZl52tH.js → copy-CD4A7VD8.js} +3 -3
  424. package/dist/web/public/assets/{copy-BaZl52tH.js.map → copy-CD4A7VD8.js.map} +1 -1
  425. package/dist/web/public/assets/dashboard-CG3WiG7h.js +2 -0
  426. package/dist/web/public/assets/dashboard-CG3WiG7h.js.map +1 -0
  427. package/dist/web/public/assets/{data-table-BLYG79TX.js → data-table-BkUshOZz.js} +2 -2
  428. package/dist/web/public/assets/{data-table-BLYG79TX.js.map → data-table-BkUshOZz.js.map} +1 -1
  429. package/dist/web/public/assets/database-lQzk64rV.js +7 -0
  430. package/dist/web/public/assets/database-lQzk64rV.js.map +1 -0
  431. package/dist/web/public/assets/distill-CPurVW3v.js +7 -0
  432. package/dist/web/public/assets/distill-CPurVW3v.js.map +1 -0
  433. package/dist/web/public/assets/{download-bzCepctg.js → download-CVZnHcwj.js} +2 -2
  434. package/dist/web/public/assets/{download-bzCepctg.js.map → download-CVZnHcwj.js.map} +1 -1
  435. package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js +7 -0
  436. package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js.map +1 -0
  437. package/dist/web/public/assets/email-YlI4MWLp.js +7 -0
  438. package/dist/web/public/assets/email-YlI4MWLp.js.map +1 -0
  439. package/dist/web/public/assets/{empty-state-96qpPTNg.js → empty-state-CuiqdZiB.js} +2 -2
  440. package/dist/web/public/assets/{empty-state-96qpPTNg.js.map → empty-state-CuiqdZiB.js.map} +1 -1
  441. package/dist/web/public/assets/{external-link-J4nIlCem.js → external-link-1WPpVvdu.js} +2 -2
  442. package/dist/web/public/assets/{external-link-J4nIlCem.js.map → external-link-1WPpVvdu.js.map} +1 -1
  443. package/dist/web/public/assets/{eye-BvsBLK42.js → eye-BfPyNFzk.js} +2 -2
  444. package/dist/web/public/assets/{eye-BvsBLK42.js.map → eye-BfPyNFzk.js.map} +1 -1
  445. package/dist/web/public/assets/{facts-DMucDXYd.js → facts-xT_24pH8.js} +2 -2
  446. package/dist/web/public/assets/{facts-DMucDXYd.js.map → facts-xT_24pH8.js.map} +1 -1
  447. package/dist/web/public/assets/file-text-BxfdLM0-.js +7 -0
  448. package/dist/web/public/assets/file-text-BxfdLM0-.js.map +1 -0
  449. package/dist/web/public/assets/{goals-B9ETHgL0.js → goals-C8ZQfbhj.js} +3 -3
  450. package/dist/web/public/assets/{goals-B9ETHgL0.js.map → goals-C8ZQfbhj.js.map} +1 -1
  451. package/dist/web/public/assets/health-A2StNEfn.js +2 -0
  452. package/dist/web/public/assets/{health-DLzZ7KHc.js.map → health-A2StNEfn.js.map} +1 -1
  453. package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js → heart-pulse-DXlE9oic.js} +2 -2
  454. package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js.map → heart-pulse-DXlE9oic.js.map} +1 -1
  455. package/dist/web/public/assets/{heartbeat-B1BEBHge.js → heartbeat-ClO5gJrj.js} +3 -3
  456. package/dist/web/public/assets/{heartbeat-B1BEBHge.js.map → heartbeat-ClO5gJrj.js.map} +1 -1
  457. package/dist/web/public/assets/hot-bfTA-V_z.js +7 -0
  458. package/dist/web/public/assets/{hot-Yc7iad0D.js.map → hot-bfTA-V_z.js.map} +1 -1
  459. package/dist/web/public/assets/index-Bi2qWb-u.css +1 -0
  460. package/dist/web/public/assets/index-DCfdN5R7.js +244 -0
  461. package/dist/web/public/assets/index-DCfdN5R7.js.map +1 -0
  462. package/dist/web/public/assets/{injection-Ca-9gbo0.js → injection-omvCR6-p.js} +2 -2
  463. package/dist/web/public/assets/{injection-Ca-9gbo0.js.map → injection-omvCR6-p.js.map} +1 -1
  464. package/dist/web/public/assets/{installed-Zz34apdi.js → installed-DL6r3ktm.js} +4 -9
  465. package/dist/web/public/assets/installed-DL6r3ktm.js.map +1 -0
  466. package/dist/web/public/assets/jobs-Biy5lYd4.js +2 -0
  467. package/dist/web/public/assets/jobs-Biy5lYd4.js.map +1 -0
  468. package/dist/web/public/assets/layout-BLm6NJ3V.js +2 -0
  469. package/dist/web/public/assets/layout-BLm6NJ3V.js.map +1 -0
  470. package/dist/web/public/assets/layout-BTKafRVZ.js +2 -0
  471. package/dist/web/public/assets/layout-BTKafRVZ.js.map +1 -0
  472. package/dist/web/public/assets/layout-Bm-2s2fp.js +2 -0
  473. package/dist/web/public/assets/layout-Bm-2s2fp.js.map +1 -0
  474. package/dist/web/public/assets/layout-DsZ8eR4i.js +2 -0
  475. package/dist/web/public/assets/layout-DsZ8eR4i.js.map +1 -0
  476. package/dist/web/public/assets/{layout-CtDc2i7w.js → layout-sxvovjEH.js} +2 -2
  477. package/dist/web/public/assets/{layout-CtDc2i7w.js.map → layout-sxvovjEH.js.map} +1 -1
  478. package/dist/web/public/assets/llm-JjZDbBvJ.js +37 -0
  479. package/dist/web/public/assets/llm-JjZDbBvJ.js.map +1 -0
  480. package/dist/web/public/assets/loader-circle-DDdmcH0k.js +7 -0
  481. package/dist/web/public/assets/{loader-circle-D8L1w9c1.js.map → loader-circle-DDdmcH0k.js.map} +1 -1
  482. package/dist/web/public/assets/{map-pin--GMunU9n.js → map-pin-C_jAxukI.js} +2 -2
  483. package/dist/web/public/assets/{map-pin--GMunU9n.js.map → map-pin-C_jAxukI.js.map} +1 -1
  484. package/dist/web/public/assets/{mcp-DhnXhO9B.js → mcp-vKajK1F8.js} +3 -3
  485. package/dist/web/public/assets/{mcp-DhnXhO9B.js.map → mcp-vKajK1F8.js.map} +1 -1
  486. package/dist/web/public/assets/memos-DAt4k3DO.js +7 -0
  487. package/dist/web/public/assets/memos-DAt4k3DO.js.map +1 -0
  488. package/dist/web/public/assets/messengers-GYVTFlAj.js +2 -0
  489. package/dist/web/public/assets/messengers-GYVTFlAj.js.map +1 -0
  490. package/dist/web/public/assets/{mobile-CUZ359rQ.js → mobile-VUyTo40E.js} +3 -3
  491. package/dist/web/public/assets/{mobile-CUZ359rQ.js.map → mobile-VUyTo40E.js.map} +1 -1
  492. package/dist/web/public/assets/{network-BBdRdrH_.js → network-BUeWK3bs.js} +2 -2
  493. package/dist/web/public/assets/{network-BBdRdrH_.js.map → network-BUeWK3bs.js.map} +1 -1
  494. package/dist/web/public/assets/outbox-CEE0rwN3.js +2 -0
  495. package/dist/web/public/assets/outbox-CEE0rwN3.js.map +1 -0
  496. package/dist/web/public/assets/overview-BSOZ5gTD.js +12 -0
  497. package/dist/web/public/assets/overview-BSOZ5gTD.js.map +1 -0
  498. package/dist/web/public/assets/overview-COop5K2Y.js +12 -0
  499. package/dist/web/public/assets/overview-COop5K2Y.js.map +1 -0
  500. package/dist/web/public/assets/overview-DeH5ud6d.js +2 -0
  501. package/dist/web/public/assets/overview-DeH5ud6d.js.map +1 -0
  502. package/dist/web/public/assets/{pagination-DcsgDXXM.js → pagination-BBicLzXP.js} +3 -3
  503. package/dist/web/public/assets/{pagination-DcsgDXXM.js.map → pagination-BBicLzXP.js.map} +1 -1
  504. package/dist/web/public/assets/persona-CElXQZ4p.js +2 -0
  505. package/dist/web/public/assets/{persona-ig2ac4mY.js.map → persona-CElXQZ4p.js.map} +1 -1
  506. package/dist/web/public/assets/{plans-Bzbk8eUr.js → plans-Bo5LlLeH.js} +3 -8
  507. package/dist/web/public/assets/plans-Bo5LlLeH.js.map +1 -0
  508. package/dist/web/public/assets/{play-Di1jqulh.js → play-DX5wp4WH.js} +2 -2
  509. package/dist/web/public/assets/{play-Di1jqulh.js.map → play-DX5wp4WH.js.map} +1 -1
  510. package/dist/web/public/assets/{plus-C2zyJ1mF.js → plus-DH4J_YhN.js} +2 -2
  511. package/dist/web/public/assets/{plus-C2zyJ1mF.js.map → plus-DH4J_YhN.js.map} +1 -1
  512. package/dist/web/public/assets/policy-BrgOuDt_.js +2 -0
  513. package/dist/web/public/assets/policy-BrgOuDt_.js.map +1 -0
  514. package/dist/web/public/assets/{qr-code-C-ACsKv_.js → qr-code-YrEuhMPC.js} +2 -2
  515. package/dist/web/public/assets/{qr-code-C-ACsKv_.js.map → qr-code-YrEuhMPC.js.map} +1 -1
  516. package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js → refresh-ccw-DlAd-eTQ.js} +2 -2
  517. package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js.map → refresh-ccw-DlAd-eTQ.js.map} +1 -1
  518. package/dist/web/public/assets/{reminders-BDeiVYTC.js → reminders-DBEE0zXG.js} +3 -3
  519. package/dist/web/public/assets/{reminders-BDeiVYTC.js.map → reminders-DBEE0zXG.js.map} +1 -1
  520. package/dist/web/public/assets/{save-BYFmz9gD.js → save-BDOtZrfp.js} +2 -2
  521. package/dist/web/public/assets/{save-BYFmz9gD.js.map → save-BDOtZrfp.js.map} +1 -1
  522. package/dist/web/public/assets/schedules-DAyhVI8-.js +2 -0
  523. package/dist/web/public/assets/schedules-DAyhVI8-.js.map +1 -0
  524. package/dist/web/public/assets/search-55mtgHrB.js +17 -0
  525. package/dist/web/public/assets/search-55mtgHrB.js.map +1 -0
  526. package/dist/web/public/assets/{search-DxkvV-8p.js → search-CAICU3aU.js} +2 -2
  527. package/dist/web/public/assets/{search-DxkvV-8p.js.map → search-CAICU3aU.js.map} +1 -1
  528. package/dist/web/public/assets/security-CbP4QgVp.js +2 -0
  529. package/dist/web/public/assets/security-CbP4QgVp.js.map +1 -0
  530. package/dist/web/public/assets/server-Dg4e8pvm.js +7 -0
  531. package/dist/web/public/assets/server-Dg4e8pvm.js.map +1 -0
  532. package/dist/web/public/assets/service-gWZa3sup.js +7 -0
  533. package/dist/web/public/assets/service-gWZa3sup.js.map +1 -0
  534. package/dist/web/public/assets/{shield-alert-DXGk9Rak.js → shield-alert-DOKK9EnJ.js} +2 -2
  535. package/dist/web/public/assets/{shield-alert-DXGk9Rak.js.map → shield-alert-DOKK9EnJ.js.map} +1 -1
  536. package/dist/web/public/assets/sparkles-G0QIs9nP.js +7 -0
  537. package/dist/web/public/assets/sparkles-G0QIs9nP.js.map +1 -0
  538. package/dist/web/public/assets/start-D-abhl3q.js +2 -0
  539. package/dist/web/public/assets/start-D-abhl3q.js.map +1 -0
  540. package/dist/web/public/assets/{status-badge-D0nbFSom.js → status-badge-CyLdpsXq.js} +2 -2
  541. package/dist/web/public/assets/{status-badge-D0nbFSom.js.map → status-badge-CyLdpsXq.js.map} +1 -1
  542. package/dist/web/public/assets/{subtasks-DFiAXvDp.js → subtasks-BnEjSGUR.js} +3 -3
  543. package/dist/web/public/assets/{subtasks-DFiAXvDp.js.map → subtasks-BnEjSGUR.js.map} +1 -1
  544. package/dist/web/public/assets/{table-_WsrnZ_T.js → table-sCMZBe_Z.js} +2 -2
  545. package/dist/web/public/assets/{table-_WsrnZ_T.js.map → table-sCMZBe_Z.js.map} +1 -1
  546. package/dist/web/public/assets/terminal-_pXeEjXG.js +7 -0
  547. package/dist/web/public/assets/terminal-_pXeEjXG.js.map +1 -0
  548. package/dist/web/public/assets/{topn-C2PHE4tX.js → topn-D1B-gS1M.js} +3 -3
  549. package/dist/web/public/assets/{topn-C2PHE4tX.js.map → topn-D1B-gS1M.js.map} +1 -1
  550. package/dist/web/public/assets/{trash-2-1Km439fW.js → trash-2-D2x2UPuZ.js} +2 -2
  551. package/dist/web/public/assets/{trash-2-1Km439fW.js.map → trash-2-D2x2UPuZ.js.map} +1 -1
  552. package/dist/web/public/assets/use-a2a-C98e2Via.js +2 -0
  553. package/dist/web/public/assets/use-a2a-C98e2Via.js.map +1 -0
  554. package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js → use-agim-skills-BbuJP3NT.js} +2 -2
  555. package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js.map → use-agim-skills-BbuJP3NT.js.map} +1 -1
  556. package/dist/web/public/assets/use-background-tasks-CwFmOokw.js +2 -0
  557. package/dist/web/public/assets/{use-background-tasks-wCL7jn68.js.map → use-background-tasks-CwFmOokw.js.map} +1 -1
  558. package/dist/web/public/assets/use-jobs-BJjeJ5lh.js +2 -0
  559. package/dist/web/public/assets/use-jobs-BJjeJ5lh.js.map +1 -0
  560. package/dist/web/public/assets/use-memory-CXDwKCco.js +2 -0
  561. package/dist/web/public/assets/{use-memory-B9oRyQC8.js.map → use-memory-CXDwKCco.js.map} +1 -1
  562. package/dist/web/public/assets/use-observability-CY5ZUPrC.js +2 -0
  563. package/dist/web/public/assets/{use-observability-DGkN80qa.js.map → use-observability-CY5ZUPrC.js.map} +1 -1
  564. package/dist/web/public/assets/use-outbox-DT_XWB_7.js +7 -0
  565. package/dist/web/public/assets/use-outbox-DT_XWB_7.js.map +1 -0
  566. package/dist/web/public/assets/use-schedules-D4W8fMwo.js +7 -0
  567. package/dist/web/public/assets/use-schedules-D4W8fMwo.js.map +1 -0
  568. package/dist/web/public/assets/use-settings-DGIjmUX0.js +2 -0
  569. package/dist/web/public/assets/use-settings-DGIjmUX0.js.map +1 -0
  570. package/dist/web/public/assets/use-skills-D2bMM580.js +7 -0
  571. package/dist/web/public/assets/use-skills-D2bMM580.js.map +1 -0
  572. package/dist/web/public/assets/use-vector-BYOFwjU0.js +2 -0
  573. package/dist/web/public/assets/use-vector-BYOFwjU0.js.map +1 -0
  574. package/dist/web/public/assets/use-workspace-CuytyHwb.js +2 -0
  575. package/dist/web/public/assets/{use-workspace-BDXP5XO1.js.map → use-workspace-CuytyHwb.js.map} +1 -1
  576. package/dist/web/public/assets/vector-CL8ezpSR.js +2 -0
  577. package/dist/web/public/assets/vector-CL8ezpSR.js.map +1 -0
  578. package/dist/web/public/assets/viewer-CD0iEfPU.js +7 -0
  579. package/dist/web/public/assets/viewer-CD0iEfPU.js.map +1 -0
  580. package/dist/web/public/assets/workspace-BA1_hso3.js +17 -0
  581. package/dist/web/public/assets/workspace-BA1_hso3.js.map +1 -0
  582. package/dist/web/public/assets/workspaces-DyGLJUgB.js +7 -0
  583. package/dist/web/public/assets/workspaces-DyGLJUgB.js.map +1 -0
  584. package/dist/web/public/index.html +2 -2
  585. package/dist/web/public/loc.html +1 -1
  586. package/dist/web/public/login.html +2 -2
  587. package/dist/web/server.d.ts +2 -5
  588. package/dist/web/server.d.ts.map +1 -1
  589. package/dist/web/server.js +256 -122
  590. package/dist/web/server.js.map +1 -1
  591. package/package.json +2 -3
  592. package/dist/core/llm/imhub-dispatcher.d.ts.map +0 -1
  593. package/dist/core/llm/imhub-dispatcher.js.map +0 -1
  594. package/dist/web/public/assets/a2a-CZxwvgvh.js +0 -7
  595. package/dist/web/public/assets/a2a-CZxwvgvh.js.map +0 -1
  596. package/dist/web/public/assets/agents-CFB4Uj6b.js +0 -7
  597. package/dist/web/public/assets/agents-CFB4Uj6b.js.map +0 -1
  598. package/dist/web/public/assets/bgjobs-BYCQhd_1.js +0 -7
  599. package/dist/web/public/assets/bgjobs-BYCQhd_1.js.map +0 -1
  600. package/dist/web/public/assets/chat-DPkKy5y_.js +0 -17
  601. package/dist/web/public/assets/chat-DPkKy5y_.js.map +0 -1
  602. package/dist/web/public/assets/circle-check-COhM5JsK.js +0 -7
  603. package/dist/web/public/assets/circle-check-COhM5JsK.js.map +0 -1
  604. package/dist/web/public/assets/confirm-dialog-CgpJL9oN.js +0 -2
  605. package/dist/web/public/assets/distill-D9p8O8Jf.js +0 -7
  606. package/dist/web/public/assets/distill-D9p8O8Jf.js.map +0 -1
  607. package/dist/web/public/assets/email-Douv-rZ5.js +0 -7
  608. package/dist/web/public/assets/email-Douv-rZ5.js.map +0 -1
  609. package/dist/web/public/assets/health-DLzZ7KHc.js +0 -2
  610. package/dist/web/public/assets/hot-Yc7iad0D.js +0 -12
  611. package/dist/web/public/assets/index-DY2Zglku.js +0 -209
  612. package/dist/web/public/assets/index-DY2Zglku.js.map +0 -1
  613. package/dist/web/public/assets/index-DknVjPYB.css +0 -1
  614. package/dist/web/public/assets/installed-Zz34apdi.js.map +0 -1
  615. package/dist/web/public/assets/jobs-CtVRpl0r.js +0 -2
  616. package/dist/web/public/assets/jobs-CtVRpl0r.js.map +0 -1
  617. package/dist/web/public/assets/layout-BTCLgkgN.js +0 -2
  618. package/dist/web/public/assets/layout-BTCLgkgN.js.map +0 -1
  619. package/dist/web/public/assets/layout-Cxch59sI.js +0 -2
  620. package/dist/web/public/assets/layout-Cxch59sI.js.map +0 -1
  621. package/dist/web/public/assets/layout-DnANw2Q2.js +0 -2
  622. package/dist/web/public/assets/layout-DnANw2Q2.js.map +0 -1
  623. package/dist/web/public/assets/layout-yIZG87fq.js +0 -2
  624. package/dist/web/public/assets/layout-yIZG87fq.js.map +0 -1
  625. package/dist/web/public/assets/llm-CMMa85Ig.js +0 -27
  626. package/dist/web/public/assets/llm-CMMa85Ig.js.map +0 -1
  627. package/dist/web/public/assets/loader-circle-D8L1w9c1.js +0 -7
  628. package/dist/web/public/assets/memos-DQZc7llR.js +0 -12
  629. package/dist/web/public/assets/memos-DQZc7llR.js.map +0 -1
  630. package/dist/web/public/assets/messengers-DwSmauLs.js +0 -2
  631. package/dist/web/public/assets/messengers-DwSmauLs.js.map +0 -1
  632. package/dist/web/public/assets/outbox-CmN0U35l.js +0 -7
  633. package/dist/web/public/assets/outbox-CmN0U35l.js.map +0 -1
  634. package/dist/web/public/assets/persona-ig2ac4mY.js +0 -2
  635. package/dist/web/public/assets/plans-Bzbk8eUr.js.map +0 -1
  636. package/dist/web/public/assets/policy-yD1c2Pcn.js +0 -2
  637. package/dist/web/public/assets/policy-yD1c2Pcn.js.map +0 -1
  638. package/dist/web/public/assets/schedules-BddzBrxI.js +0 -7
  639. package/dist/web/public/assets/schedules-BddzBrxI.js.map +0 -1
  640. package/dist/web/public/assets/search-B8PlbtLg.js +0 -17
  641. package/dist/web/public/assets/search-B8PlbtLg.js.map +0 -1
  642. package/dist/web/public/assets/security-DpOGp3nS.js +0 -2
  643. package/dist/web/public/assets/security-DpOGp3nS.js.map +0 -1
  644. package/dist/web/public/assets/service-BsY8CaNG.js +0 -7
  645. package/dist/web/public/assets/service-BsY8CaNG.js.map +0 -1
  646. package/dist/web/public/assets/use-background-tasks-wCL7jn68.js +0 -2
  647. package/dist/web/public/assets/use-memory-B9oRyQC8.js +0 -2
  648. package/dist/web/public/assets/use-observability-DGkN80qa.js +0 -2
  649. package/dist/web/public/assets/use-settings-Co-iafXD.js +0 -2
  650. package/dist/web/public/assets/use-settings-Co-iafXD.js.map +0 -1
  651. package/dist/web/public/assets/use-workspace-BDXP5XO1.js +0 -2
  652. package/dist/web/public/assets/vector-BfIEx8xX.js +0 -2
  653. package/dist/web/public/assets/vector-BfIEx8xX.js.map +0 -1
  654. package/dist/web/public/assets/viewer-BPMZkT05.js +0 -12
  655. package/dist/web/public/assets/viewer-BPMZkT05.js.map +0 -1
  656. package/dist/web/public/assets/workspace-BbCchiHE.js +0 -17
  657. package/dist/web/public/assets/workspace-BbCchiHE.js.map +0 -1
  658. package/dist/web/public/assets/workspaces-5HE7pjdA.js +0 -7
  659. package/dist/web/public/assets/workspaces-5HE7pjdA.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-menu-BNH5SrVb.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle.js","../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../node_modules/@radix-ui/react-menu/dist/index.mjs","../../node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs","../../src/components/ui/dropdown-menu.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Circle = createLucideIcon(\"Circle\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n]);\n\nexport { Circle as default };\n//# sourceMappingURL=circle.js.map\n","\"use client\";\n\n// src/roving-focus-group.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar ENTRY_FOCUS = \"rovingFocusGroup.onEntryFocus\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar GROUP_NAME = \"RovingFocusGroup\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(GROUP_NAME);\nvar [createRovingFocusGroupContext, createRovingFocusGroupScope] = createContextScope(\n GROUP_NAME,\n [createCollectionScope]\n);\nvar [RovingFocusProvider, useRovingFocusContext] = createRovingFocusGroupContext(GROUP_NAME);\nvar RovingFocusGroup = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(RovingFocusGroupImpl, { ...props, ref: forwardedRef }) }) });\n }\n);\nRovingFocusGroup.displayName = GROUP_NAME;\nvar RovingFocusGroupImpl = React.forwardRef((props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n orientation,\n loop = false,\n dir,\n currentTabStopId: currentTabStopIdProp,\n defaultCurrentTabStopId,\n onCurrentTabStopIdChange,\n onEntryFocus,\n preventScrollOnEntryFocus = false,\n ...groupProps\n } = props;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const direction = useDirection(dir);\n const [currentTabStopId, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId ?? null,\n onChange: onCurrentTabStopIdChange,\n caller: GROUP_NAME\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const handleEntryFocus = useCallbackRef(onEntryFocus);\n const getItems = useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = React.useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n node.addEventListener(ENTRY_FOCUS, handleEntryFocus);\n return () => node.removeEventListener(ENTRY_FOCUS, handleEntryFocus);\n }\n }, [handleEntryFocus]);\n return /* @__PURE__ */ jsx(\n RovingFocusProvider,\n {\n scope: __scopeRovingFocusGroup,\n orientation,\n dir: direction,\n loop,\n currentTabStopId,\n onItemFocus: React.useCallback(\n (tabStopId) => setCurrentTabStopId(tabStopId),\n [setCurrentTabStopId]\n ),\n onItemShiftTab: React.useCallback(() => setIsTabbingBackOut(true), []),\n onFocusableItemAdd: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount + 1),\n []\n ),\n onFocusableItemRemove: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount - 1),\n []\n ),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation,\n ...groupProps,\n ref: composedRefs,\n style: { outline: \"none\", ...props.style },\n onMouseDown: composeEventHandlers(props.onMouseDown, () => {\n isClickFocusRef.current = true;\n }),\n onFocus: composeEventHandlers(props.onFocus, (event) => {\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item) => item.focusable);\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === currentTabStopId);\n const candidateItems = [activeItem, currentItem, ...items].filter(\n Boolean\n );\n const candidateNodes = candidateItems.map((item) => item.ref.current);\n focusFirst(candidateNodes, preventScrollOnEntryFocus);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false))\n }\n )\n }\n );\n});\nvar ITEM_NAME = \"RovingFocusGroupItem\";\nvar RovingFocusGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n focusable = true,\n active = false,\n tabStopId,\n children,\n ...itemProps\n } = props;\n const autoId = useId();\n const id = tabStopId || autoId;\n const context = useRovingFocusContext(ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd, onFocusableItemRemove, currentTabStopId } = context;\n React.useEffect(() => {\n if (focusable) {\n onFocusableItemAdd();\n return () => onFocusableItemRemove();\n }\n }, [focusable, onFocusableItemAdd, onFocusableItemRemove]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeRovingFocusGroup,\n id,\n focusable,\n active,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation,\n ...itemProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!focusable) event.preventDefault();\n else context.onItemFocus(id);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => context.onItemFocus(id)),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Tab\" && event.shiftKey) {\n context.onItemShiftTab();\n return;\n }\n if (event.target !== event.currentTarget) return;\n const focusIntent = getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== void 0) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n event.preventDefault();\n const items = getItems().filter((item) => item.focusable);\n let candidateNodes = items.map((item) => item.ref.current);\n if (focusIntent === \"last\") candidateNodes.reverse();\n else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = context.loop ? wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n }\n }),\n children: typeof children === \"function\" ? children({ isCurrentTabStop, hasTabStop: currentTabStopId != null }) : children\n }\n )\n }\n );\n }\n);\nRovingFocusGroupItem.displayName = ITEM_NAME;\nvar MAP_KEY_TO_FOCUS_INTENT = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\"\n};\nfunction getDirectionAwareKey(key, dir) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\" ? \"ArrowRight\" : key === \"ArrowRight\" ? \"ArrowLeft\" : key;\n}\nfunction getFocusIntent(event, orientation, dir) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key)) return void 0;\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key)) return void 0;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction focusFirst(candidates, preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root = RovingFocusGroup;\nvar Item = RovingFocusGroupItem;\nexport {\n Item,\n Root,\n RovingFocusGroup,\n RovingFocusGroupItem,\n createRovingFocusGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/menu.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive, dispatchDiscreteCustomEvent } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar SELECTION_KEYS = [\"Enter\", \" \"];\nvar FIRST_KEYS = [\"ArrowDown\", \"PageUp\", \"Home\"];\nvar LAST_KEYS = [\"ArrowUp\", \"PageDown\", \"End\"];\nvar FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];\nvar SUB_OPEN_KEYS = {\n ltr: [...SELECTION_KEYS, \"ArrowRight\"],\n rtl: [...SELECTION_KEYS, \"ArrowLeft\"]\n};\nvar SUB_CLOSE_KEYS = {\n ltr: [\"ArrowLeft\"],\n rtl: [\"ArrowRight\"]\n};\nvar MENU_NAME = \"Menu\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);\nvar [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [\n createCollectionScope,\n createPopperScope,\n createRovingFocusGroupScope\n]);\nvar usePopperScope = createPopperScope();\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);\nvar [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);\nvar Menu = (props) => {\n const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;\n const popperScope = usePopperScope(__scopeMenu);\n const [content, setContent] = React.useState(null);\n const isUsingKeyboardRef = React.useRef(false);\n const handleOpenChange = useCallbackRef(onOpenChange);\n const direction = useDirection(dir);\n React.useEffect(() => {\n const handleKeyDown = () => {\n isUsingKeyboardRef.current = true;\n document.addEventListener(\"pointerdown\", handlePointer, { capture: true, once: true });\n document.addEventListener(\"pointermove\", handlePointer, { capture: true, once: true });\n };\n const handlePointer = () => isUsingKeyboardRef.current = false;\n document.addEventListener(\"keydown\", handleKeyDown, { capture: true });\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown, { capture: true });\n document.removeEventListener(\"pointerdown\", handlePointer, { capture: true });\n document.removeEventListener(\"pointermove\", handlePointer, { capture: true });\n };\n }, []);\n React.useEffect(() => {\n if (!open) {\n return;\n }\n const handleBlur = () => handleOpenChange(false);\n window.addEventListener(\"blur\", handleBlur);\n return () => window.removeEventListener(\"blur\", handleBlur);\n }, [open, handleOpenChange]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n MenuProvider,\n {\n scope: __scopeMenu,\n open,\n onOpenChange: handleOpenChange,\n content,\n onContentChange: setContent,\n children: /* @__PURE__ */ jsx(\n MenuRootProvider,\n {\n scope: __scopeMenu,\n onClose: React.useCallback(() => handleOpenChange(false), [handleOpenChange]),\n isUsingKeyboardRef,\n dir: direction,\n modal,\n children\n }\n )\n }\n ) });\n};\nMenu.displayName = MENU_NAME;\nvar ANCHOR_NAME = \"MenuAnchor\";\nvar MenuAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...anchorProps } = props;\n const popperScope = usePopperScope(__scopeMenu);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nMenuAnchor.displayName = ANCHOR_NAME;\nvar PORTAL_NAME = \"MenuPortal\";\nvar [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar MenuPortal = (props) => {\n const { __scopeMenu, forceMount, children, container } = props;\n const context = useMenuContext(PORTAL_NAME, __scopeMenu);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nMenuPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"MenuContent\";\nvar [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);\nvar MenuContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });\n }\n);\nvar MenuRootContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n React.useEffect(() => {\n const content = ref.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: context.open,\n disableOutsideScroll: true,\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n ),\n onDismiss: () => context.onOpenChange(false)\n }\n );\n }\n);\nvar MenuRootContentNonModal = React.forwardRef((props, forwardedRef) => {\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n return /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n disableOutsideScroll: false,\n onDismiss: () => context.onOpenChange(false)\n }\n );\n});\nvar Slot = createSlot(\"MenuContent.ScrollLock\");\nvar MenuContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeMenu,\n loop = false,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEntryFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n disableOutsideScroll,\n ...contentProps\n } = props;\n const context = useMenuContext(CONTENT_NAME, __scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);\n const popperScope = usePopperScope(__scopeMenu);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);\n const getItems = useCollection(__scopeMenu);\n const [currentItemId, setCurrentItemId] = React.useState(null);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);\n const timerRef = React.useRef(0);\n const searchRef = React.useRef(\"\");\n const pointerGraceTimerRef = React.useRef(0);\n const pointerGraceIntentRef = React.useRef(null);\n const pointerDirRef = React.useRef(\"right\");\n const lastPointerXRef = React.useRef(0);\n const ScrollLockWrapper = disableOutsideScroll ? RemoveScroll : React.Fragment;\n const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;\n const handleTypeaheadSearch = (key) => {\n const search = searchRef.current + key;\n const items = getItems().filter((item) => !item.disabled);\n const currentItem = document.activeElement;\n const currentMatch = items.find((item) => item.ref.current === currentItem)?.textValue;\n const values = items.map((item) => item.textValue);\n const nextMatch = getNextMatch(values, search, currentMatch);\n const newItem = items.find((item) => item.textValue === nextMatch)?.ref.current;\n (function updateSearch(value) {\n searchRef.current = value;\n window.clearTimeout(timerRef.current);\n if (value !== \"\") timerRef.current = window.setTimeout(() => updateSearch(\"\"), 1e3);\n })(search);\n if (newItem) {\n setTimeout(() => newItem.focus());\n }\n };\n React.useEffect(() => {\n return () => window.clearTimeout(timerRef.current);\n }, []);\n useFocusGuards();\n const isPointerMovingToSubmenu = React.useCallback((event) => {\n const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;\n return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);\n }, []);\n return /* @__PURE__ */ jsx(\n MenuContentProvider,\n {\n scope: __scopeMenu,\n searchRef,\n onItemEnter: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) event.preventDefault();\n },\n [isPointerMovingToSubmenu]\n ),\n onItemLeave: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) return;\n contentRef.current?.focus();\n setCurrentItemId(null);\n },\n [isPointerMovingToSubmenu]\n ),\n onTriggerLeave: React.useCallback(\n (event) => {\n if (isPointerMovingToSubmenu(event)) event.preventDefault();\n },\n [isPointerMovingToSubmenu]\n ),\n pointerGraceTimerRef,\n onPointerGraceIntentChange: React.useCallback((intent) => {\n pointerGraceIntentRef.current = intent;\n }, []),\n children: /* @__PURE__ */ jsx(ScrollLockWrapper, { ...scrollLockWrapperProps, children: /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n trapped: trapFocus,\n onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {\n event.preventDefault();\n contentRef.current?.focus({ preventScroll: true });\n }),\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n children: /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n dir: rootContext.dir,\n orientation: \"vertical\",\n loop,\n currentTabStopId: currentItemId,\n onCurrentTabStopIdChange: setCurrentItemId,\n onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {\n if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();\n }),\n preventScrollOnEntryFocus: true,\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n role: \"menu\",\n \"aria-orientation\": \"vertical\",\n \"data-state\": getOpenState(context.open),\n \"data-radix-menu-content\": \"\",\n dir: rootContext.dir,\n ...popperScope,\n ...contentProps,\n ref: composedRefs,\n style: { outline: \"none\", ...contentProps.style },\n onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {\n const target = event.target;\n const isKeyDownInside = target.closest(\"[data-radix-menu-content]\") === event.currentTarget;\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;\n const isCharacterKey = event.key.length === 1;\n if (isKeyDownInside) {\n if (event.key === \"Tab\") event.preventDefault();\n if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);\n }\n const content = contentRef.current;\n if (event.target !== content) return;\n if (!FIRST_LAST_KEYS.includes(event.key)) return;\n event.preventDefault();\n const items = getItems().filter((item) => !item.disabled);\n const candidateNodes = items.map((item) => item.ref.current);\n if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();\n focusFirst(candidateNodes);\n }),\n onBlur: composeEventHandlers(props.onBlur, (event) => {\n if (!event.currentTarget.contains(event.target)) {\n window.clearTimeout(timerRef.current);\n searchRef.current = \"\";\n }\n }),\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n const target = event.target;\n const pointerXHasChanged = lastPointerXRef.current !== event.clientX;\n if (event.currentTarget.contains(target) && pointerXHasChanged) {\n const newDir = event.clientX > lastPointerXRef.current ? \"right\" : \"left\";\n pointerDirRef.current = newDir;\n lastPointerXRef.current = event.clientX;\n }\n })\n )\n }\n )\n }\n )\n }\n )\n }\n ) })\n }\n );\n }\n);\nMenuContent.displayName = CONTENT_NAME;\nvar GROUP_NAME = \"MenuGroup\";\nvar MenuGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...groupProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { role: \"group\", ...groupProps, ref: forwardedRef });\n }\n);\nMenuGroup.displayName = GROUP_NAME;\nvar LABEL_NAME = \"MenuLabel\";\nvar MenuLabel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...labelProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { ...labelProps, ref: forwardedRef });\n }\n);\nMenuLabel.displayName = LABEL_NAME;\nvar ITEM_NAME = \"MenuItem\";\nvar ITEM_SELECT = \"menu.itemSelect\";\nvar MenuItem = React.forwardRef(\n (props, forwardedRef) => {\n const { disabled = false, onSelect, ...itemProps } = props;\n const ref = React.useRef(null);\n const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);\n const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const isPointerDownRef = React.useRef(false);\n const handleSelect = () => {\n const menuItem = ref.current;\n if (!disabled && menuItem) {\n const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });\n menuItem.addEventListener(ITEM_SELECT, (event) => onSelect?.(event), { once: true });\n dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);\n if (itemSelectEvent.defaultPrevented) {\n isPointerDownRef.current = false;\n } else {\n rootContext.onClose();\n }\n }\n };\n return /* @__PURE__ */ jsx(\n MenuItemImpl,\n {\n ...itemProps,\n ref: composedRefs,\n disabled,\n onClick: composeEventHandlers(props.onClick, handleSelect),\n onPointerDown: (event) => {\n props.onPointerDown?.(event);\n isPointerDownRef.current = true;\n },\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n if (!isPointerDownRef.current) event.currentTarget?.click();\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isTypingAhead = contentContext.searchRef.current !== \"\";\n if (disabled || isTypingAhead && event.key === \" \") return;\n if (SELECTION_KEYS.includes(event.key)) {\n event.currentTarget.click();\n event.preventDefault();\n }\n })\n }\n );\n }\n);\nMenuItem.displayName = ITEM_NAME;\nvar MenuItemImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;\n const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [isFocused, setIsFocused] = React.useState(false);\n const [textContent, setTextContent] = React.useState(\"\");\n React.useEffect(() => {\n const menuItem = ref.current;\n if (menuItem) {\n setTextContent((menuItem.textContent ?? \"\").trim());\n }\n }, [itemProps.children]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeMenu,\n disabled,\n textValue: textValue ?? textContent,\n children: /* @__PURE__ */ jsx(RovingFocusGroup.Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"menuitem\",\n \"data-highlighted\": isFocused ? \"\" : void 0,\n \"aria-disabled\": disabled || void 0,\n \"data-disabled\": disabled ? \"\" : void 0,\n ...itemProps,\n ref: composedRefs,\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n if (disabled) {\n contentContext.onItemLeave(event);\n } else {\n contentContext.onItemEnter(event);\n if (!event.defaultPrevented) {\n const item = event.currentTarget;\n item.focus({ preventScroll: true });\n }\n }\n })\n ),\n onPointerLeave: composeEventHandlers(\n props.onPointerLeave,\n whenMouse((event) => contentContext.onItemLeave(event))\n ),\n onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),\n onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))\n }\n ) })\n }\n );\n }\n);\nvar CHECKBOX_ITEM_NAME = \"MenuCheckboxItem\";\nvar MenuCheckboxItem = React.forwardRef(\n (props, forwardedRef) => {\n const { checked = false, onCheckedChange, ...checkboxItemProps } = props;\n return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(\n MenuItem,\n {\n role: \"menuitemcheckbox\",\n \"aria-checked\": isIndeterminate(checked) ? \"mixed\" : checked,\n ...checkboxItemProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(checked),\n onSelect: composeEventHandlers(\n checkboxItemProps.onSelect,\n () => onCheckedChange?.(isIndeterminate(checked) ? true : !checked),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\nvar RADIO_GROUP_NAME = \"MenuRadioGroup\";\nvar [RadioGroupProvider, useRadioGroupContext] = createMenuContext(\n RADIO_GROUP_NAME,\n { value: void 0, onValueChange: () => {\n } }\n);\nvar MenuRadioGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { value, onValueChange, ...groupProps } = props;\n const handleValueChange = useCallbackRef(onValueChange);\n return /* @__PURE__ */ jsx(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: /* @__PURE__ */ jsx(MenuGroup, { ...groupProps, ref: forwardedRef }) });\n }\n);\nMenuRadioGroup.displayName = RADIO_GROUP_NAME;\nvar RADIO_ITEM_NAME = \"MenuRadioItem\";\nvar MenuRadioItem = React.forwardRef(\n (props, forwardedRef) => {\n const { value, ...radioItemProps } = props;\n const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);\n const checked = value === context.value;\n return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(\n MenuItem,\n {\n role: \"menuitemradio\",\n \"aria-checked\": checked,\n ...radioItemProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(checked),\n onSelect: composeEventHandlers(\n radioItemProps.onSelect,\n () => context.onValueChange?.(value),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nMenuRadioItem.displayName = RADIO_ITEM_NAME;\nvar ITEM_INDICATOR_NAME = \"MenuItemIndicator\";\nvar [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(\n ITEM_INDICATOR_NAME,\n { checked: false }\n);\nvar MenuItemIndicator = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;\n const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);\n return /* @__PURE__ */ jsx(\n Presence,\n {\n present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n ...itemIndicatorProps,\n ref: forwardedRef,\n \"data-state\": getCheckedState(indicatorContext.checked)\n }\n )\n }\n );\n }\n);\nMenuItemIndicator.displayName = ITEM_INDICATOR_NAME;\nvar SEPARATOR_NAME = \"MenuSeparator\";\nvar MenuSeparator = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...separatorProps } = props;\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"separator\",\n \"aria-orientation\": \"horizontal\",\n ...separatorProps,\n ref: forwardedRef\n }\n );\n }\n);\nMenuSeparator.displayName = SEPARATOR_NAME;\nvar ARROW_NAME = \"MenuArrow\";\nvar MenuArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenu, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeMenu);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nMenuArrow.displayName = ARROW_NAME;\nvar SUB_NAME = \"MenuSub\";\nvar [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);\nvar MenuSub = (props) => {\n const { __scopeMenu, children, open = false, onOpenChange } = props;\n const parentMenuContext = useMenuContext(SUB_NAME, __scopeMenu);\n const popperScope = usePopperScope(__scopeMenu);\n const [trigger, setTrigger] = React.useState(null);\n const [content, setContent] = React.useState(null);\n const handleOpenChange = useCallbackRef(onOpenChange);\n React.useEffect(() => {\n if (parentMenuContext.open === false) handleOpenChange(false);\n return () => handleOpenChange(false);\n }, [parentMenuContext.open, handleOpenChange]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n MenuProvider,\n {\n scope: __scopeMenu,\n open,\n onOpenChange: handleOpenChange,\n content,\n onContentChange: setContent,\n children: /* @__PURE__ */ jsx(\n MenuSubProvider,\n {\n scope: __scopeMenu,\n contentId: useId(),\n triggerId: useId(),\n trigger,\n onTriggerChange: setTrigger,\n children\n }\n )\n }\n ) });\n};\nMenuSub.displayName = SUB_NAME;\nvar SUB_TRIGGER_NAME = \"MenuSubTrigger\";\nvar MenuSubTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);\n const openTimerRef = React.useRef(null);\n const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;\n const scope = { __scopeMenu: props.__scopeMenu };\n const clearOpenTimer = React.useCallback(() => {\n if (openTimerRef.current) window.clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }, []);\n React.useEffect(() => clearOpenTimer, [clearOpenTimer]);\n React.useEffect(() => {\n const pointerGraceTimer = pointerGraceTimerRef.current;\n return () => {\n window.clearTimeout(pointerGraceTimer);\n onPointerGraceIntentChange(null);\n };\n }, [pointerGraceTimerRef, onPointerGraceIntentChange]);\n const composedRefs = useComposedRefs(forwardedRef, subContext.onTriggerChange);\n return /* @__PURE__ */ jsx(MenuAnchor, { asChild: true, ...scope, children: /* @__PURE__ */ jsx(\n MenuItemImpl,\n {\n id: subContext.triggerId,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.open ? subContext.contentId : void 0,\n \"data-state\": getOpenState(context.open),\n ...props,\n ref: composedRefs,\n onClick: (event) => {\n props.onClick?.(event);\n if (props.disabled || event.defaultPrevented) return;\n event.currentTarget.focus();\n if (!context.open) context.onOpenChange(true);\n },\n onPointerMove: composeEventHandlers(\n props.onPointerMove,\n whenMouse((event) => {\n contentContext.onItemEnter(event);\n if (event.defaultPrevented) return;\n if (!props.disabled && !context.open && !openTimerRef.current) {\n contentContext.onPointerGraceIntentChange(null);\n openTimerRef.current = window.setTimeout(() => {\n context.onOpenChange(true);\n clearOpenTimer();\n }, 100);\n }\n })\n ),\n onPointerLeave: composeEventHandlers(\n props.onPointerLeave,\n whenMouse((event) => {\n clearOpenTimer();\n const contentRect = context.content?.getBoundingClientRect();\n if (contentRect) {\n const side = context.content?.dataset.side;\n const rightSide = side === \"right\";\n const bleed = rightSide ? -5 : 5;\n const contentNearEdge = contentRect[rightSide ? \"left\" : \"right\"];\n const contentFarEdge = contentRect[rightSide ? \"right\" : \"left\"];\n contentContext.onPointerGraceIntentChange({\n area: [\n // Apply a bleed on clientX to ensure that our exit point is\n // consistently within polygon bounds\n { x: event.clientX + bleed, y: event.clientY },\n { x: contentNearEdge, y: contentRect.top },\n { x: contentFarEdge, y: contentRect.top },\n { x: contentFarEdge, y: contentRect.bottom },\n { x: contentNearEdge, y: contentRect.bottom }\n ],\n side\n });\n window.clearTimeout(pointerGraceTimerRef.current);\n pointerGraceTimerRef.current = window.setTimeout(\n () => contentContext.onPointerGraceIntentChange(null),\n 300\n );\n } else {\n contentContext.onTriggerLeave(event);\n if (event.defaultPrevented) return;\n contentContext.onPointerGraceIntentChange(null);\n }\n })\n ),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isTypingAhead = contentContext.searchRef.current !== \"\";\n if (props.disabled || isTypingAhead && event.key === \" \") return;\n if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {\n context.onOpenChange(true);\n context.content?.focus();\n event.preventDefault();\n }\n })\n }\n ) });\n }\n);\nMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\nvar SUB_CONTENT_NAME = \"MenuSubContent\";\nvar MenuSubContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);\n const { forceMount = portalContext.forceMount, align = \"start\", ...subContentProps } = props;\n const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);\n const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);\n const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(\n MenuContentImpl,\n {\n id: subContext.contentId,\n \"aria-labelledby\": subContext.triggerId,\n ...subContentProps,\n ref: composedRefs,\n align,\n side: rootContext.dir === \"rtl\" ? \"left\" : \"right\",\n disableOutsidePointerEvents: false,\n disableOutsideScroll: false,\n trapFocus: false,\n onOpenAutoFocus: (event) => {\n if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();\n event.preventDefault();\n },\n onCloseAutoFocus: (event) => event.preventDefault(),\n onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {\n if (event.target !== subContext.trigger) context.onOpenChange(false);\n }),\n onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {\n rootContext.onClose();\n event.preventDefault();\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n const isKeyDownInside = event.currentTarget.contains(event.target);\n const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);\n if (isKeyDownInside && isCloseKey) {\n context.onOpenChange(false);\n subContext.trigger?.focus();\n event.preventDefault();\n }\n })\n }\n ) }) }) });\n }\n);\nMenuSubContent.displayName = SUB_CONTENT_NAME;\nfunction getOpenState(open) {\n return open ? \"open\" : \"closed\";\n}\nfunction isIndeterminate(checked) {\n return checked === \"indeterminate\";\n}\nfunction getCheckedState(checked) {\n return isIndeterminate(checked) ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\";\n}\nfunction focusFirst(candidates) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus();\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nfunction getNextMatch(values, search, currentMatch) {\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);\n const normalizedSearch = isRepeated ? search[0] : search;\n const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;\n let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));\n const excludeCurrentMatch = normalizedSearch.length === 1;\n if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);\n const nextMatch = wrappedValues.find(\n (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())\n );\n return nextMatch !== currentMatch ? nextMatch : void 0;\n}\nfunction isPointInPolygon(point, polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const ii = polygon[i];\n const jj = polygon[j];\n const xi = ii.x;\n const yi = ii.y;\n const xj = jj.x;\n const yj = jj.y;\n const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\nfunction isPointerInGraceArea(event, area) {\n if (!area) return false;\n const cursorPos = { x: event.clientX, y: event.clientY };\n return isPointInPolygon(cursorPos, area);\n}\nfunction whenMouse(handler) {\n return (event) => event.pointerType === \"mouse\" ? handler(event) : void 0;\n}\nvar Root3 = Menu;\nvar Anchor2 = MenuAnchor;\nvar Portal = MenuPortal;\nvar Content2 = MenuContent;\nvar Group = MenuGroup;\nvar Label = MenuLabel;\nvar Item2 = MenuItem;\nvar CheckboxItem = MenuCheckboxItem;\nvar RadioGroup = MenuRadioGroup;\nvar RadioItem = MenuRadioItem;\nvar ItemIndicator = MenuItemIndicator;\nvar Separator = MenuSeparator;\nvar Arrow2 = MenuArrow;\nvar Sub = MenuSub;\nvar SubTrigger = MenuSubTrigger;\nvar SubContent = MenuSubContent;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n CheckboxItem,\n Content2 as Content,\n Group,\n Item2 as Item,\n ItemIndicator,\n Label,\n Menu,\n MenuAnchor,\n MenuArrow,\n MenuCheckboxItem,\n MenuContent,\n MenuGroup,\n MenuItem,\n MenuItemIndicator,\n MenuLabel,\n MenuPortal,\n MenuRadioGroup,\n MenuRadioItem,\n MenuSeparator,\n MenuSub,\n MenuSubContent,\n MenuSubTrigger,\n Portal,\n RadioGroup,\n RadioItem,\n Root3 as Root,\n Separator,\n Sub,\n SubContent,\n SubTrigger,\n createMenuScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/dropdown-menu.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as MenuPrimitive from \"@radix-ui/react-menu\";\nimport { createMenuScope } from \"@radix-ui/react-menu\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar DROPDOWN_MENU_NAME = \"DropdownMenu\";\nvar [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(\n DROPDOWN_MENU_NAME,\n [createMenuScope]\n);\nvar useMenuScope = createMenuScope();\nvar [DropdownMenuProvider, useDropdownMenuContext] = createDropdownMenuContext(DROPDOWN_MENU_NAME);\nvar DropdownMenu = (props) => {\n const {\n __scopeDropdownMenu,\n children,\n dir,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const triggerRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DROPDOWN_MENU_NAME\n });\n return /* @__PURE__ */ jsx(\n DropdownMenuProvider,\n {\n scope: __scopeDropdownMenu,\n triggerId: useId(),\n triggerRef,\n contentId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children: /* @__PURE__ */ jsx(MenuPrimitive.Root, { ...menuScope, open, onOpenChange: setOpen, dir, modal, children })\n }\n );\n};\nDropdownMenu.displayName = DROPDOWN_MENU_NAME;\nvar TRIGGER_NAME = \"DropdownMenuTrigger\";\nvar DropdownMenuTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;\n const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const composedRefs = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(MenuPrimitive.Anchor, { asChild: true, ...menuScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n id: context.triggerId,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.open ? context.contentId : void 0,\n \"data-state\": context.open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n ...triggerProps,\n ref: composedRefs,\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onOpenToggle();\n if (!context.open) event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled) return;\n if ([\"Enter\", \" \"].includes(event.key)) context.onOpenToggle();\n if (event.key === \"ArrowDown\") context.onOpenChange(true);\n if ([\"Enter\", \" \", \"ArrowDown\"].includes(event.key)) event.preventDefault();\n })\n }\n ) });\n }\n);\nDropdownMenuTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DropdownMenuPortal\";\nvar DropdownMenuPortal = (props) => {\n const { __scopeDropdownMenu, ...portalProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Portal, { ...menuScope, ...portalProps });\n};\nDropdownMenuPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"DropdownMenuContent\";\nvar DropdownMenuContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...contentProps } = props;\n const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const hasInteractedOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.Content,\n {\n id: context.contentId,\n \"aria-labelledby\": context.triggerId,\n ...menuScope,\n ...contentProps,\n ref: forwardedRef,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n hasInteractedOutsideRef.current = false;\n event.preventDefault();\n }),\n onInteractOutside: composeEventHandlers(props.onInteractOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true;\n }),\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-dropdown-menu-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-dropdown-menu-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-dropdown-menu-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-dropdown-menu-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-dropdown-menu-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n }\n);\nDropdownMenuContent.displayName = CONTENT_NAME;\nvar GROUP_NAME = \"DropdownMenuGroup\";\nvar DropdownMenuGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...groupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Group, { ...menuScope, ...groupProps, ref: forwardedRef });\n }\n);\nDropdownMenuGroup.displayName = GROUP_NAME;\nvar LABEL_NAME = \"DropdownMenuLabel\";\nvar DropdownMenuLabel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...labelProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Label, { ...menuScope, ...labelProps, ref: forwardedRef });\n }\n);\nDropdownMenuLabel.displayName = LABEL_NAME;\nvar ITEM_NAME = \"DropdownMenuItem\";\nvar DropdownMenuItem = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Item, { ...menuScope, ...itemProps, ref: forwardedRef });\n }\n);\nDropdownMenuItem.displayName = ITEM_NAME;\nvar CHECKBOX_ITEM_NAME = \"DropdownMenuCheckboxItem\";\nvar DropdownMenuCheckboxItem = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...checkboxItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.CheckboxItem, { ...menuScope, ...checkboxItemProps, ref: forwardedRef });\n});\nDropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\nvar RADIO_GROUP_NAME = \"DropdownMenuRadioGroup\";\nvar DropdownMenuRadioGroup = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioGroupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioGroup, { ...menuScope, ...radioGroupProps, ref: forwardedRef });\n});\nDropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;\nvar RADIO_ITEM_NAME = \"DropdownMenuRadioItem\";\nvar DropdownMenuRadioItem = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioItem, { ...menuScope, ...radioItemProps, ref: forwardedRef });\n});\nDropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;\nvar INDICATOR_NAME = \"DropdownMenuItemIndicator\";\nvar DropdownMenuItemIndicator = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemIndicatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.ItemIndicator, { ...menuScope, ...itemIndicatorProps, ref: forwardedRef });\n});\nDropdownMenuItemIndicator.displayName = INDICATOR_NAME;\nvar SEPARATOR_NAME = \"DropdownMenuSeparator\";\nvar DropdownMenuSeparator = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...separatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Separator, { ...menuScope, ...separatorProps, ref: forwardedRef });\n});\nDropdownMenuSeparator.displayName = SEPARATOR_NAME;\nvar ARROW_NAME = \"DropdownMenuArrow\";\nvar DropdownMenuArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDropdownMenu, ...arrowProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.Arrow, { ...menuScope, ...arrowProps, ref: forwardedRef });\n }\n);\nDropdownMenuArrow.displayName = ARROW_NAME;\nvar DropdownMenuSub = (props) => {\n const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: \"DropdownMenuSub\"\n });\n return /* @__PURE__ */ jsx(MenuPrimitive.Sub, { ...menuScope, open, onOpenChange: setOpen, children });\n};\nvar SUB_TRIGGER_NAME = \"DropdownMenuSubTrigger\";\nvar DropdownMenuSubTrigger = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...subTriggerProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(MenuPrimitive.SubTrigger, { ...menuScope, ...subTriggerProps, ref: forwardedRef });\n});\nDropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\nvar SUB_CONTENT_NAME = \"DropdownMenuSubContent\";\nvar DropdownMenuSubContent = React.forwardRef((props, forwardedRef) => {\n const { __scopeDropdownMenu, ...subContentProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.SubContent,\n {\n ...menuScope,\n ...subContentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-dropdown-menu-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-dropdown-menu-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-dropdown-menu-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-dropdown-menu-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-dropdown-menu-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n});\nDropdownMenuSubContent.displayName = SUB_CONTENT_NAME;\nvar Root2 = DropdownMenu;\nvar Trigger = DropdownMenuTrigger;\nvar Portal2 = DropdownMenuPortal;\nvar Content2 = DropdownMenuContent;\nvar Group2 = DropdownMenuGroup;\nvar Label2 = DropdownMenuLabel;\nvar Item2 = DropdownMenuItem;\nvar CheckboxItem2 = DropdownMenuCheckboxItem;\nvar RadioGroup2 = DropdownMenuRadioGroup;\nvar RadioItem2 = DropdownMenuRadioItem;\nvar ItemIndicator2 = DropdownMenuItemIndicator;\nvar Separator2 = DropdownMenuSeparator;\nvar Arrow2 = DropdownMenuArrow;\nvar Sub2 = DropdownMenuSub;\nvar SubTrigger2 = DropdownMenuSubTrigger;\nvar SubContent2 = DropdownMenuSubContent;\nexport {\n Arrow2 as Arrow,\n CheckboxItem2 as CheckboxItem,\n Content2 as Content,\n DropdownMenu,\n DropdownMenuArrow,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuItemIndicator,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Group2 as Group,\n Item2 as Item,\n ItemIndicator2 as ItemIndicator,\n Label2 as Label,\n Portal2 as Portal,\n RadioGroup2 as RadioGroup,\n RadioItem2 as RadioItem,\n Root2 as Root,\n Separator2 as Separator,\n Sub2 as Sub,\n SubContent2 as SubContent,\n SubTrigger2 as SubTrigger,\n Trigger,\n createDropdownMenuScope\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * DropdownMenu — Radix-backed menu for row actions, agent picker, etc.\n * The check / radio item variants ship below; we don't import every\n * Radix sub-primitive eagerly to keep the bundle small if a page\n * doesn't need them.\n */\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center gap-2 rounded px-2 py-1.5 text-sm outline-none',\n 'focus:bg-surface-hover data-[state=open]:bg-surface-hover',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-surface p-1 shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-surface p-1 shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded px-2 py-1.5 text-sm outline-none',\n 'focus:bg-surface-hover focus:text-text',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none',\n 'focus:bg-surface-hover',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none',\n 'focus:bg-surface-hover',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'px-2 py-1.5 text-xs font-semibold uppercase tracking-wide text-text-muted',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>): JSX.Element => (\n <span\n className={cn('ml-auto text-xs tracking-widest text-text-muted', className)}\n {...props}\n />\n)\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n"],"names":["Circle","createLucideIcon","ENTRY_FOCUS","EVENT_OPTIONS","GROUP_NAME","Collection","useCollection","createCollectionScope","createCollection","createRovingFocusGroupContext","createRovingFocusGroupScope","createContextScope","RovingFocusProvider","useRovingFocusContext","RovingFocusGroup","React.forwardRef","props","forwardedRef","jsx","RovingFocusGroupImpl","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","preventScrollOnEntryFocus","groupProps","ref","React.useRef","composedRefs","useComposedRefs","direction","useDirection","currentTabStopId","setCurrentTabStopId","useControllableState","isTabbingBackOut","setIsTabbingBackOut","React.useState","handleEntryFocus","useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","React.useEffect","node","React.useCallback","tabStopId","prevCount","Primitive","composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","focusFirst","ITEM_NAME","RovingFocusGroupItem","focusable","active","children","itemProps","autoId","useId","id","context","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","getFocusIntent","currentIndex","wrapArray","MAP_KEY_TO_FOCUS_INTENT","getDirectionAwareKey","key","candidates","preventScroll","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","index","Root","Item","SELECTION_KEYS","FIRST_KEYS","LAST_KEYS","FIRST_LAST_KEYS","SUB_OPEN_KEYS","SUB_CLOSE_KEYS","MENU_NAME","createMenuContext","createMenuScope","createPopperScope","usePopperScope","useRovingFocusGroupScope","MenuProvider","useMenuContext","MenuRootProvider","useMenuRootContext","Menu","__scopeMenu","open","onOpenChange","modal","popperScope","content","setContent","isUsingKeyboardRef","handleOpenChange","handleKeyDown","handlePointer","handleBlur","PopperPrimitive.Root","ANCHOR_NAME","MenuAnchor","anchorProps","PopperPrimitive.Anchor","PORTAL_NAME","PortalProvider","usePortalContext","MenuPortal","forceMount","container","Presence","PortalPrimitive","CONTENT_NAME","MenuContentProvider","useMenuContentContext","MenuContent","portalContext","contentProps","rootContext","MenuRootContentModal","MenuRootContentNonModal","hideOthers","MenuContentImpl","Slot","createSlot","trapFocus","onOpenAutoFocus","onCloseAutoFocus","disableOutsidePointerEvents","onEscapeKeyDown","onPointerDownOutside","onFocusOutside","onInteractOutside","onDismiss","disableOutsideScroll","rovingFocusGroupScope","currentItemId","setCurrentItemId","contentRef","timerRef","searchRef","pointerGraceTimerRef","pointerGraceIntentRef","pointerDirRef","lastPointerXRef","ScrollLockWrapper","RemoveScroll","React.Fragment","scrollLockWrapperProps","handleTypeaheadSearch","search","currentMatch","values","nextMatch","getNextMatch","newItem","updateSearch","value","useFocusGuards","isPointerMovingToSubmenu","isPointerInGraceArea","intent","FocusScope","DismissableLayer","RovingFocusGroup.Root","PopperPrimitive.Content","getOpenState","isKeyDownInside","isModifierKey","isCharacterKey","whenMouse","target","pointerXHasChanged","newDir","MenuGroup","LABEL_NAME","MenuLabel","labelProps","ITEM_SELECT","MenuItem","disabled","onSelect","contentContext","isPointerDownRef","handleSelect","menuItem","itemSelectEvent","dispatchDiscreteCustomEvent","MenuItemImpl","isTypingAhead","textValue","isFocused","setIsFocused","textContent","setTextContent","RovingFocusGroup.Item","CHECKBOX_ITEM_NAME","MenuCheckboxItem","checked","onCheckedChange","checkboxItemProps","ItemIndicatorProvider","isIndeterminate","getCheckedState","RADIO_GROUP_NAME","RadioGroupProvider","useRadioGroupContext","MenuRadioGroup","onValueChange","handleValueChange","RADIO_ITEM_NAME","MenuRadioItem","radioItemProps","ITEM_INDICATOR_NAME","useItemIndicatorContext","MenuItemIndicator","itemIndicatorProps","indicatorContext","SEPARATOR_NAME","MenuSeparator","separatorProps","ARROW_NAME","MenuArrow","arrowProps","PopperPrimitive.Arrow","SUB_NAME","MenuSubProvider","useMenuSubContext","SUB_TRIGGER_NAME","MenuSubTrigger","subContext","openTimerRef","onPointerGraceIntentChange","scope","clearOpenTimer","pointerGraceTimer","contentRect","side","rightSide","bleed","contentNearEdge","contentFarEdge","SUB_CONTENT_NAME","MenuSubContent","align","subContentProps","isCloseKey","normalizedSearch","char","currentMatchIndex","wrappedValues","isPointInPolygon","point","polygon","x","y","inside","i","j","ii","jj","xi","yi","xj","yj","area","cursorPos","handler","Root3","Anchor2","Portal","Content2","Group","Label","Item2","CheckboxItem","RadioGroup","RadioItem","ItemIndicator","Separator","Arrow2","SubTrigger","SubContent","DROPDOWN_MENU_NAME","createDropdownMenuContext","useMenuScope","DropdownMenuProvider","useDropdownMenuContext","DropdownMenu","__scopeDropdownMenu","openProp","defaultOpen","menuScope","triggerRef","setOpen","prevOpen","MenuPrimitive.Root","TRIGGER_NAME","DropdownMenuTrigger","triggerProps","MenuPrimitive.Anchor","DropdownMenuPortal","portalProps","MenuPrimitive.Portal","DropdownMenuContent","hasInteractedOutsideRef","MenuPrimitive.Content","originalEvent","ctrlLeftClick","isRightClick","DropdownMenuGroup","MenuPrimitive.Group","DropdownMenuLabel","MenuPrimitive.Label","DropdownMenuItem","MenuPrimitive.Item","DropdownMenuCheckboxItem","MenuPrimitive.CheckboxItem","DropdownMenuRadioGroup","radioGroupProps","MenuPrimitive.RadioGroup","DropdownMenuRadioItem","MenuPrimitive.RadioItem","INDICATOR_NAME","DropdownMenuItemIndicator","MenuPrimitive.ItemIndicator","DropdownMenuSeparator","MenuPrimitive.Separator","DropdownMenuArrow","MenuPrimitive.Arrow","DropdownMenuSubTrigger","subTriggerProps","MenuPrimitive.SubTrigger","DropdownMenuSubContent","MenuPrimitive.SubContent","Root2","Trigger","Portal2","Label2","CheckboxItem2","RadioItem2","ItemIndicator2","Separator2","SubTrigger2","SubContent2","DropdownMenuPrimitive.Root","DropdownMenuPrimitive.Trigger","className","inset","jsxs","DropdownMenuPrimitive.SubTrigger","cn","ChevronRight","DropdownMenuPrimitive.SubContent","sideOffset","DropdownMenuPrimitive.Portal","DropdownMenuPrimitive.Content","DropdownMenuPrimitive.Item","DropdownMenuPrimitive.CheckboxItem","DropdownMenuPrimitive.ItemIndicator","Check","DropdownMenuPrimitive.RadioItem","DropdownMenuPrimitive.Label","DropdownMenuPrimitive.Separator"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
@@ -0,0 +1,7 @@
1
+ import{h as U,u as F,j as e,C as z,ah as L,d as G,e as u,I as S,f as B,k as D,l as V,m as X,n as q,o as g,X as J,p as m,q as j,w as K}from"./index-DCfdN5R7.js";import{r as M}from"./react-DlP5eolq.js";import{b as Q,c as Y,i as W}from"./use-settings-DGIjmUX0.js";import{L as A}from"./loader-circle-DDdmcH0k.js";import{C as Z}from"./circle-x-CqFMzO-x.js";import{R as $}from"./refresh-ccw-DlAd-eTQ.js";import{E as ee,a as se}from"./eye-BfPyNFzk.js";import{S as ae}from"./save-BDOtZrfp.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const te=U("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]),I=["AGIM_SMTP_HOST","AGIM_SMTP_PORT","AGIM_SMTP_USER","AGIM_SMTP_PASS","AGIM_SMTP_FROM","AGIM_SMTP_SECURE"];function b(){return{AGIM_SMTP_HOST:"",AGIM_SMTP_PORT:"",AGIM_SMTP_USER:"",AGIM_SMTP_PASS:"",AGIM_SMTP_FROM:"",AGIM_SMTP_SECURE:"auto"}}function ie(s){const i=(s??"").trim().toLowerCase();return i==="1"||i==="true"||i==="yes"?"true":i==="0"||i==="false"||i==="no"?"false":"auto"}function P(s){return{AGIM_SMTP_HOST:s.AGIM_SMTP_HOST??"",AGIM_SMTP_PORT:s.AGIM_SMTP_PORT??"",AGIM_SMTP_USER:s.AGIM_SMTP_USER??"",AGIM_SMTP_PASS:s.AGIM_SMTP_PASS??"",AGIM_SMTP_FROM:s.AGIM_SMTP_FROM??"",AGIM_SMTP_SECURE:ie(s.AGIM_SMTP_SECURE)}}function v(s){return/\*{3,}/.test(s)}function xe(){const{t:s}=F(["settings","common"]),[i,T]=M.useState(!1),n=Q({reveal:i}),o=Y(),h=W(),l=n.data?.env??{},[r,f]=M.useState(b),[C,N]=M.useState("");M.useEffect(()=>{if(!n.data)return;const a=P(l),t=JSON.stringify(a);t!==C&&(f(a),N(t))},[n.dataUpdatedAt]);const _=!!(l.AGIM_SMTP_HOST&&l.AGIM_SMTP_USER&&l.AGIM_SMTP_PASS),E=M.useMemo(()=>{if(!n.data)return!1;const a=P(l);for(const t of I)if(!(t==="AGIM_SMTP_PASS"&&r[t]&&v(r[t])&&r[t]===a[t])&&r[t]!==a[t])return!0;return!1},[r,l,n.data]);function d(a,t){f(c=>({...c,[a]:t}))}function R(){n.data&&f(P(l))}async function y(){if(!n.data)return;const a=P(l),t={};for(const c of I){const p=r[c],H=a[c];p!==H&&(c==="AGIM_SMTP_PASS"&&v(p)||(t[c]=p===""?null:p))}if(Object.keys(t).length===0){m.info(s("email.toast.noChanges"));return}try{await o.mutateAsync({updates:t}),m.success(s("email.toast.saved"))}catch(c){m.error(j(c,s).message)}}async function w(){if(!n.data)return;const a={};for(const t of I)a[t]=null;try{await o.mutateAsync({updates:a}),f(b()),m.success(s("email.toast.disabled"))}catch(t){m.error(j(t,s).message)}}async function O(){try{const a=await h.mutateAsync();m.success(a.message)}catch(a){m.error(j(a,s).message)}}const k=h.isPending?e.jsx(A,{className:"h-4 w-4 animate-spin"}):h.isError?e.jsx(Z,{className:"h-4 w-4 text-danger"}):h.isSuccess?e.jsx(z,{className:"h-4 w-4 text-success"}):e.jsx(L,{className:"h-4 w-4"});return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("email.title")}),_?e.jsx(G,{variant:"success",children:s("email.statusOn")}):e.jsx(G,{variant:"outline",children:s("email.statusOff")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void n.refetch(),disabled:n.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[n.isFetching?e.jsx(A,{className:"h-4 w-4 animate-spin"}):e.jsx($,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("email.subtitle")})]}),n.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(te,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("email.cardTitle")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>T(a=>!a),disabled:n.isFetching,"aria-label":s(i?"email.hide":"email.reveal"),children:[i?e.jsx(ee,{className:"h-4 w-4"}):e.jsx(se,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s(i?"email.hide":"email.reveal")})]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 px-4 py-4 sm:grid-cols-2",children:[e.jsx(x,{label:s("email.host"),hint:s("email.hostHint"),children:e.jsx(S,{value:r.AGIM_SMTP_HOST,onChange:a=>d("AGIM_SMTP_HOST",a.target.value),placeholder:"smtp.gmail.com",autoComplete:"off"})}),e.jsx(x,{label:s("email.port"),hint:s("email.portHint"),children:e.jsx(S,{type:"number",inputMode:"numeric",min:1,max:65535,value:r.AGIM_SMTP_PORT,onChange:a=>d("AGIM_SMTP_PORT",a.target.value),placeholder:"465",autoComplete:"off"})}),e.jsx(x,{label:s("email.user"),hint:s("email.userHint"),children:e.jsx(S,{value:r.AGIM_SMTP_USER,onChange:a=>d("AGIM_SMTP_USER",a.target.value),placeholder:"you@example.com",autoComplete:"off"})}),e.jsx(x,{label:s("email.pass"),hint:s("email.passHint"),children:e.jsx(S,{type:i?"text":"password",value:r.AGIM_SMTP_PASS,onChange:a=>d("AGIM_SMTP_PASS",a.target.value),placeholder:"••••••••",autoComplete:"new-password",className:B(v(r.AGIM_SMTP_PASS)&&"font-mono text-text-muted")})}),e.jsx(x,{label:s("email.from"),hint:s("email.fromHint"),children:e.jsx(S,{value:r.AGIM_SMTP_FROM,onChange:a=>d("AGIM_SMTP_FROM",a.target.value),placeholder:"",autoComplete:"off"})}),e.jsx(x,{label:s("email.secure"),hint:s("email.secureHint"),children:e.jsxs(D,{value:r.AGIM_SMTP_SECURE,onValueChange:a=>d("AGIM_SMTP_SECURE",a),children:[e.jsx(V,{children:e.jsx(X,{})}),e.jsxs(q,{children:[e.jsx(g,{value:"auto",children:s("email.secureAuto")}),e.jsx(g,{value:"true",children:s("email.secureTrue")}),e.jsx(g,{value:"false",children:s("email.secureFalse")})]})]})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 border-t border-border px-4 py-3",children:[e.jsxs(u,{variant:"secondary",size:"sm",onClick:()=>void O(),disabled:!_||h.isPending,title:_?void 0:s("email.testNeedsConfigured"),children:[k,s("email.testBtn")]}),e.jsxs(u,{variant:"ghost",size:"sm",onClick:()=>void w(),disabled:!_||o.isPending,className:"text-danger hover:text-danger",children:[e.jsx(J,{className:"h-4 w-4"}),s("email.disableBtn")]}),e.jsx("span",{className:"ml-auto"}),E&&e.jsxs(e.Fragment,{children:[e.jsx(u,{variant:"ghost",size:"sm",onClick:R,disabled:o.isPending,children:s("email.discard")}),e.jsxs(u,{size:"sm",onClick:()=>void y(),disabled:o.isPending,children:[o.isPending?e.jsx(A,{className:"h-4 w-4 animate-spin"}):e.jsx(ae,{className:"h-4 w-4"}),o.isPending?s("email.saving"):s("email.saveBtn")]})]})]})]})]})}function x({label:s,hint:i,children:T}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(K,{className:"text-xs font-medium",children:s}),T,i&&e.jsx("p",{className:"text-[11px] text-text-dim",children:i})]})}export{xe as default,ie as normalizeSecure};
7
+ //# sourceMappingURL=email-YlI4MWLp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-YlI4MWLp.js","sources":["../../node_modules/lucide-react/dist/esm/icons/mail.js","../../src/routes/settings/email.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Mail = createLucideIcon(\"Mail\", [\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }]\n]);\n\nexport { Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * /settings/email — SMTP credentials editor (matches v1 settings.html's\n * \"📨 SMTP\" card). Drives email delivery for `/remind email me@x.com …`.\n *\n * Six env keys, persisted to `~/.agim/.env`:\n * * AGIM_SMTP_HOST / PORT / USER / PASS / FROM / SECURE\n *\n * AGIM_SMTP_PASS is in the backend's SECRET_KEYS set — masked unless\n * the Reveal toggle issues a `?reveal=1` fetch. Submitting a masked\n * string back is a no-op on the backend (it preserves the real value).\n *\n * Test button calls POST /api/messengers/email/test which runs\n * `nodemailer.verify()` against the live env (i.e. the operator must\n * Save first, then Test — same UX as v1).\n *\n * Disable button clears all six keys via a single PUT /api/env with\n * null values; the email adapter then logs `email.disabled` on the\n * next service restart.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n CheckCircle2, Eye, EyeOff, Loader2, Mail, RefreshCcw,\n Save, Send, X, XCircle,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv, useTestEmail } from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\n\nconst SMTP_KEYS = [\n 'AGIM_SMTP_HOST',\n 'AGIM_SMTP_PORT',\n 'AGIM_SMTP_USER',\n 'AGIM_SMTP_PASS',\n 'AGIM_SMTP_FROM',\n 'AGIM_SMTP_SECURE',\n] as const\n\ntype SmtpKey = typeof SMTP_KEYS[number]\ntype SecureMode = 'auto' | 'true' | 'false'\n\ninterface Draft {\n AGIM_SMTP_HOST: string\n AGIM_SMTP_PORT: string\n AGIM_SMTP_USER: string\n AGIM_SMTP_PASS: string\n AGIM_SMTP_FROM: string\n AGIM_SMTP_SECURE: SecureMode\n}\n\nfunction emptyDraft(): Draft {\n return {\n AGIM_SMTP_HOST: '',\n AGIM_SMTP_PORT: '',\n AGIM_SMTP_USER: '',\n AGIM_SMTP_PASS: '',\n AGIM_SMTP_FROM: '',\n AGIM_SMTP_SECURE: 'auto',\n }\n}\n\n// R13: exported so the unit suite can lock the env-string → SecureMode\n// mapping without spinning up Radix Select (whose trigger label isn't\n// readable in jsdom). Mirrors the operator's mental model: anything\n// that reads as \"yes/true/on\" maps to true; \"no/false/off\" to false;\n// blank / unknown to auto (defer to port-based heuristic at send time).\nexport function normalizeSecure(raw: string | undefined): SecureMode {\n const v = (raw ?? '').trim().toLowerCase()\n if (v === '1' || v === 'true' || v === 'yes') return 'true'\n if (v === '0' || v === 'false' || v === 'no') return 'false'\n return 'auto'\n}\n\nfunction draftFromEnv(env: Record<string, string>): Draft {\n return {\n AGIM_SMTP_HOST: env.AGIM_SMTP_HOST ?? '',\n AGIM_SMTP_PORT: env.AGIM_SMTP_PORT ?? '',\n AGIM_SMTP_USER: env.AGIM_SMTP_USER ?? '',\n AGIM_SMTP_PASS: env.AGIM_SMTP_PASS ?? '',\n AGIM_SMTP_FROM: env.AGIM_SMTP_FROM ?? '',\n AGIM_SMTP_SECURE: normalizeSecure(env.AGIM_SMTP_SECURE),\n }\n}\n\n/** Detect the backend's secret-mask format: `ab****yz` (3+ `*` between\n * surrounding chars). PUT /api/env preserves the real value when it\n * sees this pattern, so client edits that just echo the mask are a\n * no-op — we skip them in the dirty check + the submit body. */\nfunction isMasked(s: string): boolean {\n return /\\*{3,}/.test(s)\n}\n\nexport default function SettingsEmailRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n\n const [reveal, setReveal] = useState(false)\n const envQuery = useEnv({ reveal })\n const updateEnv = useUpdateEnv()\n const testMut = useTestEmail()\n\n const env = envQuery.data?.env ?? {}\n\n const [draft, setDraft] = useState<Draft>(emptyDraft)\n // Sync draft from server whenever a fresh env arrives (initial load\n // + reveal toggle + post-save refetch). Local edits that diverge stay\n // until the user Saves or Discards.\n const [syncedHash, setSyncedHash] = useState<string>('')\n useEffect(() => {\n if (!envQuery.data) return\n const next = draftFromEnv(env)\n const hash = JSON.stringify(next)\n if (hash !== syncedHash) {\n setDraft(next)\n setSyncedHash(hash)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [envQuery.dataUpdatedAt])\n\n const isConfigured = !!(env.AGIM_SMTP_HOST && env.AGIM_SMTP_USER && env.AGIM_SMTP_PASS)\n\n const isDirty = useMemo(() => {\n if (!envQuery.data) return false\n const current = draftFromEnv(env)\n for (const k of SMTP_KEYS) {\n // PASS: ignore \"user just echoed the mask back\" as no-change.\n if (k === 'AGIM_SMTP_PASS' && draft[k] && isMasked(draft[k]) && draft[k] === current[k]) continue\n if (draft[k] !== current[k]) return true\n }\n return false\n }, [draft, env, envQuery.data])\n\n function setField<K extends SmtpKey>(key: K, value: Draft[K]): void {\n setDraft((d) => ({ ...d, [key]: value }))\n }\n\n function onDiscard(): void {\n if (!envQuery.data) return\n setDraft(draftFromEnv(env))\n }\n\n async function onSave(): Promise<void> {\n if (!envQuery.data) return\n const current = draftFromEnv(env)\n const updates: Record<string, string | null> = {}\n for (const k of SMTP_KEYS) {\n const next = draft[k]\n const cur = current[k]\n if (next === cur) continue\n // Don't ship a masked PASS as the new value — backend's\n // isMasked-detect already skips it server-side, but keep the\n // wire honest.\n if (k === 'AGIM_SMTP_PASS' && isMasked(next)) continue\n // Empty string → null (explicit unset) for non-PASS fields.\n // For PASS, an empty string also means \"clear\" (Disable button uses\n // the same path).\n updates[k] = next === '' ? null : next\n }\n if (Object.keys(updates).length === 0) {\n toast.info(t('email.toast.noChanges'))\n return\n }\n try {\n await updateEnv.mutateAsync({ updates })\n toast.success(t('email.toast.saved'))\n // refetch handled by hook's onSuccess; draft will re-sync via\n // the dataUpdatedAt effect on the next paint.\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onDisable(): Promise<void> {\n if (!envQuery.data) return\n const updates: Record<string, string | null> = {}\n for (const k of SMTP_KEYS) updates[k] = null\n try {\n await updateEnv.mutateAsync({ updates })\n setDraft(emptyDraft())\n toast.success(t('email.toast.disabled'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onTest(): Promise<void> {\n try {\n const res = await testMut.mutateAsync()\n toast.success(res.message)\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n const testIcon =\n testMut.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : testMut.isError ? <XCircle className=\"h-4 w-4 text-danger\" />\n : testMut.isSuccess ? <CheckCircle2 className=\"h-4 w-4 text-success\" />\n : <Send className=\"h-4 w-4\" />\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('email.title')}</h1>\n {isConfigured\n ? <Badge variant=\"success\">{t('email.statusOn')}</Badge>\n : <Badge variant=\"outline\">{t('email.statusOff')}</Badge>}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => void envQuery.refetch()}\n disabled={envQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('email.subtitle')}</p>\n </header>\n\n {envQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <Mail className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('email.cardTitle')}</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => setReveal((v) => !v)}\n disabled={envQuery.isFetching}\n aria-label={reveal ? t('email.hide') : t('email.reveal')}\n >\n {reveal ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{reveal ? t('email.hide') : t('email.reveal')}</span>\n </Button>\n </header>\n\n <div className=\"grid grid-cols-1 gap-3 px-4 py-4 sm:grid-cols-2\">\n <Field label={t('email.host')} hint={t('email.hostHint')}>\n <Input\n value={draft.AGIM_SMTP_HOST}\n onChange={(e) => setField('AGIM_SMTP_HOST', e.target.value)}\n placeholder=\"smtp.gmail.com\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.port')} hint={t('email.portHint')}>\n <Input\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n max={65535}\n value={draft.AGIM_SMTP_PORT}\n onChange={(e) => setField('AGIM_SMTP_PORT', e.target.value)}\n placeholder=\"465\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.user')} hint={t('email.userHint')}>\n <Input\n value={draft.AGIM_SMTP_USER}\n onChange={(e) => setField('AGIM_SMTP_USER', e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.pass')} hint={t('email.passHint')}>\n <Input\n type={reveal ? 'text' : 'password'}\n value={draft.AGIM_SMTP_PASS}\n onChange={(e) => setField('AGIM_SMTP_PASS', e.target.value)}\n placeholder=\"••••••••\"\n autoComplete=\"new-password\"\n className={cn(isMasked(draft.AGIM_SMTP_PASS) && 'font-mono text-text-muted')}\n />\n </Field>\n <Field label={t('email.from')} hint={t('email.fromHint')}>\n <Input\n value={draft.AGIM_SMTP_FROM}\n onChange={(e) => setField('AGIM_SMTP_FROM', e.target.value)}\n placeholder=\"\"\n autoComplete=\"off\"\n />\n </Field>\n <Field label={t('email.secure')} hint={t('email.secureHint')}>\n <Select\n value={draft.AGIM_SMTP_SECURE}\n onValueChange={(v) => setField('AGIM_SMTP_SECURE', v as SecureMode)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"auto\">{t('email.secureAuto')}</SelectItem>\n <SelectItem value=\"true\">{t('email.secureTrue')}</SelectItem>\n <SelectItem value=\"false\">{t('email.secureFalse')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2 border-t border-border px-4 py-3\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onTest()}\n disabled={!isConfigured || testMut.isPending}\n title={!isConfigured ? t('email.testNeedsConfigured') : undefined}\n >\n {testIcon}\n {t('email.testBtn')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void onDisable()}\n disabled={!isConfigured || updateEnv.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <X className=\"h-4 w-4\" />\n {t('email.disableBtn')}\n </Button>\n <span className=\"ml-auto\" />\n {isDirty && (\n <>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={updateEnv.isPending}\n >\n {t('email.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateEnv.isPending}\n >\n {updateEnv.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {updateEnv.isPending ? t('email.saving') : t('email.saveBtn')}\n </Button>\n </>\n )}\n </div>\n </section>\n )}\n </div>\n )\n}\n\ninterface FieldProps {\n label: string\n hint?: string\n children: React.ReactNode\n}\n\nfunction Field({ label, hint, children }: FieldProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">{label}</Label>\n {children}\n {hint && <p className=\"text-[11px] text-text-dim\">{hint}</p>}\n </div>\n )\n}\n"],"names":["Mail","createLucideIcon","SMTP_KEYS","emptyDraft","normalizeSecure","raw","v","draftFromEnv","env","isMasked","SettingsEmailRoute","t","useTranslation","reveal","setReveal","useState","envQuery","useEnv","updateEnv","useUpdateEnv","testMut","useTestEmail","draft","setDraft","syncedHash","setSyncedHash","useEffect","next","hash","isConfigured","isDirty","useMemo","current","k","setField","key","value","d","onDiscard","onSave","updates","cur","toast","err","describeError","onDisable","onTest","res","testIcon","jsx","Loader2","XCircle","CheckCircle2","Send","jsxs","Badge","Button","RefreshCcw","EyeOff","Eye","Field","Input","e","cn","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","X","Fragment","Save","label","hint","children","Label"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- import{j as e,c as x}from"./index-DY2Zglku.js";function i({icon:t,title:m,description:s,children:a,className:r,...c}){return e.jsxs("div",{className:x("flex flex-col items-center justify-center text-center","py-12 px-4 gap-3",r),...c,children:[t&&e.jsx("div",{className:x("flex items-center justify-center","h-12 w-12 rounded-full bg-surface-2 text-text-dim","[&_svg]:h-6 [&_svg]:w-6"),"aria-hidden":"true",children:t}),e.jsx("h3",{className:"text-base font-semibold text-text",children:m}),s&&e.jsx("p",{className:"text-sm text-text-dim max-w-sm",children:s}),a&&e.jsx("div",{className:"mt-2 flex flex-wrap items-center justify-center gap-2",children:a})]})}i.displayName="EmptyState";export{i as E};
2
- //# sourceMappingURL=empty-state-96qpPTNg.js.map
1
+ import{j as e,f as x}from"./index-DCfdN5R7.js";function l({icon:t,title:m,description:s,children:a,className:r,...i}){return e.jsxs("div",{className:x("flex flex-col items-center justify-center text-center","py-12 px-4 gap-3",r),...i,children:[t&&e.jsx("div",{className:x("flex items-center justify-center","h-12 w-12 rounded-full bg-surface-2 text-text-dim","[&_svg]:h-6 [&_svg]:w-6"),"aria-hidden":"true",children:t}),e.jsx("h3",{className:"text-base font-semibold text-text",children:m}),s&&e.jsx("p",{className:"text-sm text-text-dim max-w-sm",children:s}),a&&e.jsx("div",{className:"mt-2 flex flex-wrap items-center justify-center gap-2",children:a})]})}l.displayName="EmptyState";export{l as E};
2
+ //# sourceMappingURL=empty-state-CuiqdZiB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"empty-state-96qpPTNg.js","sources":["../../src/components/common/empty-state.tsx"],"sourcesContent":["/**\n * EmptyState — placeholder shown when a list / table / panel has no\n * rows yet. Used by DataTable's empty branch, by the chat welcome\n * screen (when no messages), and by route bodies that point at an\n * unconfigured / unused subsystem.\n *\n * Slots:\n * icon — optional lucide-react icon node. Sits above the\n * title. Renders inside a soft surface-2 circle so\n * the icon doesn't look stranded on a blank page.\n * title — required short headline (\"No jobs yet\").\n * description — optional sub-line; can wrap.\n * children — optional action slot for one or two Buttons / Links\n * (\"Create your first job\", \"Read the docs\").\n *\n * Visual: centered column, generous vertical padding, max-width on\n * description so wrapping looks intentional on wide screens.\n */\n\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: React.ReactNode\n title: React.ReactNode\n description?: React.ReactNode\n}\n\nfunction EmptyState({\n icon,\n title,\n description,\n children,\n className,\n ...props\n}: EmptyStateProps): JSX.Element {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center text-center',\n 'py-12 px-4 gap-3',\n className,\n )}\n {...props}\n >\n {icon && (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'h-12 w-12 rounded-full bg-surface-2 text-text-dim',\n '[&_svg]:h-6 [&_svg]:w-6',\n )}\n aria-hidden=\"true\"\n >\n {icon}\n </div>\n )}\n <h3 className=\"text-base font-semibold text-text\">{title}</h3>\n {description && (\n <p className=\"text-sm text-text-dim max-w-sm\">{description}</p>\n )}\n {children && <div className=\"mt-2 flex flex-wrap items-center justify-center gap-2\">{children}</div>}\n </div>\n )\n}\nEmptyState.displayName = 'EmptyState'\n\nexport { EmptyState }\n"],"names":["EmptyState","icon","title","description","children","className","props","jsxs","cn","jsx"],"mappings":"+CA4BA,SAASA,EAAW,CAClB,KAAAC,EACA,MAAAC,EACA,YAAAC,EACA,SAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAAiC,CAC/B,OACEC,EAAAA,KAAC,MAAA,CACC,UAAWC,EACT,wDACA,mBACAH,CAAA,EAED,GAAGC,EAEH,SAAA,CAAAL,GACCQ,EAAAA,IAAC,MAAA,CACC,UAAWD,EACT,mCACA,oDACA,yBAAA,EAEF,cAAY,OAEX,SAAAP,CAAA,CAAA,EAGLQ,EAAAA,IAAC,KAAA,CAAG,UAAU,oCAAqC,SAAAP,EAAM,EACxDC,GACCM,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAkC,SAAAN,EAAY,EAE5DC,GAAYK,EAAAA,IAAC,MAAA,CAAI,UAAU,wDAAyD,SAAAL,CAAA,CAAS,CAAA,CAAA,CAAA,CAGpG,CACAJ,EAAW,YAAc"}
1
+ {"version":3,"file":"empty-state-CuiqdZiB.js","sources":["../../src/components/common/empty-state.tsx"],"sourcesContent":["/**\n * EmptyState — placeholder shown when a list / table / panel has no\n * rows yet. Used by DataTable's empty branch, by the chat welcome\n * screen (when no messages), and by route bodies that point at an\n * unconfigured / unused subsystem.\n *\n * Slots:\n * icon — optional lucide-react icon node. Sits above the\n * title. Renders inside a soft surface-2 circle so\n * the icon doesn't look stranded on a blank page.\n * title — required short headline (\"No jobs yet\").\n * description — optional sub-line; can wrap.\n * children — optional action slot for one or two Buttons / Links\n * (\"Create your first job\", \"Read the docs\").\n *\n * Visual: centered column, generous vertical padding, max-width on\n * description so wrapping looks intentional on wide screens.\n */\n\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: React.ReactNode\n title: React.ReactNode\n description?: React.ReactNode\n}\n\nfunction EmptyState({\n icon,\n title,\n description,\n children,\n className,\n ...props\n}: EmptyStateProps): JSX.Element {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center text-center',\n 'py-12 px-4 gap-3',\n className,\n )}\n {...props}\n >\n {icon && (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'h-12 w-12 rounded-full bg-surface-2 text-text-dim',\n '[&_svg]:h-6 [&_svg]:w-6',\n )}\n aria-hidden=\"true\"\n >\n {icon}\n </div>\n )}\n <h3 className=\"text-base font-semibold text-text\">{title}</h3>\n {description && (\n <p className=\"text-sm text-text-dim max-w-sm\">{description}</p>\n )}\n {children && <div className=\"mt-2 flex flex-wrap items-center justify-center gap-2\">{children}</div>}\n </div>\n )\n}\nEmptyState.displayName = 'EmptyState'\n\nexport { EmptyState }\n"],"names":["EmptyState","icon","title","description","children","className","props","jsxs","cn","jsx"],"mappings":"+CA4BA,SAASA,EAAW,CAClB,KAAAC,EACA,MAAAC,EACA,YAAAC,EACA,SAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAAiC,CAC/B,OACEC,EAAAA,KAAC,MAAA,CACC,UAAWC,EACT,wDACA,mBACAH,CAAA,EAED,GAAGC,EAEH,SAAA,CAAAL,GACCQ,EAAAA,IAAC,MAAA,CACC,UAAWD,EACT,mCACA,oDACA,yBAAA,EAEF,cAAY,OAEX,SAAAP,CAAA,CAAA,EAGLQ,EAAAA,IAAC,KAAA,CAAG,UAAU,oCAAqC,SAAAP,EAAM,EACxDC,GACCM,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAkC,SAAAN,EAAY,EAE5DC,GAAYK,EAAAA,IAAC,MAAA,CAAI,UAAU,wDAAyD,SAAAL,CAAA,CAAS,CAAA,CAAA,CAAA,CAGpG,CACAJ,EAAW,YAAc"}
@@ -1,7 +1,7 @@
1
- import{o as a}from"./index-DY2Zglku.js";/**
1
+ import{h as a}from"./index-DCfdN5R7.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const e=a("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);export{e as E};
7
- //# sourceMappingURL=external-link-J4nIlCem.js.map
7
+ //# sourceMappingURL=external-link-1WPpVvdu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"external-link-J4nIlCem.js","sources":["../../node_modules/lucide-react/dist/esm/icons/external-link.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ExternalLink = createLucideIcon(\"ExternalLink\", [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n]);\n\nexport { ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n"],"names":["ExternalLink","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,QAAQ,CAAE,EAC5C,CAAC,OAAQ,CAAE,EAAG,2DAA4D,IAAK,QAAQ,CAAE,CAC3F,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"external-link-1WPpVvdu.js","sources":["../../node_modules/lucide-react/dist/esm/icons/external-link.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ExternalLink = createLucideIcon(\"ExternalLink\", [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n]);\n\nexport { ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n"],"names":["ExternalLink","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,QAAQ,CAAE,EAC5C,CAAC,OAAQ,CAAE,EAAG,2DAA4D,IAAK,QAAQ,CAAE,CAC3F,CAAC","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{o as e}from"./index-DY2Zglku.js";/**
1
+ import{h as e}from"./index-DCfdN5R7.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -9,4 +9,4 @@ import{o as e}from"./index-DY2Zglku.js";/**
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
11
  */const y=e("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);export{c as E,y as a};
12
- //# sourceMappingURL=eye-BvsBLK42.js.map
12
+ //# sourceMappingURL=eye-BfPyNFzk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"eye-BvsBLK42.js","sources":["../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../node_modules/lucide-react/dist/esm/icons/eye.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n"],"names":["EyeOff","createLucideIcon","Eye"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CACE,OACA,CACE,EAAG,iGACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,uCAAwC,IAAK,QAAQ,CAAE,EACrE,CACE,OACA,CACE,EAAG,+FACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC,EC1BD;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACC,EAAMD,EAAiB,MAAO,CAClC,CACE,OACA,CACE,EAAG,wGACH,IAAK,QACX,CACA,EACE,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAQ,CAAE,CAC1D,CAAC","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"eye-BfPyNFzk.js","sources":["../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../node_modules/lucide-react/dist/esm/icons/eye.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n"],"names":["EyeOff","createLucideIcon","Eye"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CACE,OACA,CACE,EAAG,iGACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,uCAAwC,IAAK,QAAQ,CAAE,EACrE,CACE,OACA,CACE,EAAG,+FACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC,EC1BD;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACC,EAAMD,EAAiB,MAAO,CAClC,CACE,OACA,CACE,EAAG,wGACH,IAAK,QACX,CACA,EACE,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAQ,CAAE,CAC1D,CAAC","x_google_ignoreList":[0,1]}
@@ -1,2 +1,2 @@
1
- import{u as Q,f as Y,j as e,l as D,B as b,L as E,I as J,S as W,g as X,h as Z,i as ee,k,m as g,n as T}from"./index-DY2Zglku.js";import{r}from"./react-DlP5eolq.js";import{D as te}from"./data-table-BLYG79TX.js";import{E as B}from"./empty-state-96qpPTNg.js";import{P as se}from"./pagination-DcsgDXXM.js";import{C as M}from"./confirm-dialog-CgpJL9oN.js";import{a as ae,b as ne,c as ce}from"./use-memory-B9oRyQC8.js";import{T as A}from"./trash-2-1Km439fW.js";import{B as R}from"./brain-CCF25Egu.js";import{L as re}from"./loader-circle-D8L1w9c1.js";import{R as ie}from"./refresh-ccw-7HdadG5V.js";import{S as le}from"./search-DxkvV-8p.js";import"./table-_WsrnZ_T.js";import"./arrow-up-CAiQ2jy-.js";import"./arrow-down-DxlRHrs8.js";import"./chevron-left-BDO3vw8G.js";import"./chevron-right-5ZUC2opg.js";const oe=["fact","preference","goal","history","profile"],me=[25,50,100],F=50,de=300;function Ee(){const{t:s}=Q(["memory","common"]),[n,L]=Y(),c=n.get("user")??"",i=n.get("q")??"",m=n.get("cat")??null,d=Math.max(1,Number(n.get("page"))||1),l=Number(n.get("per_page"))||F,[f,I]=r.useState(i);r.useEffect(()=>{if(f===i)return;const t=window.setTimeout(()=>h({q:f||null}),de);return()=>window.clearTimeout(t)},[f]);const q=r.useMemo(()=>({user_key:c,...i?{query:i}:{},...m?{category:m}:{},limit:l,offset:(d-1)*l}),[c,i,m,d,l]),{data:S,isLoading:z,isFetching:C,refetch:U}=ae(q,{enabled:!!c}),_=S?.facts??[],P=S?.total??0,G=Math.max(1,Math.ceil(P/l)),[u,p]=r.useState(new Set);r.useEffect(()=>{p(new Set)},[c,i,m,d,l]);const j=ne(),x=ce(),[y,v]=r.useState(null),[V,O]=r.useState(!1);function h(t){const a=new URLSearchParams(n);for(const[o,w]of Object.entries(t))w==null||w===""?a.delete(o):a.set(o,w);Object.keys(t).some(o=>o!=="page")&&a.delete("page"),L(a,{replace:!1})}async function $(){if(!(y==null||!c))try{await j.mutateAsync({id:y,user_key:c}),g.success(s("facts.toast.deletedOne"))}catch(t){const{message:a}=T(t,s);throw g.error(a),t}}async function H(){if(!c||u.size===0)return;const t=Array.from(u).map(Number).filter(Number.isFinite);try{const a=await x.mutateAsync({user_key:c,body:{ids:t}});g.success(s("facts.toast.deletedMany",{count:a.deleted})),p(new Set)}catch(a){const{message:o}=T(a,s);throw g.error(o),a}}const K=r.useMemo(()=>[{id:"id",header:s("facts.col.id"),cell:t=>e.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",t.id]}),headClassName:"w-16"},{id:"what",header:s("facts.col.what"),cell:t=>e.jsx("span",{className:"line-clamp-2 text-text",children:t.what}),asCardTitle:!0},{id:"category",header:s("facts.col.category"),cell:t=>e.jsx(D,{variant:"outline",children:s(`facts.category.${t.category}`,{defaultValue:t.category})}),headClassName:"w-28"},{id:"confidence",header:s("facts.col.confidence"),cell:t=>e.jsx("span",{className:"tabular-nums text-text-dim",children:t.confidence.toFixed(2)}),headClassName:"w-24",hideOnMobile:!0},{id:"source",header:s("facts.col.source"),cell:t=>e.jsx("span",{className:"text-text-dim text-xs",children:t.source}),headClassName:"w-28",hideOnMobile:!0},{id:"createdAt",header:s("facts.col.createdAt"),cell:t=>e.jsx("span",{className:"text-text-dim",children:fe(t.created_at)}),headClassName:"w-32",hideOnMobile:!0},{id:"actions",header:"",cell:t=>e.jsx("div",{className:"flex justify-end",children:e.jsxs(b,{variant:"ghost",size:"sm",onClick:a=>{a.stopPropagation(),v(t.id)},disabled:j.isPending||x.isPending,"aria-label":s("facts.action.delete"),children:[e.jsx(A,{className:"h-3 w-3"}),e.jsx("span",{className:"sr-only sm:not-sr-only sm:ml-1",children:s("facts.action.delete")})]})}),headClassName:"w-24"}],[s,j.isPending,x.isPending]);if(!c)return e.jsx("div",{className:"mx-auto max-w-3xl",children:e.jsx(B,{icon:e.jsx(R,{}),title:s("noUserSelected.title"),description:s("noUserSelected.description")})});const N=u.size;return e.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("facts.title")}),e.jsxs(b,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>U(),disabled:C,"aria-label":s("actions.refresh",{ns:"common"}),children:[C?e.jsx(re,{className:"h-4 w-4 animate-spin"}):e.jsx(ie,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("subtitle")})]}),e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("div",{className:"relative flex-1 min-w-[200px] max-w-md",children:[e.jsx(E,{htmlFor:"search",className:"text-xs text-text-dim",children:s("facts.filter.search")}),e.jsx(le,{className:"pointer-events-none absolute left-2 bottom-2 h-4 w-4 text-text-muted"}),e.jsx(J,{id:"search",value:f,onChange:t=>I(t.target.value),className:"pl-7 mt-1"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(E,{htmlFor:"category",className:"text-xs text-text-dim",children:s("facts.filter.category")}),e.jsxs(W,{value:m??"__any__",onValueChange:t=>h({cat:t==="__any__"?null:t}),children:[e.jsx(X,{id:"category",className:"w-[140px]",children:e.jsx(Z,{})}),e.jsxs(ee,{children:[e.jsx(k,{value:"__any__",children:s("facts.filter.categoryAny")}),oe.map(t=>e.jsx(k,{value:t,children:s(`facts.category.${t}`)},t))]})]})]}),N>0&&e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[e.jsx(D,{variant:"secondary",children:s("facts.batch.selected",{count:N})}),e.jsxs(b,{variant:"destructive",size:"sm",onClick:()=>O(!0),disabled:x.isPending,children:[e.jsx(A,{className:"h-4 w-4"}),s("facts.batch.deleteSelected")]})]})]}),e.jsx(te,{columns:K,rows:_,getRowId:t=>String(t.id),loading:z,selection:u,onSelectionChange:p,emptyState:e.jsx(B,{icon:e.jsx(R,{}),title:s("facts.empty.title"),description:s("facts.empty.description")})}),(_.length>0||d>1)&&e.jsx(se,{page:d,totalPages:G,totalRows:P,perPage:l,perPageOptions:me,onPageChange:t=>h({page:t===1?null:String(t)}),onPerPageChange:t=>h({per_page:t===F?null:String(t)})}),e.jsx(M,{open:y!=null,onOpenChange:t=>{t||v(null)},title:s("facts.action.confirmDelete"),description:s("facts.action.confirmDeleteDesc"),intent:"danger",confirmLabel:s("facts.action.delete"),onConfirm:$}),e.jsx(M,{open:V,onOpenChange:O,title:s("facts.batch.confirmDelete",{count:N}),description:s("facts.batch.confirmDeleteDesc"),intent:"danger",confirmLabel:s("facts.batch.deleteSelected"),onConfirm:H})]})}function fe(s){try{const n=new Date(s);return Number.isNaN(n.getTime())?String(s):n.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return String(s)}}export{Ee as default};
2
- //# sourceMappingURL=facts-DMucDXYd.js.map
1
+ import{u as Q,i as Y,j as e,d as D,e as b,w as E,I as J,k as W,l as X,m as Z,n as ee,o as k,p,q as T}from"./index-DCfdN5R7.js";import{r}from"./react-DlP5eolq.js";import{D as te}from"./data-table-BkUshOZz.js";import{E as M}from"./empty-state-CuiqdZiB.js";import{P as se}from"./pagination-BBicLzXP.js";import{C as A}from"./confirm-dialog-BDb0NLny.js";import{c as ae,d as ne,e as ce}from"./use-memory-CXDwKCco.js";import{T as B}from"./trash-2-D2x2UPuZ.js";import{B as R}from"./brain-Dl4DF5kX.js";import{L as re}from"./loader-circle-DDdmcH0k.js";import{R as ie}from"./refresh-ccw-DlAd-eTQ.js";import{S as le}from"./search-CAICU3aU.js";import"./table-sCMZBe_Z.js";import"./arrow-up-Dm0U4-6U.js";import"./arrow-down-7i0xwCI2.js";import"./chevron-left-01fAFVpo.js";import"./chevron-right-CFRb-SM_.js";const oe=["fact","preference","goal","history","profile"],me=[25,50,100],F=50,de=300;function Ee(){const{t:s}=Q(["memory","common"]),[n,I]=Y(),c=n.get("user")??"",i=n.get("q")??"",m=n.get("cat")??null,d=Math.max(1,Number(n.get("page"))||1),l=Number(n.get("per_page"))||F,[f,L]=r.useState(i);r.useEffect(()=>{if(f===i)return;const t=window.setTimeout(()=>h({q:f||null}),de);return()=>window.clearTimeout(t)},[f]);const q=r.useMemo(()=>({user_key:c,...i?{query:i}:{},...m?{category:m}:{},limit:l,offset:(d-1)*l}),[c,i,m,d,l]),{data:S,isLoading:z,isFetching:C,refetch:U}=ae(q,{enabled:!!c}),_=S?.facts??[],P=S?.total??0,G=Math.max(1,Math.ceil(P/l)),[u,g]=r.useState(new Set);r.useEffect(()=>{g(new Set)},[c,i,m,d,l]);const j=ne(),x=ce(),[y,v]=r.useState(null),[V,O]=r.useState(!1);function h(t){const a=new URLSearchParams(n);for(const[o,w]of Object.entries(t))w==null||w===""?a.delete(o):a.set(o,w);Object.keys(t).some(o=>o!=="page")&&a.delete("page"),I(a,{replace:!1})}async function $(){if(!(y==null||!c))try{await j.mutateAsync({id:y,user_key:c}),p.success(s("facts.toast.deletedOne"))}catch(t){const{message:a}=T(t,s);throw p.error(a),t}}async function H(){if(!c||u.size===0)return;const t=Array.from(u).map(Number).filter(Number.isFinite);try{const a=await x.mutateAsync({user_key:c,body:{ids:t}});p.success(s("facts.toast.deletedMany",{count:a.deleted})),g(new Set)}catch(a){const{message:o}=T(a,s);throw p.error(o),a}}const K=r.useMemo(()=>[{id:"id",header:s("facts.col.id"),cell:t=>e.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",t.id]}),headClassName:"w-16"},{id:"what",header:s("facts.col.what"),cell:t=>e.jsx("span",{className:"line-clamp-2 text-text",children:t.what}),asCardTitle:!0},{id:"category",header:s("facts.col.category"),cell:t=>e.jsx(D,{variant:"outline",children:s(`facts.category.${t.category}`,{defaultValue:t.category})}),headClassName:"w-28"},{id:"confidence",header:s("facts.col.confidence"),cell:t=>e.jsx("span",{className:"tabular-nums text-text-dim",children:t.confidence.toFixed(2)}),headClassName:"w-24",hideOnMobile:!0},{id:"source",header:s("facts.col.source"),cell:t=>e.jsx("span",{className:"text-text-dim text-xs",children:t.source}),headClassName:"w-28",hideOnMobile:!0},{id:"createdAt",header:s("facts.col.createdAt"),cell:t=>e.jsx("span",{className:"text-text-dim",children:fe(t.created_at)}),headClassName:"w-32",hideOnMobile:!0},{id:"actions",header:"",cell:t=>e.jsx("div",{className:"flex justify-end",children:e.jsxs(b,{variant:"ghost",size:"sm",onClick:a=>{a.stopPropagation(),v(t.id)},disabled:j.isPending||x.isPending,"aria-label":s("facts.action.delete"),children:[e.jsx(B,{className:"h-3 w-3"}),e.jsx("span",{className:"sr-only sm:not-sr-only sm:ml-1",children:s("facts.action.delete")})]})}),headClassName:"w-24"}],[s,j.isPending,x.isPending]);if(!c)return e.jsx("div",{className:"mx-auto max-w-3xl",children:e.jsx(M,{icon:e.jsx(R,{}),title:s("noUserSelected.title"),description:s("noUserSelected.description")})});const N=u.size;return e.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("facts.title")}),e.jsxs(b,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>U(),disabled:C,"aria-label":s("actions.refresh",{ns:"common"}),children:[C?e.jsx(re,{className:"h-4 w-4 animate-spin"}):e.jsx(ie,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("subtitle")})]}),e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("div",{className:"relative flex-1 min-w-[200px] max-w-md",children:[e.jsx(E,{htmlFor:"search",className:"text-xs text-text-dim",children:s("facts.filter.search")}),e.jsx(le,{className:"pointer-events-none absolute left-2 bottom-2 h-4 w-4 text-text-muted"}),e.jsx(J,{id:"search",value:f,onChange:t=>L(t.target.value),className:"pl-7 mt-1"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(E,{htmlFor:"category",className:"text-xs text-text-dim",children:s("facts.filter.category")}),e.jsxs(W,{value:m??"__any__",onValueChange:t=>h({cat:t==="__any__"?null:t}),children:[e.jsx(X,{id:"category",className:"w-[140px]",children:e.jsx(Z,{})}),e.jsxs(ee,{children:[e.jsx(k,{value:"__any__",children:s("facts.filter.categoryAny")}),oe.map(t=>e.jsx(k,{value:t,children:s(`facts.category.${t}`)},t))]})]})]}),N>0&&e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[e.jsx(D,{variant:"secondary",children:s("facts.batch.selected",{count:N})}),e.jsxs(b,{variant:"destructive",size:"sm",onClick:()=>O(!0),disabled:x.isPending,children:[e.jsx(B,{className:"h-4 w-4"}),s("facts.batch.deleteSelected")]})]})]}),e.jsx(te,{columns:K,rows:_,getRowId:t=>String(t.id),loading:z,selection:u,onSelectionChange:g,emptyState:e.jsx(M,{icon:e.jsx(R,{}),title:s("facts.empty.title"),description:s("facts.empty.description")})}),(_.length>0||d>1)&&e.jsx(se,{page:d,totalPages:G,totalRows:P,perPage:l,perPageOptions:me,onPageChange:t=>h({page:t===1?null:String(t)}),onPerPageChange:t=>h({per_page:t===F?null:String(t)})}),e.jsx(A,{open:y!=null,onOpenChange:t=>{t||v(null)},title:s("facts.action.confirmDelete"),description:s("facts.action.confirmDeleteDesc"),intent:"danger",confirmLabel:s("facts.action.delete"),onConfirm:$}),e.jsx(A,{open:V,onOpenChange:O,title:s("facts.batch.confirmDelete",{count:N}),description:s("facts.batch.confirmDeleteDesc"),intent:"danger",confirmLabel:s("facts.batch.deleteSelected"),onConfirm:H})]})}function fe(s){try{const n=new Date(s);return Number.isNaN(n.getTime())?String(s):n.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return String(s)}}export{Ee as default};
2
+ //# sourceMappingURL=facts-xT_24pH8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"facts-DMucDXYd.js","sources":["../../src/routes/memory/facts.tsx"],"sourcesContent":["/**\n * /memory/facts — list / search / delete the user's facts.\n *\n * Reads `?user=` from the URL (the layout writes it). Without a\n * user_key the route shows a friendly empty state pointing at the\n * picker — no query fires until a user is chosen.\n *\n * Search + category filter live in URL params so deep-link sharing\n * works (\"show me john's goals matching tax\"). The free-text input\n * is local-only with a 300ms debounce, same pattern as /memos, so\n * the FTS5 layer isn't hit on every keystroke.\n *\n * Single-row delete via the per-row Delete button; batch delete via\n * checkbox selection + the bulk-delete action bar. Both route\n * through ConfirmDialog.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Brain, Loader2, RefreshCcw, Search, Trash2 } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Pagination } from '@/components/common/pagination'\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport {\n useMemoryFacts,\n useDeleteFactById,\n useBulkDeleteFacts,\n} from '@/hooks/use-memory'\nimport { describeError } from '@/lib/api/errors'\nimport type { Fact, FactCategory, ListMemoryFactsQuery } from '@/types/api'\n\nconst CATEGORY_OPTIONS: FactCategory[] = ['fact', 'preference', 'goal', 'history', 'profile']\nconst PER_PAGE_OPTIONS = [25, 50, 100]\nconst DEFAULT_PER_PAGE = 50\nconst SEARCH_DEBOUNCE_MS = 300\n\nexport default function MemoryFactsRoute(): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n const [params, setParams] = useSearchParams()\n\n const userKey = params.get('user') ?? ''\n const q = params.get('q') ?? ''\n const cat = (params.get('cat') as FactCategory | null) ?? null\n const page = Math.max(1, Number(params.get('page')) || 1)\n const perPage = Number(params.get('per_page')) || DEFAULT_PER_PAGE\n\n const [qDraft, setQDraft] = useState(q)\n useEffect(() => {\n if (qDraft === q) return\n const timer = window.setTimeout(() => patchParams({ q: qDraft || null }), SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [qDraft])\n\n const query: ListMemoryFactsQuery = useMemo(\n () => ({\n user_key: userKey,\n ...(q ? { query: q } : {}),\n ...(cat ? { category: cat } : {}),\n limit: perPage,\n offset: (page - 1) * perPage,\n }),\n [userKey, q, cat, page, perPage],\n )\n\n const { data, isLoading, isFetching, refetch } = useMemoryFacts(query, { enabled: Boolean(userKey) })\n const facts = data?.facts ?? []\n const total = data?.total ?? 0\n const totalPages = Math.max(1, Math.ceil(total / perPage))\n\n // Selection state for the bulk delete bar.\n const [selection, setSelection] = useState<Set<string>>(new Set())\n useEffect(() => { setSelection(new Set()) }, [userKey, q, cat, page, perPage])\n\n const deleteOne = useDeleteFactById()\n const bulkDelete = useBulkDeleteFacts()\n\n const [confirmOneId, setConfirmOneId] = useState<number | null>(null)\n const [confirmBulk, setConfirmBulk] = useState(false)\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null || v === '') next.delete(k)\n else next.set(k, v)\n }\n // Reset to page 1 on any filter mutation.\n if (Object.keys(patch).some((k) => k !== 'page')) next.delete('page')\n setParams(next, { replace: false })\n }\n\n async function onConfirmDeleteOne(): Promise<void> {\n if (confirmOneId == null || !userKey) return\n try {\n await deleteOne.mutateAsync({ id: confirmOneId, user_key: userKey })\n toast.success(t('facts.toast.deletedOne'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n async function onConfirmBulk(): Promise<void> {\n if (!userKey || selection.size === 0) return\n const ids = Array.from(selection).map(Number).filter(Number.isFinite)\n try {\n const r = await bulkDelete.mutateAsync({ user_key: userKey, body: { ids } })\n toast.success(t('facts.toast.deletedMany', { count: r.deleted }))\n setSelection(new Set())\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n const columns: DataTableColumn<Fact>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('facts.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'what',\n header: t('facts.col.what'),\n cell: (r) => <span className=\"line-clamp-2 text-text\">{r.what}</span>,\n asCardTitle: true,\n },\n {\n id: 'category',\n header: t('facts.col.category'),\n cell: (r) => (\n <Badge variant=\"outline\">\n {t(`facts.category.${r.category}`, { defaultValue: r.category })}\n </Badge>\n ),\n headClassName: 'w-28',\n },\n {\n id: 'confidence',\n header: t('facts.col.confidence'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{r.confidence.toFixed(2)}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'source',\n header: t('facts.col.source'),\n cell: (r) => <span className=\"text-text-dim text-xs\">{r.source}</span>,\n headClassName: 'w-28',\n hideOnMobile: true,\n },\n {\n id: 'createdAt',\n header: t('facts.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatEpoch(r.created_at)}</span>,\n headClassName: 'w-32',\n hideOnMobile: true,\n },\n {\n id: 'actions',\n header: '',\n cell: (r) => (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n setConfirmOneId(r.id)\n }}\n disabled={deleteOne.isPending || bulkDelete.isPending}\n aria-label={t('facts.action.delete')}\n >\n <Trash2 className=\"h-3 w-3\" />\n <span className=\"sr-only sm:not-sr-only sm:ml-1\">{t('facts.action.delete')}</span>\n </Button>\n </div>\n ),\n headClassName: 'w-24',\n },\n ],\n [t, deleteOne.isPending, bulkDelete.isPending],\n )\n\n if (!userKey) {\n return (\n <div className=\"mx-auto max-w-3xl\">\n <EmptyState\n icon={<Brain />}\n title={t('noUserSelected.title')}\n description={t('noUserSelected.description')}\n />\n </div>\n )\n }\n\n const selectedCount = selection.size\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('facts.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('subtitle')}</p>\n </header>\n\n {/* Filter row */}\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"relative flex-1 min-w-[200px] max-w-md\">\n <Label htmlFor=\"search\" className=\"text-xs text-text-dim\">\n {t('facts.filter.search')}\n </Label>\n <Search className=\"pointer-events-none absolute left-2 bottom-2 h-4 w-4 text-text-muted\" />\n <Input\n id=\"search\"\n value={qDraft}\n onChange={(e) => setQDraft(e.target.value)}\n className=\"pl-7 mt-1\"\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"category\" className=\"text-xs text-text-dim\">\n {t('facts.filter.category')}\n </Label>\n <Select\n value={cat ?? '__any__'}\n onValueChange={(v) => patchParams({ cat: v === '__any__' ? null : v })}\n >\n <SelectTrigger id=\"category\" className=\"w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__any__\">{t('facts.filter.categoryAny')}</SelectItem>\n {CATEGORY_OPTIONS.map((c) => (\n <SelectItem key={c} value={c}>\n {t(`facts.category.${c}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {selectedCount > 0 && (\n <div className=\"ml-auto flex items-center gap-2\">\n <Badge variant=\"secondary\">\n {t('facts.batch.selected', { count: selectedCount })}\n </Badge>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => setConfirmBulk(true)}\n disabled={bulkDelete.isPending}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('facts.batch.deleteSelected')}\n </Button>\n </div>\n )}\n </div>\n\n <DataTable\n columns={columns}\n rows={facts}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n selection={selection}\n onSelectionChange={setSelection}\n emptyState={\n <EmptyState\n icon={<Brain />}\n title={t('facts.empty.title')}\n description={t('facts.empty.description')}\n />\n }\n />\n\n {(facts.length > 0 || page > 1) && (\n <Pagination\n page={page}\n totalPages={totalPages}\n totalRows={total}\n perPage={perPage}\n perPageOptions={PER_PAGE_OPTIONS}\n onPageChange={(p) => patchParams({ page: p === 1 ? null : String(p) })}\n onPerPageChange={(pp) => patchParams({ per_page: pp === DEFAULT_PER_PAGE ? null : String(pp) })}\n />\n )}\n\n <ConfirmDialog\n open={confirmOneId != null}\n onOpenChange={(open) => { if (!open) setConfirmOneId(null) }}\n title={t('facts.action.confirmDelete')}\n description={t('facts.action.confirmDeleteDesc')}\n intent=\"danger\"\n confirmLabel={t('facts.action.delete')}\n onConfirm={onConfirmDeleteOne}\n />\n\n <ConfirmDialog\n open={confirmBulk}\n onOpenChange={setConfirmBulk}\n title={t('facts.batch.confirmDelete', { count: selectedCount })}\n description={t('facts.batch.confirmDeleteDesc')}\n intent=\"danger\"\n confirmLabel={t('facts.batch.deleteSelected')}\n onConfirm={onConfirmBulk}\n />\n </div>\n )\n}\n\n/** Format an epoch-ms number as a short locale string. */\nfunction formatEpoch(ms: number): string {\n try {\n const d = new Date(ms)\n if (Number.isNaN(d.getTime())) return String(ms)\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return String(ms)\n }\n}\n"],"names":["CATEGORY_OPTIONS","PER_PAGE_OPTIONS","DEFAULT_PER_PAGE","SEARCH_DEBOUNCE_MS","MemoryFactsRoute","t","useTranslation","params","setParams","useSearchParams","userKey","q","cat","page","perPage","qDraft","setQDraft","useState","useEffect","timer","patchParams","query","useMemo","data","isLoading","isFetching","refetch","useMemoryFacts","facts","total","totalPages","selection","setSelection","deleteOne","useDeleteFactById","bulkDelete","useBulkDeleteFacts","confirmOneId","setConfirmOneId","confirmBulk","setConfirmBulk","patch","next","k","v","onConfirmDeleteOne","toast","err","message","describeError","onConfirmBulk","ids","r","columns","jsxs","jsx","Badge","formatEpoch","Button","e","Trash2","EmptyState","Brain","selectedCount","Loader2","RefreshCcw","Label","Search","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","c","DataTable","Pagination","p","pp","ConfirmDialog","open","ms","d"],"mappings":"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"}
1
+ {"version":3,"file":"facts-xT_24pH8.js","sources":["../../src/routes/memory/facts.tsx"],"sourcesContent":["/**\n * /memory/facts — list / search / delete the user's facts.\n *\n * Reads `?user=` from the URL (the layout writes it). Without a\n * user_key the route shows a friendly empty state pointing at the\n * picker — no query fires until a user is chosen.\n *\n * Search + category filter live in URL params so deep-link sharing\n * works (\"show me john's goals matching tax\"). The free-text input\n * is local-only with a 300ms debounce, same pattern as /memos, so\n * the FTS5 layer isn't hit on every keystroke.\n *\n * Single-row delete via the per-row Delete button; batch delete via\n * checkbox selection + the bulk-delete action bar. Both route\n * through ConfirmDialog.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Brain, Loader2, RefreshCcw, Search, Trash2 } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Pagination } from '@/components/common/pagination'\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport {\n useMemoryFacts,\n useDeleteFactById,\n useBulkDeleteFacts,\n} from '@/hooks/use-memory'\nimport { describeError } from '@/lib/api/errors'\nimport type { Fact, FactCategory, ListMemoryFactsQuery } from '@/types/api'\n\nconst CATEGORY_OPTIONS: FactCategory[] = ['fact', 'preference', 'goal', 'history', 'profile']\nconst PER_PAGE_OPTIONS = [25, 50, 100]\nconst DEFAULT_PER_PAGE = 50\nconst SEARCH_DEBOUNCE_MS = 300\n\nexport default function MemoryFactsRoute(): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n const [params, setParams] = useSearchParams()\n\n const userKey = params.get('user') ?? ''\n const q = params.get('q') ?? ''\n const cat = (params.get('cat') as FactCategory | null) ?? null\n const page = Math.max(1, Number(params.get('page')) || 1)\n const perPage = Number(params.get('per_page')) || DEFAULT_PER_PAGE\n\n const [qDraft, setQDraft] = useState(q)\n useEffect(() => {\n if (qDraft === q) return\n const timer = window.setTimeout(() => patchParams({ q: qDraft || null }), SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [qDraft])\n\n const query: ListMemoryFactsQuery = useMemo(\n () => ({\n user_key: userKey,\n ...(q ? { query: q } : {}),\n ...(cat ? { category: cat } : {}),\n limit: perPage,\n offset: (page - 1) * perPage,\n }),\n [userKey, q, cat, page, perPage],\n )\n\n const { data, isLoading, isFetching, refetch } = useMemoryFacts(query, { enabled: Boolean(userKey) })\n const facts = data?.facts ?? []\n const total = data?.total ?? 0\n const totalPages = Math.max(1, Math.ceil(total / perPage))\n\n // Selection state for the bulk delete bar.\n const [selection, setSelection] = useState<Set<string>>(new Set())\n useEffect(() => { setSelection(new Set()) }, [userKey, q, cat, page, perPage])\n\n const deleteOne = useDeleteFactById()\n const bulkDelete = useBulkDeleteFacts()\n\n const [confirmOneId, setConfirmOneId] = useState<number | null>(null)\n const [confirmBulk, setConfirmBulk] = useState(false)\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null || v === '') next.delete(k)\n else next.set(k, v)\n }\n // Reset to page 1 on any filter mutation.\n if (Object.keys(patch).some((k) => k !== 'page')) next.delete('page')\n setParams(next, { replace: false })\n }\n\n async function onConfirmDeleteOne(): Promise<void> {\n if (confirmOneId == null || !userKey) return\n try {\n await deleteOne.mutateAsync({ id: confirmOneId, user_key: userKey })\n toast.success(t('facts.toast.deletedOne'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n async function onConfirmBulk(): Promise<void> {\n if (!userKey || selection.size === 0) return\n const ids = Array.from(selection).map(Number).filter(Number.isFinite)\n try {\n const r = await bulkDelete.mutateAsync({ user_key: userKey, body: { ids } })\n toast.success(t('facts.toast.deletedMany', { count: r.deleted }))\n setSelection(new Set())\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n const columns: DataTableColumn<Fact>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('facts.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'what',\n header: t('facts.col.what'),\n cell: (r) => <span className=\"line-clamp-2 text-text\">{r.what}</span>,\n asCardTitle: true,\n },\n {\n id: 'category',\n header: t('facts.col.category'),\n cell: (r) => (\n <Badge variant=\"outline\">\n {t(`facts.category.${r.category}`, { defaultValue: r.category })}\n </Badge>\n ),\n headClassName: 'w-28',\n },\n {\n id: 'confidence',\n header: t('facts.col.confidence'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{r.confidence.toFixed(2)}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'source',\n header: t('facts.col.source'),\n cell: (r) => <span className=\"text-text-dim text-xs\">{r.source}</span>,\n headClassName: 'w-28',\n hideOnMobile: true,\n },\n {\n id: 'createdAt',\n header: t('facts.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatEpoch(r.created_at)}</span>,\n headClassName: 'w-32',\n hideOnMobile: true,\n },\n {\n id: 'actions',\n header: '',\n cell: (r) => (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n setConfirmOneId(r.id)\n }}\n disabled={deleteOne.isPending || bulkDelete.isPending}\n aria-label={t('facts.action.delete')}\n >\n <Trash2 className=\"h-3 w-3\" />\n <span className=\"sr-only sm:not-sr-only sm:ml-1\">{t('facts.action.delete')}</span>\n </Button>\n </div>\n ),\n headClassName: 'w-24',\n },\n ],\n [t, deleteOne.isPending, bulkDelete.isPending],\n )\n\n if (!userKey) {\n return (\n <div className=\"mx-auto max-w-3xl\">\n <EmptyState\n icon={<Brain />}\n title={t('noUserSelected.title')}\n description={t('noUserSelected.description')}\n />\n </div>\n )\n }\n\n const selectedCount = selection.size\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('facts.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('subtitle')}</p>\n </header>\n\n {/* Filter row */}\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"relative flex-1 min-w-[200px] max-w-md\">\n <Label htmlFor=\"search\" className=\"text-xs text-text-dim\">\n {t('facts.filter.search')}\n </Label>\n <Search className=\"pointer-events-none absolute left-2 bottom-2 h-4 w-4 text-text-muted\" />\n <Input\n id=\"search\"\n value={qDraft}\n onChange={(e) => setQDraft(e.target.value)}\n className=\"pl-7 mt-1\"\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"category\" className=\"text-xs text-text-dim\">\n {t('facts.filter.category')}\n </Label>\n <Select\n value={cat ?? '__any__'}\n onValueChange={(v) => patchParams({ cat: v === '__any__' ? null : v })}\n >\n <SelectTrigger id=\"category\" className=\"w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__any__\">{t('facts.filter.categoryAny')}</SelectItem>\n {CATEGORY_OPTIONS.map((c) => (\n <SelectItem key={c} value={c}>\n {t(`facts.category.${c}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {selectedCount > 0 && (\n <div className=\"ml-auto flex items-center gap-2\">\n <Badge variant=\"secondary\">\n {t('facts.batch.selected', { count: selectedCount })}\n </Badge>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => setConfirmBulk(true)}\n disabled={bulkDelete.isPending}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('facts.batch.deleteSelected')}\n </Button>\n </div>\n )}\n </div>\n\n <DataTable\n columns={columns}\n rows={facts}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n selection={selection}\n onSelectionChange={setSelection}\n emptyState={\n <EmptyState\n icon={<Brain />}\n title={t('facts.empty.title')}\n description={t('facts.empty.description')}\n />\n }\n />\n\n {(facts.length > 0 || page > 1) && (\n <Pagination\n page={page}\n totalPages={totalPages}\n totalRows={total}\n perPage={perPage}\n perPageOptions={PER_PAGE_OPTIONS}\n onPageChange={(p) => patchParams({ page: p === 1 ? null : String(p) })}\n onPerPageChange={(pp) => patchParams({ per_page: pp === DEFAULT_PER_PAGE ? null : String(pp) })}\n />\n )}\n\n <ConfirmDialog\n open={confirmOneId != null}\n onOpenChange={(open) => { if (!open) setConfirmOneId(null) }}\n title={t('facts.action.confirmDelete')}\n description={t('facts.action.confirmDeleteDesc')}\n intent=\"danger\"\n confirmLabel={t('facts.action.delete')}\n onConfirm={onConfirmDeleteOne}\n />\n\n <ConfirmDialog\n open={confirmBulk}\n onOpenChange={setConfirmBulk}\n title={t('facts.batch.confirmDelete', { count: selectedCount })}\n description={t('facts.batch.confirmDeleteDesc')}\n intent=\"danger\"\n confirmLabel={t('facts.batch.deleteSelected')}\n onConfirm={onConfirmBulk}\n />\n </div>\n )\n}\n\n/** Format an epoch-ms number as a short locale string. */\nfunction formatEpoch(ms: number): string {\n try {\n const d = new Date(ms)\n if (Number.isNaN(d.getTime())) return String(ms)\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return String(ms)\n }\n}\n"],"names":["CATEGORY_OPTIONS","PER_PAGE_OPTIONS","DEFAULT_PER_PAGE","SEARCH_DEBOUNCE_MS","MemoryFactsRoute","t","useTranslation","params","setParams","useSearchParams","userKey","q","cat","page","perPage","qDraft","setQDraft","useState","useEffect","timer","patchParams","query","useMemo","data","isLoading","isFetching","refetch","useMemoryFacts","facts","total","totalPages","selection","setSelection","deleteOne","useDeleteFactById","bulkDelete","useBulkDeleteFacts","confirmOneId","setConfirmOneId","confirmBulk","setConfirmBulk","patch","next","k","v","onConfirmDeleteOne","toast","err","message","describeError","onConfirmBulk","ids","r","columns","jsxs","jsx","Badge","formatEpoch","Button","e","Trash2","EmptyState","Brain","selectedCount","Loader2","RefreshCcw","Label","Search","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","c","DataTable","Pagination","p","pp","ConfirmDialog","open","ms","d"],"mappings":"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"}