@xopcai/xopcbot 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -0
- package/README.zh-CN.md +130 -0
- package/dist/__tests__/core.test.d.ts +1 -0
- package/dist/__tests__/core.test.js +72 -0
- package/dist/__tests__/core.test.js.map +1 -0
- package/dist/agent/fallback/__tests__/index.test.d.ts +1 -0
- package/dist/agent/fallback/__tests__/index.test.js +111 -0
- package/dist/agent/fallback/__tests__/index.test.js.map +1 -0
- package/dist/agent/fallback/candidates.d.ts +23 -0
- package/dist/agent/fallback/candidates.js +62 -0
- package/dist/agent/fallback/candidates.js.map +1 -0
- package/dist/agent/fallback/error.d.ts +22 -0
- package/dist/agent/fallback/error.js +27 -0
- package/dist/agent/fallback/error.js.map +1 -0
- package/dist/agent/fallback/index.d.ts +6 -0
- package/dist/agent/fallback/index.js +5 -0
- package/dist/agent/fallback/index.js.map +1 -0
- package/dist/agent/fallback/reason.d.ts +7 -0
- package/dist/agent/fallback/reason.js +78 -0
- package/dist/agent/fallback/reason.js.map +1 -0
- package/dist/agent/fallback/runner.d.ts +22 -0
- package/dist/agent/fallback/runner.js +34 -0
- package/dist/agent/fallback/runner.js.map +1 -0
- package/dist/agent/helpers.d.ts +38 -0
- package/dist/agent/helpers.js +122 -0
- package/dist/agent/helpers.js.map +1 -0
- package/dist/agent/index.d.ts +7 -0
- package/dist/agent/index.js +7 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/memory/compaction.d.ts +63 -0
- package/dist/agent/memory/compaction.js +233 -0
- package/dist/agent/memory/compaction.js.map +1 -0
- package/dist/agent/memory/window.d.ts +29 -0
- package/dist/agent/memory/window.js +64 -0
- package/dist/agent/memory/window.js.map +1 -0
- package/dist/agent/model-manager.d.ts +80 -0
- package/dist/agent/model-manager.js +213 -0
- package/dist/agent/model-manager.js.map +1 -0
- package/dist/agent/prompt/heartbeat.d.ts +97 -0
- package/dist/agent/prompt/heartbeat.js +313 -0
- package/dist/agent/prompt/heartbeat.js.map +1 -0
- package/dist/agent/prompt/index.d.ts +65 -0
- package/dist/agent/prompt/index.js +215 -0
- package/dist/agent/prompt/index.js.map +1 -0
- package/dist/agent/prompt/memory/index.d.ts +37 -0
- package/dist/agent/prompt/memory/index.js +241 -0
- package/dist/agent/prompt/memory/index.js.map +1 -0
- package/dist/agent/prompt/modes.d.ts +44 -0
- package/dist/agent/prompt/modes.js +167 -0
- package/dist/agent/prompt/modes.js.map +1 -0
- package/dist/agent/prompt/safety.d.ts +88 -0
- package/dist/agent/prompt/safety.js +290 -0
- package/dist/agent/prompt/safety.js.map +1 -0
- package/dist/agent/service.d.ts +91 -0
- package/dist/agent/service.js +641 -0
- package/dist/agent/service.js.map +1 -0
- package/dist/agent/session-tracker.d.ts +73 -0
- package/dist/agent/session-tracker.js +137 -0
- package/dist/agent/session-tracker.js.map +1 -0
- package/dist/agent/skills/__tests__/test-framework.test.d.ts +4 -0
- package/dist/agent/skills/__tests__/test-framework.test.js +343 -0
- package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -0
- package/dist/agent/skills/config.d.ts +58 -0
- package/dist/agent/skills/config.js +212 -0
- package/dist/agent/skills/config.js.map +1 -0
- package/dist/agent/skills/index.d.ts +25 -0
- package/dist/agent/skills/index.js +349 -0
- package/dist/agent/skills/index.js.map +1 -0
- package/dist/agent/skills/installer.d.ts +38 -0
- package/dist/agent/skills/installer.js +352 -0
- package/dist/agent/skills/installer.js.map +1 -0
- package/dist/agent/skills/scanner.d.ts +32 -0
- package/dist/agent/skills/scanner.js +265 -0
- package/dist/agent/skills/scanner.js.map +1 -0
- package/dist/agent/skills/test-framework.d.ts +107 -0
- package/dist/agent/skills/test-framework.js +607 -0
- package/dist/agent/skills/test-framework.js.map +1 -0
- package/dist/agent/skills/types.d.ts +181 -0
- package/dist/agent/skills/types.js +7 -0
- package/dist/agent/skills/types.js.map +1 -0
- package/dist/agent/skills/watcher.d.ts +37 -0
- package/dist/agent/skills/watcher.js +124 -0
- package/dist/agent/skills/watcher.js.map +1 -0
- package/dist/agent/tools/communication.d.ts +18 -0
- package/dist/agent/tools/communication.js +56 -0
- package/dist/agent/tools/communication.js.map +1 -0
- package/dist/agent/tools/edit-diff.d.ts +21 -0
- package/dist/agent/tools/edit-diff.js +69 -0
- package/dist/agent/tools/edit-diff.js.map +1 -0
- package/dist/agent/tools/edit.d.ts +13 -0
- package/dist/agent/tools/edit.js +65 -0
- package/dist/agent/tools/edit.js.map +1 -0
- package/dist/agent/tools/find.d.ts +24 -0
- package/dist/agent/tools/find.js +99 -0
- package/dist/agent/tools/find.js.map +1 -0
- package/dist/agent/tools/grep.d.ts +33 -0
- package/dist/agent/tools/grep.js +183 -0
- package/dist/agent/tools/grep.js.map +1 -0
- package/dist/agent/tools/index.d.ts +13 -0
- package/dist/agent/tools/index.js +18 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/list-dir.d.ts +6 -0
- package/dist/agent/tools/list-dir.js +37 -0
- package/dist/agent/tools/list-dir.js.map +1 -0
- package/dist/agent/tools/memory-tool.d.ts +14 -0
- package/dist/agent/tools/memory-tool.js +81 -0
- package/dist/agent/tools/memory-tool.js.map +1 -0
- package/dist/agent/tools/path-utils.d.ts +4 -0
- package/dist/agent/tools/path-utils.js +13 -0
- package/dist/agent/tools/path-utils.js.map +1 -0
- package/dist/agent/tools/read.d.ts +7 -0
- package/dist/agent/tools/read.js +47 -0
- package/dist/agent/tools/read.js.map +1 -0
- package/dist/agent/tools/send-media.d.ts +18 -0
- package/dist/agent/tools/send-media.js +104 -0
- package/dist/agent/tools/send-media.js.map +1 -0
- package/dist/agent/tools/shell.d.ts +13 -0
- package/dist/agent/tools/shell.js +114 -0
- package/dist/agent/tools/shell.js.map +1 -0
- package/dist/agent/tools/truncate.d.ts +36 -0
- package/dist/agent/tools/truncate.js +98 -0
- package/dist/agent/tools/truncate.js.map +1 -0
- package/dist/agent/tools/web.d.ts +14 -0
- package/dist/agent/tools/web.js +109 -0
- package/dist/agent/tools/web.js.map +1 -0
- package/dist/agent/tools/write.d.ts +7 -0
- package/dist/agent/tools/write.js +35 -0
- package/dist/agent/tools/write.js.map +1 -0
- package/dist/agent/types.d.ts +8 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/typing.d.ts +9 -0
- package/dist/agent/typing.js +32 -0
- package/dist/agent/typing.js.map +1 -0
- package/dist/auth/index.d.ts +12 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth/anthropic.d.ts +7 -0
- package/dist/auth/oauth/anthropic.js +89 -0
- package/dist/auth/oauth/anthropic.js.map +1 -0
- package/dist/auth/oauth/github-copilot.d.ts +8 -0
- package/dist/auth/oauth/github-copilot.js +35 -0
- package/dist/auth/oauth/github-copilot.js.map +1 -0
- package/dist/auth/oauth/google-antigravity.d.ts +7 -0
- package/dist/auth/oauth/google-antigravity.js +27 -0
- package/dist/auth/oauth/google-antigravity.js.map +1 -0
- package/dist/auth/oauth/google-gemini-cli.d.ts +7 -0
- package/dist/auth/oauth/google-gemini-cli.js +28 -0
- package/dist/auth/oauth/google-gemini-cli.js.map +1 -0
- package/dist/auth/oauth/index.d.ts +14 -0
- package/dist/auth/oauth/index.js +15 -0
- package/dist/auth/oauth/index.js.map +1 -0
- package/dist/auth/oauth/kimi.d.ts +8 -0
- package/dist/auth/oauth/kimi.js +104 -0
- package/dist/auth/oauth/kimi.js.map +1 -0
- package/dist/auth/oauth/minimax.d.ts +8 -0
- package/dist/auth/oauth/minimax.js +109 -0
- package/dist/auth/oauth/minimax.js.map +1 -0
- package/dist/auth/oauth/openai-codex.d.ts +7 -0
- package/dist/auth/oauth/openai-codex.js +33 -0
- package/dist/auth/oauth/openai-codex.js.map +1 -0
- package/dist/auth/oauth/pkce.d.ts +8 -0
- package/dist/auth/oauth/pkce.js +22 -0
- package/dist/auth/oauth/pkce.js.map +1 -0
- package/dist/auth/oauth/qwen.d.ts +7 -0
- package/dist/auth/oauth/qwen.js +114 -0
- package/dist/auth/oauth/qwen.js.map +1 -0
- package/dist/auth/oauth/types.d.ts +46 -0
- package/dist/auth/oauth/types.js +7 -0
- package/dist/auth/oauth/types.js.map +1 -0
- package/dist/auth/profiles/index.d.ts +16 -0
- package/dist/auth/profiles/index.js +17 -0
- package/dist/auth/profiles/index.js.map +1 -0
- package/dist/auth/profiles/oauth.d.ts +12 -0
- package/dist/auth/profiles/oauth.js +106 -0
- package/dist/auth/profiles/oauth.js.map +1 -0
- package/dist/auth/profiles/order.d.ts +19 -0
- package/dist/auth/profiles/order.js +63 -0
- package/dist/auth/profiles/order.js.map +1 -0
- package/dist/auth/profiles/profiles.d.ts +27 -0
- package/dist/auth/profiles/profiles.js +110 -0
- package/dist/auth/profiles/profiles.js.map +1 -0
- package/dist/auth/profiles/store.d.ts +17 -0
- package/dist/auth/profiles/store.js +234 -0
- package/dist/auth/profiles/store.js.map +1 -0
- package/dist/auth/profiles/types.d.ts +64 -0
- package/dist/auth/profiles/types.js +7 -0
- package/dist/auth/profiles/types.js.map +1 -0
- package/dist/auth/profiles/usage.d.ts +24 -0
- package/dist/auth/profiles/usage.js +99 -0
- package/dist/auth/profiles/usage.js.map +1 -0
- package/dist/auth/storage.d.ts +99 -0
- package/dist/auth/storage.js +315 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/bus/index.d.ts +3 -0
- package/dist/bus/index.js +2 -0
- package/dist/bus/index.js.map +1 -0
- package/dist/bus/queue.d.ts +20 -0
- package/dist/bus/queue.js +57 -0
- package/dist/bus/queue.js.map +1 -0
- package/dist/channels/__tests__/access-control.test.d.ts +4 -0
- package/dist/channels/__tests__/access-control.test.js +310 -0
- package/dist/channels/__tests__/access-control.test.js.map +1 -0
- package/dist/channels/__tests__/draft-stream.test.d.ts +4 -0
- package/dist/channels/__tests__/draft-stream.test.js +243 -0
- package/dist/channels/__tests__/draft-stream.test.js.map +1 -0
- package/dist/channels/__tests__/format.test.d.ts +4 -0
- package/dist/channels/__tests__/format.test.js +146 -0
- package/dist/channels/__tests__/format.test.js.map +1 -0
- package/dist/channels/__tests__/manager.test.d.ts +6 -0
- package/dist/channels/__tests__/manager.test.js +34 -0
- package/dist/channels/__tests__/manager.test.js.map +1 -0
- package/dist/channels/__tests__/typing-controller.test.d.ts +4 -0
- package/dist/channels/__tests__/typing-controller.test.js +109 -0
- package/dist/channels/__tests__/typing-controller.test.js.map +1 -0
- package/dist/channels/__tests__/update-offset-store.test.d.ts +7 -0
- package/dist/channels/__tests__/update-offset-store.test.js +35 -0
- package/dist/channels/__tests__/update-offset-store.test.js.map +1 -0
- package/dist/channels/access-control.d.ts +93 -0
- package/dist/channels/access-control.js +201 -0
- package/dist/channels/access-control.js.map +1 -0
- package/dist/channels/draft-stream.d.ts +55 -0
- package/dist/channels/draft-stream.js +211 -0
- package/dist/channels/draft-stream.js.map +1 -0
- package/dist/channels/format.d.ts +38 -0
- package/dist/channels/format.js +187 -0
- package/dist/channels/format.js.map +1 -0
- package/dist/channels/index.d.ts +22 -0
- package/dist/channels/index.js +23 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/manager.d.ts +30 -0
- package/dist/channels/manager.js +125 -0
- package/dist/channels/manager.js.map +1 -0
- package/dist/channels/telegram/__tests__/index.test.d.ts +4 -0
- package/dist/channels/telegram/__tests__/index.test.js +153 -0
- package/dist/channels/telegram/__tests__/index.test.js.map +1 -0
- package/dist/channels/telegram/__tests__/inline-keyboards.test.d.ts +4 -0
- package/dist/channels/telegram/__tests__/inline-keyboards.test.js +99 -0
- package/dist/channels/telegram/__tests__/inline-keyboards.test.js.map +1 -0
- package/dist/channels/telegram/client.d.ts +48 -0
- package/dist/channels/telegram/client.js +177 -0
- package/dist/channels/telegram/client.js.map +1 -0
- package/dist/channels/telegram/command-handler.d.ts +28 -0
- package/dist/channels/telegram/command-handler.js +209 -0
- package/dist/channels/telegram/command-handler.js.map +1 -0
- package/dist/channels/telegram/index.d.ts +8 -0
- package/dist/channels/telegram/index.js +9 -0
- package/dist/channels/telegram/index.js.map +1 -0
- package/dist/channels/telegram/inline-keyboards.d.ts +20 -0
- package/dist/channels/telegram/inline-keyboards.js +38 -0
- package/dist/channels/telegram/inline-keyboards.js.map +1 -0
- package/dist/channels/telegram/plugin.d.ts +33 -0
- package/dist/channels/telegram/plugin.js +640 -0
- package/dist/channels/telegram/plugin.js.map +1 -0
- package/dist/channels/telegram/webhook.d.ts +31 -0
- package/dist/channels/telegram/webhook.js +129 -0
- package/dist/channels/telegram/webhook.js.map +1 -0
- package/dist/channels/types.d.ts +186 -0
- package/dist/channels/types.js +7 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/typing-controller.d.ts +47 -0
- package/dist/channels/typing-controller.js +117 -0
- package/dist/channels/typing-controller.js.map +1 -0
- package/dist/channels/update-offset-store.d.ts +37 -0
- package/dist/channels/update-offset-store.js +165 -0
- package/dist/channels/update-offset-store.js.map +1 -0
- package/dist/channels/whatsapp/index.d.ts +4 -0
- package/dist/channels/whatsapp/index.js +5 -0
- package/dist/channels/whatsapp/index.js.map +1 -0
- package/dist/channels/whatsapp/plugin.d.ts +27 -0
- package/dist/channels/whatsapp/plugin.js +66 -0
- package/dist/channels/whatsapp/plugin.js.map +1 -0
- package/dist/cli/__tests__/registry.test.d.ts +1 -0
- package/dist/cli/__tests__/registry.test.js +366 -0
- package/dist/cli/__tests__/registry.test.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +1 -0
- package/dist/cli/commands/agent.js +216 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +6 -0
- package/dist/cli/commands/auth.js +440 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/config.d.ts +1 -0
- package/dist/cli/commands/config.js +135 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/configure.d.ts +1 -0
- package/dist/cli/commands/configure.js +173 -0
- package/dist/cli/commands/configure.js.map +1 -0
- package/dist/cli/commands/cron.d.ts +1 -0
- package/dist/cli/commands/cron.js +81 -0
- package/dist/cli/commands/cron.js.map +1 -0
- package/dist/cli/commands/gateway.d.ts +1 -0
- package/dist/cli/commands/gateway.js +91 -0
- package/dist/cli/commands/gateway.js.map +1 -0
- package/dist/cli/commands/index.d.ts +0 -0
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/models.d.ts +1 -0
- package/dist/cli/commands/models.js +79 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +1 -0
- package/dist/cli/commands/onboard.js +621 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +1 -0
- package/dist/cli/commands/plugin.js +341 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/session.d.ts +1 -0
- package/dist/cli/commands/session.js +450 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/skills-test.d.ts +9 -0
- package/dist/cli/commands/skills-test.js +195 -0
- package/dist/cli/commands/skills-test.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +9 -0
- package/dist/cli/commands/skills.js +385 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.js +40 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/registry.d.ts +43 -0
- package/dist/cli/registry.js +82 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/templates.d.ts +19 -0
- package/dist/cli/templates.js +191 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/cli/utils/colors.d.ts +13 -0
- package/dist/cli/utils/colors.js +16 -0
- package/dist/cli/utils/colors.js.map +1 -0
- package/dist/config/__tests__/diff.test.d.ts +1 -0
- package/dist/config/__tests__/diff.test.js +192 -0
- package/dist/config/__tests__/diff.test.js.map +1 -0
- package/dist/config/__tests__/loader.test.d.ts +1 -0
- package/dist/config/__tests__/loader.test.js +356 -0
- package/dist/config/__tests__/loader.test.js.map +1 -0
- package/dist/config/__tests__/paths.test.d.ts +1 -0
- package/dist/config/__tests__/paths.test.js +192 -0
- package/dist/config/__tests__/paths.test.js.map +1 -0
- package/dist/config/__tests__/reload.test.d.ts +1 -0
- package/dist/config/__tests__/reload.test.js +374 -0
- package/dist/config/__tests__/reload.test.js.map +1 -0
- package/dist/config/__tests__/rules.test.d.ts +1 -0
- package/dist/config/__tests__/rules.test.js +204 -0
- package/dist/config/__tests__/rules.test.js.map +1 -0
- package/dist/config/__tests__/schema.test.d.ts +1 -0
- package/dist/config/__tests__/schema.test.js +672 -0
- package/dist/config/__tests__/schema.test.js.map +1 -0
- package/dist/config/diff.d.ts +7 -0
- package/dist/config/diff.js +46 -0
- package/dist/config/diff.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +5 -0
- package/dist/config/loader.js +81 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +35 -0
- package/dist/config/paths.js +79 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/reload.d.ts +78 -0
- package/dist/config/reload.js +190 -0
- package/dist/config/reload.js.map +1 -0
- package/dist/config/rules.d.ts +42 -0
- package/dist/config/rules.js +114 -0
- package/dist/config/rules.js.map +1 -0
- package/dist/config/schema.d.ts +1340 -0
- package/dist/config/schema.js +611 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/cron/executor.d.ts +54 -0
- package/dist/cron/executor.js +364 -0
- package/dist/cron/executor.js.map +1 -0
- package/dist/cron/index.d.ts +5 -0
- package/dist/cron/index.js +6 -0
- package/dist/cron/index.js.map +1 -0
- package/dist/cron/persistence.d.ts +61 -0
- package/dist/cron/persistence.js +188 -0
- package/dist/cron/persistence.js.map +1 -0
- package/dist/cron/service.d.ts +94 -0
- package/dist/cron/service.js +382 -0
- package/dist/cron/service.js.map +1 -0
- package/dist/cron/types.d.ts +119 -0
- package/dist/cron/types.js +3 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/cron/validation.d.ts +144 -0
- package/dist/cron/validation.js +113 -0
- package/dist/cron/validation.js.map +1 -0
- package/dist/errors/__tests__/index.test.d.ts +1 -0
- package/dist/errors/__tests__/index.test.js +301 -0
- package/dist/errors/__tests__/index.test.js.map +1 -0
- package/dist/errors/index.d.ts +114 -0
- package/dist/errors/index.js +278 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/gateway/hono/app.d.ts +7 -0
- package/dist/gateway/hono/app.js +668 -0
- package/dist/gateway/hono/app.js.map +1 -0
- package/dist/gateway/hono/index.d.ts +2 -0
- package/dist/gateway/hono/index.js +3 -0
- package/dist/gateway/hono/index.js.map +1 -0
- package/dist/gateway/hono/middleware/auth.d.ts +18 -0
- package/dist/gateway/hono/middleware/auth.js +79 -0
- package/dist/gateway/hono/middleware/auth.js.map +1 -0
- package/dist/gateway/hono/middleware/logger.d.ts +1 -0
- package/dist/gateway/hono/middleware/logger.js +17 -0
- package/dist/gateway/hono/middleware/logger.js.map +1 -0
- package/dist/gateway/hono/sse.d.ts +55 -0
- package/dist/gateway/hono/sse.js +224 -0
- package/dist/gateway/hono/sse.js.map +1 -0
- package/dist/gateway/index.d.ts +4 -0
- package/dist/gateway/index.js +5 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/protocol.d.ts +28 -0
- package/dist/gateway/protocol.js +14 -0
- package/dist/gateway/protocol.js.map +1 -0
- package/dist/gateway/server.d.ts +19 -0
- package/dist/gateway/server.js +64 -0
- package/dist/gateway/server.js.map +1 -0
- package/dist/gateway/service.d.ts +265 -0
- package/dist/gateway/service.js +621 -0
- package/dist/gateway/service.js.map +1 -0
- package/dist/gateway/static/root/assets/main-CfIxL-cL.js +2105 -0
- package/dist/gateway/static/root/assets/main-CfIxL-cL.js.map +1 -0
- package/dist/gateway/static/root/assets/main-DndcTCgX.css +1 -0
- package/dist/gateway/static/root/index.html +116 -0
- package/dist/heartbeat/index.d.ts +1 -0
- package/dist/heartbeat/index.js +2 -0
- package/dist/heartbeat/index.js.map +1 -0
- package/dist/heartbeat/service.d.ts +19 -0
- package/dist/heartbeat/service.js +61 -0
- package/dist/heartbeat/service.js.map +1 -0
- package/dist/plugin-sdk/index.d.ts +21 -0
- package/dist/plugin-sdk/index.js +12 -0
- package/dist/plugin-sdk/index.js.map +1 -0
- package/dist/plugins/__tests__/api.test.d.ts +1 -0
- package/dist/plugins/__tests__/api.test.js +164 -0
- package/dist/plugins/__tests__/api.test.js.map +1 -0
- package/dist/plugins/__tests__/hooks.test.d.ts +1 -0
- package/dist/plugins/__tests__/hooks.test.js +159 -0
- package/dist/plugins/__tests__/hooks.test.js.map +1 -0
- package/dist/plugins/__tests__/loader.test.d.ts +1 -0
- package/dist/plugins/__tests__/loader.test.js +120 -0
- package/dist/plugins/__tests__/loader.test.js.map +1 -0
- package/dist/plugins/api.d.ts +41 -0
- package/dist/plugins/api.js +131 -0
- package/dist/plugins/api.js.map +1 -0
- package/dist/plugins/hooks.d.ts +153 -0
- package/dist/plugins/hooks.js +172 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/index.d.ts +11 -0
- package/dist/plugins/index.js +16 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/install.d.ts +59 -0
- package/dist/plugins/install.js +324 -0
- package/dist/plugins/install.js.map +1 -0
- package/dist/plugins/loader.d.ts +84 -0
- package/dist/plugins/loader.js +545 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +190 -0
- package/dist/plugins/types.js +7 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/__tests__/registry.test.d.ts +1 -0
- package/dist/providers/__tests__/registry.test.js +110 -0
- package/dist/providers/__tests__/registry.test.js.map +1 -0
- package/dist/providers/api-strategies.d.ts +15 -0
- package/dist/providers/api-strategies.js +96 -0
- package/dist/providers/api-strategies.js.map +1 -0
- package/dist/providers/auto-discovery.d.ts +84 -0
- package/dist/providers/auto-discovery.js +236 -0
- package/dist/providers/auto-discovery.js.map +1 -0
- package/dist/providers/config.d.ts +25 -0
- package/dist/providers/config.js +42 -0
- package/dist/providers/config.js.map +1 -0
- package/dist/providers/index.d.ts +25 -0
- package/dist/providers/index.js +55 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/model-catalog.d.ts +205 -0
- package/dist/providers/model-catalog.js +1071 -0
- package/dist/providers/model-catalog.js.map +1 -0
- package/dist/providers/models-dev-data.d.ts +11 -0
- package/dist/providers/models-dev-data.js +1035 -0
- package/dist/providers/models-dev-data.js.map +1 -0
- package/dist/providers/models-dev.d.ts +30 -0
- package/dist/providers/models-dev.js +42 -0
- package/dist/providers/models-dev.js.map +1 -0
- package/dist/providers/pi-ai.d.ts +62 -0
- package/dist/providers/pi-ai.js +221 -0
- package/dist/providers/pi-ai.js.map +1 -0
- package/dist/providers/provider-catalog.d.ts +173 -0
- package/dist/providers/provider-catalog.js +834 -0
- package/dist/providers/provider-catalog.js.map +1 -0
- package/dist/providers/registry.d.ts +155 -0
- package/dist/providers/registry.js +524 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +95 -0
- package/dist/providers/types.js +7 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/session/chat-manager.d.ts +49 -0
- package/dist/session/chat-manager.js +167 -0
- package/dist/session/chat-manager.js.map +1 -0
- package/dist/session/chat-types.d.ts +53 -0
- package/dist/session/chat-types.js +63 -0
- package/dist/session/chat-types.js.map +1 -0
- package/dist/session/index.d.ts +5 -0
- package/dist/session/index.js +5 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +103 -0
- package/dist/session/manager.js +200 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/store.d.ts +114 -0
- package/dist/session/store.js +687 -0
- package/dist/session/store.js.map +1 -0
- package/dist/session/types.d.ts +88 -0
- package/dist/session/types.js +10 -0
- package/dist/session/types.js.map +1 -0
- package/dist/types/index.d.ts +177 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/providers.d.ts +67 -0
- package/dist/types/providers.js +7 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +17 -0
- package/dist/utils/frontmatter.js +104 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/helpers.d.ts +5 -0
- package/dist/utils/helpers.js +36 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/log-store.d.ts +78 -0
- package/dist/utils/log-store.js +432 -0
- package/dist/utils/log-store.js.map +1 -0
- package/dist/utils/logger.d.ts +127 -0
- package/dist/utils/logger.js +481 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logger.types.d.ts +152 -0
- package/dist/utils/logger.types.js +30 -0
- package/dist/utils/logger.types.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-CfIxL-cL.js","sources":["../../../../../ui/node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../../../ui/node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../../../ui/node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/lit-html.js","../../../../../ui/node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../../../ui/node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../../../ui/node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../../../ui/node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../../../../../ui/node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/base.js","../../../../../ui/node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/query.js","../../../../../ui/node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directive-helpers.js","../../../../../ui/node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directive.js","../../../../../ui/node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/async-directive.js","../../../../../ui/node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/ref.js","../../../../../ui/node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/unsafe-html.js","../../../../../ui/node_modules/.pnpm/lucide@0.456.0/node_modules/lucide/dist/esm/defaultAttributes.js","../../../../../ui/node_modules/.pnpm/lucide@0.456.0/node_modules/lucide/dist/esm/icons/paperclip.js","../../../../../ui/node_modules/.pnpm/lucide@0.456.0/node_modules/lucide/dist/esm/icons/send.js","../../../../../ui/node_modules/.pnpm/lucide@0.456.0/node_modules/lucide/dist/esm/icons/square.js","../../../../../ui/node_modules/.pnpm/lucide@0.456.0/node_modules/lucide/dist/esm/icons/x.js","../../../../../ui/src/utils/i18n.ts","../../../../../ui/src/components/MessageEditor.ts","../../../../../ui/src/utils/icons.ts","../../../../../ui/src/components/MessageList/AttachmentRenderer.ts","../../../../../ui/src/components/MessageList/UsageBadge.ts","../../../../../ui/src/components/MessageList/MessageBubble.ts","../../../../../ui/src/components/MessageList/index.ts","../../../../../ui/src/components/StreamingMessageContainer.ts","../../../../../ui/src/gateway-chat.ts","../../../../../ui/src/components/SessionCard.ts","../../../../../ui/src/components/SessionList.ts","../../../../../ui/src/components/SessionDetailDrawer.ts","../../../../../ui/src/components/ConfirmDialog.ts","../../../../../ui/src/utils/session-api.ts","../../../../../ui/src/pages/SessionManager.ts","../../../../../ui/src/utils/cron-api.ts","../../../../../ui/src/pages/CronManager.ts","../../../../../ui/src/utils/log-api.ts","../../../../../ui/src/pages/LogManager.ts","../../../../../ui/src/pages/SettingsPage.ts","../../../../../ui/src/navigation.ts","../../../../../ui/src/app.ts","../../../../../ui/src/dialogs/SettingsDialog.ts","../../../../../ui/src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e=(e,t,c)=>(c.configurable=!0,c.enumerable=!0,Reflect.decorate&&\"object\"!=typeof t&&Object.defineProperty(e,t,c),c);export{e as desc};\n//# sourceMappingURL=base.js.map\n","import{desc as t}from\"./base.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e(e,r){return(n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;if(r){const{get:e,set:r}=\"object\"==typeof s?n:i??(()=>{const t=Symbol();return{get(){return this[t]},set(e){this[t]=e}}})();return t(n,s,{get(){let t=e.call(this);return void 0===t&&(t=o(this),(null!==t||this.hasUpdated)&&r.call(this,t)),t}})}return t(n,s,{get(){return o(this)}})}}export{e as query};\n//# sourceMappingURL=query.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{isSingleExpression as i}from\"./directive-helpers.js\";import{Directive as t,PartType as e}from\"./directive.js\";export{directive}from\"./directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=(i,t)=>{const e=i._$AN;if(void 0===e)return!1;for(const i of e)i._$AO?.(t,!1),s(i,t);return!0},o=i=>{let t,e;do{if(void 0===(t=i._$AM))break;e=t._$AN,e.delete(i),i=t}while(0===e?.size)},r=i=>{for(let t;t=i._$AM;i=t){let e=t._$AN;if(void 0===e)t._$AN=e=new Set;else if(e.has(i))break;e.add(i),c(t)}};function h(i){void 0!==this._$AN?(o(this),this._$AM=i,r(this)):this._$AM=i}function n(i,t=!1,e=0){const r=this._$AH,h=this._$AN;if(void 0!==h&&0!==h.size)if(t)if(Array.isArray(r))for(let i=e;i<r.length;i++)s(r[i],!1),o(r[i]);else null!=r&&(s(r,!1),o(r));else s(this,i)}const c=i=>{i.type==e.CHILD&&(i._$AP??=n,i._$AQ??=h)};class f extends t{constructor(){super(...arguments),this._$AN=void 0}_$AT(i,t,e){super._$AT(i,t,e),r(this),this.isConnected=i._$AU}_$AO(i,t=!0){i!==this.isConnected&&(this.isConnected=i,i?this.reconnected?.():this.disconnected?.()),t&&(s(this,i),o(this))}setValue(t){if(i(this._$Ct))this._$Ct._$AI(t,this);else{const i=[...this._$Ct._$AH];i[this._$Ci]=t,this._$Ct._$AI(i,this,0)}}disconnected(){}reconnected(){}}export{f as AsyncDirective,t as Directive,e as PartType};\n//# sourceMappingURL=async-directive.js.map\n","import{nothing as t}from\"../lit-html.js\";import{AsyncDirective as i}from\"../async-directive.js\";import{directive as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const e=()=>new h;class h{}const o=new WeakMap,n=s(class extends i{render(i){return t}update(i,[s]){const e=s!==this.G;return e&&void 0!==this.G&&this.rt(void 0),(e||this.lt!==this.ct)&&(this.G=s,this.ht=i.options?.host,this.rt(this.ct=i.element)),t}rt(t){if(this.isConnected||(t=void 0),\"function\"==typeof this.G){const i=this.ht??globalThis;let s=o.get(i);void 0===s&&(s=new WeakMap,o.set(i,s)),void 0!==s.get(this.G)&&this.G.call(this.ht,void 0),s.set(this.G,t),void 0!==t&&this.G.call(this.ht,t)}else this.G.value=t}get lt(){return\"function\"==typeof this.G?o.get(this.ht??globalThis)?.get(this.G):this.G?.value}disconnected(){this.lt===this.ct&&this.rt(void 0)}reconnected(){this.rt(this.ct)}});export{e as createRef,n as ref};\n//# sourceMappingURL=ref.js.map\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","/**\n * @license lucide v0.456.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\nconst defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide v0.456.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 defaultAttributes from '../defaultAttributes.js';\n\nconst Paperclip = [\n \"svg\",\n defaultAttributes,\n [\n [\n \"path\",\n {\n d: \"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\"\n }\n ]\n ]\n];\n\nexport { Paperclip as default };\n//# sourceMappingURL=paperclip.js.map\n","/**\n * @license lucide v0.456.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 defaultAttributes from '../defaultAttributes.js';\n\nconst Send = [\n \"svg\",\n defaultAttributes,\n [\n [\n \"path\",\n {\n d: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\" }]\n ]\n];\n\nexport { Send as default };\n//# sourceMappingURL=send.js.map\n","/**\n * @license lucide v0.456.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 defaultAttributes from '../defaultAttributes.js';\n\nconst Square = [\n \"svg\",\n defaultAttributes,\n [[\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\" }]]\n];\n\nexport { Square as default };\n//# sourceMappingURL=square.js.map\n","/**\n * @license lucide v0.456.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 defaultAttributes from '../defaultAttributes.js';\n\nconst X = [\n \"svg\",\n defaultAttributes,\n [\n [\"path\", { d: \"M18 6 6 18\" }],\n [\"path\", { d: \"m6 6 12 12\" }]\n ]\n];\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","import enTranslations from '../i18n/en.json';\nimport zhTranslations from '../i18n/zh.json';\n\nexport type Language = 'en' | 'zh';\n\n// Built-in translations (bundled for production compatibility)\nconst builtInTranslations: Record<Language, Record<string, unknown>> = {\n en: enTranslations as Record<string, unknown>,\n zh: zhTranslations as Record<string, unknown>,\n};\n\n// Translation cache (for runtime-loaded translations)\nconst translationCache: Map<Language, Record<string, unknown>> = new Map();\n\n// Initialize cache with built-in translations\ntranslationCache.set('en', builtInTranslations.en);\ntranslationCache.set('zh', builtInTranslations.zh);\n\nlet currentLanguage: Language = 'en';\n\n// Simple path-based translation getter\nexport function t(path: string, params?: Record<string, string | number>): string {\n const translations = translationCache.get(currentLanguage);\n if (!translations) return path;\n \n const keys = path.split('.');\n let value: unknown = translations;\n \n for (const key of keys) {\n if (value && typeof value === 'object' && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n // Fallback to English\n const enTranslations = translationCache.get('en');\n if (enTranslations && currentLanguage !== 'en') {\n let enValue: unknown = enTranslations;\n for (const k of keys) {\n if (enValue && typeof enValue === 'object' && k in enValue) {\n enValue = (enValue as Record<string, unknown>)[k];\n } else {\n return path;\n }\n }\n value = enValue;\n } else {\n return path;\n }\n }\n }\n \n if (typeof value !== 'string') return path;\n \n // Replace params\n if (params) {\n return value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const paramValue = params[key];\n return paramValue !== undefined ? String(paramValue) : `{{${key}}}`;\n });\n }\n \n return value;\n}\n\n// Load translations for a language (runtime loading, optional)\nexport async function loadLanguage(lang: Language): Promise<void> {\n if (translationCache.has(lang)) {\n currentLanguage = lang;\n return;\n }\n \n try {\n const response = await fetch(`/src/i18n/${lang}.json`);\n if (!response.ok) {\n throw new Error(`Failed to load ${lang} translations`);\n }\n const translations = await response.json();\n translationCache.set(lang, translations);\n currentLanguage = lang;\n \n // Dispatch language change event\n window.dispatchEvent(new CustomEvent('languagechange', { detail: { language: lang } }));\n } catch (error) {\n console.error(`Failed to load ${lang} translations:`, error);\n // Fallback to English if available\n if (lang !== 'en' && translationCache.has('en')) {\n currentLanguage = 'en';\n }\n }\n}\n\n// Set language\nexport function setLanguage(lang: Language): void {\n if (translationCache.has(lang)) {\n currentLanguage = lang;\n window.dispatchEvent(new CustomEvent('languagechange', { detail: { language: lang } }));\n } else {\n // Try to load\n loadLanguage(lang);\n }\n}\n\n// Get current language\nexport function getCurrentLanguage(): Language {\n return currentLanguage;\n}\n\n// Initialize i18n (sync - uses built-in translations)\nexport function initI18n(defaultLang: Language = 'en'): void {\n currentLanguage = defaultLang;\n}\n\n// Legacy compatibility - old translation keys\nexport const legacyKeys: Record<string, string> = {\n 'Type a message...': 'chat.typeMessage',\n 'Attach file': 'chat.attachFile',\n 'Send message': 'chat.sendMessage',\n 'Abort': 'chat.abort',\n 'No session available': 'errors.noSession',\n 'No agent set': 'errors.noAgent',\n 'Configuration': 'config.title',\n 'Cancel': 'settings.cancel',\n 'Save': 'settings.save',\n 'No result': 'config.noResult',\n 'Artifacts': 'config.artifacts',\n 'Show artifacts': 'config.showArtifacts',\n};\n\n// Legacy i18n function for backward compatibility\nexport function i18n(key: string): string {\n // First check if it's a legacy key\n const newKey = legacyKeys[key];\n if (newKey) {\n return t(newKey);\n }\n // If not a legacy key, try to use as path\n return t(key);\n}\n\n// Export for direct access\nexport { translationCache as translations };\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { Paperclip, Send, Square, X } from 'lucide';\n\n// Convert lucide icon array format to SVG string\nfunction iconToSvg(iconData: unknown, className = ''): string {\n if (!iconData || !Array.isArray(iconData)) return '';\n\n const [_tag, attrs, children] = iconData as [string, Record<string, string>, unknown[]];\n\n const attrStr = Object.entries(attrs || {})\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n\n const childrenStr = Array.isArray(children)\n ? children.map(child => {\n if (Array.isArray(child)) {\n const [cTag, cAttrs] = child;\n const cAttrStr = Object.entries(cAttrs || {})\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n return `<${cTag} ${cAttrStr} />`;\n }\n return '';\n }).join('')\n : '';\n\n const finalAttrs = className ? `${attrStr} class=\"${className}\"` : attrStr;\n\n return `<svg ${finalAttrs}>${childrenStr}</svg>`;\n}\nimport { i18n, t } from '../utils/i18n';\n\nexport interface Attachment {\n id: string;\n name: string;\n type: string;\n mimeType: string;\n size: number;\n content: string; // base64\n}\n\n@customElement('message-editor')\nexport class MessageEditor extends LitElement {\n @query('textarea') private textarea!: HTMLTextAreaElement;\n\n @property({ type: String }) value = '';\n @property({ type: Array }) attachments: Attachment[] = [];\n @property({ type: Boolean }) isStreaming = false;\n @property({ type: Boolean }) showAttachmentButton = true;\n @property({ type: Boolean }) showModelSelector = true;\n @property({ attribute: false }) currentModel?: { id: string; provider: string };\n\n @property({ attribute: false }) onSend?: (input: string, attachments: Attachment[]) => void;\n @property({ attribute: false }) onAbort?: () => void;\n @property({ attribute: false }) onModelSelect?: () => void;\n\n @state() private _isComposing = false;\n @state() private _isDragging = false;\n @state() private _processingFiles = false;\n @state() private _isSending = false;\n\n private textareaRef = createRef<HTMLTextAreaElement>();\n private fileInputRef = createRef<HTMLInputElement>();\n private readonly maxFileSize = 20 * 1024 * 1024; // 20MB\n private readonly acceptedTypes = 'image/*,application/pdf,.docx,.pptx,.xlsx,.xls,.txt,.md,.json,.xml,.html,.css,.js,.ts,.jsx,.tsx,.yml,.yaml,.zip';\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('dragover', this._handleDocumentDragOver);\n document.addEventListener('drop', this._handleDocumentDrop);\n document.addEventListener('dragleave', this._handleDocumentDragLeave);\n document.addEventListener('click', this._handleOutsideClick);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('dragover', this._handleDocumentDragOver);\n document.removeEventListener('drop', this._handleDocumentDrop);\n document.removeEventListener('dragleave', this._handleDocumentDragLeave);\n document.removeEventListener('click', this._handleOutsideClick);\n }\n\n private _handleDocumentDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types.includes('Files')) {\n e.preventDefault();\n this._isDragging = true;\n }\n };\n\n private _handleDocumentDragLeave = (e: DragEvent) => {\n if (e.relatedTarget === null) {\n this._isDragging = false;\n }\n };\n\n private _handleDocumentDrop = async (e: DragEvent) => {\n e.preventDefault();\n this._isDragging = false;\n \n const files = e.dataTransfer?.files;\n if (files && files.length > 0) {\n await this._processFiles(Array.from(files));\n }\n };\n\n override render(): unknown {\n return html`\n <div class=\"editor-container\">\n ${this.attachments.length > 0 ? this._renderAttachments() : ''}\n \n <div class=\"input-row ${this._isDragging ? 'dragging' : ''}\">\n ${this.showAttachmentButton ? this._renderAttachmentButton() : ''}\n \n <textarea\n ${ref(this.textareaRef)}\n class=\"text-input\"\n placeholder=${i18n('Type a message...')}\n .value=${this.value}\n @input=${this._handleInput}\n @keydown=${this._handleKeydown}\n @compositionstart=${() => this._isComposing = true}\n @compositionend=${() => this._isComposing = false}\n @paste=${this._handlePaste}\n rows=\"1\"\n ></textarea>\n\n <div class=\"input-actions\">\n ${this._renderSendButton()}\n </div>\n </div>\n\n ${this._isDragging ? this._renderDropOverlay() : ''}\n </div>\n `;\n }\n\n private _renderAttachments(): unknown {\n return html`\n <div class=\"attachments-row\">\n ${this.attachments.map((att, index) => html`\n <div class=\"attachment-chip\">\n <div class=\"attachment-preview\">\n ${att.mimeType.startsWith('image/') ? html`\n <img src=\"${att.content}\" alt=\"${att.name}\" />\n ` : html`\n ${unsafeHTML(iconToSvg(FileText, 'w-4 h-4'))}\n `}\n </div>\n <span class=\"attachment-name\">${att.name}</span>\n <button type=\"button\" class=\"attachment-remove\" @click=${() => this._removeAttachment(index)}>\n ${unsafeHTML(iconToSvg(X, 'w-3 h-3'))}\n </button>\n </div>\n `)}\n </div>\n `;\n }\n\n private _renderAttachmentButton(): unknown {\n return html`\n <button type=\"button\" class=\"attach-btn\" @click=${() => this._triggerFileSelect('all')} title=${i18n('Attach file')}>\n ${unsafeHTML(iconToSvg(Paperclip, 'w-4 h-4'))}\n </button>\n \n <input\n ${ref(this.fileInputRef)}\n type=\"file\"\n multiple\n accept=${this.acceptedTypes}\n class=\"hidden\"\n @change=${this._handleFileInputChange}\n />\n `;\n }\n\n private _renderSendButton(): unknown {\n const canSend = this.value.trim() || this.attachments.length > 0;\n\n if (this.isStreaming) {\n return html`\n <button type=\"button\" class=\"stop-btn\" @click=${() => this.onAbort?.()} title=${i18n('Abort')}>\n ${unsafeHTML(iconToSvg(Square, 'w-4 h-4'))}\n </button>\n `;\n }\n\n return html`\n <button\n type=\"button\"\n class=\"send-btn ${canSend ? 'active' : ''}\"\n ?disabled=${!canSend}\n @click=${this._send}\n title=${i18n('Send message')}\n >\n ${unsafeHTML(iconToSvg(Send, 'w-4 h-4'))}\n </button>\n `;\n }\n\n private _renderDropOverlay(): unknown {\n return html`\n <div class=\"drop-overlay\">\n <span>Drop files here to attach</span>\n </div>\n `;\n }\n\n private _triggerFileSelect(type: 'image' | 'document' | 'all'): void {\n // Try ref first\n let input: HTMLInputElement | null | undefined = this.fileInputRef.value;\n\n // Fallback: query selector since we're using light DOM\n if (!input) {\n input = this.querySelector('input[type=\"file\"]') as HTMLInputElement | null;\n }\n\n if (!input) {\n console.warn('File input not found');\n return;\n }\n\n if (type === 'image') {\n input.accept = 'image/*';\n } else if (type === 'document') {\n input.accept = '.pdf,.docx,.pptx,.xlsx,.xls,.txt,.md,.json,.xml,.html,.css,.js,.ts,.jsx,.tsx,.yml,.yaml,.zip';\n } else {\n input.accept = this.acceptedTypes;\n }\n\n input.click();\n }\n\n private _handleInput = (e: Event): void => {\n const target = e.target as HTMLTextAreaElement;\n this.value = target.value;\n this._adjustTextareaHeight();\n };\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter' && !e.shiftKey && !this._isComposing) {\n e.preventDefault();\n this._send();\n }\n };\n\n private _handlePaste = async (e: ClipboardEvent): Promise<void> => {\n const items = e.clipboardData?.items;\n if (!items) return;\n\n const imageFiles: File[] = [];\n \n for (const item of Array.from(items)) {\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile();\n if (file) {\n imageFiles.push(file);\n }\n }\n }\n\n if (imageFiles.length > 0) {\n e.preventDefault();\n await this._processFiles(imageFiles);\n }\n };\n\n private _adjustTextareaHeight(): void {\n const textarea = this.textareaRef.value;\n if (!textarea) return;\n \n textarea.style.height = 'auto';\n textarea.style.height = Math.min(textarea.scrollHeight, 200) + 'px';\n }\n\n private _send(): void {\n if (this._isSending || this.isStreaming) return;\n if (!this.value.trim() && this.attachments.length === 0) return;\n \n this._isSending = true;\n const attachments = [...this.attachments];\n this.onSend?.(this.value, attachments);\n this.value = '';\n this.attachments = [];\n \n requestAnimationFrame(() => {\n this._adjustTextareaHeight();\n setTimeout(() => {\n this._isSending = false;\n }, 500);\n });\n }\n\n private _handleFileInputChange = async (e: Event): Promise<void> => {\n const input = e.target as HTMLInputElement;\n const files = input.files;\n if (!files) return;\n\n await this._processFiles(Array.from(files));\n input.value = '';\n };\n\n private async _processFiles(files: File[]): Promise<void> {\n this._processingFiles = true;\n\n try {\n for (const file of files) {\n if (file.size > this.maxFileSize) {\n console.warn(`File ${file.name} exceeds max size of ${this.maxFileSize} bytes`);\n continue;\n }\n\n const attachment = await this._loadAttachment(file);\n this.attachments = [...this.attachments, attachment];\n }\n } finally {\n this._processingFiles = false;\n }\n }\n\n private async _loadAttachment(file: File): Promise<Attachment> {\n const base64 = await this._readFileAsBase64(file);\n const isImage = file.type.startsWith('image/');\n\n return {\n id: crypto.randomUUID(),\n name: file.name,\n type: isImage ? 'image' : 'document',\n mimeType: file.type,\n size: file.size,\n content: base64,\n };\n }\n\n private _readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n }\n\n private _removeAttachment(index: number): void {\n this.attachments = this.attachments.filter((_, i) => i !== index);\n }\n\n private _formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let unitIndex = 0;\n let size = bytes;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n }\n}\n","import { html, type TemplateResult } from 'lit';\n\n// Dynamic icon loader using lucide\nexport async function loadIcon(name: string): Promise<TemplateResult> {\n try {\n // Dynamic import from lucide\n const lucide = await import('lucide');\n const iconFn = (lucide as Record<string, (props: { size?: number }) => string>)[name];\n \n if (iconFn) {\n const svgString = iconFn({ size: 18 });\n return html`${svgString}`;\n }\n } catch {\n // Fallback to inline icons\n }\n \n // Fallback inline icons\n return fallbackIcons[name] || fallbackIcons.helpCircle;\n}\n\n// Synchronous icon getter (returns fallback if not cached)\nexport function getIcon(name: string): TemplateResult {\n return fallbackIcons[name] || fallbackIcons.helpCircle;\n}\n\n// Inline SVG fallback icons\nconst fallbackIcons: Record<string, TemplateResult> = {\n messageSquare: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\n </svg>\n `,\n settings: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path>\n </svg>\n `,\n menu: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n `,\n chevronDown: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n `,\n sun: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"5\"></circle>\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"></line>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line>\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"></line>\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"></line>\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"></line>\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"></line>\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"></line>\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"></line>\n </svg>\n `,\n moon: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"></path>\n </svg>\n `,\n monitor: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line>\n </svg>\n `,\n send: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n `,\n paperclip: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"></path>\n </svg>\n `,\n x: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n `,\n fileText: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14 2 14 8 20 8\"></polyline>\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line>\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n <polyline points=\"10 9 9 9 8 9\"></polyline>\n </svg>\n `,\n image: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"></circle>\n <polyline points=\"21 15 16 10 5 21\"></polyline>\n </svg>\n `,\n file: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14 2 14 8 20 8\"></polyline>\n </svg>\n `,\n plug: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 22v-5\"></path>\n <path d=\"M15 8V2\"></path>\n <path d=\"M9 8V2\"></path>\n <path d=\"M15 8a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3v-5a3 3 0 0 1 3-3h6z\"></path>\n </svg>\n `,\n palette: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"13.5\" cy=\"6.5\" r=\".5\"></circle>\n <circle cx=\"17.5\" cy=\"10.5\" r=\".5\"></circle>\n <circle cx=\"8.5\" cy=\"7.5\" r=\".5\"></circle>\n <circle cx=\"6.5\" cy=\"12.5\" r=\".5\"></circle>\n <path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.01 17.461 2 12 2z\"></path>\n </svg>\n `,\n alertCircle: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n `,\n check: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n `,\n chevronRight: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n `,\n arrowLeft: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\n <polyline points=\"12 19 5 12 12 5\"></polyline>\n </svg>\n `,\n bot: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\"></rect>\n <circle cx=\"12\" cy=\"5\" r=\"2\"></circle>\n <path d=\"M12 7v4\"></path>\n <line x1=\"8\" y1=\"16\" x2=\"8\" y2=\"16.01\"></line>\n <line x1=\"16\" y1=\"16\" x2=\"16\" y2=\"16.01\"></line>\n </svg>\n `,\n helpCircle: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"></path>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n </svg>\n `,\n rotateCcw: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"1 4 1 10 7 10\"></polyline>\n <path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"></path>\n </svg>\n `,\n square: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n </svg>\n `,\n moreHorizontal: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"1\"></circle>\n <circle cx=\"19\" cy=\"12\" r=\"1\"></circle>\n <circle cx=\"5\" cy=\"12\" r=\"1\"></circle>\n </svg>\n `,\n copy: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n `,\n download: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n `,\n // Session management icons\n folderOpen: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M6 17h12a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3.5\"></path>\n <path d=\"M2 17V5a2 2 0 0 1 2-2h4l2 2h6a2 2 0 0 1 2 2v1\"></path>\n </svg>\n `,\n phone: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path>\n </svg>\n `,\n globe: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line>\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"></path>\n </svg>\n `,\n terminal: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"4 17 10 11 4 5\"></polyline>\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line>\n </svg>\n `,\n zap: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"></polygon>\n </svg>\n `,\n pin: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"22\"></line>\n <path d=\"M5 17h14v-3a2 2 0 0 0-2-2h-3.5\"></path>\n <path d=\"M5 12V7a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v5\"></path>\n <circle cx=\"12\" cy=\"7\" r=\"1\"></circle>\n </svg>\n `,\n pinOff: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"22\"></line>\n <path d=\"M5 17h14v-3a2 2 0 0 0-2-2h-3.5\"></path>\n <path d=\"M5 12V7a2 2 0 0 1 2-2h1\"></path>\n </svg>\n `,\n archive: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"21 8 21 21 3 21 3 8\"></polyline>\n <rect x=\"1\" y=\"3\" width=\"22\" height=\"5\"></rect>\n <line x1=\"10\" y1=\"12\" x2=\"14\" y2=\"12\"></line>\n </svg>\n `,\n archiveRestore: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"21 8 21 21 3 21 3 8\"></polyline>\n <rect x=\"1\" y=\"3\" width=\"22\" height=\"5\"></rect>\n <polyline points=\"10 12 14 12 14 8\"></polyline>\n </svg>\n `,\n trash: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\"></polyline>\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\n </svg>\n `,\n grid: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect>\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect>\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect>\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>\n </svg>\n `,\n list: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"></line>\n </svg>\n `,\n layers: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\"></polygon>\n <polyline points=\"2 17 12 22 22 17\"></polyline>\n <polyline points=\"2 12 12 17 22 12\"></polyline>\n </svg>\n `,\n circle: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n </svg>\n `,\n search: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n `,\n chevronUp: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n `,\n alertTriangle: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n </svg>\n `,\n info: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\n </svg>\n `,\n folder: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"></path>\n </svg>\n `,\n clock: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <polyline points=\"12 6 12 12 16 14\"></polyline>\n </svg>\n `,\n plus: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n `,\n refresh: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\"></polyline>\n <polyline points=\"1 20 1 14 7 14\"></polyline>\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"></path>\n </svg>\n `,\n play: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polygon points=\"5 3 19 12 5 21 5 3\"></polygon>\n </svg>\n `,\n edit: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\n </svg>\n `,\n pause: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"></rect>\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"></rect>\n </svg>\n `,\n refreshCw: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\"></polyline>\n <polyline points=\"1 20 1 14 7 14\"></polyline>\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"></path>\n </svg>\n `,\n checkCircle: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\n <polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\n </svg>\n `,\n xCircle: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\n </svg>\n `,\n loader: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"6\"></line>\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\"></line>\n <line x1=\"4.93\" y1=\"4.93\" x2=\"7.76\" y2=\"7.76\"></line>\n <line x1=\"16.24\" y1=\"16.24\" x2=\"19.07\" y2=\"19.07\"></line>\n <line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\"></line>\n <line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\"></line>\n <line x1=\"4.93\" y1=\"19.07\" x2=\"7.76\" y2=\"16.24\"></line>\n <line x1=\"16.24\" y1=\"7.76\" x2=\"19.07\" y2=\"4.93\"></line>\n </svg>\n `,\n slash: html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\"></line>\n </svg>\n `,\n};\n\n// Document type icons\nexport function getDocumentIcon(mimeType: string): TemplateResult {\n if (mimeType.includes('pdf')) {\n return html`\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#ef4444\" stroke-width=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\n <polyline points=\"14,2 14,8 20,8\"/>\n </svg>\n `;\n }\n if (mimeType.includes('word') || mimeType.includes('document')) {\n return html`\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#2563eb\" stroke-width=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\n <polyline points=\"14,2 14,8 20,8\"/>\n </svg>\n `;\n }\n if (mimeType.includes('sheet') || mimeType.includes('excel')) {\n return html`\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#16a34a\" stroke-width=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\n <polyline points=\"14,2 14,8 20,8\"/>\n </svg>\n `;\n }\n if (mimeType.includes('presentation') || mimeType.includes('powerpoint')) {\n return html`\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#f59e0b\" stroke-width=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\n <polyline points=\"14,2 14,8 20,8\"/>\n </svg>\n `;\n }\n return fallbackIcons.file;\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { getDocumentIcon } from '../../utils/icons';\nimport { t } from '../../utils/i18n';\nimport type { Attachment } from './types';\n\n@customElement('attachment-renderer')\nexport class AttachmentRenderer extends LitElement {\n @property({ attribute: false }) attachments: Attachment[] = [];\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override render(): unknown {\n if (!this.attachments?.length) return null;\n\n const images = this.attachments.filter(att => \n att.type === 'image' || att.mimeType?.startsWith('image/')\n );\n const documents = this.attachments.filter(att => \n att.type !== 'image' && !att.mimeType?.startsWith('image/')\n );\n\n return html`\n <div class=\"flex flex-col gap-2 mt-2\">\n ${images.length > 0 ? this._renderImageGallery(images) : ''}\n ${documents.length > 0 ? this._renderDocumentList(documents) : ''}\n </div>\n `;\n }\n\n private _renderImageGallery(images: Attachment[]): unknown {\n const count = images.length;\n let galleryClass = 'single';\n if (count === 2) galleryClass = 'double';\n else if (count === 3) galleryClass = 'triple';\n else if (count >= 4) galleryClass = 'quad';\n\n return html`\n <div class=\"image-gallery ${galleryClass}\">\n ${images.map((img) => html`\n <img \n src=\"${img.data || img.content}\" \n alt=\"${img.name || t('fileUpload.image')}\" \n @click=${() => this._handleImageClick(img)}\n />\n `)}\n </div>\n `;\n }\n\n private _renderDocumentList(documents: Attachment[]): unknown {\n return html`\n <div class=\"flex flex-col gap-2\">\n ${documents.map((doc) => this._renderDocumentPreview(doc))}\n </div>\n `;\n }\n\n private _renderDocumentPreview(doc: Attachment): unknown {\n const name = doc.name || t('fileUpload.document');\n const size = doc.size ? this._formatFileSize(doc.size) : '';\n\n return html`\n <div class=\"document-preview\" @click=${() => this._handleDocumentClick(doc)}>\n <div class=\"icon\">${getDocumentIcon(doc.mimeType || '')}</div>\n <div class=\"info\">\n <div class=\"name\">${name}</div>\n <div class=\"meta\">${size || doc.mimeType || t('fileUpload.unknown')}</div>\n </div>\n </div>\n `;\n }\n\n private _formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let unitIndex = 0;\n let size = bytes;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n }\n\n private _handleImageClick(img: Attachment): void {\n // Dispatch event for parent to handle (e.g., open lightbox)\n this.dispatchEvent(new CustomEvent('image-click', { \n detail: img,\n bubbles: true,\n composed: true \n }));\n }\n\n private _handleDocumentClick(doc: Attachment): void {\n this.dispatchEvent(new CustomEvent('document-click', { \n detail: doc,\n bubbles: true,\n composed: true \n }));\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { MessageContent } from './types';\n\n@customElement('usage-badge')\nexport class UsageBadge extends LitElement {\n @property({ attribute: false }) usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cost?: number;\n };\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override render(): unknown {\n if (!this.usage) return null;\n\n const parts: string[] = [];\n \n if (this.usage.totalTokens !== undefined) {\n parts.push(`${this.usage.totalTokens} tokens`);\n } else if (this.usage.inputTokens !== undefined && this.usage.outputTokens !== undefined) {\n parts.push(`${this.usage.inputTokens + this.usage.outputTokens} tokens`);\n }\n \n if (this.usage.cost !== undefined && this.usage.cost > 0) {\n parts.push(`$${this.usage.cost.toFixed(4)}`);\n }\n\n if (parts.length === 0) return null;\n\n return html`\n <span class=\"usage-badge\">\n ${parts.join(' · ')}\n </span>\n `;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { t } from '../../utils/i18n';\nimport type { Message, MessageContent } from './types';\nimport './AttachmentRenderer';\nimport './UsageBadge';\n\n@customElement('message-bubble')\nexport class MessageBubble extends LitElement {\n @property({ attribute: false }) message!: Message;\n @property({ type: Boolean }) isStreaming = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override render(): unknown {\n const isUser = this.message.role === 'user' || this.message.role === 'user-with-attachments';\n const isAssistant = this.message.role === 'assistant';\n const isTool = this.message.role === 'tool' || this.message.role === 'tool_result';\n\n const roleLabel = isUser ? t('chat.you') : isAssistant ? t('chat.assistant') : t('chat.tool');\n const avatarLetter = roleLabel.charAt(0);\n\n return html`\n <div class=\"message-item ${isUser ? 'flex-row-reverse' : ''}\">\n <div class=\"avatar ${isUser ? 'user' : isAssistant ? 'assistant' : 'tool'}\">\n ${avatarLetter}\n </div>\n\n <div class=\"flex flex-col gap-1 max-w-[85%]\">\n <div class=\"flex items-center gap-2 text-xs text-muted\">\n <span class=\"font-medium\">${roleLabel}</span>\n <span>·</span>\n <span>${this._formatTime(this.message.timestamp)}</span>\n ${this.isStreaming ? html`<span class=\"text-primary animate-pulse\">${t('chat.thinking')}</span>` : ''}\n </div>\n\n <div class=\"message-bubble ${isUser ? 'bg-primary-light' : 'bg-secondary'}\">\n ${this._renderContent(this.message.content)}\n ${this.message.attachments?.length ? html`\n <attachment-renderer .attachments=${this.message.attachments}></attachment-renderer>\n ` : ''}\n </div>\n\n ${isAssistant && this.message.usage ? html`\n <usage-badge .usage=${this.message.usage}></usage-badge>\n ` : ''}\n </div>\n </div>\n `;\n }\n\n private _renderContent(content: MessageContent[]): unknown {\n if (!content || content.length === 0) {\n return this.isStreaming ? html`<span class=\"streaming-cursor\"></span>` : null;\n }\n\n return html`\n <div class=\"markdown-content\">\n ${content.map((block) => this._renderContentBlock(block))}\n ${this.isStreaming ? html`<span class=\"streaming-cursor\"></span>` : ''}\n </div>\n `;\n }\n\n private _renderContentBlock(block: MessageContent): unknown {\n switch (block.type) {\n case 'text':\n if (block.text) {\n return html`<p class=\"whitespace-pre-wrap\">${block.text}</p>`;\n }\n break;\n \n case 'image':\n if (block.source?.data) {\n return html`<img src=\"${block.source.data}\" class=\"rounded-lg max-w-full\" />`;\n }\n break;\n \n case 'tool_use':\n case 'tool_result':\n return this._renderToolCall(block);\n \n default:\n // Handle unknown content types gracefully\n if (block.text) {\n return html`<p class=\"whitespace-pre-wrap\">${block.text}</p>`;\n }\n }\n return null;\n }\n\n private _renderToolCall(block: MessageContent): unknown {\n const isError = block.is_error || block.error;\n const name = block.name || block.function?.name || 'Tool';\n const input = block.input || block.function?.arguments;\n\n return html`\n <div class=\"tool-call ${isError ? 'tool-call--error' : ''}\">\n <div class=\"tool-call-header\">\n <span>🔧 ${name}</span>\n ${isError ? html`<span class=\"text-red-500 text-xs\">Error</span>` : ''}\n </div>\n ${input ? html`\n <pre class=\"tool-call-content\">${JSON.stringify(input, null, 2)}</pre>\n ` : ''}\n ${block.content ? html`\n <div class=\"tool-call-result\">${JSON.stringify(block.content)}</div>\n ` : ''}\n </div>\n `;\n }\n\n private _formatTime(timestamp?: number): string {\n if (!timestamp) return '';\n return new Date(timestamp).toLocaleTimeString([], { \n hour: '2-digit', \n minute: '2-digit' \n });\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { t } from '../../utils/i18n';\nimport type { Message } from './types';\nimport './MessageBubble';\n\n@customElement('message-list')\nexport class MessageList extends LitElement {\n @property({ attribute: false }) messages: Message[] = [];\n @property({ type: Boolean }) isStreaming = false;\n @property({ type: Boolean }) useVirtualScroll = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override render(): unknown {\n if (!this.messages || this.messages.length === 0) {\n return this._renderEmptyState();\n }\n\n return html`\n <div class=\"flex flex-col gap-4 pb-4\">\n ${this.messages.map((message, index) => html`\n <message-bubble \n .message=${message}\n .isStreaming=${this.isStreaming && index === this.messages.length - 1}\n ></message-bubble>\n `)}\n </div>\n `;\n }\n\n private _renderEmptyState(): unknown {\n return html`\n <div class=\"empty-state\">\n <div class=\"icon\">💬</div>\n <div class=\"title\">${t('chat.emptyState')}</div>\n <div class=\"description\">${t('chat.emptyStateDescription')}</div>\n </div>\n `;\n }\n\n // Scroll to bottom\n scrollToBottom(): void {\n const container = this.closest('.overflow-y-auto');\n if (container) {\n container.scrollTop = container.scrollHeight;\n }\n }\n\n // Check if scrolled near bottom\n isNearBottom(threshold = 100): boolean {\n const container = this.closest('.overflow-y-auto');\n if (!container) return true;\n \n const { scrollTop, scrollHeight, clientHeight } = container;\n return scrollHeight - scrollTop - clientHeight < threshold;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\ninterface MessageContent {\n type: string;\n text?: string;\n name?: string;\n input?: any;\n function?: { name?: string; arguments?: any };\n}\n\n@customElement('streaming-message-container')\nexport class StreamingMessageContainer extends LitElement {\n @property({ attribute: false }) tools: Map<string, any> = new Map();\n @property({ attribute: false }) pendingToolCalls: Set<string> = new Set();\n @property({ type: Boolean }) isStreaming = false;\n\n @state() private _currentMessage: any = null;\n @state() private _isComplete = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n public setMessage(message: any, isComplete: boolean): void {\n this._currentMessage = message;\n this._isComplete = isComplete;\n }\n\n override render(): unknown {\n if (!this._currentMessage) return null;\n\n return html`\n <div class=\"flex gap-3 message-item\">\n <div class=\"avatar assistant\">\n AI\n </div>\n \n <div class=\"flex flex-col gap-1 max-w-[85%]\">\n <div class=\"flex items-center gap-2 text-xs text-muted\">\n <span class=\"font-medium\">Assistant</span>\n <span>·</span>\n <span class=\"text-accent animate-pulse\">thinking...</span>\n </div>\n \n <div class=\"rounded-xl p-3 bg-secondary\">\n ${this.renderStreamingContent()}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderStreamingContent(): unknown {\n const content = this._currentMessage?.content || [];\n \n return html`\n <div class=\"markdown-content\">\n ${content.map((block: MessageContent) => {\n if (block.type === 'text') {\n return html`<p class=\"whitespace-pre-wrap\">${this._escapeHtml(block.text || '')}<span class=\"streaming-cursor\"></span></p>`;\n }\n if (block.type === 'tool_use') {\n return this.renderToolUse(block);\n }\n return '';\n })}\n ${this.isStreaming && (!content.length || content[content.length - 1]?.type !== 'text') ? html`<span class=\"streaming-cursor\"></span>` : ''}\n </div>\n `;\n }\n\n private renderToolUse(block: MessageContent): unknown {\n const name = block.name || block.function?.name;\n const input = block.input || block.function?.arguments || {};\n \n const inputStr = typeof input === 'string' ? input : JSON.stringify(input, null, 2);\n \n return html`\n <div class=\"tool-call\">\n <div class=\"name\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/>\n </svg>\n <span>${name}</span>\n </div>\n <pre class=\"input\">${inputStr}</pre>\n </div>\n `;\n }\n\n private _escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport './components/MessageEditor';\nimport './components/MessageList';\nimport './components/StreamingMessageContainer';\nimport { t, initI18n } from './utils/i18n';\nimport type { Attachment } from './utils/attachment-utils';\nimport type { MessageEditor } from './components/MessageEditor';\nimport type { ChatRoute } from './navigation';\n\n// ---------- Types ----------\n\nexport type ChatPayload = {\n type?: 'status' | 'token' | 'error';\n content?: string;\n status?: 'ok' | 'complete' | 'error';\n runId?: string;\n sessionKey?: string;\n message?: unknown;\n errorMessage?: string;\n};\n\nexport type ErrorPayload = {\n code: string;\n message: string;\n};\n\nexport type GatewayClientConfig = {\n /** Base HTTP URL, e.g. \"http://localhost:3000\" */\n url: string;\n token?: string;\n autoReconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectDelay?: number;\n};\n\ninterface Message {\n role: 'user' | 'assistant';\n content: Array<{ type: string; text?: string }>;\n attachments?: Array<{ type: string; mimeType?: string; data?: string; name?: string; size?: number }>;\n timestamp: number;\n}\n\ntype ConnectionState = 'connecting' | 'connected' | 'disconnected' | 'reconnecting' | 'error';\n\n// ---------- Helpers ----------\n\n/** Build an HTTP URL from the config (strip trailing slashes, ensure /api prefix). */\nfunction apiUrl(base: string, path: string): string {\n const clean = base.replace(/\\/+$/, '');\n return `${clean}${path}`;\n}\n\nfunction authHeaders(token?: string): Record<string, string> {\n const h: Record<string, string> = { 'Content-Type': 'application/json' };\n if (token) h['Authorization'] = `Bearer ${token}`;\n return h;\n}\n\n// ---------- Component ----------\n\n@customElement('xopcbot-gateway-chat')\nexport class XopcbotGatewayChat extends LitElement {\n @property({ attribute: false }) config?: GatewayClientConfig;\n @property({ attribute: false }) route?: ChatRoute;\n @property({ type: Boolean }) enableAttachments = true;\n @property({ type: Boolean }) enableModelSelector = true;\n\n @query('message-editor') private _messageEditor!: MessageEditor;\n @query('.chat-messages') private _chatMessages!: HTMLElement;\n\n @state() private _connectionState: ConnectionState = 'disconnected';\n @state() private _error: string | null = null;\n @state() private _messages: Message[] = [];\n @state() private _isStreaming = false;\n @state() private _streamingContent = '';\n @state() private _streamingMessage: Message | null = null;\n @state() private _reconnectCount = 0;\n @state() private _isAtBottom = true;\n @state() private _currentSessionKey: string | null = null;\n @state() private _sessions: Array<{ key: string; name?: string; updatedAt: string }> = [];\n @state() private _hasMoreMessages = true; // For pagination\n @state() private _isLoadingMore = false;\n\n /** SSE event source for server-pushed events */\n private _eventSource?: EventSource;\n /** AbortController for the current agent POST request */\n private _agentAbort?: AbortController;\n private _shouldReconnect = true;\n private _isSending = false;\n private _lastLoadedSessionKey: string | null = null;\n\n // Configurable reconnection settings\n private get _maxReconnectAttempts(): number {\n return this.config?.maxReconnectAttempts ?? 10;\n }\n\n private get _autoReconnect(): boolean {\n return this.config?.autoReconnect ?? true;\n }\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override async connectedCallback(): Promise<void> {\n super.connectedCallback();\n this.classList.add('chat-container');\n await initI18n('en');\n }\n\n override firstUpdated(): void {\n // Add scroll listener directly to chat messages element after render\n if (this._chatMessages) {\n this._chatMessages.addEventListener('scroll', this._handleScroll as EventListener);\n }\n\n // Load session based on current route\n this._handleRouteChange();\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n \n // Connect when config changes and disconnected\n if (changedProperties.has('config') && this.config && this._connectionState === 'disconnected') {\n this.connect();\n }\n \n // Reload session when route changes\n if (changedProperties.has('route') && this.route) {\n this._handleRouteChange();\n }\n }\n\n /**\n * Handle route changes - load appropriate session\n */\n private async _handleRouteChange(): Promise<void> {\n const route = this.route;\n if (!route) return;\n\n // Get target session key from route\n let targetSessionKey: string | null = null;\n\n switch (route.type) {\n case 'recent':\n // Reset last loaded key to force reload of most recent session\n this._lastLoadedSessionKey = null;\n // Load recent sessions - this will load the most recent one\n await this._loadSessions();\n return;\n case 'session':\n targetSessionKey = route.sessionKey;\n break;\n case 'new':\n await this._createNewSession();\n return;\n }\n\n // If we have a target session, load it directly\n if (targetSessionKey) {\n if (targetSessionKey !== this._lastLoadedSessionKey) {\n await this._loadSession(targetSessionKey, 0); // Load with offset 0\n this._lastLoadedSessionKey = targetSessionKey;\n }\n }\n }\n\n /**\n * Load session with pagination support\n */\n private async _loadSession(sessionKey: string, offset = 0): Promise<void> {\n if (!this.config) return;\n\n try {\n const url = apiUrl(this.config.url, `/api/sessions/${encodeURIComponent(sessionKey)}?offset=${offset}&limit=50`);\n const headers = authHeaders(this.config.token);\n const res = await fetch(url, { headers });\n \n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n \n const data = await res.json();\n const session = data.session;\n \n this._currentSessionKey = sessionKey;\n \n // Convert session messages to UI format\n const messages = session.messages || [];\n const newMessages = messages\n .filter((msg: any) => msg.role === 'user' || msg.role === 'assistant')\n .map((msg: any) => ({\n role: msg.role,\n content: typeof msg.content === 'string' \n ? [{ type: 'text', text: msg.content }] \n : (msg.content || []),\n attachments: msg.attachments,\n timestamp: msg.timestamp ? new Date(msg.timestamp).getTime() : Date.now(),\n }));\n \n // Handle pagination - prepend if loading older messages\n if (offset > 0) {\n this._messages = [...newMessages, ...this._messages];\n } else {\n this._messages = newMessages;\n }\n \n // Check if there are more messages to load\n this._hasMoreMessages = messages.length >= 50;\n\n // Scroll to bottom only on initial load (instant scroll, no animation)\n if (offset === 0) {\n this._scrollToBottom(false);\n }\n this.requestUpdate();\n } catch (err) {\n console.error('[GatewayChat] Failed to load session:', err);\n }\n }\n\n /**\n * Load more messages when user scrolls to top\n */\n private async _loadMoreMessages(): Promise<void> {\n if (!this._currentSessionKey || this._isLoadingMore || !this._hasMoreMessages) return;\n \n this._isLoadingMore = true;\n const offset = this._messages.length;\n \n try {\n await this._loadSession(this._currentSessionKey, offset);\n } finally {\n this._isLoadingMore = false;\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._shouldReconnect = false;\n this.disconnect();\n // Remove scroll listener from chat messages element\n if (this._chatMessages) {\n this._chatMessages.removeEventListener('scroll', this._handleScroll as EventListener);\n }\n }\n\n // ========== Scroll handling ==========\n\n private _handleScroll = (): void => {\n if (!this._chatMessages) return;\n const { scrollTop, scrollHeight, clientHeight } = this._chatMessages;\n const atBottom = scrollHeight - scrollTop - clientHeight < 50;\n\n // Update bottom state\n if (atBottom !== this._isAtBottom) {\n this._isAtBottom = atBottom;\n }\n\n // Load more when scrolling to top\n if (scrollTop < 100 && !this._isAtBottom && this._hasMoreMessages && !this._isLoadingMore) {\n this._loadMoreMessages();\n }\n };\n\n private _scrollToBottom(smooth = true): void {\n // Wait for DOM update before scrolling to ensure messages are rendered\n this.updateComplete.then(() => {\n if (this._chatMessages) {\n this._chatMessages.scrollTo({\n top: this._chatMessages.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto'\n });\n }\n });\n }\n\n // ========== Connection (SSE for server-push) ==========\n\n connect(): void {\n if (!this.config || this._connectionState === 'connecting') return;\n\n this._connectionState = 'connecting';\n this._error = null;\n this.requestUpdate();\n\n try {\n const eventsUrl = apiUrl(this.config.url, '/api/events');\n const url = new URL(eventsUrl);\n if (this.config.token) url.searchParams.set('token', this.config.token);\n\n this._eventSource = new EventSource(url.toString());\n\n // EventSource fires onopen when the connection is established\n this._eventSource.onopen = () => {\n this._connectionState = 'connected';\n this._error = null;\n this._reconnectCount = 0;\n this.requestUpdate();\n // Load sessions after connection is established (only if not already loaded)\n if (!this._lastLoadedSessionKey) {\n this._loadSessions();\n }\n };\n\n // Also listen for our custom 'connected' event from the server\n this._eventSource.addEventListener('connected', () => {\n this._connectionState = 'connected';\n this._error = null;\n this.requestUpdate();\n });\n\n this._eventSource.addEventListener('config.reload', (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.dispatchEvent(new CustomEvent('config-reload', { detail: data }));\n } catch { /* ignore */ }\n });\n\n this._eventSource.addEventListener('channels.status', (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.dispatchEvent(new CustomEvent('channels-status', { detail: data }));\n } catch { /* ignore */ }\n });\n\n this._eventSource.addEventListener('message.sent', (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data);\n this.dispatchEvent(new CustomEvent('message-sent', { detail: data }));\n } catch { /* ignore */ }\n });\n\n // EventSource auto-reconnects on error. Handle permanent disconnection.\n // readyState: 0=CONNECTING, 1=OPEN, 2=CLOSED\n this._eventSource.onerror = () => {\n if (this._eventSource?.readyState === EventSource.CLOSED) {\n // Permanently closed - EventSource has given up auto-reconnect\n this._connectionState = 'disconnected';\n this._handlePermanentDisconnect();\n } else {\n // CONNECTING - EventSource is auto-reconnecting\n this._connectionState = 'reconnecting';\n }\n this.requestUpdate();\n };\n } catch (err) {\n console.error('[GatewayChat] Failed to create EventSource:', err);\n this._connectionState = 'error';\n this._error = t('errors.connectionError');\n this.requestUpdate();\n }\n }\n\n private _handlePermanentDisconnect(): void {\n // Reset streaming state if interrupted\n if (this._isStreaming) {\n this._isStreaming = false;\n this._isSending = false;\n this._streamingContent = '';\n this._streamingMessage = null;\n }\n\n // Auto-reconnect with exponential backoff (EventSource handles it)\n if (this._shouldReconnect && this._autoReconnect) {\n this._reconnectCount++;\n if (this._reconnectCount > this._maxReconnectAttempts) {\n this._error = t('errors.connectionError');\n this._connectionState = 'error';\n }\n // EventSource will auto-reconnect, no manual timer needed\n }\n }\n\n disconnect(): void {\n this._shouldReconnect = false;\n this._eventSource?.close();\n this._eventSource = undefined;\n this._agentAbort?.abort();\n this._agentAbort = undefined;\n this._connectionState = 'disconnected';\n }\n\n reconnect(): void {\n this._shouldReconnect = true;\n this._reconnectCount = 0;\n this.disconnect();\n setTimeout(() => this.connect(), 100);\n }\n\n // ========== Session management ==========\n\n private async _loadSessions(): Promise<void> {\n if (!this.config) {\n return;\n }\n\n try {\n const url = apiUrl(this.config.url, '/api/sessions?limit=20');\n const headers = authHeaders(this.config.token);\n const res = await fetch(url, { headers });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n const data = await res.json();\n const sessions = data.items || [];\n\n // Filter gateway sessions and sort by updatedAt (newest first)\n const gatewaySessions = sessions\n .filter((s: any) => s.key.startsWith('gateway:'))\n .sort((a: any, b: any) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n\n this._sessions = gatewaySessions;\n\n // Filter out empty sessions and get sessions with messages\n const sessionsWithMessages = gatewaySessions.filter((s: any) => s.messageCount > 0);\n\n if (sessionsWithMessages.length > 0) {\n // Load the most recent session with messages\n const recentKey = sessionsWithMessages[0].key;\n await this._loadSession(recentKey, 0);\n this._lastLoadedSessionKey = recentKey;\n\n // Update URL to reflect current session\n this._updateUrlWithSession(recentKey);\n } else if (gatewaySessions.length > 0) {\n // No sessions with messages, use the most recent empty session\n const emptySession = gatewaySessions[0];\n this._currentSessionKey = emptySession.key;\n this._messages = [];\n this._lastLoadedSessionKey = emptySession.key;\n this._updateUrlWithSession(emptySession.key);\n } else {\n // No sessions at all, create a new one\n await this._createNewSession();\n }\n } catch (err) {\n console.error('[GatewayChat] Failed to load sessions:', err);\n }\n }\n\n /**\n * Update URL hash with session key\n */\n private _updateUrlWithSession(sessionKey: string): void {\n const newHash = `#/chat/${encodeURIComponent(sessionKey)}`;\n if (location.hash !== newHash) {\n history.replaceState(null, '', newHash);\n }\n }\n\n async _createNewSession(): Promise<void> {\n if (!this.config) return;\n\n // Check if there's already an empty session\n const emptySession = this._sessions.find((s: any) => s.messageCount === 0);\n if (emptySession) {\n // Navigate to existing empty session instead of creating a new one\n this._currentSessionKey = emptySession.key;\n this._messages = [];\n this._lastLoadedSessionKey = emptySession.key;\n this._updateUrlWithSession(emptySession.key);\n return;\n }\n\n try {\n const url = apiUrl(this.config.url, '/api/sessions');\n const headers = {\n ...authHeaders(this.config.token),\n 'Content-Type': 'application/json',\n };\n \n const res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ channel: 'gateway' }),\n });\n \n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n \n const data = await res.json();\n const session = data.session;\n \n this._currentSessionKey = session.key;\n this._messages = [];\n \n // Add to sessions list\n this._sessions = [{\n key: session.key,\n name: session.name,\n updatedAt: session.updatedAt,\n }, ...this._sessions];\n \n this._currentSessionKey = session.key;\n this._lastLoadedSessionKey = session.key;\n \n // Update URL to reflect new session\n this._updateUrlWithSession(session.key);\n \n this._scrollToBottom();\n this.requestUpdate();\n } catch (err) {\n console.error('[GatewayChat] Failed to create new session:', err);\n }\n }\n\n // ========== Agent messaging (POST + SSE response) ==========\n\n async sendMessage(\n content: string,\n attachments?: Array<{ type: string; mimeType?: string; data?: string; name?: string; size?: number }>,\n ): Promise<void> {\n if (this._isSending || this._isStreaming) return;\n if (!content.trim() && !attachments?.length) return;\n if (!this.config) return;\n\n this._isSending = true;\n\n // Add user message to UI\n this._messages = [\n ...this._messages,\n {\n role: 'user',\n content: content ? [{ type: 'text', text: content }] : [],\n attachments,\n timestamp: Date.now(),\n },\n ];\n this._scrollToBottom();\n this.requestUpdate();\n\n try {\n this._agentAbort = new AbortController();\n const url = apiUrl(this.config.url, '/api/agent');\n const headers = {\n ...authHeaders(this.config.token),\n Accept: 'text/event-stream',\n };\n\n // Extract chatId from current session key (format: \"gateway:chat_xxx\")\n const chatId = this._currentSessionKey\n ? this._currentSessionKey.replace('gateway:', '')\n : 'default';\n\n const res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n message: content,\n channel: 'gateway',\n chatId,\n attachments,\n }),\n signal: this._agentAbort.signal,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body.error?.message || `HTTP ${res.status}`);\n }\n\n const contentType = res.headers.get('Content-Type') || '';\n\n if (contentType.includes('text/event-stream') && res.body) {\n // --- SSE stream ---\n await this._consumeSSEStream(res.body);\n } else {\n // --- JSON fallback ---\n const json = await res.json();\n if (json.ok && json.payload?.content) {\n this._updateStreamingMessage(json.payload.content);\n this._finalizeMessage();\n }\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') return; // user aborted\n this._error = error instanceof Error ? error.message : t('errors.sendFailed');\n this._isStreaming = false;\n this._isSending = false;\n this._streamingMessage = null;\n this.requestUpdate();\n } finally {\n this._agentAbort = undefined;\n this._isSending = false;\n }\n }\n\n /** Consume a fetch ReadableStream as SSE events. */\n private async _consumeSSEStream(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.pipeThrough(new TextDecoderStream()).getReader();\n let buffer = '';\n // State for multi-line data handling\n let currentEventType = '';\n let currentEventData = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += value;\n\n // Process complete lines\n while (buffer.includes('\\n')) {\n const newlineIndex = buffer.indexOf('\\n');\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n\n if (line.startsWith('event:')) {\n currentEventType = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n // Append data (support multi-line data)\n currentEventData += (currentEventData ? '\\n' : '') + line.slice(5).trim();\n } else if (line === '') {\n // Empty line = event boundary\n if (currentEventData) {\n this._handleSSEEvent(currentEventType || 'message', currentEventData);\n currentEventType = '';\n currentEventData = '';\n }\n }\n // Ignore other lines (id:, retry:, etc.)\n }\n }\n\n // Process remaining buffer (last event may not have trailing newline)\n if (buffer.trim() || currentEventData) {\n if (buffer.trim()) {\n const lines = buffer.split('\\n');\n for (const line of lines) {\n if (line.startsWith('event:')) {\n currentEventType = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n currentEventData += (currentEventData ? '\\n' : '') + line.slice(5).trim();\n } else if (line === '' && currentEventData) {\n this._handleSSEEvent(currentEventType || 'message', currentEventData);\n currentEventType = '';\n currentEventData = '';\n }\n }\n }\n // If we still have unprocessed data, emit it\n if (currentEventData) {\n this._handleSSEEvent(currentEventType || 'message', currentEventData);\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private _handleSSEEvent(event: string, data: string): void {\n try {\n const parsed = JSON.parse(data);\n\n switch (event) {\n case 'status':\n this._isStreaming = true;\n this.requestUpdate();\n break;\n\n case 'token':\n if (parsed.content) {\n this._updateStreamingMessage(parsed.content);\n }\n break;\n\n case 'error':\n this._error = parsed.content || parsed.error?.message || t('errors.sendFailed');\n this._isStreaming = false;\n this._isSending = false;\n this._streamingMessage = null;\n this.requestUpdate();\n break;\n\n case 'result':\n this._finalizeMessage();\n break;\n\n default:\n // Unknown event type — treat as token if it has content\n if (parsed.content) {\n this._updateStreamingMessage(parsed.content);\n }\n break;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // ========== Streaming message helpers ==========\n\n private _updateStreamingMessage(content: string): void {\n if (this._streamingMessage) {\n const textBlock = this._streamingMessage.content.find(b => b.type === 'text');\n if (textBlock) {\n textBlock.text = (textBlock.text || '') + content;\n } else {\n this._streamingMessage.content.push({ type: 'text', text: content });\n }\n } else {\n this._streamingMessage = {\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n timestamp: Date.now(),\n };\n }\n this._isStreaming = true;\n this._streamingContent = content;\n this.requestUpdate();\n\n // Auto-scroll to bottom while streaming if user is at bottom\n if (this._isAtBottom) {\n this._scrollToBottom();\n }\n }\n\n private _finalizeMessage(): void {\n if (this._streamingMessage) {\n this._messages = [...this._messages, this._streamingMessage];\n this._streamingMessage = null;\n }\n this._isStreaming = false;\n this._streamingContent = '';\n this._isSending = false;\n \n // Auto-scroll to bottom if user is at bottom\n if (this._isAtBottom) {\n this._scrollToBottom();\n }\n this.requestUpdate();\n }\n\n // ========== Public HTTP API ==========\n\n /** Generic REST request helper for external components. */\n public async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n if (!this.config) throw new Error('Not configured');\n\n const url = apiUrl(this.config.url, path);\n const res = await fetch(url, {\n method,\n headers: authHeaders(this.config.token),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: { message: `HTTP ${res.status}` } }));\n throw new Error(err.error?.message || `HTTP ${res.status}`);\n }\n\n return res.json() as Promise<T>;\n }\n\n abort(): void {\n this._agentAbort?.abort();\n this._agentAbort = undefined;\n this._isStreaming = false;\n this._isSending = false;\n this._streamingContent = '';\n this._streamingMessage = null;\n this.requestUpdate();\n }\n\n // Public getters\n public get connectionState(): ConnectionState {\n return this._connectionState;\n }\n\n public get messages(): Message[] {\n return this._messages;\n }\n\n public clearMessages(): void {\n this._messages = [];\n this.requestUpdate();\n }\n\n // ========== Render ==========\n\n override render(): unknown {\n return html`\n ${this._renderStatus()}\n ${this._renderHeader()}\n\n <div class=\"chat-messages\">\n <div class=\"chat-messages-inner\">\n ${this._renderMessages()}\n </div>\n </div>\n\n <!-- Scroll to bottom button - placed outside overflow container -->\n ${!this._isAtBottom ? html`\n <button\n class=\"scroll-to-bottom-btn\"\n style=\"position: fixed; bottom: 100px; right: 24px; width: 48px; height: 48px; border-radius: 50%; background: #3b82f6; color: white; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 100;\"\n @click=${this._scrollToBottom}\n title=\"Scroll to bottom\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>\n </button>\n ` : ''}\n\n <div class=\"chat-input-container\">\n <div class=\"chat-input-inner\">\n ${this._renderInput()}\n </div>\n </div>\n `;\n }\n\n private _renderHeader(): unknown {\n return html`\n <div class=\"chat-header\">\n <div class=\"chat-header-title\">\n <span class=\"font-semibold\">${t('chat.title') || 'XopcBot'}</span>\n ${this._currentSessionKey ? html`\n <span class=\"text-xs text-muted ml-2\">${this._sessions.find(s => s.key === this._currentSessionKey)?.name || this._currentSessionKey}</span>\n ` : ''}\n </div>\n <button class=\"new-session-btn\" @click=${() => this._createNewSession()}>\n ${this._renderIcon('plus')}\n <span>${t('chat.newSession') || 'New Chat'}</span>\n </button>\n </div>\n `;\n }\n\n private _renderStatus(): unknown {\n if (this._connectionState === 'error' && this._error) {\n return html`\n <div class=\"status-bar error\">\n ${this._renderIcon('alertCircle')}\n <span>${this._error}</span>\n <button class=\"underline ml-auto\" @click=${() => this.reconnect()}>${t('chat.retry')}</button>\n </div>\n `;\n }\n \n if (this._connectionState === 'reconnecting') {\n return html`\n <div class=\"status-bar warning\">\n <div class=\"w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n <span>${t('chat.reconnecting')}</span>\n </div>\n `;\n }\n \n if (this._connectionState === 'connecting') {\n return html`\n <div class=\"status-bar warning\">\n <div class=\"w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n <span>${t('chat.connecting')}</span>\n </div>\n `;\n }\n \n return null;\n }\n\n private _renderIcon(name: string): unknown {\n const icons: Record<string, unknown> = {\n alertCircle: html`\n <svg class=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n `,\n chevronDown: html`\n <svg class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"/>\n </svg>\n `,\n plus: html`\n <svg class=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>\n `,\n };\n return icons[name] || '';\n }\n\n private _renderScrollToBottomButton(): unknown {\n return html`\n <button\n class=\"scroll-to-bottom-btn\"\n style=\"background: red !important; width: 60px; height: 60px; font-size: 24px;\"\n @click=${this._scrollToBottom}\n title=\"Scroll to bottom\"\n >\n 👇\n </button>\n `;\n }\n\n private _renderMessages(): unknown {\n if (!this._messages.length && !this._isStreaming) {\n return html`\n <div class=\"empty-state\" style=\"padding-top: 30vh;\">\n <div class=\"icon\">🤖</div>\n <div class=\"title\">${t('chat.welcomeTitle')}</div>\n <div class=\"description\">${t('chat.welcomeDescription')}</div>\n </div>\n `;\n }\n\n return html`\n <div class=\"flex flex-col gap-4\">\n ${this._messages.map(msg => this._renderMessage(msg))}\n ${this._isStreaming && this._streamingMessage ? this._renderStreamingMessage() : ''}\n </div>\n `;\n }\n\n private _renderMessage(message: Message): unknown {\n const isUser = message.role === 'user';\n const hasContent = message.content?.some((block) => block.text);\n if (!hasContent && !message.attachments?.length) return null;\n\n return html`\n <div class=\"message-item ${isUser ? 'flex-row-reverse' : ''}\">\n <div class=\"avatar ${isUser ? 'user' : 'assistant'}\">\n ${isUser ? t('chat.you').charAt(0) : 'X'}\n </div>\n \n <div class=\"flex flex-col gap-1 max-w-[calc(100%-3rem)]\">\n <div class=\"flex items-center gap-2 text-xs text-muted ${isUser ? 'flex-row-reverse' : ''}\">\n <span class=\"font-medium\">${isUser ? t('chat.you') : t('chat.assistant')}</span>\n <span>·</span>\n <span>${this._formatTime(message.timestamp)}</span>\n </div>\n \n <div class=\"message-bubble ${isUser ? 'user' : 'assistant'}\">\n ${this._renderMessageContent(message.content)}\n ${message.attachments?.length ? this._renderAttachments(message.attachments) : ''}\n </div>\n </div>\n </div>\n `;\n }\n\n private _renderStreamingMessage(): unknown {\n const content = this._streamingMessage?.content || [];\n \n return html`\n <div class=\"message-item\">\n <div class=\"avatar assistant\">X</div>\n <div class=\"flex flex-col gap-1 max-w-[calc(100%-3rem)]\">\n <div class=\"flex items-center gap-2 text-xs text-muted\">\n <span class=\"font-medium\">${t('chat.assistant')}</span>\n <span>·</span>\n <span class=\"text-primary animate-pulse\">${t('chat.thinking')}</span>\n </div>\n <div class=\"message-bubble assistant\">\n <div class=\"markdown-content\">\n ${content.map((block) => {\n if (block.type === 'text' && block.text) {\n return html`<p class=\"whitespace-pre-wrap\">${block.text}<span class=\"streaming-cursor\"></span></p>`;\n }\n return '';\n })}\n ${!content.length ? html`<span class=\"streaming-cursor\"></span>` : ''}\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n private _renderMessageContent(content: Array<{ type: string; text?: string }>): unknown {\n if (!content || content.length === 0) return null;\n return html`\n <div class=\"markdown-content\">\n ${content.map((block) => {\n if (block.type === 'text' && block.text) {\n return html`<p class=\"whitespace-pre-wrap\">${block.text}</p>`;\n }\n return '';\n })}\n </div>\n `;\n }\n\n private _renderAttachments(attachments: Array<{ type: string; mimeType?: string; data?: string; name?: string; size?: number }>): unknown {\n const images = attachments.filter(att => att.type === 'image' || att.mimeType?.startsWith('image/'));\n const documents = attachments.filter(att => att.type !== 'image' && !att.mimeType?.startsWith('image/'));\n \n return html`\n <div class=\"flex flex-col gap-2 mt-2\">\n ${images.length > 0 ? this._renderImageGallery(images) : ''}\n ${documents.length > 0 ? this._renderDocumentList(documents) : ''}\n </div>\n `;\n }\n\n private _renderImageGallery(images: Array<{ data?: string; name?: string }>): unknown {\n const count = images.length;\n let galleryClass = 'single';\n if (count === 2) galleryClass = 'double';\n else if (count === 3) galleryClass = 'triple';\n else if (count >= 4) galleryClass = 'quad';\n \n return html`\n <div class=\"image-gallery ${galleryClass}\">\n ${images.map((img) => html`<img src=\"${img.data}\" alt=\"${img.name || 'Image'}\" />`)}\n </div>\n `;\n }\n\n private _renderDocumentList(documents: Array<{ mimeType?: string; name?: string; size?: number }>): unknown {\n return html`\n <div class=\"flex flex-col gap-2\">\n ${documents.map((doc) => this._renderDocumentPreview(doc))}\n </div>\n `;\n }\n\n private _renderDocumentPreview(doc: { mimeType?: string; name?: string; size?: number }): unknown {\n const name = doc.name || 'Document';\n const size = doc.size ? this._formatFileSize(doc.size) : '';\n \n return html`\n <div class=\"document-preview\">\n <div class=\"icon\">${this._getDocumentIcon(doc.mimeType || '')}</div>\n <div class=\"info\">\n <div class=\"name\">${name}</div>\n <div class=\"meta\">${size || doc.mimeType || 'File'}</div>\n </div>\n </div>\n `;\n }\n\n private _getDocumentIcon(mimeType: string): unknown {\n const color = mimeType.includes('pdf') ? '#ef4444'\n : (mimeType.includes('word') || mimeType.includes('document')) ? '#2563eb'\n : (mimeType.includes('sheet') || mimeType.includes('excel')) ? '#16a34a'\n : 'currentColor';\n\n return html`\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${color}\" stroke-width=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\n <polyline points=\"14,2 14,8 20,8\"/>\n </svg>\n `;\n }\n\n private _renderInput(): unknown {\n return html`\n <message-editor\n .isStreaming=${this._isStreaming}\n .showAttachmentButton=${this.enableAttachments}\n .showModelSelector=${this.enableModelSelector}\n .onSend=${(input: string, attachments: Attachment[]) => this._handleSend(input, attachments)}\n .onAbort=${() => this.abort()}\n ></message-editor>\n `;\n }\n\n private _handleSend = (input: string, attachments: Attachment[]): void => {\n const attachmentData = attachments?.map(att => ({\n type: att.type || 'file',\n mimeType: att.mimeType,\n data: att.content,\n name: att.name,\n size: att.size,\n }));\n this.sendMessage(input, attachmentData);\n };\n\n private _formatTime(timestamp: number): string {\n return new Date(timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n\n private _formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let unitIndex = 0;\n let size = bytes;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n }\n}\n","// Session Card Component\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { t } from '../utils/i18n';\nimport { getIcon } from '../utils/icons';\nimport type { SessionMetadata } from '../utils/session-api';\n\nexport interface SessionCardEventDetail {\n action: 'click' | 'rename' | 'delete' | 'archive' | 'unarchive' | 'pin' | 'unpin' | 'export';\n key: string;\n}\n\n@customElement('session-card')\nexport class SessionCard extends LitElement {\n @property({ attribute: false }) session!: SessionMetadata;\n @property({ type: Boolean }) selected = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n private _emit(action: SessionCardEventDetail['action']): void {\n this.dispatchEvent(new CustomEvent<SessionCardEventDetail>('session-action', {\n detail: { action, key: this.session.key },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n const now = new Date();\n const diffDays = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n } else if (diffDays === 1) {\n return 'Yesterday';\n } else if (diffDays < 7) {\n return date.toLocaleDateString([], { weekday: 'short' });\n } else {\n return date.toLocaleDateString([], { month: 'short', day: 'numeric' });\n }\n }\n\n private _getChannelIcon(channel: string): string {\n const icons: Record<string, string> = {\n telegram: 'send',\n whatsapp: 'phone',\n gateway: 'globe',\n cli: 'terminal',\n };\n return icons[channel] || 'messageSquare';\n }\n\n private _getStatusBadge(): string {\n switch (this.session.status) {\n case 'archived':\n return 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-400';\n case 'pinned':\n return 'bg-blue-100 text-blue-600 dark:bg-blue-900/30 dark:text-blue-400';\n default:\n return 'bg-green-100 text-green-600 dark:bg-green-900/30 dark:text-green-400';\n }\n }\n\n override render(): unknown {\n const displayName = this.session.name || this.session.key;\n const isArchived = this.session.status === 'archived';\n const isPinned = this.session.status === 'pinned';\n\n return html`\n <div \n class=\"session-card ${this.selected ? 'session-card--selected' : ''} ${isArchived ? 'session-card--archived' : ''}\"\n @click=${() => this._emit('click')}\n >\n <div class=\"session-card__header\">\n <div class=\"session-card__channel\">\n <span class=\"channel-icon\">${getIcon(this._getChannelIcon(this.session.sourceChannel))}</span>\n <span class=\"channel-name\">${this.session.sourceChannel}</span>\n </div>\n <div class=\"session-card__meta\">\n ${isPinned ? html`<span class=\"pin-badge\" title=\"Pinned\">${getIcon('pin')}</span>` : ''}\n <span class=\"date\">${this._formatDate(this.session.updatedAt)}</span>\n </div>\n </div>\n\n <div class=\"session-card__title\">\n ${displayName}\n </div>\n\n <div class=\"session-card__stats\">\n <span class=\"stat\">\n ${getIcon('messageSquare')}\n ${this.session.messageCount}\n </span>\n <span class=\"stat\">\n ${getIcon('zap')}\n ${this._formatTokens(this.session.estimatedTokens)}\n </span>\n </div>\n\n ${this.session.tags.length > 0 ? html`\n <div class=\"session-card__tags\">\n ${this.session.tags.slice(0, 3).map(tag => html`\n <span class=\"tag\">${tag}</span>\n `)}\n ${this.session.tags.length > 3 ? html`\n <span class=\"tag tag--more\">+${this.session.tags.length - 3}</span>\n ` : ''}\n </div>\n ` : ''}\n\n <div class=\"session-card__actions\" @click=${(e: Event) => e.stopPropagation()}>\n ${isArchived ? html`\n <button \n class=\"btn-icon btn-icon--success\" \n title=\"Unarchive\"\n @click=${() => this._emit('unarchive')}\n >${getIcon('archiveRestore')}</button>\n ` : html`\n <button \n class=\"btn-icon\" \n title=\"Archive\"\n @click=${() => this._emit('archive')}\n >${getIcon('archive')}</button>\n `}\n \n ${isPinned ? html`\n <button \n class=\"btn-icon btn-icon--primary\" \n title=\"Unpin\"\n @click=${() => this._emit('unpin')}\n >${getIcon('pinOff')}</button>\n ` : html`\n <button \n class=\"btn-icon\" \n title=\"Pin\"\n @click=${() => this._emit('pin')}\n >${getIcon('pin')}</button>\n `}\n \n <button \n class=\"btn-icon\" \n title=\"Export\"\n @click=${() => this._emit('export')}\n >${getIcon('download')}</button>\n \n <button \n class=\"btn-icon btn-icon--danger\" \n title=\"Delete\"\n @click=${() => this._emit('delete')}\n >${getIcon('trash')}</button>\n </div>\n </div>\n `;\n }\n\n private _formatTokens(tokens: number): string {\n if (tokens >= 1000) {\n return (tokens / 1000).toFixed(1) + 'k';\n }\n return tokens.toString();\n }\n}\n\nexport default SessionCard;\n","// Session List Component\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { t } from '../utils/i18n';\nimport { getIcon } from '../utils/icons';\nimport './SessionCard';\nimport type { SessionMetadata } from '../utils/session-api';\nimport type { SessionCardEventDetail } from './SessionCard';\n\nexport interface SessionListEventDetail {\n action: 'select' | 'rename' | 'delete' | 'archive' | 'unarchive' | 'pin' | 'unpin' | 'export';\n key: string;\n}\n\n@customElement('session-list')\nexport class SessionList extends LitElement {\n @property({ attribute: false }) sessions: SessionMetadata[] = [];\n @property({ type: Boolean }) loading = false;\n @property({ type: Boolean }) hasMore = false;\n @property({ type: String }) selectedKey: string | null = null;\n\n @state() private _viewMode: 'grid' | 'list' = 'grid';\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n private _emit(action: SessionListEventDetail['action'], key: string): void {\n this.dispatchEvent(new CustomEvent<SessionListEventDetail>('list-action', {\n detail: { action, key },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handleCardAction(e: CustomEvent<SessionCardEventDetail>): void {\n const { action, key } = e.detail;\n if (action === 'click') {\n this._emit('select', key);\n } else {\n this._emit(action as SessionListEventDetail['action'], key);\n }\n }\n\n private _loadMore(): void {\n this.dispatchEvent(new CustomEvent('load-more', {\n bubbles: true,\n composed: true,\n }));\n }\n\n override render(): unknown {\n if (this.loading && this.sessions.length === 0) {\n return this._renderLoading();\n }\n\n if (this.sessions.length === 0) {\n return this._renderEmpty();\n }\n\n return html`\n <div class=\"session-list\">\n ${this._renderToolbar()}\n \n <div class=\"session-list__content session-list__content--${this._viewMode}\">\n ${this.sessions.map(session => html`\n <session-card\n .session=${session}\n .selected=${session.key === this.selectedKey}\n @session-action=${this._handleCardAction}\n ></session-card>\n `)}\n </div>\n\n ${this.hasMore ? html`\n <div class=\"session-list__load-more\">\n <button class=\"btn btn--secondary\" @click=${this._loadMore}>\n ${getIcon('chevronDown')}\n Load More\n </button>\n </div>\n ` : ''}\n\n ${this.loading ? html`\n <div class=\"session-list__loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n ` : ''}\n </div>\n `;\n }\n\n private _renderToolbar(): unknown {\n return html`\n <div class=\"session-list__toolbar\">\n <div class=\"session-list__count\">\n ${this.sessions.length} sessions\n </div>\n \n <div class=\"session-list__view-toggle\">\n <button \n class=\"btn-icon ${this._viewMode === 'grid' ? 'btn-icon--active' : ''}\"\n title=\"Grid view\"\n @click=${() => this._viewMode = 'grid'}\n >${getIcon('grid')}</button>\n <button \n class=\"btn-icon ${this._viewMode === 'list' ? 'btn-icon--active' : ''}\"\n title=\"List view\"\n @click=${() => this._viewMode = 'list'}\n >${getIcon('list')}</button>\n </div>\n </div>\n `;\n }\n\n private _renderLoading(): unknown {\n return html`\n <div class=\"session-list session-list--loading\">\n <div class=\"session-list__skeleton\">\n ${Array.from({ length: 6 }).map(() => html`\n <div class=\"skeleton-card\">\n <div class=\"skeleton skeleton--header\"></div>\n <div class=\"skeleton skeleton--title\"></div>\n <div class=\"skeleton skeleton--stats\"></div>\n </div>\n `)}\n </div>\n </div>\n `;\n }\n\n private _renderEmpty(): unknown {\n return html`\n <div class=\"session-list session-list--empty\">\n <div class=\"empty-state\">\n <div class=\"empty-state__icon\">${getIcon('folderOpen')}</div>\n <div class=\"empty-state__title\">No sessions found</div>\n <div class=\"empty-state__description\">\n Start a conversation to create your first session.\n </div>\n </div>\n </div>\n `;\n }\n}\n\nexport default SessionList;\n","// Session Detail Drawer Component\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { getIcon } from '../utils/icons';\nimport type { SessionDetail } from '../utils/session-api';\n\nexport interface SessionDetailEventDetail {\n action: 'close' | 'archive' | 'unarchive' | 'pin' | 'unpin' | 'delete' | 'export';\n}\n\n@customElement('session-detail-drawer')\nexport class SessionDetailDrawer extends LitElement {\n @property({ attribute: false }) session: SessionDetail | null = null;\n @property({ type: Boolean }) open = false;\n @property({ type: Boolean }) loading = false;\n\n @state() private _searchQuery = '';\n @state() private _searchResults: number[] = [];\n @state() private _currentResultIndex = -1;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n private _emit(action: SessionDetailEventDetail['action']): void {\n this.dispatchEvent(new CustomEvent<SessionDetailEventDetail>('detail-action', {\n detail: { action },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handleClose(): void {\n this._emit('close');\n }\n\n private _handleBackdropClick(e: MouseEvent): void {\n if (e.target === e.currentTarget) {\n this._handleClose();\n }\n }\n\n private _handleSearch(e: InputEvent): void {\n const target = e.target as HTMLInputElement;\n this._searchQuery = target.value;\n this._performSearch();\n }\n\n private _performSearch(): void {\n if (!this.session || !this._searchQuery.trim()) {\n this._searchResults = [];\n this._currentResultIndex = -1;\n return;\n }\n\n const query = this._searchQuery.toLowerCase();\n const results: number[] = [];\n\n this.session.messages.forEach((msg, index) => {\n if (msg.content.toLowerCase().includes(query)) {\n results.push(index);\n }\n });\n\n this._searchResults = results;\n this._currentResultIndex = results.length > 0 ? 0 : -1;\n }\n\n private _navigateSearch(direction: 'prev' | 'next'): void {\n if (this._searchResults.length === 0) return;\n\n if (direction === 'next') {\n this._currentResultIndex = (this._currentResultIndex + 1) % this._searchResults.length;\n } else {\n this._currentResultIndex = (this._currentResultIndex - 1 + this._searchResults.length) % this._searchResults.length;\n }\n\n // Scroll to result\n const resultIndex = this._searchResults[this._currentResultIndex];\n const element = this.querySelector(`[data-message-index=\"${resultIndex}\"]`);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n\n private _highlightText(text: string): unknown {\n if (!this._searchQuery.trim()) return text;\n\n const query = this._searchQuery;\n const parts = text.split(new RegExp(`(${query})`, 'gi'));\n\n return parts.map((part, i) => {\n if (part.toLowerCase() === query.toLowerCase()) {\n return html`<mark class=\"search-highlight\">${part}</mark>`;\n }\n return part;\n });\n }\n\n private _formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleString();\n }\n\n override render(): unknown {\n if (!this.open) return '';\n\n return html`\n <div class=\"drawer-backdrop\" @click=${this._handleBackdropClick}>\n <div class=\"drawer drawer--${this.open ? 'open' : 'closed'}\">\n ${this._renderHeader()}\n ${this._renderSearch()}\n ${this._renderContent()}\n ${this._renderActions()}\n </div>\n </div>\n `;\n }\n\n private _renderHeader(): unknown {\n if (!this.session) return '';\n\n const isArchived = this.session.status === 'archived';\n const isPinned = this.session.status === 'pinned';\n\n return html`\n <div class=\"drawer-header\">\n <div class=\"drawer-header__info\">\n <div class=\"drawer-header__title\">\n ${this.session.name || this.session.key}\n ${isPinned ? html`<span class=\"pin-badge\">${getIcon('pin')}</span>` : ''}\n ${isArchived ? html`<span class=\"archive-badge\">Archived</span>` : ''}\n </div>\n <div class=\"drawer-header__meta\">\n <span>${this.session.sourceChannel}</span>\n <span>•</span>\n <span>${this.session.messageCount} messages</span>\n <span>•</span>\n <span>${this._formatDate(this.session.updatedAt)}</span>\n </div>\n </div>\n <button class=\"btn-icon\" @click=${this._handleClose} title=\"Close\">\n ${getIcon('x')}\n </button>\n </div>\n `;\n }\n\n private _renderSearch(): unknown {\n if (!this.session) return '';\n\n return html`\n <div class=\"drawer-search\">\n <div class=\"search-input-wrapper\">\n ${getIcon('search')}\n <input\n type=\"text\"\n placeholder=\"Search in session...\"\n .value=${this._searchQuery}\n @input=${this._handleSearch}\n />\n ${this._searchQuery ? html`\n <button class=\"btn-icon btn-icon--sm\" @click=${() => { this._searchQuery = ''; this._performSearch(); }}>\n ${getIcon('x')}\n </button>\n ` : ''}\n </div>\n \n ${this._searchResults.length > 0 ? html`\n <div class=\"search-nav\">\n <span class=\"search-count\">${this._currentResultIndex + 1} / ${this._searchResults.length}</span>\n <button class=\"btn-icon btn-icon--sm\" @click=${() => this._navigateSearch('prev')} title=\"Previous\">\n ${getIcon('chevronUp')}\n </button>\n <button class=\"btn-icon btn-icon--sm\" @click=${() => this._navigateSearch('next')} title=\"Next\">\n ${getIcon('chevronDown')}\n </button>\n </div>\n ` : ''}\n </div>\n `;\n }\n\n private _renderContent(): unknown {\n if (this.loading) {\n return html`\n <div class=\"drawer-content drawer-content--loading\">\n <div class=\"spinner\"></div>\n <span>Loading...</span>\n </div>\n `;\n }\n\n if (!this.session) {\n return html`\n <div class=\"drawer-content drawer-content--empty\">\n <span>No session selected</span>\n </div>\n `;\n }\n\n return html`\n <div class=\"drawer-content\">\n ${this.session.messages.map((msg, index) => {\n const isSearchResult = this._searchResults.includes(index);\n const isCurrentResult = this._searchResults[this._currentResultIndex] === index;\n\n return html`\n <div \n class=\"message ${msg.role} ${isSearchResult ? 'message--highlight' : ''} ${isCurrentResult ? 'message--current' : ''}\"\n data-message-index=\"${index}\"\n >\n <div class=\"message__header\">\n <span class=\"message__role\">${msg.role}</span>\n ${msg.timestamp ? html`<span class=\"message__time\">${this._formatDate(msg.timestamp)}</span>` : ''}\n </div>\n <div class=\"message__content\">${this._highlightText(msg.content)}</div>\n </div>\n `;\n })}\n </div>\n `;\n }\n\n private _renderActions(): unknown {\n if (!this.session) return '';\n\n const isArchived = this.session.status === 'archived';\n const isPinned = this.session.status === 'pinned';\n\n return html`\n <div class=\"drawer-actions\">\n ${isArchived ? html`\n <button class=\"btn btn--secondary\" @click=${() => this._emit('unarchive')}>\n ${getIcon('archiveRestore')} Unarchive\n </button>\n ` : html`\n <button class=\"btn btn--secondary\" @click=${() => this._emit('archive')}>\n ${getIcon('archive')} Archive\n </button>\n `}\n\n ${isPinned ? html`\n <button class=\"btn btn--secondary\" @click=${() => this._emit('unpin')}>\n ${getIcon('pinOff')} Unpin\n </button>\n ` : html`\n <button class=\"btn btn--secondary\" @click=${() => this._emit('pin')}>\n ${getIcon('pin')} Pin\n </button>\n `}\n\n <button class=\"btn btn--secondary\" @click=${() => this._emit('export')}>\n ${getIcon('download')} Export\n </button>\n\n <button class=\"btn btn--danger\" @click=${() => this._emit('delete')}>\n ${getIcon('trash')} Delete\n </button>\n </div>\n `;\n }\n}\n\nexport default SessionDetailDrawer;\n","// Confirm Dialog Component\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { getIcon } from '../utils/icons';\n\nexport interface ConfirmDialogEventDetail {\n confirmed: boolean;\n}\n\n@customElement('confirm-dialog')\nexport class ConfirmDialog extends LitElement {\n @property({ type: Boolean }) open = false;\n @property({ type: String }) title = 'Confirm';\n @property({ type: String }) message = 'Are you sure?';\n @property({ type: String }) confirmText = 'Confirm';\n @property({ type: String }) cancelText = 'Cancel';\n @property({ type: String }) type: 'danger' | 'warning' | 'info' = 'warning';\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n private _emit(confirmed: boolean): void {\n this.dispatchEvent(new CustomEvent<ConfirmDialogEventDetail>('confirm', {\n detail: { confirmed },\n bubbles: true,\n composed: true,\n }));\n this.open = false;\n }\n\n private _handleBackdropClick(e: MouseEvent): void {\n if (e.target === e.currentTarget) {\n this._emit(false);\n }\n }\n\n private _getIcon(): string {\n switch (this.type) {\n case 'danger':\n return 'trash';\n case 'warning':\n return 'alertTriangle';\n case 'info':\n return 'info';\n default:\n return 'helpCircle';\n }\n }\n\n private _getIconColor(): string {\n switch (this.type) {\n case 'danger':\n return 'text-red-500';\n case 'warning':\n return 'text-amber-500';\n case 'info':\n return 'text-blue-500';\n default:\n return 'text-gray-500';\n }\n }\n\n override render(): unknown {\n if (!this.open) return '';\n\n return html`\n <div class=\"modal-backdrop\" @click=${this._handleBackdropClick}>\n <div class=\"modal modal--${this.type}\">\n <div class=\"modal__icon ${this._getIconColor()}\">\n ${getIcon(this._getIcon())}\n </div>\n \n <div class=\"modal__content\">\n <h3 class=\"modal__title\">${this.title}</h3>\n <p class=\"modal__message\">${this.message}</p>\n </div>\n \n <div class=\"modal__actions\">\n <button class=\"btn btn--secondary\" @click=${() => this._emit(false)}>\n ${this.cancelText}\n </button>\n <button class=\"btn btn--${this.type === 'danger' ? 'danger' : 'primary'}\" @click=${() => this._emit(true)}>\n ${this.confirmText}\n </button>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nexport default ConfirmDialog;\n","// Session API - HTTP client for session management\n\nexport interface SessionMetadata {\n key: string;\n name?: string;\n status: 'active' | 'idle' | 'archived' | 'pinned';\n tags: string[];\n createdAt: string;\n updatedAt: string;\n lastAccessedAt: string;\n messageCount: number;\n estimatedTokens: number;\n compactedCount: number;\n sourceChannel: string;\n sourceChatId: string;\n}\n\nexport interface SessionDetail extends SessionMetadata {\n messages: Array<{\n role: string;\n content: string;\n timestamp?: string;\n }>;\n}\n\nexport interface SessionListQuery {\n status?: 'active' | 'idle' | 'archived' | 'pinned' | ('active' | 'idle' | 'archived' | 'pinned')[];\n channel?: string;\n tags?: string[];\n search?: string;\n sortBy?: 'updatedAt' | 'createdAt' | 'messageCount' | 'lastAccessedAt';\n sortOrder?: 'asc' | 'desc';\n limit?: number;\n offset?: number;\n}\n\nexport interface PaginatedResult<T> {\n items: T[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n}\n\nexport interface SessionStats {\n totalSessions: number;\n activeSessions: number;\n archivedSessions: number;\n pinnedSessions: number;\n totalMessages: number;\n totalTokens: number;\n oldestSession?: string;\n newestSession?: string;\n byChannel: Record<string, number>;\n}\n\nexport type ExportFormat = 'json' | 'markdown';\n\nexport class SessionAPIClient {\n private baseUrl: string;\n private token?: string;\n\n constructor(baseUrl: string, token?: string) {\n // Normalize URL - remove trailing slash\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.token = token;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n \n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n return response.json();\n }\n\n // ========== Session API Methods ==========\n\n async listSessions(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>> {\n const params = new URLSearchParams();\n if (query?.status) params.set('status', query.status as string);\n if (query?.search) params.set('search', query.search);\n if (query?.limit) params.set('limit', String(query.limit));\n if (query?.offset) params.set('offset', String(query.offset));\n \n const queryString = params.toString();\n const path = `/api/sessions${queryString ? `?${queryString}` : ''}`;\n return await this.request<PaginatedResult<SessionMetadata>>('GET', path);\n }\n\n async getSession(key: string): Promise<SessionDetail | null> {\n try {\n const result = await this.request<{ session: SessionDetail }>('GET', `/api/sessions/${key}`);\n return result.session || null;\n } catch (err) {\n if (err instanceof Error && err.message.includes('404')) {\n return null;\n }\n throw err;\n }\n }\n\n async deleteSession(key: string): Promise<{ deleted: boolean }> {\n return await this.request<{ deleted: boolean }>('DELETE', `/api/sessions/${key}`);\n }\n\n async archiveSession(key: string): Promise<{ archived: boolean }> {\n return await this.request<{ archived: boolean }>('POST', `/api/sessions/${key}/archive`);\n }\n\n async unarchiveSession(key: string): Promise<{ unarchived: boolean }> {\n return await this.request<{ unarchived: boolean }>('POST', `/api/sessions/${key}/unarchive`);\n }\n\n async pinSession(key: string): Promise<{ pinned: boolean }> {\n return await this.request<{ pinned: boolean }>('POST', `/api/sessions/${key}/pin`);\n }\n\n async unpinSession(key: string): Promise<{ unpinned: boolean }> {\n return await this.request<{ unpinned: boolean }>('POST', `/api/sessions/${key}/unpin`);\n }\n\n async renameSession(key: string, name: string): Promise<{ renamed: boolean }> {\n return await this.request<{ renamed: boolean }>('POST', `/api/sessions/${key}/rename`, { name });\n }\n\n async exportSession(key: string, format: ExportFormat = 'json'): Promise<string> {\n const result = await this.request<{ content: string }>('GET', `/api/sessions/${key}/export?format=${format}`);\n return result.content;\n }\n\n async getStats(): Promise<SessionStats> {\n return await this.request<SessionStats>('GET', '/api/sessions/stats');\n }\n}\n","// Session Manager Page Component (精简版)\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport '../components/SessionList';\nimport '../components/SessionDetailDrawer';\nimport '../components/ConfirmDialog';\nimport { getIcon } from '../utils/icons';\nimport { t } from '../utils/i18n';\nimport { SessionAPIClient, type SessionMetadata, type SessionDetail, type SessionStats } from '../utils/session-api';\nimport type { SessionListEventDetail } from '../components/SessionList';\nimport type { SessionDetailEventDetail } from '../components/SessionDetailDrawer';\n\nexport interface SessionManagerConfig {\n url: string;\n token?: string;\n}\n\n@customElement('session-manager')\nexport class SessionManager extends LitElement {\n @property({ attribute: false }) config?: SessionManagerConfig;\n\n @state() private _sessions: SessionMetadata[] = [];\n @state() private _loading = false;\n @state() private _hasMore = false;\n @state() private _stats: SessionStats | null = null;\n @state() private _searchQuery = '';\n @state() private _statusFilter: 'all' | 'active' | 'archived' | 'pinned' = 'all';\n @state() private _offset = 0;\n @state() private _error: string | null = null;\n\n // Detail drawer state\n @state() private _detailOpen = false;\n @state() private _detailSession: SessionDetail | null = null;\n @state() private _detailLoading = false;\n\n // Confirm dialog state\n @state() private _confirmOpen = false;\n @state() private _confirmTitle = '';\n @state() private _confirmMessage = '';\n @state() private _confirmKey: string | null = null;\n @state() private _confirmAction: 'delete' | null = null;\n\n private _api!: SessionAPIClient;\n private _limit = 20;\n private _initialized = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._tryInitialize();\n }\n\n override willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n if (changedProperties.has('config')) {\n this._tryInitialize();\n }\n }\n\n private _tryInitialize(): void {\n if (this._initialized || !this.config?.url) {\n return;\n }\n const httpUrl = this.config.url.replace(/\\/+$/, '');\n this._api = new SessionAPIClient(httpUrl, this.config.token);\n this._initialized = true;\n this._loadSessions();\n this._loadStats();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n }\n\n private async _loadSessions(reset = false): Promise<void> {\n if (this._loading) return;\n\n this._loading = true;\n this._error = null;\n\n if (reset) {\n this._offset = 0;\n this._sessions = [];\n }\n\n try {\n const query = {\n limit: this._limit,\n offset: this._offset,\n sortBy: 'updatedAt' as const,\n sortOrder: 'desc' as const,\n ...(this._statusFilter !== 'all' && { status: this._statusFilter }),\n ...(this._searchQuery && { search: this._searchQuery }),\n };\n\n const result = await this._api.listSessions(query);\n \n if (reset) {\n this._sessions = result.items;\n } else {\n this._sessions = [...this._sessions, ...result.items];\n }\n \n this._hasMore = result.hasMore;\n this._offset = result.offset + result.items.length;\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load sessions';\n console.error('[SessionManager] Load error:', err);\n } finally {\n this._loading = false;\n }\n }\n\n private async _loadStats(): Promise<void> {\n try {\n this._stats = await this._api.getStats();\n } catch (err) {\n console.error('[SessionManager] Stats error:', err);\n }\n }\n\n // ========== Detail Drawer ==========\n\n private async _openDetail(key: string): Promise<void> {\n this._detailOpen = true;\n this._detailLoading = true;\n\n try {\n const session = await this._api.getSession(key);\n this._detailSession = session;\n } catch (err) {\n console.error('[SessionManager] Load detail error:', err);\n this._detailOpen = false;\n } finally {\n this._detailLoading = false;\n }\n }\n\n private _closeDetail(): void {\n this._detailOpen = false;\n this._detailSession = null;\n }\n\n private _handleDetailAction(e: CustomEvent<SessionDetailEventDetail>): void {\n const { action } = e.detail;\n const key = this._detailSession?.key;\n if (!key) return;\n\n switch (action) {\n case 'close':\n this._closeDetail();\n break;\n case 'delete':\n this._showConfirm(key);\n break;\n case 'archive':\n this._archiveSession(key);\n break;\n case 'unarchive':\n this._unarchiveSession(key);\n break;\n case 'pin':\n this._pinSession(key);\n break;\n case 'unpin':\n this._unpinSession(key);\n break;\n case 'export':\n this._exportSession(key);\n break;\n }\n }\n\n // ========== Confirm Dialog ==========\n\n private _showConfirm(key: string): void {\n this._confirmKey = key;\n this._confirmAction = 'delete';\n this._confirmTitle = 'Delete Session';\n this._confirmMessage = `Are you sure you want to delete session \"${key}\"?\\n\\nThis action cannot be undone.`;\n this._confirmOpen = true;\n }\n\n private _handleConfirm(e: CustomEvent<{ confirmed: boolean }>): void {\n if (!e.detail.confirmed || !this._confirmKey) {\n this._confirmOpen = false;\n this._confirmKey = null;\n return;\n }\n\n this._deleteSession(this._confirmKey);\n this._confirmOpen = false;\n this._confirmKey = null;\n }\n\n // ========== Actions ==========\n\n private async _deleteSession(key: string): Promise<void> {\n try {\n await this._api.deleteSession(key);\n this._sessions = this._sessions.filter(s => s.key !== key);\n \n if (this._detailSession?.key === key) {\n this._closeDetail();\n }\n \n await this._loadStats();\n } catch (err) {\n alert('Failed to delete session: ' + (err instanceof Error ? err.message : String(err)));\n }\n }\n\n private async _archiveSession(key: string): Promise<void> {\n try {\n await this._api.archiveSession(key);\n this._updateSessionStatus(key, 'archived');\n if (this._detailSession?.key === key) {\n this._detailSession = { ...this._detailSession, status: 'archived' };\n }\n await this._loadStats();\n } catch (err) {\n console.error('[SessionManager] Archive error:', err);\n }\n }\n\n private async _unarchiveSession(key: string): Promise<void> {\n try {\n await this._api.unarchiveSession(key);\n this._updateSessionStatus(key, 'active');\n if (this._detailSession?.key === key) {\n this._detailSession = { ...this._detailSession, status: 'active' };\n }\n await this._loadStats();\n } catch (err) {\n console.error('[SessionManager] Unarchive error:', err);\n }\n }\n\n private async _pinSession(key: string): Promise<void> {\n try {\n await this._api.pinSession(key);\n this._updateSessionStatus(key, 'pinned');\n if (this._detailSession?.key === key) {\n this._detailSession = { ...this._detailSession, status: 'pinned' };\n }\n await this._loadStats();\n } catch (err) {\n console.error('[SessionManager] Pin error:', err);\n }\n }\n\n private async _unpinSession(key: string): Promise<void> {\n try {\n await this._api.unpinSession(key);\n this._updateSessionStatus(key, 'active');\n if (this._detailSession?.key === key) {\n this._detailSession = { ...this._detailSession, status: 'active' };\n }\n await this._loadStats();\n } catch (err) {\n console.error('[SessionManager] Unpin error:', err);\n }\n }\n\n private async _exportSession(key: string): Promise<void> {\n try {\n const content = await this._api.exportSession(key, 'json');\n const blob = new Blob([content], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `session-${key.replace(/[^a-z0-9]/gi, '_')}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n } catch (err) {\n alert('Failed to export session: ' + (err instanceof Error ? err.message : String(err)));\n }\n }\n\n private _updateSessionStatus(key: string, status: SessionMetadata['status']): void {\n this._sessions = this._sessions.map(s => \n s.key === key ? { ...s, status } : s\n );\n }\n\n // ========== List Handlers ==========\n\n private _handleListAction(e: CustomEvent<SessionListEventDetail>): void {\n const { action, key } = e.detail;\n \n switch (action) {\n case 'select':\n this._openDetail(key);\n break;\n case 'delete':\n this._showConfirm(key);\n break;\n case 'archive':\n this._archiveSession(key);\n break;\n case 'unarchive':\n this._unarchiveSession(key);\n break;\n case 'pin':\n this._pinSession(key);\n break;\n case 'unpin':\n this._unpinSession(key);\n break;\n case 'export':\n this._exportSession(key);\n break;\n }\n }\n\n private _handleSearch(e: InputEvent): void {\n const target = e.target as HTMLInputElement;\n this._searchQuery = target.value;\n this._debouncedSearch();\n }\n\n private _debouncedSearch = this._debounce(() => {\n this._loadSessions(true);\n }, 300);\n\n private _debounce(fn: () => void, ms: number): () => void {\n let timeout: ReturnType<typeof setTimeout>;\n return () => {\n clearTimeout(timeout);\n timeout = setTimeout(fn, ms);\n };\n }\n\n private _handleStatusFilter(status: typeof this._statusFilter): void {\n this._statusFilter = status;\n this._loadSessions(true);\n }\n\n private _handleLoadMore(): void {\n this._loadSessions();\n }\n\n // ========== Render ==========\n\n override render(): unknown {\n return html`\n <div class=\"session-manager\">\n ${this._renderHeader()}\n ${this._renderFilters()}\n ${this._renderStats()}\n ${this._error ? html`<div class=\"error-banner\">${this._error}</div>` : ''}\n \n <session-list\n .sessions=${this._sessions}\n .loading=${this._loading}\n .hasMore=${this._hasMore}\n @list-action=${this._handleListAction}\n @load-more=${this._handleLoadMore}\n ></session-list>\n </div>\n\n <session-detail-drawer\n .session=${this._detailSession}\n .open=${this._detailOpen}\n .loading=${this._detailLoading}\n @detail-action=${this._handleDetailAction}\n ></session-detail-drawer>\n\n <confirm-dialog\n .open=${this._confirmOpen}\n .title=${this._confirmTitle}\n .message=${this._confirmMessage}\n .confirmText=\"Delete\"\n .cancelText=\"Cancel\"\n .type=\"danger\"\n @confirm=${this._handleConfirm}\n ></confirm-dialog>\n `;\n }\n\n private _renderHeader(): unknown {\n return html`\n <div class=\"session-manager__header\">\n <h1 class=\"page-title\">${getIcon('folderOpen')} ${t('sessions.title')}</h1>\n <div class=\"search-box\">\n ${getIcon('search')}\n <input\n type=\"text\"\n placeholder=\"${t('sessions.searchPlaceholder')}\"\n .value=${this._searchQuery}\n @input=${this._handleSearch}\n />\n </div>\n </div>\n `;\n }\n\n private _renderFilters(): unknown {\n const filters = [\n { key: 'all', label: 'All', icon: 'layers' },\n { key: 'active', label: 'Active', icon: 'circle' },\n { key: 'pinned', label: 'Pinned', icon: 'pin' },\n { key: 'archived', label: 'Archived', icon: 'archive' },\n ] as const;\n\n return html`\n <div class=\"session-manager__filters\">\n ${filters.map(f => html`\n <button\n class=\"filter-btn ${this._statusFilter === f.key ? 'filter-btn--active' : ''}\"\n @click=${() => this._handleStatusFilter(f.key as typeof this._statusFilter)}\n >\n ${getIcon(f.icon)}\n ${f.label}\n </button>\n `)}\n </div>\n `;\n }\n\n private _renderStats(): unknown {\n if (!this._stats) return '';\n\n return html`\n <div class=\"session-manager__stats\">\n <div class=\"stat-card\">\n <div class=\"stat-value\">${this._stats.totalSessions}</div>\n <div class=\"stat-label\">${t('sessions.totalSessions')}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-value\">${this._stats.activeSessions}</div>\n <div class=\"stat-label\">${t('sessions.activeSessions')}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-value\">${this._stats.pinnedSessions}</div>\n <div class=\"stat-label\">${t('sessions.pinnedSessions')}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-value\">${this._stats.archivedSessions}</div>\n <div class=\"stat-label\">${t('sessions.archivedSessions')}</div>\n </div>\n </div>\n `;\n }\n}\n\nexport default SessionManager;\n","// Cron API - HTTP client for cron job management\n\nexport interface CronDelivery {\n mode: 'none' | 'announce' | 'direct';\n channel?: string;\n to?: string;\n bestEffort?: boolean;\n}\n\nexport interface CronPayload {\n kind: 'systemEvent' | 'agentTurn';\n text?: string;\n message?: string;\n model?: string;\n timeoutSeconds?: number;\n}\n\nexport interface CronJob {\n id: string;\n name?: string;\n schedule: string;\n message: string;\n enabled: boolean;\n timezone?: string;\n maxRetries: number;\n timeout: number;\n next_run?: string;\n created_at: string;\n updated_at: string;\n // New fields\n sessionTarget?: 'main' | 'isolated';\n payload?: CronPayload;\n delivery?: CronDelivery;\n model?: string;\n}\n\nexport interface AddJobOptions {\n name?: string;\n timezone?: string;\n sessionTarget?: 'main' | 'isolated';\n model?: string;\n delivery?: CronDelivery;\n}\n\nexport interface ModelInfo {\n id: string;\n name: string;\n provider: string;\n}\n\nexport interface ConfigInfo {\n model?: string;\n}\n\nexport interface ChannelStatus {\n name: string;\n enabled: boolean;\n connected: boolean;\n}\n\nexport interface SessionChatId {\n channel: string;\n chatId: string;\n lastActive: string;\n}\n\nexport interface CronJobExecution {\n id: string;\n jobId: string;\n status: 'running' | 'success' | 'failed' | 'cancelled';\n startedAt: string;\n endedAt?: string;\n duration?: number;\n error?: string;\n output?: string;\n retryCount: number;\n}\n\nexport interface CronMetrics {\n totalJobs: number;\n runningJobs: number;\n enabledJobs: number;\n failedLastHour: number;\n avgExecutionTime: number;\n nextScheduledJob?: {\n id: string;\n name?: string;\n runAt: Date;\n };\n}\n\nexport interface CronJobUpdate {\n name?: string;\n schedule?: string;\n message?: string;\n enabled?: boolean;\n timezone?: string;\n maxRetries?: number;\n timeout?: number;\n sessionTarget?: 'main' | 'isolated';\n model?: string;\n delivery?: CronDelivery;\n}\n\nexport class CronAPIClient {\n private baseUrl: string;\n private token?: string;\n\n constructor(baseUrl: string, token?: string) {\n // Normalize URL - remove trailing slash\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.token = token;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n \n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n return response.json();\n }\n\n // ========== Cron API Methods ==========\n\n async listJobs(): Promise<CronJob[]> {\n const result = await this.request<{ jobs: CronJob[] }>('GET', '/api/cron');\n return result.jobs || [];\n }\n\n async getJob(id: string): Promise<CronJob | null> {\n try {\n const result = await this.request<{ job: CronJob }>('GET', `/api/cron/${id}`);\n return result.job || null;\n } catch (err) {\n if (err instanceof Error && err.message.includes('404')) {\n return null;\n }\n throw err;\n }\n }\n\n async addJob(schedule: string, message: string, options?: AddJobOptions): Promise<{ id: string; schedule: string }> {\n return await this.request<{ id: string; schedule: string }>('POST', '/api/cron', {\n schedule,\n message,\n ...options,\n });\n }\n\n async updateJob(id: string, updates: CronJobUpdate): Promise<boolean> {\n const result = await this.request<{ updated: boolean }>('PATCH', `/api/cron/${id}`, updates);\n return result.updated;\n }\n\n async removeJob(id: string): Promise<boolean> {\n const result = await this.request<{ removed: boolean }>('DELETE', `/api/cron/${id}`);\n return result.removed;\n }\n\n async toggleJob(id: string, enabled: boolean): Promise<boolean> {\n const result = await this.request<{ toggled: boolean }>('POST', `/api/cron/${id}/toggle`, { enabled });\n return result.toggled;\n }\n\n async runJob(id: string): Promise<void> {\n await this.request<{ triggered: boolean }>('POST', `/api/cron/${id}/run`);\n }\n\n async getHistory(id: string, limit = 10): Promise<CronJobExecution[]> {\n const result = await this.request<{ history: CronJobExecution[] }>('GET', `/api/cron/${id}/history?limit=${limit}`);\n return result.history || [];\n }\n\n async getMetrics(): Promise<CronMetrics> {\n return await this.request<CronMetrics>('GET', '/api/cron/metrics');\n }\n\n async getChannels(): Promise<ChannelStatus[]> {\n const result = await this.request<{ ok: boolean; payload: { channels: ChannelStatus[] } }>('GET', '/api/channels/status');\n return result.payload?.channels || [];\n }\n\n async getModels(): Promise<ModelInfo[]> {\n const result = await this.request<{ ok: boolean; payload: { models: ModelInfo[] } }>('GET', '/api/models');\n return result.payload?.models || [];\n }\n\n async getConfig(): Promise<ConfigInfo> {\n const result = await this.request<{ config: ConfigInfo }>('GET', '/api/config');\n // Extract model from nested config structure\n const config = result.config || {};\n return {\n model: (config as any).agents?.defaults?.model || '',\n };\n }\n\n async getSessionChatIds(channel?: string): Promise<SessionChatId[]> {\n const query = channel ? `?channel=${encodeURIComponent(channel)}` : '';\n const result = await this.request<{ ok: boolean; payload: { chatIds: SessionChatId[] } }>('GET', `/api/sessions/chat-ids${query}`);\n return result.payload?.chatIds || [];\n }\n\n /**\n * Disconnect/cleanup method (no-op for HTTP client, provided for interface compatibility)\n */\n disconnect(): void {\n // HTTP client has no persistent connection to close\n }\n}\n","// Cron Manager Page Component\n\nimport { html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { getIcon } from '../utils/icons';\nimport { t } from '../utils/i18n';\nimport { CronAPIClient, type CronJob, type CronJobExecution, type CronMetrics, type ChannelStatus, type ModelInfo, type SessionChatId } from '../utils/cron-api';\nimport '../components/ConfirmDialog';\n\nexport interface CronManagerConfig {\n url: string;\n token?: string;\n}\n\n@customElement('cron-manager')\nexport class CronManager extends LitElement {\n @property({ attribute: false }) config?: CronManagerConfig;\n\n @state() private _jobs: CronJob[] = [];\n @state() private _metrics: CronMetrics | null = null;\n @state() private _channels: ChannelStatus[] = [];\n @state() private _availableModels: ModelInfo[] = [];\n @state() private _defaultModel: string = '';\n @state() private _sessionChatIds: SessionChatId[] = [];\n @state() private _loading = false;\n @state() private _error: string | null = null;\n\n // Form state\n @state() private _formOpen = false;\n @state() private _formMode: 'add' | 'edit' = 'add';\n @state() private _formJobId: string | null = null;\n @state() private _formName = '';\n @state() private _formSchedule = '*/5 * * * *'; \n @state() private _formChannel = 'telegram';\n @state() private _formChatId = '';\n @state() private _formMessage = '';\n @state() private _formSessionTarget: 'main' | 'isolated' = 'main';\n @state() private _formModel = '';\n @state() private _formSubmitting = false;\n\n // Detail drawer state\n @state() private _detailOpen = false;\n @state() private _detailJob: CronJob | null = null;\n @state() private _detailHistory: CronJobExecution[] = [];\n @state() private _detailLoading = false;\n\n // Confirm dialog state\n @state() private _confirmOpen = false;\n @state() private _confirmTitle = '';\n @state() private _confirmMessage = '';\n @state() private _confirmJobId: string | null = null;\n @state() private _confirmAction: 'delete' | 'run' | null = null;\n\n private _api!: CronAPIClient;\n private _initialized = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._tryInitialize();\n }\n\n override willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n if (changedProperties.has('config')) {\n this._tryInitialize();\n }\n }\n\n private _tryInitialize(): void {\n if (this._initialized || !this.config?.url) {\n return;\n }\n const httpUrl = this.config.url.replace(/\\/+$/, '');\n this._api = new CronAPIClient(httpUrl, this.config.token);\n this._initialized = true;\n this._loadJobs();\n this._loadMetrics();\n this._loadChannels();\n this._loadModels();\n this._loadSessionChatIds();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._api?.disconnect();\n }\n\n private async _loadJobs(): Promise<void> {\n if (this._loading) return;\n this._loading = true;\n this._error = null;\n\n try {\n this._jobs = await this._api.listJobs();\n } catch (err) {\n this._error = err instanceof Error ? (err.message || t('cron.failedToLoadJobs')) : t('cron.failedToLoadJobs');\n console.error('[CronManager] Load error:', err);\n } finally {\n this._loading = false;\n }\n }\n\n private async _loadMetrics(): Promise<void> {\n try {\n this._metrics = await this._api.getMetrics();\n } catch (err) {\n console.error('[CronManager] Metrics error:', err);\n }\n }\n\n private async _loadChannels(): Promise<void> {\n try {\n this._channels = await this._api.getChannels();\n } catch (err) {\n console.error('[CronManager] Channels error:', err);\n }\n }\n\n private async _loadModels(): Promise<void> {\n try {\n // Load available models from configured providers\n this._availableModels = await this._api.getModels();\n \n // Load config to get default model\n const config = await this._api.getConfig();\n this._defaultModel = config.model || '';\n \n // Set form default model\n this._formModel = this._defaultModel;\n \n console.log('[CronManager] Loaded models:', this._availableModels.length, 'default:', this._defaultModel);\n } catch (err) {\n console.error('[CronManager] Models error:', err);\n }\n }\n\n private async _loadSessionChatIds(): Promise<void> {\n try {\n const chatIds = await this._api.getSessionChatIds(this._formChannel);\n this._sessionChatIds = chatIds;\n console.log('[CronManager] Loaded session chatIds for channel', this._formChannel, ':', chatIds.length, chatIds);\n } catch (err) {\n console.error('[CronManager] Session chatIds error:', err);\n this._sessionChatIds = [];\n }\n }\n\n // ========== Form ==========\n\n private _openForm(job?: CronJob): void {\n this._formOpen = true;\n this._formMode = job ? 'edit' : 'add';\n this._formJobId = job?.id || null;\n \n // Refresh session chat IDs when opening form\n if (!job) {\n this._loadSessionChatIds();\n }\n \n if (job) {\n // Editing existing job - populate form\n this._formName = job.name || '';\n this._formSchedule = job.schedule;\n this._formMessage = job.message;\n this._formSessionTarget = job.sessionTarget || 'main';\n this._formModel = job.model || '';\n \n // Parse delivery info\n if (job.delivery) {\n this._formChannel = job.delivery.channel || 'telegram';\n this._formChatId = job.delivery.to || '';\n } else {\n // Try to parse from message format: \"channel:chat_id:message\"\n const parts = job.message.split(':');\n const knownChannels = ['telegram', 'whatsapp', 'cli', 'gateway'];\n if (parts.length >= 3 && knownChannels.includes(parts[0])) {\n this._formChannel = parts[0];\n this._formChatId = parts[1];\n this._formMessage = parts.slice(2).join(':');\n } else {\n this._formChannel = 'telegram';\n this._formChatId = '';\n }\n }\n } else {\n // Adding new job\n this._formName = '';\n this._formSchedule = '*/5 * * * *';\n this._formChannel = 'telegram';\n this._formChatId = '';\n this._formMessage = '';\n this._formSessionTarget = 'main';\n this._formModel = this._defaultModel || (this._availableModels.length > 0 ? this._availableModels[0].id : '');\n }\n }\n\n private _closeForm(): void {\n this._formOpen = false;\n this._formMode = 'add';\n this._formJobId = null;\n this._formName = '';\n this._formSchedule = '*/5 * * * *';\n this._formChannel = 'telegram';\n this._formChatId = '';\n this._formMessage = '';\n this._formSessionTarget = 'main';\n this._formModel = '';\n }\n\n private async _submitForm(): Promise<void> {\n if (!this._formSchedule || !this._formMessage) {\n this._error = t('cron.scheduleRequired');\n return;\n }\n\n if (!this._formChatId) {\n this._error = t('cron.chatIdRequired');\n return;\n }\n\n this._formSubmitting = true;\n this._error = null;\n\n try {\n // Build message (just the content, not prefixed with channel:chat_id)\n const message = this._formMessage;\n \n // Build delivery config\n const delivery = {\n mode: 'direct' as const,\n channel: this._formChannel,\n to: this._formChatId,\n };\n\n // Build payload based on session target\n const payload = this._formSessionTarget === 'isolated'\n ? { kind: 'agentTurn' as const, message, model: this._formModel }\n : { kind: 'systemEvent' as const, text: message };\n\n const jobData = {\n name: this._formName || undefined,\n schedule: this._formSchedule,\n message,\n sessionTarget: this._formSessionTarget,\n model: this._formSessionTarget === 'isolated' ? this._formModel : undefined,\n delivery,\n };\n\n if (this._formMode === 'edit' && this._formJobId) {\n // Update existing job\n await this._api.updateJob(this._formJobId, jobData);\n } else {\n // Add new job\n await this._api.addJob(this._formSchedule, message, jobData);\n }\n \n this._closeForm();\n await this._loadJobs();\n await this._loadMetrics();\n } catch (err) {\n this._error = err instanceof Error ? (err.message || t('cron.failedToJob', { mode: this._formMode })) : t('cron.failedToJob', { mode: this._formMode });\n } finally {\n this._formSubmitting = false;\n }\n }\n\n // ========== Detail Drawer ==========\n\n private async _openDetail(job: CronJob): Promise<void> {\n this._detailOpen = true;\n this._detailJob = job;\n this._detailLoading = true;\n\n try {\n const fullJob = await this._api.getJob(job.id);\n if (fullJob) {\n this._detailJob = fullJob;\n this._detailHistory = await this._api.getHistory(job.id, 20);\n }\n } catch (err) {\n console.error('[CronManager] Load detail error:', err);\n } finally {\n this._detailLoading = false;\n }\n }\n\n private _closeDetail(): void {\n this._detailOpen = false;\n this._detailJob = null;\n this._detailHistory = [];\n }\n\n // ========== Actions ==========\n\n private async _toggleJob(job: CronJob, enabled: boolean): Promise<void> {\n try {\n await this._api.toggleJob(job.id, enabled);\n await this._loadJobs();\n await this._loadMetrics();\n } catch (err) {\n this._error = err instanceof Error ? (err.message || t('cron.failedToToggleJob')) : t('cron.failedToToggleJob');\n }\n }\n\n private _showRunConfirm(job: CronJob): void {\n this._confirmOpen = true;\n this._confirmTitle = t('cron.runNow');\n this._confirmMessage = t('cron.confirmRun');\n this._confirmJobId = job.id;\n this._confirmAction = 'run';\n }\n\n private _showDeleteConfirm(job: CronJob): void {\n this._confirmOpen = true;\n this._confirmTitle = t('cron.delete');\n this._confirmMessage = t('cron.confirmDelete');\n this._confirmJobId = job.id;\n this._confirmAction = 'delete';\n }\n\n private _closeConfirm(): void {\n this._confirmOpen = false;\n this._confirmTitle = '';\n this._confirmMessage = '';\n this._confirmJobId = null;\n this._confirmAction = null;\n }\n\n private _handleConfirm(e: CustomEvent<{ confirmed: boolean }>): void {\n if (e.detail.confirmed) {\n this._executeConfirmAction();\n } else {\n this._closeConfirm();\n }\n }\n\n private async _executeConfirmAction(): Promise<void> {\n if (!this._confirmJobId || !this._confirmAction) {\n return;\n }\n\n const jobId = this._confirmJobId;\n const action = this._confirmAction; // Save before closing\n this._closeConfirm();\n \n try {\n if (action === 'run') {\n await this._api.runJob(jobId);\n await this._loadJobs();\n await this._loadMetrics();\n } else if (action === 'delete') {\n await this._api.removeJob(jobId);\n await this._loadJobs();\n await this._loadMetrics();\n }\n } catch (err) {\n this._error = err instanceof Error ? (err.message || t('cron.actionFailed')) : t('cron.actionFailed');\n }\n }\n\n // ========== Render ==========\n\n override render(): ReturnType<typeof html> {\n return html`\n <div class=\"cron-manager\">\n ${this._error ? html`<div class=\"error-banner\">${this._error}</div>` : ''}\n\n <!-- Header -->\n <div class=\"cron-manager__header\">\n <h1 class=\"page-title\">${getIcon('clock')} ${t('cron.title')}</h1>\n <div class=\"cron-manager__actions\">\n <button class=\"btn btn-secondary\" @click=${this._loadJobs} ?disabled=${this._loading}>\n ${getIcon('refresh')} ${t('logs.refresh')}\n </button>\n <button class=\"btn btn-primary\" @click=${() => this._openForm()}>\n ${getIcon('plus')} ${t('cron.addJob')}\n </button>\n </div>\n </div>\n\n <!-- Stats -->\n ${this._metrics ? html`\n <div class=\"cron-manager__stats\">\n <div class=\"stat-card\" style=\"text-align: center;\">\n <div class=\"stat-value\">${this._metrics.totalJobs}</div>\n <div class=\"stat-label\">${t('sessions.totalSessions')}</div>\n </div>\n <div class=\"stat-card\" style=\"text-align: center;\">\n <div class=\"stat-value\">${this._metrics.enabledJobs}</div>\n <div class=\"stat-label\">${t('cron.enabled')}</div>\n </div>\n <div class=\"stat-card\" style=\"text-align: center;\">\n <div class=\"stat-value\">${this._metrics.runningJobs}</div>\n <div class=\"stat-label\">${t('cron.running')}</div>\n </div>\n <div class=\"stat-card\" style=\"text-align: center;\">\n <div class=\"stat-value\" style=\"font-size: 0.875rem;\">\n ${this._metrics.nextScheduledJob \n ? this._formatNextRun(this._metrics.nextScheduledJob.runAt)\n : 'N/A'}\n </div>\n <div class=\"stat-label\">${t('cron.nextRun')}</div>\n </div>\n </div>\n ` : nothing}\n\n <!-- Job List -->\n <div class=\"session-list\">\n ${this._loading && this._jobs.length === 0 ? html`\n <div class=\"session-list__loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n ` : this._jobs.length === 0 ? html`\n <div class=\"session-list session-list--empty\">\n <div class=\"empty-state\">\n <div class=\"empty-state__icon\">${getIcon('clock')}</div>\n <div class=\"empty-state__title\">No cron jobs yet</div>\n <button class=\"btn btn-primary\" @click=${this._openForm}>Create your first job</button>\n </div>\n </div>\n ` : html`\n <div class=\"session-list__toolbar\">\n <div class=\"session-list__count\">${this._jobs.length} job${this._jobs.length !== 1 ? 's' : ''}</div>\n </div>\n <div class=\"session-list__content\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>${t('cron.name')}</th>\n <th>${t('cron.scheduleLabel')}</th>\n <th>${t('cron.nextRun')}</th>\n <th>${t('cron.status')}</th>\n <th>${t('cron.actions')}</th>\n </tr>\n </thead>\n <tbody>\n ${this._jobs.map(job => html`\n <tr>\n <td style=\"vertical-align: middle; text-align: center;\">\n <button class=\"btn btn-link\" @click=${() => this._openDetail(job)}>\n ${job.name || job.id}\n </button>\n </td>\n <td style=\"vertical-align: middle; text-align: center;\"><code>${job.schedule}</code></td>\n <td style=\"vertical-align: middle; text-align: center;\">${job.next_run ? this._formatNextRun(job.next_run) : '-'}</td>\n <td style=\"vertical-align: middle; text-align: center;\">\n <label class=\"toggle\">\n <input \n type=\"checkbox\" \n ?checked=${job.enabled}\n @change=${(e: Event) => this._toggleJob(job, (e.target as HTMLInputElement).checked)}\n />\n <span class=\"toggle__slider\"></span>\n </label>\n </td>\n <td style=\"vertical-align: middle; text-align: center;\">\n <div class=\"action-buttons\">\n <button class=\"btn btn-icon btn-secondary\" title=\"Edit\" @click=${() => this._openForm(job)}>\n ${getIcon('edit')}\n </button>\n <button class=\"btn btn-icon btn-secondary\" title=\"${t('cron.runNow')}\" @click=${() => this._showRunConfirm(job)}>\n ${getIcon('play')}\n </button>\n <button class=\"btn btn-icon btn-danger\" title=\"${t('cron.delete')}\" @click=${() => this._showDeleteConfirm(job)}>\n ${getIcon('trash')}\n </button>\n </div>\n </td>\n </tr>\n `)}\n </tbody>\n </table>\n </div>\n `}\n </div>\n </div>\n\n <!-- Add/Edit Job Form Modal -->\n ${this._formOpen ? html`\n <div class=\"modal-backdrop\" @click=${this._closeForm}>\n <div class=\"modal modal--form\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal__header\">\n <h2 class=\"modal__title\">${this._formMode === 'edit' ? t('cron.editJob') : t('cron.addJob')}</h2>\n <button class=\"btn-icon\" @click=${this._closeForm}>${getIcon('x')}</button>\n </div>\n <div class=\"modal__content\">\n <div class=\"form-field\">\n <label class=\"form-field__label\">${t('cron.name')}</label>\n <input\n type=\"text\"\n class=\"form-field__input\"\n .value=${this._formName ?? ''}\n @input=${(e: Event) => this._formName = (e.target as HTMLInputElement).value}\n placeholder=\"${t('cron.namePlaceholder') ?? 'My scheduled task'}\"\n />\n </div>\n <div class=\"form-field\">\n <label class=\"form-field__label\">${t('cron.schedule')}</label>\n <div style=\"display: flex; gap: 0.5rem; align-items: center;\">\n <input\n type=\"text\"\n class=\"form-field__input\"\n style=\"flex: 2; min-width: 0;\"\n .value=${this._formSchedule ?? '*/5 * * * *'}\n @input=${(e: Event) => this._formSchedule = (e.target as HTMLInputElement).value}\n placeholder=\"*/5 * * * *\"\n />\n <select\n class=\"form-field__select\"\n style=\"flex: 1; min-width: 0;\"\n .value=${this._formSchedule ?? '*/5 * * * *'}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n if (value) {\n this._formSchedule = value;\n }\n }}\n >\n <option value=\"\">${t('cron.schedulePresets.custom')}</option>\n <option value=\"*/1 * * * *\">${t('cron.schedulePresets.everyMinute')}</option>\n <option value=\"*/5 * * * *\">${t('cron.schedulePresets.every5Minutes')}</option>\n <option value=\"*/10 * * * *\">${t('cron.schedulePresets.every10Minutes')}</option>\n <option value=\"*/15 * * * *\">${t('cron.schedulePresets.every15Minutes')}</option>\n <option value=\"*/30 * * * *\">${t('cron.schedulePresets.every30Minutes')}</option>\n <option value=\"0 * * * *\">${t('cron.schedulePresets.everyHour')}</option>\n <option value=\"0 */2 * * *\">${t('cron.schedulePresets.every2Hours')}</option>\n <option value=\"0 */4 * * *\">${t('cron.schedulePresets.every4Hours')}</option>\n <option value=\"0 */6 * * *\">${t('cron.schedulePresets.every6Hours')}</option>\n <option value=\"0 */12 * * *\">${t('cron.schedulePresets.every12Hours')}</option>\n <option value=\"0 0 * * *\">${t('cron.schedulePresets.everyDayMidnight')}</option>\n <option value=\"0 9 * * *\">${t('cron.schedulePresets.everyDay9AM')}</option>\n <option value=\"0 21 * * *\">${t('cron.schedulePresets.everyDay9PM')}</option>\n </select>\n </div>\n <p class=\"form-field__hint\">\n ${t('cron.scheduleHintPreset')}\n </p>\n </div>\n <div class=\"form-field\">\n <label class=\"form-field__label\">${t('cron.mode')}</label>\n <select\n class=\"form-field__select\"\n .value=${this._formSessionTarget ?? 'main'}\n @change=${(e: Event) => this._formSessionTarget = (e.target as HTMLSelectElement).value as 'main' | 'isolated'}\n >\n <option value=\"main\">${t('cron.modeDirectOption') || 'Direct (send message directly)'}</option>\n <option value=\"isolated\">${t('cron.modeAgentOption') || 'AI Agent (process with AI then send)'}</option>\n </select>\n <p class=\"form-field__hint\">\n ${this._formSessionTarget === 'main' \n ? t('cron.modeDirect')\n : t('cron.modeAgent')}\n </p>\n </div>\n ${this._formSessionTarget === 'isolated' ? html`\n <div class=\"form-field\">\n <label class=\"form-field__label\">${t('cron.model')}</label>\n <select\n class=\"form-field__select\"\n .value=${this._formModel ?? ''}\n @change=${(e: Event) => this._formModel = (e.target as HTMLSelectElement).value}\n >\n ${this._availableModels.length > 0 ? this._availableModels.map(model => html`\n <option value=${model.id}>${model.name} (${model.provider})</option>\n `) : html`\n <option value=\"\">${t('cron.noConfiguredModels')}</option>\n `}\n </select>\n </div>\n ` : nothing}\n <div class=\"form-field\">\n <label class=\"form-field__label\">Channel</label>\n <select\n class=\"form-field__select\"\n .value=${this._formChannel ?? 'telegram'}\n @change=${(e: Event) => {\n this._formChannel = (e.target as HTMLSelectElement).value;\n // Reload chat IDs for selected channel\n this._loadSessionChatIds();\n // Clear chat ID when channel changes\n this._formChatId = '';\n }}\n >\n ${this._channels.map(ch => html`\n <option value=${ch.name} ?disabled=${!ch.enabled}>\n ${ch.name} ${!ch.enabled ? '(disabled)' : ''}\n </option>\n `)}\n </select>\n </div>\n <div class=\"form-field\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;\">\n <label class=\"form-field__label\" style=\"margin: 0;\">Chat ID *</label>\n <button \n type=\"button\" \n class=\"btn btn-secondary btn-sm\" \n @click=${() => this._loadSessionChatIds()}\n title=\"Refresh chat list\"\n style=\"padding: 0.25rem 0.5rem; font-size: 0.75rem;\"\n >\n ${getIcon('refresh')} Refresh\n </button>\n </div>\n <div style=\"display: flex; gap: 0.5rem; align-items: center;\">\n <input\n type=\"text\"\n class=\"form-field__input\"\n style=\"flex: 2; min-width: 0;\"\n .value=${this._formChatId ?? ''}\n @input=${(e: Event) => this._formChatId = (e.target as HTMLInputElement).value}\n placeholder=\"e.g., 123456789\"\n />\n <select\n class=\"form-field__select\"\n style=\"flex: 1; min-width: 0;\"\n .value=${this._formChatId ?? ''}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n if (value) {\n this._formChatId = value;\n }\n }}\n >\n <option value=\"\">-- Select --</option>\n ${this._sessionChatIds.length > 0 ? this._sessionChatIds.map(item => html`\n <option value=${item.chatId}>\n ${item.channel}: ${item.chatId} (${this._formatLastActive(item.lastActive)})\n </option>\n `) : html`\n <option value=\"\" disabled>No recent chats</option>\n `}\n </select>\n </div>\n <p class=\"form-field__hint\">\n ${this._sessionChatIds.length > 0 \n ? t('cron.enterManuallyOrSelect')\n : t('cron.noRecentChats')}\n </p>\n </div>\n <div class=\"form-field\">\n <label class=\"form-field__label\">${t('cron.message')}</label>\n <textarea \n class=\"form-field__textarea\"\n .value=${this._formMessage ?? ''}\n @input=${(e: Event) => this._formMessage = (e.target as HTMLTextAreaElement).value}\n placeholder=\"${t('cron.messagePlaceholder') ?? 'What should the assistant do?'}\"\n rows=\"4\"\n ></textarea>\n </div>\n </div>\n <div class=\"modal__actions\">\n <button class=\"btn btn-secondary\" @click=${this._closeForm}>${t('common.cancel')}</button>\n <button \n class=\"btn btn-primary\" \n @click=${this._submitForm}\n ?disabled=${this._formSubmitting || !this._formSchedule || !this._formChatId || !this._formMessage}\n >\n ${this._formSubmitting ? t('common.loading') : (this._formMode === 'edit' ? t('cron.save') : t('cron.create'))}\n </button>\n </div>\n </div>\n </div>\n ` : nothing}\n\n <!-- Detail Drawer -->\n ${this._detailOpen ? html`\n <div class=\"drawer-backdrop\" @click=${this._closeDetail}>\n <div class=\"drawer drawer--open\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"drawer-header\">\n <div class=\"drawer-header__info\">\n <div class=\"drawer-header__title\">${this._detailJob?.name || this._detailJob?.id}</div>\n </div>\n <button class=\"btn-icon\" @click=${this._closeDetail}>${getIcon('x')}</button>\n </div>\n <div class=\"drawer-content ${this._detailLoading ? 'drawer-content--loading' : ''}\">\n ${this._detailLoading ? html`\n <div class=\"spinner\"></div>\n ` : html`\n <div class=\"session-detail\">\n <div class=\"session-detail__row\">\n <span class=\"session-detail__label\">${t('cron.scheduleLabel')}</span>\n <code>${this._detailJob?.schedule}</code>\n </div>\n <div class=\"session-detail__row\">\n <span class=\"session-detail__label\">${t('cron.messageLabel')}</span>\n <span>${this._detailJob?.message}</span>\n </div>\n <div class=\"session-detail__row\">\n <span class=\"session-detail__label\">${t('cron.status')}</span>\n <span>${this._detailJob?.enabled ? t('cron.enabled') : t('cron.disabled')}</span>\n </div>\n <div class=\"session-detail__row\">\n <span class=\"session-detail__label\">${t('cron.nextRun')}</span>\n <span>${this._detailJob?.next_run ? this._formatNextRun(this._detailJob.next_run) : 'N/A'}</span>\n </div>\n </div>\n `}\n </div>\n </div>\n </div>\n ` : nothing}\n\n <!-- Confirm Dialog -->\n <confirm-dialog\n .open=${this._confirmOpen}\n .title=${this._confirmTitle}\n .message=${this._confirmMessage}\n .confirmText=${this._confirmAction === 'delete' ? t('cron.delete') : t('cron.runNow')}\n .cancelText=${t('common.cancel')}\n .type=${this._confirmAction === 'delete' ? 'danger' : 'warning'}\n @confirm=${this._handleConfirm}\n ></confirm-dialog>\n `;\n }\n\n // ========== Helpers ==========\n\n private _formatNextRun(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diff = d.getTime() - now.getTime();\n \n if (diff < 0) return t('cron.timeLabels.overdue');\n if (diff < 60000) return t('cron.timeLabels.lessThanMinute');\n if (diff < 3600000) {\n const mins = Math.floor(diff / 60000);\n return t('cron.timeLabels.minutes', { count: mins });\n }\n if (diff < 86400000) {\n const hours = Math.floor(diff / 3600000);\n return t('cron.timeLabels.hours', { count: hours });\n }\n return d.toLocaleString();\n }\n\n private _formatLastActive(date: string): string {\n const d = new Date(date);\n const now = new Date();\n const diff = now.getTime() - d.getTime();\n \n if (diff < 0) return t('cron.lastActiveLabels.justNow');\n if (diff < 60000) return t('cron.lastActiveLabels.justNow');\n if (diff < 3600000) {\n const mins = Math.floor(diff / 60000);\n return t('cron.lastActiveLabels.minutesAgo', { count: mins });\n }\n if (diff < 86400000) {\n const hours = Math.floor(diff / 3600000);\n return t('cron.lastActiveLabels.hoursAgo', { count: hours });\n }\n if (diff < 604800000) {\n const days = Math.floor(diff / 86400000);\n return t('cron.lastActiveLabels.daysAgo', { count: days });\n }\n return d.toLocaleDateString();\n }\n\n private _formatTime(date: string): string {\n return new Date(date).toLocaleString();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'cron-manager': CronManager;\n }\n}\n","// Log API - HTTP client for log management\n\nexport interface LogEntry {\n timestamp: string;\n level: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n message: string;\n module?: string;\n prefix?: string;\n service?: string;\n plugin?: string;\n requestId?: string;\n sessionId?: string;\n userId?: string;\n meta?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface LogQuery {\n level?: string[];\n from?: string;\n to?: string;\n q?: string;\n module?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface LogFile {\n name: string;\n size: number;\n modified: string;\n}\n\nexport interface LogStats {\n byLevel: Record<string, number>;\n}\n\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport const LOG_LEVELS: LogLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\n\nexport const LOG_LEVEL_COLORS: Record<LogLevel, string> = {\n trace: '#9ca3af',\n debug: '#6b7280',\n info: '#3b82f6',\n warn: '#f59e0b',\n error: '#ef4444',\n fatal: '#dc2626',\n};\n\nexport class LogAPIClient {\n private baseUrl: string;\n private token?: string;\n\n constructor(baseUrl: string, token?: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.token = token;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `HTTP ${response.status}`);\n }\n\n return response.json();\n }\n\n // ========== Log API Methods ==========\n\n async queryLogs(query?: LogQuery): Promise<{ logs: LogEntry[]; count: number }> {\n const params = new URLSearchParams();\n if (query?.level?.length) params.set('level', query.level.join(','));\n if (query?.from) params.set('from', query.from);\n if (query?.to) params.set('to', query.to);\n if (query?.q) params.set('q', query.q);\n if (query?.module) params.set('module', query.module);\n if (query?.limit) params.set('limit', String(query.limit));\n if (query?.offset) params.set('offset', String(query.offset));\n\n const queryString = params.toString();\n const path = `/api/logs${queryString ? `?${queryString}` : ''}`;\n return await this.request<{ logs: LogEntry[]; count: number }>('GET', path);\n }\n\n async getLogFiles(): Promise<LogFile[]> {\n const result = await this.request<{ files: LogFile[] }>('GET', '/api/logs/files');\n return result.files || [];\n }\n\n async getLogStats(): Promise<LogStats> {\n return await this.request<LogStats>('GET', '/api/logs/stats');\n }\n\n async getLogLevels(): Promise<LogLevel[]> {\n const result = await this.request<{ levels: LogLevel[] }>('GET', '/api/logs/levels');\n return result.levels || [];\n }\n\n async getLogModules(): Promise<string[]> {\n const result = await this.request<{ modules: string[] }>('GET', '/api/logs/modules');\n return result.modules || [];\n }\n\n async getLogDir(): Promise<string> {\n const result = await this.request<{ dir: string }>('GET', '/api/logs/dir');\n return result.dir;\n }\n}\n","// Log Manager Page Component\n\nimport { html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { getIcon } from '../utils/icons';\nimport { t } from '../utils/i18n';\nimport {\n LogAPIClient,\n type LogEntry,\n type LogFile,\n type LogLevel,\n LOG_LEVELS,\n LOG_LEVEL_COLORS,\n} from '../utils/log-api';\n\nexport interface LogManagerConfig {\n url: string;\n token?: string;\n}\n\n@customElement('log-manager')\nexport class LogManager extends LitElement {\n @property({ attribute: false }) config?: LogManagerConfig;\n\n @state() private _logs: LogEntry[] = [];\n @state() private _loading = false;\n @state() private _hasMore = false;\n @state() private _files: LogFile[] = [];\n @state() private _modules: string[] = [];\n @state() private _showFilesPanel = false;\n\n // Filters\n @state() private _selectedLevels: Set<LogLevel> = new Set();\n @state() private _searchQuery = '';\n @state() private _selectedModule = '';\n @state() private _dateFrom = '';\n @state() private _dateTo = '';\n @state() private _offset = 0;\n @state() private _error: string | null = null;\n\n // Detail view\n @state() private _selectedLog: LogEntry | null = null;\n @state() private _autoRefresh = false;\n @state() private _refreshInterval?: number;\n\n private _api!: LogAPIClient;\n private _limit = 50;\n private _initialized = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._tryInitialize();\n }\n\n override willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n if (changedProperties.has('config')) {\n this._tryInitialize();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._stopAutoRefresh();\n }\n\n override firstUpdated(): void {\n // Ensure initialization happens even if config was set before connectedCallback\n this._tryInitialize();\n }\n\n private _tryInitialize(): void {\n if (this._initialized || !this.config?.url) {\n return;\n }\n const httpUrl = this.config.url.replace(/\\/+$/, '');\n this._api = new LogAPIClient(httpUrl, this.config.token);\n this._initialized = true;\n this._loadLogs();\n this._loadFiles();\n this._loadModules();\n }\n\n private async _loadLogs(reset = false): Promise<void> {\n if (this._loading) return;\n\n this._loading = true;\n this._error = null;\n\n if (reset) {\n this._offset = 0;\n this._logs = [];\n }\n\n try {\n const query = {\n level: this._selectedLevels.size > 0 ? Array.from(this._selectedLevels) : undefined,\n from: this._dateFrom || undefined,\n to: this._dateTo || undefined,\n q: this._searchQuery || undefined,\n module: this._selectedModule || undefined,\n limit: this._limit,\n offset: this._offset,\n };\n\n const result = await this._api.queryLogs(query);\n\n if (reset) {\n this._logs = result.logs;\n } else {\n this._logs = [...this._logs, ...result.logs];\n }\n\n console.log('[LogManager] Total logs in state:', this._logs.length);\n this._hasMore = result.logs.length === this._limit;\n this._offset = this._offset + result.logs.length;\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Failed to load logs';\n console.error('[LogManager] Load error:', err);\n } finally {\n this._loading = false;\n }\n }\n\n private async _loadFiles(): Promise<void> {\n try {\n this._files = await this._api.getLogFiles();\n } catch (err) {\n console.error('[LogManager] Files error:', err);\n }\n }\n\n private async _loadModules(): Promise<void> {\n try {\n this._modules = await this._api.getLogModules();\n } catch (err) {\n console.error('[LogManager] Modules error:', err);\n }\n }\n\n private _toggleLevel(level: LogLevel): void {\n if (this._selectedLevels.has(level)) {\n this._selectedLevels.delete(level);\n } else {\n this._selectedLevels.add(level);\n }\n this._selectedLevels = new Set(this._selectedLevels);\n this._loadLogs(true);\n }\n\n private _handleSearch(e: InputEvent): void {\n const target = e.target as HTMLInputElement;\n this._searchQuery = target.value;\n this._debouncedSearch();\n }\n\n private _debouncedSearch = this._debounce(() => {\n this._loadLogs(true);\n }, 300);\n\n private _debounce(fn: () => void, ms: number): () => void {\n let timeout: ReturnType<typeof setTimeout>;\n return () => {\n clearTimeout(timeout);\n timeout = setTimeout(fn, ms);\n };\n }\n\n private _handleModuleChange(e: Event): void {\n const target = e.target as HTMLSelectElement;\n this._selectedModule = target.value;\n this._loadLogs(true);\n }\n\n private _handleDateFromChange(e: InputEvent): void {\n const target = e.target as HTMLInputElement;\n this._dateFrom = target.value;\n this._loadLogs(true);\n }\n\n private _handleDateToChange(e: InputEvent): void {\n const target = e.target as HTMLInputElement;\n this._dateTo = target.value;\n this._loadLogs(true);\n }\n\n private _clearFilters(): void {\n this._selectedLevels.clear();\n this._selectedLevels = new Set();\n this._searchQuery = '';\n this._selectedModule = '';\n this._dateFrom = '';\n this._dateTo = '';\n this._loadLogs(true);\n }\n\n private _selectLog(log: LogEntry): void {\n this._selectedLog = log;\n }\n\n private _closeDetail(): void {\n this._selectedLog = null;\n }\n\n private _toggleAutoRefresh(): void {\n this._autoRefresh = !this._autoRefresh;\n if (this._autoRefresh) {\n this._startAutoRefresh();\n } else {\n this._stopAutoRefresh();\n }\n }\n\n private _startAutoRefresh(): void {\n this._refreshInterval = window.setInterval(() => {\n this._loadLogs(true);\n }, 5000);\n }\n\n private _stopAutoRefresh(): void {\n if (this._refreshInterval) {\n clearInterval(this._refreshInterval);\n this._refreshInterval = undefined;\n }\n }\n\n private _handleLoadMore(): void {\n this._loadLogs();\n }\n\n private _formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n return date.toLocaleString([], {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n } catch {\n return timestamp;\n }\n }\n\n private _formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n override render(): unknown {\n return html`\n <div class=\"log-manager\">\n ${this._renderHeader()}\n <div class=\"log-manager__main\">\n ${this._renderFilters()}\n ${this._renderLogTable()}\n ${this._renderFilesPanel()}\n </div>\n ${this._error ? html`<div class=\"error-banner\">${this._error}</div>` : ''}\n </div>\n\n ${this._selectedLog ? this._renderDetailDrawer() : ''}\n `;\n }\n\n private _renderHeader(): unknown {\n return html`\n <div class=\"log-manager__header\">\n <div class=\"log-manager__title\">\n <span class=\"title-icon\">${getIcon('fileText')}</span>\n <div class=\"title-text\">\n <h1>${t('logs.title')}</h1>\n <span class=\"title-subtitle\">System logs and diagnostics</span>\n </div>\n </div>\n <div class=\"log-manager__actions\">\n <button\n class=\"btn-icon\"\n @click=${this._toggleFilesPanel}\n title=\"Toggle log files\"\n >\n ${getIcon('folder')}\n ${this._files.length > 0 ? html`<span class=\"badge\">${this._files.length}</span>` : ''}\n </button>\n <button\n class=\"btn-icon ${this._autoRefresh ? 'btn-icon--active' : ''}\"\n @click=${this._toggleAutoRefresh}\n title=${this._autoRefresh ? t('logs.pause') : t('logs.autoRefresh')}\n >\n ${getIcon(this._autoRefresh ? 'pause' : 'play')}\n </button>\n <button\n class=\"btn-icon\"\n @click=${() => this._loadLogs(true)}\n title=${t('logs.refresh')}\n >\n ${getIcon('refreshCw')}\n </button>\n </div>\n </div>\n `;\n }\n\n private _renderFilters(): unknown {\n return html`\n <div class=\"log-manager__filters\">\n <div class=\"filter-group\">\n <label class=\"filter-label\">${t('logs.level')}</label>\n <div class=\"level-filters\">\n ${LOG_LEVELS.map((level) => html`\n <button\n class=\"level-badge ${this._selectedLevels.has(level) ? 'level-badge--active' : ''}\"\n style=\"--level-color: ${LOG_LEVEL_COLORS[level]}\"\n @click=${() => this._toggleLevel(level)}\n >\n ${level}\n </button>\n `)}\n </div>\n </div>\n\n <div class=\"filter-group\">\n <label class=\"filter-label\">${t('logs.search')}</label>\n <div class=\"search-box\">\n ${getIcon('search')}\n <input\n type=\"text\"\n placeholder=\"${t('logs.searchPlaceholder')}\"\n .value=${this._searchQuery}\n @input=${this._handleSearch}\n />\n </div>\n </div>\n\n <div class=\"filter-row\">\n <div class=\"filter-group\">\n <label class=\"filter-label\">Module</label>\n <select @change=${this._handleModuleChange}>\n <option value=\"\">All modules</option>\n ${this._modules.map((m) => html`<option value=\"${m}\">${m}</option>`)}\n </select>\n </div>\n\n <div class=\"filter-group\">\n <label class=\"filter-label\">From</label>\n <input\n type=\"datetime-local\"\n .value=${this._dateFrom}\n @input=${this._handleDateFromChange}\n />\n </div>\n\n <div class=\"filter-group\">\n <label class=\"filter-label\">To</label>\n <input\n type=\"datetime-local\"\n .value=${this._dateTo}\n @input=${this._handleDateToChange}\n />\n </div>\n\n <button class=\"btn btn-ghost\" @click=${this._clearFilters}>\n ${getIcon('x')}\n Clear\n </button>\n </div>\n </div>\n `;\n }\n\n\n\n private _renderLogTable(): unknown {\n if (this._loading && this._logs.length === 0) {\n return this._renderLoading();\n }\n\n if (this._logs.length === 0) {\n return html`\n <div class=\"log-manager__empty\">\n <div class=\"empty-state\">\n <div class=\"empty-state__icon\">${getIcon('fileText')}</div>\n <div class=\"empty-state__title\">${t('logs.noLogs')}</div>\n <div class=\"empty-state__description\">\n ${t('logs.noLogsDescription')}\n </div>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"log-table-container\">\n <table class=\"log-table\">\n <thead>\n <tr>\n <th>${t('logs.time')}</th>\n <th>${t('logs.level')}</th>\n <th>${t('logs.module')}</th>\n <th>${t('logs.message')}</th>\n </tr>\n </thead>\n <tbody>\n ${this._logs.length === 0 ? html`\n <tr>\n <td colspan=\"4\" style=\"padding: 2rem; text-align: center; color: var(--text-muted);\">\n No logs to display\n </td>\n </tr>\n ` : this._logs.map((log) => html`\n <tr class=\"log-row log-row--${log.level || 'info'}\" @click=${() => this._selectLog(log)}>\n <td class=\"log-cell log-cell--time\">${this._formatTimestamp(log.timestamp)}</td>\n <td class=\"log-cell log-cell--level\">\n <span\n class=\"level-badge level-badge--small\"\n style=\"--level-color: ${LOG_LEVEL_COLORS[log.level as LogLevel] || LOG_LEVEL_COLORS.info}\"\n >\n ${log.level || 'info'}\n </span>\n </td>\n <td class=\"log-cell log-cell--module\">${log.module || log.prefix || log.service || '-'}</td>\n <td class=\"log-cell log-cell--message\">${log.message || JSON.stringify(log)}</td>\n </tr>\n `)}\n </tbody>\n </table>\n\n ${this._hasMore ? html`\n <div class=\"log-table__load-more\">\n <button class=\"btn btn-secondary\" @click=${this._handleLoadMore} ?disabled=${this._loading}>\n ${this._loading ? html`<span class=\"spinner\"></span>` : getIcon('chevronDown')}\n Load More\n </button>\n </div>\n ` : ''}\n </div>\n `;\n }\n\n private _toggleFilesPanel(): void {\n this._showFilesPanel = !this._showFilesPanel;\n }\n\n private _renderFilesPanel(): unknown {\n return html`\n ${this._showFilesPanel ? html`\n <div class=\"drawer-overlay\" @click=${this._toggleFilesPanel}></div>\n ` : ''}\n <div class=\"files-panel ${this._showFilesPanel ? 'files-panel--open' : ''}\">\n <div class=\"files-panel__header\">\n <span class=\"files-panel__title\">\n ${getIcon('folder')}\n Log Files\n </span>\n <button class=\"btn btn-icon\" @click=${this._toggleFilesPanel}>\n ${getIcon('x')}\n </button>\n </div>\n <div class=\"files-panel__content\">\n ${this._files.length === 0 ? html`\n <div class=\"files-panel__empty\">No log files found</div>\n ` : html`\n <div class=\"file-list\">\n ${this._files.map((file) => html`\n <div class=\"file-item\">\n <span class=\"file-name\">${getIcon('file')}${file.name}</span>\n <span class=\"file-meta\">\n <span class=\"file-size\">${this._formatFileSize(file.size)}</span>\n <span class=\"file-time\">${this._formatTimestamp(file.modified)}</span>\n </span>\n </div>\n `)}\n </div>\n `}\n </div>\n </div>\n `;\n }\n\n private _renderDetailDrawer(): unknown {\n if (!this._selectedLog) return '';\n\n const log = this._selectedLog;\n\n return html`\n <div class=\"drawer-overlay\" @click=${this._closeDetail}></div>\n <div class=\"drawer drawer--right\">\n <div class=\"drawer-header\">\n <h3 class=\"drawer-header__title\">${t('logs.details')}</h3>\n <button class=\"btn btn-icon\" @click=${this._closeDetail}>${getIcon('x')}</button>\n </div>\n <div class=\"drawer__content\">\n <div class=\"log-detail\">\n <div class=\"log-detail__field\">\n <label>${t('logs.time')}</label>\n <code>${log.timestamp}</code>\n </div>\n <div class=\"log-detail__field\">\n <label>${t('logs.level')}</label>\n <span\n class=\"level-badge\"\n style=\"--level-color: ${LOG_LEVEL_COLORS[log.level]}\"\n >\n ${log.level}\n </span>\n </div>\n <div class=\"log-detail__field\">\n <label>${t('logs.module')}</label>\n <code>${log.module}</code>\n </div>\n <div class=\"log-detail__field\">\n <label>${t('logs.message')}</label>\n <pre class=\"log-detail__message\">${log.message}</pre>\n </div>\n ${log.meta ? html`\n <div class=\"log-detail__field\">\n <label>Metadata</label>\n <pre class=\"log-detail__meta\">${JSON.stringify(log.meta, null, 2)}</pre>\n </div>\n ` : ''}\n </div>\n </div>\n </div>\n `;\n }\n\n private _renderLoading(): unknown {\n return html`\n <div class=\"log-manager__loading\">\n <div class=\"skeleton-table\">\n ${Array.from({ length: 10 }).map(() => html`\n <div class=\"skeleton-row\">\n <div class=\"skeleton skeleton--time\"></div>\n <div class=\"skeleton skeleton--level\"></div>\n <div class=\"skeleton skeleton--module\"></div>\n <div class=\"skeleton skeleton--message\"></div>\n </div>\n `)}\n </div>\n </div>\n `;\n }\n}\n\nexport default LogManager;\n","// Settings Page Component\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { \n User, Bot, Plug, Globe, Search, Clock, Puzzle, \n X, Save, ChevronRight, Check, AlertCircle,\n Settings, Eye, EyeOff, Loader2, RefreshCw\n} from 'lucide';\nimport { getIcon } from '../utils/icons';\nimport { t } from '../utils/i18n';\n\nexport interface SettingsPageConfig {\n url: string;\n token?: string;\n}\n\nexport interface SettingsSection {\n id: string;\n title: string;\n icon: string;\n fields: SettingsField[];\n}\n\nexport interface SettingsField {\n key: string;\n label: string;\n type: 'text' | 'password' | 'number' | 'boolean' | 'select' | 'textarea';\n description?: string;\n placeholder?: string;\n options?: Array<{ value: string; label: string }>;\n validation?: {\n required?: boolean;\n min?: number;\n max?: number;\n pattern?: string;\n };\n}\n\nexport interface SettingsValue {\n [key: string]: any;\n}\n\n@customElement('settings-page')\nexport class SettingsPage extends LitElement {\n @property({ attribute: false }) config?: SettingsPageConfig;\n\n @state() private _activeSection = 'agent';\n @state() private _loading = false;\n @state() private _saving = false;\n @state() private _dirtyFields: Set<string> = new Set();\n @state() private _errors: Map<string, string> = new Map();\n @state() private _saveSuccess = false;\n @state() private _models: Array<{ id: string; name: string; provider: string }> = [];\n\n @state() private _values: SettingsValue = {\n model: 'anthropic/claude-sonnet-4-5',\n maxTokens: 8192,\n temperature: 0.7,\n maxToolIterations: 20,\n // Telegram\n telegramEnabled: false,\n telegramToken: '',\n telegramApiRoot: '',\n telegramDebug: false,\n telegramAllowFrom: '',\n // WhatsApp\n whatsappEnabled: false,\n whatsappBridgeUrl: 'ws://localhost:3001',\n whatsappAllowFrom: '',\n // Gateway\n heartbeatEnabled: true,\n heartbeatIntervalMs: 60000,\n // Providers\n openaiApiKey: '',\n anthropicApiKey: '',\n googleApiKey: '',\n qwenApiKey: '',\n kimiApiKey: '',\n minimaxApiKey: '',\n deepseekApiKey: '',\n grokApiKey: '',\n openrouterApiKey: '',\n // Workspace\n workspace: '',\n theme: 'system',\n };\n\n private _initialized = false;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._tryInitialize();\n }\n\n override willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n if (changedProperties.has('config')) {\n this._tryInitialize();\n }\n }\n\n private _tryInitialize(): void {\n if (!this.config?.url) {\n return;\n }\n \n // Always try to load settings when config changes\n this._loadSettings();\n }\n\n // Settings sections definition\n private get _sections(): SettingsSection[] {\n const modelOptions = this._models.map(m => ({\n value: m.id,\n label: `${m.provider}/${m.name}`,\n }));\n\n return [\n {\n id: 'agent',\n title: t('settings.sections.agent'),\n icon: 'bot',\n fields: [\n {\n key: 'model',\n label: t('settings.fields.model'),\n type: 'select',\n description: t('settings.descriptionsFields.model'),\n options: modelOptions,\n },\n {\n key: 'workspace',\n label: t('settings.fields.workspace'),\n type: 'text',\n description: t('settings.descriptionsFields.workspace'),\n placeholder: t('settings.placeholders.workspace'),\n },\n {\n key: 'maxTokens',\n label: t('settings.fields.maxTokens'),\n type: 'number',\n description: t('settings.descriptionsFields.maxTokens'),\n validation: { min: 256, max: 128000 },\n },\n {\n key: 'temperature',\n label: t('settings.fields.temperature'),\n type: 'number',\n description: t('settings.descriptionsFields.temperature'),\n validation: { min: 0, max: 2 },\n },\n {\n key: 'maxToolIterations',\n label: t('settings.fields.maxToolIterations'),\n type: 'number',\n description: t('settings.descriptionsFields.maxToolIterations'),\n validation: { min: 1, max: 100 },\n },\n ],\n },\n {\n id: 'providers',\n title: t('settings.sections.providers'),\n icon: 'cloud',\n fields: [\n {\n key: 'openaiApiKey',\n label: t('settings.fields.openaiApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.openaiApiKey'),\n placeholder: t('settings.placeholders.openaiApiKey'),\n },\n {\n key: 'anthropicApiKey',\n label: t('settings.fields.anthropicApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.anthropicApiKey'),\n placeholder: t('settings.placeholders.anthropicApiKey'),\n },\n {\n key: 'googleApiKey',\n label: t('settings.fields.googleApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.googleApiKey'),\n placeholder: t('settings.placeholders.googleApiKey'),\n },\n {\n key: 'qwenApiKey',\n label: t('settings.fields.qwenApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.qwenApiKey'),\n placeholder: t('settings.placeholders.qwenApiKey'),\n },\n {\n key: 'kimiApiKey',\n label: t('settings.fields.kimiApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.kimiApiKey'),\n placeholder: t('settings.placeholders.kimiApiKey'),\n },\n {\n key: 'minimaxApiKey',\n label: t('settings.fields.minimaxApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.minimaxApiKey'),\n placeholder: t('settings.placeholders.minimaxApiKey'),\n },\n {\n key: 'deepseekApiKey',\n label: t('settings.fields.deepseekApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.deepseekApiKey'),\n placeholder: t('settings.placeholders.deepseekApiKey'),\n },\n {\n key: 'openrouterApiKey',\n label: t('settings.fields.openrouterApiKey'),\n type: 'password',\n description: t('settings.descriptionsFields.openrouterApiKey'),\n placeholder: t('settings.placeholders.openrouterApiKey'),\n },\n ],\n },\n {\n id: 'channels',\n title: t('settings.sections.channels'),\n icon: 'plug',\n fields: [\n // Telegram section\n {\n key: 'telegramEnabled',\n label: t('settings.fields.telegramEnabled'),\n type: 'boolean',\n description: t('settings.descriptionsFields.telegramEnabled'),\n },\n ...(this._values.telegramEnabled ? [\n {\n key: 'telegramToken',\n label: t('settings.fields.telegramToken'),\n type: 'password' as const,\n description: t('settings.descriptionsFields.telegramToken'),\n placeholder: t('settings.placeholders.telegramToken'),\n },\n {\n key: 'telegramApiRoot',\n label: t('settings.fields.telegramApiRoot'),\n type: 'text' as const,\n description: t('settings.descriptionsFields.telegramApiRoot'),\n placeholder: t('settings.placeholders.telegramApiRoot'),\n },\n {\n key: 'telegramAllowFrom',\n label: t('settings.fields.telegramAllowFrom'),\n type: 'text' as const,\n description: t('settings.descriptionsFields.telegramAllowFrom'),\n placeholder: t('settings.placeholders.telegramAllowFrom'),\n },\n {\n key: 'telegramDebug',\n label: t('settings.fields.telegramDebug'),\n type: 'boolean' as const,\n description: t('settings.descriptionsFields.telegramDebug'),\n },\n ] : []),\n // WhatsApp section\n {\n key: 'whatsappEnabled',\n label: t('settings.fields.whatsappEnabled'),\n type: 'boolean',\n description: t('settings.descriptionsFields.whatsappEnabled'),\n },\n ...(this._values.whatsappEnabled ? [\n {\n key: 'whatsappBridgeUrl',\n label: t('settings.fields.whatsappBridgeUrl'),\n type: 'text' as const,\n description: t('settings.descriptionsFields.whatsappBridgeUrl'),\n placeholder: t('settings.placeholders.whatsappBridgeUrl'),\n },\n {\n key: 'whatsappAllowFrom',\n label: t('settings.fields.whatsappAllowFrom'),\n type: 'text' as const,\n description: t('settings.descriptionsFields.whatsappAllowFrom'),\n placeholder: t('settings.placeholders.whatsappAllowFrom'),\n },\n ] : []),\n ],\n },\n {\n id: 'gateway',\n title: t('settings.sections.gateway'),\n icon: 'globe',\n fields: [\n {\n key: 'heartbeatEnabled',\n label: t('settings.fields.heartbeatEnabled'),\n type: 'boolean',\n description: t('settings.descriptionsFields.heartbeatEnabled'),\n },\n {\n key: 'heartbeatIntervalMs',\n label: t('settings.fields.heartbeatIntervalMs'),\n type: 'number',\n description: t('settings.descriptionsFields.heartbeatIntervalMs'),\n validation: { min: 1000, max: 600000 },\n },\n ],\n },\n ];\n }\n\n private async _loadSettings(): Promise<void> {\n if (!this.config?.url) return;\n\n this._loading = true;\n const { url, token } = this.config;\n\n try {\n // Load models first to ensure options are available\n await this._loadModels();\n\n const response = await fetch(`${url}/api/config`, {\n headers: token ? { 'Authorization': `Bearer ${token}` } : {},\n });\n\n if (response.ok) {\n const data = await response.json();\n const config = data.payload?.config;\n\n if (config) {\n // Handle model which can be a string or { primary, fallbacks }\n let modelValue = config.agents?.defaults?.model;\n if (modelValue && typeof modelValue === 'object') {\n modelValue = modelValue.primary || '';\n }\n \n this._values = {\n ...this._values,\n model: modelValue || 'anthropic/claude-sonnet-4-5',\n workspace: config.agents?.defaults?.workspace || '',\n maxTokens: config.agents?.defaults?.maxTokens || 8192,\n temperature: config.agents?.defaults?.temperature ?? 0.7,\n maxToolIterations: config.agents?.defaults?.maxToolIterations || 20,\n // Providers\n openaiApiKey: config.providers?.openai?.apiKey || '',\n anthropicApiKey: config.providers?.anthropic?.apiKey || '',\n googleApiKey: config.providers?.google?.apiKey || '',\n qwenApiKey: config.providers?.qwen?.apiKey || '',\n kimiApiKey: config.providers?.kimi?.apiKey || '',\n minimaxApiKey: config.providers?.minimax?.apiKey || '',\n deepseekApiKey: config.providers?.deepseek?.apiKey || '',\n openrouterApiKey: config.providers?.openrouter?.apiKey || '',\n // Telegram\n telegramEnabled: config.channels?.telegram?.enabled || false,\n telegramToken: config.channels?.telegram?.token || '',\n telegramApiRoot: config.channels?.telegram?.apiRoot || '',\n telegramDebug: config.channels?.telegram?.debug || false,\n telegramAllowFrom: (config.channels?.telegram?.allowFrom || []).join(', '),\n // WhatsApp\n whatsappEnabled: config.channels?.whatsapp?.enabled || false,\n whatsappBridgeUrl: config.channels?.whatsapp?.bridgeUrl || 'ws://localhost:3001',\n whatsappAllowFrom: (config.channels?.whatsapp?.allowFrom || []).join(', '),\n // Gateway\n heartbeatEnabled: config.gateway?.heartbeat?.enabled ?? true,\n heartbeatIntervalMs: config.gateway?.heartbeat?.intervalMs || 60000,\n };\n }\n }\n } catch (err) {\n console.error('Failed to load settings:', err);\n } finally {\n this._loading = false;\n }\n }\n\n private async _loadModels(): Promise<void> {\n if (!this.config?.url) return;\n\n try {\n const { url, token } = this.config;\n const response = await fetch(`${url}/api/models`, {\n headers: token ? { 'Authorization': `Bearer ${token}` } : {},\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.payload?.models) {\n this._models = data.payload.models;\n }\n }\n } catch (err) {\n console.error('Failed to load models:', err);\n }\n }\n\n private async _saveSettings(): Promise<void> {\n if (!this.config?.url || this._errors.size > 0) return;\n\n this._saving = true;\n this._saveSuccess = false;\n const { url, token } = this.config;\n\n // Build updates\n const updates: any = {};\n\n if (this._dirtyFields.has('model') || this._dirtyFields.has('maxTokens') ||\n this._dirtyFields.has('temperature') || this._dirtyFields.has('maxToolIterations') ||\n this._dirtyFields.has('workspace')) {\n updates.agents = { defaults: {} };\n if (this._dirtyFields.has('model')) {\n updates.agents.defaults.model = this._values.model;\n }\n if (this._dirtyFields.has('workspace')) {\n updates.agents.defaults.workspace = this._values.workspace;\n }\n if (this._dirtyFields.has('maxTokens')) {\n updates.agents.defaults.maxTokens = Number(this._values.maxTokens);\n }\n if (this._dirtyFields.has('temperature')) {\n updates.agents.defaults.temperature = Number(this._values.temperature);\n }\n if (this._dirtyFields.has('maxToolIterations')) {\n updates.agents.defaults.maxToolIterations = Number(this._values.maxToolIterations);\n }\n }\n\n // Update providers\n const providerFields = [\n 'openaiApiKey', 'anthropicApiKey', 'googleApiKey', 'qwenApiKey', \n 'kimiApiKey', 'minimaxApiKey', 'deepseekApiKey', 'openrouterApiKey'\n ];\n const dirtyProviders = providerFields.filter(f => this._dirtyFields.has(f));\n if (dirtyProviders.length > 0) {\n updates.providers = {};\n if (this._dirtyFields.has('openaiApiKey')) {\n updates.providers.openai = { apiKey: this._values.openaiApiKey };\n }\n if (this._dirtyFields.has('anthropicApiKey')) {\n updates.providers.anthropic = { apiKey: this._values.anthropicApiKey };\n }\n if (this._dirtyFields.has('googleApiKey')) {\n updates.providers.google = { apiKey: this._values.googleApiKey };\n }\n if (this._dirtyFields.has('qwenApiKey')) {\n updates.providers.qwen = { apiKey: this._values.qwenApiKey };\n }\n if (this._dirtyFields.has('kimiApiKey')) {\n updates.providers.kimi = { apiKey: this._values.kimiApiKey };\n }\n if (this._dirtyFields.has('minimaxApiKey')) {\n updates.providers.minimax = { apiKey: this._values.minimaxApiKey };\n }\n if (this._dirtyFields.has('deepseekApiKey')) {\n updates.providers.deepseek = { apiKey: this._values.deepseekApiKey };\n }\n if (this._dirtyFields.has('openrouterApiKey')) {\n updates.providers.openrouter = { apiKey: this._values.openrouterApiKey };\n }\n }\n\n // Update channels\n if (this._dirtyFields.has('telegramEnabled') || this._dirtyFields.has('whatsappEnabled') ||\n this._dirtyFields.has('telegramToken') || this._dirtyFields.has('telegramApiRoot') ||\n this._dirtyFields.has('telegramDebug') || this._dirtyFields.has('telegramAllowFrom') ||\n this._dirtyFields.has('whatsappBridgeUrl') || this._dirtyFields.has('whatsappAllowFrom')) {\n updates.channels = {};\n \n // Telegram\n if (this._dirtyFields.has('telegramEnabled') || this._dirtyFields.has('telegramToken') ||\n this._dirtyFields.has('telegramApiRoot') || this._dirtyFields.has('telegramDebug') ||\n this._dirtyFields.has('telegramAllowFrom')) {\n updates.channels = { ...updates.channels, telegram: {} };\n if (this._dirtyFields.has('telegramEnabled')) {\n updates.channels.telegram.enabled = Boolean(this._values.telegramEnabled);\n }\n if (this._dirtyFields.has('telegramToken')) {\n updates.channels.telegram.token = this._values.telegramToken;\n }\n if (this._dirtyFields.has('telegramApiRoot')) {\n updates.channels.telegram.apiRoot = this._values.telegramApiRoot || undefined;\n }\n if (this._dirtyFields.has('telegramDebug')) {\n updates.channels.telegram.debug = Boolean(this._values.telegramDebug);\n }\n if (this._dirtyFields.has('telegramAllowFrom')) {\n updates.channels.telegram.allowFrom = this._values.telegramAllowFrom\n ? this._values.telegramAllowFrom.split(',').map(s => s.trim()).filter(s => s)\n : [];\n }\n }\n\n // WhatsApp\n if (this._dirtyFields.has('whatsappEnabled') || this._dirtyFields.has('whatsappBridgeUrl') ||\n this._dirtyFields.has('whatsappAllowFrom')) {\n updates.channels = { ...updates.channels, whatsapp: {} };\n if (this._dirtyFields.has('whatsappEnabled')) {\n updates.channels.whatsapp.enabled = Boolean(this._values.whatsappEnabled);\n }\n if (this._dirtyFields.has('whatsappBridgeUrl')) {\n updates.channels.whatsapp.bridgeUrl = this._values.whatsappBridgeUrl;\n }\n if (this._dirtyFields.has('whatsappAllowFrom')) {\n updates.channels.whatsapp.allowFrom = this._values.whatsappAllowFrom\n ? this._values.whatsappAllowFrom.split(',').map(s => s.trim()).filter(s => s)\n : [];\n }\n }\n }\n\n if (this._dirtyFields.has('heartbeatEnabled') || this._dirtyFields.has('heartbeatIntervalMs')) {\n updates.gateway = { heartbeat: {} };\n if (this._dirtyFields.has('heartbeatEnabled')) {\n updates.gateway.heartbeat.enabled = Boolean(this._values.heartbeatEnabled);\n }\n if (this._dirtyFields.has('heartbeatIntervalMs')) {\n updates.gateway.heartbeat.intervalMs = Number(this._values.heartbeatIntervalMs);\n }\n }\n\n try {\n const response = await fetch(`${url}/api/config`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...(token ? { 'Authorization': `Bearer ${token}` } : {}),\n },\n body: JSON.stringify(updates),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to save settings');\n }\n\n this._dirtyFields.clear();\n this._saveSuccess = true;\n setTimeout(() => { this._saveSuccess = false; }, 3000);\n } catch (err) {\n console.error('Failed to save settings:', err);\n alert(err instanceof Error ? err.message : 'Failed to save settings');\n } finally {\n this._saving = false;\n }\n }\n\n private _handleInput(key: string, value: any): void {\n this._values = { ...this._values, [key]: value };\n this._dirtyFields.add(key);\n this.requestUpdate();\n }\n\n override render(): unknown {\n return html`\n <div class=\"settings-page\">\n <div class=\"settings-sidebar\">\n <div class=\"sidebar-header\">\n <h3>${t('settings.title')}</h3>\n </div>\n <nav class=\"sidebar-nav\">\n ${this._sections.map(section => html`\n <button\n class=\"nav-item ${this._activeSection === section.id ? 'active' : ''}\"\n @click=${() => this._activeSection = section.id}\n >\n ${getIcon(section.icon)}\n <span>${section.title}</span>\n </button>\n `)}\n </nav>\n </div>\n\n <div class=\"settings-main\">\n ${this._loading ? html`\n <div class=\"loading-state\">\n <div class=\"spinner\"></div>\n <p>${t('settings.loading')}</p>\n </div>\n ` : this._renderSection()}\n </div>\n\n <!-- Save button floating -->\n ${this._dirtyFields.size > 0 ? html`\n <div class=\"floating-save\">\n <span class=\"dirty-count\">${t('settings.unsaved', { count: this._dirtyFields.size })}</span>\n <button \n class=\"btn btn-primary\"\n ?disabled=${this._saving || this._errors.size > 0}\n @click=${this._saveSettings}\n >\n ${this._saving ? html`\n <span class=\"spinner-sm\"></span>\n ${t('settings.saving')}\n ` : html`\n <span>${getIcon('save')}</span>\n ${t('settings.saveChanges')}\n `}\n </button>\n </div>\n ` : ''}\n </div>\n `;\n }\n\n private _renderSection(): unknown {\n const section = this._sections.find(s => s.id === this._activeSection);\n if (!section) return html`<div>${t('settings.noSection')}</div>`;\n\n const descKey = `settings.descriptions.${section.id}` as const;\n\n return html`\n <div class=\"section-content\">\n <div class=\"section-header\">\n <h2>${section.title}</h2>\n <p class=\"section-desc\">${t(descKey)}</p>\n </div>\n\n <div class=\"fields-grid\">\n ${section.fields.map(field => this._renderField(field))}\n </div>\n </div>\n `;\n }\n\n private _renderField(field: SettingsField): unknown {\n const value = this._values[field.key];\n const error = this._errors.get(field.key);\n\n return html`\n <div class=\"field-group ${error ? 'has-error' : ''}\">\n <div class=\"field-header\">\n <label class=\"field-label\">${field.label}</label>\n ${field.validation?.required ? html`<span class=\"required-mark\">*</span>` : ''}\n </div>\n \n ${field.description ? html`<p class=\"field-desc\">${field.description}</p>` : ''}\n\n ${field.type === 'boolean' ? this._renderBooleanField(field, value) : ''}\n ${field.type === 'select' ? this._renderSelectField(field, value) : ''}\n ${['text', 'password', 'number'].includes(field.type) ? this._renderInputField(field, value) : ''}\n\n ${error ? html`\n <div class=\"field-error\">\n <span>${error}</span>\n </div>\n ` : ''}\n </div>\n `;\n }\n\n private _renderInputField(field: SettingsField, value: any): unknown {\n return html`\n <input\n type=${field.type === 'number' ? 'number' : 'text'}\n class=\"text-input\"\n .value=${String(value ?? '')}\n placeholder=${field.placeholder || ''}\n minlength=${field.validation?.min}\n maxlength=${field.validation?.max}\n min=${field.validation?.min}\n max=${field.validation?.max}\n @input=${(e: Event) => this._handleInput(field.key, (e.target as HTMLInputElement).value)}\n />\n `;\n }\n\n private _renderSelectField(field: SettingsField, value: any): unknown {\n return html`\n <select\n class=\"select-input\"\n .value=${String(value ?? '')}\n @change=${(e: Event) => this._handleInput(field.key, (e.target as HTMLSelectElement).value)}\n >\n ${field.options?.map(opt => html`\n <option value=${opt.value} ?selected=${value === opt.value}>${opt.label}</option>\n `)}\n </select>\n `;\n }\n\n private _renderBooleanField(field: SettingsField, value: any): unknown {\n return html`\n <label class=\"toggle-label\">\n <input\n type=\"checkbox\"\n class=\"toggle-input\"\n .checked=${Boolean(value)}\n @change=${(e: Event) => this._handleInput(field.key, (e.target as HTMLInputElement).checked)}\n />\n <span class=\"toggle-switch\"></span>\n <span class=\"toggle-text\">${field.description || t('settings.enableFeature')}</span>\n </label>\n `;\n }\n}\n","import { html, nothing } from 'lit';\nimport type { TemplateResult } from 'lit';\nimport { getIcon } from './utils/icons';\nimport { t } from './utils/i18n';\n\n// Get tab groups with i18n labels\nexport function getTabGroups() {\n return [\n { label: t('nav.chat'), tabs: ['chat'] as const },\n { label: t('nav.management'), tabs: ['sessions', 'cron', 'logs'] as const },\n { label: t('nav.settings'), tabs: ['settings'] as const },\n ];\n}\n\nexport type Tab = 'chat' | 'sessions' | 'cron' | 'logs' | 'settings';\n\nexport interface NavItem {\n id: Tab;\n label: string;\n icon: string;\n}\n\n// Get tab label (supports i18n)\nexport function getTabLabel(tab: Tab): string {\n return t(`nav.${tab}`);\n}\n\n// Tab icon map (no subtitle needed)\nconst TAB_ICONS: Record<Tab, string> = {\n chat: 'messageSquare',\n sessions: 'folderOpen',\n cron: 'clock',\n logs: 'fileText',\n settings: 'settings',\n};\n\n// Chat route with optional session key\nexport type ChatRoute = \n | { type: 'recent' } // Most recent session\n | { type: 'session'; sessionKey: string }\n | { type: 'new' }; // Create new session\n\n// Parse hash to get chat route\nexport function parseChatHash(hash: string): ChatRoute | null {\n const cleanHash = hash.replace(/^#\\/?chat\\/?/, '');\n \n if (!cleanHash || cleanHash === '/') {\n return { type: 'recent' };\n }\n \n const path = cleanHash.replace(/^\\/?/, '');\n \n if (path === 'new') {\n return { type: 'new' };\n }\n \n // Validate session key format (should be alphanumeric with colons)\n if (path && path.length > 0) {\n return { type: 'session', sessionKey: decodeURIComponent(path) };\n }\n \n return { type: 'recent' };\n}\n\n// Get hash from chat route\nexport function getChatHash(route: ChatRoute): string {\n switch (route.type) {\n case 'recent':\n return '#/chat';\n case 'new':\n return '#/chat/new';\n case 'session':\n return `#/chat/${encodeURIComponent(route.sessionKey)}`;\n }\n}\n\n// Render navigation item\nexport function renderNavItem(\n tab: Tab,\n isActive: boolean,\n onClick: () => void\n): TemplateResult {\n const icon = TAB_ICONS[tab];\n const label = getTabLabel(tab);\n \n return html`\n <button \n class=\"nav-item ${isActive ? 'nav-item--active' : ''}\"\n @click=${onClick}\n role=\"tab\"\n aria-selected=${isActive}\n >\n <span class=\"nav-item__icon\">${getIcon(icon)}</span>\n <span class=\"nav-item__text\">${label}</span>\n </button>\n `;\n}\n\n// Render a collapsed navigation group\nexport function renderNavGroup(\n label: string,\n items: TemplateResult[],\n isCollapsed: boolean = false\n): TemplateResult {\n return html`\n <div class=\"nav-group ${isCollapsed ? 'nav-group--collapsed' : ''}\">\n <div class=\"nav-label nav-label--static\">\n <span class=\"nav-label__text\">${label}</span>\n </div>\n <div class=\"nav-group__items\">\n ${items}\n </div>\n </div>\n `;\n}\n","import { html, LitElement, nothing } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport './gateway-chat';\nimport './pages/SessionManager';\nimport './pages/CronManager';\n// Pages\nimport './pages/LogManager';\nimport './pages/SettingsPage';\nimport {\n getTabGroups,\n type Tab,\n renderNavItem,\n parseChatHash,\n getChatHash,\n type ChatRoute\n} from './navigation';\nimport { getIcon } from './utils/icons';\nimport { t, setLanguage, getCurrentLanguage, initI18n } from './utils/i18n';\nimport type { XopcbotGatewayChat } from './gateway-chat';\n\nexport type { Tab } from './navigation';\n\nexport interface AppSettings {\n navCollapsed: boolean;\n theme: 'light' | 'dark' | 'system';\n}\n\n// SettingsPage component is imported at top\n\n@customElement('xopcbot-app')\nexport class XopcbotApp extends LitElement {\n @property({ attribute: false }) gatewayConfig?: {\n url: string;\n token?: string;\n };\n\n @state() private _activeTab: Tab = 'chat';\n @state() private _navCollapsed = false;\n @state() private _navMobileOpen = false; // Mobile overlay state\n @state() private _theme: 'light' | 'dark' | 'system' = 'system';\n @state() private _language: 'en' | 'zh' = 'en';\n @state() private _chatRoute: ChatRoute = { type: 'recent' };\n\n @query('xopcbot-gateway-chat') private _chatElement!: XopcbotGatewayChat;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._loadTheme();\n this._loadLanguage();\n this._loadRouteFromHash();\n\n // Listen for system theme changes\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n if (this._theme === 'system') {\n this._applyTheme();\n }\n });\n\n // Listen for language changes\n window.addEventListener('languagechange', () => {\n this.requestUpdate();\n });\n\n // Listen for hash changes (browser back/forward)\n window.addEventListener('hashchange', () => {\n this._loadRouteFromHash();\n });\n }\n\n /**\n * Load current tab from URL hash\n */\n private _loadRouteFromHash(): void {\n const hash = location.hash.slice(1);\n \n // Check if it's a chat route with session\n if (hash.startsWith('chat')) {\n const chatRoute = parseChatHash(hash);\n if (chatRoute) {\n if (this._activeTab !== 'chat') {\n this._activeTab = 'chat';\n }\n // Only update if route changed\n if (JSON.stringify(this._chatRoute) !== JSON.stringify(chatRoute)) {\n this._chatRoute = chatRoute;\n }\n }\n return;\n }\n \n const tab = hash as Tab;\n const validTabs: Tab[] = ['sessions', 'cron', 'logs', 'settings'];\n \n if (validTabs.includes(tab)) {\n if (this._activeTab !== tab) {\n this._activeTab = tab;\n }\n }\n }\n\n /**\n * Update URL hash when switching tabs\n */\n private _switchTab(tab: Tab): void {\n this._activeTab = tab;\n \n // Update URL hash without triggering hashchange\n let newHash: string;\n if (tab === 'chat') {\n newHash = getChatHash(this._chatRoute);\n } else {\n newHash = `#${tab}`;\n }\n \n if (location.hash !== newHash) {\n history.pushState(null, '', newHash);\n }\n \n // Close mobile nav if open\n this._navMobileOpen = false;\n }\n\n /**\n * Update chat route and URL\n */\n private _updateChatRoute(route: ChatRoute): void {\n this._chatRoute = route;\n const newHash = getChatHash(route);\n history.pushState(null, '', newHash);\n }\n\n private _loadTheme(): void {\n const saved = localStorage.getItem('xopcbot-theme') as 'light' | 'dark' | 'system' | null;\n if (saved) {\n this._theme = saved;\n }\n this._applyTheme();\n }\n\n private _loadLanguage(): void {\n const saved = localStorage.getItem('xopcbot-language') as 'en' | 'zh' | null;\n if (saved) {\n this._language = saved;\n setLanguage(saved);\n }\n }\n\n private _applyTheme(): void {\n const html = document.documentElement;\n\n // Remove both classes first\n html.classList.remove('light', 'dark');\n\n let isDark = false;\n if (this._theme === 'dark') {\n isDark = true;\n } else if (this._theme === 'system') {\n isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n // For 'light' or when system is light, isDark remains false\n\n if (isDark) {\n html.classList.add('dark');\n } else {\n html.classList.add('light');\n }\n\n // Dispatch event for other components\n window.dispatchEvent(new CustomEvent('themechange', {\n detail: { theme: isDark ? 'dark' : 'light' }\n }));\n }\n\n private _setTheme(theme: 'light' | 'dark' | 'system'): void {\n this._theme = theme;\n localStorage.setItem('xopcbot-theme', theme);\n this._applyTheme();\n }\n\n private _setLanguage(lang: 'en' | 'zh'): void {\n this._language = lang;\n setLanguage(lang);\n localStorage.setItem('xopcbot-language', lang);\n this.requestUpdate();\n }\n\n private _renderThemeToggle(): unknown {\n return html`\n <div class=\"pill-toggle\">\n <button\n class=\"pill-btn ${this._theme === 'light' ? 'active' : ''}\"\n @click=${() => this._setTheme('light')}\n title=\"Light\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"5\"></circle>\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"></line>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line>\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"></line>\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"></line>\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"></line>\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"></line>\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"></line>\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"></line>\n </svg>\n </button>\n <button\n class=\"pill-btn ${this._theme === 'dark' ? 'active' : ''}\"\n @click=${() => this._setTheme('dark')}\n title=\"Dark\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"></path>\n </svg>\n </button>\n <button\n class=\"pill-btn ${this._theme === 'system' ? 'active' : ''}\"\n @click=${() => this._setTheme('system')}\n title=\"System\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line>\n </svg>\n </button>\n </div>\n `;\n }\n\n private _renderLanguageToggle(): unknown {\n return html`\n <div class=\"pill-toggle\">\n <button\n class=\"pill-btn ${this._language === 'en' ? 'active' : ''}\"\n @click=${() => this._setLanguage('en')}\n title=\"English\"\n >\n EN\n </button>\n <button\n class=\"pill-btn ${this._language === 'zh' ? 'active' : ''}\"\n @click=${() => this._setLanguage('zh')}\n title=\"中文\"\n >\n 中\n </button>\n </div>\n `;\n }\n\n private _toggleNav(): void {\n const isMobile = window.innerWidth < 768;\n if (isMobile) {\n // Mobile: toggle overlay\n this._navMobileOpen = !this._navMobileOpen;\n } else {\n // Desktop: toggle collapsed state\n this._navCollapsed = !this._navCollapsed;\n }\n }\n\n private _closeNavMobile(): void {\n this._navMobileOpen = false;\n }\n\n override render(): unknown {\n return html`\n <div class=\"shell ${this._activeTab === 'chat' ? 'shell--chat' : ''} ${this._navCollapsed ? 'shell--nav-collapsed' : ''}\">\n <!-- Topbar -->\n <header class=\"topbar\">\n <div class=\"topbar-left\">\n <button\n class=\"nav-collapse-toggle\"\n @click=${this._toggleNav}\n title=\"${this._navCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\"\n aria-label=\"${this._navCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\"\n >\n <span class=\"nav-collapse-toggle__icon\">${getIcon('menu')}</span>\n </button>\n\n <div class=\"brand\">\n <div class=\"brand-logo\">\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"24\" height=\"24\" rx=\"6\" fill=\"url(#logo-gradient)\"/>\n <path d=\"M8 12L11 15L16 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <defs>\n <linearGradient id=\"logo-gradient\" x1=\"0\" y1=\"0\" x2=\"24\" y2=\"24\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3b82f6\"/>\n <stop offset=\"1\" stop-color=\"#8b5cf6\"/>\n </linearGradient>\n </defs>\n </svg>\n </div>\n <div class=\"brand-text\">\n <div class=\"brand-title\">XOPCBOT</div>\n <div class=\"brand-sub\">Gateway</div>\n </div>\n </div>\n </div>\n\n <div class=\"topbar-status\">\n ${this._renderLanguageToggle()}\n ${this._renderThemeToggle()}\n </div>\n </header>\n\n <!-- Mobile Overlay Backdrop -->\n ${this._navMobileOpen ? html`\n <div class=\"nav-overlay\" @click=${this._closeNavMobile}></div>\n ` : nothing}\n\n <div class=\"shell-main\">\n <!-- Sidebar Navigation -->\n <aside class=\"nav ${this._navCollapsed ? 'nav--collapsed' : ''} ${this._navMobileOpen ? 'nav--mobile-open' : ''}\">\n ${getTabGroups().map((group) => {\n const hasActiveTab = group.tabs.some((tab) => tab === this._activeTab);\n return html`\n <div class=\"nav-group\">\n <div class=\"nav-label nav-label--static\">\n <span class=\"nav-label__text\">${group.label}</span>\n </div>\n <div class=\"nav-group__items\">\n ${group.tabs.map((tab) =>\n renderNavItem(\n tab,\n this._activeTab === tab,\n () => {\n this._switchTab(tab);\n }\n )\n )}\n </div>\n </div>\n `;\n })}\n </aside>\n\n <!-- Main Content -->\n <main class=\"content ${this._activeTab === 'chat' ? 'content--chat' : ''}\">\n ${this._activeTab === 'chat' ? this._renderChat() : nothing}\n ${this._activeTab === 'sessions' ? this._renderSessions() : nothing}\n ${this._activeTab === 'cron' ? this._renderCron() : nothing}\n ${this._activeTab === 'logs' ? this._renderLogs() : nothing}\n ${this._activeTab === 'settings' ? this._renderSettings() : nothing}\n </main>\n </div>\n </div>\n `;\n }\n\n private _renderChat(): unknown {\n return html`\n <xopcbot-gateway-chat\n .config=${this.gatewayConfig}\n .route=${this._chatRoute}\n .enableAttachments=${true}\n .enableModelSelector=${true}\n .enableThinkingSelector=${true}\n @route-change=${(e: CustomEvent<ChatRoute>) => this._updateChatRoute(e.detail)}\n ></xopcbot-gateway-chat>\n `;\n }\n\n private _renderSessions(): unknown {\n const url = this.gatewayConfig?.url || '';\n const token = this.gatewayConfig?.token;\n \n return html`\n <session-manager\n .config=${{ url, token }}\n ></session-manager>\n `;\n }\n\n private _renderCron(): unknown {\n const url = this.gatewayConfig?.url || '';\n const token = this.gatewayConfig?.token;\n \n return html`\n <cron-manager\n .config=${{ url, token }}\n ></cron-manager>\n `;\n }\n\n private _renderLogs(): unknown {\n const url = this.gatewayConfig?.url || '';\n const token = this.gatewayConfig?.token;\n \n return html`\n <log-manager\n .config=${{ url, token }}\n ></log-manager>\n `;\n }\n\n private _renderSettings(): unknown {\n const url = this.gatewayConfig?.url || '';\n const token = this.gatewayConfig?.token;\n \n return html`\n <settings-page\n .config=${{ url, token }}\n ></settings-page>\n `;\n }\n\n // Public method to show chat\n public showChat(): void {\n this._activeTab = 'chat';\n }\n\n // Get chat element for external access\n public get chatElement(): XopcbotGatewayChat | undefined {\n return this._chatElement;\n }\n}\n\n// Export as both named and default for flexibility\nexport { XopcbotApp as default };\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { \n User, Bot, Plug, Globe, Search, Clock, Puzzle, \n X, Save, ChevronRight, Check, AlertCircle,\n Settings, Eye, EyeOff, Loader2\n} from 'lucide';\nimport { t } from '../utils/i18n';\n\nexport interface SettingsSection {\n id: string;\n title: string;\n icon: string;\n fields: SettingsField[];\n}\n\nexport interface SettingsField {\n key: string;\n label: string;\n type: 'text' | 'password' | 'number' | 'boolean' | 'select' | 'textarea';\n description?: string;\n placeholder?: string;\n options?: Array<{ value: string; label: string }>;\n validation?: {\n required?: boolean;\n min?: number;\n max?: number;\n pattern?: string;\n };\n}\n\nexport interface SettingsValue {\n [key: string]: any;\n}\n\n@customElement('xopcbot-settings')\nexport class XopcbotSettings extends LitElement {\n @property({ attribute: false }) sections: SettingsSection[] = [];\n @property({ attribute: false }) values: SettingsValue = {};\n @property({ type: Boolean }) loading = false;\n @property({ attribute: false }) onSave?: (values: SettingsValue) => void;\n @property({ attribute: false }) onClose?: () => void;\n\n @state() private _activeSection: string = '';\n @state() private _dirtyFields: Set<string> = new Set();\n @state() private _showPasswords: Set<string> = new Set();\n @state() private _errors: Map<string, string> = new Map();\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._updateActiveSection();\n }\n\n override willUpdate(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has('sections')) {\n this._updateActiveSection();\n }\n }\n\n private _updateActiveSection(): void {\n if (this.sections.length > 0 && !this._activeSection) {\n this._activeSection = this.sections[0].id;\n }\n }\n\n private _getIcon(iconName: string): TemplateResult {\n const icons: Record<string, TemplateResult> = {\n user: html`<User class=\"w-5 h-5\" />`,\n bot: html`<Bot class=\"w-5 h-5\" />`,\n plug: html`<Plug class=\"w-5 h-5\" />`,\n globe: html`<Globe class=\"w-5 h-5\" />`,\n search: html`<Search class=\"w-5 h-5\" />`,\n clock: html`<Clock class=\"w-5 h-5\" />`,\n puzzle: html`<Puzzle class=\"w-5 h-5\" />`,\n settings: html`<Settings class=\"w-5 h-5\" />`,\n };\n return icons[iconName] || html`<Settings class=\"w-5 h-5\" />`;\n }\n\n override render(): unknown {\n return html`\n <div class=\"settings-overlay\" @click=${(e: Event) => e.target === e.currentTarget && this.onClose?.()}>\n <div class=\"settings-dialog\">\n ${this.renderHeader()}\n <div class=\"settings-content\">\n ${this.renderSidebar()}\n ${this.renderMain()}\n </div>\n ${this.renderFooter()}\n </div>\n </div>\n `;\n }\n\n private renderHeader(): unknown {\n return html`\n <div class=\"settings-header\">\n <div class=\"settings-title\">\n <Settings class=\"w-5 h-5\" />\n <span>Settings</span>\n </div>\n <button class=\"close-btn\" @click=${() => this.onClose?.()}>\n <X class=\"w-5 h-5\" />\n </button>\n </div>\n `;\n }\n\n private renderSidebar(): unknown {\n return html`\n <nav class=\"settings-sidebar\">\n ${this.sections.map((section) => html`\n <button\n class=\"sidebar-item ${this._activeSection === section.id ? 'active' : ''}\"\n @click=${() => this._activeSection = section.id}\n >\n ${this._getIcon(section.icon)}\n <span>${section.title}</span>\n <ChevronRight class=\"w-4 h-4 chevron\" />\n </button>\n `)}\n </nav>\n `;\n }\n\n private renderMain(): unknown {\n const section = this.sections.find(s => s.id === this._activeSection);\n if (!section) return html`<div class=\"settings-main\">${t('settings.noSection')}</div>`;\n\n const descKey = `settings.descriptions.${section.id}` as const;\n\n return html`\n <div class=\"settings-main\">\n <div class=\"section-header\">\n <h2>${section.title}</h2>\n <p class=\"section-description\">${t(descKey)}</p>\n </div>\n \n <div class=\"fields-grid\">\n ${section.fields.map(field => this.renderField(field, section.id))}\n </div>\n </div>\n `;\n }\n\n private renderField(field: SettingsField, sectionId: string): unknown {\n const fullKey = `${sectionId}.${field.key}`;\n const value = this._getValue(field.key);\n const isDirty = this._dirtyFields.has(fullKey);\n const error = this._errors.get(fullKey);\n const showPassword = this._showPasswords.has(fullKey);\n\n return html`\n <div class=\"field-group ${error ? 'has-error' : ''}\">\n <div class=\"field-header\">\n <label class=\"field-label\">${field.label}</label>\n ${field.validation?.required ? html`<span class=\"required-mark\">*</span>` : ''}\n </div>\n \n ${field.description ? html`<p class=\"field-description\">${field.description}</p>` : ''}\n\n ${field.type === 'boolean' ? this.renderBooleanField(field, value, fullKey) : ''}\n \n ${field.type === 'select' ? this.renderSelectField(field, value, fullKey) : ''}\n \n ${field.type === 'textarea' ? this.renderTextareaField(field, value, fullKey) : ''}\n \n ${['text', 'password', 'number'].includes(field.type) \n ? this.renderInputField(field, value, fullKey, showPassword) \n : ''}\n\n ${error ? html`\n <div class=\"field-error\">\n <AlertCircle class=\"w-4 h-4\" />\n <span>${error}</span>\n </div>\n ` : ''}\n\n ${isDirty && !error ? html`\n <div class=\"field-dirty\">${t('settings.unsavedChanges')}</div>\n ` : ''}\n </div>\n `;\n }\n\n private renderInputField(field: SettingsField, value: any, fullKey: string, showPassword: boolean): unknown {\n const inputType = field.type === 'password' \n ? (showPassword ? 'text' : 'password') \n : field.type;\n\n return html`\n <div class=\"input-wrapper\">\n <input\n type=${inputType}\n class=\"text-input ${field.type === 'password' ? 'has-toggle' : ''}\"\n .value=${String(value ?? '')}\n placeholder=${field.placeholder || ''}\n minlength=${field.validation?.min}\n maxlength=${field.validation?.max}\n pattern=${field.validation?.pattern || ''}\n @input=${(e: Event) => this._handleInput(field, fullKey, (e.target as HTMLInputElement).value)}\n />\n ${field.type === 'password' ? html`\n <button \n type=\"button\" \n class=\"password-toggle\"\n @click=${() => this._togglePassword(fullKey)}\n >\n ${showPassword ? html`<EyeOff class=\"w-4 h-4\" />` : html`<Eye class=\"w-4 h-4\" />`}\n </button>\n ` : ''}\n </div>\n `;\n }\n\n private renderTextareaField(field: SettingsField, value: any, fullKey: string): unknown {\n return html`\n <textarea\n class=\"textarea-input\"\n .value=${String(value ?? '')}\n placeholder=${field.placeholder || ''}\n rows=\"4\"\n @input=${(e: Event) => this._handleInput(field, fullKey, (e.target as HTMLTextAreaElement).value)}\n ></textarea>\n `;\n }\n\n private renderSelectField(field: SettingsField, value: any, fullKey: string): unknown {\n return html`\n <select\n class=\"select-input\"\n .value=${String(value ?? '')}\n @change=${(e: Event) => this._handleInput(field, fullKey, (e.target as HTMLSelectElement).value)}\n >\n ${field.options?.map(opt => html`\n <option value=${opt.value} ?selected=${value === opt.value}>${opt.label}</option>\n `)}\n </select>\n `;\n }\n\n private renderBooleanField(field: SettingsField, value: any, fullKey: string): unknown {\n return html`\n <label class=\"toggle-label\">\n <input\n type=\"checkbox\"\n class=\"toggle-input\"\n .checked=${Boolean(value)}\n @change=${(e: Event) => this._handleInput(field, fullKey, (e.target as HTMLInputElement).checked)}\n />\n <span class=\"toggle-switch\"></span>\n <span class=\"toggle-text\">${field.description || t('settings.enableFeature')}</span>\n </label>\n `;\n }\n\n private renderFooter(): unknown {\n const hasDirty = this._dirtyFields.size > 0;\n\n return html`\n <div class=\"settings-footer\">\n <button class=\"btn btn-ghost\" @click=${() => this.onClose?.()}>\n ${t('settings.cancel')}\n </button>\n <button \n class=\"btn btn-primary\" \n ?disabled=${this.loading || !hasDirty}\n @click=${() => this._save()}\n >\n ${this.loading ? html`\n <Loader2 class=\"w-4 h-4 animate-spin\" />\n ${t('settings.saving')}\n ` : html`\n <Save class=\"w-4 h-4\" />\n ${t('settings.saveChanges')}\n `}\n </button>\n </div>\n `;\n }\n\n private _getValue(key: string): any {\n return this.values[key];\n }\n\n private _handleInput(field: SettingsField, fullKey: string, value: any): void {\n // Validate\n if (field.validation?.required && !value) {\n this._errors.set(fullKey, t('settings.required', { field: field.label }));\n } else if (field.validation?.pattern && value) {\n const regex = new RegExp(field.validation.pattern);\n if (!regex.test(value)) {\n this._errors.set(fullKey, t('settings.invalidFormat'));\n } else {\n this._errors.delete(fullKey);\n }\n } else {\n this._errors.delete(fullKey);\n }\n\n this._dirtyFields.add(fullKey);\n this.requestUpdate();\n }\n\n private _togglePassword(fullKey: string): void {\n if (this._showPasswords.has(fullKey)) {\n this._showPasswords.delete(fullKey);\n } else {\n this._showPasswords.add(fullKey);\n }\n this.requestUpdate();\n }\n\n private _save(): void {\n // Final validation\n if (this._errors.size > 0) {\n return;\n }\n\n if (this.onSave) {\n this.onSave(this.values);\n }\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { Agent, type AgentEvent } from '@mariozechner/pi-agent-core';\nimport './components/MessageEditor';\nimport './components/MessageList';\nimport './components/StreamingMessageContainer';\nimport './gateway-chat';\nimport './app';\nimport { i18n, setLanguage, translations } from './utils/i18n';\nimport type { Attachment } from './utils/attachment-utils';\nimport type { MessageEditor } from './components/MessageEditor';\nimport type { StreamingMessageContainer } from './components/StreamingMessageContainer';\n\n// Utils\nexport { t, i18n, setLanguage, getCurrentLanguage, initI18n, type Language } from './utils/i18n';\nexport type { Attachment } from './utils/attachment-utils';\nexport { formatUsage, formatTokenCount, formatCost } from './utils/format';\nexport { getIcon, loadIcon, getDocumentIcon } from './utils/icons';\n\n// Components\nexport { MessageEditor } from './components/MessageEditor';\nexport { \n MessageList, \n MessageBubble, \n AttachmentRenderer, \n UsageBadge \n} from './components/index';\nexport type { \n Attachment as MessageAttachment, \n Message, \n MessageContent \n} from './components/MessageList/types';\nexport { StreamingMessageContainer } from './components/StreamingMessageContainer';\n\n// Dialogs\nexport { XopcbotSettings, type SettingsSection, type SettingsField, type SettingsValue } from './dialogs/SettingsDialog';\n\n// Gateway Chat - with type-safe events\nexport { \n XopcbotGatewayChat, \n type GatewayClientConfig,\n type GatewayEvent,\n type ChatPayload,\n type ConfigPayload,\n type ErrorPayload,\n type GatewayResponse,\n type GatewayRequest\n} from './gateway-chat';\n\n// App\nexport { XopcbotApp, type Tab, type AppSettings } from './app';\n\n@customElement('xopcbot-chat')\nexport class XopcbotChat extends LitElement {\n @property({ attribute: false }) agent?: Agent;\n @property({ type: Boolean }) enableAttachments = true;\n @property({ type: Boolean }) enableModelSelector = true;\n @property({ type: Boolean }) enableThinkingSelector = true;\n\n @query('message-editor') private _messageEditor!: MessageEditor;\n @query('streaming-message-container') private _streamingContainer!: StreamingMessageContainer;\n\n private _autoScroll = true;\n private _lastScrollTop = 0;\n private _scrollContainer?: HTMLElement;\n private _resizeObserver?: ResizeObserver;\n private _unsubscribeSession?: () => void;\n\n createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.display = 'flex';\n this.style.flexDirection = 'column';\n this.style.height = '100%';\n this.style.minHeight = '0';\n\n this.setupSessionSubscription();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._scrollContainer?.removeEventListener('scroll', this._handleScroll);\n this._unsubscribeSession?.();\n }\n\n private setupSessionSubscription(): void {\n if (this._unsubscribeSession) {\n this._unsubscribeSession();\n }\n if (!this.agent) return;\n\n this._unsubscribeSession = this.agent.subscribe(async (ev: AgentEvent) => {\n switch (ev.type) {\n case 'message_start':\n case 'message_end':\n case 'turn_start':\n case 'turn_end':\n case 'agent_start':\n this.requestUpdate();\n break;\n case 'agent_end':\n if (this._streamingContainer) {\n this._streamingContainer.isStreaming = false;\n this._streamingContainer.setMessage(null, true);\n }\n this.requestUpdate();\n break;\n case 'message_update':\n if (this._streamingContainer) {\n this._streamingContainer.isStreaming = this.agent?.state.isStreaming || false;\n this._streamingContainer.setMessage(ev.message, !this._streamingContainer.isStreaming);\n }\n this.requestUpdate();\n break;\n }\n });\n }\n\n private _handleScroll = (): void => {\n if (!this._scrollContainer) return;\n\n const currentScrollTop = this._scrollContainer.scrollTop;\n const scrollHeight = this._scrollContainer.scrollHeight;\n const clientHeight = this._scrollContainer.clientHeight;\n const distanceFromBottom = scrollHeight - currentScrollTop - clientHeight;\n\n if (clientHeight < this._lastClientHeight) {\n this._lastClientHeight = clientHeight;\n return;\n }\n\n if (currentScrollTop !== 0 && currentScrollTop < this._lastScrollTop && distanceFromBottom > 50) {\n this._autoScroll = false;\n } else if (distanceFromBottom < 10) {\n this._autoScroll = true;\n }\n\n this._lastScrollTop = currentScrollTop;\n this._lastClientHeight = clientHeight;\n };\n\n public setInput(text: string, attachments?: Attachment[]): void {\n if (this._messageEditor) {\n this._messageEditor.value = text;\n this._messageEditor.attachments = attachments || [];\n }\n }\n\n public setAutoScroll(enabled: boolean): void {\n this._autoScroll = enabled;\n }\n\n public async sendMessage(input: string, attachments?: Attachment[]): Promise<void> {\n if ((!input.trim() && attachments?.length === 0) || this.agent?.state.isStreaming) return;\n if (!this.agent) throw new Error('No agent set');\n if (!this.agent.state.model) throw new Error('No model set');\n\n this._messageEditor.value = '';\n this._messageEditor.attachments = [];\n this._autoScroll = true;\n\n if (attachments && attachments.length > 0) {\n await this.agent.prompt({\n role: 'user-with-attachments',\n content: input,\n attachments,\n timestamp: Date.now(),\n });\n } else {\n await this.agent.prompt(input);\n }\n }\n\n private renderMessages(): unknown {\n if (!this.agent) {\n return html`<div class=\"p-4 text-center text-muted-foreground\">${i18n('No session available')}</div>`;\n }\n\n const state = this.agent.state;\n return html`\n <div class=\"flex flex-col gap-3\">\n <message-list\n .messages=${this.agent.state.messages}\n .tools=${state.tools}\n .pendingToolCalls=${this.agent ? this.agent.state.pendingToolCalls : new Set<string>()}\n .isStreaming=${state.isStreaming}\n ></message-list>\n\n <streaming-message-container\n class=\"${state.isStreaming ? '' : 'hidden'}\"\n .tools=${state.tools}\n .isStreaming=${state.isStreaming}\n .pendingToolCalls=${state.pendingToolCalls}\n .isStreaming=${state.isStreaming}\n ></streaming-message-container>\n </div>\n `;\n }\n\n override render(): unknown {\n if (!this.agent) {\n return html`<div class=\"p-4 text-center text-muted-foreground\">${i18n('No agent set')}</div>`;\n }\n\n const state = this.agent.state;\n return html`\n <div class=\"flex flex-col h-full bg-background text-foreground\">\n <div class=\"flex-1 overflow-y-auto\">\n <div class=\"max-w-3xl mx-auto p-4 pb-0\">${this.renderMessages()}</div>\n </div>\n\n <div class=\"shrink-0\">\n <div class=\"max-w-3xl mx-auto px-2\">\n <message-editor\n .isStreaming=${state.isStreaming}\n .currentModel=${state.model}\n .thinkingLevel=${state.thinkingLevel}\n .showAttachmentButton=${this.enableAttachments}\n .showModelSelector=${this.enableModelSelector}\n .showThinkingSelector=${this.enableThinkingSelector}\n .onSend=${(input: string, attachments: Attachment[]) => this.sendMessage(input, attachments)}\n .onAbort=${() => this.agent?.abort()}\n ></message-editor>\n </div>\n </div>\n </div>\n `;\n }\n}\n"],"names":["t","e","s","o","n$5","r","n","S","c","i","h","a","l","p","d","u","f","b","y$1","y","v","_","m","g","$","x","E","A","C","P","V","N","I","L","z","H","M","R","k","Z","B","D","defaultAttributes","Paperclip","Send","Square","X","builtInTranslations","enTranslations","zhTranslations","translationCache","currentLanguage","path","params","translations","keys","value","key","enValue","paramValue","loadLanguage","lang","response","error","setLanguage","initI18n","defaultLang","legacyKeys","i18n","newKey","iconToSvg","iconData","className","_tag","attrs","children","attrStr","childrenStr","child","cTag","cAttrs","cAttrStr","MessageEditor","LitElement","createRef","files","target","items","imageFiles","item","file","input","html","ref","att","index","unsafeHTML","canSend","type","textarea","attachments","attachment","base64","isImage","resolve","reject","reader","bytes","units","unitIndex","size","__decorateClass","query","property","state","customElement","getIcon","name","fallbackIcons","getDocumentIcon","mimeType","AttachmentRenderer","images","documents","count","galleryClass","img","doc","UsageBadge","parts","MessageBubble","isUser","isAssistant","roleLabel","avatarLetter","content","block","isError","timestamp","MessageList","message","container","threshold","scrollTop","scrollHeight","clientHeight","StreamingMessageContainer","isComplete","inputStr","text","div","apiUrl","base","authHeaders","token","XopcbotGatewayChat","atBottom","attachmentData","changedProperties","route","targetSessionKey","sessionKey","offset","url","headers","res","session","messages","newMessages","msg","err","smooth","eventsUrl","data","gatewaySessions","sessionsWithMessages","recentKey","emptySession","newHash","chatId","body","json","buffer","currentEventType","currentEventData","done","newlineIndex","line","lines","event","parsed","textBlock","method","color","SessionCard","action","dateStr","date","diffDays","channel","displayName","isArchived","isPinned","tag","tokens","SessionList","SessionDetailDrawer","results","direction","resultIndex","element","part","isSearchResult","isCurrentResult","ConfirmDialog","confirmed","SessionAPIClient","baseUrl","queryString","format","SessionManager","httpUrl","reset","result","blob","status","fn","ms","timeout","CronAPIClient","id","schedule","options","updates","enabled","limit","CronManager","config","chatIds","job","knownChannels","delivery","payload","jobData","fullJob","jobId","nothing","model","ch","now","diff","mins","hours","days","LOG_LEVELS","LOG_LEVEL_COLORS","LogAPIClient","LogManager","level","log","SettingsPage","modelOptions","modelValue","section","descKey","field","opt","getTabGroups","getTabLabel","tab","TAB_ICONS","parseChatHash","hash","cleanHash","getChatHash","renderNavItem","isActive","onClick","icon","label","XopcbotApp","chatRoute","saved","isDark","theme","group","XopcbotSettings","iconName","sectionId","fullKey","isDirty","showPassword","inputType","hasDirty","XopcbotChat","currentScrollTop","distanceFromBottom","ev"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]}
|