agim-cli 1.2.52 → 1.2.54
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/CHANGELOG.md +14 -0
- package/dist/core/a2a-notify.js +3 -1
- package/dist/core/a2a-notify.js.map +1 -1
- package/dist/core/config-schema.d.ts +7 -7
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +47 -4
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/message-sink.d.ts.map +1 -1
- package/dist/core/message-sink.js +4 -1
- package/dist/core/message-sink.js.map +1 -1
- package/dist/web/public/assets/{a2a-06bnQicA.js → a2a-DNxqMtla.js} +2 -2
- package/dist/web/public/assets/{a2a-06bnQicA.js.map → a2a-DNxqMtla.js.map} +1 -1
- package/dist/web/public/assets/{activity-Bhc6Esfy.js → activity-C5_-rLe6.js} +2 -2
- package/dist/web/public/assets/{activity-Bhc6Esfy.js.map → activity-C5_-rLe6.js.map} +1 -1
- package/dist/web/public/assets/{admins-BVpnOw3o.js → admins-DSOax_hH.js} +2 -2
- package/dist/web/public/assets/{admins-BVpnOw3o.js.map → admins-DSOax_hH.js.map} +1 -1
- package/dist/web/public/assets/{agents-Cn7D3UMz.js → agents-T687l0rN.js} +2 -2
- package/dist/web/public/assets/{agents-Cn7D3UMz.js.map → agents-T687l0rN.js.map} +1 -1
- package/dist/web/public/assets/{approvals-BJiLyoLf.js → approvals-CWorM8Vw.js} +2 -2
- package/dist/web/public/assets/{approvals-BJiLyoLf.js.map → approvals-CWorM8Vw.js.map} +1 -1
- package/dist/web/public/assets/{asks-C7gKbna1.js → asks-PiqKpXZ1.js} +2 -2
- package/dist/web/public/assets/{asks-C7gKbna1.js.map → asks-PiqKpXZ1.js.map} +1 -1
- package/dist/web/public/assets/{audit-DgWZD8l5.js → audit-C2Ox35e1.js} +2 -2
- package/dist/web/public/assets/{audit-DgWZD8l5.js.map → audit-C2Ox35e1.js.map} +1 -1
- package/dist/web/public/assets/{bell-pWZT2wlM.js → bell-Cj5Dt_yv.js} +2 -2
- package/dist/web/public/assets/{bell-pWZT2wlM.js.map → bell-Cj5Dt_yv.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-DkAJdzHf.js → bgjobs-DxEVHpLB.js} +2 -2
- package/dist/web/public/assets/{bgjobs-DkAJdzHf.js.map → bgjobs-DxEVHpLB.js.map} +1 -1
- package/dist/web/public/assets/{brain-B0mM-ro_.js → brain-LvSyYmLT.js} +2 -2
- package/dist/web/public/assets/{brain-B0mM-ro_.js.map → brain-LvSyYmLT.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-CUQlj33_.js → briefcase-CJMKdAPu.js} +2 -2
- package/dist/web/public/assets/{briefcase-CUQlj33_.js.map → briefcase-CJMKdAPu.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-CJuDP_fx.js → chevron-right-BUOV_Xg8.js} +2 -2
- package/dist/web/public/assets/{chevron-right-CJuDP_fx.js.map → chevron-right-BUOV_Xg8.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-CYse8LRx.js → circle-check-BYLlUkXj.js} +2 -2
- package/dist/web/public/assets/{circle-check-CYse8LRx.js.map → circle-check-BYLlUkXj.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-9NpJLA1Z.js → circle-check-big-KNa00WXm.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-9NpJLA1Z.js.map → circle-check-big-KNa00WXm.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-BxZ24SVG.js → circle-x-CGLLbBL-.js} +2 -2
- package/dist/web/public/assets/{circle-x-BxZ24SVG.js.map → circle-x-CGLLbBL-.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-CmHeZ7ei.js → confirm-dialog-CLfYzx-a.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-CmHeZ7ei.js.map → confirm-dialog-CLfYzx-a.js.map} +1 -1
- package/dist/web/public/assets/{data-table-tu4BIahS.js → data-table-ZySeRfEP.js} +2 -2
- package/dist/web/public/assets/{data-table-tu4BIahS.js.map → data-table-ZySeRfEP.js.map} +1 -1
- package/dist/web/public/assets/{dialog-D8QAkLhI.js → dialog-DS0Dk6GL.js} +2 -2
- package/dist/web/public/assets/{dialog-D8QAkLhI.js.map → dialog-DS0Dk6GL.js.map} +1 -1
- package/dist/web/public/assets/{download-DBS0ZPTh.js → download-1aUlz7_D.js} +2 -2
- package/dist/web/public/assets/{download-DBS0ZPTh.js.map → download-1aUlz7_D.js.map} +1 -1
- package/dist/web/public/assets/{email-DgbAEEvZ.js → email-BkAvhVxU.js} +2 -2
- package/dist/web/public/assets/{email-DgbAEEvZ.js.map → email-BkAvhVxU.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-B1S_EYNJ.js → empty-state-BclIaHPD.js} +2 -2
- package/dist/web/public/assets/{empty-state-B1S_EYNJ.js.map → empty-state-BclIaHPD.js.map} +1 -1
- package/dist/web/public/assets/{external-link-Dkmwlv6p.js → external-link-Ckz2th0a.js} +2 -2
- package/dist/web/public/assets/{external-link-Dkmwlv6p.js.map → external-link-Ckz2th0a.js.map} +1 -1
- package/dist/web/public/assets/{eye-Ch0DLviZ.js → eye-DGRzJ5lb.js} +2 -2
- package/dist/web/public/assets/{eye-Ch0DLviZ.js.map → eye-DGRzJ5lb.js.map} +1 -1
- package/dist/web/public/assets/{facts-C3YV1Mkp.js → facts-CUY-brWq.js} +2 -2
- package/dist/web/public/assets/{facts-C3YV1Mkp.js.map → facts-CUY-brWq.js.map} +1 -1
- package/dist/web/public/assets/{goals-DEt5gGry.js → goals-5uN3gp8c.js} +2 -2
- package/dist/web/public/assets/{goals-DEt5gGry.js.map → goals-5uN3gp8c.js.map} +1 -1
- package/dist/web/public/assets/{health-DuB9uNiZ.js → health-bp5Qgneq.js} +2 -2
- package/dist/web/public/assets/{health-DuB9uNiZ.js.map → health-bp5Qgneq.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-CD8xNAGs.js → heart-pulse-BnB8Mahi.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-CD8xNAGs.js.map → heart-pulse-BnB8Mahi.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-DbR8VwmG.js → heartbeat-ClNB_aaM.js} +2 -2
- package/dist/web/public/assets/{heartbeat-DbR8VwmG.js.map → heartbeat-ClNB_aaM.js.map} +1 -1
- package/dist/web/public/assets/{hot-izk3vGQB.js → hot-CXFYYRzt.js} +2 -2
- package/dist/web/public/assets/{hot-izk3vGQB.js.map → hot-CXFYYRzt.js.map} +1 -1
- package/dist/web/public/assets/index-BS4QrJNL.css +1 -0
- package/dist/web/public/assets/{index-BY1vfCja.js → index-B_MJTcDz.js} +3 -3
- package/dist/web/public/assets/{index-BY1vfCja.js.map → index-B_MJTcDz.js.map} +1 -1
- package/dist/web/public/assets/{installed-BXB3-YIy.js → installed-BRhOTT0w.js} +2 -2
- package/dist/web/public/assets/{installed-BXB3-YIy.js.map → installed-BRhOTT0w.js.map} +1 -1
- package/dist/web/public/assets/{jobs-DkbM4mIQ.js → jobs-SGgiVMdm.js} +2 -2
- package/dist/web/public/assets/{jobs-DkbM4mIQ.js.map → jobs-SGgiVMdm.js.map} +1 -1
- package/dist/web/public/assets/{layout-DxzBaeTv.js → layout-BMehqBaD.js} +2 -2
- package/dist/web/public/assets/{layout-DxzBaeTv.js.map → layout-BMehqBaD.js.map} +1 -1
- package/dist/web/public/assets/{layout-5ePj6Bek.js → layout-C0BXTGdU.js} +2 -2
- package/dist/web/public/assets/{layout-5ePj6Bek.js.map → layout-C0BXTGdU.js.map} +1 -1
- package/dist/web/public/assets/{layout-B5Dzy_Zc.js → layout-CNhFryQ_.js} +2 -2
- package/dist/web/public/assets/{layout-B5Dzy_Zc.js.map → layout-CNhFryQ_.js.map} +1 -1
- package/dist/web/public/assets/{layout-DY9Xq34u.js → layout-CxIivtIC.js} +2 -2
- package/dist/web/public/assets/{layout-DY9Xq34u.js.map → layout-CxIivtIC.js.map} +1 -1
- package/dist/web/public/assets/{layout-BZpbNQFb.js → layout-Czg1K2be.js} +2 -2
- package/dist/web/public/assets/{layout-BZpbNQFb.js.map → layout-Czg1K2be.js.map} +1 -1
- package/dist/web/public/assets/{llm-Dg4W7eRM.js → llm-BuvGS_vU.js} +2 -2
- package/dist/web/public/assets/{llm-Dg4W7eRM.js.map → llm-BuvGS_vU.js.map} +1 -1
- package/dist/web/public/assets/{loader-circle-pGNYdPoE.js → loader-circle-CWYFBw93.js} +2 -2
- package/dist/web/public/assets/{loader-circle-pGNYdPoE.js.map → loader-circle-CWYFBw93.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-D1UX9mg7.js → map-pin-CHW2BahT.js} +2 -2
- package/dist/web/public/assets/{map-pin-D1UX9mg7.js.map → map-pin-CHW2BahT.js.map} +1 -1
- package/dist/web/public/assets/{mcp-uoOzu4_J.js → mcp-Bs02bxka.js} +2 -2
- package/dist/web/public/assets/{mcp-uoOzu4_J.js.map → mcp-Bs02bxka.js.map} +1 -1
- package/dist/web/public/assets/{memos-CAWASHg5.js → memos-DHGW-Qni.js} +2 -2
- package/dist/web/public/assets/{memos-CAWASHg5.js.map → memos-DHGW-Qni.js.map} +1 -1
- package/dist/web/public/assets/messengers-DrKKVSEA.js +7 -0
- package/dist/web/public/assets/messengers-DrKKVSEA.js.map +1 -0
- package/dist/web/public/assets/{native-agent-UuVvvzsW.js → native-agent-D2cbs5yG.js} +2 -2
- package/dist/web/public/assets/{native-agent-UuVvvzsW.js.map → native-agent-D2cbs5yG.js.map} +1 -1
- package/dist/web/public/assets/{network-DpjSgAwW.js → network-BlGBHSOz.js} +2 -2
- package/dist/web/public/assets/{network-DpjSgAwW.js.map → network-BlGBHSOz.js.map} +1 -1
- package/dist/web/public/assets/{outbox-DeAgiXkY.js → outbox-BNiVF52F.js} +2 -2
- package/dist/web/public/assets/{outbox-DeAgiXkY.js.map → outbox-BNiVF52F.js.map} +1 -1
- package/dist/web/public/assets/{pagination-5GD_he3L.js → pagination-B5Cwu4pq.js} +2 -2
- package/dist/web/public/assets/{pagination-5GD_he3L.js.map → pagination-B5Cwu4pq.js.map} +1 -1
- package/dist/web/public/assets/{persona-BhkDCmeB.js → persona-D7TRqgsy.js} +2 -2
- package/dist/web/public/assets/{persona-BhkDCmeB.js.map → persona-D7TRqgsy.js.map} +1 -1
- package/dist/web/public/assets/{play-B7o6cJ8W.js → play-CmTdWGab.js} +2 -2
- package/dist/web/public/assets/{play-B7o6cJ8W.js.map → play-CmTdWGab.js.map} +1 -1
- package/dist/web/public/assets/{plus-C5d4C6Zp.js → plus-BYmkO51v.js} +2 -2
- package/dist/web/public/assets/{plus-C5d4C6Zp.js.map → plus-BYmkO51v.js.map} +1 -1
- package/dist/web/public/assets/{policy-Ct_sKm3Y.js → policy-CrFIBtzs.js} +2 -2
- package/dist/web/public/assets/{policy-Ct_sKm3Y.js.map → policy-CrFIBtzs.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-BlXMN3UX.js → refresh-ccw-DgHgDBFU.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-BlXMN3UX.js.map → refresh-ccw-DgHgDBFU.js.map} +1 -1
- package/dist/web/public/assets/{reminders-gb1Y0S3t.js → reminders-Dh2VXBAt.js} +2 -2
- package/dist/web/public/assets/{reminders-gb1Y0S3t.js.map → reminders-Dh2VXBAt.js.map} +1 -1
- package/dist/web/public/assets/{save-DAFuApnY.js → save-BTdbl1sB.js} +2 -2
- package/dist/web/public/assets/{save-DAFuApnY.js.map → save-BTdbl1sB.js.map} +1 -1
- package/dist/web/public/assets/{schedules-CtFumT2B.js → schedules-C98Syrst.js} +2 -2
- package/dist/web/public/assets/{schedules-CtFumT2B.js.map → schedules-C98Syrst.js.map} +1 -1
- package/dist/web/public/assets/{search-BWuZE0YD.js → search-CgUr_Tjy.js} +2 -2
- package/dist/web/public/assets/{search-BWuZE0YD.js.map → search-CgUr_Tjy.js.map} +1 -1
- package/dist/web/public/assets/{service-lah7RWEc.js → service-Dlw--ni7.js} +2 -2
- package/dist/web/public/assets/{service-lah7RWEc.js.map → service-Dlw--ni7.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-BgmFa_8z.js → status-badge-rlmqIgUK.js} +2 -2
- package/dist/web/public/assets/{status-badge-BgmFa_8z.js.map → status-badge-rlmqIgUK.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-CgqrOGhl.js → subtasks-BHJXEg1-.js} +2 -2
- package/dist/web/public/assets/{subtasks-CgqrOGhl.js.map → subtasks-BHJXEg1-.js.map} +1 -1
- package/dist/web/public/assets/{table-BhDzIBvB.js → table-CyYHo50D.js} +2 -2
- package/dist/web/public/assets/{table-BhDzIBvB.js.map → table-CyYHo50D.js.map} +1 -1
- package/dist/web/public/assets/{topn-DXgTCdM_.js → topn-CQjlFpTX.js} +2 -2
- package/dist/web/public/assets/{topn-DXgTCdM_.js.map → topn-CQjlFpTX.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-i4F_Rzh3.js → trash-2-C7RhXr5v.js} +2 -2
- package/dist/web/public/assets/{trash-2-i4F_Rzh3.js.map → trash-2-C7RhXr5v.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-Cq2D7JQJ.js → use-background-tasks-Xk52LztT.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-Cq2D7JQJ.js.map → use-background-tasks-Xk52LztT.js.map} +1 -1
- package/dist/web/public/assets/{use-llm-admin-BzOVXSjz.js → use-llm-admin-xgIdH9Kw.js} +2 -2
- package/dist/web/public/assets/{use-llm-admin-BzOVXSjz.js.map → use-llm-admin-xgIdH9Kw.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-B_RQWQyG.js → use-memory-DtZHF20y.js} +2 -2
- package/dist/web/public/assets/{use-memory-B_RQWQyG.js.map → use-memory-DtZHF20y.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-CCTN-a71.js → use-observability-nUGyBvW4.js} +2 -2
- package/dist/web/public/assets/{use-observability-CCTN-a71.js.map → use-observability-nUGyBvW4.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-D4EdDLiK.js → use-settings-BjibxUyB.js} +2 -2
- package/dist/web/public/assets/{use-settings-D4EdDLiK.js.map → use-settings-BjibxUyB.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-BhTEp_QH.js → use-workspace-DzyMsk0c.js} +2 -2
- package/dist/web/public/assets/{use-workspace-BhTEp_QH.js.map → use-workspace-DzyMsk0c.js.map} +1 -1
- package/dist/web/public/assets/{useQuery-DmoWKLw3.js → useQuery-DI6dxASQ.js} +2 -2
- package/dist/web/public/assets/{useQuery-DmoWKLw3.js.map → useQuery-DI6dxASQ.js.map} +1 -1
- package/dist/web/public/assets/{vector-By-cheMu.js → vector-Bu_EzONh.js} +2 -2
- package/dist/web/public/assets/{vector-By-cheMu.js.map → vector-Bu_EzONh.js.map} +1 -1
- package/dist/web/public/assets/viewer-DbJxZOmC.js +12 -0
- package/dist/web/public/assets/viewer-DbJxZOmC.js.map +1 -0
- package/dist/web/public/assets/{workspace-DvYlIAhu.js → workspace-DAYMQHog.js} +2 -2
- package/dist/web/public/assets/{workspace-DvYlIAhu.js.map → workspace-DAYMQHog.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-2pn73O-K.js → workspaces-DGRs1EZm.js} +2 -2
- package/dist/web/public/assets/{workspaces-2pn73O-K.js.map → workspaces-DGRs1EZm.js.map} +1 -1
- package/dist/web/public/assets/{x-5Z_de5zo.js → x-DEBwh51E.js} +2 -2
- package/dist/web/public/assets/{x-5Z_de5zo.js.map → x-DEBwh51E.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.js +2 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/assets/index-B7QRVy9N.css +0 -1
- package/dist/web/public/assets/messengers-B1-mZms8.js +0 -7
- package/dist/web/public/assets/messengers-B1-mZms8.js.map +0 -1
- package/dist/web/public/assets/viewer-CJNrz2iw.js +0 -12
- package/dist/web/public/assets/viewer-CJNrz2iw.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agim-cli",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.54",
|
|
4
4
|
"description": "Agim (阿吉姆) — universal messenger-to-agent bridge. Connect WeChat / Feishu / DingTalk / Email to Claude Code / Codex / OpenCode, or any custom agent via ACP. Installs the `agim` command.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--ag-bg: 220 14% 96%;--ag-surface: 0 0% 100%;--ag-surface-2: 220 14% 94%;--ag-surface-hover:220 14% 92%;--ag-border: 220 13% 90%;--ag-border-strong: 220 10% 80%;--ag-text: 220 13% 13%;--ag-text-dim: 220 6% 38%;--ag-text-muted: 220 6% 58%;--ag-accent: 246 80% 60%;--ag-accent-fg: 0 0% 100%;--ag-accent-hover: 246 80% 52%;--ag-accent-bg: 246 100% 96%;--ag-success: 158 75% 39%;--ag-success-bg:158 75% 95%;--ag-warning: 38 95% 50%;--ag-warning-bg: 38 95% 95%;--ag-danger: 0 78% 56%;--ag-danger-bg: 0 78% 96%;--ag-info: 217 91% 60%;--ag-info-bg: 217 91% 96%;--ag-shadow-sm: 0 1px 2px hsl(220 13% 13% / .05);--ag-shadow-md: 0 2px 8px hsl(220 13% 13% / .08);--ag-shadow-lg: 0 8px 24px hsl(220 13% 13% / .12)}:root[data-theme=dark]{--ag-bg: 220 10% 7%;--ag-surface: 220 12% 11%;--ag-surface-2: 220 12% 14%;--ag-surface-hover:220 12% 16%;--ag-border: 220 10% 20%;--ag-border-strong: 220 10% 28%;--ag-text: 220 14% 91%;--ag-text-dim: 220 8% 68%;--ag-text-muted: 220 8% 50%;--ag-accent: 246 90% 72%;--ag-accent-fg: 220 30% 5%;--ag-accent-hover: 246 90% 80%;--ag-accent-bg: 246 30% 22%;--ag-success: 158 70% 50%;--ag-success-bg:158 60% 20%;--ag-warning: 38 90% 60%;--ag-warning-bg: 38 60% 20%;--ag-danger: 0 85% 67%;--ag-danger-bg: 0 60% 22%;--ag-info: 217 90% 70%;--ag-info-bg: 217 60% 25%;--ag-shadow-sm: 0 1px 2px hsl(0 0% 0% / .4);--ag-shadow-md: 0 2px 8px hsl(0 0% 0% / .5);--ag-shadow-lg: 0 8px 24px hsl(0 0% 0% / .6)}@media (prefers-color-scheme: dark){:root:not([data-theme=light]):not([data-theme=dark]){--ag-bg: 220 10% 7%;--ag-surface: 220 12% 11%;--ag-surface-2: 220 12% 14%;--ag-surface-hover:220 12% 16%;--ag-border: 220 10% 20%;--ag-border-strong: 220 10% 28%;--ag-text: 220 14% 91%;--ag-text-dim: 220 8% 68%;--ag-text-muted: 220 8% 50%;--ag-accent: 246 90% 72%;--ag-accent-fg: 220 30% 5%;--ag-accent-hover: 246 90% 80%;--ag-accent-bg: 246 30% 22%;--ag-success: 158 70% 50%;--ag-success-bg:158 60% 20%;--ag-warning: 38 90% 60%;--ag-warning-bg: 38 60% 20%;--ag-danger: 0 85% 67%;--ag-danger-bg: 0 60% 22%;--ag-info: 217 90% 70%;--ag-info-bg: 217 60% 25%;--ag-shadow-sm: 0 1px 2px hsl(0 0% 0% / .4);--ag-shadow-md: 0 2px 8px hsl(0 0% 0% / .5);--ag-shadow-lg: 0 8px 24px hsl(0 0% 0% / .6)}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html,body,#root{height:100%}body{background-color:hsl(var(--ag-bg));color:hsl(var(--ag-text));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,"Apple Color Emoji","Segoe UI Emoji",sans-serif;touch-action:manipulation;-webkit-tap-highlight-color:hsl(var(--ag-accent) / .15)}button,[role=button],a,input[type=button],input[type=submit]{-webkit-tap-highlight-color:hsl(var(--ag-accent) / .15)}@media (pointer: fine){*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-thumb{background:hsl(var(--ag-border-strong));border-radius:999px;border:2px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:hsl(var(--ag-text-muted));background-clip:content-box}}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 640px){.container{max-width:640px;padding-right:24px;padding-left:24px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px;padding-right:32px;padding-left:32px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.bottom-2{bottom:8px}.left-0{left:0}.left-2{left:8px}.left-\[50\%\]{left:50%}.right-4{right:16px}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:16px}.top-\[50\%\]{top:50%}.top-\[var\(--topbar-h\,0\)\]{top:var(--topbar-h,0)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.-mx-1{margin-left:-4px;margin-right:-4px}.-mx-3{margin-left:-12px;margin-right:-12px}.mx-4{margin-left:16px;margin-right:16px}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:4px;margin-bottom:4px}.-ml-2{margin-left:-8px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.ml-2{margin-left:8px}.ml-3{margin-left:12px}.ml-auto{margin-left:auto}.mr-2{margin-right:8px}.mt-0\.5{margin-top:2px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-4{width:16px;height:16px}.h-1{height:4px}.h-1\.5{height:6px}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:8px}.h-24{height:6rem}.h-3{height:12px}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:16px}.h-48{height:12rem}.h-5{height:20px}.h-6{height:24px}.h-64{height:16rem}.h-7{height:32px}.h-72{height:18rem}.h-8{height:48px}.h-9{height:64px}.h-96{height:24rem}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-px{height:1px}.max-h-32{max-height:8rem}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.max-h-\[85dvh\]{max-height:85dvh}.min-h-8{min-height:48px}.min-h-9{min-height:64px}.min-h-\[500px\]{min-height:500px}.min-h-dvh{min-height:100dvh}.w-1\.5{width:6px}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:8px}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:12px}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:16px}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:20px}.w-6{width:24px}.w-64{width:16rem}.w-72{width:18rem}.w-8{width:48px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[80px\]{width:80px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[85\%\]{max-width:85%}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0\.5{--tw-translate-x: 2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-mx-4{scroll-margin-left:16px;scroll-margin-right:16px}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:2px}.gap-1{gap:4px}.gap-1\.5{gap:6px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-6{gap:24px}.gap-x-3{-moz-column-gap:12px;column-gap:12px}.gap-x-4{-moz-column-gap:16px;column-gap:16px}.gap-y-1{row-gap:4px}.gap-y-2{row-gap:8px}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--ag-border))}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:6px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:10px}.rounded-md{border-radius:6px}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-accent{border-color:hsl(var(--ag-accent))}.border-border{border-color:hsl(var(--ag-border))}.border-danger{border-color:hsl(var(--ag-danger))}.border-danger\/30{border-color:hsl(var(--ag-danger) / .3)}.border-danger\/60{border-color:hsl(var(--ag-danger) / .6)}.border-info{border-color:hsl(var(--ag-info))}.border-info\/30{border-color:hsl(var(--ag-info) / .3)}.border-success{border-color:hsl(var(--ag-success))}.border-success\/30{border-color:hsl(var(--ag-success) / .3)}.border-transparent{border-color:transparent}.border-warning{border-color:hsl(var(--ag-warning))}.border-warning\/30{border-color:hsl(var(--ag-warning) / .3)}.border-warning\/60{border-color:hsl(var(--ag-warning) / .6)}.bg-accent{background-color:hsl(var(--ag-accent))}.bg-accent-bg{background-color:hsl(var(--ag-accent-bg))}.bg-accent\/60{background-color:hsl(var(--ag-accent) / .6)}.bg-bg{background-color:hsl(var(--ag-bg))}.bg-black\/50{background-color:#00000080}.bg-border{background-color:hsl(var(--ag-border))}.bg-danger{background-color:hsl(var(--ag-danger))}.bg-danger-bg{background-color:hsl(var(--ag-danger-bg))}.bg-danger-bg\/30{background-color:hsl(var(--ag-danger-bg) / .3)}.bg-info-bg{background-color:hsl(var(--ag-info-bg))}.bg-success{background-color:hsl(var(--ag-success))}.bg-success-bg{background-color:hsl(var(--ag-success-bg))}.bg-surface{background-color:hsl(var(--ag-surface))}.bg-surface-2{background-color:hsl(var(--ag-surface-2))}.bg-text{background-color:hsl(var(--ag-text))}.bg-text-muted{background-color:hsl(var(--ag-text-muted))}.bg-transparent{background-color:transparent}.bg-warning{background-color:hsl(var(--ag-warning))}.bg-warning-bg{background-color:hsl(var(--ag-warning-bg))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:4px}.p-12{padding:3rem}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:4px;padding-right:4px}.px-1\.5{padding-left:6px;padding-right:6px}.px-2{padding-left:8px;padding-right:8px}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.py-0\.5{padding-top:2px;padding-bottom:2px}.py-1{padding-top:4px;padding-bottom:4px}.py-1\.5{padding-top:6px;padding-bottom:6px}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:8px;padding-bottom:8px}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:48px;padding-bottom:48px}.pb-2{padding-bottom:8px}.pb-3{padding-bottom:12px}.pb-\[calc\(env\(safe-area-inset-bottom\)\+1\.5rem\)\]{padding-bottom:calc(env(safe-area-inset-bottom) + 1.5rem)}.pl-7{padding-left:32px}.pl-8{padding-left:48px}.pr-2{padding-right:8px}.pt-0{padding-top:0}.pt-2{padding-top:8px}.pt-3{padding-top:12px}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:30px;line-height:38px}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-base{font-size:15px;line-height:22px}.text-lg{font-size:20px;line-height:28px}.text-md{font-size:16px;line-height:24px}.text-sm{font-size:13px;line-height:20px}.text-xl{font-size:24px;line-height:32px}.text-xs{font-size:12px;line-height:16px}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.text-accent{color:hsl(var(--ag-accent))}.text-accent-fg{color:hsl(var(--ag-accent-fg))}.text-bg{color:hsl(var(--ag-bg))}.text-danger{color:hsl(var(--ag-danger))}.text-info{color:hsl(var(--ag-info))}.text-success{color:hsl(var(--ag-success))}.text-text{color:hsl(var(--ag-text))}.text-text-dim{color:hsl(var(--ag-text-dim))}.text-text-muted{color:hsl(var(--ag-text-muted))}.text-warning{color:hsl(var(--ag-warning))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-accent{accent-color:hsl(var(--ag-accent))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-90{opacity:.9}.shadow{--tw-shadow: var(--ag-shadow-md);--tw-shadow-colored: var(--ag-shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--ag-shadow-lg);--tw-shadow-colored: var(--ag-shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--ag-shadow-md);--tw-shadow-colored: var(--ag-shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--ag-shadow-sm);--tw-shadow-colored: var(--ag-shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}.running{animation-play-state:running}.paused{animation-play-state:paused}.pt-safe{padding-top:calc(env(safe-area-inset-top) + .5rem)}.pb-safe{padding-bottom:calc(env(safe-area-inset-bottom) + .5rem)}.h-dvh{height:100vh;height:100dvh}.min-h-dvh{min-height:100vh;min-height:100dvh}.tap-target{min-height:32px;min-width:32px}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:13px;line-height:20px}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-text-muted::-moz-placeholder{color:hsl(var(--ag-text-muted))}.placeholder\:text-text-muted::placeholder{color:hsl(var(--ag-text-muted))}.hover\:border-border-strong:hover{border-color:hsl(var(--ag-border-strong))}.hover\:bg-accent-hover:hover{background-color:hsl(var(--ag-accent-hover))}.hover\:bg-danger:hover{background-color:hsl(var(--ag-danger))}.hover\:bg-surface-2:hover{background-color:hsl(var(--ag-surface-2))}.hover\:text-accent:hover{color:hsl(var(--ag-accent))}.hover\:text-danger:hover{color:hsl(var(--ag-danger))}.hover\:text-text:hover{color:hsl(var(--ag-text))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-accent:focus{border-color:hsl(var(--ag-accent))}.focus\:text-text:focus{color:hsl(var(--ag-text))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-accent:focus{--tw-ring-color: hsl(var(--ag-accent))}.focus\:ring-danger:focus{--tw-ring-color: hsl(var(--ag-danger))}.focus\:ring-offset-1:focus{--tw-ring-offset-width: 1px}.focus\:ring-offset-bg:focus{--tw-ring-offset-color: hsl(var(--ag-bg))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-accent:focus-visible{--tw-ring-color: hsl(var(--ag-accent))}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-bg:focus-visible{--tw-ring-offset-color: hsl(var(--ag-bg))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-55:disabled{opacity:.55}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=selected\]\:bg-accent-bg[data-state=selected]{background-color:hsl(var(--ag-accent-bg))}.data-\[state\=active\]\:text-accent[data-state=active]{color:hsl(var(--ag-accent))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open],.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open],.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open],.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=active\]\:after\:absolute[data-state=active]:after{content:var(--tw-content);position:absolute}.data-\[state\=active\]\:after\:inset-x-0[data-state=active]:after{content:var(--tw-content);left:0;right:0}.data-\[state\=active\]\:after\:-bottom-px[data-state=active]:after{content:var(--tw-content);bottom:-1px}.data-\[state\=active\]\:after\:h-0\.5[data-state=active]:after{content:var(--tw-content);height:2px}.data-\[state\=active\]\:after\:rounded[data-state=active]:after{content:var(--tw-content);border-radius:6px}.data-\[state\=active\]\:after\:bg-accent[data-state=active]:after{content:var(--tw-content);background-color:hsl(var(--ag-accent))}@media (min-width: 640px){.sm\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:-mx-4{margin-left:-16px;margin-right:-16px}.sm\:ml-1{margin-left:4px}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:hidden{display:none}.sm\:w-20{width:5rem}.sm\:w-28{width:7rem}.sm\:w-36{width:9rem}.sm\:w-40{width:10rem}.sm\:min-w-0{min-width:0px}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-\[75\%\]{max-width:75%}.sm\:max-w-lg{max-width:32rem}.sm\:flex-1{flex:1 1 0%}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[180px_1fr\]{grid-template-columns:180px 1fr}.sm\:grid-cols-\[180px_1fr_auto\]{grid-template-columns:180px 1fr auto}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2{gap:8px}.sm\:gap-3{gap:12px}.sm\:p-4{padding:16px}.sm\:p-6{padding:24px}.sm\:px-4{padding-left:16px;padding-right:16px}.sm\:px-6{padding-left:24px;padding-right:24px}.sm\:py-2{padding-top:8px;padding-bottom:8px}.sm\:pt-0{padding-top:0}}@media (min-width: 768px){.md\:block{display:block}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[280px\,1fr\]{grid-template-columns:280px 1fr}}@media (min-width: 1024px){.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.\[\&\:\:-webkit-scrollbar-thumb\]\:bg-border::-webkit-scrollbar-thumb{background-color:hsl(var(--ag-border))}.\[\&\:\:-webkit-scrollbar\]\:h-1::-webkit-scrollbar{height:4px}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:16px;height:16px}.\[\&_svg\]\:h-6 svg{height:24px}.\[\&_svg\]\:w-6 svg{width:24px}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}.\[\&_tr\]\:border-border tr{border-color:hsl(var(--ag-border))}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{y as A,ad as w,U as e,c as f,B as F,a3 as y,E as q,L as P,I as C}from"./index-BY1vfCja.js";import{e as p}from"./react-C9F3QeMB.js";import{D,a as E,d as R,e as $,b as M}from"./dialog-D8QAkLhI.js";import{b as Q,m as z,i as O,q as B}from"./use-settings-D4EdDLiK.js";import{L as S}from"./loader-circle-pGNYdPoE.js";import{R as L}from"./refresh-ccw-BlXMN3UX.js";import{X as T}from"./x-5Z_de5zo.js";import{S as H}from"./save-DAFuApnY.js";import"./useQuery-DmoWKLw3.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const W=A("QrCode",[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]]);function N(s){const i=new Set(s?.messengers??[]);return{"wechat-ilink":{enabled:i.has("wechat-ilink")},telegram:{enabled:i.has("telegram"),telegram:{...s?.telegram??{}}},feishu:{enabled:i.has("feishu"),feishu:{...s?.feishu??{}}},dingtalk:{enabled:i.has("dingtalk"),dingtalk:{...s?.dingtalk??{}}},discord:{enabled:i.has("discord"),discord:{...s?.discord??{}}}}}function J(s,i){const t=[];for(const a of Object.keys(s))s[a].enabled&&t.push(a);return{messengers:t,telegram:s.telegram.telegram,feishu:s.feishu.feishu,dingtalk:s.dingtalk.dingtalk,discord:s.discord.discord,...Object.fromEntries(Object.entries(i).filter(([a])=>!["messengers","telegram","feishu","dingtalk","discord"].includes(a)))}}function le(){const{t:s}=w(["settings","common"]),i=Q(),t=z(),[a,c]=p.useState(()=>N(i.data)),[g,h]=p.useState(!1);p.useEffect(()=>{g||i.data&&(c(N(i.data)),h(!0))},[i.data,g]);const m=i.data,n=p.useMemo(()=>m?JSON.stringify(N(m))!==JSON.stringify(a):!1,[m,a]),[r,o]=p.useState(!1);function d(l,j){c(I=>({...I,[l]:{...I[l],...j}}))}async function x(){if(m)try{await t.mutateAsync(J(a,m)),y.success(s("messengers.savedToast")),h(!1)}catch(l){y.error(q(l,s).message)}}function b(){m&&c(N(m))}return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("messengers.title")}),e.jsxs(f,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>i.refetch(),disabled:i.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[i.isFetching?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(L,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("messengers.subtitle")})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:n?e.jsxs(e.Fragment,{children:[e.jsx(F,{variant:"info",children:s("messengers.dirtyHint")}),e.jsxs(f,{type:"button",variant:"secondary",size:"sm",onClick:b,disabled:t.isPending,children:[e.jsx(T,{className:"h-4 w-4"}),s("messengers.discardAll")]}),e.jsxs(f,{type:"button",size:"sm",onClick:()=>void x(),disabled:t.isPending,children:[t.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(H,{className:"h-4 w-4"}),t.isPending?s("messengers.saving"):s("messengers.saveAll")]})]}):e.jsx("span",{className:"text-xs text-text-muted",children:s("env.noChanges")})}),i.isLoading?e.jsx("div",{className:"h-96 rounded-md bg-surface-2 animate-pulse"}):m?e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(v,{slot:"wechat-ilink",label:s("messengers.platform.wechat"),hint:s("messengers.hint.wechat"),enabled:a["wechat-ilink"].enabled,onToggle:l=>d("wechat-ilink",{enabled:l}),children:e.jsxs(f,{type:"button",variant:"secondary",size:"sm",onClick:()=>o(!0),children:[e.jsx(W,{className:"h-4 w-4"}),s("messengers.scanQr")]})}),m.features?.globalIm?e.jsxs(v,{slot:"telegram",label:s("messengers.platform.telegram"),hint:s("messengers.hint.telegram"),enabled:a.telegram.enabled,onToggle:l=>d("telegram",{enabled:l}),children:[e.jsx(u,{id:"tg-token",label:s("messengers.fields.botToken"),value:a.telegram.telegram?.botToken??"",type:"password",onChange:l=>d("telegram",{telegram:{...a.telegram.telegram,botToken:l}})}),e.jsx(u,{id:"tg-channel",label:s("messengers.fields.channelId"),value:a.telegram.telegram?.channelId??"",onChange:l=>d("telegram",{telegram:{...a.telegram.telegram,channelId:l}})})]}):null,e.jsxs(v,{slot:"feishu",label:s("messengers.platform.feishu"),hint:s("messengers.hint.feishu"),enabled:a.feishu.enabled,onToggle:l=>d("feishu",{enabled:l}),children:[e.jsx(u,{id:"fs-appid",label:s("messengers.fields.appId"),value:a.feishu.feishu?.appId??"",onChange:l=>d("feishu",{feishu:{...a.feishu.feishu,appId:l}})}),e.jsx(u,{id:"fs-secret",label:s("messengers.fields.appSecret"),value:a.feishu.feishu?.appSecret??"",type:"password",onChange:l=>d("feishu",{feishu:{...a.feishu.feishu,appSecret:l}})}),e.jsx(u,{id:"fs-channel",label:s("messengers.fields.channelId"),value:a.feishu.feishu?.channelId??"",onChange:l=>d("feishu",{feishu:{...a.feishu.feishu,channelId:l}})})]}),e.jsxs(v,{slot:"dingtalk",label:s("messengers.platform.dingtalk"),hint:s("messengers.hint.dingtalk"),enabled:a.dingtalk.enabled,onToggle:l=>d("dingtalk",{enabled:l}),children:[e.jsx(u,{id:"dt-cid",label:s("messengers.fields.clientId"),value:a.dingtalk.dingtalk?.clientId??"",onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,clientId:l}})}),e.jsx(u,{id:"dt-secret",label:s("messengers.fields.clientSecret"),value:a.dingtalk.dingtalk?.clientSecret??"",type:"password",onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,clientSecret:l}})}),e.jsx(u,{id:"dt-channel",label:s("messengers.fields.channelId"),value:a.dingtalk.dingtalk?.channelId??"",onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,channelId:l}})}),e.jsx(k,{id:"dt-dm-policy",label:s("messengers.dingtalk.dmPolicy"),value:a.dingtalk.dingtalk?.dmPolicy??"open",onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,dmPolicy:l}}),options:[{value:"open",label:s("messengers.dingtalk.policy.open")},{value:"pairing",label:s("messengers.dingtalk.policy.pairing")},{value:"allowlist",label:s("messengers.dingtalk.policy.allowlist")}]}),e.jsx(k,{id:"dt-group-policy",label:s("messengers.dingtalk.groupPolicy"),value:a.dingtalk.dingtalk?.groupPolicy??"open",onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,groupPolicy:l}}),options:[{value:"open",label:s("messengers.dingtalk.policy.open")},{value:"allowlist",label:s("messengers.dingtalk.policy.allowlist")},{value:"disabled",label:s("messengers.dingtalk.policy.disabled")}]}),e.jsx(u,{id:"dt-allow-from",label:s("messengers.dingtalk.allowFrom"),value:(a.dingtalk.dingtalk?.allowFrom??[]).join(","),onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,allowFrom:l.split(",").map(j=>j.trim()).filter(Boolean)}})}),e.jsx(u,{id:"dt-group-allow-from",label:s("messengers.dingtalk.groupAllowFrom"),value:(a.dingtalk.dingtalk?.groupAllowFrom??[]).join(","),onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,groupAllowFrom:l.split(",").map(j=>j.trim()).filter(Boolean)}})}),e.jsx(k,{id:"dt-ack",label:s("messengers.dingtalk.ackReaction"),value:a.dingtalk.dingtalk?.ackReaction??"off",onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,ackReaction:l}}),options:[{value:"off",label:s("messengers.dingtalk.ack.off")},{value:"emoji",label:s("messengers.dingtalk.ack.emoji")},{value:"kaomoji",label:s("messengers.dingtalk.ack.kaomoji")}]}),e.jsx(_,{accounts:a.dingtalk.dingtalk?.accounts??{},onChange:l=>d("dingtalk",{dingtalk:{...a.dingtalk.dingtalk,accounts:l}})})]}),m.features?.globalIm?e.jsxs(v,{slot:"discord",label:s("messengers.platform.discord"),hint:s("messengers.hint.discord"),enabled:a.discord.enabled,onToggle:l=>d("discord",{enabled:l}),children:[e.jsx(u,{id:"dc-token",label:s("messengers.fields.botToken"),value:a.discord.discord?.botToken??"",type:"password",onChange:l=>d("discord",{discord:{...a.discord.discord,botToken:l}})}),e.jsx(u,{id:"dc-channel",label:s("messengers.fields.channelId"),value:a.discord.discord?.channelId??"",onChange:l=>d("discord",{discord:{...a.discord.discord,channelId:l}})})]}):null]}):null,e.jsx(U,{open:r,onOpenChange:o,onConfirmed:()=>{i.refetch(),h(!1)}})]})}function v({label:s,hint:i,enabled:t,onToggle:a,children:c}){const{t:g}=w("settings");return e.jsxs("div",{className:"rounded-md border border-border bg-surface p-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:s}),e.jsx(F,{variant:t?"success":"outline",children:g(t?"messengers.enabled":"messengers.disabled")})]}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:i})]}),e.jsx("label",{className:"inline-flex items-center gap-2 text-sm",children:e.jsx("input",{type:"checkbox",checked:t,onChange:h=>a(h.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"})})]}),t&&c&&e.jsx("div",{className:"mt-3 flex flex-col gap-2",children:c})]})}function u({id:s,label:i,value:t,onChange:a,type:c="text"}){return e.jsxs("div",{className:"grid grid-cols-1 gap-1 sm:grid-cols-[180px_1fr] sm:items-center sm:gap-2",children:[e.jsx(P,{htmlFor:s,className:"text-xs text-text-dim",children:i}),e.jsx(C,{id:s,type:c,value:t,onChange:g=>a(g.target.value),autoComplete:"off",className:"font-mono text-xs"})]})}function k({id:s,label:i,value:t,onChange:a,options:c}){return e.jsxs("div",{className:"grid grid-cols-1 gap-1 sm:grid-cols-[180px_1fr] sm:items-center sm:gap-2",children:[e.jsx(P,{htmlFor:s,className:"text-xs text-text-dim",children:i}),e.jsx("select",{id:s,value:t,onChange:g=>a(g.target.value),className:"rounded-md border border-input bg-background px-2 py-1 text-xs",children:c.map(g=>e.jsx("option",{value:g.value,children:g.label},g.value))})]})}function U({open:s,onOpenChange:i,onConfirmed:t}){const{t:a}=w(["settings","common"]),c=O(),[g,h]=p.useState(null),[m,n]=p.useState(null),[r,o]=p.useState(null);p.useEffect(()=>{if(!s){h(null),n(null),o(null);return}let b=!0;return c.mutateAsync().then(l=>{b&&(n(l.qrImage),h(l.qrToken))}).catch(l=>{b&&o(l instanceof Error?l.message:String(l))}),()=>{b=!1}},[s]);const x=B(s?g:null).data?.status;return p.useEffect(()=>{x==="confirmed"&&(y.success(a("messengers.qr.confirmed")),t(),i(!1)),x==="expired"&&y.error(a("messengers.qr.expired"))},[x]),e.jsx(D,{open:s,onOpenChange:i,children:e.jsxs(E,{children:[e.jsxs(R,{children:[e.jsx($,{children:a("messengers.qr.title")}),e.jsx(M,{children:a("messengers.qr.description")})]}),e.jsx("div",{className:"flex flex-col items-center gap-3",children:c.isPending&&!m?e.jsxs(e.Fragment,{children:[e.jsx(S,{className:"h-8 w-8 animate-spin text-text-dim"}),e.jsx("p",{className:"text-sm text-text-dim",children:a("messengers.qr.starting")})]}):r?e.jsxs("p",{className:"text-sm text-danger",children:[a("messengers.qr.loadFailed"),": ",r]}):m?e.jsxs(e.Fragment,{children:[e.jsx("img",{src:m,alt:a("messengers.qr.title"),className:"rounded-md border border-border"}),x==="expired"?e.jsx("p",{className:"text-xs text-danger",children:a("messengers.qr.expired")}):e.jsx("p",{className:"text-xs text-text-dim",children:x?`· ${x} ·`:""})]}):null})]})})}function _({accounts:s,onChange:i}){const{t}=w(["settings","common"]),a=Object.entries(s),c=(n,r)=>{i({...s,[n]:{...s[n],...r}})},g=n=>{const r={...s};delete r[n],i(r)},h=(n,r)=>{if(!r||r===n)return;if(s[r]){y.error(t("messengers.dingtalk.accountRenameCollision",{id:r}));return}const o={};for(const[d,x]of Object.entries(s))o[d===n?r:d]=x;i(o)},m=()=>{let n=a.length+1,r=`account-${n}`;for(;s[r];)n+=1,r=`account-${n}`;i({...s,[r]:{enabled:!0}})};return e.jsxs("div",{className:"mt-3 border-t border-input pt-3",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between",children:[e.jsx("div",{className:"text-xs font-semibold text-text-dim",children:t("messengers.dingtalk.accountsTitle")}),e.jsxs(f,{type:"button",size:"sm",variant:"outline",onClick:m,children:["+ ",t("messengers.dingtalk.addAccount")]})]}),a.length===0?e.jsx("div",{className:"text-xs text-text-dim italic",children:t("messengers.dingtalk.accountsEmpty")}):e.jsx("div",{className:"space-y-3",children:a.map(([n,r])=>e.jsxs("div",{className:"rounded-md border border-input p-2",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsx(C,{id:`acct-id-${n}`,defaultValue:n,onBlur:o=>h(n,o.target.value.trim()),className:"font-mono text-xs w-40",placeholder:"account-id"}),e.jsx(C,{id:`acct-name-${n}`,value:r.name??"",onChange:o=>c(n,{name:o.target.value}),className:"text-xs flex-1",placeholder:t("messengers.dingtalk.accountName")}),e.jsxs("label",{className:"flex items-center gap-1 text-xs",children:[e.jsx("input",{type:"checkbox",checked:r.enabled!==!1,onChange:o=>c(n,{enabled:o.target.checked})}),t("messengers.enabled")]}),e.jsx(f,{type:"button",size:"sm",variant:"ghost",onClick:()=>g(n),className:"text-danger",children:e.jsx(T,{className:"size-4"})})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{id:`acct-cid-${n}`,label:t("messengers.fields.clientId"),value:r.clientId??"",onChange:o=>c(n,{clientId:o})}),e.jsx(u,{id:`acct-secret-${n}`,label:t("messengers.fields.clientSecret"),value:r.clientSecret??"",type:"password",onChange:o=>c(n,{clientSecret:o})}),e.jsx(k,{id:`acct-dm-${n}`,label:t("messengers.dingtalk.dmPolicy"),value:r.dmPolicy??"open",onChange:o=>c(n,{dmPolicy:o}),options:[{value:"open",label:t("messengers.dingtalk.policy.open")},{value:"pairing",label:t("messengers.dingtalk.policy.pairing")},{value:"allowlist",label:t("messengers.dingtalk.policy.allowlist")}]}),e.jsx(k,{id:`acct-group-${n}`,label:t("messengers.dingtalk.groupPolicy"),value:r.groupPolicy??"open",onChange:o=>c(n,{groupPolicy:o}),options:[{value:"open",label:t("messengers.dingtalk.policy.open")},{value:"allowlist",label:t("messengers.dingtalk.policy.allowlist")},{value:"disabled",label:t("messengers.dingtalk.policy.disabled")}]}),e.jsx(u,{id:`acct-allow-${n}`,label:t("messengers.dingtalk.allowFrom"),value:(r.allowFrom??[]).join(","),onChange:o=>c(n,{allowFrom:o.split(",").map(d=>d.trim()).filter(Boolean)})}),e.jsx(u,{id:`acct-gallow-${n}`,label:t("messengers.dingtalk.groupAllowFrom"),value:(r.groupAllowFrom??[]).join(","),onChange:o=>c(n,{groupAllowFrom:o.split(",").map(d=>d.trim()).filter(Boolean)})}),e.jsx(k,{id:`acct-ack-${n}`,label:t("messengers.dingtalk.ackReaction"),value:r.ackReaction??"off",onChange:o=>c(n,{ackReaction:o}),options:[{value:"off",label:t("messengers.dingtalk.ack.off")},{value:"emoji",label:t("messengers.dingtalk.ack.emoji")},{value:"kaomoji",label:t("messengers.dingtalk.ack.kaomoji")}]})]})]},n))}),e.jsx("div",{className:"mt-1 text-xs text-text-dim",children:t("messengers.dingtalk.accountsHint")})]})}export{le as default};
|
|
7
|
-
//# sourceMappingURL=messengers-B1-mZms8.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"messengers-B1-mZms8.js","sources":["../../node_modules/lucide-react/dist/esm/icons/qr-code.js","../../src/routes/settings/messengers.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst QrCode = createLucideIcon(\"QrCode\", [\n [\"rect\", { width: \"5\", height: \"5\", x: \"3\", y: \"3\", rx: \"1\", key: \"1tu5fj\" }],\n [\"rect\", { width: \"5\", height: \"5\", x: \"16\", y: \"3\", rx: \"1\", key: \"1v8r4q\" }],\n [\"rect\", { width: \"5\", height: \"5\", x: \"3\", y: \"16\", rx: \"1\", key: \"1x03jg\" }],\n [\"path\", { d: \"M21 16h-3a2 2 0 0 0-2 2v3\", key: \"177gqh\" }],\n [\"path\", { d: \"M21 21v.01\", key: \"ents32\" }],\n [\"path\", { d: \"M12 7v3a2 2 0 0 1-2 2H7\", key: \"8crl2c\" }],\n [\"path\", { d: \"M3 12h.01\", key: \"nlz23k\" }],\n [\"path\", { d: \"M12 3h.01\", key: \"n36tog\" }],\n [\"path\", { d: \"M12 16v.01\", key: \"133mhm\" }],\n [\"path\", { d: \"M16 12h1\", key: \"1slzba\" }],\n [\"path\", { d: \"M21 12v.01\", key: \"1lwtk9\" }],\n [\"path\", { d: \"M12 21v-1\", key: \"1880an\" }]\n]);\n\nexport { QrCode as default };\n//# sourceMappingURL=qr-code.js.map\n","/**\n * /settings/messengers — per-IM-platform connection config.\n *\n * Layout: one card per platform (WeChat / Telegram / Feishu /\n * DingTalk / Discord). Each card has:\n * * Title + hint\n * * Enable / disable toggle (reads / writes config.messengers[])\n * * When enabled, the platform's config fields (texted)\n * * For WeChat: a \"Scan QR\" button → modal with QR + 2s polling\n *\n * Save All button at the top batches every dirty platform into one\n * PUT /api/config. The discard button reverts the local draft to\n * server-side values.\n *\n * The WeChat QR flow is special: enabling WeChat requires scanning\n * a QR code (the slot in config.messengers gets added by the\n * backend on `confirmed`, so we just open the modal and re-fetch\n * config after a successful scan).\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, QrCode, RefreshCcw, Save, X } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog'\nimport {\n useConfig,\n useUpdateConfig,\n useStartWechatQr,\n useWechatQrStatus,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { AppConfig } from '@/types/api'\n\n/** Slot names match what `config.messengers[]` contains.\n * WeChat uses 'wechat-ilink' (the iLink adapter ID). */\ntype Slot = 'wechat-ilink' | 'telegram' | 'feishu' | 'dingtalk' | 'discord'\n\ninterface PlatformDraft {\n enabled: boolean\n telegram?: { botToken?: string; channelId?: string }\n feishu?: { appId?: string; appSecret?: string; channelId?: string }\n dingtalk?: {\n clientId?: string\n clientSecret?: string\n channelId?: string\n // v1.2.37 (batch 1)\n dmPolicy?: 'open' | 'pairing' | 'allowlist'\n groupPolicy?: 'open' | 'allowlist' | 'disabled'\n allowFrom?: string[]\n groupAllowFrom?: string[]\n ackReaction?: 'off' | 'emoji' | 'kaomoji'\n // v1.2.41 (batch 4 follow-up) — full multi-account editor\n accounts?: Record<string, DingTalkAccountDraft>\n }\n discord?: { botToken?: string; channelId?: string }\n}\n\ntype Draft = Record<Slot, PlatformDraft>\n\nfunction buildDraft(cfg: AppConfig | undefined): Draft {\n const m = new Set(cfg?.messengers ?? [])\n return {\n 'wechat-ilink': { enabled: m.has('wechat-ilink') },\n telegram: { enabled: m.has('telegram'), telegram: { ...(cfg?.telegram ?? {}) } },\n feishu: { enabled: m.has('feishu'), feishu: { ...(cfg?.feishu ?? {}) } },\n dingtalk: { enabled: m.has('dingtalk'), dingtalk: { ...(cfg?.dingtalk ?? {}) } },\n discord: { enabled: m.has('discord'), discord: { ...(cfg?.discord ?? {}) } },\n }\n}\n\nfunction buildPatch(draft: Draft, cfg: AppConfig): Partial<AppConfig> {\n const messengers: string[] = []\n for (const k of Object.keys(draft) as Slot[]) if (draft[k].enabled) messengers.push(k)\n return {\n messengers,\n telegram: draft.telegram.telegram,\n feishu: draft.feishu.feishu,\n dingtalk: draft.dingtalk.dingtalk,\n discord: draft.discord.discord,\n // Preserve unknown extra fields the AppConfig type permits.\n ...Object.fromEntries(\n Object.entries(cfg).filter(([k]) => ![\n 'messengers', 'telegram', 'feishu', 'dingtalk', 'discord',\n ].includes(k)),\n ),\n }\n}\n\nexport default function SettingsMessengersRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const cfgQuery = useConfig()\n const updateCfg = useUpdateConfig()\n\n const [draft, setDraft] = useState<Draft>(() => buildDraft(cfgQuery.data))\n // Sync the draft once cfg lands. We don't re-sync on every cfg\n // refetch — that would discard unsaved edits.\n const [synced, setSynced] = useState(false)\n useEffect(() => {\n if (synced) return\n if (!cfgQuery.data) return\n setDraft(buildDraft(cfgQuery.data))\n setSynced(true)\n }, [cfgQuery.data, synced])\n\n const cfg = cfgQuery.data\n const isDirty = useMemo(() => {\n if (!cfg) return false\n return JSON.stringify(buildDraft(cfg)) !== JSON.stringify(draft)\n }, [cfg, draft])\n\n // WeChat QR modal state\n const [qrOpen, setQrOpen] = useState(false)\n\n function patchSlot(slot: Slot, partial: Partial<PlatformDraft>): void {\n setDraft((prev) => ({ ...prev, [slot]: { ...prev[slot], ...partial } }))\n }\n\n async function onSave(): Promise<void> {\n if (!cfg) return\n try {\n await updateCfg.mutateAsync(buildPatch(draft, cfg))\n toast.success(t('messengers.savedToast'))\n setSynced(false) // rebuild draft from refreshed cfg on next paint\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n function onDiscard(): void {\n if (cfg) setDraft(buildDraft(cfg))\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('messengers.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => cfgQuery.refetch()}\n disabled={cfgQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {cfgQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('messengers.subtitle')}</p>\n </header>\n\n {/* Save bar */}\n <div className=\"flex flex-wrap items-center gap-2\">\n {isDirty ? (\n <>\n <Badge variant=\"info\">{t('messengers.dirtyHint')}</Badge>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={updateCfg.isPending}\n >\n <X className=\"h-4 w-4\" />\n {t('messengers.discardAll')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateCfg.isPending}\n >\n {updateCfg.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {updateCfg.isPending ? t('messengers.saving') : t('messengers.saveAll')}\n </Button>\n </>\n ) : (\n <span className=\"text-xs text-text-muted\">{t('env.noChanges')}</span>\n )}\n </div>\n\n {cfgQuery.isLoading ? (\n <div className=\"h-96 rounded-md bg-surface-2 animate-pulse\" />\n ) : !cfg ? null : (\n <div className=\"flex flex-col gap-3\">\n <PlatformCard\n slot=\"wechat-ilink\"\n label={t('messengers.platform.wechat')}\n hint={t('messengers.hint.wechat')}\n enabled={draft['wechat-ilink'].enabled}\n onToggle={(v) => patchSlot('wechat-ilink', { enabled: v })}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => setQrOpen(true)}\n >\n <QrCode className=\"h-4 w-4\" />\n {t('messengers.scanQr')}\n </Button>\n </PlatformCard>\n\n {cfg.features?.globalIm ? (\n <PlatformCard\n slot=\"telegram\"\n label={t('messengers.platform.telegram')}\n hint={t('messengers.hint.telegram')}\n enabled={draft.telegram.enabled}\n onToggle={(v) => patchSlot('telegram', { enabled: v })}\n >\n <FieldRow\n id=\"tg-token\" label={t('messengers.fields.botToken')}\n value={draft.telegram.telegram?.botToken ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('telegram', { telegram: { ...draft.telegram.telegram, botToken: v } })}\n />\n <FieldRow\n id=\"tg-channel\" label={t('messengers.fields.channelId')}\n value={draft.telegram.telegram?.channelId ?? ''}\n onChange={(v) => patchSlot('telegram', { telegram: { ...draft.telegram.telegram, channelId: v } })}\n />\n </PlatformCard>\n ) : null}\n\n <PlatformCard\n slot=\"feishu\"\n label={t('messengers.platform.feishu')}\n hint={t('messengers.hint.feishu')}\n enabled={draft.feishu.enabled}\n onToggle={(v) => patchSlot('feishu', { enabled: v })}\n >\n <FieldRow\n id=\"fs-appid\" label={t('messengers.fields.appId')}\n value={draft.feishu.feishu?.appId ?? ''}\n onChange={(v) => patchSlot('feishu', { feishu: { ...draft.feishu.feishu, appId: v } })}\n />\n <FieldRow\n id=\"fs-secret\" label={t('messengers.fields.appSecret')}\n value={draft.feishu.feishu?.appSecret ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('feishu', { feishu: { ...draft.feishu.feishu, appSecret: v } })}\n />\n <FieldRow\n id=\"fs-channel\" label={t('messengers.fields.channelId')}\n value={draft.feishu.feishu?.channelId ?? ''}\n onChange={(v) => patchSlot('feishu', { feishu: { ...draft.feishu.feishu, channelId: v } })}\n />\n </PlatformCard>\n\n <PlatformCard\n slot=\"dingtalk\"\n label={t('messengers.platform.dingtalk')}\n hint={t('messengers.hint.dingtalk')}\n enabled={draft.dingtalk.enabled}\n onToggle={(v) => patchSlot('dingtalk', { enabled: v })}\n >\n <FieldRow\n id=\"dt-cid\" label={t('messengers.fields.clientId')}\n value={draft.dingtalk.dingtalk?.clientId ?? ''}\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, clientId: v } })}\n />\n <FieldRow\n id=\"dt-secret\" label={t('messengers.fields.clientSecret')}\n value={draft.dingtalk.dingtalk?.clientSecret ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, clientSecret: v } })}\n />\n <FieldRow\n id=\"dt-channel\" label={t('messengers.fields.channelId')}\n value={draft.dingtalk.dingtalk?.channelId ?? ''}\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, channelId: v } })}\n />\n {/* v1.2.37 (batch 1) — access policy + ack-reaction */}\n <SelectRow<'open' | 'pairing' | 'allowlist'>\n id=\"dt-dm-policy\" label={t('messengers.dingtalk.dmPolicy')}\n value={draft.dingtalk.dingtalk?.dmPolicy ?? 'open'}\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, dmPolicy: v } })}\n options={[\n { value: 'open', label: t('messengers.dingtalk.policy.open') },\n { value: 'pairing', label: t('messengers.dingtalk.policy.pairing') },\n { value: 'allowlist', label: t('messengers.dingtalk.policy.allowlist') },\n ]}\n />\n <SelectRow<'open' | 'allowlist' | 'disabled'>\n id=\"dt-group-policy\" label={t('messengers.dingtalk.groupPolicy')}\n value={draft.dingtalk.dingtalk?.groupPolicy ?? 'open'}\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, groupPolicy: v } })}\n options={[\n { value: 'open', label: t('messengers.dingtalk.policy.open') },\n { value: 'allowlist', label: t('messengers.dingtalk.policy.allowlist') },\n { value: 'disabled', label: t('messengers.dingtalk.policy.disabled') },\n ]}\n />\n <FieldRow\n id=\"dt-allow-from\" label={t('messengers.dingtalk.allowFrom')}\n value={(draft.dingtalk.dingtalk?.allowFrom ?? []).join(',')}\n onChange={(v) => patchSlot('dingtalk', {\n dingtalk: {\n ...draft.dingtalk.dingtalk,\n allowFrom: v.split(',').map((s) => s.trim()).filter(Boolean),\n },\n })}\n />\n <FieldRow\n id=\"dt-group-allow-from\" label={t('messengers.dingtalk.groupAllowFrom')}\n value={(draft.dingtalk.dingtalk?.groupAllowFrom ?? []).join(',')}\n onChange={(v) => patchSlot('dingtalk', {\n dingtalk: {\n ...draft.dingtalk.dingtalk,\n groupAllowFrom: v.split(',').map((s) => s.trim()).filter(Boolean),\n },\n })}\n />\n <SelectRow<'off' | 'emoji' | 'kaomoji'>\n id=\"dt-ack\" label={t('messengers.dingtalk.ackReaction')}\n value={draft.dingtalk.dingtalk?.ackReaction ?? 'off'}\n onChange={(v) => patchSlot('dingtalk', { dingtalk: { ...draft.dingtalk.dingtalk, ackReaction: v } })}\n options={[\n { value: 'off', label: t('messengers.dingtalk.ack.off') },\n { value: 'emoji', label: t('messengers.dingtalk.ack.emoji') },\n { value: 'kaomoji', label: t('messengers.dingtalk.ack.kaomoji') },\n ]}\n />\n {/* v1.2.41 (batch 4 follow-up) — multi-account CRUD editor. */}\n <DingTalkAccountsEditor\n accounts={draft.dingtalk.dingtalk?.accounts ?? {}}\n onChange={(next) => patchSlot('dingtalk', {\n dingtalk: { ...draft.dingtalk.dingtalk, accounts: next },\n })}\n />\n </PlatformCard>\n\n {cfg.features?.globalIm ? (\n <PlatformCard\n slot=\"discord\"\n label={t('messengers.platform.discord')}\n hint={t('messengers.hint.discord')}\n enabled={draft.discord.enabled}\n onToggle={(v) => patchSlot('discord', { enabled: v })}\n >\n <FieldRow\n id=\"dc-token\" label={t('messengers.fields.botToken')}\n value={draft.discord.discord?.botToken ?? ''}\n type=\"password\"\n onChange={(v) => patchSlot('discord', { discord: { ...draft.discord.discord, botToken: v } })}\n />\n <FieldRow\n id=\"dc-channel\" label={t('messengers.fields.channelId')}\n value={draft.discord.discord?.channelId ?? ''}\n onChange={(v) => patchSlot('discord', { discord: { ...draft.discord.discord, channelId: v } })}\n />\n </PlatformCard>\n ) : null}\n </div>\n )}\n\n <WechatQrDialog\n open={qrOpen}\n onOpenChange={setQrOpen}\n onConfirmed={() => { void cfgQuery.refetch(); setSynced(false) }}\n />\n </div>\n )\n}\n\ninterface PlatformCardProps {\n slot: Slot\n label: string\n hint: string\n enabled: boolean\n onToggle: (v: boolean) => void\n children?: React.ReactNode\n}\n\nfunction PlatformCard({ label, hint, enabled, onToggle, children }: PlatformCardProps): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <div className=\"rounded-md border border-border bg-surface p-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium text-text\">{label}</span>\n <Badge variant={enabled ? 'success' : 'outline'}>\n {enabled ? t('messengers.enabled') : t('messengers.disabled')}\n </Badge>\n </div>\n <p className=\"mt-1 text-xs text-text-dim\">{hint}</p>\n </div>\n <label className=\"inline-flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n </label>\n </div>\n {enabled && children && (\n <div className=\"mt-3 flex flex-col gap-2\">\n {children}\n </div>\n )}\n </div>\n )\n}\n\ninterface FieldRowProps {\n id: string\n label: string\n value: string\n onChange: (v: string) => void\n type?: 'text' | 'password'\n}\n\nfunction FieldRow({ id, label, value, onChange, type = 'text' }: FieldRowProps): JSX.Element {\n return (\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[180px_1fr] sm:items-center sm:gap-2\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <Input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n autoComplete=\"off\"\n className=\"font-mono text-xs\"\n />\n </div>\n )\n}\n\n// v1.2.37 (batch 1) — dropdown sibling of FieldRow for enum settings.\ninterface SelectRowProps<T extends string> {\n id: string\n label: string\n value: T\n onChange: (v: T) => void\n options: Array<{ value: T; label: string }>\n}\nfunction SelectRow<T extends string>({ id, label, value, onChange, options }: SelectRowProps<T>): JSX.Element {\n return (\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[180px_1fr] sm:items-center sm:gap-2\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <select\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value as T)}\n className=\"rounded-md border border-input bg-background px-2 py-1 text-xs\"\n >\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </div>\n )\n}\n\ninterface WechatQrDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onConfirmed: () => void\n}\n\nfunction WechatQrDialog({ open, onOpenChange, onConfirmed }: WechatQrDialogProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const start = useStartWechatQr()\n const [token, setToken] = useState<string | null>(null)\n const [qrImage, setQrImage] = useState<string | null>(null)\n const [startError, setStartError] = useState<string | null>(null)\n\n // Kick off the start mutation each time the dialog opens; reset on close.\n useEffect(() => {\n if (!open) {\n setToken(null)\n setQrImage(null)\n setStartError(null)\n return\n }\n let active = true\n start.mutateAsync().then((r) => {\n if (!active) return\n setQrImage(r.qrImage)\n setToken(r.qrToken)\n }).catch((err) => {\n if (!active) return\n setStartError(err instanceof Error ? err.message : String(err))\n })\n return () => { active = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n const statusQuery = useWechatQrStatus(open ? token : null)\n const status = statusQuery.data?.status\n\n useEffect(() => {\n if (status === 'confirmed') {\n toast.success(t('messengers.qr.confirmed'))\n onConfirmed()\n onOpenChange(false)\n }\n if (status === 'expired') {\n toast.error(t('messengers.qr.expired'))\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [status])\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t('messengers.qr.title')}</DialogTitle>\n <DialogDescription>{t('messengers.qr.description')}</DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col items-center gap-3\">\n {start.isPending && !qrImage ? (\n <>\n <Loader2 className=\"h-8 w-8 animate-spin text-text-dim\" />\n <p className=\"text-sm text-text-dim\">{t('messengers.qr.starting')}</p>\n </>\n ) : startError ? (\n <p className=\"text-sm text-danger\">{t('messengers.qr.loadFailed')}: {startError}</p>\n ) : qrImage ? (\n <>\n <img\n src={qrImage}\n alt={t('messengers.qr.title')}\n className=\"rounded-md border border-border\"\n />\n {status === 'expired'\n ? <p className=\"text-xs text-danger\">{t('messengers.qr.expired')}</p>\n : <p className=\"text-xs text-text-dim\">{status ? `· ${status} ·` : ''}</p>}\n </>\n ) : null}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\n// ─── v1.2.41 — DingTalk multi-account CRUD editor ───────────────────\n// Renders below the main DingTalk card. Owns the in-memory accounts\n// dict and bubbles every change up via `onChange` so the page-level\n// dirty/save logic notices and lights up the Save button.\n//\n// Each row shows: id (read-only after creation), name, clientId,\n// clientSecret (password mode, masked on echo), dmPolicy / groupPolicy /\n// ackReaction selectors, allowFrom / groupAllowFrom CSVs, enabled\n// toggle, and a delete button. \"Add account\" appends a fresh row with\n// a generated id the operator can rename inline.\n\nexport interface DingTalkAccountDraft {\n name?: string\n clientId?: string\n clientSecret?: string\n dmPolicy?: 'open' | 'pairing' | 'allowlist'\n groupPolicy?: 'open' | 'allowlist' | 'disabled'\n allowFrom?: string[]\n groupAllowFrom?: string[]\n ackReaction?: 'off' | 'emoji' | 'kaomoji'\n enabled?: boolean\n}\n\ninterface DingTalkAccountsEditorProps {\n accounts: Record<string, DingTalkAccountDraft>\n onChange: (next: Record<string, DingTalkAccountDraft>) => void\n}\n\nfunction DingTalkAccountsEditor({ accounts, onChange }: DingTalkAccountsEditorProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const entries = Object.entries(accounts)\n\n const updateAccount = (id: string, patch: Partial<DingTalkAccountDraft>) => {\n onChange({ ...accounts, [id]: { ...accounts[id], ...patch } })\n }\n const deleteAccount = (id: string) => {\n const next = { ...accounts }\n delete next[id]\n onChange(next)\n }\n const renameAccount = (oldId: string, newId: string) => {\n if (!newId || newId === oldId) return\n if (accounts[newId]) {\n toast.error(t('messengers.dingtalk.accountRenameCollision', { id: newId }))\n return\n }\n const next: Record<string, DingTalkAccountDraft> = {}\n for (const [k, v] of Object.entries(accounts)) {\n next[k === oldId ? newId : k] = v\n }\n onChange(next)\n }\n const addAccount = () => {\n // Find an unused id of shape account-N.\n let n = entries.length + 1\n let candidate = `account-${n}`\n while (accounts[candidate]) { n += 1; candidate = `account-${n}` }\n onChange({ ...accounts, [candidate]: { enabled: true } })\n }\n\n return (\n <div className=\"mt-3 border-t border-input pt-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"text-xs font-semibold text-text-dim\">\n {t('messengers.dingtalk.accountsTitle')}\n </div>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={addAccount}>\n + {t('messengers.dingtalk.addAccount')}\n </Button>\n </div>\n\n {entries.length === 0 ? (\n <div className=\"text-xs text-text-dim italic\">\n {t('messengers.dingtalk.accountsEmpty')}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {entries.map(([id, acct]) => (\n <div key={id} className=\"rounded-md border border-input p-2\">\n <div className=\"mb-2 flex items-center gap-2\">\n <Input\n id={`acct-id-${id}`}\n defaultValue={id}\n onBlur={(e) => renameAccount(id, e.target.value.trim())}\n className=\"font-mono text-xs w-40\"\n placeholder=\"account-id\"\n />\n <Input\n id={`acct-name-${id}`}\n value={acct.name ?? ''}\n onChange={(e) => updateAccount(id, { name: e.target.value })}\n className=\"text-xs flex-1\"\n placeholder={t('messengers.dingtalk.accountName')}\n />\n <label className=\"flex items-center gap-1 text-xs\">\n <input\n type=\"checkbox\"\n checked={acct.enabled !== false}\n onChange={(e) => updateAccount(id, { enabled: e.target.checked })}\n />\n {t('messengers.enabled')}\n </label>\n <Button\n type=\"button\" size=\"sm\" variant=\"ghost\"\n onClick={() => deleteAccount(id)}\n className=\"text-danger\"\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n <div className=\"space-y-1\">\n <FieldRow\n id={`acct-cid-${id}`} label={t('messengers.fields.clientId')}\n value={acct.clientId ?? ''}\n onChange={(v) => updateAccount(id, { clientId: v })}\n />\n <FieldRow\n id={`acct-secret-${id}`} label={t('messengers.fields.clientSecret')}\n value={acct.clientSecret ?? ''}\n type=\"password\"\n onChange={(v) => updateAccount(id, { clientSecret: v })}\n />\n <SelectRow<'open' | 'pairing' | 'allowlist'>\n id={`acct-dm-${id}`} label={t('messengers.dingtalk.dmPolicy')}\n value={acct.dmPolicy ?? 'open'}\n onChange={(v) => updateAccount(id, { dmPolicy: v })}\n options={[\n { value: 'open', label: t('messengers.dingtalk.policy.open') },\n { value: 'pairing', label: t('messengers.dingtalk.policy.pairing') },\n { value: 'allowlist', label: t('messengers.dingtalk.policy.allowlist') },\n ]}\n />\n <SelectRow<'open' | 'allowlist' | 'disabled'>\n id={`acct-group-${id}`} label={t('messengers.dingtalk.groupPolicy')}\n value={acct.groupPolicy ?? 'open'}\n onChange={(v) => updateAccount(id, { groupPolicy: v })}\n options={[\n { value: 'open', label: t('messengers.dingtalk.policy.open') },\n { value: 'allowlist', label: t('messengers.dingtalk.policy.allowlist') },\n { value: 'disabled', label: t('messengers.dingtalk.policy.disabled') },\n ]}\n />\n <FieldRow\n id={`acct-allow-${id}`} label={t('messengers.dingtalk.allowFrom')}\n value={(acct.allowFrom ?? []).join(',')}\n onChange={(v) => updateAccount(id, {\n allowFrom: v.split(',').map((s) => s.trim()).filter(Boolean),\n })}\n />\n <FieldRow\n id={`acct-gallow-${id}`} label={t('messengers.dingtalk.groupAllowFrom')}\n value={(acct.groupAllowFrom ?? []).join(',')}\n onChange={(v) => updateAccount(id, {\n groupAllowFrom: v.split(',').map((s) => s.trim()).filter(Boolean),\n })}\n />\n <SelectRow<'off' | 'emoji' | 'kaomoji'>\n id={`acct-ack-${id}`} label={t('messengers.dingtalk.ackReaction')}\n value={acct.ackReaction ?? 'off'}\n onChange={(v) => updateAccount(id, { ackReaction: v })}\n options={[\n { value: 'off', label: t('messengers.dingtalk.ack.off') },\n { value: 'emoji', label: t('messengers.dingtalk.ack.emoji') },\n { value: 'kaomoji', label: t('messengers.dingtalk.ack.kaomoji') },\n ]}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n <div className=\"mt-1 text-xs text-text-dim\">{t('messengers.dingtalk.accountsHint')}</div>\n </div>\n )\n}\n"],"names":["QrCode","createLucideIcon","buildDraft","cfg","m","buildPatch","draft","messengers","k","SettingsMessengersRoute","t","useTranslation","cfgQuery","useConfig","updateCfg","useUpdateConfig","setDraft","useState","synced","setSynced","useEffect","isDirty","useMemo","qrOpen","setQrOpen","patchSlot","slot","partial","prev","onSave","toast","err","describeError","onDiscard","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","Badge","X","Save","PlatformCard","v","FieldRow","SelectRow","s","DingTalkAccountsEditor","next","WechatQrDialog","label","hint","enabled","onToggle","children","e","id","value","onChange","type","Label","Input","options","o","open","onOpenChange","onConfirmed","start","useStartWechatQr","token","setToken","qrImage","setQrImage","startError","setStartError","active","r","status","useWechatQrStatus","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","accounts","entries","updateAccount","patch","deleteAccount","renameAccount","oldId","newId","addAccount","candidate","acct"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import{y as B,ad as U,U as e,c as h,B as f,I as y,S as P,l as W,m as T,j as O,k as H,L as k,s as F,a3 as g,E as M}from"./index-BY1vfCja.js";import{e as x}from"./react-C9F3QeMB.js";import{d as z,n as L,p as q}from"./use-settings-D4EdDLiK.js";import{a as K,E as X}from"./eye-Ch0DLviZ.js";import{L as E}from"./loader-circle-pGNYdPoE.js";import{R as C}from"./refresh-ccw-BlXMN3UX.js";import{C as J}from"./circle-check-CYse8LRx.js";import{E as Q}from"./external-link-Dkmwlv6p.js";import{X as A}from"./x-5Z_de5zo.js";import{S as V}from"./save-DAFuApnY.js";import{M as Z}from"./map-pin-D1UX9mg7.js";import"./useQuery-DmoWKLw3.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const G=B("Earth",[["path",{d:"M21.54 15H17a2 2 0 0 0-2 2v4.54",key:"1djwo0"}],["path",{d:"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17",key:"1tzkfa"}],["path",{d:"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05",key:"14pb5j"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/**
|
|
7
|
-
* @license lucide-react v0.469.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const Y=B("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);function he(){const{t:i}=U(["settings","common"]),[s,r]=x.useState(!1),a=z({reveal:s});return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-6",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:i("viewerSettings.title")}),e.jsxs(h,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>r(t=>!t),disabled:a.isFetching,"aria-label":i(s?"viewerSettings.hide":"viewerSettings.reveal"),children:[s?e.jsx(K,{className:"h-4 w-4"}):e.jsx(X,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:i(s?"viewerSettings.hide":"viewerSettings.reveal")})]}),e.jsxs(h,{variant:"ghost",size:"sm",onClick:()=>void a.refetch(),disabled:a.isFetching,"aria-label":i("actions.refresh",{ns:"common"}),children:[a.isFetching?e.jsx(E,{className:"h-4 w-4 animate-spin"}):e.jsx(C,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:i("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:i("viewerSettings.subtitle")})]}),a.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx($,{env:a.data?.env??{}}),e.jsx(ee,{env:a.data?.env??{}})]})]})}function I(i){return{enabled:i.IMHUB_VIEWER_ENABLED==="1"||i.IMHUB_VIEWER_ENABLED?.toLowerCase()==="true",publicUrl:i.IMHUB_VIEWER_PUBLIC_BASE_URL??"",tunnelMode:i.IMHUB_VIEWER_TUNNEL_MODE==="quick"?"quick":"off",noDefaultRemote:i.IMHUB_VIEWER_NO_DEFAULT_REMOTE==="1"||i.IMHUB_VIEWER_NO_DEFAULT_REMOTE?.toLowerCase()==="true",chars:i.IMHUB_VIEWER_CHARS??"",lines:i.IMHUB_VIEWER_LINES??"",codeLines:i.IMHUB_VIEWER_CODE_LINES??"",maxPastes:i.IMHUB_VIEWER_MAX_PASTES??""}}function $({env:i}){const{t:s}=U(["settings","common"]),r=L(),a=q(),[t,o]=x.useState(()=>I(i)),[w,N]=x.useState("");x.useEffect(()=>{const n=I(i),u=JSON.stringify(n);u!==w&&(o(n),N(u))},[i.IMHUB_VIEWER_ENABLED,i.IMHUB_VIEWER_PUBLIC_BASE_URL,i.IMHUB_VIEWER_TUNNEL_MODE,i.IMHUB_VIEWER_CHARS,i.IMHUB_VIEWER_LINES,i.IMHUB_VIEWER_CODE_LINES,i.IMHUB_VIEWER_MAX_PASTES,i.IMHUB_VIEWER_NO_DEFAULT_REMOTE]);const c=x.useMemo(()=>I(i),[i]),j=x.useMemo(()=>JSON.stringify(t)!==JSON.stringify(c),[t,c]);function d(n,u){o(D=>({...D,[n]:u}))}async function S(){const n={};if(t.enabled!==c.enabled&&(n.IMHUB_VIEWER_ENABLED=t.enabled?"1":"0"),t.publicUrl!==c.publicUrl&&(n.IMHUB_VIEWER_PUBLIC_BASE_URL=t.publicUrl.trim()||null),t.tunnelMode!==c.tunnelMode&&(n.IMHUB_VIEWER_TUNNEL_MODE=t.tunnelMode),t.chars!==c.chars&&(n.IMHUB_VIEWER_CHARS=t.chars.trim()||null),t.lines!==c.lines&&(n.IMHUB_VIEWER_LINES=t.lines.trim()||null),t.codeLines!==c.codeLines&&(n.IMHUB_VIEWER_CODE_LINES=t.codeLines.trim()||null),t.maxPastes!==c.maxPastes&&(n.IMHUB_VIEWER_MAX_PASTES=t.maxPastes.trim()||null),t.noDefaultRemote!==c.noDefaultRemote&&(n.IMHUB_VIEWER_NO_DEFAULT_REMOTE=t.noDefaultRemote?"1":null),Object.keys(n).length!==0)try{await r.mutateAsync({updates:n}),g.success(s("viewerSettings.toast.saved"))}catch(u){g.error(M(u,s).message)}}function _(){o(c)}const l=a.data,R=l?.effectivePublicUrl;return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(Y,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("viewerSettings.viewer.title")}),t.enabled?e.jsx(f,{variant:"success",children:s("viewerSettings.viewer.on")}):e.jsx(f,{variant:"outline",children:s("viewerSettings.viewer.off")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:s("viewerSettings.viewer.subtitle")}),e.jsx("div",{className:"flex items-center gap-3 px-4 py-3",children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.enabled,onChange:n=>d("enabled",n.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{className:"font-medium",children:s("viewerSettings.viewer.enableLabel")})]})}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 px-4 pb-3 sm:grid-cols-2",children:[e.jsx(m,{label:s("viewerSettings.viewer.publicUrl"),hint:s("viewerSettings.viewer.publicUrlHint"),children:e.jsx(y,{value:t.publicUrl,onChange:n=>d("publicUrl",n.target.value),placeholder:"https://agim.example.com",className:"font-mono text-xs"})}),e.jsx(m,{label:s("viewerSettings.viewer.tunnelMode"),hint:s("viewerSettings.viewer.tunnelHint"),children:e.jsxs(P,{value:t.tunnelMode,onValueChange:n=>d("tunnelMode",n),children:[e.jsx(W,{children:e.jsx(T,{})}),e.jsxs(O,{children:[e.jsx(H,{value:"off",children:s("viewerSettings.viewer.tunnelOff")}),e.jsx(H,{value:"quick",children:s("viewerSettings.viewer.tunnelQuick")})]})]})}),e.jsx(m,{label:s("viewerSettings.viewer.noDefaultRemote"),hint:s("viewerSettings.viewer.noDefaultRemoteHint"),children:e.jsxs("label",{className:"inline-flex items-center gap-2 text-xs",children:[e.jsx("input",{type:"checkbox",checked:t.noDefaultRemote,onChange:n=>d("noDefaultRemote",n.target.checked)}),e.jsx("span",{children:s("viewerSettings.viewer.noDefaultRemoteLabel")})]})})]}),t.tunnelMode==="quick"&&e.jsxs("div",{className:"mx-4 mb-3 rounded-md border border-border bg-surface-2 p-3",children:[e.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[e.jsx(G,{className:"h-4 w-4 text-text-dim"}),e.jsx("span",{className:"text-xs font-medium uppercase tracking-wide text-text-dim",children:s("viewerSettings.viewer.tunnelStatus")}),e.jsxs(h,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void a.refetch(),disabled:a.isFetching,"aria-label":s("viewerSettings.viewer.refreshTunnel"),children:[a.isFetching?e.jsx(E,{className:"h-4 w-4 animate-spin"}):e.jsx(C,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("viewerSettings.viewer.refreshTunnel")})]})]}),l?e.jsxs("div",{className:"flex flex-col gap-1 text-xs",children:[e.jsx(p,{label:s("viewerSettings.viewer.tunnelRunning"),children:l.tunnel.running?e.jsxs("span",{className:"inline-flex items-center gap-1 text-success",children:[e.jsx(J,{className:"h-3 w-3"}),s("viewerSettings.viewer.yes")]}):e.jsx("span",{className:"text-text-dim",children:s("viewerSettings.viewer.no")})}),e.jsx(p,{label:s("viewerSettings.viewer.tunnelUrl"),children:l.tunnel.url?e.jsxs("a",{href:l.tunnel.url,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 break-all font-mono text-info hover:underline",children:[l.tunnel.url,e.jsx(Q,{className:"h-3 w-3 shrink-0"})]}):e.jsx("span",{className:"text-text-muted",children:"—"})}),e.jsx(p,{label:s("viewerSettings.viewer.effectiveUrl"),children:R?e.jsx("span",{className:"break-all font-mono text-text",children:R}):e.jsx("span",{className:"text-text-muted",children:"—"})}),e.jsx(p,{label:s("viewerSettings.viewer.binary"),children:l.tunnel.binaryFound?e.jsx("span",{className:"font-mono text-text",children:l.tunnel.binaryPath}):e.jsx("span",{className:"text-warning",children:s("viewerSettings.viewer.binaryMissing")})}),l.tunnel.lastError&&e.jsx(p,{label:s("viewerSettings.viewer.lastError"),children:e.jsx("span",{className:"break-words text-danger",children:l.tunnel.lastError})})]}):e.jsx("p",{className:"text-xs text-text-dim",children:s("viewerSettings.viewer.tunnelLoading")})]}),e.jsx("h3",{className:"border-t border-border px-4 pt-3 text-xs font-semibold uppercase tracking-wide text-text-dim",children:s("viewerSettings.viewer.thresholds")}),e.jsxs("div",{className:"grid grid-cols-2 gap-3 px-4 py-3 sm:grid-cols-4",children:[e.jsx(m,{label:s("viewerSettings.viewer.chars"),hint:s("viewerSettings.viewer.charsHint"),children:e.jsx(b,{value:t.chars,onChange:n=>d("chars",n),min:100,max:1e4,placeholder:"500"})}),e.jsx(m,{label:s("viewerSettings.viewer.lines"),hint:s("viewerSettings.viewer.linesHint"),children:e.jsx(b,{value:t.lines,onChange:n=>d("lines",n),min:5,max:200,placeholder:"12"})}),e.jsx(m,{label:s("viewerSettings.viewer.codeLines"),hint:s("viewerSettings.viewer.codeLinesHint"),children:e.jsx(b,{value:t.codeLines,onChange:n=>d("codeLines",n),min:5,max:200,placeholder:"10"})}),e.jsx(m,{label:s("viewerSettings.viewer.maxPastes"),hint:s("viewerSettings.viewer.maxPastesHint"),children:e.jsx(b,{value:t.maxPastes,onChange:n=>d("maxPastes",n),min:100,max:1e6,placeholder:"10000"})})]}),j&&e.jsxs("div",{className:"flex items-center gap-2 border-t border-border px-4 py-3",children:[e.jsx(f,{variant:"info",children:s("viewerSettings.dirtyHint")}),e.jsxs(h,{variant:"ghost",size:"sm",className:"ml-auto",onClick:_,disabled:r.isPending,children:[e.jsx(A,{className:"h-4 w-4"}),s("viewerSettings.discard")]}),e.jsxs(h,{size:"sm",onClick:()=>void S(),disabled:r.isPending,children:[r.isPending?e.jsx(E,{className:"h-4 w-4 animate-spin"}):e.jsx(V,{className:"h-4 w-4"}),r.isPending?s("viewerSettings.saving"):s("viewerSettings.save")]})]})]})}function v(i){return/\*{3,}/.test(i)}function ee({env:i}){const{t:s}=U(["settings","common"]),r=L(),a=i.IMHUB_BAIDU_MAP_AK??"",[t,o]=x.useState(a),[w,N]=x.useState("");x.useEffect(()=>{a!==w&&(o(a),N(a))},[a,w]);const c=!!a,j=t!==a&&!(v(t)&&t===a),d=t.length>0&&!v(t)&&t.length!==32;async function S(){if(j&&!v(t))try{await r.mutateAsync({updates:{IMHUB_BAIDU_MAP_AK:t.trim()||null}}),g.success(s("viewerSettings.baidu.toast.saved"))}catch(l){g.error(M(l,s).message)}}async function _(){try{await r.mutateAsync({updates:{IMHUB_BAIDU_MAP_AK:null}}),o(""),g.success(s("viewerSettings.baidu.toast.cleared"))}catch(l){g.error(M(l,s).message)}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(Z,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("viewerSettings.baidu.title")}),c?e.jsx(f,{variant:"success",children:s("viewerSettings.baidu.configured")}):e.jsx(f,{variant:"outline",children:s("viewerSettings.baidu.empty")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:s("viewerSettings.baidu.subtitle")}),e.jsxs("div",{className:"px-4 py-3",children:[e.jsx(k,{htmlFor:"baidu-ak",className:"text-xs font-medium",children:"IMHUB_BAIDU_MAP_AK"}),e.jsx(y,{id:"baidu-ak",value:t,onChange:l=>o(l.target.value),placeholder:s("viewerSettings.baidu.placeholder"),autoComplete:"off",className:F("mt-1 font-mono text-xs",v(t)&&"text-text-muted")}),d&&e.jsx("p",{className:"mt-1 text-[11px] text-warning",children:s("viewerSettings.baidu.suspicious",{length:t.length})}),e.jsx("p",{className:"mt-1 text-[11px] text-text-dim",children:s("viewerSettings.baidu.hint")})]}),e.jsxs("div",{className:"flex items-center gap-2 border-t border-border px-4 py-3",children:[e.jsxs(h,{variant:"ghost",size:"sm",onClick:()=>void _(),disabled:!c||r.isPending,className:"text-danger hover:text-danger",children:[e.jsx(A,{className:"h-4 w-4"}),s("viewerSettings.baidu.clear")]}),e.jsx("span",{className:"ml-auto"}),j&&e.jsxs(h,{size:"sm",onClick:()=>void S(),disabled:r.isPending||v(t),children:[r.isPending?e.jsx(E,{className:"h-4 w-4 animate-spin"}):e.jsx(V,{className:"h-4 w-4"}),r.isPending?s("viewerSettings.saving"):s("viewerSettings.save")]})]})]})}function m({label:i,hint:s,children:r}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(k,{className:"text-xs font-medium",children:i}),r,s&&e.jsx("p",{className:"text-[11px] text-text-dim",children:s})]})}function p({label:i,children:s}){return e.jsxs("div",{className:"flex flex-wrap items-baseline gap-2",children:[e.jsxs("span",{className:"shrink-0 font-medium text-text-dim",children:[i,":"]}),e.jsx("span",{className:"min-w-0 flex-1",children:s})]})}function b({value:i,onChange:s,min:r,max:a,placeholder:t}){return e.jsx(y,{type:"number",inputMode:"numeric",min:r,max:a,value:i,onChange:o=>s(o.target.value),placeholder:t})}export{he as default};
|
|
12
|
-
//# sourceMappingURL=viewer-CJNrz2iw.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-CJNrz2iw.js","sources":["../../node_modules/lucide-react/dist/esm/icons/earth.js","../../node_modules/lucide-react/dist/esm/icons/file-text.js","../../src/routes/settings/viewer.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Earth = createLucideIcon(\"Earth\", [\n [\"path\", { d: \"M21.54 15H17a2 2 0 0 0-2 2v4.54\", key: \"1djwo0\" }],\n [\n \"path\",\n {\n d: \"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17\",\n key: \"1tzkfa\"\n }\n ],\n [\"path\", { d: \"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05\", key: \"14pb5j\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n]);\n\nexport { Earth as default };\n//# sourceMappingURL=earth.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileText = createLucideIcon(\"FileText\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n]);\n\nexport { FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * /settings/viewer — long-message Viewer card + Baidu Maps AK card.\n *\n * Both cards are env-driven (~/.agim/.env), each with its own dirty /\n * Save / Discard state so a change to one doesn't force re-save of the\n * other. The Viewer card additionally surfaces cloudflared tunnel\n * status via `GET /api/viewer/tunnel`, with a manual Refresh button\n * since tunnel state is essentially static between operator actions.\n *\n * Env keys covered:\n * * Viewer: IMHUB_VIEWER_ENABLED / _PUBLIC_BASE_URL / _TUNNEL_MODE /\n * _CHARS / _LINES / _CODE_LINES / _MAX_PASTES\n * * Baidu: IMHUB_BAIDU_MAP_AK (in SECRET_KEYS — masked unless\n * reveal=1 is passed)\n *\n * AK validation: v1 mentioned \"32-char AK starting with non-digit\" as\n * a hint, but isn't strictly enforced (Baidu has refreshed AK formats\n * over the years). We surface a `pattern-looks-suspicious` warning\n * rather than blocking save.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n CheckCircle2, Eye, EyeOff, ExternalLink, FileText, Globe2, Loader2,\n MapPin, RefreshCcw, Save, X,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv, useViewerTunnel } from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\n\n/* ─────────────── Page wrapper ─────────────── */\n\nexport default function SettingsViewerRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const [reveal, setReveal] = useState(false)\n const envQuery = useEnv({ reveal })\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-6\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('viewerSettings.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => setReveal((v) => !v)}\n disabled={envQuery.isFetching}\n aria-label={reveal ? t('viewerSettings.hide') : t('viewerSettings.reveal')}\n >\n {reveal ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">\n {reveal ? t('viewerSettings.hide') : t('viewerSettings.reveal')}\n </span>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void envQuery.refetch()}\n disabled={envQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('viewerSettings.subtitle')}</p>\n </header>\n\n {envQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <ViewerCard env={envQuery.data?.env ?? {}} />\n <BaiduCard env={envQuery.data?.env ?? {}} />\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Viewer card ─────────────── */\n\ninterface ViewerDraft {\n enabled: boolean\n publicUrl: string\n tunnelMode: 'off' | 'quick'\n // v1.2.45 — remote-paste URL/Token are env-only advanced knobs.\n // Only the opt-out toggle stays in the UI.\n noDefaultRemote: boolean\n chars: string\n lines: string\n codeLines: string\n maxPastes: string\n}\n\nfunction viewerDraftFromEnv(env: Record<string, string>): ViewerDraft {\n return {\n enabled: env.IMHUB_VIEWER_ENABLED === '1' || env.IMHUB_VIEWER_ENABLED?.toLowerCase() === 'true',\n publicUrl: env.IMHUB_VIEWER_PUBLIC_BASE_URL ?? '',\n tunnelMode: env.IMHUB_VIEWER_TUNNEL_MODE === 'quick' ? 'quick' : 'off',\n noDefaultRemote: env.IMHUB_VIEWER_NO_DEFAULT_REMOTE === '1' || env.IMHUB_VIEWER_NO_DEFAULT_REMOTE?.toLowerCase() === 'true',\n chars: env.IMHUB_VIEWER_CHARS ?? '',\n lines: env.IMHUB_VIEWER_LINES ?? '',\n codeLines: env.IMHUB_VIEWER_CODE_LINES ?? '',\n maxPastes: env.IMHUB_VIEWER_MAX_PASTES ?? '',\n }\n}\n\nfunction ViewerCard({ env }: { env: Record<string, string> }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const updateEnv = useUpdateEnv()\n const tunnelQuery = useViewerTunnel()\n\n const [draft, setDraft] = useState<ViewerDraft>(() => viewerDraftFromEnv(env))\n const [syncedHash, setSyncedHash] = useState('')\n\n // Sync draft when env changes (initial load + post-save refetch).\n useEffect(() => {\n const next = viewerDraftFromEnv(env)\n const hash = JSON.stringify(next)\n if (hash !== syncedHash) {\n setDraft(next)\n setSyncedHash(hash)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [env.IMHUB_VIEWER_ENABLED, env.IMHUB_VIEWER_PUBLIC_BASE_URL,\n env.IMHUB_VIEWER_TUNNEL_MODE, env.IMHUB_VIEWER_CHARS,\n env.IMHUB_VIEWER_LINES, env.IMHUB_VIEWER_CODE_LINES,\n env.IMHUB_VIEWER_MAX_PASTES, env.IMHUB_VIEWER_NO_DEFAULT_REMOTE])\n\n const current = useMemo(() => viewerDraftFromEnv(env), [env])\n const isDirty = useMemo(\n () => JSON.stringify(draft) !== JSON.stringify(current),\n [draft, current],\n )\n\n function setField<K extends keyof ViewerDraft>(k: K, v: ViewerDraft[K]): void {\n setDraft((d) => ({ ...d, [k]: v }))\n }\n\n async function onSave(): Promise<void> {\n const updates: Record<string, string | null> = {}\n if (draft.enabled !== current.enabled) {\n updates.IMHUB_VIEWER_ENABLED = draft.enabled ? '1' : '0'\n }\n if (draft.publicUrl !== current.publicUrl) {\n updates.IMHUB_VIEWER_PUBLIC_BASE_URL = draft.publicUrl.trim() || null\n }\n if (draft.tunnelMode !== current.tunnelMode) {\n updates.IMHUB_VIEWER_TUNNEL_MODE = draft.tunnelMode\n }\n if (draft.chars !== current.chars) {\n updates.IMHUB_VIEWER_CHARS = draft.chars.trim() || null\n }\n if (draft.lines !== current.lines) {\n updates.IMHUB_VIEWER_LINES = draft.lines.trim() || null\n }\n if (draft.codeLines !== current.codeLines) {\n updates.IMHUB_VIEWER_CODE_LINES = draft.codeLines.trim() || null\n }\n if (draft.maxPastes !== current.maxPastes) {\n updates.IMHUB_VIEWER_MAX_PASTES = draft.maxPastes.trim() || null\n }\n if (draft.noDefaultRemote !== current.noDefaultRemote) {\n updates.IMHUB_VIEWER_NO_DEFAULT_REMOTE = draft.noDefaultRemote ? '1' : null\n }\n if (Object.keys(updates).length === 0) return\n try {\n await updateEnv.mutateAsync({ updates })\n toast.success(t('viewerSettings.toast.saved'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n function onDiscard(): void {\n setDraft(current)\n }\n\n const tunnel = tunnelQuery.data\n const effectivePublicUrl = tunnel?.effectivePublicUrl\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <FileText className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('viewerSettings.viewer.title')}</h2>\n {draft.enabled\n ? <Badge variant=\"success\">{t('viewerSettings.viewer.on')}</Badge>\n : <Badge variant=\"outline\">{t('viewerSettings.viewer.off')}</Badge>}\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('viewerSettings.viewer.subtitle')}</p>\n\n {/* Enable toggle */}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.enabled}\n onChange={(e) => setField('enabled', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span className=\"font-medium\">{t('viewerSettings.viewer.enableLabel')}</span>\n </label>\n </div>\n\n {/* Public URL + tunnel mode */}\n <div className=\"grid grid-cols-1 gap-3 px-4 pb-3 sm:grid-cols-2\">\n <Field label={t('viewerSettings.viewer.publicUrl')} hint={t('viewerSettings.viewer.publicUrlHint')}>\n <Input\n value={draft.publicUrl}\n onChange={(e) => setField('publicUrl', e.target.value)}\n placeholder=\"https://agim.example.com\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field label={t('viewerSettings.viewer.tunnelMode')} hint={t('viewerSettings.viewer.tunnelHint')}>\n <Select\n value={draft.tunnelMode}\n onValueChange={(v) => setField('tunnelMode', v as 'off' | 'quick')}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"off\">{t('viewerSettings.viewer.tunnelOff')}</SelectItem>\n <SelectItem value=\"quick\">{t('viewerSettings.viewer.tunnelQuick')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n\n {/* v1.2.45 — only the opt-out toggle is in the UI. The\n community default endpoint (viewer.iclaw.host) is the\n implicit fallback when neither public base URL nor tunnel\n is set; operators who need to point at a different paste\n server use the IMHUB_VIEWER_REMOTE_PASTE_URL env var\n (documented in docs/viewer-modes.md). */}\n <Field\n label={t('viewerSettings.viewer.noDefaultRemote')}\n hint={t('viewerSettings.viewer.noDefaultRemoteHint')}\n >\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={draft.noDefaultRemote}\n onChange={(e) => setField('noDefaultRemote', e.target.checked)}\n />\n <span>{t('viewerSettings.viewer.noDefaultRemoteLabel')}</span>\n </label>\n </Field>\n </div>\n\n {/* Tunnel status panel (only when quick mode is selected) */}\n {draft.tunnelMode === 'quick' && (\n <div className=\"mx-4 mb-3 rounded-md border border-border bg-surface-2 p-3\">\n <div className=\"mb-1 flex items-center gap-2\">\n <Globe2 className=\"h-4 w-4 text-text-dim\" />\n <span className=\"text-xs font-medium uppercase tracking-wide text-text-dim\">\n {t('viewerSettings.viewer.tunnelStatus')}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => void tunnelQuery.refetch()}\n disabled={tunnelQuery.isFetching}\n aria-label={t('viewerSettings.viewer.refreshTunnel')}\n >\n {tunnelQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('viewerSettings.viewer.refreshTunnel')}</span>\n </Button>\n </div>\n {tunnel ? (\n <div className=\"flex flex-col gap-1 text-xs\">\n <Row label={t('viewerSettings.viewer.tunnelRunning')}>\n {tunnel.tunnel.running ? (\n <span className=\"inline-flex items-center gap-1 text-success\">\n <CheckCircle2 className=\"h-3 w-3\" />\n {t('viewerSettings.viewer.yes')}\n </span>\n ) : (\n <span className=\"text-text-dim\">{t('viewerSettings.viewer.no')}</span>\n )}\n </Row>\n <Row label={t('viewerSettings.viewer.tunnelUrl')}>\n {tunnel.tunnel.url ? (\n <a\n href={tunnel.tunnel.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 break-all font-mono text-info hover:underline\"\n >\n {tunnel.tunnel.url}\n <ExternalLink className=\"h-3 w-3 shrink-0\" />\n </a>\n ) : <span className=\"text-text-muted\">—</span>}\n </Row>\n <Row label={t('viewerSettings.viewer.effectiveUrl')}>\n {effectivePublicUrl ? (\n <span className=\"break-all font-mono text-text\">{effectivePublicUrl}</span>\n ) : <span className=\"text-text-muted\">—</span>}\n </Row>\n <Row label={t('viewerSettings.viewer.binary')}>\n {tunnel.tunnel.binaryFound ? (\n <span className=\"font-mono text-text\">{tunnel.tunnel.binaryPath}</span>\n ) : (\n <span className=\"text-warning\">{t('viewerSettings.viewer.binaryMissing')}</span>\n )}\n </Row>\n {tunnel.tunnel.lastError && (\n <Row label={t('viewerSettings.viewer.lastError')}>\n <span className=\"break-words text-danger\">{tunnel.tunnel.lastError}</span>\n </Row>\n )}\n </div>\n ) : (\n <p className=\"text-xs text-text-dim\">{t('viewerSettings.viewer.tunnelLoading')}</p>\n )}\n </div>\n )}\n\n {/* Thresholds */}\n <h3 className=\"border-t border-border px-4 pt-3 text-xs font-semibold uppercase tracking-wide text-text-dim\">\n {t('viewerSettings.viewer.thresholds')}\n </h3>\n <div className=\"grid grid-cols-2 gap-3 px-4 py-3 sm:grid-cols-4\">\n <Field label={t('viewerSettings.viewer.chars')} hint={t('viewerSettings.viewer.charsHint')}>\n <NumberInput value={draft.chars} onChange={(v) => setField('chars', v)} min={100} max={10000} placeholder=\"500\" />\n </Field>\n <Field label={t('viewerSettings.viewer.lines')} hint={t('viewerSettings.viewer.linesHint')}>\n <NumberInput value={draft.lines} onChange={(v) => setField('lines', v)} min={5} max={200} placeholder=\"12\" />\n </Field>\n <Field label={t('viewerSettings.viewer.codeLines')} hint={t('viewerSettings.viewer.codeLinesHint')}>\n <NumberInput value={draft.codeLines} onChange={(v) => setField('codeLines', v)} min={5} max={200} placeholder=\"10\" />\n </Field>\n <Field label={t('viewerSettings.viewer.maxPastes')} hint={t('viewerSettings.viewer.maxPastesHint')}>\n <NumberInput value={draft.maxPastes} onChange={(v) => setField('maxPastes', v)} min={100} max={1000000} placeholder=\"10000\" />\n </Field>\n </div>\n\n {/* Save bar */}\n {isDirty && (\n <div className=\"flex items-center gap-2 border-t border-border px-4 py-3\">\n <Badge variant=\"info\">{t('viewerSettings.dirtyHint')}</Badge>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={onDiscard}\n disabled={updateEnv.isPending}\n >\n <X className=\"h-4 w-4\" />\n {t('viewerSettings.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateEnv.isPending}\n >\n {updateEnv.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {updateEnv.isPending ? t('viewerSettings.saving') : t('viewerSettings.save')}\n </Button>\n </div>\n )}\n </section>\n )\n}\n\n/* ─────────────── Baidu Maps card ─────────────── */\n\nfunction isMasked(s: string): boolean {\n return /\\*{3,}/.test(s)\n}\n\nfunction BaiduCard({ env }: { env: Record<string, string> }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const updateEnv = useUpdateEnv()\n\n const currentAk = env.IMHUB_BAIDU_MAP_AK ?? ''\n const [draftAk, setDraftAk] = useState(currentAk)\n const [syncedHash, setSyncedHash] = useState('')\n\n useEffect(() => {\n if (currentAk !== syncedHash) {\n setDraftAk(currentAk)\n setSyncedHash(currentAk)\n }\n }, [currentAk, syncedHash])\n\n const isConfigured = !!currentAk\n // Treat masked echo as no-change. Operator either typed something\n // new, or cleared. AK validity = looks-suspicious warning.\n const isDirty = draftAk !== currentAk && !(isMasked(draftAk) && draftAk === currentAk)\n const suspicious = draftAk.length > 0 && !isMasked(draftAk) && draftAk.length !== 32\n\n async function onSave(): Promise<void> {\n if (!isDirty) return\n if (isMasked(draftAk)) return // server would skip anyway; be explicit\n try {\n await updateEnv.mutateAsync({\n updates: { IMHUB_BAIDU_MAP_AK: draftAk.trim() || null },\n })\n toast.success(t('viewerSettings.baidu.toast.saved'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onClear(): Promise<void> {\n try {\n await updateEnv.mutateAsync({ updates: { IMHUB_BAIDU_MAP_AK: null } })\n setDraftAk('')\n toast.success(t('viewerSettings.baidu.toast.cleared'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <MapPin className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('viewerSettings.baidu.title')}</h2>\n {isConfigured\n ? <Badge variant=\"success\">{t('viewerSettings.baidu.configured')}</Badge>\n : <Badge variant=\"outline\">{t('viewerSettings.baidu.empty')}</Badge>}\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('viewerSettings.baidu.subtitle')}</p>\n\n <div className=\"px-4 py-3\">\n <Label htmlFor=\"baidu-ak\" className=\"text-xs font-medium\">IMHUB_BAIDU_MAP_AK</Label>\n <Input\n id=\"baidu-ak\"\n value={draftAk}\n onChange={(e) => setDraftAk(e.target.value)}\n placeholder={t('viewerSettings.baidu.placeholder')}\n autoComplete=\"off\"\n className={cn('mt-1 font-mono text-xs', isMasked(draftAk) && 'text-text-muted')}\n />\n {suspicious && (\n <p className=\"mt-1 text-[11px] text-warning\">\n {t('viewerSettings.baidu.suspicious', { length: draftAk.length })}\n </p>\n )}\n <p className=\"mt-1 text-[11px] text-text-dim\">{t('viewerSettings.baidu.hint')}</p>\n </div>\n\n <div className=\"flex items-center gap-2 border-t border-border px-4 py-3\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void onClear()}\n disabled={!isConfigured || updateEnv.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <X className=\"h-4 w-4\" />\n {t('viewerSettings.baidu.clear')}\n </Button>\n <span className=\"ml-auto\" />\n {isDirty && (\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateEnv.isPending || isMasked(draftAk)}\n >\n {updateEnv.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {updateEnv.isPending ? t('viewerSettings.saving') : t('viewerSettings.save')}\n </Button>\n )}\n </div>\n </section>\n )\n}\n\n/* ─────────────── Helpers ─────────────── */\n\ninterface FieldProps {\n label: string\n hint?: string\n children: React.ReactNode\n}\n\nfunction Field({ label, hint, children }: FieldProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">{label}</Label>\n {children}\n {hint && <p className=\"text-[11px] text-text-dim\">{hint}</p>}\n </div>\n )\n}\n\ninterface RowProps {\n label: string\n children: React.ReactNode\n}\n\nfunction Row({ label, children }: RowProps): JSX.Element {\n return (\n <div className=\"flex flex-wrap items-baseline gap-2\">\n <span className=\"shrink-0 font-medium text-text-dim\">{label}:</span>\n <span className=\"min-w-0 flex-1\">{children}</span>\n </div>\n )\n}\n\ninterface NumberInputProps {\n value: string\n onChange: (v: string) => void\n min?: number\n max?: number\n placeholder?: string\n}\n\nfunction NumberInput({ value, onChange, min, max, placeholder }: NumberInputProps): JSX.Element {\n return (\n <Input\n type=\"number\"\n inputMode=\"numeric\"\n min={min}\n max={max}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n />\n )\n}\n"],"names":["Earth","createLucideIcon","FileText","SettingsViewerRoute","t","useTranslation","reveal","setReveal","useState","envQuery","useEnv","jsxs","jsx","Button","v","EyeOff","Eye","Loader2","RefreshCcw","Fragment","ViewerCard","BaiduCard","viewerDraftFromEnv","env","updateEnv","useUpdateEnv","tunnelQuery","useViewerTunnel","draft","setDraft","syncedHash","setSyncedHash","useEffect","next","hash","current","useMemo","isDirty","setField","k","d","onSave","updates","toast","err","describeError","onDiscard","tunnel","effectivePublicUrl","Badge","e","Field","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Globe2","Row","CheckCircle2","ExternalLink","NumberInput","X","Save","isMasked","s","currentAk","draftAk","setDraftAk","isConfigured","suspicious","onClear","MapPin","Label","cn","label","hint","children","value","onChange","min","max","placeholder"],"mappings":"+mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAQC,EAAiB,QAAS,CACtC,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CACE,OACA,CACE,EAAG,uFACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,iEAAkE,IAAK,QAAQ,CAAE,EAC/F,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAQ,CAAE,CAC3D,CAAC,ECpBD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMC,EAAWD,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,6DAA8D,IAAK,QAAQ,CAAE,EAC3F,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAQ,CAAE,EACxD,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC,EC+BD,SAAwBE,IAAmC,CACzD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7C,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpCC,EAAWC,EAAO,CAAE,OAAAJ,EAAQ,EAElC,OACEK,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,sBAChB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAR,EAAE,sBAAsB,EAAE,EACjEO,EAAAA,KAACE,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,UACV,QAAS,IAAMN,EAAWO,GAAM,CAACA,CAAC,EAClC,SAAUL,EAAS,WACnB,aAAqBL,EAATE,EAAW,sBAA2B,uBAAN,EAE3C,SAAA,CAAAA,EAASM,EAAAA,IAACG,GAAO,UAAU,SAAA,CAAU,EAAKH,EAAAA,IAACI,EAAA,CAAI,UAAU,SAAA,CAAU,EACpEJ,EAAAA,IAAC,OAAA,CAAK,UAAU,mBACb,SAASR,EAATE,EAAW,sBAA2B,uBAAN,CAA6B,CAChE,CAAA,CAAA,CAAA,EAEFK,EAAAA,KAACE,EAAA,CACC,QAAQ,QACR,KAAK,KACL,QAAS,IAAM,KAAKJ,EAAS,QAAA,EAC7B,SAAUA,EAAS,WACnB,aAAYL,EAAE,kBAAmB,CAAE,GAAI,SAAU,EAEhD,SAAA,CAAAK,EAAS,iBACLQ,EAAA,CAAQ,UAAU,uBAAuB,EAC1CL,EAAAA,IAACM,EAAA,CAAW,UAAU,SAAA,CAAU,EACpCN,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAoB,SAAAR,EAAE,kBAAmB,CAAE,GAAI,QAAA,CAAU,CAAA,CAAE,CAAA,CAAA,CAAA,CAC7E,EACF,QACC,IAAA,CAAE,UAAU,wBAAyB,SAAAA,EAAE,yBAAyB,CAAA,CAAE,CAAA,EACrE,EAECK,EAAS,UACRG,MAAC,OAAI,UAAU,4CAAA,CAA6C,EAE5DD,EAAAA,KAAAQ,EAAAA,SAAA,CACE,SAAA,CAAAP,EAAAA,IAACQ,GAAW,IAAKX,EAAS,MAAM,KAAO,CAAA,EAAI,QAC1CY,GAAA,CAAU,IAAKZ,EAAS,MAAM,KAAO,EAAC,CAAG,CAAA,CAAA,CAC5C,CAAA,EAEJ,CAEJ,CAiBA,SAASa,EAAmBC,EAA0C,CACpE,MAAO,CACL,QAAYA,EAAI,uBAAyB,KAAOA,EAAI,sBAAsB,gBAAkB,OAC5F,UAAYA,EAAI,8BAAgC,GAChD,WAAYA,EAAI,2BAA6B,QAAU,QAAU,MACjE,gBAAiBA,EAAI,iCAAmC,KAAOA,EAAI,gCAAgC,gBAAkB,OACrH,MAAYA,EAAI,oBAAsB,GACtC,MAAYA,EAAI,oBAAsB,GACtC,UAAYA,EAAI,yBAA2B,GAC3C,UAAYA,EAAI,yBAA2B,EAAA,CAE/C,CAEA,SAASH,EAAW,CAAE,IAAAG,GAAqD,CACzE,KAAM,CAAE,EAAAnB,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7CmB,EAAYC,EAAA,EACZC,EAAcC,EAAA,EAEd,CAACC,EAAOC,CAAQ,EAAIrB,EAAAA,SAAsB,IAAMc,EAAmBC,CAAG,CAAC,EACvE,CAACO,EAAYC,CAAa,EAAIvB,EAAAA,SAAS,EAAE,EAG/CwB,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAOX,EAAmBC,CAAG,EAC7BW,EAAO,KAAK,UAAUD,CAAI,EAC5BC,IAASJ,IACXD,EAASI,CAAI,EACbF,EAAcG,CAAI,EAGtB,EAAG,CAACX,EAAI,qBAAsBA,EAAI,6BAC9BA,EAAI,yBAA0BA,EAAI,mBAClCA,EAAI,mBAAoBA,EAAI,wBAC5BA,EAAI,wBAAyBA,EAAI,8BAAA,CAA+B,EAEpE,MAAMY,EAAUC,EAAAA,QAAQ,IAAMd,EAAmBC,CAAG,EAAG,CAACA,CAAG,CAAC,EACtDc,EAAUD,EAAAA,QACd,IAAM,KAAK,UAAUR,CAAK,IAAM,KAAK,UAAUO,CAAO,EACtD,CAACP,EAAOO,CAAO,CAAA,EAGjB,SAASG,EAAsCC,EAAMzB,EAAyB,CAC5Ee,EAAUW,IAAO,CAAE,GAAGA,EAAG,CAACD,CAAC,EAAGzB,CAAA,EAAI,CACpC,CAEA,eAAe2B,GAAwB,CACrC,MAAMC,EAAyC,CAAA,EAyB/C,GAxBId,EAAM,UAAYO,EAAQ,UAC5BO,EAAQ,qBAAuBd,EAAM,QAAU,IAAM,KAEnDA,EAAM,YAAcO,EAAQ,YAC9BO,EAAQ,6BAA+Bd,EAAM,UAAU,KAAA,GAAU,MAE/DA,EAAM,aAAeO,EAAQ,aAC/BO,EAAQ,yBAA2Bd,EAAM,YAEvCA,EAAM,QAAUO,EAAQ,QAC1BO,EAAQ,mBAAqBd,EAAM,MAAM,KAAA,GAAU,MAEjDA,EAAM,QAAUO,EAAQ,QAC1BO,EAAQ,mBAAqBd,EAAM,MAAM,KAAA,GAAU,MAEjDA,EAAM,YAAcO,EAAQ,YAC9BO,EAAQ,wBAA0Bd,EAAM,UAAU,KAAA,GAAU,MAE1DA,EAAM,YAAcO,EAAQ,YAC9BO,EAAQ,wBAA0Bd,EAAM,UAAU,KAAA,GAAU,MAE1DA,EAAM,kBAAoBO,EAAQ,kBACpCO,EAAQ,+BAAiCd,EAAM,gBAAkB,IAAM,MAErE,OAAO,KAAKc,CAAO,EAAE,SAAW,EACpC,GAAI,CACF,MAAMlB,EAAU,YAAY,CAAE,QAAAkB,EAAS,EACvCC,EAAM,QAAQvC,EAAE,4BAA4B,CAAC,CAC/C,OAASwC,EAAK,CACZD,EAAM,MAAME,EAAcD,EAAKxC,CAAC,EAAE,OAAO,CAC3C,CACF,CAEA,SAAS0C,GAAkB,CACzBjB,EAASM,CAAO,CAClB,CAEA,MAAMY,EAASrB,EAAY,KACrBsB,EAAqBD,GAAQ,mBAEnC,OACEpC,EAAAA,KAAC,UAAA,CAAQ,UAAU,6CACjB,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,2DAChB,SAAA,CAAAC,EAAAA,IAACV,EAAA,CAAS,UAAU,uBAAA,CAAwB,QAC3C,KAAA,CAAG,UAAU,wBAAyB,SAAAE,EAAE,6BAA6B,EAAE,EACvEwB,EAAM,QACHhB,EAAAA,IAACqC,EAAA,CAAM,QAAQ,UAAW,SAAA7C,EAAE,0BAA0B,CAAA,CAAE,QACvD6C,EAAA,CAAM,QAAQ,UAAW,SAAA7C,EAAE,2BAA2B,CAAA,CAAE,CAAA,EAC/D,QACC,IAAA,CAAE,UAAU,kCAAmC,SAAAA,EAAE,gCAAgC,EAAE,QAGnF,MAAA,CAAI,UAAU,oCACb,SAAAO,EAAAA,KAAC,QAAA,CAAM,UAAU,kCACf,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAASgB,EAAM,QACf,SAAWsB,GAAMZ,EAAS,UAAWY,EAAE,OAAO,OAAO,EACrD,UAAU,sCAAA,CAAA,QAEX,OAAA,CAAK,UAAU,cAAe,SAAA9C,EAAE,mCAAmC,CAAA,CAAE,CAAA,CAAA,CACxE,CAAA,CACF,EAGAO,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAC,EAAAA,IAACuC,EAAA,CAAM,MAAO/C,EAAE,iCAAiC,EAAG,KAAMA,EAAE,qCAAqC,EAC/F,SAAAQ,EAAAA,IAACwC,EAAA,CACC,MAAOxB,EAAM,UACb,SAAWsB,GAAMZ,EAAS,YAAaY,EAAE,OAAO,KAAK,EACrD,YAAY,2BACZ,UAAU,mBAAA,CAAA,EAEd,EACAtC,EAAAA,IAACuC,GAAM,MAAO/C,EAAE,kCAAkC,EAAG,KAAMA,EAAE,kCAAkC,EAC7F,SAAAO,EAAAA,KAAC0C,EAAA,CACC,MAAOzB,EAAM,WACb,cAAgBd,GAAMwB,EAAS,aAAcxB,CAAoB,EAEjE,SAAA,CAAAF,EAAAA,IAAC0C,EAAA,CAAc,SAAA1C,EAAAA,IAAC2C,EAAA,CAAA,CAAY,EAAE,SAC7BC,EAAA,CACC,SAAA,CAAA5C,MAAC6C,EAAA,CAAW,MAAM,MAAO,SAAArD,EAAE,iCAAiC,EAAE,QAC7DqD,EAAA,CAAW,MAAM,QAAS,SAAArD,EAAE,mCAAmC,CAAA,CAAE,CAAA,CAAA,CACpE,CAAA,CAAA,CAAA,EAEJ,EAQAQ,EAAAA,IAACuC,EAAA,CACC,MAAO/C,EAAE,uCAAuC,EAChD,KAAMA,EAAE,2CAA2C,EAEnD,SAAAO,EAAAA,KAAC,QAAA,CAAM,UAAU,yCACf,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAASgB,EAAM,gBACf,SAAWsB,GAAMZ,EAAS,kBAAmBY,EAAE,OAAO,OAAO,CAAA,CAAA,EAE/DtC,EAAAA,IAAC,OAAA,CAAM,SAAAR,EAAE,4CAA4C,CAAA,CAAE,CAAA,CAAA,CACzD,CAAA,CAAA,CACF,EACF,EAGCwB,EAAM,aAAe,SACpBjB,EAAAA,KAAC,MAAA,CAAI,UAAU,6DACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAC,EAAAA,IAAC8C,EAAA,CAAO,UAAU,uBAAA,CAAwB,QACzC,OAAA,CAAK,UAAU,4DACb,SAAAtD,EAAE,oCAAoC,EACzC,EACAO,EAAAA,KAACE,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,UACV,QAAS,IAAM,KAAKa,EAAY,QAAA,EAChC,SAAUA,EAAY,WACtB,aAAYtB,EAAE,qCAAqC,EAElD,SAAA,CAAAsB,EAAY,iBACRT,EAAA,CAAQ,UAAU,uBAAuB,EAC1CL,EAAAA,IAACM,EAAA,CAAW,UAAU,SAAA,CAAU,QACnC,OAAA,CAAK,UAAU,mBAAoB,SAAAd,EAAE,qCAAqC,CAAA,CAAE,CAAA,CAAA,CAAA,CAC/E,EACF,EACC2C,EACCpC,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAC,EAAAA,IAAC+C,EAAA,CAAI,MAAOvD,EAAE,qCAAqC,EAChD,SAAA2C,EAAO,OAAO,QACbpC,EAAAA,KAAC,OAAA,CAAK,UAAU,8CACd,SAAA,CAAAC,EAAAA,IAACgD,EAAA,CAAa,UAAU,SAAA,CAAU,EACjCxD,EAAE,2BAA2B,CAAA,CAAA,CAChC,QAEC,OAAA,CAAK,UAAU,gBAAiB,SAAAA,EAAE,0BAA0B,EAAE,CAAA,CAEnE,EACAQ,EAAAA,IAAC+C,GAAI,MAAOvD,EAAE,iCAAiC,EAC5C,SAAA2C,EAAO,OAAO,IACbpC,EAAAA,KAAC,IAAA,CACC,KAAMoC,EAAO,OAAO,IACpB,OAAO,SACP,IAAI,sBACJ,UAAU,+EAET,SAAA,CAAAA,EAAO,OAAO,IACfnC,EAAAA,IAACiD,EAAA,CAAa,UAAU,kBAAA,CAAmB,CAAA,CAAA,CAAA,EAE3CjD,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAkB,aAAC,EACzC,QACC+C,EAAA,CAAI,MAAOvD,EAAE,oCAAoC,EAC/C,WACCQ,MAAC,OAAA,CAAK,UAAU,gCAAiC,WAAmB,EAClEA,EAAAA,IAAC,QAAK,UAAU,kBAAkB,aAAC,CAAA,CACzC,EACAA,EAAAA,IAAC+C,EAAA,CAAI,MAAOvD,EAAE,8BAA8B,EACzC,SAAA2C,EAAO,OAAO,YACbnC,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,SAAAmC,EAAO,OAAO,UAAA,CAAW,EAEhEnC,EAAAA,IAAC,OAAA,CAAK,UAAU,eAAgB,SAAAR,EAAE,qCAAqC,CAAA,CAAE,CAAA,CAE7E,EACC2C,EAAO,OAAO,WACbnC,EAAAA,IAAC+C,EAAA,CAAI,MAAOvD,EAAE,iCAAiC,EAC7C,SAAAQ,EAAAA,IAAC,QAAK,UAAU,0BAA2B,SAAAmC,EAAO,OAAO,UAAU,CAAA,CACrE,CAAA,EAEJ,EAEAnC,MAAC,IAAA,CAAE,UAAU,wBAAyB,SAAAR,EAAE,qCAAqC,CAAA,CAAE,CAAA,EAEnF,QAID,KAAA,CAAG,UAAU,+FACX,SAAAA,EAAE,kCAAkC,EACvC,EACAO,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAC,EAAAA,IAACuC,EAAA,CAAM,MAAO/C,EAAE,6BAA6B,EAAG,KAAMA,EAAE,iCAAiC,EACvF,SAAAQ,EAAAA,IAACkD,EAAA,CAAY,MAAOlC,EAAM,MAAO,SAAWd,GAAMwB,EAAS,QAASxB,CAAC,EAAG,IAAK,IAAK,IAAK,IAAO,YAAY,KAAA,CAAM,CAAA,CAClH,EACAF,EAAAA,IAACuC,EAAA,CAAM,MAAO/C,EAAE,6BAA6B,EAAG,KAAMA,EAAE,iCAAiC,EACvF,SAAAQ,EAAAA,IAACkD,EAAA,CAAY,MAAOlC,EAAM,MAAO,SAAWd,GAAMwB,EAAS,QAASxB,CAAC,EAAG,IAAK,EAAG,IAAK,IAAK,YAAY,IAAA,CAAK,CAAA,CAC7G,EACAF,EAAAA,IAACuC,EAAA,CAAM,MAAO/C,EAAE,iCAAiC,EAAG,KAAMA,EAAE,qCAAqC,EAC/F,SAAAQ,EAAAA,IAACkD,EAAA,CAAY,MAAOlC,EAAM,UAAW,SAAWd,GAAMwB,EAAS,YAAaxB,CAAC,EAAG,IAAK,EAAG,IAAK,IAAK,YAAY,IAAA,CAAK,CAAA,CACrH,EACAF,EAAAA,IAACuC,EAAA,CAAM,MAAO/C,EAAE,iCAAiC,EAAG,KAAMA,EAAE,qCAAqC,EAC/F,SAAAQ,EAAAA,IAACkD,EAAA,CAAY,MAAOlC,EAAM,UAAW,SAAWd,GAAMwB,EAAS,YAAaxB,CAAC,EAAG,IAAK,IAAK,IAAK,IAAS,YAAY,OAAA,CAAQ,CAAA,CAC9H,CAAA,EACF,EAGCuB,GACC1B,EAAAA,KAAC,MAAA,CAAI,UAAU,2DACb,SAAA,CAAAC,MAACqC,EAAA,CAAM,QAAQ,OAAQ,SAAA7C,EAAE,0BAA0B,EAAE,EACrDO,EAAAA,KAACE,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,UACV,QAASiC,EACT,SAAUtB,EAAU,UAEpB,SAAA,CAAAZ,EAAAA,IAACmD,EAAA,CAAE,UAAU,SAAA,CAAU,EACtB3D,EAAE,wBAAwB,CAAA,CAAA,CAAA,EAE7BO,EAAAA,KAACE,EAAA,CACC,KAAK,KACL,QAAS,IAAM,KAAK4B,EAAA,EACpB,SAAUjB,EAAU,UAEnB,SAAA,CAAAA,EAAU,gBACNP,EAAA,CAAQ,UAAU,uBAAuB,EAC1CL,EAAAA,IAACoD,EAAA,CAAK,UAAU,SAAA,CAAU,EAC7BxC,EAAU,UAAYpB,EAAE,uBAAuB,EAAIA,EAAE,qBAAqB,CAAA,CAAA,CAAA,CAC7E,CAAA,CACF,CAAA,EAEJ,CAEJ,CAIA,SAAS6D,EAASC,EAAoB,CACpC,MAAO,SAAS,KAAKA,CAAC,CACxB,CAEA,SAAS7C,GAAU,CAAE,IAAAE,GAAqD,CACxE,KAAM,CAAE,EAAAnB,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7CmB,EAAYC,EAAA,EAEZ0C,EAAY5C,EAAI,oBAAsB,GACtC,CAAC6C,EAASC,CAAU,EAAI7D,EAAAA,SAAS2D,CAAS,EAC1C,CAACrC,EAAYC,CAAa,EAAIvB,EAAAA,SAAS,EAAE,EAE/CwB,EAAAA,UAAU,IAAM,CACVmC,IAAcrC,IAChBuC,EAAWF,CAAS,EACpBpC,EAAcoC,CAAS,EAE3B,EAAG,CAACA,EAAWrC,CAAU,CAAC,EAE1B,MAAMwC,EAAe,CAAC,CAACH,EAGjB9B,EAAU+B,IAAYD,GAAa,EAAEF,EAASG,CAAO,GAAKA,IAAYD,GACtEI,EAAaH,EAAQ,OAAS,GAAK,CAACH,EAASG,CAAO,GAAKA,EAAQ,SAAW,GAElF,eAAe3B,GAAwB,CACrC,GAAKJ,GACD,CAAA4B,EAASG,CAAO,EACpB,GAAI,CACF,MAAM5C,EAAU,YAAY,CAC1B,QAAS,CAAE,mBAAoB4C,EAAQ,KAAA,GAAU,IAAA,CAAK,CACvD,EACDzB,EAAM,QAAQvC,EAAE,kCAAkC,CAAC,CACrD,OAASwC,EAAK,CACZD,EAAM,MAAME,EAAcD,EAAKxC,CAAC,EAAE,OAAO,CAC3C,CACF,CAEA,eAAeoE,GAAyB,CACtC,GAAI,CACF,MAAMhD,EAAU,YAAY,CAAE,QAAS,CAAE,mBAAoB,IAAA,EAAQ,EACrE6C,EAAW,EAAE,EACb1B,EAAM,QAAQvC,EAAE,oCAAoC,CAAC,CACvD,OAASwC,EAAK,CACZD,EAAM,MAAME,EAAcD,EAAKxC,CAAC,EAAE,OAAO,CAC3C,CACF,CAEA,OACEO,EAAAA,KAAC,UAAA,CAAQ,UAAU,6CACjB,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,2DAChB,SAAA,CAAAC,EAAAA,IAAC6D,EAAA,CAAO,UAAU,uBAAA,CAAwB,QACzC,KAAA,CAAG,UAAU,wBAAyB,SAAArE,EAAE,4BAA4B,EAAE,EACtEkE,EACG1D,EAAAA,IAACqC,EAAA,CAAM,QAAQ,UAAW,SAAA7C,EAAE,iCAAiC,CAAA,CAAE,QAC9D6C,EAAA,CAAM,QAAQ,UAAW,SAAA7C,EAAE,4BAA4B,CAAA,CAAE,CAAA,EAChE,QACC,IAAA,CAAE,UAAU,kCAAmC,SAAAA,EAAE,+BAA+B,EAAE,EAEnFO,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAC,MAAC8D,EAAA,CAAM,QAAQ,WAAW,UAAU,sBAAsB,SAAA,qBAAkB,EAC5E9D,EAAAA,IAACwC,EAAA,CACC,GAAG,WACH,MAAOgB,EACP,SAAWlB,GAAMmB,EAAWnB,EAAE,OAAO,KAAK,EAC1C,YAAa9C,EAAE,kCAAkC,EACjD,aAAa,MACb,UAAWuE,EAAG,yBAA0BV,EAASG,CAAO,GAAK,iBAAiB,CAAA,CAAA,EAE/EG,GACC3D,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAAR,EAAE,kCAAmC,CAAE,OAAQgE,EAAQ,MAAA,CAAQ,CAAA,CAClE,QAED,IAAA,CAAE,UAAU,iCAAkC,SAAAhE,EAAE,2BAA2B,CAAA,CAAE,CAAA,EAChF,EAEAO,EAAAA,KAAC,MAAA,CAAI,UAAU,2DACb,SAAA,CAAAA,EAAAA,KAACE,EAAA,CACC,QAAQ,QACR,KAAK,KACL,QAAS,IAAM,KAAK2D,EAAA,EACpB,SAAU,CAACF,GAAgB9C,EAAU,UACrC,UAAU,gCAEV,SAAA,CAAAZ,EAAAA,IAACmD,EAAA,CAAE,UAAU,SAAA,CAAU,EACtB3D,EAAE,4BAA4B,CAAA,CAAA,CAAA,EAEjCQ,EAAAA,IAAC,OAAA,CAAK,UAAU,SAAA,CAAU,EACzByB,GACC1B,EAAAA,KAACE,EAAA,CACC,KAAK,KACL,QAAS,IAAM,KAAK4B,EAAA,EACpB,SAAUjB,EAAU,WAAayC,EAASG,CAAO,EAEhD,SAAA,CAAA5C,EAAU,gBACNP,EAAA,CAAQ,UAAU,uBAAuB,EAC1CL,EAAAA,IAACoD,EAAA,CAAK,UAAU,SAAA,CAAU,EAC7BxC,EAAU,UAAYpB,EAAE,uBAAuB,EAAIA,EAAE,qBAAqB,CAAA,CAAA,CAAA,CAC7E,CAAA,CAEJ,CAAA,EACF,CAEJ,CAUA,SAAS+C,EAAM,CAAE,MAAAyB,EAAO,KAAAC,EAAM,SAAAC,GAAqC,CACjE,OACEnE,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAC,EAAAA,IAAC8D,EAAA,CAAM,UAAU,sBAAuB,SAAAE,EAAM,EAC7CE,EACAD,GAAQjE,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAA6B,SAAAiE,CAAA,CAAK,CAAA,EAC1D,CAEJ,CAOA,SAASlB,EAAI,CAAE,MAAAiB,EAAO,SAAAE,GAAmC,CACvD,OACEnE,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,qCAAsC,SAAA,CAAAiE,EAAM,GAAA,EAAC,EAC7DhE,EAAAA,IAAC,OAAA,CAAK,UAAU,iBAAkB,SAAAkE,CAAA,CAAS,CAAA,EAC7C,CAEJ,CAUA,SAAShB,EAAY,CAAE,MAAAiB,EAAO,SAAAC,EAAU,IAAAC,EAAK,IAAAC,EAAK,YAAAC,GAA8C,CAC9F,OACEvE,EAAAA,IAACwC,EAAA,CACC,KAAK,SACL,UAAU,UACV,IAAA6B,EACA,IAAAC,EACA,MAAAH,EACA,SAAW7B,GAAM8B,EAAS9B,EAAE,OAAO,KAAK,EACxC,YAAAiC,CAAA,CAAA,CAGN","x_google_ignoreList":[0,1]}
|