@opengeni/react 6.1.0 → 7.0.0-canary.35585322809001

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 (206) hide show
  1. package/README.md +83 -2
  2. package/dist/artifacts-document.js +1 -1
  3. package/dist/artifacts-presentation.js +1 -1
  4. package/dist/artifacts-spreadsheet.js +1 -1
  5. package/dist/artifacts.js +3 -3
  6. package/dist/{browser-viewer-NTD6UIPR.js → browser-viewer-LGH4IP47.js} +3 -3
  7. package/dist/capability-catalog-row.d.ts +20 -0
  8. package/dist/capability-logo-fallback.d.ts +3 -0
  9. package/dist/{chunk-NOSYBS2D.js → chunk-2VHARTBL.js} +2 -1
  10. package/dist/{chunk-VRBL3F5E.js → chunk-5GAL23FF.js} +10 -2
  11. package/dist/{chunk-VRBL3F5E.js.map → chunk-5GAL23FF.js.map} +1 -1
  12. package/dist/chunk-5UONOQ3Y.js +635 -0
  13. package/dist/chunk-5UONOQ3Y.js.map +1 -0
  14. package/dist/{chunk-NYESIADM.js → chunk-AKOMC3VO.js} +3 -3
  15. package/dist/chunk-AKOMC3VO.js.map +1 -0
  16. package/dist/chunk-BRM6FVZA.js +302 -0
  17. package/dist/chunk-BRM6FVZA.js.map +1 -0
  18. package/dist/{chunk-TDSEILUH.js → chunk-D5NOQPLR.js} +1289 -1530
  19. package/dist/chunk-D5NOQPLR.js.map +1 -0
  20. package/dist/chunk-D7GAPJ3V.js +1558 -0
  21. package/dist/chunk-D7GAPJ3V.js.map +1 -0
  22. package/dist/{chunk-5M6VTFJ5.js → chunk-GBPCZH3Y.js} +2 -2
  23. package/dist/{chunk-YBM6CQRU.js → chunk-GEN54DU5.js} +4 -4
  24. package/dist/{chunk-UMECRJRV.js → chunk-HJ5VJ4JB.js} +21 -12
  25. package/dist/chunk-HJ5VJ4JB.js.map +1 -0
  26. package/dist/{chunk-R4KRSFGA.js → chunk-IP4BUBKH.js} +3 -3
  27. package/dist/{chunk-KANFU34B.js → chunk-IYUPN32E.js} +6 -2
  28. package/dist/chunk-IYUPN32E.js.map +1 -0
  29. package/dist/{chunk-L2NBTKRX.js → chunk-JKLGJQO5.js} +193 -12
  30. package/dist/chunk-JKLGJQO5.js.map +1 -0
  31. package/dist/{chunk-NLTS7JHI.js → chunk-JPHDWKZE.js} +5 -5
  32. package/dist/{chunk-ICA6R6TW.js → chunk-OWHPKAOV.js} +28 -20
  33. package/dist/chunk-OWHPKAOV.js.map +1 -0
  34. package/dist/{chunk-24M4YBCL.js → chunk-PNAVEK2U.js} +4 -4
  35. package/dist/{chunk-45XEUVTK.js → chunk-UXE5SSNN.js} +293 -463
  36. package/dist/chunk-UXE5SSNN.js.map +1 -0
  37. package/dist/{chunk-PEI6RANI.js → chunk-VR4Z73EU.js} +203 -9
  38. package/dist/chunk-VR4Z73EU.js.map +1 -0
  39. package/dist/{chunk-HUIKIDM5.js → chunk-XMXRI5JK.js} +65 -18
  40. package/dist/chunk-XMXRI5JK.js.map +1 -0
  41. package/dist/client.d.ts +1 -1
  42. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  43. package/dist/components/chat-composer.d.ts +13 -3
  44. package/dist/components/markdown.d.ts +4 -3
  45. package/dist/components/message-timeline.d.ts +7 -2
  46. package/dist/components/preview-loading.d.ts +2 -0
  47. package/dist/components/session-capability-frame.d.ts +24 -0
  48. package/dist/components/session-chrome.d.ts +1 -2
  49. package/dist/components/session-commands.d.ts +6 -0
  50. package/dist/components/session-connection-request.d.ts +8 -0
  51. package/dist/components/session-mcp-capability-card.d.ts +22 -0
  52. package/dist/components/timeline-search.d.ts +34 -0
  53. package/dist/composer.js +7 -7
  54. package/dist/connect-account-identity.d.ts +8 -0
  55. package/dist/connect-accounts.d.ts +5 -0
  56. package/dist/connect-chooser.d.ts +6 -0
  57. package/dist/connect-panel.d.ts +9 -2
  58. package/dist/connect-setup.d.ts +5 -1
  59. package/dist/connect.d.ts +5 -21
  60. package/dist/connect.js +1268 -584
  61. package/dist/connect.js.map +1 -1
  62. package/dist/connection-catalog.d.ts +6 -1
  63. package/dist/connection-discovery.d.ts +12 -0
  64. package/dist/connection-installed.d.ts +1 -0
  65. package/dist/connection-logo.d.ts +5 -2
  66. package/dist/connection-service-logo.d.ts +8 -0
  67. package/dist/connection-service-presentation.d.ts +13 -0
  68. package/dist/connection-skeleton.d.ts +5 -0
  69. package/dist/discovery-cache.d.ts +5 -0
  70. package/dist/hooks/use-codex-accounts.d.ts +11 -5
  71. package/dist/hooks/use-connect.d.ts +22 -0
  72. package/dist/hooks/use-session-events.d.ts +5 -0
  73. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  74. package/dist/hooks/use-workspace-sessions.d.ts +2 -0
  75. package/dist/index.d.ts +8 -2
  76. package/dist/index.js +771 -793
  77. package/dist/index.js.map +1 -1
  78. package/dist/interaction.js +2 -2
  79. package/dist/machines.js +2 -2
  80. package/dist/mcp-connection-status.d.ts +14 -0
  81. package/dist/{model-policy-picker-menu-3R336DP2.js → model-policy-picker-menu-RVOQ4ZZG.js} +4 -4
  82. package/dist/model-policy.d.ts +6 -2
  83. package/dist/model-policy.js +1 -1
  84. package/dist/{platform-activity-row-DUE2W74J.js → platform-activity-row-HLOH7FW4.js} +9 -4
  85. package/dist/platform-activity-row-HLOH7FW4.js.map +1 -0
  86. package/dist/plugin-discovery.d.ts +6 -0
  87. package/dist/{queue-surface-implementation-LK3S4BIW.js → queue-surface-implementation-3RIFK2BS.js} +4 -4
  88. package/dist/realtime.js +22 -22
  89. package/dist/realtime.js.map +1 -1
  90. package/dist/session-auth-recommendation.d.ts +5 -0
  91. package/dist/session-capability-policy.d.ts +12 -0
  92. package/dist/session-ui.d.ts +2 -0
  93. package/dist/session-ui.js +14 -12
  94. package/dist/session.d.ts +1 -0
  95. package/dist/session.js +6 -4
  96. package/dist/skill-discovery.d.ts +11 -0
  97. package/dist/timeline/compaction-copy.d.ts +10 -0
  98. package/dist/timeline/projection.d.ts +3 -1
  99. package/dist/timeline/turn-summary.d.ts +2 -2
  100. package/dist/timeline/types.d.ts +22 -1
  101. package/dist/{timeline-annotation-markers-DRSTLEM6.js → timeline-annotation-markers-OY6OWR3V.js} +2 -2
  102. package/dist/{timeline-annotation-selection-IHLUGVND.js → timeline-annotation-selection-BOXA2TIN.js} +2 -2
  103. package/dist/{timeline-annotations-dialog-6Q53N5FG.js → timeline-annotations-dialog-RGY3MHL3.js} +3 -3
  104. package/package.json +3 -3
  105. package/src/assets/README.md +8 -0
  106. package/src/assets/gmail.ico +0 -0
  107. package/src/assets/outlook.ico +0 -0
  108. package/src/capability-catalog-row.tsx +94 -0
  109. package/src/capability-logo-fallback.ts +22 -0
  110. package/src/client.ts +0 -9
  111. package/src/components/artifacts/document-editor.tsx +63 -6
  112. package/src/components/artifacts/presentation-editor.tsx +214 -9
  113. package/src/components/artifacts/spreadsheet-canvas.ts +3 -8
  114. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  115. package/src/components/artifacts/spreadsheet-grid.tsx +10 -11
  116. package/src/components/chat-composer.tsx +26 -3
  117. package/src/components/composer.tsx +10 -4
  118. package/src/components/human-input-form.tsx +12 -2
  119. package/src/components/markdown.tsx +86 -4
  120. package/src/components/message-timeline.tsx +104 -36
  121. package/src/components/model-picker.tsx +11 -3
  122. package/src/components/model-policy-picker-menu.tsx +10 -3
  123. package/src/components/preview-loading.tsx +154 -0
  124. package/src/components/sandbox-workspace.tsx +20 -36
  125. package/src/components/session-capability-frame.tsx +163 -0
  126. package/src/components/session-chrome.tsx +46 -77
  127. package/src/components/session-commands.tsx +18 -0
  128. package/src/components/session-connection-request.tsx +97 -0
  129. package/src/components/session-conversation.tsx +5 -4
  130. package/src/components/session-mcp-capability-card.tsx +532 -0
  131. package/src/components/session-status.tsx +2 -2
  132. package/src/components/timeline-anchor.tsx +9 -8
  133. package/src/components/timeline-search.tsx +168 -0
  134. package/src/components/user-message-body.tsx +7 -0
  135. package/src/connect-account-identity.tsx +34 -0
  136. package/src/connect-accounts.tsx +114 -52
  137. package/src/connect-chooser.tsx +171 -39
  138. package/src/connect-panel.tsx +73 -9
  139. package/src/connect-setup.tsx +72 -25
  140. package/src/connect.ts +13 -22
  141. package/src/connection-assets.d.ts +4 -0
  142. package/src/connection-catalog.tsx +61 -39
  143. package/src/connection-discovery.tsx +235 -0
  144. package/src/connection-installed.tsx +2 -0
  145. package/src/connection-logo.tsx +18 -10
  146. package/src/connection-service-logo.tsx +55 -0
  147. package/src/connection-service-presentation.ts +46 -0
  148. package/src/connection-skeleton.tsx +16 -0
  149. package/src/conversation-timeline.ts +1 -0
  150. package/src/discovery-cache.ts +42 -0
  151. package/src/hooks/use-codex-accounts.ts +33 -14
  152. package/src/hooks/use-composer.ts +4 -5
  153. package/src/hooks/use-connect.ts +23 -0
  154. package/src/hooks/use-session-events.ts +114 -1
  155. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  156. package/src/hooks/use-workspace-sessions.ts +10 -0
  157. package/src/index.ts +22 -2
  158. package/src/mcp-connection-status.ts +35 -0
  159. package/src/model-policy.ts +21 -0
  160. package/src/plugin-details.tsx +8 -5
  161. package/src/plugin-discovery.tsx +92 -72
  162. package/src/realtime/realtime-control.tsx +6 -8
  163. package/src/session-auth-recommendation.ts +48 -0
  164. package/src/session-capability-policy.ts +83 -0
  165. package/src/session-ui.ts +2 -0
  166. package/src/session.ts +1 -0
  167. package/src/skill-discovery.tsx +101 -56
  168. package/src/timeline/compaction-copy.ts +40 -0
  169. package/src/timeline/platform-activity-row.tsx +8 -3
  170. package/src/timeline/projection.ts +74 -2
  171. package/src/timeline/shared.tsx +6 -1
  172. package/src/timeline/startup-timings.tsx +1 -1
  173. package/src/timeline/turn-summary.tsx +17 -3
  174. package/src/timeline/types.ts +22 -2
  175. package/styles/compiled.css +325 -27
  176. package/styles/connect.css +90 -15
  177. package/styles/index.css +46 -0
  178. package/styles/session-capability.css +42 -0
  179. package/dist/chunk-45XEUVTK.js.map +0 -1
  180. package/dist/chunk-HQV2I5HV.js +0 -124
  181. package/dist/chunk-HQV2I5HV.js.map +0 -1
  182. package/dist/chunk-HUIKIDM5.js.map +0 -1
  183. package/dist/chunk-ICA6R6TW.js.map +0 -1
  184. package/dist/chunk-IHQII5WO.js +0 -886
  185. package/dist/chunk-IHQII5WO.js.map +0 -1
  186. package/dist/chunk-KANFU34B.js.map +0 -1
  187. package/dist/chunk-L2NBTKRX.js.map +0 -1
  188. package/dist/chunk-NYESIADM.js.map +0 -1
  189. package/dist/chunk-PEI6RANI.js.map +0 -1
  190. package/dist/chunk-TDSEILUH.js.map +0 -1
  191. package/dist/chunk-UMECRJRV.js.map +0 -1
  192. package/dist/hooks/use-packs.d.ts +0 -32
  193. package/dist/platform-activity-row-DUE2W74J.js.map +0 -1
  194. package/src/hooks/use-packs.ts +0 -157
  195. /package/dist/{browser-viewer-NTD6UIPR.js.map → browser-viewer-LGH4IP47.js.map} +0 -0
  196. /package/dist/{chunk-NOSYBS2D.js.map → chunk-2VHARTBL.js.map} +0 -0
  197. /package/dist/{chunk-5M6VTFJ5.js.map → chunk-GBPCZH3Y.js.map} +0 -0
  198. /package/dist/{chunk-YBM6CQRU.js.map → chunk-GEN54DU5.js.map} +0 -0
  199. /package/dist/{chunk-R4KRSFGA.js.map → chunk-IP4BUBKH.js.map} +0 -0
  200. /package/dist/{chunk-NLTS7JHI.js.map → chunk-JPHDWKZE.js.map} +0 -0
  201. /package/dist/{chunk-24M4YBCL.js.map → chunk-PNAVEK2U.js.map} +0 -0
  202. /package/dist/{model-policy-picker-menu-3R336DP2.js.map → model-policy-picker-menu-RVOQ4ZZG.js.map} +0 -0
  203. /package/dist/{queue-surface-implementation-LK3S4BIW.js.map → queue-surface-implementation-3RIFK2BS.js.map} +0 -0
  204. /package/dist/{timeline-annotation-markers-DRSTLEM6.js.map → timeline-annotation-markers-OY6OWR3V.js.map} +0 -0
  205. /package/dist/{timeline-annotation-selection-IHLUGVND.js.map → timeline-annotation-selection-BOXA2TIN.js.map} +0 -0
  206. /package/dist/{timeline-annotations-dialog-6Q53N5FG.js.map → timeline-annotations-dialog-RGY3MHL3.js.map} +0 -0
package/dist/session.js CHANGED
@@ -10,9 +10,10 @@ import {
10
10
  useSessionControl,
11
11
  useSessionLineage,
12
12
  useSessionMcpApprovalPolicy
13
- } from "./chunk-KANFU34B.js";
13
+ } from "./chunk-IYUPN32E.js";
14
14
  import {
15
15
  buildTimeline,
16
+ conversationTimeline,
16
17
  createOlderHistoryLoadReceipt,
17
18
  creditExhaustedFromEvents,
18
19
  extractSessionRef,
@@ -28,22 +29,23 @@ import {
28
29
  useSession,
29
30
  useSessionEvents,
30
31
  useTurnQueue
31
- } from "./chunk-L2NBTKRX.js";
32
+ } from "./chunk-JKLGJQO5.js";
32
33
  import {
33
34
  FILE_ONLY_MESSAGE_TEXT,
34
35
  composeSendInput,
35
36
  shouldSteerOnKey,
36
37
  shouldSubmitOnKey,
37
38
  useComposer
38
- } from "./chunk-NYESIADM.js";
39
- import "./chunk-PLYRL5ER.js";
39
+ } from "./chunk-AKOMC3VO.js";
40
40
  import "./chunk-KZ73RL76.js";
41
+ import "./chunk-PLYRL5ER.js";
41
42
  import "./chunk-NEXLLTP4.js";
42
43
  export {
43
44
  FILE_ONLY_MESSAGE_TEXT,
44
45
  approvalsFromRequiresAction,
45
46
  buildTimeline,
46
47
  composeSendInput,
48
+ conversationTimeline,
47
49
  createEmbeddedSessionClient,
48
50
  createOlderHistoryLoadReceipt,
49
51
  creditExhaustedFromEvents,
@@ -1,3 +1,4 @@
1
+ import { type CapabilityCatalogStatus } from "./capability-catalog-row.js";
1
2
  export type SkillDiscoveryItem = {
2
3
  id: string;
3
4
  name: string;
@@ -23,6 +24,16 @@ export type SkillDiscoveryProps = {
23
24
  query: string;
24
25
  onImport: (url: string) => void;
25
26
  canManage: boolean;
27
+ localSkills?: readonly {
28
+ id: string;
29
+ name: string;
30
+ description?: string;
31
+ status?: CapabilityCatalogStatus;
32
+ statusLabel?: string;
33
+ onOpen: () => void;
34
+ }[];
35
+ resultLimit?: number;
36
+ onShowMore?: () => void;
26
37
  onSearch?: (() => void) | undefined;
27
38
  };
28
39
  /** Host-owned query and import flow; browse presentation is reusable independently. */
@@ -0,0 +1,10 @@
1
+ import type { ContextCompactionItem } from "./types.js";
2
+ /**
3
+ * Subtitle for a settled compaction landmark. A definitive provider rejection
4
+ * repeats deterministically for the same conversation, so it names the
5
+ * rejected field and withholds the generic retry promise; every other skip
6
+ * keeps its existing copy.
7
+ */
8
+ export declare function compactionSkipSubtitle(reason: string | null, providerRejection?: ContextCompactionItem["providerRejection"]): string;
9
+ /** `HTTP 400 invalid_request_error, param input[3].encrypted_content`; identifiers only. */
10
+ export declare function describeCompactionProviderRejection(rejection: NonNullable<ContextCompactionItem["providerRejection"]>): string;
@@ -1,7 +1,9 @@
1
1
  import { type SessionEvent, type SessionStatus } from "@opengeni/sdk";
2
2
  import type { TimelineGroup, TimelineItem } from "./types.js";
3
3
  export { toolDisplayName, mcpToolLeaf, toolMatchesLeaf } from "./tool-display-name.js";
4
- export declare function buildTimeline(events: SessionEvent[]): TimelineItem[];
4
+ export declare function buildTimeline(events: SessionEvent[], options?: {
5
+ partialStart?: boolean;
6
+ }): TimelineItem[];
5
7
  /**
6
8
  * Codex subscription web search can return private citation handles without
7
9
  * the URL annotation table that would make them resolvable. Keep the canonical
@@ -65,8 +65,8 @@ export type TurnSummaryProps = {
65
65
  items: ActivityItem[];
66
66
  /**
67
67
  * The settled verdict — or absent for a completed CLUSTER of a still-running
68
- * turn, which folds neutrally: no verdict glyph (the turn has none yet), a
69
- * quiet pulse dot in its place so alignment and the running feel both hold.
68
+ * turn, which folds neutrally. Only unfinished activity inside this summary
69
+ * animates; the parent turn may still be composing a response elsewhere.
70
70
  */
71
71
  outcome?: TurnOutcome | undefined;
72
72
  /** A short failure reason shown inline on a failed chip (never hidden). */
@@ -301,10 +301,22 @@ export type ContextCompactionItem = {
301
301
  estimatedTokensBefore: number | null;
302
302
  estimatedTokensAfter: number | null;
303
303
  skipReason: string | null;
304
+ /**
305
+ * Present only for a `summarization_failed` skip where the provider
306
+ * definitively rejected the compaction request. Content-free identifiers.
307
+ */
308
+ providerRejection: ContextCompactionProviderRejection | null;
304
309
  /** Provider implementation id for debug disclosure only. */
305
310
  implementation: string | null;
306
311
  occurredAt: string;
307
312
  };
313
+ export type ContextCompactionProviderRejection = {
314
+ httpStatus: number;
315
+ type: string | null;
316
+ code: string | null;
317
+ param: string | null;
318
+ requestId: string | null;
319
+ };
308
320
  export type MachineInputMember = {
309
321
  id: string;
310
322
  kind: "scheduled_occurrence" | "goal_continuation" | "background_command_result" | "session_wait_timeout" | "agent_message" | "agent_steer_instruction" | "child_terminal_result" | "media_generation_result" | "child_requires_action" | "child_requires_action_resolved" | "child_paused" | "child_waiting_capacity" | "child_progress";
@@ -340,6 +352,9 @@ export type AuthNeededItem = {
340
352
  turnId: string | null;
341
353
  /** The runtime surface that requested recovery, when the event is an MCP auth signal. */
342
354
  serverId: string | null;
355
+ /** Explicit recovery identity; never inferred from an opaque execution alias. */
356
+ canonicalServerId?: string | null;
357
+ connectionSubjectScope?: "workspace" | "subject" | null;
343
358
  /** Durable event family that produced this notice. */
344
359
  source?: "tool" | "credential" | "capability" | undefined;
345
360
  /** The connection's registrable domain, e.g. "linear.app". */
@@ -372,7 +387,13 @@ export type TurnEndItem = {
372
387
  failureText: string | null;
373
388
  occurredAt: string;
374
389
  };
375
- export type TimelineItem = UserMessageItem | HumanInputItem | AgentMessageItem | ReasoningItem | ToolCallItem | WorkerItem | WorkerCompletionItem | SandboxItem | StartupPhaseItem | SessionStatusItem | GoalItem | NoticeItem | ContextCompactionItem | MachineInputBatchItem | AuthNeededItem | MemoryItem | KnowledgeItem | FleetDecisionItem | TurnEndItem;
390
+ export type TimelineItem = (UserMessageItem | HumanInputItem | AgentMessageItem | ReasoningItem | ToolCallItem | WorkerItem | WorkerCompletionItem | SandboxItem | StartupPhaseItem | SessionStatusItem | GoalItem | NoticeItem | ContextCompactionItem | MachineInputBatchItem | AuthNeededItem | MemoryItem | KnowledgeItem | FleetDecisionItem | TurnEndItem) & {
391
+ /** Durable identities, independent of renderer/reconciliation keys. */
392
+ sourceEvents?: readonly {
393
+ eventId: string;
394
+ sequence: number;
395
+ }[] | undefined;
396
+ };
376
397
  /** Activity items cluster between chat messages (reasoning, tools, workers, sandbox, memory). */
377
398
  export type ActivityItem = ReasoningItem | ToolCallItem | WorkerItem | SandboxItem | StartupPhaseItem | MemoryItem | KnowledgeItem | FleetDecisionItem;
378
399
  export type TimelineGroup = {
@@ -11,7 +11,7 @@ import {
11
11
  cssEscapeAttribute,
12
12
  matchingQuoteInSource,
13
13
  occurrenceOffsets
14
- } from "./chunk-NOSYBS2D.js";
14
+ } from "./chunk-2VHARTBL.js";
15
15
  import {
16
16
  cn
17
17
  } from "./chunk-22KP6LR5.js";
@@ -162,4 +162,4 @@ export {
162
162
  TimelineAnnotationMarkers,
163
163
  timeline_annotation_markers_default as default
164
164
  };
165
- //# sourceMappingURL=timeline-annotation-markers-DRSTLEM6.js.map
165
+ //# sourceMappingURL=timeline-annotation-markers-OY6OWR3V.js.map
@@ -5,7 +5,7 @@ import {
5
5
  quoteOccurrenceIndex,
6
6
  truncateAnnotationQuote,
7
7
  visibleClientRect
8
- } from "./chunk-NOSYBS2D.js";
8
+ } from "./chunk-2VHARTBL.js";
9
9
  import {
10
10
  usePortalTokenStyle
11
11
  } from "./chunk-VZTQ73XT.js";
@@ -233,4 +233,4 @@ export {
233
233
  TimelineAnnotationSelection,
234
234
  timeline_annotation_selection_default as default
235
235
  };
236
- //# sourceMappingURL=timeline-annotation-selection-IHLUGVND.js.map
236
+ //# sourceMappingURL=timeline-annotation-selection-BOXA2TIN.js.map
@@ -3,7 +3,7 @@ import {
3
3
  AnnotationNoteField,
4
4
  AnnotationNotePreview,
5
5
  AnnotationQuoteSourceButton
6
- } from "./chunk-5M6VTFJ5.js";
6
+ } from "./chunk-GBPCZH3Y.js";
7
7
  import {
8
8
  ANNOTATION_REVIEW_DIALOG_WIDTH_PX,
9
9
  clampAnnotationDialogPlacement,
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  annotationDisplayOrdinal,
14
14
  cssEscapeAttribute
15
- } from "./chunk-NOSYBS2D.js";
15
+ } from "./chunk-2VHARTBL.js";
16
16
  import {
17
17
  usePortalTokenStyle
18
18
  } from "./chunk-VZTQ73XT.js";
@@ -259,4 +259,4 @@ export {
259
259
  TimelineAnnotationsDialog,
260
260
  timeline_annotations_dialog_default as default
261
261
  };
262
- //# sourceMappingURL=timeline-annotations-dialog-6Q53N5FG.js.map
262
+ //# sourceMappingURL=timeline-annotations-dialog-RGY3MHL3.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/react",
3
- "version": "6.1.0",
3
+ "version": "7.0.0-canary.35585322809001",
4
4
  "description": "React hooks and styled components for OpenGeni: live session streaming, chat composer, message timeline, session status, and fleet views — token-themed (CSS variables), dark-first, built on Tailwind v4 + Radix + Motion.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -133,8 +133,8 @@
133
133
  "@dnd-kit/utilities": "3.2.2",
134
134
  "@fontsource-variable/noto-sans-arabic": "5.2.10",
135
135
  "@fontsource-variable/noto-sans-jp": "5.2.10",
136
- "@opengeni/connect": "^0.2.0",
137
- "@opengeni/sdk": "^6.1.0",
136
+ "@opengeni/connect": "^0.3.0-canary.35585322809001",
137
+ "@opengeni/sdk": "^7.0.0-canary.35585322809001",
138
138
  "clsx": "^2.1.1",
139
139
  "dequal": "2.0.3",
140
140
  "lucide-react": "^1.8.0",
@@ -0,0 +1,8 @@
1
+ # Service marks
2
+
3
+ These provider-owned marks identify the connected service; they do not imply endorsement.
4
+
5
+ - `gmail.ico`: existing Gmail service mark.
6
+ - `outlook.ico`: https://outlook.live.com/favicon.ico (retrieved 2026-09-20).
7
+
8
+ The React package bundles these assets so embedding hosts do not need matching public paths or make third-party image requests for these marks.
Binary file
Binary file
@@ -0,0 +1,94 @@
1
+ import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { AlertTriangleIcon, CheckIcon, Loader2Icon, PlusIcon } from "lucide-react";
3
+
4
+ export type CapabilityCatalogStatus =
5
+ | "available"
6
+ | "added"
7
+ | "attention"
8
+ | "unavailable"
9
+ | "loading";
10
+
11
+ export type CapabilityCatalogRowProps = Omit<
12
+ ComponentPropsWithoutRef<"button">,
13
+ "children" | "onClick" | "name"
14
+ > & {
15
+ name: string;
16
+ description?: string | undefined;
17
+ icon?: ReactNode;
18
+ status?: CapabilityCatalogStatus;
19
+ statusLabel?: string | undefined;
20
+ /** Preserve opaque host status text when adopting this row without typed health. */
21
+ showStatusLabel?: boolean;
22
+ onOpen: () => void;
23
+ };
24
+
25
+ const labels: Record<CapabilityCatalogStatus, string> = {
26
+ available: "Available to add",
27
+ added: "Added",
28
+ attention: "Needs attention",
29
+ unavailable: "Unavailable",
30
+ loading: "Working",
31
+ };
32
+
33
+ /** A display-only state. The entire catalog row is the action, never this glyph. */
34
+ export function CapabilityCatalogIndicator({
35
+ status = "available",
36
+ label,
37
+ showLabel = false,
38
+ }: {
39
+ status?: CapabilityCatalogStatus;
40
+ label?: string | undefined;
41
+ showLabel?: boolean;
42
+ }) {
43
+ const Icon =
44
+ status === "added"
45
+ ? CheckIcon
46
+ : status === "attention" || status === "unavailable"
47
+ ? AlertTriangleIcon
48
+ : status === "loading"
49
+ ? Loader2Icon
50
+ : PlusIcon;
51
+ return (
52
+ <span className="og-capability-catalog-indicator" data-status={status}>
53
+ <Icon aria-hidden="true" />
54
+ <span
55
+ className={
56
+ showLabel || status === "attention" || status === "unavailable"
57
+ ? "og-capability-catalog-notice"
58
+ : "og-capability-catalog-sr-only"
59
+ }
60
+ >
61
+ {label ?? labels[status]}
62
+ </span>
63
+ </span>
64
+ );
65
+ }
66
+
67
+ /** Shared by connections, skills, and plugins: one row, one focus target, one action. */
68
+ export function CapabilityCatalogRow({
69
+ name,
70
+ description,
71
+ icon,
72
+ status = "available",
73
+ statusLabel,
74
+ showStatusLabel = false,
75
+ onOpen,
76
+ className = "",
77
+ ...props
78
+ }: CapabilityCatalogRowProps) {
79
+ return (
80
+ <button
81
+ {...props}
82
+ type="button"
83
+ className={`og-capability-catalog-row ${className}`}
84
+ onClick={onOpen}
85
+ >
86
+ {icon ? <span className="og-capability-catalog-icon">{icon}</span> : null}
87
+ <span className="og-capability-catalog-copy">
88
+ <strong>{name}</strong>
89
+ {description ? <span>{description}</span> : null}
90
+ </span>
91
+ <CapabilityCatalogIndicator status={status} label={statusLabel} showLabel={showStatusLabel} />
92
+ </button>
93
+ );
94
+ }
@@ -0,0 +1,22 @@
1
+ import type { CapabilityCatalogItem } from "@opengeni/sdk";
2
+ import gmailLogo from "./assets/gmail.ico";
3
+
4
+ /** Passive catalogue identity, shared by embedded and console surfaces. */
5
+ export function capabilityLogoFallback(
6
+ item: Pick<CapabilityCatalogItem, "id"> &
7
+ Partial<Pick<CapabilityCatalogItem, "metadata" | "mcpUrl">>,
8
+ ): string | null {
9
+ if (
10
+ item.id.startsWith("mcp:integrations-sh:gmailmcp-googleapis-com-") ||
11
+ item.mcpUrl === "https://gmailmcp.googleapis.com/mcp/v1"
12
+ )
13
+ return gmailLogo;
14
+ const original = item.metadata?.originalLogoUrl;
15
+ if (typeof original !== "string") return null;
16
+ try {
17
+ const url = new URL(original);
18
+ return url.protocol === "https:" || url.protocol === "http:" ? url.href : null;
19
+ } catch {
20
+ return null;
21
+ }
22
+ }
package/src/client.ts CHANGED
@@ -84,15 +84,6 @@ export type SessionClientLike = Pick<
84
84
  | "verifyRigChange"
85
85
  | "promoteRigChange"
86
86
  | "verifyRig"
87
- // Packs
88
- | "listPacks"
89
- | "registerPack"
90
- | "enablePack"
91
- | "previewPackInstallation"
92
- | "installPack"
93
- | "previewPackUninstall"
94
- | "uninstallPack"
95
- | "deletePack"
96
87
  // Workspaces + billing
97
88
  | "listWorkspaces"
98
89
  | "createWorkspace"
@@ -1261,6 +1261,7 @@ const ParagraphLeaf = memo(
1261
1261
  onKeyDown,
1262
1262
  }: ParagraphLeafProps) {
1263
1263
  const composing = useRef(false);
1264
+ const suppressNextEnter = useRef(false);
1264
1265
  const Tag = headingTag(paragraph.style.headingLevel);
1265
1266
  const label =
1266
1267
  paragraph.style.list?.kind === "number"
@@ -1292,6 +1293,15 @@ const ParagraphLeaf = memo(
1292
1293
  }}
1293
1294
  onCompositionEnd={(event) => {
1294
1295
  composing.current = false;
1296
+ // IME commit Enter often arrives in the same turn as compositionend.
1297
+ // Suppress that key so it cannot also insert a trailing newline, but
1298
+ // clear before the next task so a later explicit Enter still works.
1299
+ suppressNextEnter.current = true;
1300
+ queueMicrotask(() => {
1301
+ suppressNextEnter.current = false;
1302
+ });
1303
+ syncTrailingBreak(event.currentTarget);
1304
+ stabilizeCaretAfterTrailingNewline(event.currentTarget);
1295
1305
  onInput(paragraph, event.currentTarget.textContent ?? "");
1296
1306
  onSelection(paragraph);
1297
1307
  }}
@@ -1316,15 +1326,18 @@ const ParagraphLeaf = memo(
1316
1326
  onKeyDown={(event) => {
1317
1327
  onKeyDown(event, paragraph);
1318
1328
  if (event.defaultPrevented || readOnly) return;
1319
- if (event.key === "Enter" && !event.metaKey && !event.ctrlKey && !event.altKey) {
1320
- event.preventDefault();
1321
- insertPlainText(event.currentTarget, "\n");
1322
- onInput(paragraph, event.currentTarget.textContent ?? "");
1323
- onSelection(paragraph);
1324
- }
1329
+ if (event.key !== "Enter" || event.metaKey || event.ctrlKey || event.altKey) return;
1330
+ if (isDocumentImeComposing(event, composing.current)) return;
1331
+ event.preventDefault();
1332
+ if (suppressNextEnter.current) return;
1333
+ insertPlainText(event.currentTarget, "\n");
1334
+ onInput(paragraph, event.currentTarget.textContent ?? "");
1335
+ onSelection(paragraph);
1325
1336
  }}
1326
1337
  onInput={(event) => {
1327
1338
  if (!composing.current && !(event.nativeEvent as InputEvent).isComposing) {
1339
+ syncTrailingBreak(event.currentTarget);
1340
+ stabilizeCaretAfterTrailingNewline(event.currentTarget);
1328
1341
  onInput(paragraph, event.currentTarget.textContent ?? "");
1329
1342
  }
1330
1343
  }}
@@ -1348,6 +1361,9 @@ const ParagraphLeaf = memo(
1348
1361
  {segment.text}
1349
1362
  </span>
1350
1363
  ))}
1364
+ {segments.at(-1)?.text.endsWith("\n") ? (
1365
+ <br data-og-trailing-break="" aria-hidden="true" />
1366
+ ) : null}
1351
1367
  </Tag>
1352
1368
  );
1353
1369
  },
@@ -1753,6 +1769,45 @@ function selectionOffsets(root: HTMLElement | undefined): { start: number; end:
1753
1769
  };
1754
1770
  }
1755
1771
 
1772
+ const TRAILING_BREAK_ATTR = "data-og-trailing-break";
1773
+
1774
+ function isDocumentImeComposing(
1775
+ event: ReactKeyboardEvent<HTMLElement>,
1776
+ composing: boolean,
1777
+ ): boolean {
1778
+ const native = event.nativeEvent;
1779
+ return composing || native.isComposing === true || native.keyCode === 229;
1780
+ }
1781
+
1782
+ function syncTrailingBreak(root: HTMLElement): void {
1783
+ const existing = root.querySelector(`br[${TRAILING_BREAK_ATTR}]`);
1784
+ const needsBreak = (root.textContent ?? "").endsWith("\n");
1785
+ if (needsBreak && !existing) {
1786
+ const br = globalThis.document.createElement("br");
1787
+ br.setAttribute(TRAILING_BREAK_ATTR, "");
1788
+ br.setAttribute("aria-hidden", "true");
1789
+ root.appendChild(br);
1790
+ } else if (!needsBreak && existing) {
1791
+ existing.remove();
1792
+ }
1793
+ }
1794
+
1795
+ function stabilizeCaretAfterTrailingNewline(root: HTMLElement): void {
1796
+ const text = root.textContent ?? "";
1797
+ if (!text.endsWith("\n")) return;
1798
+ const selection = globalThis.getSelection?.();
1799
+ if (!selection || selection.rangeCount === 0 || !selection.isCollapsed) return;
1800
+ const offsets = selectionOffsets(root);
1801
+ if (!offsets || offsets.start !== text.length) return;
1802
+ const br = root.querySelector(`br[${TRAILING_BREAK_ATTR}]`);
1803
+ if (!br) return;
1804
+ const range = globalThis.document.createRange();
1805
+ range.setStartBefore(br);
1806
+ range.collapse(true);
1807
+ selection.removeAllRanges();
1808
+ selection.addRange(range);
1809
+ }
1810
+
1756
1811
  function insertPlainText(root: HTMLElement, text: string): void {
1757
1812
  const selection = globalThis.getSelection?.();
1758
1813
  if (!selection || selection.rangeCount === 0) return;
@@ -1761,10 +1816,12 @@ function insertPlainText(root: HTMLElement, text: string): void {
1761
1816
  range.deleteContents();
1762
1817
  const node = globalThis.document.createTextNode(text);
1763
1818
  range.insertNode(node);
1819
+ syncTrailingBreak(root);
1764
1820
  range.setStartAfter(node);
1765
1821
  range.collapse(true);
1766
1822
  selection.removeAllRanges();
1767
1823
  selection.addRange(range);
1824
+ stabilizeCaretAfterTrailingNewline(root);
1768
1825
  }
1769
1826
 
1770
1827
  function restoreSelection(