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
@@ -1,7 +1,7 @@
1
- import{o as u,u as j,j as s,l as o,B as d,m}from"./index-DY2Zglku.js";import{T as f,a as k,b as x,c as r,d as p,e as n}from"./table-_WsrnZ_T.js";import{d as g,e as b}from"./use-background-tasks-wCL7jn68.js";import{L as N}from"./loader-circle-D8L1w9c1.js";import{R as v}from"./refresh-ccw-7HdadG5V.js";import{C as w}from"./circle-x-7VaoZ7dY.js";import"./react-DlP5eolq.js";/**
1
+ import{h as u,u as j,j as s,d as o,e as d,p as h}from"./index-DCfdN5R7.js";import{T as f,a as k,b as x,c as r,d as p,e as n}from"./table-sCMZBe_Z.js";import{b as g,e as b}from"./use-background-tasks-CwFmOokw.js";import{L as N}from"./loader-circle-DDdmcH0k.js";import{R as v}from"./refresh-ccw-DlAd-eTQ.js";import{C as w}from"./circle-x-CqFMzO-x.js";import"./react-DlP5eolq.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
- */const y=u("Hourglass",[["path",{d:"M5 22h14",key:"ehvnwv"}],["path",{d:"M5 2h14",key:"pdyrp9"}],["path",{d:"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22",key:"1d314k"}],["path",{d:"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2",key:"1vvvr6"}]]);function B(){const{t:e}=j(["tasks","common"]),t=g(),i=b();async function h(a){if(confirm(e("asks.cancelConfirm",{id:a.slice(0,8)})))try{await i.mutateAsync(a),m.success(e("asks.cancelledToast"))}catch(l){m.error(l?.message??String(l))}}const c=t.data?.pending??[];return s.jsxs("div",{className:"mx-auto flex max-w-6xl flex-col gap-4 p-4",children:[s.jsxs("header",{className:"flex items-center gap-3",children:[s.jsx(y,{className:"h-5 w-5 text-text-dim"}),s.jsx("h1",{className:"text-xl font-semibold",children:e("asks.title")}),s.jsx(o,{variant:"info",children:c.length}),s.jsxs(d,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void t.refetch(),disabled:t.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[t.isFetching?s.jsx(N,{className:"h-4 w-4 animate-spin"}):s.jsx(v,{className:"h-4 w-4"}),s.jsx("span",{className:"hidden sm:inline",children:e("asks.refresh")})]})]}),s.jsx("p",{className:"text-sm text-text-dim",children:e("asks.subtitle")}),t.isLoading?s.jsx("div",{className:"h-32 rounded-md bg-surface-2 animate-pulse"}):c.length===0?s.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:e("asks.empty")}):s.jsx("section",{className:"rounded-md border border-border bg-surface",children:s.jsxs(f,{children:[s.jsx(k,{children:s.jsxs(x,{children:[s.jsx(r,{children:e("asks.col.reqId")}),s.jsx(r,{children:e("asks.col.thread")}),s.jsx(r,{children:e("asks.col.question")}),s.jsx(r,{children:e("asks.col.choices")}),s.jsx(r,{children:e("asks.col.age")}),s.jsx(r,{children:e("asks.col.actions")})]})}),s.jsx(p,{children:c.map(a=>s.jsxs(x,{children:[s.jsxs(n,{className:"font-mono text-[11px]",children:[a.reqId.slice(0,8),"…"]}),s.jsxs(n,{className:"font-mono text-[11px]",children:[a.platform,":",a.threadId]}),s.jsx(n,{className:"max-w-md break-words",children:a.question}),s.jsx(n,{children:s.jsx(o,{variant:"outline",children:a.choices})}),s.jsx(n,{className:"text-xs text-text-dim",children:C(a.ageMs,e)}),s.jsx(n,{children:s.jsxs(d,{variant:"ghost",size:"sm",onClick:()=>void h(a.reqId),disabled:i.isPending,className:"text-danger hover:text-danger",children:[s.jsx(w,{className:"h-4 w-4"}),e("asks.cancel")]})})]},a.reqId))})]})})]})}function C(e,t){return e<1e3?t("asks.justNow"):e<6e4?t("asks.seconds",{count:Math.floor(e/1e3)}):e<36e5?t("asks.minutes",{count:Math.floor(e/6e4)}):t("asks.hours",{count:Math.floor(e/36e5)})}export{B as default};
7
- //# sourceMappingURL=asks-DyUQopay.js.map
6
+ */const y=u("Hourglass",[["path",{d:"M5 22h14",key:"ehvnwv"}],["path",{d:"M5 2h14",key:"pdyrp9"}],["path",{d:"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22",key:"1d314k"}],["path",{d:"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2",key:"1vvvr6"}]]);function H(){const{t:e}=j(["tasks","common"]),t=g(),i=b();async function m(a){if(confirm(e("asks.cancelConfirm",{id:a.slice(0,8)})))try{await i.mutateAsync(a),h.success(e("asks.cancelledToast"))}catch(l){h.error(l?.message??String(l))}}const c=t.data?.pending??[];return s.jsxs("div",{className:"mx-auto flex max-w-6xl flex-col gap-4 p-4",children:[s.jsxs("header",{className:"flex items-center gap-3",children:[s.jsx(y,{className:"h-5 w-5 text-text-dim"}),s.jsx("h1",{className:"text-xl font-semibold",children:e("asks.title")}),s.jsx(o,{variant:"info",children:c.length}),s.jsxs(d,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void t.refetch(),disabled:t.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[t.isFetching?s.jsx(N,{className:"h-4 w-4 animate-spin"}):s.jsx(v,{className:"h-4 w-4"}),s.jsx("span",{className:"hidden sm:inline",children:e("asks.refresh")})]})]}),s.jsx("p",{className:"text-sm text-text-dim",children:e("asks.subtitle")}),t.isLoading?s.jsx("div",{className:"h-32 rounded-md bg-surface-2 animate-pulse"}):c.length===0?s.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:e("asks.empty")}):s.jsx("section",{className:"rounded-md border border-border bg-surface",children:s.jsxs(f,{children:[s.jsx(k,{children:s.jsxs(x,{children:[s.jsx(r,{children:e("asks.col.reqId")}),s.jsx(r,{children:e("asks.col.thread")}),s.jsx(r,{children:e("asks.col.question")}),s.jsx(r,{children:e("asks.col.choices")}),s.jsx(r,{children:e("asks.col.age")}),s.jsx(r,{children:e("asks.col.actions")})]})}),s.jsx(p,{children:c.map(a=>s.jsxs(x,{children:[s.jsxs(n,{className:"font-mono text-[11px]",children:[a.reqId.slice(0,8),"…"]}),s.jsxs(n,{className:"font-mono text-[11px]",children:[a.platform,":",a.threadId]}),s.jsx(n,{className:"max-w-md break-words",children:a.question}),s.jsx(n,{children:s.jsx(o,{variant:"outline",children:a.choices})}),s.jsx(n,{className:"text-xs text-text-dim",children:C(a.ageMs,e)}),s.jsx(n,{children:s.jsxs(d,{variant:"ghost",size:"sm",onClick:()=>void m(a.reqId),disabled:i.isPending,className:"text-danger hover:text-danger",children:[s.jsx(w,{className:"h-4 w-4"}),e("asks.cancel")]})})]},a.reqId))})]})})]})}function C(e,t){return e<1e3?t("asks.justNow"):e<6e4?t("asks.seconds",{count:Math.floor(e/1e3)}):e<36e5?t("asks.minutes",{count:Math.floor(e/6e4)}):t("asks.hours",{count:Math.floor(e/36e5)})}export{H as default};
7
+ //# sourceMappingURL=asks-DGuBsrJ7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"asks-DyUQopay.js","sources":["../../node_modules/lucide-react/dist/esm/icons/hourglass.js","../../src/routes/tasks/asks.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 Hourglass = createLucideIcon(\"Hourglass\", [\n [\"path\", { d: \"M5 22h14\", key: \"ehvnwv\" }],\n [\"path\", { d: \"M5 2h14\", key: \"pdyrp9\" }],\n [\n \"path\",\n {\n d: \"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22\",\n key: \"1d314k\"\n }\n ],\n [\n \"path\",\n { d: \"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2\", key: \"1vvvr6\" }\n ]\n]);\n\nexport { Hourglass as default };\n//# sourceMappingURL=hourglass.js.map\n","/**\n * /tasks/asks — admin view of pending ask_user (P1).\n */\n\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Hourglass, Loader2, RefreshCcw, XCircle } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport {\n useAsksList, useAskCancel,\n} from '@/hooks/use-background-tasks'\n\nexport default function TasksAsksRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const listQuery = useAsksList()\n const cancel = useAskCancel()\n\n async function onCancel(reqId: string): Promise<void> {\n if (!confirm(t('asks.cancelConfirm', { id: reqId.slice(0, 8) }))) return\n try {\n await cancel.mutateAsync(reqId)\n toast.success(t('asks.cancelledToast'))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n const rows = listQuery.data?.pending ?? []\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4 p-4\">\n <header className=\"flex items-center gap-3\">\n <Hourglass className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('asks.title')}</h1>\n <Badge variant=\"info\">{rows.length}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('asks.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('asks.subtitle')}</p>\n\n {listQuery.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : rows.length === 0 ? (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {t('asks.empty')}\n </section>\n ) : (\n <section className=\"rounded-md border border-border bg-surface\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('asks.col.reqId')}</TableHead>\n <TableHead>{t('asks.col.thread')}</TableHead>\n <TableHead>{t('asks.col.question')}</TableHead>\n <TableHead>{t('asks.col.choices')}</TableHead>\n <TableHead>{t('asks.col.age')}</TableHead>\n <TableHead>{t('asks.col.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((r) => (\n <TableRow key={r.reqId}>\n <TableCell className=\"font-mono text-[11px]\">{r.reqId.slice(0, 8)}…</TableCell>\n <TableCell className=\"font-mono text-[11px]\">{r.platform}:{r.threadId}</TableCell>\n <TableCell className=\"max-w-md break-words\">{r.question}</TableCell>\n <TableCell><Badge variant=\"outline\">{r.choices}</Badge></TableCell>\n <TableCell className=\"text-xs text-text-dim\">{fmtAge(r.ageMs, t)}</TableCell>\n <TableCell>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onCancel(r.reqId)}\n disabled={cancel.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <XCircle className=\"h-4 w-4\" />\n {t('asks.cancel')}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </section>\n )}\n </div>\n )\n}\n\nfunction fmtAge(ms: number, t: (key: string, opts?: Record<string, unknown>) => string): string {\n if (ms < 1_000) return t('asks.justNow')\n if (ms < 60_000) return t('asks.seconds', { count: Math.floor(ms / 1_000) })\n if (ms < 3_600_000) return t('asks.minutes', { count: Math.floor(ms / 60_000) })\n return t('asks.hours', { count: Math.floor(ms / 3_600_000) })\n}\n"],"names":["Hourglass","createLucideIcon","TasksAsksRoute","t","useTranslation","listQuery","useAsksList","cancel","useAskCancel","onCancel","reqId","toast","err","rows","jsxs","jsx","Badge","Button","Loader2","RefreshCcw","Table","TableHeader","TableRow","TableHead","TableBody","r","TableCell","XCircle","fmtAge","ms"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"asks-DGuBsrJ7.js","sources":["../../node_modules/lucide-react/dist/esm/icons/hourglass.js","../../src/routes/tasks/asks.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 Hourglass = createLucideIcon(\"Hourglass\", [\n [\"path\", { d: \"M5 22h14\", key: \"ehvnwv\" }],\n [\"path\", { d: \"M5 2h14\", key: \"pdyrp9\" }],\n [\n \"path\",\n {\n d: \"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22\",\n key: \"1d314k\"\n }\n ],\n [\n \"path\",\n { d: \"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2\", key: \"1vvvr6\" }\n ]\n]);\n\nexport { Hourglass as default };\n//# sourceMappingURL=hourglass.js.map\n","/**\n * /tasks/asks — admin view of pending ask_user (P1).\n */\n\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Hourglass, Loader2, RefreshCcw, XCircle } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport {\n useAsksList, useAskCancel,\n} from '@/hooks/use-background-tasks'\n\nexport default function TasksAsksRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const listQuery = useAsksList()\n const cancel = useAskCancel()\n\n async function onCancel(reqId: string): Promise<void> {\n if (!confirm(t('asks.cancelConfirm', { id: reqId.slice(0, 8) }))) return\n try {\n await cancel.mutateAsync(reqId)\n toast.success(t('asks.cancelledToast'))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n const rows = listQuery.data?.pending ?? []\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4 p-4\">\n <header className=\"flex items-center gap-3\">\n <Hourglass className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('asks.title')}</h1>\n <Badge variant=\"info\">{rows.length}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('asks.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('asks.subtitle')}</p>\n\n {listQuery.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : rows.length === 0 ? (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {t('asks.empty')}\n </section>\n ) : (\n <section className=\"rounded-md border border-border bg-surface\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('asks.col.reqId')}</TableHead>\n <TableHead>{t('asks.col.thread')}</TableHead>\n <TableHead>{t('asks.col.question')}</TableHead>\n <TableHead>{t('asks.col.choices')}</TableHead>\n <TableHead>{t('asks.col.age')}</TableHead>\n <TableHead>{t('asks.col.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((r) => (\n <TableRow key={r.reqId}>\n <TableCell className=\"font-mono text-[11px]\">{r.reqId.slice(0, 8)}…</TableCell>\n <TableCell className=\"font-mono text-[11px]\">{r.platform}:{r.threadId}</TableCell>\n <TableCell className=\"max-w-md break-words\">{r.question}</TableCell>\n <TableCell><Badge variant=\"outline\">{r.choices}</Badge></TableCell>\n <TableCell className=\"text-xs text-text-dim\">{fmtAge(r.ageMs, t)}</TableCell>\n <TableCell>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onCancel(r.reqId)}\n disabled={cancel.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <XCircle className=\"h-4 w-4\" />\n {t('asks.cancel')}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </section>\n )}\n </div>\n )\n}\n\nfunction fmtAge(ms: number, t: (key: string, opts?: Record<string, unknown>) => string): string {\n if (ms < 1_000) return t('asks.justNow')\n if (ms < 60_000) return t('asks.seconds', { count: Math.floor(ms / 1_000) })\n if (ms < 3_600_000) return t('asks.minutes', { count: Math.floor(ms / 60_000) })\n return t('asks.hours', { count: Math.floor(ms / 3_600_000) })\n}\n"],"names":["Hourglass","createLucideIcon","TasksAsksRoute","t","useTranslation","listQuery","useAsksList","cancel","useAskCancel","onCancel","reqId","toast","err","rows","jsxs","jsx","Badge","Button","Loader2","RefreshCcw","Table","TableHeader","TableRow","TableHead","TableBody","r","TableCell","XCircle","fmtAge","ms"],"mappings":"yXAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAYC,EAAiB,YAAa,CAC9C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CACE,OACA,CACE,EAAG,8EACH,IAAK,QACX,CACA,EACE,CACE,OACA,CAAE,EAAG,yEAA0E,IAAK,QAAQ,CAChG,CACA,CAAC,ECND,SAAwBC,GAA8B,CACpD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,CAAC,QAAS,QAAQ,CAAC,EAC1CC,EAAYC,EAAA,EACZC,EAASC,EAAA,EAEf,eAAeC,EAASC,EAA8B,CACpD,GAAK,QAAQP,EAAE,qBAAsB,CAAE,GAAIO,EAAM,MAAM,EAAG,CAAC,CAAA,CAAG,CAAC,EAC/D,GAAI,CACF,MAAMH,EAAO,YAAYG,CAAK,EAC9BC,EAAM,QAAQR,EAAE,qBAAqB,CAAC,CACxC,OAASS,EAAK,CACZD,EAAM,MAAQC,GAAe,SAAW,OAAOA,CAAG,CAAE,CACtD,CACF,CAEA,MAAMC,EAAOR,EAAU,MAAM,SAAW,CAAA,EACxC,OACES,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,0BAChB,SAAA,CAAAC,EAAAA,IAACf,EAAA,CAAU,UAAU,uBAAA,CAAwB,QAC5C,KAAA,CAAG,UAAU,wBAAyB,SAAAG,EAAE,YAAY,EAAE,EACvDY,EAAAA,IAACC,EAAA,CAAM,QAAQ,OAAQ,WAAK,OAAO,EACnCF,EAAAA,KAACG,EAAA,CACC,QAAQ,QAAQ,KAAK,KAAK,UAAU,UACpC,QAAS,IAAM,KAAKZ,EAAU,QAAA,EAC9B,SAAUA,EAAU,WACpB,aAAYF,EAAE,kBAAmB,CAAE,GAAI,SAAU,EAEhD,SAAA,CAAAE,EAAU,iBACNa,EAAA,CAAQ,UAAU,uBAAuB,EAC1CH,EAAAA,IAACI,EAAA,CAAW,UAAU,SAAA,CAAU,QACnC,OAAA,CAAK,UAAU,mBAAoB,SAAAhB,EAAE,cAAc,CAAA,CAAE,CAAA,CAAA,CAAA,CACxD,EACF,QACC,IAAA,CAAE,UAAU,wBAAyB,SAAAA,EAAE,eAAe,EAAE,EAExDE,EAAU,UACTU,EAAAA,IAAC,MAAA,CAAI,UAAU,4CAAA,CAA6C,EAC1DF,EAAK,SAAW,EAClBE,EAAAA,IAAC,WAAQ,UAAU,mFAChB,SAAAZ,EAAE,YAAY,CAAA,CACjB,QAEC,UAAA,CAAQ,UAAU,6CACjB,SAAAW,EAAAA,KAACM,EAAA,CACC,SAAA,CAAAL,EAAAA,IAACM,EAAA,CACC,gBAACC,EAAA,CACC,SAAA,CAAAP,EAAAA,IAACQ,EAAA,CAAW,SAAApB,EAAE,gBAAgB,CAAA,CAAE,EAChCY,EAAAA,IAACQ,EAAA,CAAW,SAAApB,EAAE,iBAAiB,CAAA,CAAE,EACjCY,EAAAA,IAACQ,EAAA,CAAW,SAAApB,EAAE,mBAAmB,CAAA,CAAE,EACnCY,EAAAA,IAACQ,EAAA,CAAW,SAAApB,EAAE,kBAAkB,CAAA,CAAE,EAClCY,EAAAA,IAACQ,EAAA,CAAW,SAAApB,EAAE,cAAc,CAAA,CAAE,EAC9BY,EAAAA,IAACQ,EAAA,CAAW,SAAApB,EAAE,kBAAkB,CAAA,CAAE,CAAA,CAAA,CACpC,CAAA,CACF,QACCqB,EAAA,CACE,SAAAX,EAAK,IAAKY,UACRH,EAAA,CACC,SAAA,CAAAR,EAAAA,KAACY,EAAA,CAAU,UAAU,wBAAyB,SAAA,CAAAD,EAAE,MAAM,MAAM,EAAG,CAAC,EAAE,GAAA,EAAC,EACnEX,EAAAA,KAACY,EAAA,CAAU,UAAU,wBAAyB,SAAA,CAAAD,EAAE,SAAS,IAAEA,EAAE,QAAA,EAAS,EACtEV,EAAAA,IAACW,EAAA,CAAU,UAAU,uBAAwB,WAAE,SAAS,EACxDX,EAAAA,IAACW,GAAU,SAAAX,EAAAA,IAACC,EAAA,CAAM,QAAQ,UAAW,SAAAS,EAAE,QAAQ,CAAA,CAAQ,EACvDV,EAAAA,IAACW,GAAU,UAAU,wBAAyB,WAAOD,EAAE,MAAOtB,CAAC,EAAE,QAChEuB,EAAA,CACC,SAAAZ,EAAAA,KAACG,EAAA,CACC,QAAQ,QAAQ,KAAK,KACrB,QAAS,IAAM,KAAKR,EAASgB,EAAE,KAAK,EACpC,SAAUlB,EAAO,UACjB,UAAU,gCAEV,SAAA,CAAAQ,EAAAA,IAACY,EAAA,CAAQ,UAAU,SAAA,CAAU,EAC5BxB,EAAE,aAAa,CAAA,CAAA,CAAA,CAClB,CACF,CAAA,GAhBasB,EAAE,KAiBjB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EAEJ,CAEJ,CAEA,SAASG,EAAOC,EAAY,EAAoE,CAC9F,OAAIA,EAAK,IAAc,EAAE,cAAc,EACnCA,EAAK,IAAe,EAAE,eAAgB,CAAE,MAAO,KAAK,MAAMA,EAAK,GAAK,CAAA,CAAG,EACvEA,EAAK,KAAkB,EAAE,eAAgB,CAAE,MAAO,KAAK,MAAMA,EAAK,GAAM,CAAA,CAAG,EACxE,EAAE,aAAc,CAAE,MAAO,KAAK,MAAMA,EAAK,IAAS,EAAG,CAC9D","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- import{u as A,f as O,j as t,l as F,B as I,L as P,I as B,c as _}from"./index-DY2Zglku.js";import{r as i}from"./react-DlP5eolq.js";import{D as k}from"./data-table-BLYG79TX.js";import{E as U}from"./empty-state-96qpPTNg.js";import{b as $}from"./use-observability-DGkN80qa.js";import{L as q}from"./loader-circle-D8L1w9c1.js";import{R as z}from"./refresh-ccw-7HdadG5V.js";import{A as H}from"./activity-BnlFGipw.js";import"./table-_WsrnZ_T.js";import"./arrow-up-CAiQ2jy-.js";import"./arrow-down-DxlRHrs8.js";const G=300;function it(){const{t:e}=A(["observability","common"]),[s,d]=O(),c=Math.max(1,Number(s.get("days"))||7),n=s.get("agent")??"",l=s.get("platform")??"",r=s.get("user")??"",o=s.get("intent")??"",[u,j]=i.useState(n),[x,b]=i.useState(l),[f,w]=i.useState(r),[h,C]=i.useState(o);i.useEffect(()=>{j(n)},[n]),i.useEffect(()=>{b(l)},[l]),i.useEffect(()=>{w(r)},[r]),i.useEffect(()=>{C(o)},[o]),i.useEffect(()=>{const a=window.setTimeout(()=>{R({agent:u||null,platform:x||null,user:f||null,intent:h||null})},G);return()=>window.clearTimeout(a)},[u,x,f,h]);const E=i.useMemo(()=>({days:c,limit:200,...n?{agent:n}:{},...l?{platform:l}:{},...r?{user:r}:{},...o?{intent:o}:{}}),[c,n,l,r,o]),{data:v,isLoading:S,isFetching:y,refetch:M}=$(E),L=v?.invocations??[],p=v?.stats;function R(a){const g=new URLSearchParams(s);for(const[D,N]of Object.entries(a))N==null||N===""?g.delete(D):g.set(D,N);d(g,{replace:!0})}const T=i.useMemo(()=>[{id:"ts",header:e("audit.col.ts"),cell:a=>t.jsx("span",{className:"text-text-dim text-xs tabular-nums",children:J(a.ts)}),headClassName:"w-32"},{id:"agent",header:e("audit.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"platform",header:e("audit.col.platform"),cell:a=>t.jsx("span",{className:"text-text-dim",children:a.platform}),headClassName:"w-24",hideOnMobile:!0},{id:"user",header:e("audit.col.user"),cell:a=>t.jsx("span",{className:"font-mono text-xs text-text-dim line-clamp-1",children:a.user_id}),headClassName:"w-32",hideOnMobile:!0},{id:"intent",header:e("audit.col.intent"),cell:a=>t.jsx("span",{className:"text-text-dim line-clamp-1",children:a.intent||"—"}),asCardTitle:!0},{id:"duration",header:e("audit.col.duration"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:[Math.round(a.duration_ms),"ms"]}),headClassName:"w-20"},{id:"cost",header:e("audit.col.cost"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["$",a.cost.toFixed(4)]}),headClassName:"w-24",hideOnMobile:!0},{id:"outcome",header:e("audit.col.outcome"),cell:a=>t.jsx(F,{variant:a.success?"success":"danger",title:a.error??"",children:a.success?e("audit.outcome.ok"):e("audit.outcome.fail")}),headClassName:"w-20"}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsx("header",{className:"flex flex-col gap-1",children:t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("audit.title")}),t.jsxs(I,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>M(),disabled:y,"aria-label":e("actions.refresh",{ns:"common"}),children:[y?t.jsx(q,{className:"h-4 w-4 animate-spin"}):t.jsx(z,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]})}),p&&t.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-sm",children:[t.jsxs("span",{className:"text-text-dim",children:[e("audit.stats.total"),": ",t.jsx("span",{className:"tabular-nums font-medium text-text",children:p.total})]}),t.jsxs("span",{className:"text-text-dim",children:[e("audit.stats.totalCost"),": ",t.jsxs("span",{className:"tabular-nums font-medium text-text",children:["$",p.totalCost.toFixed(4)]})]})]}),t.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[t.jsx(m,{id:"agent",label:e("audit.filter.agent"),value:u,onChange:j}),t.jsx(m,{id:"platform",label:e("audit.filter.platform"),value:x,onChange:b}),t.jsx(m,{id:"user",label:e("audit.filter.user"),value:f,onChange:w}),t.jsx(m,{id:"intent",label:e("audit.filter.intent"),value:h,onChange:C})]}),t.jsx(k,{columns:T,rows:L,getRowId:a=>String(a.id),loading:S,emptyState:t.jsx(U,{icon:t.jsx(H,{}),title:e("audit.empty.title"),description:e("audit.empty.description")})})]})}function m({id:e,label:s,value:d,onChange:c}){return t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx(P,{htmlFor:e,className:"text-xs text-text-dim",children:s}),t.jsx(B,{id:e,value:d,onChange:n=>c(n.target.value),className:_("h-9")})]})}function J(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return e}}export{it as default};
2
- //# sourceMappingURL=audit-BVHTMS82.js.map
1
+ import{u as L,i as O,j as t,d as F,e as I,w as P,I as _,f as k}from"./index-DCfdN5R7.js";import{r as i}from"./react-DlP5eolq.js";import{D as B}from"./data-table-BkUshOZz.js";import{E as U}from"./empty-state-CuiqdZiB.js";import{b as $}from"./use-observability-CY5ZUPrC.js";import{L as q}from"./loader-circle-DDdmcH0k.js";import{R as z}from"./refresh-ccw-DlAd-eTQ.js";import{A as H}from"./activity-ul8Os7Pz.js";import"./table-sCMZBe_Z.js";import"./arrow-up-Dm0U4-6U.js";import"./arrow-down-7i0xwCI2.js";const G=300;function it(){const{t:e}=L(["observability","common"]),[s,d]=O(),c=Math.max(1,Number(s.get("days"))||7),n=s.get("agent")??"",l=s.get("platform")??"",r=s.get("user")??"",o=s.get("intent")??"",[u,j]=i.useState(n),[x,b]=i.useState(l),[f,w]=i.useState(r),[h,C]=i.useState(o);i.useEffect(()=>{j(n)},[n]),i.useEffect(()=>{b(l)},[l]),i.useEffect(()=>{w(r)},[r]),i.useEffect(()=>{C(o)},[o]),i.useEffect(()=>{const a=window.setTimeout(()=>{T({agent:u||null,platform:x||null,user:f||null,intent:h||null})},G);return()=>window.clearTimeout(a)},[u,x,f,h]);const E=i.useMemo(()=>({days:c,limit:200,...n?{agent:n}:{},...l?{platform:l}:{},...r?{user:r}:{},...o?{intent:o}:{}}),[c,n,l,r,o]),{data:v,isLoading:S,isFetching:y,refetch:M}=$(E),R=v?.invocations??[],p=v?.stats;function T(a){const g=new URLSearchParams(s);for(const[D,N]of Object.entries(a))N==null||N===""?g.delete(D):g.set(D,N);d(g,{replace:!0})}const A=i.useMemo(()=>[{id:"ts",header:e("audit.col.ts"),cell:a=>t.jsx("span",{className:"text-text-dim text-xs tabular-nums",children:J(a.ts)}),headClassName:"w-32"},{id:"agent",header:e("audit.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"platform",header:e("audit.col.platform"),cell:a=>t.jsx("span",{className:"text-text-dim",children:a.platform}),headClassName:"w-24",hideOnMobile:!0},{id:"user",header:e("audit.col.user"),cell:a=>t.jsx("span",{className:"font-mono text-xs text-text-dim line-clamp-1",children:a.user_id}),headClassName:"w-32",hideOnMobile:!0},{id:"intent",header:e("audit.col.intent"),cell:a=>t.jsx("span",{className:"text-text-dim line-clamp-1",children:a.intent||"—"}),asCardTitle:!0},{id:"duration",header:e("audit.col.duration"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:[Math.round(a.duration_ms),"ms"]}),headClassName:"w-20"},{id:"cost",header:e("audit.col.cost"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["$",a.cost.toFixed(4)]}),headClassName:"w-24",hideOnMobile:!0},{id:"outcome",header:e("audit.col.outcome"),cell:a=>t.jsx(F,{variant:a.success?"success":"danger",title:a.error??"",children:a.success?e("audit.outcome.ok"):e("audit.outcome.fail")}),headClassName:"w-20"}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsx("header",{className:"flex flex-col gap-1",children:t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("audit.title")}),t.jsxs(I,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>M(),disabled:y,"aria-label":e("actions.refresh",{ns:"common"}),children:[y?t.jsx(q,{className:"h-4 w-4 animate-spin"}):t.jsx(z,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]})}),p&&t.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-sm",children:[t.jsxs("span",{className:"text-text-dim",children:[e("audit.stats.total"),": ",t.jsx("span",{className:"tabular-nums font-medium text-text",children:p.total})]}),t.jsxs("span",{className:"text-text-dim",children:[e("audit.stats.totalCost"),": ",t.jsxs("span",{className:"tabular-nums font-medium text-text",children:["$",p.totalCost.toFixed(4)]})]})]}),t.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[t.jsx(m,{id:"agent",label:e("audit.filter.agent"),value:u,onChange:j}),t.jsx(m,{id:"platform",label:e("audit.filter.platform"),value:x,onChange:b}),t.jsx(m,{id:"user",label:e("audit.filter.user"),value:f,onChange:w}),t.jsx(m,{id:"intent",label:e("audit.filter.intent"),value:h,onChange:C})]}),t.jsx(B,{columns:A,rows:R,getRowId:a=>String(a.id),loading:S,emptyState:t.jsx(U,{icon:t.jsx(H,{}),title:e("audit.empty.title"),description:e("audit.empty.description")})})]})}function m({id:e,label:s,value:d,onChange:c}){return t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx(P,{htmlFor:e,className:"text-xs text-text-dim",children:s}),t.jsx(_,{id:e,value:d,onChange:n=>c(n.target.value),className:k("h-9")})]})}function J(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return e}}export{it as default};
2
+ //# sourceMappingURL=audit-BRXsplJ2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-BVHTMS82.js","sources":["../../src/routes/observability/audit.tsx"],"sourcesContent":["/**\n * /observability/audit — recent invocations timeline. URL state for\n * the four filter slots (agent / platform / user / intent) so deep-\n * linking works; layout's ?days= window applies too.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Activity, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\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 { useAudit } from '@/hooks/use-observability'\nimport type { InvocationRow, ListAuditQuery } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nexport default function ObservabilityAuditRoute(): JSX.Element {\n const { t } = useTranslation(['observability', 'common'])\n const [params, setParams] = useSearchParams()\n const days = Math.max(1, Number(params.get('days')) || 7)\n\n const agent = params.get('agent') ?? ''\n const platform = params.get('platform') ?? ''\n const user = params.get('user') ?? ''\n const intent = params.get('intent') ?? ''\n\n // Local drafts for the four free-text filter inputs — debounce so\n // typing doesn't fire one /api/audit per keystroke.\n const [agentDraft, setAgentDraft] = useState(agent)\n const [platformDraft, setPlatformDraft] = useState(platform)\n const [userDraft, setUserDraft] = useState(user)\n const [intentDraft, setIntentDraft] = useState(intent)\n\n useEffect(() => { setAgentDraft(agent) }, [agent])\n useEffect(() => { setPlatformDraft(platform) }, [platform])\n useEffect(() => { setUserDraft(user) }, [user])\n useEffect(() => { setIntentDraft(intent) }, [intent])\n\n useEffect(() => {\n const timer = window.setTimeout(() => {\n patchParams({\n agent: agentDraft || null,\n platform: platformDraft || null,\n user: userDraft || null,\n intent: intentDraft || null,\n })\n }, SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentDraft, platformDraft, userDraft, intentDraft])\n\n const query: ListAuditQuery = useMemo(\n () => ({\n days,\n limit: 200,\n ...(agent ? { agent } : {}),\n ...(platform ? { platform } : {}),\n ...(user ? { user } : {}),\n ...(intent ? { intent } : {}),\n }),\n [days, agent, platform, user, intent],\n )\n\n const { data, isLoading, isFetching, refetch } = useAudit(query)\n const rows = data?.invocations ?? []\n const stats = data?.stats\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 setParams(next, { replace: true })\n }\n\n const columns: DataTableColumn<InvocationRow>[] = useMemo(\n () => [\n {\n id: 'ts',\n header: t('audit.col.ts'),\n cell: (r) => <span className=\"text-text-dim text-xs tabular-nums\">{formatTime(r.ts)}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'agent',\n header: t('audit.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'platform',\n header: t('audit.col.platform'),\n cell: (r) => <span className=\"text-text-dim\">{r.platform}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'user',\n header: t('audit.col.user'),\n cell: (r) => <span className=\"font-mono text-xs text-text-dim line-clamp-1\">{r.user_id}</span>,\n headClassName: 'w-32',\n hideOnMobile: true,\n },\n {\n id: 'intent',\n header: t('audit.col.intent'),\n cell: (r) => <span className=\"text-text-dim line-clamp-1\">{r.intent || '—'}</span>,\n asCardTitle: true,\n },\n {\n id: 'duration',\n header: t('audit.col.duration'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{Math.round(r.duration_ms)}ms</span>,\n headClassName: 'w-20',\n },\n {\n id: 'cost',\n header: t('audit.col.cost'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">${r.cost.toFixed(4)}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'outcome',\n header: t('audit.col.outcome'),\n cell: (r) => (\n <Badge variant={r.success ? 'success' : 'danger'} title={r.error ?? ''}>\n {r.success ? t('audit.outcome.ok') : t('audit.outcome.fail')}\n </Badge>\n ),\n headClassName: 'w-20',\n },\n ],\n [t],\n )\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('audit.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 </header>\n\n {stats && (\n <div className=\"flex flex-wrap items-center gap-3 text-sm\">\n <span className=\"text-text-dim\">{t('audit.stats.total')}: <span className=\"tabular-nums font-medium text-text\">{stats.total}</span></span>\n <span className=\"text-text-dim\">{t('audit.stats.totalCost')}: <span className=\"tabular-nums font-medium text-text\">${stats.totalCost.toFixed(4)}</span></span>\n </div>\n )}\n\n {/* Filter row */}\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n <FilterInput id=\"agent\" label={t('audit.filter.agent')} value={agentDraft} onChange={setAgentDraft} />\n <FilterInput id=\"platform\" label={t('audit.filter.platform')} value={platformDraft} onChange={setPlatformDraft} />\n <FilterInput id=\"user\" label={t('audit.filter.user')} value={userDraft} onChange={setUserDraft} />\n <FilterInput id=\"intent\" label={t('audit.filter.intent')} value={intentDraft} onChange={setIntentDraft} />\n </div>\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<Activity />}\n title={t('audit.empty.title')}\n description={t('audit.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\ninterface FilterInputProps {\n id: string\n label: string\n value: string\n onChange: (v: string) => void\n}\n\nfunction FilterInput({ id, label, value, onChange }: FilterInputProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <Input\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={cn('h-9')}\n />\n </div>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["SEARCH_DEBOUNCE_MS","ObservabilityAuditRoute","t","useTranslation","params","setParams","useSearchParams","days","agent","platform","user","intent","agentDraft","setAgentDraft","useState","platformDraft","setPlatformDraft","userDraft","setUserDraft","intentDraft","setIntentDraft","useEffect","timer","patchParams","query","useMemo","data","isLoading","isFetching","refetch","useAudit","rows","stats","patch","next","k","v","columns","r","jsx","formatTime","jsxs","Badge","Button","Loader2","RefreshCcw","FilterInput","DataTable","EmptyState","Activity","id","label","value","onChange","Label","Input","e","cn","iso","d"],"mappings":"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"}
1
+ {"version":3,"file":"audit-BRXsplJ2.js","sources":["../../src/routes/observability/audit.tsx"],"sourcesContent":["/**\n * /observability/audit — recent invocations timeline. URL state for\n * the four filter slots (agent / platform / user / intent) so deep-\n * linking works; layout's ?days= window applies too.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Activity, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\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 { useAudit } from '@/hooks/use-observability'\nimport type { InvocationRow, ListAuditQuery } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nexport default function ObservabilityAuditRoute(): JSX.Element {\n const { t } = useTranslation(['observability', 'common'])\n const [params, setParams] = useSearchParams()\n const days = Math.max(1, Number(params.get('days')) || 7)\n\n const agent = params.get('agent') ?? ''\n const platform = params.get('platform') ?? ''\n const user = params.get('user') ?? ''\n const intent = params.get('intent') ?? ''\n\n // Local drafts for the four free-text filter inputs — debounce so\n // typing doesn't fire one /api/audit per keystroke.\n const [agentDraft, setAgentDraft] = useState(agent)\n const [platformDraft, setPlatformDraft] = useState(platform)\n const [userDraft, setUserDraft] = useState(user)\n const [intentDraft, setIntentDraft] = useState(intent)\n\n useEffect(() => { setAgentDraft(agent) }, [agent])\n useEffect(() => { setPlatformDraft(platform) }, [platform])\n useEffect(() => { setUserDraft(user) }, [user])\n useEffect(() => { setIntentDraft(intent) }, [intent])\n\n useEffect(() => {\n const timer = window.setTimeout(() => {\n patchParams({\n agent: agentDraft || null,\n platform: platformDraft || null,\n user: userDraft || null,\n intent: intentDraft || null,\n })\n }, SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentDraft, platformDraft, userDraft, intentDraft])\n\n const query: ListAuditQuery = useMemo(\n () => ({\n days,\n limit: 200,\n ...(agent ? { agent } : {}),\n ...(platform ? { platform } : {}),\n ...(user ? { user } : {}),\n ...(intent ? { intent } : {}),\n }),\n [days, agent, platform, user, intent],\n )\n\n const { data, isLoading, isFetching, refetch } = useAudit(query)\n const rows = data?.invocations ?? []\n const stats = data?.stats\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 setParams(next, { replace: true })\n }\n\n const columns: DataTableColumn<InvocationRow>[] = useMemo(\n () => [\n {\n id: 'ts',\n header: t('audit.col.ts'),\n cell: (r) => <span className=\"text-text-dim text-xs tabular-nums\">{formatTime(r.ts)}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'agent',\n header: t('audit.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'platform',\n header: t('audit.col.platform'),\n cell: (r) => <span className=\"text-text-dim\">{r.platform}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'user',\n header: t('audit.col.user'),\n cell: (r) => <span className=\"font-mono text-xs text-text-dim line-clamp-1\">{r.user_id}</span>,\n headClassName: 'w-32',\n hideOnMobile: true,\n },\n {\n id: 'intent',\n header: t('audit.col.intent'),\n cell: (r) => <span className=\"text-text-dim line-clamp-1\">{r.intent || '—'}</span>,\n asCardTitle: true,\n },\n {\n id: 'duration',\n header: t('audit.col.duration'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{Math.round(r.duration_ms)}ms</span>,\n headClassName: 'w-20',\n },\n {\n id: 'cost',\n header: t('audit.col.cost'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">${r.cost.toFixed(4)}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'outcome',\n header: t('audit.col.outcome'),\n cell: (r) => (\n <Badge variant={r.success ? 'success' : 'danger'} title={r.error ?? ''}>\n {r.success ? t('audit.outcome.ok') : t('audit.outcome.fail')}\n </Badge>\n ),\n headClassName: 'w-20',\n },\n ],\n [t],\n )\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('audit.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 </header>\n\n {stats && (\n <div className=\"flex flex-wrap items-center gap-3 text-sm\">\n <span className=\"text-text-dim\">{t('audit.stats.total')}: <span className=\"tabular-nums font-medium text-text\">{stats.total}</span></span>\n <span className=\"text-text-dim\">{t('audit.stats.totalCost')}: <span className=\"tabular-nums font-medium text-text\">${stats.totalCost.toFixed(4)}</span></span>\n </div>\n )}\n\n {/* Filter row */}\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n <FilterInput id=\"agent\" label={t('audit.filter.agent')} value={agentDraft} onChange={setAgentDraft} />\n <FilterInput id=\"platform\" label={t('audit.filter.platform')} value={platformDraft} onChange={setPlatformDraft} />\n <FilterInput id=\"user\" label={t('audit.filter.user')} value={userDraft} onChange={setUserDraft} />\n <FilterInput id=\"intent\" label={t('audit.filter.intent')} value={intentDraft} onChange={setIntentDraft} />\n </div>\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<Activity />}\n title={t('audit.empty.title')}\n description={t('audit.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\ninterface FilterInputProps {\n id: string\n label: string\n value: string\n onChange: (v: string) => void\n}\n\nfunction FilterInput({ id, label, value, onChange }: FilterInputProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <Input\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={cn('h-9')}\n />\n </div>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["SEARCH_DEBOUNCE_MS","ObservabilityAuditRoute","t","useTranslation","params","setParams","useSearchParams","days","agent","platform","user","intent","agentDraft","setAgentDraft","useState","platformDraft","setPlatformDraft","userDraft","setUserDraft","intentDraft","setIntentDraft","useEffect","timer","patchParams","query","useMemo","data","isLoading","isFetching","refetch","useAudit","rows","stats","patch","next","k","v","columns","r","jsx","formatTime","jsxs","Badge","Button","Loader2","RefreshCcw","FilterInput","DataTable","EmptyState","Activity","id","label","value","onChange","Label","Input","e","cn","iso","d"],"mappings":"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"}
@@ -1,7 +1,7 @@
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.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const t=e("Bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]]);export{t as B};
7
- //# sourceMappingURL=bell-D7iS7ctN.js.map
7
+ //# sourceMappingURL=bell-B-UdeJsp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bell-D7iS7ctN.js","sources":["../../node_modules/lucide-react/dist/esm/icons/bell.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 Bell = createLucideIcon(\"Bell\", [\n [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\n key: \"11g9vi\"\n }\n ]\n]);\n\nexport { Bell as default };\n//# sourceMappingURL=bell.js.map\n"],"names":["Bell","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,OAAQ,CAAE,EAAG,+BAAgC,IAAK,QAAQ,CAAE,EAC7D,CACE,OACA,CACE,EAAG,gIACH,IAAK,QACX,CACA,CACA,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"bell-B-UdeJsp.js","sources":["../../node_modules/lucide-react/dist/esm/icons/bell.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 Bell = createLucideIcon(\"Bell\", [\n [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\n key: \"11g9vi\"\n }\n ]\n]);\n\nexport { Bell as default };\n//# sourceMappingURL=bell.js.map\n"],"names":["Bell","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,OAAQ,CAAE,EAAG,+BAAgC,IAAK,QAAQ,CAAE,EAC7D,CACE,OACA,CACE,EAAG,gIACH,IAAK,QACX,CACA,CACA,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ import{r as f,s as N,u as w,i as _,j as t,e as y,k as S,l as C,m as v,n as I,o as d}from"./index-DCfdN5R7.js";import{r as m}from"./react-DlP5eolq.js";import{D as T}from"./data-table-BkUshOZz.js";import{E as D}from"./empty-state-CuiqdZiB.js";import{S as R}from"./status-badge-CyLdpsXq.js";import{L as B}from"./loader-circle-DDdmcH0k.js";import{R as L}from"./refresh-ccw-DlAd-eTQ.js";import{T as M}from"./terminal-_pXeEjXG.js";import"./table-sCMZBe_Z.js";import"./arrow-up-Dm0U4-6U.js";import"./arrow-down-7i0xwCI2.js";const k={all:["bgjobs"],list:s=>["bgjobs","list",s]};function A(s){return f({queryKey:k.list(s),queryFn:()=>N.listBgJobs(s),refetchInterval:5e3,refetchIntervalInBackground:!1})}function U(){const{t:s}=w(["tasks","common"]),[a,i]=_(),l=a.get("root")??null,{data:o,isLoading:x,isFetching:c,refetch:h}=A(l?{root:l}:{}),n=o?.roots??[],b=m.useMemo(()=>o?o.jobs?o.jobs:o.groups?o.groups.flatMap(e=>e.jobs):[]:[],[o]);function j(e){const r=new URLSearchParams(a);e?r.set("root",e):r.delete("root"),i(r,{replace:!0})}const p=m.useMemo(()=>[{id:"name",header:s("bgjobs.col.name"),cell:e=>t.jsx("span",{className:"font-medium",children:e.name}),asCardTitle:!0},{id:"status",header:s("bgjobs.col.status"),cell:e=>t.jsx(R,{status:e.status,children:e.status}),headClassName:"w-28"},{id:"root",header:s("bgjobs.col.root"),cell:e=>{const r=n.find(g=>g.id===e.rootId);return t.jsx("span",{className:"text-text-dim",title:r?.path??e.rootId,children:r?.label??e.rootId})},headClassName:"w-32"},{id:"pid",header:s("bgjobs.col.pid"),cell:e=>t.jsx("span",{className:"tabular-nums text-text-dim",children:e.pid??"—"}),headClassName:"w-20",hideOnMobile:!0},{id:"startedAt",header:s("bgjobs.col.startedAt"),cell:e=>t.jsx("span",{className:"text-text-dim",children:u(e.started_at)}),headClassName:"w-40",hideOnMobile:!0},{id:"endedAt",header:s("bgjobs.col.endedAt"),cell:e=>t.jsx("span",{className:"text-text-dim",children:u(e.ended_at)}),headClassName:"w-40",hideOnMobile:!0},{id:"exit",header:s("bgjobs.col.exit"),cell:e=>e.ended_at==null?t.jsx("span",{className:"text-text-muted",children:s("bgjobs.stillRunning")}):e.exit_code===0?t.jsx("span",{className:"text-success",children:s("bgjobs.exitOk")}):e.exit_code!=null?t.jsx("span",{className:"text-danger tabular-nums",children:e.exit_code}):t.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-20"}],[s,n]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:s("bgjobs.title")}),t.jsxs(y,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>h(),disabled:c,"aria-label":s("actions.refresh",{ns:"common"}),children:[c?t.jsx(B,{className:"h-4 w-4 animate-spin"}):t.jsx(L,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:s("bgjobs.subtitle")})]}),t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx("label",{className:"text-sm text-text-dim",htmlFor:"root-filter",children:s("bgjobs.filter.root")}),t.jsxs(S,{value:l??"__any__",onValueChange:e=>j(e==="__any__"?null:e),children:[t.jsx(C,{id:"root-filter",className:"w-[180px]",children:t.jsx(v,{})}),t.jsxs(I,{children:[t.jsx(d,{value:"__any__",children:s("bgjobs.filter.rootAny")}),n.map(e=>t.jsx(d,{value:e.id,children:e.label},e.id))]})]})]}),t.jsx(T,{columns:p,rows:b,getRowId:e=>`${e.rootId}:${e.id}`,loading:x,emptyState:t.jsx(D,{icon:t.jsx(M,{}),title:s("bgjobs.empty.title"),description:s("bgjobs.empty.description")})})]})}function u(s){if(s==null)return"—";try{const a=new Date(s);if(Number.isNaN(a.getTime()))return s;const i=new Date;return a.toDateString()===i.toDateString()?a.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return s}}export{U as default};
2
+ //# sourceMappingURL=bgjobs-CcRiffyJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bgjobs-CcRiffyJ.js","sources":["../../src/hooks/use-bgjobs.ts","../../src/routes/tasks/bgjobs.tsx"],"sourcesContent":["/**\n * useBgjobs — react-query wrapper for /api/bgjobs.\n *\n * Bgjobs are a read-only window into the wrapper-managed bgjob\n * directories (Claude Code's ~/.claude/bgjobs/, opencode's\n * ~/.config/opencode/bgjobs/, codex's ~/.codex/bgjobs/, plus any\n * AGIM_BGJOB_ROOTS custom paths). No SSE channel for bgjob events;\n * the page polls or refresh-on-demand.\n *\n * Response shape varies based on whether `root` is set — when no\n * root filter is applied the backend returns groups keyed by rootId.\n * The hook leaves that shape intact; flattening logic lives in the\n * route's `useMemo` so a future \"show per-root\" view can pivot\n * cheaply.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListBgjobsQuery, ListBgjobsResponse } from '@/types/api'\n\nexport const bgjobsKeys = {\n all: ['bgjobs'] as const,\n list: (q: ListBgjobsQuery) => ['bgjobs', 'list', q] as const,\n}\n\nexport function useBgjobs(query: ListBgjobsQuery) {\n return useQuery<ListBgjobsResponse>({\n queryKey: bgjobsKeys.list(query),\n queryFn: () => api.listBgJobs(query),\n // Bgjobs file scans are cheap (FS reads) but we don't want to\n // hammer when the user idles on the tab. Auto-refetch every 5s\n // while the tab is focused matches the v1 admin's behavior.\n refetchInterval: 5000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useInvalidateBgjobs() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: bgjobsKeys.all })\n}\n","/**\n * /tasks/bgjobs — long-running scripts launched by agent wrappers\n * via their bgjob facility. Read-only; the wrapper is the source of\n * truth for writes (kill / restart).\n *\n * Response shape: when no `?root=` filter, backend returns\n * `{ roots, groups: [{ rootId, jobs }] }`; with a root filter,\n * `{ roots: [oneRoot], jobs }`. We flatten via useMemo so the\n * DataTable consumes one flat list regardless of mode.\n *\n * No SSE: bgjob events aren't on the event-bus. We rely on the 5s\n * react-query poll set in use-bgjobs.ts.\n */\n\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Loader2, RefreshCcw, Terminal } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { Button } from '@/components/ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useBgjobs } from '@/hooks/use-bgjobs'\nimport type { BgjobSummary } from '@/types/api'\n\nexport default function BgjobsRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [params, setParams] = useSearchParams()\n const rootFilter = params.get('root') ?? null\n\n const { data, isLoading, isFetching, refetch } = useBgjobs(\n rootFilter ? { root: rootFilter } : {},\n )\n\n const roots = data?.roots ?? []\n const rows: BgjobSummary[] = useMemo(() => {\n if (!data) return []\n if (data.jobs) return data.jobs\n if (data.groups) return data.groups.flatMap((g) => g.jobs)\n return []\n }, [data])\n\n function setRoot(next: string | null): void {\n const p = new URLSearchParams(params)\n if (!next) p.delete('root')\n else p.set('root', next)\n setParams(p, { replace: true })\n }\n\n const columns: DataTableColumn<BgjobSummary>[] = useMemo(\n () => [\n {\n id: 'name',\n header: t('bgjobs.col.name'),\n cell: (r) => <span className=\"font-medium\">{r.name}</span>,\n asCardTitle: true,\n },\n {\n id: 'status',\n header: t('bgjobs.col.status'),\n cell: (r) => <StatusBadge status={r.status}>{r.status}</StatusBadge>,\n headClassName: 'w-28',\n },\n {\n id: 'root',\n header: t('bgjobs.col.root'),\n cell: (r) => {\n const root = roots.find((rt) => rt.id === r.rootId)\n return (\n <span className=\"text-text-dim\" title={root?.path ?? r.rootId}>\n {root?.label ?? r.rootId}\n </span>\n )\n },\n headClassName: 'w-32',\n },\n {\n id: 'pid',\n header: t('bgjobs.col.pid'),\n cell: (r) => (\n <span className=\"tabular-nums text-text-dim\">{r.pid ?? '—'}</span>\n ),\n headClassName: 'w-20',\n hideOnMobile: true,\n },\n {\n id: 'startedAt',\n header: t('bgjobs.col.startedAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.started_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n {\n id: 'endedAt',\n header: t('bgjobs.col.endedAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.ended_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n {\n id: 'exit',\n header: t('bgjobs.col.exit'),\n cell: (r) => {\n if (r.ended_at == null) return <span className=\"text-text-muted\">{t('bgjobs.stillRunning')}</span>\n if (r.exit_code === 0) return <span className=\"text-success\">{t('bgjobs.exitOk')}</span>\n if (r.exit_code != null) return <span className=\"text-danger tabular-nums\">{r.exit_code}</span>\n return <span className=\"text-text-muted\">—</span>\n },\n headClassName: 'w-20',\n },\n ],\n [t, roots],\n )\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('bgjobs.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('bgjobs.subtitle')}</p>\n </header>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-sm text-text-dim\" htmlFor=\"root-filter\">\n {t('bgjobs.filter.root')}\n </label>\n <Select\n value={rootFilter ?? '__any__'}\n onValueChange={(v) => setRoot(v === '__any__' ? null : v)}\n >\n <SelectTrigger id=\"root-filter\" className=\"w-[180px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__any__\">{t('bgjobs.filter.rootAny')}</SelectItem>\n {roots.map((r) => (\n <SelectItem key={r.id} value={r.id}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => `${r.rootId}:${r.id}`}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<Terminal />}\n title={t('bgjobs.empty.title')}\n description={t('bgjobs.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\nfunction formatTime(iso: string | null): string {\n if (iso == null) return '—'\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n const now = new Date()\n const sameDay = d.toDateString() === now.toDateString()\n if (sameDay) {\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n }\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["bgjobsKeys","q","useBgjobs","query","useQuery","api","BgjobsRoute","t","useTranslation","params","setParams","useSearchParams","rootFilter","data","isLoading","isFetching","refetch","roots","rows","useMemo","g","setRoot","next","p","columns","r","jsx","StatusBadge","root","rt","formatTime","jsxs","Button","Loader2","RefreshCcw","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","DataTable","EmptyState","Terminal","iso","d","now"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import{h as a}from"./index-DCfdN5R7.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 e=a("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);export{e as B};
7
+ //# sourceMappingURL=book-open-CSCq5cjL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"book-open-CSCq5cjL.js","sources":["../../node_modules/lucide-react/dist/esm/icons/book-open.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 BookOpen = createLucideIcon(\"BookOpen\", [\n [\"path\", { d: \"M12 7v14\", key: \"1akyts\" }],\n [\n \"path\",\n {\n d: \"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\n key: \"ruj8y\"\n }\n ]\n]);\n\nexport { BookOpen as default };\n//# sourceMappingURL=book-open.js.map\n"],"names":["BookOpen","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CACE,OACA,CACE,EAAG,qIACH,IAAK,OACX,CACA,CACA,CAAC","x_google_ignoreList":[0]}
@@ -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 t=a("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);export{t as B};
7
- //# sourceMappingURL=brain-CCF25Egu.js.map
7
+ //# sourceMappingURL=brain-Dl4DF5kX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-CCF25Egu.js","sources":["../../node_modules/lucide-react/dist/esm/icons/brain.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 Brain = createLucideIcon(\"Brain\", [\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\",\n key: \"l5xja\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\",\n key: \"ep3f8r\"\n }\n ],\n [\"path\", { d: \"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\", key: \"1p4c4q\" }],\n [\"path\", { d: \"M17.599 6.5a3 3 0 0 0 .399-1.375\", key: \"tmeiqw\" }],\n [\"path\", { d: \"M6.003 5.125A3 3 0 0 0 6.401 6.5\", key: \"105sqy\" }],\n [\"path\", { d: \"M3.477 10.896a4 4 0 0 1 .585-.396\", key: \"ql3yin\" }],\n [\"path\", { d: \"M19.938 10.5a4 4 0 0 1 .585.396\", key: \"1qfode\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-1.967-.516\", key: \"2e4loj\" }],\n [\"path\", { d: \"M19.967 17.484A4 4 0 0 1 18 18\", key: \"159ez6\" }]\n]);\n\nexport { Brain as default };\n//# sourceMappingURL=brain.js.map\n"],"names":["Brain","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAQC,EAAiB,QAAS,CACtC,CACE,OACA,CACE,EAAG,uFACH,IAAK,OACX,CACA,EACE,CACE,OACA,CACE,EAAG,uFACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,QAAQ,CAAE,EAC3E,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,oCAAqC,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAQ,CAAE,EAC3D,CAAC,OAAQ,CAAE,EAAG,iCAAkC,IAAK,QAAQ,CAAE,CACjE,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"brain-Dl4DF5kX.js","sources":["../../node_modules/lucide-react/dist/esm/icons/brain.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 Brain = createLucideIcon(\"Brain\", [\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\",\n key: \"l5xja\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\",\n key: \"ep3f8r\"\n }\n ],\n [\"path\", { d: \"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\", key: \"1p4c4q\" }],\n [\"path\", { d: \"M17.599 6.5a3 3 0 0 0 .399-1.375\", key: \"tmeiqw\" }],\n [\"path\", { d: \"M6.003 5.125A3 3 0 0 0 6.401 6.5\", key: \"105sqy\" }],\n [\"path\", { d: \"M3.477 10.896a4 4 0 0 1 .585-.396\", key: \"ql3yin\" }],\n [\"path\", { d: \"M19.938 10.5a4 4 0 0 1 .585.396\", key: \"1qfode\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-1.967-.516\", key: \"2e4loj\" }],\n [\"path\", { d: \"M19.967 17.484A4 4 0 0 1 18 18\", key: \"159ez6\" }]\n]);\n\nexport { Brain as default };\n//# sourceMappingURL=brain.js.map\n"],"names":["Brain","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAQC,EAAiB,QAAS,CACtC,CACE,OACA,CACE,EAAG,uFACH,IAAK,OACX,CACA,EACE,CACE,OACA,CACE,EAAG,uFACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,QAAQ,CAAE,EAC3E,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,oCAAqC,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAQ,CAAE,EAC3D,CAAC,OAAQ,CAAE,EAAG,iCAAkC,IAAK,QAAQ,CAAE,CACjE,CAAC","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
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.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const a=e("Briefcase",[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]]);export{a as B};
7
- //# sourceMappingURL=briefcase-BMLMD8nM.js.map
7
+ //# sourceMappingURL=briefcase-CeKUkFSq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"briefcase-BMLMD8nM.js","sources":["../../node_modules/lucide-react/dist/esm/icons/briefcase.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 Briefcase = createLucideIcon(\"Briefcase\", [\n [\"path\", { d: \"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\", key: \"jecpp\" }],\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"6\", rx: \"2\", key: \"i6l2r4\" }]\n]);\n\nexport { Briefcase as default };\n//# sourceMappingURL=briefcase.js.map\n"],"names":["Briefcase","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAYC,EAAiB,YAAa,CAC9C,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,OAAO,CAAE,EAC1E,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,CAChF,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"briefcase-CeKUkFSq.js","sources":["../../node_modules/lucide-react/dist/esm/icons/briefcase.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 Briefcase = createLucideIcon(\"Briefcase\", [\n [\"path\", { d: \"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\", key: \"jecpp\" }],\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"6\", rx: \"2\", key: \"i6l2r4\" }]\n]);\n\nexport { Briefcase as default };\n//# sourceMappingURL=briefcase.js.map\n"],"names":["Briefcase","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAYC,EAAiB,YAAa,CAC9C,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,OAAO,CAAE,EAC1E,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,CAChF,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,12 @@
1
+ import{h as I,u as G,as as J,at as Q,p as j,j as e,au as W,e as f,f as g,b as N,av as X,aw as Z,ah as ee,d as R,ax as te}from"./index-DCfdN5R7.js";import{r as n}from"./react-DlP5eolq.js";import{C as se}from"./chevron-left-01fAFVpo.js";import{A as ae}from"./arrow-down-7i0xwCI2.js";import{L as A}from"./loader-circle-DDdmcH0k.js";import{S as ne}from"./sparkles-G0QIs9nP.js";import{A as re}from"./activity-ul8Os7Pz.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 oe=I("Clock3",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16.5 12",key:"1aq6pp"}]]);/**
7
+ * @license lucide-react v0.469.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const le=I("EllipsisVertical",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"12",cy:"5",r:"1",key:"gxeob9"}],["circle",{cx:"12",cy:"19",r:"1",key:"lyex9k"}]]),ce={open:"bg-success",connecting:"bg-warning animate-pulse",closed:"bg-text-muted",error:"bg-danger"};function w(s){return Number.isFinite(s)?s:Date.now()}function ie(s){const o=new Date(w(s)),a=String(o.getMonth()+1).padStart(2,"0"),d=String(o.getDate()).padStart(2,"0");return`${o.getFullYear()}-${a}-${d}`}function ue(s,o){return new Intl.DateTimeFormat(o,{month:"short",day:"numeric",weekday:"short"}).format(new Date(w(s)))}function D(s,o){return new Intl.DateTimeFormat(o,{hour:"2-digit",minute:"2-digit"}).format(new Date(w(s)))}function T(s){return!s||s<=0?"0ms":s<1e3?`${s}ms`:`${(s/1e3).toFixed(s>=1e4?0:1)}s`}function de(s,o){const a=[];let d="";for(const i of s){const m=ie(i.timestamp);m!==d&&(a.push({type:"divider",key:`d-${m}`,label:ue(i.timestamp,o)}),d=m),a.push({type:"message",key:i.id,msg:i})}return a}function me(s){switch(s){case"running":return"bg-info-bg text-info";case"success":return"bg-success-bg text-success";case"error":return"bg-danger-bg text-danger"}}function ye(){const{t:s,i18n:o}=G(["chat","common"]),{state:a,send:d,switchAgent:i,approvalClick:m,newConversation:M,clearError:k}=J(),[p,b]=n.useState(""),[v,l]=n.useState("none"),[E,F]=n.useState(!1),[L,S]=n.useState(!1),[B,q]=n.useState(""),h=n.useRef(null),x=n.useRef(null),$=s(`chat.status.${a.status}`,{defaultValue:a.status}),H=n.useMemo(()=>[s("chat.quickPrompt.plan"),s("chat.quickPrompt.risks"),s("chat.quickPrompt.summary")],[s]),u=n.useMemo(()=>a.messages.filter(t=>!t.approval),[a.messages]),P=n.useMemo(()=>de(u,o.language),[u,o.language]),z=n.useMemo(()=>{const t=u.find(c=>c.role==="user"&&c.content.trim());if(!t)return s("chat.mobileTitle",{defaultValue:"agim chat"});const r=t.content.replace(/\s+/g," ").trim();return r.length>24?`${r.slice(0,24)}…`:r},[u,s]),C=n.useMemo(()=>a.runActivities.slice(0,12),[a.runActivities]),y=n.useMemo(()=>a.runActivities.find(t=>t.runId===a.activeRunId),[a.activeRunId,a.runActivities]);n.useEffect(()=>{const t=h.current;!t||t.scrollHeight-t.scrollTop-t.clientHeight>200&&a.currentReplyId==null||requestAnimationFrame(()=>{t.scrollTop=t.scrollHeight})},[a.messages,a.currentReplyId]),n.useEffect(()=>{const t=h.current;if(!t)return;const r=()=>{const c=t.scrollHeight-t.scrollTop-t.clientHeight;F(c>200)};return t.addEventListener("scroll",r,{passive:!0}),r(),()=>t.removeEventListener("scroll",r)},[]),n.useEffect(()=>{a.error&&(Q(a.error)?(q(a.error),S(!0)):j.error(a.error),k())},[a.error,k]),n.useEffect(()=>{const t=x.current;t&&(t.style.height="auto",t.style.height=`${Math.min(t.scrollHeight,24*6+16)}px`)},[p]);function O(t){t?.preventDefault();const r=p.trim();if(r){if(a.status!=="open"){j.error(s("chat.notConnected",{defaultValue:"Not connected. Reconnecting…"}));return}a.currentReplyId||(d(r),b(""),requestAnimationFrame(()=>x.current?.focus()))}}function U(t){t.nativeEvent.isComposing||t.keyCode}function K(){const t=h.current;t&&t.scrollTo({top:t.scrollHeight,behavior:"smooth"})}function Y(){fetch("/api/auth/logout",{method:"POST"}).finally(()=>{try{localStorage.removeItem("agim_token")}catch{}window.location.replace("/login")})}function V(){M(),j.success(s("chat.newConvToast",{defaultValue:"Started a new conversation"})),l("none"),requestAnimationFrame(()=>x.current?.focus())}return e.jsxs("div",{className:"relative flex h-dvh flex-col bg-bg",children:[e.jsx(W,{open:L,reason:B,onOpenChange:S,onConfigured:()=>i("agim")}),e.jsxs("header",{className:"flex items-center gap-2 border-b border-border bg-surface px-3 py-2",style:{paddingTop:"calc(env(safe-area-inset-top) + 0.5rem)"},children:[e.jsx(f,{variant:"ghost",size:"sm","aria-label":s("chat.back",{defaultValue:"Back"}),onClick:()=>window.history.length>1?window.history.back():window.location.assign("/"),className:"h-9 w-9 p-0",children:e.jsx(se,{className:"h-5 w-5"})}),e.jsxs("div",{className:"flex min-w-0 flex-1 flex-col items-center",children:[e.jsx("span",{className:"truncate text-sm font-semibold",children:z}),e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] text-text-dim",children:[e.jsx("span",{className:g("inline-block h-1.5 w-1.5 rounded-full",ce[a.status])}),e.jsx("span",{children:a.agent?N(a.agent):"—"}),e.jsx("span",{children:"·"}),e.jsx("span",{children:a.activeRunId?s("chat.running",{defaultValue:"Running"}):$})]})]}),e.jsx(f,{variant:"ghost",size:"sm","aria-label":s("chat.menu",{defaultValue:"Menu"}),onClick:()=>l("menu"),className:"h-9 w-9 p-0",children:e.jsx(le,{className:"h-5 w-5"})})]}),e.jsx("div",{ref:h,className:"flex-1 overflow-y-auto",children:e.jsxs("div",{className:"mx-auto flex w-full max-w-3xl flex-col gap-3 px-3 py-4",children:[u.length===0&&a.status==="open"&&e.jsxs("div",{className:"flex flex-col items-center gap-2 py-14 text-center",children:[e.jsx("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-surface-2 text-2xl",children:"💬"}),e.jsx("h2",{className:"text-base font-semibold",children:s("chat.welcomeTitle",{defaultValue:"Start a conversation"})}),e.jsx("p",{className:"max-w-xs text-sm text-text-dim",children:s("chat.welcomeBodyMobile",{defaultValue:"Type a message below. Switch agent or start over from the menu."})})]}),u.length===0&&a.status!=="open"&&e.jsx("div",{className:"grid place-items-center py-16 text-center",children:e.jsx("p",{className:"text-sm text-text-dim",children:a.status==="connecting"?s("chat.connecting",{defaultValue:"Connecting to agim…"}):s("chat.disconnected",{defaultValue:"Disconnected. Reconnecting automatically."})})}),P.map(t=>t.type==="divider"?e.jsx("div",{className:"py-1 text-center text-[11px] text-text-muted",children:t.label},t.key):e.jsxs("div",{className:"space-y-1",children:[e.jsx(X,{msg:t.msg,onApprove:(r,c,_)=>m(r,c,_)}),e.jsx("div",{className:g("px-1 text-[11px] text-text-muted",t.msg.role==="user"?"text-right":"text-left"),children:D(t.msg.timestamp,o.language)})]},t.key))]})}),E&&e.jsx("button",{type:"button",onClick:K,className:"absolute bottom-28 left-1/2 z-20 -translate-x-1/2 rounded-full border border-border bg-surface p-2 shadow-md","aria-label":s("chat.scrollDown",{defaultValue:"Scroll to bottom"}),children:e.jsx(ae,{className:"h-4 w-4"})}),e.jsx(Z,{approvals:a.pendingApprovals,onApprove:(t,r,c)=>m(t,r,c)}),e.jsxs("form",{onSubmit:O,className:"sticky bottom-0 border-t border-border bg-surface px-3 py-2",style:{paddingBottom:"calc(env(safe-area-inset-bottom) + 0.5rem)"},children:[u.length===0&&a.status==="open"&&e.jsx("div",{className:"mb-2 flex gap-2 overflow-x-auto pb-1",children:H.map(t=>e.jsx("button",{type:"button",onClick:()=>{b(t),requestAnimationFrame(()=>x.current?.focus())},className:"shrink-0 rounded-full border border-border bg-surface-2 px-3 py-1.5 text-xs text-text-dim hover:bg-surface-hover",children:t},t))}),y&&e.jsxs("div",{className:"mb-2 flex items-center justify-between rounded-xl border border-info/30 bg-info-bg/50 px-3 py-1.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs text-info",children:[e.jsx(A,{className:"h-3.5 w-3.5 animate-spin"}),s("chat.running",{defaultValue:"Running"})]}),e.jsxs("span",{className:"truncate text-xs text-text-dim",children:[N(y.agent)," · ",T(y.durationMs)]})]}),e.jsxs("div",{className:"flex items-end gap-2",children:[e.jsx(f,{type:"button",variant:"ghost",onClick:V,disabled:a.status!=="open"||!!a.currentReplyId,"aria-label":s("chat.newConv",{defaultValue:"New conversation"}),className:"h-11 w-11 shrink-0 rounded-full p-0",children:e.jsx(ne,{className:"h-4 w-4"})}),e.jsx("textarea",{ref:x,value:p,onChange:t=>b(t.target.value),onKeyDown:U,placeholder:s("chat.inputPlaceholderMobile",{defaultValue:"Message…"}),rows:1,className:g("flex-1 resize-none rounded-3xl border border-border bg-bg","px-3 py-2 text-[15px] leading-6","focus:outline-none focus:ring-2 focus:ring-accent focus:ring-offset-1 focus:ring-offset-bg")}),e.jsx(f,{type:"submit",disabled:!p.trim()||a.status!=="open"||!!a.currentReplyId,"aria-label":s("chat.send",{defaultValue:"Send"}),className:"h-11 w-11 shrink-0 rounded-full p-0",children:a.currentReplyId?e.jsx(A,{className:"h-4 w-4 animate-spin"}):e.jsx(ee,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"mt-2 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[a.currentReplyId&&e.jsx(R,{variant:"info",children:s("chat.streaming",{defaultValue:"… streaming"})}),!a.currentReplyId&&e.jsx("span",{className:"text-[11px] text-text-muted",children:s("chat.mobileHint")})]}),e.jsxs("button",{type:"button",onClick:()=>l("activity"),className:"inline-flex items-center gap-1 rounded px-1.5 py-1 text-xs text-text-dim hover:bg-surface-hover hover:text-text",children:[e.jsx(re,{className:"h-3.5 w-3.5"}),s("chat.activity",{defaultValue:"Activity"})]})]})]}),v!=="none"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button","aria-label":s("actions.close",{ns:"common",defaultValue:"Close"}),className:"fixed inset-0 z-30 bg-black/35",onClick:()=>l("none")}),e.jsxs("div",{className:"fixed inset-x-0 bottom-0 z-40 rounded-t-2xl border border-border bg-surface px-4 pb-safe pt-3 shadow-lg",children:[e.jsx("div",{className:"mx-auto mb-3 h-1.5 w-12 rounded-full bg-border"}),v==="menu"&&e.jsxs("div",{className:"space-y-3 pb-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"mb-1 text-[11px] uppercase text-text-dim",children:s("chat.agent",{defaultValue:"Agent"})}),e.jsx(te,{agents:a.agents,value:a.agent,onChange:t=>{i(t),l("none")}})]}),e.jsx("button",{type:"button",className:"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover disabled:opacity-50",disabled:a.status!=="open"||!!a.currentReplyId,onClick:V,children:s("chat.newConv",{defaultValue:"New conversation"})}),e.jsx("button",{type:"button",className:"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover",onClick:()=>l("activity"),children:s("chat.activity",{defaultValue:"Activity"})}),e.jsx("button",{type:"button",className:"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover",onClick:()=>{l("none"),window.location.assign("/settings/llm")},children:s("chat.llmSettings",{defaultValue:"LLM settings"})}),e.jsx("button",{type:"button",className:"block w-full rounded-md border border-danger/30 px-3 py-2 text-left text-sm text-danger hover:bg-danger/10",onClick:Y,children:s("chat.logout",{defaultValue:"Log out"})})]}),v==="activity"&&e.jsxs("div",{className:"space-y-3 pb-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:"text-sm font-semibold",children:s("chat.activityTitle",{defaultValue:"Run activity"})}),e.jsx("button",{type:"button",className:"text-xs text-text-dim hover:text-text",onClick:()=>l("menu"),children:s("actions.back",{ns:"common",defaultValue:"Back"})})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface-2 px-3 py-2 text-xs text-text-dim",children:[s("chat.pendingApprovals",{defaultValue:"Pending approvals"}),": ",a.pendingApprovals.length]}),e.jsxs("div",{className:"max-h-72 space-y-2 overflow-y-auto pr-1",children:[C.length===0&&e.jsx("div",{className:"rounded-md border border-border px-3 py-5 text-center text-xs text-text-dim",children:s("chat.activityEmpty",{defaultValue:"No recent runs yet."})}),C.map(t=>e.jsxs("div",{className:"rounded-md border border-border px-3 py-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(R,{className:g("border-0",me(t.status)),children:t.status}),e.jsx("span",{className:"truncate text-xs font-medium",children:N(t.agent)}),e.jsx("span",{className:"ml-auto text-[11px] text-text-muted",children:T(t.durationMs)})]}),e.jsxs("div",{className:"mt-1 flex items-center gap-1 text-[11px] text-text-muted",children:[e.jsx(oe,{className:"h-3 w-3"}),D(t.startedAt,o.language),t.outputChars!=null&&e.jsxs("span",{children:["· ",t.outputChars," chars"]})]}),t.error&&e.jsx("p",{className:"mt-1 text-[11px] text-danger",children:t.error})]},t.runId))]})]})]})]})]})}export{ye as default};
12
+ //# sourceMappingURL=chat-rLJMdJBk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-rLJMdJBk.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clock-3.js","../../node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js","../../src/routes/m/chat.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 Clock3 = createLucideIcon(\"Clock3\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16.5 12\", key: \"1aq6pp\" }]\n]);\n\nexport { Clock3 as default };\n//# sourceMappingURL=clock-3.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 EllipsisVertical = createLucideIcon(\"EllipsisVertical\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"12\", cy: \"5\", r: \"1\", key: \"gxeob9\" }],\n [\"circle\", { cx: \"12\", cy: \"19\", r: \"1\", key: \"lyex9k\" }]\n]);\n\nexport { EllipsisVertical as default };\n//# sourceMappingURL=ellipsis-vertical.js.map\n","/**\n * /m/chat — mobile-first chat surface (production-oriented UX pass).\n *\n * Upgrades over v1:\n * - richer hierarchy (thread title + status + execution rail)\n * - date separators + per-message timestamps\n * - quick prompts + larger mobile composer controls\n * - bottom-sheet menu and activity panel for recent runs\n *\n * Keeps compatibility with the existing useChat() transport:\n * same message flow / approvals / reconnect behavior.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport {\n Activity,\n ArrowDown,\n ChevronLeft,\n Clock3,\n Loader2,\n MoreVertical,\n Sparkles,\n Send,\n} from 'lucide-react'\nimport { toast } from 'sonner'\n\nimport { useChat, type ChatMessage, type RunActivity } from '@/hooks/use-chat'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\nimport { MessageBubble } from '@/components/chat/message-bubble'\nimport { ApprovalDock } from '@/components/chat/approval-dock'\nimport { AgentPicker } from '@/components/chat/agent-picker'\nimport { isNativeSetupError } from '@/components/chat/error-hints'\nimport { NativeSetupDialog } from '@/components/chat/native-setup-dialog'\nimport { agentDisplayName } from '@/lib/agent-label'\nimport { cn } from '@/lib/utils'\n\nconst STATUS_STYLES: Record<string, string> = {\n open: 'bg-success',\n connecting: 'bg-warning animate-pulse',\n closed: 'bg-text-muted',\n error: 'bg-danger',\n}\n\ntype SheetMode = 'none' | 'menu' | 'activity'\ntype MessageRow =\n | { type: 'divider'; key: string; label: string }\n | { type: 'message'; key: string; msg: ChatMessage }\n\nfunction safeTs(ts: number): number {\n return Number.isFinite(ts) ? ts : Date.now()\n}\n\nfunction dayKey(ts: number): string {\n const d = new Date(safeTs(ts))\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${d.getFullYear()}-${m}-${day}`\n}\n\nfunction formatDay(ts: number, locale: string): string {\n return new Intl.DateTimeFormat(locale, {\n month: 'short',\n day: 'numeric',\n weekday: 'short',\n }).format(new Date(safeTs(ts)))\n}\n\nfunction formatClock(ts: number, locale: string): string {\n return new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(safeTs(ts)))\n}\n\nfunction formatDurationMs(ms?: number): string {\n if (!ms || ms <= 0) return '0ms'\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(ms >= 10_000 ? 0 : 1)}s`\n}\n\nfunction buildRows(messages: ChatMessage[], locale: string): MessageRow[] {\n const rows: MessageRow[] = []\n let prevDay = ''\n for (const msg of messages) {\n const k = dayKey(msg.timestamp)\n if (k !== prevDay) {\n rows.push({ type: 'divider', key: `d-${k}`, label: formatDay(msg.timestamp, locale) })\n prevDay = k\n }\n rows.push({ type: 'message', key: msg.id, msg })\n }\n return rows\n}\n\nfunction runStatusBadgeClass(status: RunActivity['status']): string {\n switch (status) {\n case 'running': return 'bg-info-bg text-info'\n case 'success': return 'bg-success-bg text-success'\n case 'error': return 'bg-danger-bg text-danger'\n }\n}\n\nexport default function MobileChatRoute(): JSX.Element {\n const { t, i18n } = useTranslation(['chat', 'common'])\n const {\n state, send, switchAgent, approvalClick, newConversation, clearError,\n } = useChat()\n const [input, setInput] = useState('')\n const [sheet, setSheet] = useState<SheetMode>('none')\n const [showScrollDown, setShowScrollDown] = useState(false)\n const [nativeSetupDialogOpen, setNativeSetupDialogOpen] = useState(false)\n const [nativeSetupReason, setNativeSetupReason] = useState('')\n const listRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n const statusLabel = t(`chat.status.${state.status}`, { defaultValue: state.status })\n\n const quickPrompts = useMemo(\n () => [\n t('chat.quickPrompt.plan'),\n t('chat.quickPrompt.risks'),\n t('chat.quickPrompt.summary'),\n ],\n [t],\n )\n\n const chatMessages = useMemo(\n () => state.messages.filter((m) => !m.approval),\n [state.messages],\n )\n const rows = useMemo(\n () => buildRows(chatMessages, i18n.language),\n [chatMessages, i18n.language],\n )\n\n const latestUserTitle = useMemo(() => {\n const firstUser = chatMessages.find((m) => m.role === 'user' && m.content.trim())\n if (!firstUser) return t('chat.mobileTitle', { defaultValue: 'agim chat' })\n const compact = firstUser.content.replace(/\\s+/g, ' ').trim()\n return compact.length > 24 ? `${compact.slice(0, 24)}…` : compact\n }, [chatMessages, t])\n\n const latestRuns = useMemo(() => state.runActivities.slice(0, 12), [state.runActivities])\n const activeRun = useMemo(\n () => state.runActivities.find((r) => r.runId === state.activeRunId),\n [state.activeRunId, state.runActivities],\n )\n\n // Auto-scroll to bottom on new messages OR streaming chunk. Same\n // pinch-tolerance as desktop: hold position when user is reading up.\n useEffect(() => {\n const el = listRef.current\n if (!el) return\n const distFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight\n if (distFromBottom > 200 && state.currentReplyId == null) return\n requestAnimationFrame(() => { el.scrollTop = el.scrollHeight })\n }, [state.messages, state.currentReplyId])\n\n // Floating \"scroll to bottom\" pill.\n useEffect(() => {\n const el = listRef.current\n if (!el) return\n const onScroll = (): void => {\n const dist = el.scrollHeight - el.scrollTop - el.clientHeight\n setShowScrollDown(dist > 200)\n }\n el.addEventListener('scroll', onScroll, { passive: true })\n onScroll()\n return () => el.removeEventListener('scroll', onScroll)\n }, [])\n\n // Surface WS errors as toast and clear.\n useEffect(() => {\n if (!state.error) return\n if (isNativeSetupError(state.error)) {\n setNativeSetupReason(state.error)\n setNativeSetupDialogOpen(true)\n } else {\n toast.error(state.error)\n }\n clearError()\n }, [state.error, clearError])\n\n // Auto-grow textarea up to 6 lines.\n useEffect(() => {\n const ta = inputRef.current\n if (!ta) return\n ta.style.height = 'auto'\n ta.style.height = `${Math.min(ta.scrollHeight, 24 * 6 + 16)}px`\n }, [input])\n\n function onSubmit(e?: React.FormEvent): void {\n e?.preventDefault()\n const v = input.trim()\n if (!v) return\n if (state.status !== 'open') {\n toast.error(t('chat.notConnected', { defaultValue: 'Not connected. Reconnecting…' }))\n return\n }\n if (state.currentReplyId) return\n send(v)\n setInput('')\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n\n function onKeyDown(e: React.KeyboardEvent<HTMLTextAreaElement>): void {\n // IME-safe: never submit while composition is active.\n const ne = e.nativeEvent as KeyboardEvent & { isComposing?: boolean }\n if (ne.isComposing || e.keyCode === 229) return\n // Mobile keeps Enter for newline; explicit Send button submits.\n }\n\n function onScrollToBottom(): void {\n const el = listRef.current\n if (!el) return\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' })\n }\n\n function onLogout(): void {\n void fetch('/api/auth/logout', { method: 'POST' }).finally(() => {\n try { localStorage.removeItem('agim_token') } catch { /* noop */ }\n window.location.replace('/login')\n })\n }\n\n function onStartNewConversation(): void {\n newConversation()\n toast.success(t('chat.newConvToast', { defaultValue: 'Started a new conversation' }))\n setSheet('none')\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n\n return (\n <div className=\"relative flex h-dvh flex-col bg-bg\">\n <NativeSetupDialog\n open={nativeSetupDialogOpen}\n reason={nativeSetupReason}\n onOpenChange={setNativeSetupDialogOpen}\n onConfigured={() => switchAgent('agim')}\n />\n\n <header\n className=\"flex items-center gap-2 border-b border-border bg-surface px-3 py-2\"\n style={{ paddingTop: 'calc(env(safe-area-inset-top) + 0.5rem)' }}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('chat.back', { defaultValue: 'Back' })}\n onClick={() => (window.history.length > 1 ? window.history.back() : window.location.assign('/'))}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </Button>\n <div className=\"flex min-w-0 flex-1 flex-col items-center\">\n <span className=\"truncate text-sm font-semibold\">{latestUserTitle}</span>\n <span className=\"flex items-center gap-1.5 text-[11px] text-text-dim\">\n <span className={cn('inline-block h-1.5 w-1.5 rounded-full', STATUS_STYLES[state.status])} />\n <span>{state.agent ? agentDisplayName(state.agent) : '—'}</span>\n <span>·</span>\n <span>{state.activeRunId ? t('chat.running', { defaultValue: 'Running' }) : statusLabel}</span>\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('chat.menu', { defaultValue: 'Menu' })}\n onClick={() => setSheet('menu')}\n className=\"h-9 w-9 p-0\"\n >\n <MoreVertical className=\"h-5 w-5\" />\n </Button>\n </header>\n\n <div ref={listRef} className=\"flex-1 overflow-y-auto\">\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-3 px-3 py-4\">\n {chatMessages.length === 0 && state.status === 'open' && (\n <div className=\"flex flex-col items-center gap-2 py-14 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-surface-2 text-2xl\">\n 💬\n </div>\n <h2 className=\"text-base font-semibold\">\n {t('chat.welcomeTitle', { defaultValue: 'Start a conversation' })}\n </h2>\n <p className=\"max-w-xs text-sm text-text-dim\">\n {t('chat.welcomeBodyMobile', {\n defaultValue: 'Type a message below. Switch agent or start over from the menu.',\n })}\n </p>\n </div>\n )}\n {chatMessages.length === 0 && state.status !== 'open' && (\n <div className=\"grid place-items-center py-16 text-center\">\n <p className=\"text-sm text-text-dim\">\n {state.status === 'connecting'\n ? t('chat.connecting', { defaultValue: 'Connecting to agim…' })\n : t('chat.disconnected', {\n defaultValue: 'Disconnected. Reconnecting automatically.',\n })}\n </p>\n </div>\n )}\n {rows.map((row) => row.type === 'divider' ? (\n <div key={row.key} className=\"py-1 text-center text-[11px] text-text-muted\">\n {row.label}\n </div>\n ) : (\n <div key={row.key} className=\"space-y-1\">\n <MessageBubble\n msg={row.msg}\n onApprove={(mid, reqId, choice) => approvalClick(mid, reqId, choice)}\n />\n <div className={cn(\n 'px-1 text-[11px] text-text-muted',\n row.msg.role === 'user' ? 'text-right' : 'text-left',\n )}\n >\n {formatClock(row.msg.timestamp, i18n.language)}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {showScrollDown && (\n <button\n type=\"button\"\n onClick={onScrollToBottom}\n className=\"absolute bottom-28 left-1/2 z-20 -translate-x-1/2 rounded-full border border-border bg-surface p-2 shadow-md\"\n aria-label={t('chat.scrollDown', { defaultValue: 'Scroll to bottom' })}\n >\n <ArrowDown className=\"h-4 w-4\" />\n </button>\n )}\n\n <ApprovalDock\n approvals={state.pendingApprovals}\n onApprove={(mid, reqId, choice) => approvalClick(mid, reqId, choice)}\n />\n\n <form\n onSubmit={onSubmit}\n className=\"sticky bottom-0 border-t border-border bg-surface px-3 py-2\"\n style={{ paddingBottom: 'calc(env(safe-area-inset-bottom) + 0.5rem)' }}\n >\n {chatMessages.length === 0 && state.status === 'open' && (\n <div className=\"mb-2 flex gap-2 overflow-x-auto pb-1\">\n {quickPrompts.map((prompt) => (\n <button\n key={prompt}\n type=\"button\"\n onClick={() => {\n setInput(prompt)\n requestAnimationFrame(() => inputRef.current?.focus())\n }}\n className=\"shrink-0 rounded-full border border-border bg-surface-2 px-3 py-1.5 text-xs text-text-dim hover:bg-surface-hover\"\n >\n {prompt}\n </button>\n ))}\n </div>\n )}\n\n {activeRun && (\n <div className=\"mb-2 flex items-center justify-between rounded-xl border border-info/30 bg-info-bg/50 px-3 py-1.5\">\n <span className=\"inline-flex items-center gap-1 text-xs text-info\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n {t('chat.running', { defaultValue: 'Running' })}\n </span>\n <span className=\"truncate text-xs text-text-dim\">\n {agentDisplayName(activeRun.agent)} · {formatDurationMs(activeRun.durationMs)}\n </span>\n </div>\n )}\n\n <div className=\"flex items-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onStartNewConversation}\n disabled={state.status !== 'open' || !!state.currentReplyId}\n aria-label={t('chat.newConv', { defaultValue: 'New conversation' })}\n className=\"h-11 w-11 shrink-0 rounded-full p-0\"\n >\n <Sparkles className=\"h-4 w-4\" />\n </Button>\n <textarea\n ref={inputRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={t('chat.inputPlaceholderMobile', { defaultValue: 'Message…' })}\n rows={1}\n className={cn(\n 'flex-1 resize-none rounded-3xl border border-border bg-bg',\n 'px-3 py-2 text-[15px] leading-6',\n 'focus:outline-none focus:ring-2 focus:ring-accent focus:ring-offset-1 focus:ring-offset-bg',\n )}\n />\n <Button\n type=\"submit\"\n disabled={!input.trim() || state.status !== 'open' || !!state.currentReplyId}\n aria-label={t('chat.send', { defaultValue: 'Send' })}\n className=\"h-11 w-11 shrink-0 rounded-full p-0\"\n >\n {state.currentReplyId ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n\n <div className=\"mt-2 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {state.currentReplyId && (\n <Badge variant=\"info\">\n {t('chat.streaming', { defaultValue: '… streaming' })}\n </Badge>\n )}\n {!state.currentReplyId && (\n <span className=\"text-[11px] text-text-muted\">\n {t('chat.mobileHint')}\n </span>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => setSheet('activity')}\n className=\"inline-flex items-center gap-1 rounded px-1.5 py-1 text-xs text-text-dim hover:bg-surface-hover hover:text-text\"\n >\n <Activity className=\"h-3.5 w-3.5\" />\n {t('chat.activity', { defaultValue: 'Activity' })}\n </button>\n </div>\n </form>\n\n {sheet !== 'none' && (\n <>\n <button\n type=\"button\"\n aria-label={t('actions.close', { ns: 'common', defaultValue: 'Close' })}\n className=\"fixed inset-0 z-30 bg-black/35\"\n onClick={() => setSheet('none')}\n />\n <div className=\"fixed inset-x-0 bottom-0 z-40 rounded-t-2xl border border-border bg-surface px-4 pb-safe pt-3 shadow-lg\">\n <div className=\"mx-auto mb-3 h-1.5 w-12 rounded-full bg-border\" />\n\n {sheet === 'menu' && (\n <div className=\"space-y-3 pb-3\">\n <div>\n <div className=\"mb-1 text-[11px] uppercase text-text-dim\">\n {t('chat.agent', { defaultValue: 'Agent' })}\n </div>\n <AgentPicker\n agents={state.agents}\n value={state.agent}\n onChange={(a) => {\n switchAgent(a)\n setSheet('none')\n }}\n />\n </div>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover disabled:opacity-50\"\n disabled={state.status !== 'open' || !!state.currentReplyId}\n onClick={onStartNewConversation}\n >\n {t('chat.newConv', { defaultValue: 'New conversation' })}\n </button>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover\"\n onClick={() => setSheet('activity')}\n >\n {t('chat.activity', { defaultValue: 'Activity' })}\n </button>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover\"\n onClick={() => {\n setSheet('none')\n window.location.assign('/settings/llm')\n }}\n >\n {t('chat.llmSettings', { defaultValue: 'LLM settings' })}\n </button>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-danger/30 px-3 py-2 text-left text-sm text-danger hover:bg-danger/10\"\n onClick={onLogout}\n >\n {t('chat.logout', { defaultValue: 'Log out' })}\n </button>\n </div>\n )}\n\n {sheet === 'activity' && (\n <div className=\"space-y-3 pb-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold\">\n {t('chat.activityTitle', { defaultValue: 'Run activity' })}\n </div>\n <button\n type=\"button\"\n className=\"text-xs text-text-dim hover:text-text\"\n onClick={() => setSheet('menu')}\n >\n {t('actions.back', { ns: 'common', defaultValue: 'Back' })}\n </button>\n </div>\n\n <div className=\"rounded-md border border-border bg-surface-2 px-3 py-2 text-xs text-text-dim\">\n {t('chat.pendingApprovals', { defaultValue: 'Pending approvals' })}: {state.pendingApprovals.length}\n </div>\n\n <div className=\"max-h-72 space-y-2 overflow-y-auto pr-1\">\n {latestRuns.length === 0 && (\n <div className=\"rounded-md border border-border px-3 py-5 text-center text-xs text-text-dim\">\n {t('chat.activityEmpty', { defaultValue: 'No recent runs yet.' })}\n </div>\n )}\n {latestRuns.map((run) => (\n <div key={run.runId} className=\"rounded-md border border-border px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <Badge className={cn('border-0', runStatusBadgeClass(run.status))}>\n {run.status}\n </Badge>\n <span className=\"truncate text-xs font-medium\">{agentDisplayName(run.agent)}</span>\n <span className=\"ml-auto text-[11px] text-text-muted\">\n {formatDurationMs(run.durationMs)}\n </span>\n </div>\n <div className=\"mt-1 flex items-center gap-1 text-[11px] text-text-muted\">\n <Clock3 className=\"h-3 w-3\" />\n {formatClock(run.startedAt, i18n.language)}\n {run.outputChars != null && (\n <span>· {run.outputChars} chars</span>\n )}\n </div>\n {run.error && (\n <p className=\"mt-1 text-[11px] text-danger\">{run.error}</p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </>\n )}\n </div>\n )\n}\n"],"names":["Clock3","createLucideIcon","EllipsisVertical","STATUS_STYLES","safeTs","ts","dayKey","d","m","day","formatDay","locale","formatClock","formatDurationMs","ms","buildRows","messages","rows","prevDay","msg","k","runStatusBadgeClass","status","MobileChatRoute","t","i18n","useTranslation","state","send","switchAgent","approvalClick","newConversation","clearError","useChat","input","setInput","useState","sheet","setSheet","showScrollDown","setShowScrollDown","nativeSetupDialogOpen","setNativeSetupDialogOpen","nativeSetupReason","setNativeSetupReason","listRef","useRef","inputRef","statusLabel","quickPrompts","useMemo","chatMessages","latestUserTitle","firstUser","compact","latestRuns","activeRun","r","useEffect","el","onScroll","dist","isNativeSetupError","toast","ta","onSubmit","e","v","onKeyDown","onScrollToBottom","onLogout","onStartNewConversation","jsxs","jsx","NativeSetupDialog","Button","ChevronLeft","cn","agentDisplayName","MoreVertical","row","MessageBubble","mid","reqId","choice","ArrowDown","ApprovalDock","prompt","Loader2","Sparkles","Send","Badge","Activity","Fragment","AgentPicker","a","run"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1,7 +1,7 @@
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.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const t=e("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);export{t as C};
7
- //# sourceMappingURL=chevron-left-BDO3vw8G.js.map
7
+ //# sourceMappingURL=chevron-left-01fAFVpo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chevron-left-BDO3vw8G.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-left.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 ChevronLeft = createLucideIcon(\"ChevronLeft\", [\n [\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]\n]);\n\nexport { ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n"],"names":["ChevronLeft","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"chevron-left-01fAFVpo.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-left.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 ChevronLeft = createLucideIcon(\"ChevronLeft\", [\n [\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]\n]);\n\nexport { ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n"],"names":["ChevronLeft","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
1
- import{o}from"./index-DY2Zglku.js";/**
1
+ import{h}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
- */const e=o("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);export{e as C};
7
- //# sourceMappingURL=chevron-right-5ZUC2opg.js.map
6
+ */const e=h("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);export{e as C};
7
+ //# sourceMappingURL=chevron-right-CFRb-SM_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chevron-right-5ZUC2opg.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-right.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 ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n"],"names":["ChevronRight","createLucideIcon"],"mappings":"mCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"chevron-right-CFRb-SM_.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-right.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 ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n"],"names":["ChevronRight","createLucideIcon"],"mappings":"mCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
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.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const t=e("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);export{t as C};
7
- //# sourceMappingURL=circle-check-big-DHAHqUlS.js.map
7
+ //# sourceMappingURL=circle-check-big-DBg2BD6o.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"circle-check-big-DHAHqUlS.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-check-big.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 CircleCheckBig = createLucideIcon(\"CircleCheckBig\", [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n"],"names":["CircleCheckBig","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAiBC,EAAiB,iBAAkB,CACxD,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"circle-check-big-DBg2BD6o.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-check-big.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 CircleCheckBig = createLucideIcon(\"CircleCheckBig\", [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n"],"names":["CircleCheckBig","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAiBC,EAAiB,iBAAkB,CACxD,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
1
- import{o as c}from"./index-DY2Zglku.js";/**
1
+ import{h as c}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 r=c("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);export{r as C};
7
- //# sourceMappingURL=circle-x-7VaoZ7dY.js.map
7
+ //# sourceMappingURL=circle-x-CqFMzO-x.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"circle-x-7VaoZ7dY.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-x.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 CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n"],"names":["CircleX","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAUC,EAAiB,UAAW,CAC1C,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"circle-x-CqFMzO-x.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-x.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 CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n"],"names":["CircleX","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAUC,EAAiB,UAAW,CAC1C,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{h}from"./index-DCfdN5R7.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 a=h("ClipboardList",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"M12 11h4",key:"1jrz19"}],["path",{d:"M12 16h4",key:"n85exb"}],["path",{d:"M8 11h.01",key:"1dfujw"}],["path",{d:"M8 16h.01",key:"18s6g9"}]]);export{a as C};
7
+ //# sourceMappingURL=clipboard-list-lnqdk2_J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard-list-lnqdk2_J.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clipboard-list.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 ClipboardList = createLucideIcon(\"ClipboardList\", [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"M12 11h4\", key: \"1jrz19\" }],\n [\"path\", { d: \"M12 16h4\", key: \"n85exb\" }],\n [\"path\", { d: \"M8 11h.01\", key: \"1dfujw\" }],\n [\"path\", { d: \"M8 16h.01\", key: \"18s6g9\" }]\n]);\n\nexport { ClipboardList as default };\n//# sourceMappingURL=clipboard-list.js.map\n"],"names":["ClipboardList","createLucideIcon"],"mappings":"mCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAgBC,EAAiB,gBAAiB,CACtD,CAAC,OAAQ,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACrF,CACE,OACA,CACE,EAAG,2EACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,CAAC","x_google_ignoreList":[0]}