@opengeni/react 5.0.5-canary.0 → 5.0.5-canary.2

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 (55) hide show
  1. package/dist/{chunk-SCZ6SUBW.js → chunk-H63SQTGI.js} +1258 -1837
  2. package/dist/chunk-H63SQTGI.js.map +1 -0
  3. package/dist/chunk-HQV2I5HV.js +124 -0
  4. package/dist/chunk-HQV2I5HV.js.map +1 -0
  5. package/dist/chunk-M2HNWZYR.js +835 -0
  6. package/dist/chunk-M2HNWZYR.js.map +1 -0
  7. package/dist/{chunk-Z7WBDB4E.js → chunk-V3WX3TQG.js} +283 -391
  8. package/dist/chunk-V3WX3TQG.js.map +1 -0
  9. package/dist/components/message-timeline.d.ts +3 -1
  10. package/dist/composer.js +2 -1
  11. package/dist/connect-chooser.d.ts +1 -0
  12. package/dist/connect-panel.d.ts +2 -1
  13. package/dist/connect.d.ts +7 -0
  14. package/dist/connect.js +791 -183
  15. package/dist/connect.js.map +1 -1
  16. package/dist/connection-catalog.d.ts +33 -0
  17. package/dist/connection-installed.d.ts +15 -0
  18. package/dist/connection-logo.d.ts +6 -0
  19. package/dist/connection-type-picker.d.ts +6 -0
  20. package/dist/index.js +17 -12
  21. package/dist/index.js.map +1 -1
  22. package/dist/plugin-details.d.ts +14 -0
  23. package/dist/plugin-discovery.d.ts +14 -0
  24. package/dist/session-ui.d.ts +3 -0
  25. package/dist/session-ui.js +113 -2
  26. package/dist/session-ui.js.map +1 -1
  27. package/dist/skill-discovery.d.ts +29 -0
  28. package/dist/timeline/activity-rail.d.ts +3 -1
  29. package/dist/timeline/genie-loading.d.ts +24 -0
  30. package/dist/timeline/startup-preference.d.ts +3 -0
  31. package/dist/timeline/startup-timings.d.ts +4 -0
  32. package/package.json +4 -3
  33. package/src/components/message-timeline.tsx +127 -20
  34. package/src/connect-chooser.tsx +81 -21
  35. package/src/connect-panel.tsx +7 -1
  36. package/src/connect.ts +21 -0
  37. package/src/connection-catalog.tsx +153 -0
  38. package/src/connection-installed.tsx +45 -0
  39. package/src/connection-logo.tsx +29 -0
  40. package/src/connection-type-picker.tsx +36 -0
  41. package/src/hooks/use-codex-accounts.ts +1 -0
  42. package/src/plugin-details.tsx +182 -0
  43. package/src/plugin-discovery.tsx +161 -0
  44. package/src/session-ui.ts +3 -0
  45. package/src/skill-discovery.tsx +152 -0
  46. package/src/timeline/activity-rail.tsx +75 -4
  47. package/src/timeline/genie-loading.tsx +112 -0
  48. package/src/timeline/startup-preference.ts +33 -0
  49. package/src/timeline/startup-timings.tsx +145 -0
  50. package/src/timeline/turn-summary.tsx +8 -3
  51. package/styles/compiled.css +73 -0
  52. package/styles/connect.css +149 -1
  53. package/styles/index.css +15 -0
  54. package/dist/chunk-SCZ6SUBW.js.map +0 -1
  55. package/dist/chunk-Z7WBDB4E.js.map +0 -1
@@ -0,0 +1,145 @@
1
+ import type { StartupPhaseItem } from "./types";
2
+
3
+ const LABELS: Record<StartupPhaseItem["phase"], string> = {
4
+ queue: "Worker queue",
5
+ sandbox: "Sandbox",
6
+ rig: "Rig",
7
+ repository: "Repository",
8
+ files: "Files",
9
+ tools: "Tools",
10
+ model_preparation: "Runtime & model request",
11
+ provider_first_byte: "First model response",
12
+ };
13
+
14
+ export function StartupTimings({ phases }: { phases: StartupPhaseItem[] }) {
15
+ if (!phases.length)
16
+ return <p className="text-og-sm text-og-fg-subtle">No startup timings recorded yet.</p>;
17
+ const byTurn = new Map<string | null, StartupPhaseItem[]>();
18
+ for (const phase of phases) {
19
+ const group = byTurn.get(phase.turnId) ?? [];
20
+ group.push(phase);
21
+ byTurn.set(phase.turnId, group);
22
+ }
23
+ const turns = [...byTurn.entries()]
24
+ .map(([turnId, turnPhases]) => ({
25
+ turnId,
26
+ phases: turnPhases,
27
+ startedAt: turnPhases.reduce(
28
+ (earliest, phase) => (phase.startedAt < earliest ? phase.startedAt : earliest),
29
+ turnPhases[0]!.startedAt,
30
+ ),
31
+ }))
32
+ .sort((a, b) => b.startedAt.localeCompare(a.startedAt));
33
+ return (
34
+ <div className="space-y-3">
35
+ <p className="text-og-xs text-og-fg-subtle">
36
+ Each turn has its own startup. Phases can overlap; durations are not additive.
37
+ </p>
38
+ {turns.map((turn, index) => (
39
+ <StartupTurn
40
+ key={turn.turnId ?? "unassigned"}
41
+ {...turn}
42
+ latest={index === 0 && turn.turnId !== null}
43
+ />
44
+ ))}
45
+ </div>
46
+ );
47
+ }
48
+
49
+ function StartupTurn({
50
+ turnId,
51
+ phases,
52
+ startedAt,
53
+ latest,
54
+ }: {
55
+ turnId: string | null;
56
+ phases: StartupPhaseItem[];
57
+ startedAt: string;
58
+ latest: boolean;
59
+ }) {
60
+ const status = phases.some((phase) => phase.status === "failed")
61
+ ? "Failed"
62
+ : phases.some((phase) => phase.status === "running")
63
+ ? "In progress"
64
+ : phases.some((phase) => phase.status === "cancelled")
65
+ ? "Interrupted"
66
+ : "Ready";
67
+ return (
68
+ <details open={latest} className="group border-b border-og-border pb-3">
69
+ <summary className="cursor-pointer rounded py-3 text-og-sm text-og-fg-muted focus-visible:outline-2 focus-visible:outline-og-accent">
70
+ <span className="font-medium">
71
+ {turnId === null ? "Unassigned events" : latest ? "Latest turn" : "Earlier turn"}
72
+ </span>
73
+ <span className="ml-2 text-og-xs text-og-fg-subtle">
74
+ {new Date(startedAt).toLocaleTimeString([], {
75
+ hour: "2-digit",
76
+ minute: "2-digit",
77
+ second: "2-digit",
78
+ })}
79
+ </span>
80
+ <span
81
+ className={
82
+ status === "Failed"
83
+ ? "ml-2 text-og-xs text-og-status-failed"
84
+ : "ml-2 text-og-xs text-og-fg-subtle"
85
+ }
86
+ >
87
+ {status}
88
+ </span>
89
+ <span className="mt-1 block break-all pl-4 font-og-mono text-og-xs text-og-fg-subtle">
90
+ {turnId ?? "No turn ID recorded"}
91
+ </span>
92
+ </summary>
93
+ <div className="pb-2">
94
+ <p className="text-og-xs text-og-fg-subtle">
95
+ Started <time dateTime={startedAt}>{new Date(startedAt).toLocaleString()}</time>
96
+ </p>
97
+ <div className="overflow-x-auto">
98
+ <table className="w-full text-left text-og-xs">
99
+ <caption className="sr-only">
100
+ Startup phases for {turnId ?? "unassigned events"}
101
+ </caption>
102
+ <thead>
103
+ <tr className="border-b border-og-border text-og-fg-subtle">
104
+ <th scope="col" className="py-2 font-medium">
105
+ Phase
106
+ </th>
107
+ <th scope="col" className="px-3 py-2 font-medium">
108
+ Status
109
+ </th>
110
+ <th scope="col" className="py-2 text-right font-medium">
111
+ Duration
112
+ </th>
113
+ </tr>
114
+ </thead>
115
+ <tbody>
116
+ {phases.map((phase) => (
117
+ <tr
118
+ key={phase.id}
119
+ className="border-b border-og-border/40"
120
+ title={`Turn: ${phase.turnId ?? "unknown"} · Started: ${phase.startedAt}`}
121
+ >
122
+ <th scope="row" className="py-2.5 font-normal text-og-fg-muted">
123
+ {LABELS[phase.phase]}
124
+ </th>
125
+ <td
126
+ className={`px-3 py-2.5 ${phase.status === "failed" ? "text-og-status-failed" : "text-og-fg-subtle"}`}
127
+ >
128
+ {phase.status === "running" ? "In progress" : phase.status}
129
+ </td>
130
+ <td className="py-2.5 text-right font-og-mono tabular-nums text-og-fg-muted">
131
+ {phase.durationMs === null
132
+ ? "—"
133
+ : phase.durationMs < 1000
134
+ ? `${Math.round(phase.durationMs)} ms`
135
+ : `${(phase.durationMs / 1000).toFixed(1)} s`}
136
+ </td>
137
+ </tr>
138
+ ))}
139
+ </tbody>
140
+ </table>
141
+ </div>
142
+ </div>
143
+ </details>
144
+ );
145
+ }
@@ -571,9 +571,14 @@ function createTurnSummaryContext(
571
571
  const BUILT_IN_TURN_SUMMARY_FACETS: readonly TurnSummaryFacet[] = Object.freeze([
572
572
  {
573
573
  id: "steps",
574
- summarize: ({ items }) => ({
575
- content: `${items.length} ${items.length === 1 ? "step" : "steps"}`,
576
- }),
574
+ summarize: ({ items }) => {
575
+ const count = items.filter((item) => item.kind !== "startup-phase").length;
576
+ return count
577
+ ? { content: `${count} ${count === 1 ? "step" : "steps"}` }
578
+ : items.length
579
+ ? { content: "Preparation" }
580
+ : null;
581
+ },
577
582
  },
578
583
  {
579
584
  id: "files",
@@ -847,6 +847,70 @@
847
847
  pointer-events: none !important;
848
848
  z-index: -1 !important;
849
849
  }
850
+ :where(.og-root).og-genie-loading,:where(.og-root) .og-genie-loading {
851
+ display: flex;
852
+ align-items: center;
853
+ gap: 14px;
854
+ min-height: 88px;
855
+ padding: 12px 0;
856
+ }
857
+ :where(.og-root).og-genie-orb,:where(.og-root) .og-genie-orb {
858
+ width: 64px;
859
+ height: 64px;
860
+ flex: 0 0 64px;
861
+ }
862
+ :where(.og-root).og-genie-orb canvas,:where(.og-root) .og-genie-orb canvas {
863
+ display: block;
864
+ }
865
+ :where(.og-root).og-genie-copy,:where(.og-root) .og-genie-copy {
866
+ min-width: 0;
867
+ display: flex;
868
+ flex-direction: column;
869
+ align-items: flex-start;
870
+ gap: 5px;
871
+ }
872
+ :where(.og-root).og-genie-phrase,:where(.og-root) .og-genie-phrase {
873
+ color: var(--og-color-fg-muted);
874
+ font-size: var(--og-font-size-sm);
875
+ line-height: 1.5;
876
+ animation: og-genie-phrase-in .65s ease-out both;
877
+ }
878
+ :where(.og-root).og-genie-details,:where(.og-root) .og-genie-details {
879
+ color: var(--og-color-fg-subtle);
880
+ font-size: var(--og-font-size-xs);
881
+ min-height: 28px;
882
+ cursor: pointer;
883
+ border-radius: 4px;
884
+ text-align: left;
885
+ transition: color .2s;
886
+ }
887
+ :where(.og-root).og-genie-details:hover,:where(.og-root) .og-genie-details:hover {
888
+ color: var(--og-color-fg);
889
+ }
890
+ :where(.og-root).og-genie-details:focus-visible,:where(.og-root) .og-genie-details:focus-visible {
891
+ outline: 2px solid #a995e9;
892
+ outline-offset: 4px;
893
+ }
894
+ @keyframes og-genie-phrase-in {
895
+ from {
896
+ opacity: 0;
897
+ transform: translateY(3px);
898
+ }
899
+ to {
900
+ opacity: 1;
901
+ transform: translateY(0);
902
+ }
903
+ }
904
+ @media (pointer: coarse) {
905
+ :where(.og-root).og-genie-details,:where(.og-root) .og-genie-details {
906
+ min-height: 44px;
907
+ }
908
+ }
909
+ @media (prefers-reduced-motion: reduce) {
910
+ :where(.og-root).og-genie-phrase,:where(.og-root) .og-genie-phrase {
911
+ animation: none;
912
+ }
913
+ }
850
914
  :where(.og-root).pointer-events-auto,:where(.og-root) .pointer-events-auto {
851
915
  pointer-events: auto;
852
916
  }
@@ -2180,6 +2244,12 @@
2180
2244
  :where(.og-root).border-og-border-strong,:where(.og-root) .border-og-border-strong {
2181
2245
  border-color: var(--og-color-border-strong);
2182
2246
  }
2247
+ :where(.og-root).border-og-border\/40,:where(.og-root) .border-og-border\/40 {
2248
+ border-color: var(--og-color-border);
2249
+ @supports (color: color-mix(in lab, red, red)) {
2250
+ border-color: color-mix(in oklab, var(--og-color-border) 40%, transparent);
2251
+ }
2252
+ }
2183
2253
  :where(.og-root).border-og-border\/50,:where(.og-root) .border-og-border\/50 {
2184
2254
  border-color: var(--og-color-border);
2185
2255
  @supports (color: color-mix(in lab, red, red)) {
@@ -2965,6 +3035,9 @@
2965
3035
  :where(.og-root).pl-3\.5,:where(.og-root) .pl-3\.5 {
2966
3036
  padding-left: calc(var(--spacing) * 3.5);
2967
3037
  }
3038
+ :where(.og-root).pl-4,:where(.og-root) .pl-4 {
3039
+ padding-left: calc(var(--spacing) * 4);
3040
+ }
2968
3041
  :where(.og-root).pl-5,:where(.og-root) .pl-5 {
2969
3042
  padding-left: calc(var(--spacing) * 5);
2970
3043
  }
@@ -45,4 +45,152 @@
45
45
  .og-connect [role="alert"] { border-inline-start: 3px solid currentColor; padding-inline-start: .75rem; }
46
46
  @media (forced-colors: active) {
47
47
  .og-connect :where(button, select, input, section, li) { border-color: ButtonText; }
48
- }
48
+ }
49
+ /* Host-independent catalogue: override --og-* tokens or the scoped classes. */
50
+ .og-connection-catalog { display: grid; gap: 4px; color: var(--og-color-fg, inherit); font-family: var(--og-font-sans, system-ui, sans-serif); }
51
+ .og-connection-catalog-row { display: flex; align-items: center; gap: 12px; width: 100%; min-height: 64px; padding: 10px 12px; border: 0; border-radius: var(--og-radius-sm, 8px); background: transparent; color: inherit; text-align: left; cursor: pointer; font: inherit; }
52
+ .og-connection-catalog-row:hover { background: var(--og-color-surface-2, #f3f4f5); }
53
+ .og-connection-catalog-row:focus-visible { outline: 2px solid var(--og-color-accent, currentColor); outline-offset: 2px; }
54
+ .og-connection-catalog-logo { flex-shrink: 0; }
55
+ .og-connection-catalog-copy { display: grid; gap: 3px; flex: 1; min-width: 0; }
56
+ .og-connection-catalog-copy strong { font-size: 14px; font-weight: 500; }
57
+ .og-connection-catalog-copy > span { font-size: 12px; opacity: .7; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
58
+ .og-connection-catalog-status { font-size: 12px; opacity: .75; flex-shrink: 0; }
59
+ .og-connection-catalog-service { border-radius:12px; min-width:0; }
60
+ .og-connection-catalog-service[open] { background:var(--og-color-surface-1, #fff); box-shadow:inset 0 0 0 1px var(--og-color-border, #e4e6e8); }
61
+ .og-connection-catalog-service > summary { list-style:none; }
62
+ .og-connection-catalog-service > summary::-webkit-details-marker { display:none; }
63
+ .og-connection-group-chevron { transition:transform 150ms ease; }
64
+ .og-connection-catalog-service[open] .og-connection-group-chevron { transform:rotate(180deg); }
65
+ .og-connection-catalog-options { margin:0 12px 8px 60px; border-top:1px solid var(--og-color-border, #e4e6e8); padding-top:4px; }
66
+ .og-connection-option + .og-connection-option { border-top:1px solid var(--og-color-border, #e4e6e8); }
67
+ .og-connection-option .og-connection-catalog-row { min-height:48px; padding:8px 0; gap:8px; }
68
+ .og-connection-option .og-connection-catalog-copy strong { font-size:13px; }
69
+ .og-connection-option .og-connection-catalog-status { font-size:11px; }
70
+ .og-connection-option-action { display:grid; place-items:center; width:32px; flex-shrink:0; }
71
+ .og-connection-option-chevron { opacity:.5; font-size:20px; pointer-events:none; }
72
+ .og-connection-option:has(.og-connection-option-chevron) { position:relative; }
73
+ .og-connection-option:has(.og-connection-option-chevron) > button { padding-right:32px; }
74
+ .og-connection-option:has(.og-connection-option-chevron) > .og-connection-option-action { position:absolute; right:0; pointer-events:none; }
75
+ @media (max-width: 480px) { .og-connection-catalog-row { flex-wrap: wrap; } .og-connection-catalog-status { margin-left: auto; } }
76
+ .og-connection-installed { margin-block: 16px; color: inherit; font-family: var(--og-font-sans, system-ui, sans-serif); }
77
+ .og-connection-installed h2 { font-size: 13px; font-weight: 500; margin: 0 0 8px; }
78
+ .og-connection-installed h2 span { margin-left: 4px; opacity: .55; font-weight: 400; }
79
+ .og-connection-installed > div { display: flex; flex-wrap: wrap; gap: 8px; }
80
+ .og-connection-installed button { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; padding: 6px 10px; border: 0; box-shadow: none; border-radius: var(--og-radius-sm, 8px); background: transparent; color: inherit; font: inherit; font-size: 13px; cursor: pointer; }
81
+ .og-connection-installed button:hover { background: var(--og-color-surface-2, #f3f4f5); }
82
+ .og-connection-installed button:focus-visible { outline: 2px solid var(--og-color-accent, currentColor); outline-offset: 2px; }
83
+ .og-connection-type-picker { display:flex; flex-wrap:wrap; gap:4px; border:0; padding:0; margin:0 0 16px; }
84
+ .og-connection-type-picker legend { font-size:12px; margin-bottom:8px; }
85
+ .og-connection-type-picker label { position:relative; padding:8px 12px; font-size:13px; border-radius:8px; cursor:pointer; }
86
+ .og-connection-type-picker label[data-selected=true] { background:var(--og-color-surface-2,#eef0f2); box-shadow:inset 0 0 0 1px var(--og-color-border,#ccc); }
87
+ .og-connection-type-picker input { position:absolute; opacity:0; width:1px; height:1px; }
88
+ .og-connection-type-picker label:focus-within { outline:2px solid var(--og-color-accent,currentColor); outline-offset:2px; }
89
+ .og-connection-catalog-action-row { display:flex; align-items:center; gap:8px; min-width:0; }
90
+ .og-connection-catalog-action-row > .og-connection-catalog-row { flex:1; min-width:0; }
91
+ .og-connect [hidden] { display:none !important; }
92
+ .og-connect .og-connection-catalog-row { width:100%; border:0; border-radius:var(--og-radius-sm,8px); }
93
+ .og-connect .og-connection-catalog-copy > span { white-space:normal; }
94
+ .og-connection-logo { display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; box-sizing:border-box; padding:var(--og-connection-icon-padding, 0px); overflow:hidden; border-radius:var(--og-connection-icon-radius, 9px); background:var(--og-connection-icon-background, transparent); color:var(--og-connection-icon-color, inherit); font-size:14px; font-weight:600; }
95
+ .og-connection-logo img { width:100%; height:100%; object-fit:contain; padding:0; border:0; border-radius:calc(var(--og-connection-icon-radius, 9px) - var(--og-connection-icon-padding, 0px)); background:transparent; }
96
+ @media (min-width: 720px) { .og-connection-catalog[data-columns="2"] { grid-template-columns:repeat(2,minmax(0,1fr)); column-gap:24px; align-items:start; } }
97
+ .og-connection-details-action { display:grid; place-items:center; flex-shrink:0; width:36px; height:36px; padding:0; border:0; border-radius:8px; background:transparent; color:inherit; font-size:20px; cursor:pointer; }
98
+ .og-connection-details-action:hover { background:var(--og-color-surface-2,#eef0f2); }
99
+ .og-connection-details-action:focus-visible { outline:2px solid var(--og-color-accent,currentColor); outline-offset:2px; }
100
+ /* Highlight each complete option, including its trailing action. */
101
+ .og-connection-option { border-radius:8px; gap:4px; padding-inline:8px; }
102
+ .og-connection-option:hover { background:var(--og-color-surface-2,#f3f4f5); }
103
+ .og-connection-option > .og-connection-catalog-row:hover,
104
+ .og-connection-option .og-connection-details-action:hover { background:transparent; }
105
+ .og-connection-option + .og-connection-option { border-top:0; margin-top:2px; }
106
+ .og-connection-catalog-options { margin:0 12px 8px 52px; padding-top:6px; }
107
+
108
+ :where(.dark, [data-og-theme="dark"]) .og-connection-logo { --og-connection-icon-padding:2px; --og-connection-icon-background:#fafafa; --og-connection-icon-color:#34383e; }
109
+ :where([data-og-theme="light"]) .og-connection-logo { --og-connection-icon-padding:0px; --og-connection-icon-background:transparent; --og-connection-icon-color:inherit; }
110
+
111
+ .og-skill-discovery { margin-block:24px; color:inherit; font-family:var(--og-font-sans,system-ui,sans-serif); }
112
+ .og-skill-discovery header { display:flex; align-items:center; justify-content:space-between; gap:16px; margin-bottom:12px; }
113
+ .og-skill-discovery h3 { margin:0; font-size:15px; font-weight:600; }
114
+ .og-skill-discovery header > span, .og-skill-discovery p { font-size:13px; opacity:.65; }
115
+ .og-skill-discovery button { font:inherit; color:inherit; cursor:pointer; border:0; box-shadow:none; }
116
+ .og-skill-discovery button:focus-visible { outline:2px solid var(--og-color-accent,currentColor); outline-offset:2px; }
117
+ .og-skill-discovery button:disabled { cursor:default; opacity:.6; }
118
+ .og-skill-discovery button:hover:not(:disabled) { background:var(--og-color-surface-2,#eeeeee); }
119
+ .og-skill-discovery-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,320px),1fr)); gap:4px 24px; }
120
+ .og-skill-discovery-item { display:flex; align-items:center; justify-content:space-between; min-width:0; gap:16px; padding:12px; border-radius:10px; background:transparent; text-align:left; }
121
+ .og-skill-discovery-copy { display:grid; gap:4px; min-width:0; }
122
+ .og-skill-discovery-copy strong { font-size:14px; font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
123
+ .og-skill-discovery-copy > span { font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; opacity:.65; }
124
+ .og-skill-discovery-copy small { font-size:11px; opacity:.55; }
125
+ .og-skill-discovery-action { font-size:12px; opacity:.7; flex-shrink:0; }
126
+ .og-skill-discovery-error button { padding:9px 16px; border:1px solid var(--og-color-border,#888); border-radius:8px; background:var(--og-color-surface-1,transparent); font-size:13px; margin-top:12px; }
127
+ .og-skill-discovery-error { display:flex; gap:12px; align-items:center; font-size:13px; }
128
+
129
+ .og-skill-discovery-browse { color:inherit; font-size:13px; text-decoration:underline; text-underline-offset:3px; }
130
+ .og-skill-discovery-browse:focus-visible { outline:2px solid var(--og-color-accent,currentColor); outline-offset:4px; border-radius:2px; }
131
+
132
+ .og-skill-discovery .og-skill-discovery-search { display:inline-flex; align-items:center; padding:9px 14px; border:1px solid var(--og-color-border,#888); border-radius:8px; background:var(--og-color-surface-1,transparent); font-size:13px; font-weight:500; }
133
+
134
+
135
+ .og-plugin-discovery { margin-block:24px; color:inherit; }
136
+ .og-plugin-discovery header { display:flex; align-items:center; justify-content:space-between; gap:16px; margin-bottom:4px; }
137
+ .og-plugin-discovery h3 { margin:0; font-size:14px; font-weight:600; }
138
+ .og-plugin-filters { display:flex; gap:3px; padding:3px; border-radius:9px; background:color-mix(in srgb,currentColor 5%,transparent); }
139
+ .og-plugin-filters button { border:0; border-radius:6px; padding:6px 12px; background:transparent; color:inherit; font:inherit; font-size:12px; cursor:pointer; opacity:.65; }
140
+ .og-plugin-filters button[aria-pressed=true] { background:var(--og-color-surface,#ffffff); color:var(--og-color-text,#17191d); box-shadow:0 1px 3px #00000014; opacity:1; }
141
+ .og-plugin-discovery p { font-size:12px; opacity:.65; margin:10px 0 8px; }
142
+ .og-plugin-discovery-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:2px 24px; }
143
+ .og-plugin-discovery-row { display:flex; align-items:center; gap:12px; width:100%; min-width:0; min-height:64px; padding:10px 12px; text-align:left; color:inherit; background:transparent; border:0; border-radius:8px; font:inherit; cursor:pointer; }
144
+ .og-plugin-discovery-row:hover { background:color-mix(in srgb,currentColor 4%,transparent); }
145
+ .og-plugin-discovery button:focus-visible { outline:2px solid var(--og-color-accent,currentColor); outline-offset:2px; }
146
+ .og-plugin-discovery-row img { width:36px; height:36px; object-fit:contain; border-radius:8px; flex-shrink:0; }
147
+ .og-plugin-discovery-row > span:first-of-type { flex:1; min-width:0; }
148
+ .og-plugin-discovery-row strong { display:block; font-size:14px; line-height:20px; font-weight:500; text-transform:none; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
149
+ .og-plugin-description { display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:12px; line-height:18px; opacity:.65; margin-top:2px; }
150
+ .og-plugin-title { display:flex; align-items:center; gap:8px; min-width:0; }
151
+ .og-plugin-title strong { flex:1; }
152
+ .og-plugin-discovery-row small { flex-shrink:0; font-size:10px; opacity:.55; }
153
+ .og-plugin-category { display:block; font-size:10px; line-height:15px; opacity:.45; text-transform:capitalize; }
154
+ .og-plugin-open { font-size:18px; opacity:.45; transition:opacity .15s; }
155
+ .og-plugin-discovery-row:hover .og-plugin-open, .og-plugin-discovery-row:focus-visible .og-plugin-open { opacity:.65; }
156
+ .og-plugin-more { display:block; margin:20px auto; padding:10px 18px; border:1px solid #8886; border-radius:8px; color:inherit; background:transparent; cursor:pointer; }
157
+ @media(max-width:640px) { .og-plugin-discovery-grid { grid-template-columns:1fr; } }
158
+
159
+ .og-plugin-details { padding:40px 32px 28px; color:inherit; }
160
+ .og-plugin-details-header { display:flex; align-items:center; gap:16px; padding-right:20px; }
161
+ .og-plugin-details-header img { width:56px; height:56px; object-fit:contain; border-radius:12px; flex-shrink:0; }
162
+ .og-plugin-details-header h2 { margin:0; font-size:25px; line-height:1.25; font-weight:650; letter-spacing:-.6px; overflow-wrap:anywhere; }
163
+ .og-plugin-details-header p { margin:7px 0 0; font-size:13px; opacity:.6; }
164
+ .og-plugin-details-meta { display:flex; flex-wrap:wrap; gap:8px; margin-top:22px; font-size:11px; }
165
+ .og-plugin-details-meta span { padding:4px 8px; border-radius:5px; background:color-mix(in srgb,currentColor 5%,transparent); text-transform:capitalize; }
166
+ .og-plugin-details-overview { margin:28px 0; font-size:14px; line-height:1.8; }
167
+ .og-plugin-details-overview p { margin:0 0 14px; }
168
+ .og-plugin-details-excerpt { max-height:250px; overflow:hidden; mask-image:linear-gradient(#000 75%,transparent); }
169
+ .og-plugin-details-more { border:0; background:transparent; color:inherit; padding:8px 0; font:inherit; font-size:13px; font-weight:600; cursor:pointer; }
170
+ .og-plugin-details-contents { padding-top:24px; border-top:1px solid color-mix(in srgb,currentColor 12%,transparent); }
171
+ .og-plugin-details-contents h3 { margin:0 0 14px; font-size:13px; font-weight:600; }
172
+ .og-plugin-details-contents > div { display:flex; flex-wrap:wrap; gap:8px; }
173
+ .og-plugin-details-contents span { font-size:13px; border:1px solid color-mix(in srgb,currentColor 15%,transparent); border-radius:7px; padding:7px 11px; }
174
+ .og-plugin-details footer { margin-top:32px; padding-top:24px; border-top:1px solid color-mix(in srgb,currentColor 12%,transparent); }
175
+ .og-plugin-details footer a { display:flex; align-items:center; justify-content:space-between; padding:11px 14px; color:inherit; text-decoration:none; font-size:13px; font-weight:600; border-radius:8px; background:color-mix(in srgb,currentColor 7%,transparent); }
176
+ .og-plugin-details footer a:hover { background:color-mix(in srgb,currentColor 11%,transparent); }
177
+ .og-plugin-details footer p { font-size:12px; opacity:.55; margin:12px 0 0; }
178
+ .og-plugin-details a:focus-visible,.og-plugin-details button:focus-visible { outline:2px solid currentColor; outline-offset:3px; }
179
+ @media(max-width:640px) { .og-plugin-details { padding:36px 24px 24px; } }
180
+ .og-plugin-details-members { margin:28px 0; }
181
+ .og-plugin-details-members h3 { display:flex; gap:8px; align-items:center; margin:24px 0 10px; font-size:13px; font-weight:600; }
182
+ .og-plugin-details-members h3 span { opacity:.5; font-weight:400; }
183
+ .og-plugin-details-members ul { list-style:none; padding:0; margin:0; }
184
+ .og-plugin-details-members li { padding:12px 0; border-bottom:1px solid color-mix(in srgb,currentColor 10%,transparent); font-size:14px; }
185
+ .og-plugin-details-members a { display:flex; align-items:center; justify-content:space-between; gap:12px; color:inherit; text-decoration:none; }
186
+ .og-plugin-details-members a:hover strong { text-decoration:underline; }
187
+ .og-plugin-details-members strong { font-weight:500; overflow-wrap:anywhere; }
188
+ .og-plugin-details-members small { display:block; margin-top:5px; opacity:.6; font-size:12px; overflow-wrap:anywhere; }
189
+ .og-plugin-details-members p,.og-plugin-details-other { font-size:12px; opacity:.6; }
190
+ .og-plugin-details-other { margin-top:18px; }
191
+ .og-plugin-member-disabled { opacity:.45; }
192
+ .og-plugin-details footer .og-plugin-install { width:100%; padding:12px 16px; margin-top:12px; border:0; border-radius:9px; background:var(--og-color-accent,#1458d5); color:#fff; font:inherit; font-size:14px; font-weight:600; cursor:pointer; }
193
+ .og-plugin-details footer .og-plugin-install:disabled { opacity:.5; cursor:default; }
194
+ .og-plugin-details footer p[role=alert] { opacity:1; color:var(--og-color-danger,#c33); }
195
+ .og-plugin-server-heading { display:flex; align-items:center; justify-content:space-between; gap:12px; }
196
+ .og-plugin-server-heading button { border:1px solid color-mix(in srgb,currentColor 18%,transparent); background:transparent; color:inherit; border-radius:7px; padding:6px 12px; font:inherit; font-size:12px; cursor:pointer; }
package/styles/index.css CHANGED
@@ -579,3 +579,18 @@
579
579
  pointer-events: none !important;
580
580
  z-index: -1 !important;
581
581
  }
582
+
583
+ /* The upstream ThinkingOrb owns motion, visibility pausing, and reduced motion. */
584
+ .og-genie-loading { display: flex; align-items: center; gap: 14px; min-height: 88px; padding: 12px 0; }
585
+ .og-genie-orb { width: 64px; height: 64px; flex: 0 0 64px; }
586
+ .og-genie-orb canvas { display: block; }
587
+ .og-genie-copy { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 5px; }
588
+ .og-genie-phrase { color: var(--og-color-fg-muted); font-size: var(--og-font-size-sm); line-height: 1.5; animation: og-genie-phrase-in .65s ease-out both; }
589
+ .og-genie-details { color: var(--og-color-fg-subtle); font-size: var(--og-font-size-xs); min-height: 28px; cursor: pointer; border-radius: 4px; text-align: left; transition: color .2s; }
590
+ .og-genie-details:hover { color: var(--og-color-fg); }
591
+ .og-genie-details:focus-visible { outline: 2px solid #a995e9; outline-offset: 4px; }
592
+ @keyframes og-genie-phrase-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: translateY(0); } }
593
+ @media (pointer: coarse) { .og-genie-details { min-height: 44px; } }
594
+ @media (prefers-reduced-motion: reduce) {
595
+ .og-genie-phrase { animation: none; }
596
+ }