@xopcai/xopc 0.0.266 → 0.0.268

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/browser-ext/dist/assets/{auth-CknJ00ae.js → auth-cwEj8rFb.js} +735 -224
  2. package/dist/browser-ext/dist/assets/sidepanel-C86O7q5Y.css +299 -0
  3. package/dist/browser-ext/dist/background.js +699 -170
  4. package/dist/browser-ext/dist/sidepanel.html +3 -3
  5. package/dist/browser-ext/dist/sidepanel.js +9608 -777
  6. package/dist/browser-ext/manifest.json +3 -6
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Qrp5ALCF.js → agent-avatar-dicebear-B9WObxjr.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-DwinST48.js → agent-defaults-settings-panel-J1YFNG26.js} +1 -1
  10. package/dist/gateway/static/root/assets/{agents-Dlr0YyNt.js → agents-BJuTIRPD.js} +1 -1
  11. package/dist/gateway/static/root/assets/{app-management-settings-panel-bLNvz93c.js → app-management-settings-panel-Bbn9mDfL.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-D5qgIepF.js → appearance-settings-Deo5EsIc.js} +1 -1
  13. package/dist/gateway/static/root/assets/{apps-page-BQVlXhIb.js → apps-page-Cz4d7ErX.js} +1 -1
  14. package/dist/gateway/static/root/assets/{archive-plugin-BEA7VAA4.js → archive-plugin-CxJTU8MU.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-B1RyF3uu.js → attachment-load-C71Cukgp.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automations-page-BfH0FdKa.js → automations-page-_J7UZ55Q.js} +1 -1
  17. package/dist/gateway/static/root/assets/{automations-workspace-C37AlD3E.js → automations-workspace-Bn8nwUOL.js} +1 -1
  18. package/dist/gateway/static/root/assets/{binary-plugins-EU884ZXi.js → binary-plugins-CX8fC8Zt.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-Bjr3naHb.js → block-editor-Ci9fjoQL.js} +1 -1
  20. package/dist/gateway/static/root/assets/{browser-automations-page-CDrYrNGy.js → browser-automations-page-rDSx0ozx.js} +1 -1
  21. package/dist/gateway/static/root/assets/browser-settings-page-B9RA6x4x.js +8 -0
  22. package/dist/gateway/static/root/assets/{capabilities-settings-panel-slt1o04n.js → capabilities-settings-panel-C1GUih8m.js} +1 -1
  23. package/dist/gateway/static/root/assets/{channels-settings-oHTTX6Jy.js → channels-settings-CEhVLJNa.js} +1 -1
  24. package/dist/gateway/static/root/assets/{chat-terminal-dock-DEYQdv6n.js → chat-terminal-dock-DMSl8KxS.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connectors-page-olrbxHIT.js → connectors-page-IQAQDSmO.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-expression-DFrbDWpP.js → cron-expression-BByq6Uh8.js} +1 -1
  27. package/dist/gateway/static/root/assets/{date-picker-CYriYKpH.js → date-picker-m6JZCUEW.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dependency-picker-XY3qUErs.js → dependency-picker-CwCAjbaJ.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-Dsc__ynA.js → desktop-pet-DSmeEREd.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-EpuX3C08.js → desktop-pet-settings-MfKceMoe.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-debug-page-B_NeLV4K.js → extension-debug-page-CwvWy26h.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-page-D3JC6mLB.js → extension-page-DLrbVBHM.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-CXTQt1lp.js → extension-settings-page-BI6C4PM-.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-settings-yeYm_UPE.js → gateway-settings-B3H7Vfbh.js} +1 -1
  35. package/dist/gateway/static/root/assets/{heartbeat-settings-coh1LFsg.js → heartbeat-settings-CUl832Tb.js} +1 -1
  36. package/dist/gateway/static/root/assets/{home-page-CAgoBZqp.js → home-page-CT4JL2jm.js} +1 -1
  37. package/dist/gateway/static/root/assets/{index-Cn__9Un2.js → index-wKE8Q2FX.js} +7 -7
  38. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Cu1bI3Bg.js → keyboard-shortcuts-settings-r4DCS19O.js} +1 -1
  39. package/dist/gateway/static/root/assets/{local-app-workbench-page-C9s2lFaI.js → local-app-workbench-page-qwLuir8A.js} +1 -1
  40. package/dist/gateway/static/root/assets/{local-apps-page-CJ03Umjr.js → local-apps-page-DkfCRLUh.js} +1 -1
  41. package/dist/gateway/static/root/assets/{logs-page-CY_DQKJ2.js → logs-page-DrNaaPWc.js} +1 -1
  42. package/dist/gateway/static/root/assets/{management-settings-YPEemeMo.js → management-settings-Cfx4ATTa.js} +1 -1
  43. package/dist/gateway/static/root/assets/{media-plugins-BjT6jlrA.js → media-plugins-DOLjWd3y.js} +1 -1
  44. package/dist/gateway/static/root/assets/{mobile-pairing-wizard-A8eLtV6v.js → mobile-pairing-wizard-BGW9joAb.js} +1 -1
  45. package/dist/gateway/static/root/assets/{note-detail-panel-DHT2QksJ.js → note-detail-panel-Dbj5OvXE.js} +3 -3
  46. package/dist/gateway/static/root/assets/{notes-page-BRFQiivM.js → notes-page-5hRB3WXc.js} +1 -1
  47. package/dist/gateway/static/root/assets/{page-tabs-DNUwulnl.js → page-tabs-_SGXMT2O.js} +1 -1
  48. package/dist/gateway/static/root/assets/{preview-open-alternatives-B33KsKkJ.js → preview-open-alternatives-lVetfCWk.js} +1 -1
  49. package/dist/gateway/static/root/assets/{project-detail-page-CItEFVt9.js → project-detail-page-CblWLA8k.js} +1 -1
  50. package/dist/gateway/static/root/assets/{projects-page-Bmy-c_lL.js → projects-page-CGk-kzqs.js} +1 -1
  51. package/dist/gateway/static/root/assets/{remote-access-hub-H6B1cA2V.js → remote-access-hub-Du8PweyU.js} +1 -1
  52. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BsCovC39.js → runtime-tools-settings-panel-BDqVrUEj.js} +1 -1
  53. package/dist/gateway/static/root/assets/{schema-form-NsPb_Vam.js → schema-form-8RQgFJJO.js} +1 -1
  54. package/dist/gateway/static/root/assets/{sessions-page-CyYLSXk_.js → sessions-page-BFm94dJC.js} +1 -1
  55. package/dist/gateway/static/root/assets/settings-advanced-gate-C0H-cToA.js +1 -0
  56. package/dist/gateway/static/root/assets/{settings-form-section-BzPIPe1-.js → settings-form-section-j4UjGM-f.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-page-4idpMhsw.js → settings-page-lMi50B_s.js} +1 -1
  58. package/dist/gateway/static/root/assets/{setup-status-panel-D2ds_TTD.js → setup-status-panel-Dx4Fy3rU.js} +1 -1
  59. package/dist/gateway/static/root/assets/{share-preview-page-Djo3VTaC.js → share-preview-page-aSyKRH5y.js} +1 -1
  60. package/dist/gateway/static/root/assets/{shares-settings-fhRzNfRp.js → shares-settings-CqF9s0pl.js} +1 -1
  61. package/dist/gateway/static/root/assets/{skill-reload-api-Ct8tUju_.js → skill-reload-api-BBL_ZUSC.js} +1 -1
  62. package/dist/gateway/static/root/assets/{skills-page-riM7FytZ.js → skills-page-C2_CAvxW.js} +1 -1
  63. package/dist/gateway/static/root/assets/{skills-page.utils-B3G8LBb-.js → skills-page.utils-B00e4Q30.js} +1 -1
  64. package/dist/gateway/static/root/assets/{system-settings-panel-CW91jjnB.js → system-settings-panel-CulAkrsV.js} +1 -1
  65. package/dist/gateway/static/root/assets/{task-detail-page-BBXKvl0k.js → task-detail-page-D1FmRFIn.js} +1 -1
  66. package/dist/gateway/static/root/assets/{tunnel-api-DILER0Yb.js → tunnel-api-C01xgCWR.js} +1 -1
  67. package/dist/gateway/static/root/assets/{use-autosave-GxnP8vLO.js → use-autosave-DfSJ3c2p.js} +1 -1
  68. package/dist/gateway/static/root/assets/{user-model-page-I1H4XRfA.js → user-model-page-BGC_5baJ.js} +1 -1
  69. package/dist/gateway/static/root/assets/{voice-api-key-field-CI3sXyl4.js → voice-api-key-field-9v-miN8o.js} +1 -1
  70. package/dist/gateway/static/root/assets/{work-discovery-overlay-DZC9Exn3.js → work-discovery-overlay-CREYgh-1.js} +1 -1
  71. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CaBaQER2.js → workflow-run-setup-panel-BfCWdw8F.js} +1 -1
  72. package/dist/gateway/static/root/assets/{workflows-page-C-_Dxihw.js → workflows-page-CvmKQkD0.js} +1 -1
  73. package/dist/gateway/static/root/index.html +1 -1
  74. package/dist/package.js +1 -1
  75. package/dist/packages/browser-control-contract/src/index.js +30 -1
  76. package/dist/src/agent/agent-manager.js +4 -4
  77. package/dist/src/agent/background-review/run-background-review.js +1 -1
  78. package/dist/src/agent/embedded/model-runtime.js +1 -1
  79. package/dist/src/agent/embedded/run-for-session.js +1 -1
  80. package/dist/src/agent/external-tools/endpoint-provider.js +3 -1
  81. package/dist/src/agent/image/tool-model-config.js +1 -1
  82. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  83. package/dist/src/agent/service.js +2 -2
  84. package/dist/src/agent/session/session-inspector.js +1 -1
  85. package/dist/src/agent/skills/hub-lock.js +1 -1
  86. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  87. package/dist/src/agent/tools/factory.js +1 -1
  88. package/dist/src/ai-assist/text-assist.js +1 -1
  89. package/dist/src/auth/credentials.js +2 -2
  90. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  91. package/dist/src/auth/profiles/store.js +1 -1
  92. package/dist/src/auth/sync-provider-auth.js +2 -2
  93. package/dist/src/browser/automations/runtime-service.d.ts +2 -0
  94. package/dist/src/browser/automations/runtime-service.js +1 -1
  95. package/dist/src/browser/drivers/create-driver.d.ts +2 -1
  96. package/dist/src/browser/drivers/create-driver.js +4 -6
  97. package/dist/src/browser/drivers/extension-driver.d.ts +7 -2
  98. package/dist/src/browser/enrollment.d.ts +8 -0
  99. package/dist/src/browser/enrollment.js +25 -0
  100. package/dist/src/browser/extension-identity.d.ts +2 -0
  101. package/dist/src/browser/extension-identity.js +5 -0
  102. package/dist/src/browser/native-messaging-host.d.ts +6 -3
  103. package/dist/src/browser/native-messaging-host.js +23 -5
  104. package/dist/src/browser/providers/browser-ext-install.d.ts +4 -1
  105. package/dist/src/browser/providers/browser-ext-install.js +47 -8
  106. package/dist/src/browser/providers/extension.js +1 -1
  107. package/dist/src/browser/providers/realtime-extension.d.ts +29 -0
  108. package/dist/src/browser/providers/realtime-extension.js +83 -0
  109. package/dist/src/browser/runtime/browser-runtime.js +3 -2
  110. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  111. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  112. package/dist/src/cli/commands/models.js +1 -1
  113. package/dist/src/config/index.js +4 -4
  114. package/dist/src/config/loader.js +2 -2
  115. package/dist/src/config/models-json.js +1 -1
  116. package/dist/src/endpoint-tools/policy.js +10 -3
  117. package/dist/src/extensions/lockfile.js +1 -1
  118. package/dist/src/gateway/agents-admin.js +1 -1
  119. package/dist/src/gateway/file-path-classifier.js +1 -1
  120. package/dist/src/gateway/heartbeat/service.js +1 -1
  121. package/dist/src/gateway/hono/app.js +6 -1
  122. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  123. package/dist/src/gateway/hono/routes/browser.js +20 -30
  124. package/dist/src/gateway/hono/routes/models.js +1 -1
  125. package/dist/src/gateway/security/origin-check.js +5 -0
  126. package/dist/src/gateway/service/config-coordinator.d.ts +0 -2
  127. package/dist/src/gateway/service/config-coordinator.js +1 -3
  128. package/dist/src/gateway/service.d.ts +0 -11
  129. package/dist/src/gateway/service.js +11 -89
  130. package/dist/src/heartbeat/index.js +1 -1
  131. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  132. package/dist/src/providers/index.js +2 -2
  133. package/dist/src/providers/model-registry.js +1 -1
  134. package/dist/src/providers/register-runtime-providers.js +1 -1
  135. package/dist/src/storage/sqlite/device-pairing-approval.js +24 -3
  136. package/dist/src/storage/sqlite/device-pairing-repository.d.ts +10 -1
  137. package/dist/src/storage/sqlite/device-pairing-repository.js +6 -5
  138. package/dist/src/storage/sqlite/migrations/157_browser_endpoint_principals.sql +50 -0
  139. package/dist/src/storage/sqlite/migrations/158_browser_native_enrollment.sql +4 -0
  140. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  141. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  142. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  143. package/dist/src/storage/sqlite/schema.js +1 -1
  144. package/dist/src/tui/tui-startup-resources.js +1 -1
  145. package/dist/src/tui/tui.js +1 -1
  146. package/dist/src/work-discovery/service.js +1 -1
  147. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  148. package/package.json +3 -3
  149. package/dist/browser-ext/dist/assets/sidepanel-C69P3v9u.css +0 -113
  150. package/dist/gateway/static/root/assets/browser-settings-page-DOmUkj2k.js +0 -8
  151. package/dist/gateway/static/root/assets/settings-advanced-gate-3T4rPk4A.js +0 -1
@@ -0,0 +1,299 @@
1
+ :root {
2
+ color-scheme: light dark;
3
+ font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", system-ui, "Segoe UI", Roboto, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Microsoft YaHei", sans-serif;
4
+
5
+ /* Keep the extension aligned with the Gateway's default Calm Intelligence theme. */
6
+ --surface-base: #f7f8fa;
7
+ --surface-panel: #ffffff;
8
+ --surface-hover: #e8ecf1;
9
+ --surface-active: #dfe5ec;
10
+ --fg: #111111;
11
+ --fg-muted: #666666;
12
+ --fg-subtle: #999999;
13
+ --fg-disabled: #b8b8b8;
14
+ --edge-subtle: #f2f2f2;
15
+ --edge: #ececec;
16
+ --edge-strong: #d8dce8;
17
+ --accent: #3a6bff;
18
+ --accent-hover: #315ce6;
19
+ --accent-soft: #eef3ff;
20
+ --accent-fg: #2f5ef6;
21
+ --success: #2ccb7f;
22
+ --success-soft: #e7fbf1;
23
+ --danger: #ff5d5d;
24
+ --danger-soft: #fff0f0;
25
+ --warning: #ffb84d;
26
+ --warning-soft: #fff7e8;
27
+ --shadow-surface: 0 1px 2px rgb(17 17 17 / 4%), 0 6px 18px rgb(17 17 17 / 4%);
28
+ --shadow-popover: 0 10px 32px rgb(17 17 17 / 10%), 0 2px 10px rgb(17 17 17 / 6%);
29
+
30
+ background: var(--surface-base);
31
+ color: var(--fg);
32
+ }
33
+
34
+ :root[data-theme='dark'] {
35
+ --surface-base: #14171c;
36
+ --surface-panel: #1b1f26;
37
+ --surface-hover: #242933;
38
+ --surface-active: #2e3440;
39
+ --fg: #f4f6f8;
40
+ --fg-muted: #b8bec8;
41
+ --fg-subtle: #87909d;
42
+ --fg-disabled: #626b78;
43
+ --edge-subtle: #252932;
44
+ --edge: #323844;
45
+ --edge-strong: #465061;
46
+ --accent: #3a6bff;
47
+ --accent-hover: #6f91ff;
48
+ --accent-soft: rgb(58 107 255 / 0.2);
49
+ --accent-fg: #adc0ff;
50
+ --success: #2ccb7f;
51
+ --success-soft: rgb(44 203 127 / 0.16);
52
+ --danger: #ff5d5d;
53
+ --danger-soft: rgb(255 93 93 / 0.16);
54
+ --warning: #ffb84d;
55
+ --warning-soft: rgb(255 184 77 / 0.16);
56
+ --shadow-surface: 0 0 0 1px rgb(255 255 255 / 4.5%);
57
+ --shadow-popover: 0 18px 54px rgb(0 0 0 / 38%), 0 0 0 1px rgb(255 255 255 / 5%);
58
+ }
59
+
60
+ * { box-sizing: border-box; }
61
+ html, body, #root { height: 100%; margin: 0; }
62
+ html { background: var(--surface-base); color: var(--fg); -webkit-font-smoothing: antialiased; }
63
+ body { overflow: hidden; font-size: 14px; }
64
+ button, input, textarea, select { font: inherit; }
65
+ button { cursor: pointer; color: inherit; }
66
+ button:disabled { cursor: default; }
67
+ button:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
68
+ input::placeholder, textarea::placeholder { color: var(--fg-disabled); }
69
+ svg { display: block; }
70
+
71
+ .shell { height: 100%; min-width: 300px; display: flex; flex-direction: column; background: var(--surface-base); }
72
+ .header { height: 48px; flex: 0 0 48px; padding: 0 14px; display: flex; align-items: center; gap: 10px; border-bottom: 1px solid var(--edge); background: color-mix(in srgb, var(--surface-panel) 92%, transparent); }
73
+ .brand { display: flex; align-items: center; gap: 8px; flex: 1; font-size: 15px; font-weight: 700; letter-spacing: -.01em; }
74
+ .brand-mark { width: 25px; height: 25px; display: grid; place-items: center; border: 1px solid var(--edge); border-radius: 8px; background: var(--surface-panel); color: var(--accent); box-shadow: 0 1px 2px rgb(17 17 17 / 5%); }
75
+ .brand-mark svg { width: 15px; height: 15px; stroke-width: 1.7; }
76
+ .status { margin-right: 76px; display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--fg-muted); }
77
+ .status-dot, .mini-status { width: 7px; height: 7px; flex: 0 0 auto; border-radius: 999px; background: var(--fg-disabled); }
78
+ .status-dot.online, .mini-status.online { background: var(--success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--success) 12%, transparent); }
79
+ .status-dot.error { background: var(--danger); }
80
+ .disconnect-link { position: absolute; z-index: 3; top: 13px; right: 13px; border: 0; border-radius: 6px; padding: 3px 7px; background: transparent; color: var(--fg-muted); font-size: 11px; }
81
+ .disconnect-link:hover { background: var(--surface-hover); color: var(--fg); }
82
+
83
+ .center { flex: 1; display: grid; place-items: center; padding: 24px; overflow: auto; }
84
+ .card { width: min(100%, 420px); border: 1px solid var(--edge); border-radius: 16px; padding: 22px; background: var(--surface-panel); box-shadow: var(--shadow-surface); }
85
+ .card h1 { margin: 0 0 8px; font-size: 20px; letter-spacing: -.02em; }
86
+ .muted { color: var(--fg-muted); line-height: 1.55; font-size: 13px; }
87
+ .field { display: grid; gap: 6px; margin-top: 14px; font-size: 13px; }
88
+ .field input, .field textarea { width: 100%; border: 1px solid var(--edge-strong); border-radius: 9px; padding: 10px 12px; background: var(--surface-panel); color: var(--fg); }
89
+ .primary { border: 0; border-radius: 9px; background: var(--accent); color: #fff; padding: 10px 14px; font-weight: 600; transition: background-color 150ms ease; }
90
+ .primary:hover:not(:disabled) { background: var(--accent-hover); }
91
+ .primary:disabled { background: var(--surface-active); color: var(--fg-disabled); }
92
+ .secondary { border: 1px solid var(--edge-strong); border-radius: 9px; background: var(--surface-panel); padding: 8px 12px; }
93
+ .secondary:hover { background: var(--surface-hover); }
94
+ .actions { display: flex; gap: 8px; margin-top: 16px; }
95
+ .local-connect { width: 100%; margin-top: 12px; }
96
+ .pairing-divider { display: flex; align-items: center; gap: 8px; margin-top: 16px; color: var(--fg-subtle); font-size: 11px; }
97
+ .pairing-divider::before, .pairing-divider::after { content: ""; height: 1px; flex: 1; background: var(--edge); }
98
+ .error-text { color: var(--danger); font-size: 13px; margin-top: 10px; }
99
+ .approval-code { font: 700 28px ui-monospace, "SF Mono", monospace; letter-spacing: 5px; margin: 18px 0; color: var(--accent-fg); }
100
+
101
+ .chat { min-height: 0; flex: 1; display: flex; flex-direction: column; position: relative; background: var(--surface-base); }
102
+ .chat-toolbar { min-height: 54px; flex: 0 0 54px; border-bottom: 1px solid var(--edge); display: flex; align-items: center; padding: 6px 12px; gap: 8px; background: var(--surface-panel); }
103
+ .session-trigger { min-width: 0; flex: 1; display: flex; align-items: center; gap: 7px; border: 0; border-radius: 9px; padding: 5px 7px; background: transparent; text-align: left; }
104
+ .session-trigger:hover { background: var(--surface-hover); }
105
+ .session-trigger-copy { min-width: 0; flex: 1; display: grid; gap: 1px; }
106
+ .session-title { overflow: hidden; color: var(--fg); font-size: 13px; font-weight: 650; white-space: nowrap; text-overflow: ellipsis; }
107
+ .session-status { display: flex; align-items: center; gap: 5px; color: var(--fg-subtle); font-size: 10px; }
108
+ .icon-sm { width: 15px; height: 15px; color: var(--fg-muted); }
109
+ .icon-button, .composer-icon-button { width: 34px; height: 34px; flex: 0 0 auto; display: grid; place-items: center; border: 1px solid var(--edge); border-radius: 9px; background: var(--surface-panel); transition: background-color 120ms ease, border-color 120ms ease; }
110
+ .icon-button svg, .composer-icon-button svg { width: 17px; height: 17px; }
111
+ .icon-button:hover, .composer-icon-button:hover, .composer-icon-button.active { border-color: var(--edge-strong); background: var(--surface-hover); }
112
+
113
+ .session-menu { position: absolute; z-index: 10; top: 8px; left: 10px; right: 10px; max-height: min(68vh, 520px); overflow: hidden; border: 1px solid var(--edge-strong); border-radius: 14px; background: var(--surface-panel); padding: 8px; box-shadow: var(--shadow-popover); }
114
+ .session-menu-header { height: 34px; display: flex; align-items: center; justify-content: space-between; padding: 0 5px 0 8px; font-size: 13px; }
115
+ .session-menu-header button { width: 27px; height: 27px; display: grid; place-items: center; border: 0; border-radius: 7px; background: transparent; color: var(--fg-muted); }
116
+ .session-menu-header button:hover { background: var(--surface-hover); }
117
+ .session-menu-header svg { width: 15px; height: 15px; }
118
+ .session-search { height: 36px; display: flex; align-items: center; gap: 7px; margin: 3px 2px 6px; border: 1px solid var(--edge); border-radius: 9px; padding: 0 10px; background: var(--surface-base); color: var(--fg-subtle); }
119
+ .session-search svg { width: 15px; height: 15px; }
120
+ .session-search input { min-width: 0; flex: 1; border: 0; outline: none; background: transparent; color: var(--fg); font-size: 12px; }
121
+ .session-list { overflow-y: auto; max-height: calc(min(68vh, 520px) - 95px); }
122
+ .session-list button { width: 100%; min-height: 48px; display: flex; align-items: center; gap: 8px; border: 0; border-radius: 9px; padding: 7px 9px; background: transparent; text-align: left; }
123
+ .session-list button:hover, .session-list button.active { background: var(--surface-hover); }
124
+ .session-list button:disabled { opacity: .55; }
125
+ .session-list button > svg { width: 15px; height: 15px; flex: 0 0 auto; color: var(--accent); }
126
+ .session-list-copy { min-width: 0; flex: 1; display: grid; gap: 3px; }
127
+ .session-list-copy span { overflow: hidden; font-size: 12px; font-weight: 550; white-space: nowrap; text-overflow: ellipsis; }
128
+ .session-list-copy small { color: var(--fg-subtle); font-size: 10px; }
129
+ .session-list-empty { padding: 24px 10px; color: var(--fg-subtle); font-size: 12px; text-align: center; }
130
+
131
+ .connection-banner { min-height: 38px; flex: 0 0 auto; display: flex; align-items: center; gap: 7px; border-bottom: 1px solid color-mix(in srgb, var(--danger) 18%, var(--edge)); padding: 7px 13px; background: var(--danger-soft); color: color-mix(in srgb, var(--danger) 78%, var(--fg)); font-size: 10px; line-height: 1.35; }
132
+ .connection-banner > svg { width: 14px; height: 14px; flex: 0 0 auto; }
133
+ .connection-banner > span { min-width: 0; flex: 1; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
134
+ .connection-banner button { flex: 0 0 auto; border: 1px solid color-mix(in srgb, var(--danger) 25%, var(--edge)); border-radius: 7px; padding: 4px 8px; background: var(--surface-panel); color: inherit; font-size: 10px; font-weight: 620; }
135
+ .connection-banner button:hover { background: var(--surface-hover); }
136
+ .messages-shell { min-height: 0; flex: 1; position: relative; display: flex; }
137
+ .messages { width: 100%; min-height: 0; flex: 1; overflow-y: auto; overscroll-behavior: contain; padding: 22px max(14px, calc((100% - 720px) / 2)) 20px; scrollbar-gutter: stable; }
138
+ .scroll-bottom-button { position: absolute; z-index: 4; right: 17px; bottom: 12px; width: 34px; height: 34px; display: grid; place-items: center; border: 1px solid var(--edge-strong); border-radius: 999px; background: color-mix(in srgb, var(--surface-panel) 94%, transparent); color: var(--fg-muted); box-shadow: var(--shadow-popover); backdrop-filter: blur(8px); }
139
+ .scroll-bottom-button:hover { background: var(--surface-hover); color: var(--fg); }
140
+ .scroll-bottom-button svg { width: 16px; height: 16px; }
141
+ .message-skeleton { width: min(100%, 720px); margin: 6px auto; display: grid; gap: 10px; }
142
+ .message-skeleton span { height: 12px; border-radius: 6px; background: linear-gradient(90deg, var(--surface-hover), var(--surface-active), var(--surface-hover)); background-size: 200% 100%; animation: skeleton 1.3s ease-in-out infinite; }
143
+ .message-skeleton span:nth-child(1) { width: 38%; }
144
+ .message-skeleton span:nth-child(2) { width: 92%; }
145
+ .message-skeleton span:nth-child(3) { width: 68%; }
146
+ .empty-chat { width: min(100%, 520px); min-height: 100%; margin: auto; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 24px 4px 48px; text-align: center; }
147
+ .empty-mark { width: 42px; height: 42px; display: grid; place-items: center; margin-bottom: 14px; border: 1px solid color-mix(in srgb, var(--accent) 20%, var(--edge)); border-radius: 13px; background: var(--accent-soft); color: var(--accent-fg); }
148
+ .empty-mark svg { width: 21px; height: 21px; }
149
+ .empty-chat h1 { margin: 0; font-size: 19px; font-weight: 680; letter-spacing: -.025em; }
150
+ .empty-chat > p { max-width: 390px; margin: 8px 0 20px; color: var(--fg-muted); font-size: 12px; line-height: 1.55; }
151
+ .quick-prompts { width: min(100%, 420px); display: grid; gap: 7px; }
152
+ .quick-prompts button { min-height: 42px; display: flex; align-items: center; gap: 10px; border: 1px solid var(--edge); border-radius: 11px; padding: 9px 12px; background: var(--surface-panel); color: var(--fg-muted); text-align: left; transition: border-color 120ms ease, background-color 120ms ease, transform 120ms ease; }
153
+ .quick-prompts button:hover { border-color: var(--edge-strong); background: var(--surface-hover); color: var(--fg); transform: translateY(-1px); }
154
+ .quick-prompts svg { width: 17px; height: 17px; color: var(--accent-fg); }
155
+ .quick-prompts span { font-size: 12px; font-weight: 550; }
156
+
157
+ .message { width: min(100%, 720px); margin: 0 auto 26px; color: var(--fg); }
158
+ .message-heading { min-height: 22px; display: flex; align-items: center; gap: 7px; margin-bottom: 5px; color: var(--fg-subtle); font-size: 10px; }
159
+ .message-author { color: var(--fg-muted); font-size: 11px; font-weight: 680; letter-spacing: .015em; }
160
+ .message-heading time { opacity: 0; transition: opacity 120ms ease; }
161
+ .message:hover .message-heading time { opacity: 1; }
162
+ .responding-label { display: inline-flex; align-items: center; gap: 4px; color: var(--accent-fg); }
163
+ .responding-label::before { content: ""; width: 5px; height: 5px; border-radius: 99px; background: var(--accent); animation: pulse 1.4s ease-in-out infinite; }
164
+ .message-body { min-width: 0; font-size: 14px; line-height: 1.65; overflow-wrap: anywhere; }
165
+ .message.user { width: min(88%, 620px); margin-right: max(0px, calc((100% - 720px) / 2)); }
166
+ .message.user .message-heading { justify-content: flex-end; padding-right: 4px; }
167
+ .message.user .message-body { border: 1px solid var(--edge); border-radius: 15px 15px 4px 15px; padding: 10px 13px; background: var(--surface-panel); box-shadow: 0 1px 2px rgb(17 17 17 / 3%); }
168
+ .message.system .message-body { border-left: 2px solid var(--edge-strong); padding-left: 11px; color: var(--fg-muted); font-size: 12px; }
169
+ .plain-message-content { white-space: pre-wrap; }
170
+ .message-sources { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 8px; }
171
+ .source-badge { min-width: 0; max-width: 100%; display: inline-flex; align-items: center; gap: 5px; border: 1px solid color-mix(in srgb, var(--accent) 25%, var(--edge)); border-radius: 999px; padding: 4px 8px; color: var(--accent-fg); background: var(--accent-soft); font-size: 10px; }
172
+ .source-badge svg { width: 12px; height: 12px; flex: 0 0 auto; }
173
+ .source-badge span { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
174
+ .message-attachments { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
175
+ .message-attachment { min-width: 0; max-width: 100%; display: flex; align-items: center; gap: 7px; border: 1px solid var(--edge); border-radius: 9px; padding: 6px 8px; background: var(--surface-base); color: var(--fg-muted); }
176
+ .message-attachment > svg { width: 15px; height: 15px; flex: 0 0 auto; color: var(--accent-fg); }
177
+ .message-attachment > span { min-width: 0; display: flex; align-items: baseline; gap: 6px; }
178
+ .message-attachment strong { max-width: min(280px, 58vw); overflow: hidden; font-size: 10px; font-weight: 620; white-space: nowrap; text-overflow: ellipsis; }
179
+ .message-attachment small { flex: 0 0 auto; color: var(--fg-subtle); font-size: 9px; }
180
+ .message-actions { height: 24px; display: flex; align-items: center; margin-top: 4px; opacity: 0; transition: opacity 120ms ease; }
181
+ .message:hover .message-actions, .message-actions:focus-within { opacity: 1; }
182
+ .message-actions button { display: inline-flex; align-items: center; gap: 4px; border: 0; border-radius: 6px; padding: 3px 6px; background: transparent; color: var(--fg-subtle); font-size: 10px; }
183
+ .message-actions button:hover { background: var(--surface-hover); color: var(--fg-muted); }
184
+ .message-actions svg { width: 13px; height: 13px; }
185
+
186
+ .markdown-content { min-width: 0; }
187
+ .markdown-content > div > :first-child { margin-top: 0; }
188
+ .markdown-content > div > :last-child { margin-bottom: 0; }
189
+ .markdown-content p { margin: 0 0 10px; }
190
+ .markdown-content h1, .markdown-content h2, .markdown-content h3, .markdown-content h4 { margin: 20px 0 8px; color: var(--fg); font-weight: 680; line-height: 1.3; letter-spacing: -.018em; }
191
+ .markdown-content h1 { font-size: 19px; }
192
+ .markdown-content h2 { font-size: 17px; }
193
+ .markdown-content h3 { font-size: 15px; }
194
+ .markdown-content h4 { font-size: 14px; }
195
+ .markdown-content ul, .markdown-content ol { margin: 8px 0 12px; padding-left: 22px; }
196
+ .markdown-content li { margin: 4px 0; padding-left: 2px; }
197
+ .markdown-content li::marker { color: var(--fg-subtle); }
198
+ .markdown-content strong { font-weight: 680; }
199
+ .markdown-content a { color: var(--accent-fg); text-decoration: none; }
200
+ .markdown-content a:hover { text-decoration: underline; text-underline-offset: 2px; }
201
+ .markdown-content blockquote { margin: 12px 0; border-left: 3px solid var(--edge-strong); padding: 2px 0 2px 12px; color: var(--fg-muted); }
202
+ .markdown-content code { border: 1px solid var(--edge); border-radius: 5px; padding: 1px 4px; background: var(--surface-hover); font: .88em ui-monospace, "SFMono-Regular", Consolas, monospace; }
203
+ .markdown-content pre { max-width: 100%; margin: 12px 0; overflow-x: auto; border: 1px solid var(--edge); border-radius: 10px; padding: 11px 12px; background: color-mix(in srgb, var(--surface-hover) 65%, var(--surface-panel)); font-size: 12px; line-height: 1.55; }
204
+ .markdown-content pre code { border: 0; padding: 0; background: transparent; font-size: inherit; }
205
+ .markdown-content table { width: 100%; display: block; margin: 12px 0; overflow-x: auto; border-collapse: collapse; font-size: 12px; }
206
+ .markdown-content th, .markdown-content td { border: 1px solid var(--edge); padding: 6px 8px; text-align: left; }
207
+ .markdown-content th { background: var(--surface-hover); font-weight: 650; }
208
+ .markdown-content hr { border: 0; border-top: 1px solid var(--edge); margin: 18px 0; }
209
+ .streaming-caret { display: inline-block; width: 6px; height: 14px; margin-left: 3px; vertical-align: -2px; border-radius: 2px; background: var(--accent); animation: blink 1s steps(1) infinite; }
210
+ @keyframes blink { 50% { opacity: 0; } }
211
+ @keyframes pulse { 50% { opacity: .35; transform: scale(.8); } }
212
+ @keyframes skeleton { to { background-position: -200% 0; } }
213
+
214
+ .composer { position: relative; flex: 0 0 auto; margin: 0 10px 10px; border: 1px solid var(--edge-strong); border-radius: 15px; background: var(--surface-panel); padding: 8px; box-shadow: var(--shadow-surface); transition: border-color 120ms ease, box-shadow 120ms ease; }
215
+ .composer:focus-within { border-color: color-mix(in srgb, var(--accent) 45%, var(--edge)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 7%, transparent), var(--shadow-surface); }
216
+ .composer.dragging { border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent), var(--shadow-surface); }
217
+ .file-drop-overlay { position: absolute; z-index: 20; inset: 0; display: flex; align-items: center; justify-content: center; gap: 7px; border-radius: 14px; background: color-mix(in srgb, var(--accent-soft) 94%, var(--surface-panel)); color: var(--accent-fg); font-size: 12px; font-weight: 650; pointer-events: none; }
218
+ .file-drop-overlay svg { width: 17px; height: 17px; }
219
+ .composer-input-row { min-height: 38px; display: flex; align-items: flex-end; gap: 7px; }
220
+ .composer textarea { min-width: 0; min-height: 34px; max-height: 144px; flex: 1; resize: none; overflow-y: auto; border: 0; padding: 7px 2px 6px; outline: none; background: transparent; color: var(--fg); font-size: 13px; line-height: 1.5; }
221
+ .composer-icon-button { width: 34px; height: 34px; border-color: transparent; color: var(--fg-muted); }
222
+ .tools-anchor { position: relative; flex: 0 0 auto; }
223
+ .tools-menu { position: absolute; z-index: 12; left: -1px; bottom: calc(100% + 9px); width: min(310px, calc(100vw - 38px)); overflow: hidden; border: 1px solid var(--edge-strong); border-radius: 13px; background: var(--surface-panel); padding: 6px; box-shadow: var(--shadow-popover); }
224
+ .tools-menu-section + .tools-menu-section { margin-top: 5px; border-top: 1px solid var(--edge); padding-top: 5px; }
225
+ .tools-menu-label { display: block; padding: 5px 8px 4px; color: var(--fg-subtle); font-size: 9px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
226
+ .tools-menu button { width: 100%; display: flex; align-items: center; gap: 10px; border: 0; border-radius: 8px; padding: 7px 8px; background: transparent; text-align: left; }
227
+ .tools-menu button:hover { background: var(--surface-hover); }
228
+ .tools-menu button > svg { width: 17px; height: 17px; flex: 0 0 auto; color: var(--fg-muted); }
229
+ .tools-menu button > span { min-width: 0; flex: 1; display: grid; gap: 1px; }
230
+ .tools-menu button strong { font-size: 11px; font-weight: 620; }
231
+ .tools-menu button small { overflow: hidden; color: var(--fg-subtle); font-size: 10px; white-space: nowrap; text-overflow: ellipsis; }
232
+ .tools-menu button.active-access { background: var(--success-soft); }
233
+ .tools-menu button.active-access > svg { color: var(--success); }
234
+ .tools-menu button.active-access > svg:last-child { width: 13px; height: 13px; color: var(--fg-subtle); }
235
+ .send-button { width: 34px; height: 34px; flex: 0 0 auto; display: grid; place-items: center; border: 0; border-radius: 10px; background: var(--accent); color: #fff; transition: background-color 120ms ease, transform 120ms ease; }
236
+ .send-button svg { width: 17px; height: 17px; }
237
+ .send-button:hover:not(:disabled) { background: var(--accent-hover); transform: translateY(-1px); }
238
+ .send-button:disabled { background: var(--surface-active); color: var(--fg-disabled); }
239
+ .stop-button { background: var(--fg); color: var(--surface-panel); }
240
+ .stop-button:hover:not(:disabled) { background: var(--fg-muted); }
241
+ .composer-footer { min-height: 25px; display: flex; align-items: center; gap: 8px; padding: 4px 3px 0 5px; }
242
+ .composer-state { min-width: 0; display: flex; align-items: center; gap: 5px; color: var(--fg-subtle); font-size: 9px; }
243
+ .access-pill { display: inline-flex; align-items: center; gap: 3px; border-radius: 999px; padding: 2px 5px; background: var(--success-soft); color: color-mix(in srgb, var(--success) 72%, var(--fg)); font-weight: 600; }
244
+ .access-pill svg { width: 10px; height: 10px; }
245
+ .model-controls { min-width: 0; margin-left: auto; display: flex; align-items: center; gap: 3px; }
246
+ .model-controls select { min-width: 0; max-width: 112px; border: 0; border-radius: 5px; padding: 2px 3px; outline: none; background: transparent; color: var(--fg-subtle); font-size: 9px; text-overflow: ellipsis; }
247
+ .model-controls select:hover { background: var(--surface-hover); color: var(--fg-muted); }
248
+ .model-controls select:last-child { max-width: 64px; }
249
+
250
+ .composer-contexts { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 6px; }
251
+ .context-chip, .attachment-chip { min-width: 0; max-width: 100%; display: flex; align-items: center; gap: 5px; border: 1px solid color-mix(in srgb, var(--accent) 24%, var(--edge)); border-radius: 8px; padding: 5px 6px; color: var(--accent-fg); background: var(--accent-soft); font-size: 10px; }
252
+ .attachment-chip { border-color: var(--edge); color: var(--fg-muted); background: var(--surface-base); }
253
+ .context-chip > svg, .attachment-chip > svg { width: 13px; height: 13px; flex: 0 0 auto; }
254
+ .context-chip > span, .attachment-chip > span { min-width: 0; max-width: 310px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
255
+ .context-chip strong, .attachment-chip strong { font-weight: 650; }
256
+ .context-chip button { border: 0; border-radius: 5px; padding: 2px 4px; background: transparent; color: inherit; font-size: 9px; }
257
+ .context-chip button:hover { background: color-mix(in srgb, var(--accent) 10%, transparent); }
258
+ .context-chip.stale { border-color: color-mix(in srgb, var(--warning) 55%, var(--edge)); background: var(--warning-soft); color: color-mix(in srgb, var(--warning) 70%, var(--fg)); }
259
+ .chip-remove { width: 18px; height: 18px; display: grid; place-items: center; border: 0; border-radius: 5px; padding: 0; background: transparent; color: inherit; }
260
+ .chip-remove:hover { background: var(--surface-active); }
261
+ .chip-remove svg { width: 11px; height: 11px; }
262
+ .file-input { display: none; }
263
+ .composer-error { display: flex; align-items: flex-start; gap: 6px; margin: 0 2px 7px; border-radius: 8px; padding: 7px 8px; background: var(--danger-soft); color: var(--danger); font-size: 10px; line-height: 1.4; }
264
+ .composer-error svg { width: 13px; height: 13px; flex: 0 0 auto; }
265
+ .composer-notice { margin: 0 2px 7px; border-radius: 8px; padding: 7px 8px; background: var(--warning-soft); color: color-mix(in srgb, var(--warning) 72%, var(--fg)); font-size: 10px; line-height: 1.4; }
266
+
267
+ .tab-mention-menu { position: absolute; z-index: 13; left: 0; right: 0; bottom: calc(100% + 8px); max-height: min(45vh, 320px); overflow-y: auto; border: 1px solid var(--edge-strong); border-radius: 12px; background: var(--surface-panel); padding: 5px; box-shadow: var(--shadow-popover); }
268
+ .tab-mention-menu button { width: 100%; display: grid; gap: 2px; border: 0; border-radius: 8px; padding: 8px 10px; background: transparent; color: inherit; text-align: left; }
269
+ .tab-mention-menu button:hover, .tab-mention-menu button.selected { background: var(--accent-soft); }
270
+ .tab-mention-menu span, .tab-mention-menu small { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
271
+ .tab-mention-menu span { font-size: 12px; font-weight: 600; }
272
+ .tab-mention-menu small, .tab-mention-empty { color: var(--fg-muted); font-size: 10px; }
273
+ .tab-mention-empty { padding: 10px; }
274
+
275
+ .request-card { max-height: min(42vh, 310px); margin: 0 0 7px; overflow-y: auto; border: 1px solid color-mix(in srgb, var(--accent) 28%, var(--edge)); border-radius: 11px; padding: 10px; background: var(--accent-soft); }
276
+ .request-card-title { display: flex; align-items: center; gap: 6px; color: var(--accent-fg); }
277
+ .request-card-title svg { width: 14px; height: 14px; }
278
+ .request-card-title strong { font-size: 11px; }
279
+ .request-card p { margin: 6px 0 9px; font-size: 12px; line-height: 1.45; }
280
+ .request-actions, .choice-list { display: flex; flex-wrap: wrap; gap: 5px; }
281
+ .request-actions button, .choice-list button, .clarification-actions button, .clarification-answer button { border: 1px solid color-mix(in srgb, var(--accent) 28%, var(--edge)); border-radius: 7px; padding: 5px 8px; background: var(--surface-panel); color: var(--fg-muted); font-size: 10px; }
282
+ .request-actions button:hover, .choice-list button:hover, .clarification-actions button:hover, .clarification-answer button:hover { background: var(--surface-hover); color: var(--fg); }
283
+ .request-actions .request-primary { border-color: var(--accent); background: var(--accent); color: #fff; }
284
+ .clarification-answer { display: flex; gap: 6px; margin-top: 7px; }
285
+ .clarification-answer input { min-width: 0; flex: 1; border: 1px solid color-mix(in srgb, var(--accent) 28%, var(--edge)); border-radius: 7px; padding: 6px 8px; background: var(--surface-panel); color: var(--fg); font-size: 11px; }
286
+ .clarification-actions { display: flex; gap: 4px; margin-top: 4px; }
287
+ .clarification-actions button { border-color: transparent; background: transparent; }
288
+
289
+ @media (max-width: 380px) {
290
+ .status { margin-right: 68px; }
291
+ .messages { padding-inline: 12px; }
292
+ .message.user { width: 92%; }
293
+ .model-controls select { max-width: 86px; }
294
+ .quick-prompts { gap: 6px; }
295
+ }
296
+
297
+ @media (prefers-reduced-motion: reduce) {
298
+ *, *::before, *::after { scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
299
+ }