pilotswarm 0.5.16 → 0.5.17

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pilotswarm",
3
- "version": "0.5.16",
3
+ "version": "0.5.17",
4
4
  "description": "PilotSwarm application package: terminal UI, browser portal + Web API server, and MCP server — one install, three bins.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -78,7 +78,7 @@
78
78
  "hono": "^4.12.10",
79
79
  "ink": "^6.8.0",
80
80
  "jose": "^6.2.2",
81
- "pilotswarm-sdk": "^0.5.16",
81
+ "pilotswarm-sdk": "^0.5.17",
82
82
  "react": "^19.2.4",
83
83
  "react-dom": "^19.2.4",
84
84
  "ws": "^8.18.2"
@@ -567,8 +567,11 @@ function splitMarkdownTableCells(line) {
567
567
  return cells;
568
568
  }
569
569
 
570
+ // GFM delimiter cells are `:?-+:?` — one dash is enough, so `--:` and `-` are
571
+ // as valid as `---`. Requiring three dashes silently demoted whole tables to
572
+ // raw pipe text whenever a model emitted the shorter alignment form.
570
573
  function isMarkdownTableSeparatorRow(cells) {
571
- return cells.length > 0 && cells.every((cell) => /^:?-{3,}:?$/.test(String(cell || "").replace(/\s+/g, "")));
574
+ return cells.length > 0 && cells.every((cell) => /^:?-+:?$/.test(String(cell || "").replace(/\s+/g, "")));
572
575
  }
573
576
 
574
577
  function displayWidth(value) {
@@ -186,10 +186,61 @@ function areStructuredValuesEqual(left, right) {
186
186
  return true;
187
187
  }
188
188
 
189
+ function sessionUpdateTimestampMs(session) {
190
+ const value = session?.updatedAt;
191
+ if (typeof value === "number" && Number.isFinite(value)) return value;
192
+ if (value instanceof Date) return value.getTime();
193
+ const parsed = Date.parse(value || "");
194
+ return Number.isFinite(parsed) ? parsed : 0;
195
+ }
196
+
197
+ // True when `nextSession` carries no newer information than what we already
198
+ // hold. Both timestamps must be present — an update with no `updatedAt` is
199
+ // treated as newer, because we cannot prove otherwise.
200
+ function isSameOrOlderSessionUpdate(previousSession, nextSession) {
201
+ const previousAt = sessionUpdateTimestampMs(previousSession);
202
+ const nextAt = sessionUpdateTimestampMs(nextSession);
203
+ return previousAt > 0 && nextAt > 0 && nextAt <= previousAt;
204
+ }
205
+
206
+ // A run that has ended for good. These are authoritative and must always land,
207
+ // even from an update that looks stale — stranding a finished session as
208
+ // "running" is far worse than a brief wrong status.
209
+ const TERMINAL_SESSION_STATUSES = new Set(["completed", "failed", "cancelled", "error"]);
210
+
211
+ // Session state is written from several concurrent sources: the session-list
212
+ // poll, live events, and a per-session detail fetch. They do not agree
213
+ // instant-to-instant, and the list poll in particular can report a status the
214
+ // orchestration has already moved on from — observed live as:
215
+ //
216
+ // sessions/loaded running + waiting -> waiting prevAt == incomingAt
217
+ // sessions/merged waiting + running -> running (105ms later)
218
+ //
219
+ // while the server's own session row and orchestration both read "running"
220
+ // throughout. Consumers gated on status === "running" — the live-activity
221
+ // strip, the composer's Stop button — blink off for the width of that gap.
222
+ //
223
+ // Refuse ANY non-terminal downgrade out of "running" unless the incoming
224
+ // update is genuinely newer. Deliberately not restricted to idle-like
225
+ // statuses: the status actually observed clobbering a live run was "waiting",
226
+ // and an earlier version of this guard missed the bug by excluding it.
227
+ // Terminal statuses are exempt so a finished run can never be stranded, and
228
+ // the timestamp test means a real transition (which carries a newer
229
+ // updatedAt) still lands immediately.
230
+ function shouldPreserveRunningStatus(previousSession, nextSession) {
231
+ const nextStatus = String(nextSession?.status ?? "").toLowerCase();
232
+ return previousSession?.status === "running"
233
+ && nextStatus !== "running"
234
+ && !TERMINAL_SESSION_STATUSES.has(nextStatus)
235
+ && isSameOrOlderSessionUpdate(previousSession, nextSession);
236
+ }
237
+
189
238
  function mergeDefinedSessionFields(previousSession = {}, nextSession = {}) {
190
239
  let merged = previousSession || {};
240
+ const preserveRunning = shouldPreserveRunningStatus(previousSession, nextSession);
191
241
  for (const [key, value] of Object.entries(nextSession || {})) {
192
242
  if (value === undefined) continue;
243
+ if (key === "status" && preserveRunning) continue;
193
244
  if (key === "pendingQuestion" && isAnsweredPendingQuestion(previousSession, value)) {
194
245
  if (merged === previousSession) {
195
246
  merged = { ...(previousSession || {}) };
@@ -594,6 +594,23 @@ export function isScrollViewportAtBottom(node) {
594
594
  return getScrollDistanceToBottom(node) <= SCROLL_BOTTOM_EPSILON_PX;
595
595
  }
596
596
 
597
+ export function computeAnchoredScrollTop(
598
+ node,
599
+ scrollOffset,
600
+ scrollMode,
601
+ preservePausedStickyScroll = false,
602
+ ) {
603
+ if (!node) return 0;
604
+ const maxScroll = Math.max(0, node.scrollHeight - node.clientHeight);
605
+ if (preservePausedStickyScroll) {
606
+ return Math.max(0, Math.min(node.scrollTop, maxScroll));
607
+ }
608
+ const offsetPixels = Math.max(0, Number(scrollOffset) || 0) * SCROLL_ROW_HEIGHT;
609
+ return scrollMode === "bottom"
610
+ ? Math.max(0, maxScroll - offsetPixels)
611
+ : Math.min(maxScroll, offsetPixels);
612
+ }
613
+
597
614
  function useScrollSync(ref, lines, scrollOffset, scrollMode, paneKey, controller, { stickyBottom = false } = {}) {
598
615
  const normalizedLines = React.useMemo(() => normalizeLines(lines), [lines]);
599
616
  // Programmatic scrollTop assignments fire a 'scroll' event that would
@@ -613,6 +630,23 @@ function useScrollSync(ref, lines, scrollOffset, scrollMode, paneKey, controller
613
630
  // or its momentum is in flight, the DOM is the source of truth and state
614
631
  // echoes of our own scroll dispatches must not snap the pane back.
615
632
  const userScrollRef = React.useRef({ touching: false, lastUserScrollAt: 0, lastDispatchedOffset: null });
633
+ const viewportSizeRef = React.useRef({ width: null, height: null });
634
+ const [viewportRevision, setViewportRevision] = React.useState(0);
635
+
636
+ React.useLayoutEffect(() => {
637
+ const node = ref.current;
638
+ if (!node || typeof ResizeObserver === "undefined") return;
639
+ viewportSizeRef.current = { width: node.clientWidth, height: node.clientHeight };
640
+ const observer = new ResizeObserver(() => {
641
+ const next = { width: node.clientWidth, height: node.clientHeight };
642
+ const previous = viewportSizeRef.current;
643
+ if (next.width === previous.width && next.height === previous.height) return;
644
+ viewportSizeRef.current = next;
645
+ setViewportRevision((revision) => revision + 1);
646
+ });
647
+ observer.observe(node);
648
+ return () => observer.disconnect();
649
+ }, [ref]);
616
650
 
617
651
  React.useLayoutEffect(() => {
618
652
  const node = ref.current;
@@ -632,17 +666,16 @@ function useScrollSync(ref, lines, scrollOffset, scrollMode, paneKey, controller
632
666
  previousViewportStateRef.current = { scrollMode, scrollOffset };
633
667
  return;
634
668
  }
635
- const maxScroll = Math.max(0, node.scrollHeight - node.clientHeight);
636
669
  const preservePausedStickyScroll = stickyBottom
637
670
  && scrollMode === "top"
638
671
  && previousViewportState?.scrollMode === "top"
639
672
  && previousViewportState?.scrollOffset === scrollOffset;
640
- const offsetPixels = Math.max(0, Number(scrollOffset) || 0) * SCROLL_ROW_HEIGHT;
641
- const nextScrollTop = preservePausedStickyScroll
642
- ? Math.max(0, Math.min(node.scrollTop, maxScroll))
643
- : scrollMode === "bottom"
644
- ? Math.max(0, maxScroll - offsetPixels)
645
- : Math.min(maxScroll, offsetPixels);
673
+ const nextScrollTop = computeAnchoredScrollTop(
674
+ node,
675
+ scrollOffset,
676
+ scrollMode,
677
+ preservePausedStickyScroll,
678
+ );
646
679
  if (Math.abs(node.scrollTop - nextScrollTop) > PROGRAMMATIC_SCROLL_TOLERANCE_PX) {
647
680
  const pendingProgrammaticScroll = { target: nextScrollTop };
648
681
  programmaticScrollRef.current = pendingProgrammaticScroll;
@@ -659,7 +692,7 @@ function useScrollSync(ref, lines, scrollOffset, scrollMode, paneKey, controller
659
692
  scrollMode,
660
693
  scrollOffset,
661
694
  };
662
- }, [normalizedLines, ref, scrollMode, scrollOffset, stickyBottom]);
695
+ }, [normalizedLines, ref, scrollMode, scrollOffset, stickyBottom, viewportRevision]);
663
696
 
664
697
  const onScroll = React.useCallback(() => {
665
698
  const node = ref.current;
@@ -0,0 +1 @@
1
+ :root{--ps-page-background: #0d1117;--ps-page-foreground: #f0f6fc;--ps-surface: #0d1117;--ps-background: #0d1117;--ps-foreground: #f0f6fc;--ps-muted: #8b949e;--ps-border: #6e7681;--ps-selection-background: #58a6ff;--ps-selection-foreground: #0d1117;--ps-highlight-background: #1f6feb;--ps-highlight-foreground: #ffffff;--ps-modal-backdrop: rgba(13, 17, 23, .72);--ps-modal-background: #161b22;--ps-modal-border: #30363d;--ps-modal-foreground: #f0f6fc;--ps-modal-muted: #8b949e;--ps-modal-selected-background: rgba(31, 111, 235, .16);--ps-modal-selected-border: #58a6ff;--ps-modal-selected-foreground: #ffffff;--ps-font-size-base: 13px;--ps-font-size-dense: 12px;--ps-line-height-base: 1.28;--ps-line-height-dense: 1.18;--ps-radius-sm: 6px;--ps-radius-md: 8px;--ps-scrollbar-size: 10px;--ps-scrollbar-track: rgba(110, 118, 129, .14);--ps-scrollbar-thumb: color-mix(in srgb, var(--ps-border) 56%, var(--ps-surface));--ps-scrollbar-thumb-hover: color-mix(in srgb, var(--ps-modal-selected-border) 42%, var(--ps-border))}*{box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--ps-scrollbar-thumb) var(--ps-scrollbar-track)}html,body,#root{margin:0;min-height:100%;height:100%;background:var(--ps-page-background);color:var(--ps-page-foreground);font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:var(--ps-font-size-base);line-height:var(--ps-line-height-base)}body{overflow:hidden;-webkit-text-size-adjust:100%}button,input,textarea{font:inherit}button{cursor:pointer}.portal-app-shell,.portal-gate{min-height:var(--ps-app-height, 100%);height:var(--ps-app-height, 100%);display:flex;flex-direction:column;background:radial-gradient(circle at top left,color-mix(in srgb,var(--ps-highlight-background) 18%,transparent),transparent 42%),radial-gradient(circle at top right,color-mix(in srgb,var(--ps-modal-selected-border) 16%,transparent),transparent 38%),var(--ps-page-background)}.portal-gate{align-items:center;justify-content:center;padding:24px}.portal-gate-card{width:min(480px,100%);border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-md);background:color-mix(in srgb,var(--ps-modal-background) 92%,transparent);box-shadow:0 28px 80px #00000052;padding:28px;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.portal-gate-brand{display:flex;flex-direction:column;align-items:flex-start;gap:14px;margin-bottom:18px}.portal-gate-kicker,.portal-header-kicker{color:var(--ps-muted);font-size:12px;letter-spacing:.08em;text-transform:uppercase}.portal-gate-title{margin:10px 0 14px;font-size:clamp(28px,5vw,42px);line-height:1.05}.portal-gate-copy{margin:0;color:var(--ps-muted);line-height:1.6}.portal-primary-button,.portal-secondary-button,.ps-toolbar-button,.ps-mini-button,.ps-send-button,.ps-modal-button,.ps-mobile-nav-button,.ps-tab,.ps-filter-option,.ps-list-button,.ps-modal-close{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-sm);background:color-mix(in srgb,var(--ps-surface) 94%,transparent);color:var(--ps-foreground);transition:background .12s ease,border-color .12s ease,transform .12s ease}.portal-primary-button,.ps-send-button,.ps-modal-button.is-primary{background:var(--ps-highlight-background);border-color:var(--ps-highlight-background);color:var(--ps-highlight-foreground)}.ps-modal-button.is-danger{background:#dc2626;border-color:#dc2626;color:#fff}.ps-modal-button.is-danger:hover{background:#ef4444;border-color:#ef4444}.portal-primary-button,.portal-secondary-button{padding:10px 14px;margin-top:20px}.portal-secondary-button{margin-top:0;flex:0 0 auto}.portal-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px 14px;border-bottom:1px solid color-mix(in srgb,var(--ps-border) 50%,transparent);background:color-mix(in srgb,var(--ps-page-background) 86%,transparent);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}.portal-header-brand{display:flex;align-items:center;gap:12px;min-width:0}.portal-header-brand-copy{display:flex;flex-direction:column;gap:3px;min-width:0}.portal-logo-frame{width:38px;height:38px;border-radius:var(--ps-radius-sm);border:1px solid color-mix(in srgb,var(--ps-modal-selected-border) 52%,var(--ps-modal-border));background:radial-gradient(circle at 28% 24%,color-mix(in srgb,var(--ps-modal-selected-border) 20%,transparent),transparent 58%),linear-gradient(135deg,color-mix(in srgb,var(--ps-highlight-background) 20%,var(--ps-surface)),color-mix(in srgb,var(--ps-background) 92%,transparent));box-shadow:inset 0 1px color-mix(in srgb,white 10%,transparent),0 10px 24px #0000002e;display:grid;place-items:center;flex:0 0 auto;overflow:hidden}.portal-logo-frame.is-large{width:76px;height:76px;border-radius:16px}.portal-logo-frame.has-image{background:radial-gradient(circle at 28% 24%,color-mix(in srgb,white 10%,transparent),transparent 58%),linear-gradient(135deg,color-mix(in srgb,var(--ps-surface) 94%,white 6%),color-mix(in srgb,var(--ps-background) 90%,transparent))}.portal-logo{width:24px;height:24px}.portal-logo-frame.is-large .portal-logo{width:44px;height:44px}.portal-logo-image{width:74%;height:74%;object-fit:contain;display:block}.portal-logo-frame.is-large .portal-logo-image{width:82%;height:82%}.portal-logo-ring,.portal-logo-link{stroke:color-mix(in srgb,var(--ps-modal-selected-border) 82%,var(--ps-page-foreground));stroke-linecap:round;stroke-linejoin:round}.portal-logo-ring{stroke-width:3;opacity:.46}.portal-logo-link{stroke-width:2.5;opacity:.9}.portal-logo-core{fill:var(--ps-highlight-background)}.portal-logo-node{stroke:color-mix(in srgb,var(--ps-page-background) 70%,transparent);stroke-width:1.5}.portal-logo-node-a,.portal-logo-node-d{fill:#7ee787}.portal-logo-node-b,.portal-logo-node-e{fill:#58a6ff}.portal-logo-node-c,.portal-logo-node-f{fill:#d2a8ff}.portal-header-user{display:inline-flex;align-items:flex-start;gap:10px;align-self:start}.portal-header-meta{display:inline-flex;flex-direction:column;align-items:flex-end;gap:4px;min-width:0}.portal-header-version{display:inline-flex;align-items:center;padding:3px 8px;border:1px solid color-mix(in srgb,var(--ps-border) 48%,transparent);border-radius:999px;background:color-mix(in srgb,var(--ps-surface) 90%,transparent);color:var(--ps-muted);font-size:.72rem;line-height:1;white-space:nowrap}.portal-header-status{max-width:min(44rem,42vw);color:var(--ps-muted);font-size:.72rem;line-height:1;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.portal-mobile-status{display:none}.portal-mobile-status-text{flex:1;min-width:0;color:var(--ps-foreground);font-size:.9rem;line-height:1.2;overflow-wrap:anywhere}.portal-mobile-status-dismiss{flex:none;appearance:none;border:none;background:transparent;color:var(--ps-muted);font-size:.9rem;line-height:1;padding:4px 6px;cursor:pointer;border-radius:6px}.portal-mobile-status-dismiss:hover{color:var(--ps-foreground);background:color-mix(in srgb,var(--ps-surface) 80%,transparent)}.portal-header-identity,.portal-header-identity-stack{min-width:0}.portal-header-identity-stack{display:flex;flex-direction:column;align-items:flex-start;gap:1px;text-align:left}.portal-header-name,.portal-header-email,.portal-header-identity{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.portal-header-name{color:var(--ps-foreground);font-size:.9rem;font-weight:700;line-height:1.05}.portal-header-email{color:var(--ps-muted);font-size:.78rem;line-height:1.05}.portal-header-identity{color:var(--ps-foreground);font-size:.84rem}.portal-header-identity.is-muted{color:var(--ps-muted)}.portal-main{flex:1;min-height:0;padding:10px;overflow:hidden}.ps-web-shell{min-height:0;height:100%;display:flex;flex-direction:column;gap:8px;overflow:hidden}.ps-toolbar{display:flex;align-items:center;justify-content:space-between;gap:6px}.ps-toolbar.is-mobile{flex-direction:column;align-items:stretch;justify-content:flex-start}.ps-toolbar-row{display:flex;align-items:center;gap:6px;min-width:0}.ps-toolbar-row-actions{display:flex;align-items:center;gap:6px;min-width:0;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none}.ps-toolbar-row-actions::-webkit-scrollbar{display:none}.ps-toolbar-row-primary,.ps-toolbar-row-secondary{min-width:0}.ps-toolbar-row-secondary{justify-content:space-between}.ps-toolbar-actions{display:flex;flex-wrap:wrap;gap:6px;min-width:0}.ps-toolbar-status{flex:0 1 auto;color:var(--ps-muted);font-size:10px;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-toolbar-button,.ps-mini-button,.ps-modal-button,.ps-mobile-nav-button,.ps-tab,.ps-filter-option,.ps-modal-close{padding:6px 10px;min-height:34px;font-size:.92rem;line-height:1}.ps-workspace{flex:1;min-height:0;overflow:hidden}.ps-workspace>*{min-height:0}.ps-workspace-full{min-height:0;height:100%;display:flex}.ps-workspace-full>.ps-panel{flex:1;min-height:0}.ps-workspace-grid{display:grid;grid-template-rows:minmax(0,1fr);gap:8px;min-width:0;width:100%;max-width:100%;min-height:0;height:100%;overflow:hidden}.ps-workspace-column{display:grid;gap:8px;min-width:0;width:100%;max-width:100%;min-height:0;overflow:hidden}.ps-workspace-main-grid{display:grid;grid-template-rows:minmax(0,1fr);gap:8px;min-width:0;width:100%;max-width:100%;min-height:0;height:100%;overflow:hidden}.ps-workspace-pane-slot{min-width:0;width:100%;max-width:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden}.ps-workspace-pane-slot>.ps-panel{flex:1;min-width:0;width:100%;max-width:100%;min-height:0}.ps-chat-focus-shell{min-height:0;min-width:0;width:100%;max-width:100%;height:100%;display:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;overflow:hidden}.ps-chat-focus-rail{display:flex;align-items:center;gap:6px;padding:4px 6px;border:1px solid color-mix(in srgb,var(--ps-border) 42%,transparent);border-radius:var(--ps-radius-sm);background:color-mix(in srgb,var(--ps-surface) 94%,transparent)}.ps-chat-focus-button{flex:0 0 auto}.ps-chat-focus-status{margin-left:auto;color:var(--ps-muted);font-size:.72rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-chat-focus-body{position:relative;min-height:0;min-width:0;display:flex;overflow:hidden}.ps-chat-focus-body>.ps-panel{flex:1;min-height:0;min-width:0}.ps-chat-focus-body .ps-panel-body,.ps-chat-focus-body .ps-scroll-panel{min-width:0}.ps-chat-focus-body .ps-line,.ps-chat-focus-body .ps-chat-card-line{overflow-wrap:anywhere}.ps-chat-focus-overlay{position:absolute;top:10px;bottom:10px;width:min(34rem,calc(100% - 20px));max-width:min(34rem,42%);min-width:0;z-index:6;pointer-events:none;overflow:hidden}.ps-chat-focus-overlay.is-left{left:10px}.ps-chat-focus-overlay.is-right{right:10px}.ps-chat-focus-overlay>.ps-panel{height:100%;min-width:0;max-width:100%;pointer-events:auto;background:linear-gradient(color-mix(in srgb,var(--ps-surface) 96%,transparent),color-mix(in srgb,var(--ps-surface) 96%,transparent)),var(--ps-page-background);box-shadow:0 20px 48px #00000057,inset 0 0 0 1px color-mix(in srgb,var(--ps-page-background) 35%,transparent)}.ps-mobile-workspace{min-height:0;min-width:0;width:100%;max-width:100%;height:100%;display:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;overflow:hidden}.ps-mobile-session-pane{max-height:min(14vh,96px)}.ps-mobile-session-pane .ps-action-list{min-height:0}.ps-mobile-session-pane .ps-action-list .ps-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow-wrap:normal;word-break:normal}.ps-mobile-session-collapsed .ps-panel-body{flex:0 0 auto}.ps-mobile-session-summary{padding:0 10px 10px;color:var(--ps-muted);font-size:var(--ps-font-size-dense);line-height:var(--ps-line-height-dense)}.ps-mobile-chat-pane{min-height:0;min-width:0;width:100%;max-width:100%;display:flex;flex-direction:column;overflow:hidden}.ps-mobile-chat-pane>.ps-panel{flex:1;min-width:0;width:100%;max-width:100%;min-height:0}.ps-mobile-pane-fill{min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden}.ps-mobile-pane-fill>.ps-panel{flex:1;min-height:0}.ps-column-resizer{align-self:stretch;width:16px;min-height:0;padding:0;border:0;border-radius:999px;background:transparent;display:grid;place-items:center;cursor:col-resize;position:relative}.ps-row-resizer{justify-self:stretch;height:16px;min-width:0;padding:0;border:0;border-radius:999px;background:transparent;display:grid;place-items:center;cursor:row-resize;position:relative}.ps-column-resizer:before{content:"";position:absolute;top:10px;bottom:10px;left:50%;width:1px;transform:translate(-50%);background:color-mix(in srgb,var(--ps-border) 52%,transparent)}.ps-row-resizer:before{content:"";position:absolute;left:10px;right:10px;top:50%;height:1px;transform:translateY(-50%);background:color-mix(in srgb,var(--ps-border) 52%,transparent)}.ps-column-resizer-handle{position:relative;z-index:1;display:grid;gap:4px;padding:10px 4px;border-radius:999px;border:1px solid color-mix(in srgb,var(--ps-modal-border) 78%,transparent);background:color-mix(in srgb,var(--ps-surface) 94%,transparent);box-shadow:0 6px 20px #0000002e}.ps-row-resizer-handle{position:relative;z-index:1;display:flex;gap:4px;padding:4px 10px;border-radius:999px;border:1px solid color-mix(in srgb,var(--ps-modal-border) 78%,transparent);background:color-mix(in srgb,var(--ps-surface) 94%,transparent);box-shadow:0 6px 20px #0000002e}.ps-column-resizer-dot,.ps-row-resizer-dot{width:3px;height:3px;border-radius:999px;background:color-mix(in srgb,var(--ps-modal-selected-border) 84%,var(--ps-page-foreground))}.ps-column-resizer:hover .ps-column-resizer-handle,.ps-column-resizer.is-dragging .ps-column-resizer-handle,.ps-column-resizer:focus-visible .ps-column-resizer-handle{border-color:color-mix(in srgb,var(--ps-modal-selected-border) 72%,var(--ps-modal-border));background:color-mix(in srgb,var(--ps-modal-selected-background) 72%,var(--ps-surface))}.ps-row-resizer:hover .ps-row-resizer-handle,.ps-row-resizer.is-dragging .ps-row-resizer-handle,.ps-row-resizer:focus-visible .ps-row-resizer-handle{border-color:color-mix(in srgb,var(--ps-modal-selected-border) 72%,var(--ps-modal-border));background:color-mix(in srgb,var(--ps-modal-selected-background) 72%,var(--ps-surface))}.ps-column-resizer:focus-visible{outline:none}.ps-row-resizer:focus-visible{outline:none}body.is-resizing-pane-x,body.is-resizing-pane-x *{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}body.is-resizing-pane-y,body.is-resizing-pane-y *{cursor:row-resize!important;-webkit-user-select:none!important;user-select:none!important}.ps-panel{position:relative;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:2px solid var(--ps-panel-accent, var(--ps-border));border-radius:var(--ps-radius-sm);background:color-mix(in srgb,var(--ps-surface) 96%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ps-page-background) 35%,transparent)}.ps-panel.is-focused{box-shadow:0 0 0 1px color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 40%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--ps-page-background) 35%,transparent)}.ps-panel-header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:30px;padding:4px 10px;border-bottom:1px solid color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 28%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 16%,var(--ps-surface)),color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 10%,var(--ps-surface)));margin-bottom:0}.ps-panel-title{display:inline-flex;align-items:center;gap:4px;padding:0;background:transparent;font-size:.94rem;font-weight:700;line-height:1.02}.ps-panel-header-right{display:inline-flex;align-items:center;gap:8px;min-width:0;margin-left:auto}.ps-panel-title-right{display:inline-flex;align-items:center;gap:0;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.82rem;line-height:1.35}.ps-panel-actions{display:inline-flex;align-items:center;flex-wrap:wrap;gap:4px;padding-left:0;background:transparent}.ps-panel-body,.ps-scroll-panel{flex:1;min-width:0;width:100%;max-width:100%;min-height:0}.ps-panel-body{display:flex;flex-direction:column;min-height:0;padding-top:2px}.ps-scroll-panel{overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y;scrollbar-gutter:stable;padding:6px 10px 10px;font-size:var(--ps-font-size-dense);line-height:var(--ps-line-height-dense)}.ps-panel-sticky{flex:0 0 auto;padding:6px 10px 0;border-bottom:1px solid color-mix(in srgb,var(--ps-border) 35%,transparent);font-size:var(--ps-font-size-dense);line-height:var(--ps-line-height-dense)}.ps-panel-sticky.is-scroll-sync{overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;touch-action:pan-x;scrollbar-gutter:stable both-edges}.ps-panel-bottom-sticky{flex:0 0 auto;max-height:34%;overflow:auto;padding:4px 10px 8px;border-top:1px solid color-mix(in srgb,var(--ps-border) 45%,transparent);background:color-mix(in srgb,var(--ps-surface) 94%,#0f172a 6%);font-size:var(--ps-font-size-dense);line-height:var(--ps-line-height-dense);scrollbar-gutter:stable both-edges}.ps-line{min-height:1.16rem;white-space:pre-wrap;line-height:1.16rem;word-break:break-word}.ps-panel.has-preserved-sticky .ps-panel-sticky .ps-line,.ps-scroll-panel.is-preserve .ps-line{white-space:pre;word-break:normal;overflow-wrap:normal}.ps-scroll-panel.is-preserve .ps-line{min-width:max-content}.ps-chat-preserve-block{max-width:100%;overflow-x:auto}.ps-scroll-panel.is-wrapped .ps-line.ps-line-preserve,.ps-line-preserve{white-space:pre;word-break:normal;overflow-wrap:normal;min-width:max-content}.ps-chat-preserve-block.is-splash-mobile{display:none}@media(max-width:920px){.ps-chat-preserve-block.is-splash-desktop{display:none}.ps-chat-preserve-block.is-splash-mobile{display:block}.portal-header-status{display:none}.portal-mobile-status{display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}}@media(max-width:920px){.ps-chat-preserve-block{overflow-x:hidden}.ps-chat-preserve-block .ps-line-preserve,.ps-scroll-panel.is-wrapped .ps-line.ps-line-preserve{white-space:pre-wrap;overflow-wrap:anywhere;word-break:normal;min-width:0}}.ps-sequence-turn-divider{width:100%;margin:4px 0;padding:2px 6px;border:0;--ps-sequence-divider: #4f6f96;border-top:1px solid color-mix(in srgb,var(--ps-sequence-divider) 82%,transparent);border-bottom:1px solid color-mix(in srgb,var(--ps-sequence-divider) 42%,transparent);border-radius:0;background:transparent;color:color-mix(in srgb,var(--ps-sequence-divider) 78%,var(--ps-text-muted));font:inherit;text-align:center;cursor:pointer}.ps-sequence-turn-divider:hover,.ps-sequence-turn-divider:focus-visible{color:var(--ps-text);background:color-mix(in srgb,var(--ps-surface-raised) 72%,transparent);outline:none}.ps-sequence-turn-caret{color:var(--ps-sequence-divider)}.ps-sequence-turn-rule{color:color-mix(in srgb,var(--ps-sequence-divider) 76%,var(--ps-text-muted))}.ps-sequence-turn-key{color:var(--ps-text-muted)}.ps-sequence-turn-model{color:var(--ps-text)}.ps-sequence-turn-tokens{color:var(--ps-success)}.ps-sequence-turn-duration{color:var(--ps-warning)}.ps-sequence-turn-details{margin:0 12px 8px;padding:8px 10px;border-left:2px solid var(--ps-accent);color:var(--ps-text-muted);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.5}.ps-sequence-turn-detail-label{color:var(--ps-accent)}.ps-scroll-panel.is-wrapped .ps-line,.ps-modal-details .ps-line,.ps-filter-column .ps-line{white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;max-width:100%}.ps-chat-card{margin:8px 0;border:1px solid color-mix(in srgb,var(--ps-chat-card-accent, var(--ps-border)) 78%,transparent);border-radius:var(--ps-radius-sm);background:color-mix(in srgb,var(--ps-surface) 98%,transparent);overflow:hidden;width:auto;max-width:100%}.ps-chat-card-header{padding:8px 12px 6px;border-bottom:1px solid color-mix(in srgb,var(--ps-chat-card-accent, var(--ps-border)) 28%,transparent);background:color-mix(in srgb,var(--ps-chat-card-accent, var(--ps-surface)) 10%,transparent)}.ps-chat-card-body{padding:8px 12px 10px}.ps-chat-card-line{white-space:pre-wrap;word-break:break-word}.ps-chat-card-line+.ps-chat-card-line{margin-top:6px}.ps-chat-panel .ps-line,.ps-chat-panel .ps-chat-card-line{min-height:1.24rem;line-height:1.24rem}.ps-system-notice{margin:10px 0 12px;color:var(--ps-muted)}.ps-system-notice[open]{margin-bottom:14px}.ps-system-notice-summary{cursor:pointer;list-style:none;-webkit-user-select:none;user-select:none;opacity:.86;transition:opacity .12s ease}.ps-system-notice-summary:hover,.ps-system-notice[open] .ps-system-notice-summary{opacity:1}.ps-system-notice-summary::-webkit-details-marker{display:none}.ps-system-notice-summary-text{display:inline-block;white-space:pre-wrap}.ps-system-notice-summary:before{content:"▸ ";color:color-mix(in srgb,var(--ps-muted) 84%,transparent)}.ps-system-notice[open] .ps-system-notice-summary:before{content:"▾ "}.ps-system-notice-body{margin-top:8px;padding-left:12px;border-left:1px solid color-mix(in srgb,var(--ps-border) 42%,transparent);color:var(--ps-muted)}.ps-system-notice-body .ps-markdown-preview{gap:10px}.ps-system-notice-body .ps-md-paragraph,.ps-system-notice-body .ps-md-list,.ps-system-notice-body .ps-md-quote{color:var(--ps-muted)}.ps-chat-table-wrap{margin:8px auto 8px 0;border:1px solid color-mix(in srgb,var(--ps-border) 55%,transparent);border-radius:var(--ps-radius-sm);overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;width:fit-content;max-width:100%;scrollbar-width:thin;scrollbar-color:var(--ps-scrollbar-thumb) transparent}.ps-chat-table-wrap::-webkit-scrollbar,.ps-md-table-wrap::-webkit-scrollbar,.ps-md-code-pre::-webkit-scrollbar{width:var(--ps-scrollbar-size);height:var(--ps-scrollbar-size)}.ps-chat-table-wrap::-webkit-scrollbar-track,.ps-md-table-wrap::-webkit-scrollbar-track,.ps-md-code-pre::-webkit-scrollbar-track{background:transparent}.ps-chat-table-wrap::-webkit-scrollbar-thumb,.ps-md-table-wrap::-webkit-scrollbar-thumb,.ps-md-code-pre::-webkit-scrollbar-thumb{background:var(--ps-scrollbar-thumb);border:2px solid transparent;border-radius:999px;background-clip:padding-box;min-height:28px;min-width:28px}.ps-chat-table-wrap::-webkit-scrollbar-thumb:hover,.ps-md-table-wrap::-webkit-scrollbar-thumb:hover,.ps-md-code-pre::-webkit-scrollbar-thumb:hover{background:var(--ps-scrollbar-thumb-hover);border:2px solid transparent;background-clip:padding-box}.ps-chat-table-wrap.is-fit-width,.ps-md-table-wrap.is-fit-width{width:fit-content;max-width:100%}.ps-chat-table{width:max-content;border-collapse:collapse;table-layout:auto}.ps-chat-table.is-fit-width,.ps-md-table.is-fit-width{width:fit-content;max-width:100%;min-width:var(--ps-table-min-width, 0px);table-layout:auto}.ps-chat-table th,.ps-chat-table td{padding:6px 8px;border-right:1px solid color-mix(in srgb,var(--ps-border) 34%,transparent);border-bottom:1px solid color-mix(in srgb,var(--ps-border) 34%,transparent);white-space:pre-wrap;word-break:break-word;vertical-align:top}.ps-chat-table.is-fit-width th,.ps-chat-table.is-fit-width td,.ps-md-table.is-fit-width th,.ps-md-table.is-fit-width td{min-width:0;white-space:normal;word-break:break-word;overflow-wrap:anywhere}.ps-chat-table-wrap.is-fit-width.has-flex-column,.ps-md-table-wrap.is-fit-width.has-flex-column{width:100%;max-width:100%}.ps-chat-table.is-fit-width.has-flex-column,.ps-md-table.is-fit-width.has-flex-column{width:max(100%,var(--ps-table-min-width, 0px));min-width:var(--ps-table-min-width, 0px);table-layout:fixed}.ps-chat-table.is-fit-width.has-flex-column th,.ps-chat-table.is-fit-width.has-flex-column td,.ps-md-table.is-fit-width.has-flex-column th,.ps-md-table.is-fit-width.has-flex-column td{overflow-wrap:normal;word-break:normal}.ps-chat-table.is-fit-width.has-flex-column th.is-flex-column,.ps-chat-table.is-fit-width.has-flex-column td.is-flex-column,.ps-md-table.is-fit-width.has-flex-column th.is-flex-column,.ps-md-table.is-fit-width.has-flex-column td.is-flex-column{white-space:normal;overflow-wrap:anywhere;word-break:break-word}.ps-chat-table th:last-child,.ps-chat-table td:last-child{border-right:0}.ps-chat-table tbody tr:last-child td{border-bottom:0}.ps-chat-table th{text-align:left;font-weight:700;color:var(--ps-foreground);background:color-mix(in srgb,var(--ps-highlight-background) 10%,var(--ps-surface))}.ps-table-cell-value{min-width:0}.ps-chat-code-block{margin:8px 0;width:auto;max-width:100%}.ps-action-list{display:flex;flex-direction:column;flex:1 1 auto;gap:4px;padding:6px 10px 10px;min-width:0;min-height:0;width:100%;max-width:100%;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y;scrollbar-gutter:stable both-edges;font-size:var(--ps-font-size-dense);line-height:var(--ps-line-height-dense)}.ps-session-pane.ps-chat-focus-pane .ps-action-list.ps-session-list{overflow-x:auto;touch-action:pan-x pan-y;padding-bottom:calc(6px + var(--ps-scrollbar-size))}.ps-session-pane.ps-chat-focus-pane .ps-session-list-button{width:max-content;min-width:100%;max-width:none;overflow:visible}.ps-session-pane.ps-chat-focus-pane .ps-session-row-content{display:inline-block;min-width:max-content;overflow:visible;max-width:none}.ps-session-pane.ps-chat-focus-pane .ps-action-list .ps-line{max-width:none;min-width:0;white-space:nowrap;overflow:visible;text-overflow:clip}.ps-list-button{width:100%;min-width:0;max-width:100%;overflow:hidden;text-align:left;padding:7px 9px;flex:0 0 auto}.ps-action-list .ps-line{display:block;min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-session-pane .ps-panel-body{padding:2px 8px 8px}.ps-session-pane .ps-session-list{gap:1px;padding:2px 0 6px}.ps-session-pane:not(.ps-mobile-session-pane) .ps-session-list{overflow-x:auto;overflow-y:auto;touch-action:pan-x pan-y;padding-bottom:calc(6px + var(--ps-scrollbar-size))}.ps-session-pane:not(.ps-mobile-session-pane) .ps-session-list-button{width:max-content;min-width:100%;max-width:none;overflow:visible}.ps-session-pane:not(.ps-mobile-session-pane):not(.ps-chat-focus-pane) .ps-session-list-button+.ps-session-list-button{border-top:1px solid color-mix(in srgb,var(--ps-border) 22%,transparent)}.ps-session-pane .ps-session-list-button{display:block;border:0;border-radius:2px;background:transparent;box-shadow:none;color:inherit;padding:3px 8px;min-height:1.55rem;white-space:normal;flex:0 0 auto}.ps-session-pane .ps-session-list-button:hover{transform:none;border-color:transparent;background:color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 7%,transparent)}.ps-session-pane .ps-session-list-button.is-selected{border-color:transparent;background:color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 15%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 80%,transparent),inset 3px 0 color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 90%,transparent);color:inherit}.ps-session-pane .ps-session-list-button.is-multiselected{background:color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 22%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 60%,transparent),inset 3px 0 color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 95%,transparent)}.ps-session-pane .ps-session-list-button.is-pinned{background:color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 5%,transparent)}.ps-session-pane .ps-session-list-button:focus-visible{outline:none;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 80%,transparent),inset 3px 0 color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 90%,transparent),0 0 0 1px color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 35%,transparent)}.ps-session-row-content{display:block;min-width:0;max-width:100%;overflow:visible}.ps-session-row-line{display:flex;align-items:baseline;gap:8px;min-width:0;max-width:100%}.ps-session-row-title{min-width:0;flex:1 1 auto;line-height:1.28}.ps-session-row-ctx{flex:0 0 auto;margin-left:auto;padding-inline-start:8px;font-variant-numeric:tabular-nums;white-space:nowrap;opacity:.96}.ps-session-row-detail{margin-top:3px;padding-inline-start:20px;line-height:1.24;font-size:.94em;opacity:.9}.ps-session-pane:not(.ps-mobile-session-pane) .ps-session-row-content,.ps-session-pane:not(.ps-mobile-session-pane) .ps-session-row-line,.ps-session-pane:not(.ps-mobile-session-pane) .ps-session-row-title,.ps-session-pane:not(.ps-mobile-session-pane) .ps-session-row-detail{width:max-content;min-width:max-content;max-width:none}.ps-session-pane:not(.ps-mobile-session-pane) .ps-session-row-title{white-space:nowrap;overflow:visible}.ps-session-pane .ps-action-list .ps-line{white-space:nowrap;overflow:visible;text-overflow:clip;overflow-wrap:normal;word-break:normal;max-width:none}.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-session-list{overflow-x:hidden;padding-bottom:6px}.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-session-list-button{width:100%;min-width:0;max-width:100%;overflow:hidden}.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-session-row-content,.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-session-row-line,.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-session-row-title,.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-session-row-detail{width:auto;min-width:0;max-width:100%}.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-session-row-title,.ps-session-pane.ps-mobile-session-pane .ps-session-row-title{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;white-space:normal}.ps-workspace-main-grid.is-session-wrap .ps-session-pane .ps-action-list .ps-line{white-space:normal;overflow:hidden;overflow-wrap:anywhere;word-break:break-word;max-width:100%}.ps-session-pane.ps-mobile-session-pane .ps-action-list .ps-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow-wrap:normal;word-break:normal}.ps-list-button.is-selected,.ps-toolbar-button.is-active,.ps-mini-button.is-active,.ps-tab.is-active,.ps-mobile-nav-button.is-active,.ps-filter-option.is-selected{border-color:var(--ps-modal-selected-border);background:var(--ps-modal-selected-background);color:var(--ps-modal-selected-foreground)}.ps-empty-state{color:var(--ps-muted);padding:6px 0}.ps-nav-error-state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:18px 12px}.ps-nav-error-message{max-width:42em;line-height:1.5}.ps-tab-row{display:flex;flex-wrap:wrap;gap:4px;padding:2px 10px 4px;align-items:center}.ps-panel .ps-mini-button,.ps-panel .ps-tab{padding:4px 8px;min-height:30px}.ps-files-grid{flex:1;min-height:0;display:grid;grid-template-rows:minmax(180px,.9fr) minmax(220px,1.3fr);gap:8px;padding:0 10px 10px}.ps-scroll-panel.is-preview,.ps-markdown-scroll{padding-top:10px}.ps-markdown-preview{display:flex;flex-direction:column;gap:14px;padding-right:4px;line-height:1.55}.ps-binary-preview-card{display:flex;flex-direction:column;gap:10px;margin:10px 10px 12px;padding:18px 18px 20px;border:1px solid color-mix(in srgb,var(--ps-border) 52%,transparent);border-radius:calc(var(--ps-radius-md) + 2px);background:radial-gradient(circle at top right,color-mix(in srgb,var(--ps-highlight-background) 18%,transparent),transparent 42%),linear-gradient(180deg,color-mix(in srgb,var(--ps-surface) 96%,transparent),color-mix(in srgb,var(--ps-background) 96%,transparent));box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.ps-binary-preview-kicker{font-size:.76rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ps-muted)}.ps-binary-preview-title{margin:0;font-size:1.08rem;line-height:1.25;font-weight:800;color:var(--ps-foreground);word-break:break-word}.ps-binary-preview-meta,.ps-binary-preview-time{color:color-mix(in srgb,var(--ps-foreground) 76%,var(--ps-muted));font-size:.9rem;line-height:1.45;word-break:break-word}.ps-binary-preview-copy{margin:4px 0 0;color:var(--ps-foreground);line-height:1.6}.ps-md-heading{margin:0;font-weight:800;line-height:1.2;color:var(--ps-foreground)}.ps-md-heading.is-h1{font-size:1.45rem}.ps-md-heading.is-h2{font-size:1.28rem}.ps-md-heading.is-h3{font-size:1.12rem}.ps-md-heading.is-h4,.ps-md-heading.is-h5,.ps-md-heading.is-h6{font-size:1rem}.ps-md-paragraph,.ps-md-quote,.ps-md-list{margin:0}.ps-md-list{padding-left:22px;display:flex;flex-direction:column;gap:6px}.ps-md-list-item{line-height:1.5}.ps-md-quote{margin:0;padding:10px 14px;border-left:3px solid color-mix(in srgb,var(--ps-modal-selected-border) 78%,transparent);background:color-mix(in srgb,var(--ps-highlight-background) 8%,transparent);color:color-mix(in srgb,var(--ps-foreground) 88%,var(--ps-muted))}.ps-md-inline-code{padding:1px 6px;border-radius:999px;background:color-mix(in srgb,var(--ps-highlight-background) 12%,var(--ps-surface));border:1px solid color-mix(in srgb,var(--ps-border) 35%,transparent);font-size:.94em}.ps-md-code-block{border:1px solid color-mix(in srgb,var(--ps-border) 45%,transparent);border-radius:var(--ps-radius-sm);overflow:hidden;background:color-mix(in srgb,var(--ps-background) 96%,black 4%)}.ps-md-code-header{padding:7px 12px;font-size:.82rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ps-muted);border-bottom:1px solid color-mix(in srgb,var(--ps-border) 32%,transparent);background:color-mix(in srgb,var(--ps-surface) 92%,transparent)}.ps-md-code-pre{margin:0;padding:14px 16px;overflow:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y;line-height:1.55;font-size:.95rem;white-space:pre;max-width:100%;scrollbar-width:thin;scrollbar-color:var(--ps-scrollbar-thumb) transparent}.ps-md-code-pre code{font:inherit;color:#9fe3ff}.ps-md-table-wrap{overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y;border:1px solid color-mix(in srgb,var(--ps-border) 40%,transparent);border-radius:var(--ps-radius-sm);max-width:100%;scrollbar-width:thin;scrollbar-color:var(--ps-scrollbar-thumb) transparent}.ps-md-table{width:100%;border-collapse:collapse}.ps-md-table th,.ps-md-table td{padding:9px 12px;border-bottom:1px solid color-mix(in srgb,var(--ps-border) 25%,transparent);text-align:left;vertical-align:top;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.ps-md-table th{background:color-mix(in srgb,var(--ps-highlight-background) 10%,var(--ps-surface));font-weight:700}.ps-md-table tbody tr:last-child td{border-bottom:0}.ps-md-link{text-decoration:underline;text-underline-offset:2px;overflow-wrap:anywhere;word-break:break-word}.ps-chat-panel .ps-panel-header{padding-bottom:8px}.ps-chat-panel .ps-panel-body{padding-top:2px}.ps-chat-panel .ps-scroll-panel{padding-top:6px}.ps-chat-panel .ps-scroll-panel.is-scrolled-down{-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 18px,#000 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 18px,#000 100%)}.ps-chat-panel .ps-scroll-panel.is-scrolled-up{-webkit-mask-image:linear-gradient(to bottom,#000 0,#000 calc(100% - 18px),transparent 100%);mask-image:linear-gradient(to bottom,#000 0,#000 calc(100% - 18px),transparent 100%)}.ps-chat-panel .ps-scroll-panel.is-scrolled-down.is-scrolled-up{-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 18px,#000 calc(100% - 18px),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 18px,#000 calc(100% - 18px),transparent 100%)}.ps-chat-panel .ps-panel-bottom-sticky{box-shadow:0 -10px 22px color-mix(in srgb,#000 24%,transparent)}.ps-status-strip{display:flex;justify-content:space-between;gap:10px;padding:0 2px;color:var(--ps-muted);font-size:9px}.ps-status-left,.ps-status-right{min-width:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ps-chat-composer{display:flex;flex-direction:column;gap:4px;padding:8px 10px 10px;border-top:1px solid color-mix(in srgb,var(--ps-panel-accent, var(--ps-border)) 32%,transparent);background:color-mix(in srgb,var(--ps-surface) 98%,transparent);isolation:isolate}.ps-prompt-shell{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;padding:0}.ps-prompt-shell.is-mobile{grid-template-columns:auto minmax(0,1fr) auto;gap:8px}.ps-prompt-actions{display:inline-flex;align-items:center;gap:8px}.ps-hidden-file-input{display:none}.ps-prompt-label{padding:0 4px 0 2px;color:var(--ps-muted);text-transform:uppercase;font-size:10px;letter-spacing:.08em;align-self:center}.ps-prompt-shell.is-mobile .ps-prompt-label{padding:0 2px 0 0}.ps-prompt-input,.ps-modal-input{width:100%;min-height:40px;resize:vertical;border:1px solid color-mix(in srgb,var(--ps-border) 60%,transparent);border-radius:var(--ps-radius-sm);background:var(--ps-background);background-clip:padding-box;color:var(--ps-foreground);caret-color:var(--ps-foreground);padding:8px 10px;outline:none;font-size:var(--ps-font-size-dense);line-height:var(--ps-line-height-dense)}.ps-prompt-input::placeholder,.ps-modal-input::placeholder{color:color-mix(in srgb,var(--ps-muted) 74%,transparent);opacity:1}.ps-prompt-shell.is-mobile .ps-prompt-input{font-size:16px;line-height:1.25}.ps-prompt-input:focus,.ps-modal-input:focus{border-color:var(--ps-modal-selected-border);box-shadow:0 0 0 3px color-mix(in srgb,var(--ps-modal-selected-border) 20%,transparent)}.ps-prompt-shell.is-drag-over .ps-prompt-input{border-color:var(--ps-modal-selected-border);background:color-mix(in srgb,var(--ps-modal-selected-background) 16%,var(--ps-background));box-shadow:0 0 0 3px color-mix(in srgb,var(--ps-modal-selected-border) 18%,transparent)}.ps-send-button{min-height:40px;padding:0 12px}.ps-stop-button{display:inline-flex;align-items:center;justify-content:center;min-height:40px;min-width:40px;padding:0;font-size:15px;line-height:1;border:1px solid color-mix(in srgb,#e5534b 55%,var(--ps-modal-border));border-radius:var(--ps-radius-sm);background:color-mix(in srgb,#e5534b 16%,var(--ps-surface));color:#ff8a80;transition:background .12s ease,border-color .12s ease,transform .12s ease}.ps-stop-button:hover:not(:disabled){background:color-mix(in srgb,#e5534b 30%,var(--ps-surface));border-color:#e5534b}.ps-stop-button:disabled{cursor:default}.ps-stop-button.is-stopping{animation:ps-stop-pulse 1s ease-in-out infinite}@keyframes ps-stop-pulse{50%{opacity:.35}}.ps-send-button.is-inline{min-height:40px;min-width:40px;padding:0;border-radius:var(--ps-radius-sm);font-size:18px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.ps-mobile-nav{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.ps-modal-backdrop{position:fixed;inset:0;background:var(--ps-modal-backdrop);display:flex;align-items:center;justify-content:center;padding:16px;z-index:50}.ps-modal{width:min(900px,100%);max-height:min(86vh,900px);overflow:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y;scrollbar-gutter:stable both-edges;border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-md);background:var(--ps-modal-background);color:var(--ps-modal-foreground);padding:18px;box-shadow:0 30px 80px #0006}.ps-scroll-panel::-webkit-scrollbar,.ps-action-list::-webkit-scrollbar,.ps-panel-sticky.is-scroll-sync::-webkit-scrollbar,.ps-modal::-webkit-scrollbar{width:var(--ps-scrollbar-size);height:var(--ps-scrollbar-size)}.ps-scroll-panel::-webkit-scrollbar-track,.ps-action-list::-webkit-scrollbar-track,.ps-panel-sticky.is-scroll-sync::-webkit-scrollbar-track,.ps-modal::-webkit-scrollbar-track{background:transparent}.ps-scroll-panel::-webkit-scrollbar-thumb,.ps-action-list::-webkit-scrollbar-thumb,.ps-panel-sticky.is-scroll-sync::-webkit-scrollbar-thumb,.ps-modal::-webkit-scrollbar-thumb{background:var(--ps-scrollbar-thumb);border:2px solid transparent;border-radius:999px;background-clip:padding-box;min-height:28px}.ps-scroll-panel::-webkit-scrollbar-thumb:hover,.ps-action-list::-webkit-scrollbar-thumb:hover,.ps-panel-sticky.is-scroll-sync::-webkit-scrollbar-thumb:hover,.ps-modal::-webkit-scrollbar-thumb:hover{background:var(--ps-scrollbar-thumb-hover);border:2px solid transparent;background-clip:padding-box}.ps-scroll-panel::-webkit-scrollbar-corner,.ps-action-list::-webkit-scrollbar-corner,.ps-panel-sticky.is-scroll-sync::-webkit-scrollbar-corner,.ps-modal::-webkit-scrollbar-corner{background:transparent}.ps-modal.is-narrow{width:min(560px,100%)}.ps-modal.is-wide{width:min(980px,100%)}.ps-modal.is-theme-picker{max-height:min(57vh,600px)}.ps-modal-header,.ps-modal-footer{display:flex;align-items:center;justify-content:space-between;gap:12px}.ps-modal-title,.ps-modal-details-title,.ps-filter-title{font-size:16px;font-weight:700}.ps-modal-grid{display:grid;grid-template-columns:minmax(280px,1fr) minmax(260px,.9fr);gap:16px;margin:16px 0}.ps-modal-list,.ps-modal-details{display:flex;flex-direction:column;gap:10px}.ps-modal-list-heading-line,.ps-modal-list-line,.ps-modal-detail-line{display:block;width:100%;text-align:left}.ps-modal-list-button.is-hanging .ps-modal-list-line{padding-left:1.5rem;text-indent:-1.15rem}.ps-modal-list-button.is-disabled{opacity:.55;cursor:not-allowed}.ps-filter-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin:18px 0}.ps-filter-column{display:flex;flex-direction:column;gap:10px}.ps-list-button,.ps-filter-option{justify-content:flex-start;text-align:left}.ps-modal-close{color:var(--ps-muted)}.portal-primary-button:hover,.portal-secondary-button:hover,.ps-toolbar-button:hover,.ps-mini-button:hover,.ps-send-button:hover,.ps-modal-button:hover,.ps-mobile-nav-button:hover,.ps-tab:hover,.ps-filter-option:hover,.ps-list-button:hover,.ps-modal-close:hover,.ps-column-resizer:hover{transform:translateY(-1px);border-color:color-mix(in srgb,var(--ps-modal-selected-border) 70%,var(--ps-modal-border))}@media(max-width:920px){:root{--ps-font-size-base: 13px;--ps-font-size-dense: 12px}.portal-main{padding:8px}.portal-header{grid-template-columns:minmax(0,1fr) auto;align-items:start;padding:8px 10px}.portal-header-user{gap:8px;align-self:start}.ps-toolbar{align-items:stretch}.ps-toolbar.is-mobile{gap:6px}.ps-toolbar.is-mobile .ps-toolbar-row{flex-wrap:nowrap}.ps-toolbar.is-mobile .ps-icon-button{flex:0 0 auto;padding:8px 9px}.ps-toolbar.is-mobile .ps-toolbar-status{margin-left:auto;max-width:44%;min-width:0;text-align:right}.ps-toolbar-status{max-width:40%;font-size:9px}.ps-chat-focus-rail{flex-wrap:wrap}.ps-chat-focus-status{width:100%;margin-left:0}.ps-chat-focus-overlay{left:8px;right:8px;width:auto;max-width:none;min-width:0}.ps-chat-focus-shell .ps-chat-table-wrap,.ps-chat-focus-shell .ps-md-table-wrap{max-width:100%}.ps-chat-table-wrap.is-fit-width.has-flex-column,.ps-md-table-wrap.is-fit-width.has-flex-column{overflow-x:hidden}.ps-chat-table.is-fit-width.has-flex-column,.ps-md-table.is-fit-width.has-flex-column{display:block;width:100%;min-width:0;table-layout:auto}.ps-chat-table.is-fit-width.has-flex-column colgroup,.ps-chat-table.is-fit-width.has-flex-column thead,.ps-md-table.is-fit-width.has-flex-column colgroup,.ps-md-table.is-fit-width.has-flex-column thead{display:none}.ps-chat-table.is-fit-width.has-flex-column tbody,.ps-md-table.is-fit-width.has-flex-column tbody{display:flex;flex-direction:column}.ps-chat-table.is-fit-width.has-flex-column tr,.ps-md-table.is-fit-width.has-flex-column tr{display:grid;gap:0;border-bottom:1px solid color-mix(in srgb,var(--ps-border) 34%,transparent)}.ps-chat-table.is-fit-width.has-flex-column tr:last-child,.ps-md-table.is-fit-width.has-flex-column tr:last-child{border-bottom:0}.ps-chat-table.is-fit-width.has-flex-column td,.ps-md-table.is-fit-width.has-flex-column td{display:grid;grid-template-columns:minmax(7ch,.34fr) minmax(0,1fr);gap:8px;align-items:start;padding:6px 8px;border-right:0;border-bottom:0;min-width:0;overflow-wrap:anywhere;word-break:break-word}.ps-md-table.is-fit-width.has-flex-column td{padding:7px 10px}.ps-chat-table.is-fit-width.has-flex-column td[data-label]:before,.ps-md-table.is-fit-width.has-flex-column td[data-label]:before{content:attr(data-label);min-width:0;color:var(--ps-muted);font-weight:700;overflow-wrap:anywhere;word-break:break-word}.ps-chat-table.is-fit-width.has-flex-column .ps-table-cell-value,.ps-md-table.is-fit-width.has-flex-column .ps-table-cell-value{min-width:0;overflow-wrap:anywhere;word-break:break-word}.ps-chat-composer{padding:4px 6px 6px}.ps-status-right{display:none}.ps-status-strip{justify-content:flex-start}.ps-modal-grid{grid-template-columns:1fr}.ps-files-grid{grid-template-rows:minmax(160px,1fr) minmax(260px,1.4fr)}.ps-panel-header{flex-wrap:nowrap}.ps-panel-title{min-width:0;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ps-panel-actions{flex:0 0 auto;flex-wrap:nowrap}.ps-column-resizer{display:none}.ps-mobile-session-pane{max-height:min(22vh,148px)}.ps-mobile-session-pane .ps-panel-body,.ps-mobile-session-pane .ps-action-list{min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;touch-action:pan-y}.ps-modal{max-height:82svh;padding:12px}.ps-modal-header,.ps-modal-footer{flex-wrap:wrap;row-gap:8px}.ps-mobile-pane-fill>.ps-panel .ps-scroll-panel,.ps-mobile-pane-fill>.ps-panel .ps-panel-body{flex:1}}.ps-admin-console{display:flex;flex-direction:column;gap:16px;padding:18px 22px;flex:1;min-height:0;overflow:auto;background:var(--ps-panel-background, var(--ps-background));border:1px solid var(--ps-border);border-radius:6px;margin:8px}.ps-admin-console__header{display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:1px solid var(--ps-border);padding-bottom:8px}.ps-admin-console__header h2{margin:0;font-size:16px}.ps-admin-console__identity dl{display:grid;grid-template-columns:max-content 1fr;gap:4px 12px;margin:0;font-size:13px}.ps-admin-console__identity dt{color:var(--ps-muted)}.ps-admin-console__identity dd{margin:0}.ps-admin-console__section{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ps-border);border-radius:6px;padding:12px 14px}.ps-admin-console__section h3{margin:0;font-size:14px}.ps-admin-console__hint{margin:0;color:var(--ps-muted);font-size:12px}.ps-admin-console__status{margin:0;font-size:12px;color:var(--ps-muted)}.ps-admin-console__system-toggle{display:flex;align-items:center;gap:8px;margin:2px 0;font-size:12px;color:var(--ps-fg);cursor:pointer;-webkit-user-select:none;user-select:none}.ps-admin-console__system-toggle input{accent-color:var(--ps-accent, #4a9eff)}.ps-admin-console__status.is-error{color:var(--ps-error, #d33)}.ps-admin-console__error{border:1px solid var(--ps-error, #d33);background:color-mix(in srgb,var(--ps-error, #d33) 10%,transparent);color:var(--ps-error, #d33);padding:8px 10px;border-radius:4px;font-size:12px}.ps-admin-console__form{display:flex;flex-direction:column;gap:8px}.ps-admin-console__form input{font-family:var(--ps-font-mono, monospace);padding:6px 8px;border:1px solid var(--ps-border);border-radius:4px;background:var(--ps-background);color:var(--ps-foreground)}.ps-admin-console__actions{display:flex;gap:8px;flex-wrap:wrap}.portal-dev-banner{display:flex;align-items:center;justify-content:center;gap:8px;padding:6px 12px;border-radius:var(--ps-radius-sm);background:repeating-linear-gradient(-45deg,#eab30838,#eab30838 12px,#eab3081a 12px 24px);border:1px solid rgba(234,179,8,.55);color:var(--ps-foreground);font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;margin-bottom:14px}.portal-dev-banner.is-fixed{border-radius:0;border-left:none;border-right:none;border-top:none;margin-bottom:0}.portal-dev-persona-list{display:flex;flex-direction:column;gap:8px;margin-top:20px}.portal-dev-persona-button{display:flex;align-items:center;gap:12px;width:100%;padding:10px 14px;border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-sm);background:color-mix(in srgb,var(--ps-surface) 94%,transparent);color:var(--ps-foreground);cursor:pointer;text-align:left;transition:background .12s ease,border-color .12s ease}.portal-dev-persona-button:hover{background:var(--ps-highlight-background);color:var(--ps-highlight-foreground)}.portal-dev-persona-initials{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;background:color-mix(in srgb,var(--ps-foreground) 12%,transparent);font-size:11px;font-weight:700;flex:none}.portal-dev-persona-name{flex:1;font-weight:600}.portal-dev-persona-role{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ps-muted)}.portal-dev-persona-role.is-admin{color:#f59e0b;font-weight:700}.ps-access-bar{display:flex;align-items:center;gap:10px;padding:4px 6px 8px;font-size:12px;color:var(--ps-muted)}.ps-access-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid var(--ps-modal-border);background:color-mix(in srgb,var(--ps-surface) 92%,transparent);font-weight:600;white-space:nowrap}.ps-access-owner{font-style:italic}.ps-access-readonly{color:#f59e0b;font-weight:600;text-transform:uppercase;letter-spacing:.06em;font-size:11px}.ps-access-spacer{flex:1}.ps-composer-readonly{padding:12px 14px;border:1px dashed var(--ps-modal-border);border-radius:var(--ps-radius-sm);color:var(--ps-muted);font-size:13px;line-height:1.5}.ps-share-overlay{position:fixed;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:1000;padding:24px}.ps-share-modal{width:min(440px,100%);height:min(540px,85vh);display:flex;flex-direction:column;overflow-y:auto;background:var(--ps-modal-background, var(--ps-surface));border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-md);box-shadow:0 28px 80px #0006;padding:18px;color:var(--ps-foreground)}.ps-share-modal-head{display:flex;align-items:center;justify-content:space-between;font-size:16px;font-weight:700;margin-bottom:12px}.ps-link-modal{width:min(480px,100%);max-height:80vh;overflow-y:auto;background:var(--ps-modal-background, var(--ps-surface));border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-md);box-shadow:0 28px 80px #0006;padding:18px;color:var(--ps-foreground)}.ps-link-row{display:flex;gap:8px;margin-top:12px}.ps-link-input{flex:1;min-width:0;font-family:var(--ps-mono, monospace);font-size:12px;padding:8px 10px;color:var(--ps-foreground);background:var(--ps-background);border:1px solid var(--ps-border);border-radius:var(--ps-radius-sm)}.ps-link-warn{margin-top:12px;padding:8px 10px;font-size:12px;color:var(--ps-foreground);background:color-mix(in srgb,var(--ps-warning, #d0a215) 16%,transparent);border:1px solid color-mix(in srgb,var(--ps-warning, #d0a215) 45%,transparent);border-radius:var(--ps-radius-sm)}.ps-share-section-label{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ps-muted);margin:14px 0 6px}.ps-manage-tabs{display:flex;gap:6px;margin-bottom:12px}.ps-manage-tab{flex:1 1 0;text-align:center;appearance:none;background:transparent;color:var(--ps-muted);font:inherit;font-size:13px;padding:8px 14px;cursor:pointer;border:1px solid transparent;border-radius:8px}.ps-manage-tab:hover{color:var(--ps-foreground)}.ps-manage-tab:focus{outline:none}.ps-manage-tab:focus-visible{outline:none;color:var(--ps-foreground);border-color:color-mix(in srgb,var(--ps-highlight-background) 45%,transparent)}.ps-manage-tab.is-active{color:var(--ps-foreground);font-weight:600;border-color:var(--ps-highlight-background);background:color-mix(in srgb,var(--ps-highlight-background) 14%,transparent)}.ps-manage-model-current{flex:1;font-family:var(--ps-mono, monospace);font-size:13px;color:var(--ps-foreground);overflow-wrap:anywhere}.ps-manage-apply-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:14px;padding-top:12px;border-top:1px solid var(--ps-border)}.ps-mini-button.ps-manage-apply:disabled{background:transparent;color:var(--ps-muted);border-color:color-mix(in srgb,var(--ps-border) 60%,transparent);opacity:.5;cursor:not-allowed}.ps-share-radio{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--ps-radius-sm);cursor:pointer;font-size:13px}.ps-share-radio.is-active{background:color-mix(in srgb,var(--ps-highlight-background) 22%,transparent)}.ps-share-radio-glyph{width:18px;text-align:center}.ps-share-radio-hint{color:var(--ps-muted);font-size:11px;margin-left:auto}.ps-share-grant-row,.ps-share-add-row,.ps-share-link-row{display:flex;align-items:center;gap:8px;padding:5px 0}.ps-share-link-row .ps-share-section-sub{margin:0}.ps-share-grant-name{flex:1;font-size:13px}.ps-share-grant-access{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ps-muted)}.ps-share-empty{color:var(--ps-muted);font-size:12px;padding:4px 0}.ps-share-add-input{flex:1;padding:6px 8px;border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-sm);background:var(--ps-background);color:var(--ps-foreground);font-size:13px}.ps-share-add-select{padding:6px 8px;border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-sm);background:var(--ps-background);color:var(--ps-foreground);font-size:13px}.ps-share-error{margin-top:10px;color:#ef4444;font-size:12px}.ps-share-foot-hint{margin-top:14px;color:var(--ps-muted);font-size:11px}.ps-share-section-sub{color:var(--ps-muted);font-size:11px;line-height:1.4;margin:-2px 0 6px}.ps-share-add-wrap{position:relative}.ps-share-suggestions{display:flex;flex-direction:column;margin-top:4px;border:1px solid var(--ps-modal-border);border-radius:var(--ps-radius-sm);background:var(--ps-background);max-height:108px;overflow-y:auto}.ps-share-suggestion{display:flex;align-items:baseline;gap:8px;padding:7px 10px;border:none;background:transparent;color:var(--ps-foreground);cursor:pointer;text-align:left;font-size:13px}.ps-share-suggestion:hover{background:var(--ps-highlight-background);color:var(--ps-highlight-foreground)}.ps-share-suggestion-name{font-weight:600}.ps-share-suggestion-email{color:var(--ps-muted);font-size:11px}.ps-share-suggestion:hover .ps-share-suggestion-email{color:inherit}.ps-icon-button{position:relative;min-width:44px;padding:8px 12px;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:manipulation}.ps-icon-button-glyph{display:inline-flex;align-items:center;justify-content:center;font-size:20px;line-height:1;letter-spacing:-.02em}.ps-icon-tooltip{position:fixed;max-width:220px;white-space:normal;text-align:center;background:var(--ps-foreground);color:var(--ps-background);padding:5px 9px;border-radius:var(--ps-radius-sm);font-size:11px;line-height:1.35;font-weight:500;z-index:100000;pointer-events:none;box-shadow:0 6px 18px #0006}.ps-icon-tooltip.is-below{transform:translate(-50%)}.ps-icon-tooltip.is-above{transform:translate(-50%,-100%)}.ps-share-glyph{width:18px;height:18px;display:block}