@opengeni/react 2.0.1 → 2.0.2-canary.38789554071001

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 (70) hide show
  1. package/dist/artifacts.js +4 -2
  2. package/dist/artifacts.js.map +1 -1
  3. package/dist/{browser-viewer-RZH5JVFZ.js → browser-viewer-M7BIVFTW.js} +3 -3
  4. package/dist/{chat-interactive-block-UCACTZIE.js → chat-interactive-block-BO2IWXVK.js} +3 -3
  5. package/dist/{chunk-NIIXN66Z.js → chunk-5XEXTWEM.js} +2 -2
  6. package/dist/{chunk-4JUSFDTA.js → chunk-6JFN3OWG.js} +28 -225
  7. package/dist/chunk-6JFN3OWG.js.map +1 -0
  8. package/dist/{chunk-BSIADJ4U.js → chunk-6SNDCUPB.js} +2 -2
  9. package/dist/{chunk-RRYCD3QD.js → chunk-AMVCNAGC.js} +992 -924
  10. package/dist/chunk-AMVCNAGC.js.map +1 -0
  11. package/dist/{chunk-ERLG2X3U.js → chunk-CORUP6JB.js} +3 -2
  12. package/dist/chunk-CORUP6JB.js.map +1 -0
  13. package/dist/{chunk-6JUSXDF4.js → chunk-HBXL6HWG.js} +2 -2
  14. package/dist/{chunk-HQN5AZFY.js → chunk-HGKELH6Z.js} +12 -3
  15. package/dist/{chunk-HQN5AZFY.js.map → chunk-HGKELH6Z.js.map} +1 -1
  16. package/dist/{chunk-QWA4BHC6.js → chunk-ISN726VG.js} +2 -2
  17. package/dist/{chunk-QQ5UGGGE.js → chunk-KZENYIA2.js} +16 -2
  18. package/dist/{chunk-QQ5UGGGE.js.map → chunk-KZENYIA2.js.map} +1 -1
  19. package/dist/{chunk-25YZS7TK.js → chunk-O5GPRG76.js} +4 -4
  20. package/dist/{chunk-UPP6YD2R.js → chunk-PWCBMEV2.js} +4 -4
  21. package/dist/{chunk-X6KAA43Z.js → chunk-Q26UAIXI.js} +2 -2
  22. package/dist/{chunk-U7A22SY4.js → chunk-TIHSXNBC.js} +6 -2
  23. package/dist/{chunk-U7A22SY4.js.map → chunk-TIHSXNBC.js.map} +1 -1
  24. package/dist/{chunk-2U54CHR5.js → chunk-VIUEOHXY.js} +3 -2
  25. package/dist/chunk-VIUEOHXY.js.map +1 -0
  26. package/dist/components/artifacts/artifact-sandbox.d.ts +3 -0
  27. package/dist/components/artifacts/published-html-artifact-frame.d.ts +15 -51
  28. package/dist/components/artifacts/site-view.d.ts +4 -1
  29. package/dist/components/linkified-text.d.ts +18 -0
  30. package/dist/composer-messages.js +2 -2
  31. package/dist/composer.js +4 -4
  32. package/dist/connect.js +2 -2
  33. package/dist/index.js +12 -12
  34. package/dist/interaction.js +2 -2
  35. package/dist/{latest-question-6WZQV23L.js → latest-question-CHE7E753.js} +3 -3
  36. package/dist/lib/format.d.ts +7 -0
  37. package/dist/machines.js +2 -2
  38. package/dist/{platform-activity-row-UQDQDX4C.js → platform-activity-row-5OCKOQWZ.js} +2 -2
  39. package/dist/session-ui.js +10 -10
  40. package/dist/session.js +4 -4
  41. package/dist/sites.js +1 -1
  42. package/dist/timeline/types.d.ts +1 -1
  43. package/dist/timeline-model.js +3 -3
  44. package/package.json +3 -3
  45. package/src/components/artifacts/artifact-sandbox.tsx +4 -0
  46. package/src/components/artifacts/published-html-artifact-frame.tsx +48 -321
  47. package/src/components/artifacts/site-view.tsx +5 -0
  48. package/src/components/human-input-form.tsx +19 -13
  49. package/src/components/linkified-text.tsx +79 -0
  50. package/src/components/message-timeline.tsx +4 -3
  51. package/src/hooks/use-machines.ts +4 -0
  52. package/src/lib/format.ts +25 -1
  53. package/src/timeline/platform-activity-presentation.ts +1 -0
  54. package/src/timeline/projection.ts +18 -1
  55. package/src/timeline/types.ts +1 -0
  56. package/dist/chunk-2U54CHR5.js.map +0 -1
  57. package/dist/chunk-4JUSFDTA.js.map +0 -1
  58. package/dist/chunk-ERLG2X3U.js.map +0 -1
  59. package/dist/chunk-RRYCD3QD.js.map +0 -1
  60. /package/dist/{browser-viewer-RZH5JVFZ.js.map → browser-viewer-M7BIVFTW.js.map} +0 -0
  61. /package/dist/{chat-interactive-block-UCACTZIE.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
  62. /package/dist/{chunk-NIIXN66Z.js.map → chunk-5XEXTWEM.js.map} +0 -0
  63. /package/dist/{chunk-BSIADJ4U.js.map → chunk-6SNDCUPB.js.map} +0 -0
  64. /package/dist/{chunk-6JUSXDF4.js.map → chunk-HBXL6HWG.js.map} +0 -0
  65. /package/dist/{chunk-QWA4BHC6.js.map → chunk-ISN726VG.js.map} +0 -0
  66. /package/dist/{chunk-25YZS7TK.js.map → chunk-O5GPRG76.js.map} +0 -0
  67. /package/dist/{chunk-UPP6YD2R.js.map → chunk-PWCBMEV2.js.map} +0 -0
  68. /package/dist/{chunk-X6KAA43Z.js.map → chunk-Q26UAIXI.js.map} +0 -0
  69. /package/dist/{latest-question-6WZQV23L.js.map → latest-question-CHE7E753.js.map} +0 -0
  70. /package/dist/{platform-activity-row-UQDQDX4C.js.map → platform-activity-row-5OCKOQWZ.js.map} +0 -0
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-4QYP6QUI.js";
12
12
  import {
13
13
  PublishedHtmlArtifactFrame
14
- } from "./chunk-4JUSFDTA.js";
14
+ } from "./chunk-6JFN3OWG.js";
15
15
  import {
16
16
  inlineHtmlDocument
17
17
  } from "./chunk-IGFZFLI2.js";
@@ -160,6 +160,7 @@ function ArtifactSandbox(props) {
160
160
  ...props.theme ? { theme: props.theme } : {},
161
161
  ...!focused && props.height ? { style: { height: props.height } } : {},
162
162
  ...props.toolBridge ? { toolBridge: props.toolBridge } : {},
163
+ ...props.viewer ? { viewer: props.viewer } : {},
163
164
  className: cn(
164
165
  "block h-[clamp(30rem,62vh,48rem)] w-full border-0 bg-white",
165
166
  props.fill && "h-0 min-h-0 flex-1",
@@ -390,4 +391,4 @@ export {
390
391
  DeferredChatMedia,
391
392
  ChatInteractiveBlock
392
393
  };
393
- //# sourceMappingURL=chunk-2U54CHR5.js.map
394
+ //# sourceMappingURL=chunk-VIUEOHXY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/artifacts/chat-interactive-block.tsx","../src/components/artifacts/artifact-sandbox.tsx","../src/components/artifacts/deferred-chat-media.tsx"],"sourcesContent":["import type { OpenGeniClient, ToolGatewayIdentity } from \"@opengeni/sdk\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { loadSiteSnapshot } from \"../../sites-ui\";\nimport { useOpenGeniLinkResolver } from \"../open-geni-links\";\nimport {\n ArtifactButton,\n ArtifactLabelsProvider,\n ArtifactSelect,\n useArtifactLabels,\n type ArtifactLabels,\n} from \"./artifact-chrome\";\nimport { ArtifactSandbox } from \"./artifact-sandbox\";\nimport { DeferredChatMedia } from \"./deferred-chat-media\";\nimport { inlineHtmlDocument } from \"./inline-html-document\";\nimport type { PublishedHtmlArtifactToolBridge } from \"./published-html-artifact-frame\";\n\n// Fixed chat viewports keep async Site loads and fragment resize messages from\n// moving the conversation. Full-screen remains available for larger content.\nconst INLINE_PREVIEW_HEIGHT = 360;\nconst SITE_PREVIEW_HEIGHT = 400;\nconst PREVIEW_CHROME_HEIGHT = 50;\n\n/** Reads a Site needs to render; the console client, the SDK client, or a proxy. */\nexport type SiteSnapshotClient = Pick<\n OpenGeniClient,\n \"getWorkspaceArtifact\" | \"getWorkspaceArtifactHtml\"\n> &\n Partial<Pick<OpenGeniClient, \"getWorkspaceArtifactContent\">>;\n\n/** The exact saved Site a tool bridge is pinned to (absent for inline HTML). */\nexport type SiteToolScope = {\n artifactId: string;\n siteVersionId: string;\n requestedTools: readonly ToolGatewayIdentity[];\n};\n\n/** Host-owned Site API access. Omit it and Sites render without workspace tools. */\nexport type SiteToolBridgeFactory = (\n site?: SiteToolScope,\n) => PublishedHtmlArtifactToolBridge | undefined;\n\nexport type ChatInteractiveBlockProps = {\n workspaceId: string;\n kind: \"html\" | \"site\";\n content: string;\n client: SiteSnapshotClient;\n toolBridge?: SiteToolBridgeFactory | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n /** Translations for the preview's copy; defaults to English. */\n labels?: Partial<ArtifactLabels> | undefined;\n};\n\n/**\n * Inline preview for an assistant `opengeni-html` or `opengeni-site` fence, as\n * the Opengeni console renders it. \"Open Site\" goes through the nearest\n * `resolveLink`, so a host decides where a Site opens.\n */\nexport function ChatInteractiveBlock({ labels, ...props }: ChatInteractiveBlockProps) {\n return (\n <ArtifactLabelsProvider labels={labels}>\n <InteractiveBlock {...props} />\n </ArtifactLabelsProvider>\n );\n}\n\nfunction InteractiveBlock(props: ChatInteractiveBlockProps) {\n const labels = useArtifactLabels();\n const height =\n (props.kind === \"html\" ? INLINE_PREVIEW_HEIGHT : SITE_PREVIEW_HEIGHT) + PREVIEW_CHROME_HEIGHT;\n return (\n <DeferredChatMedia\n key={`${props.workspaceId}:${props.kind}:${props.kind === \"site\" ? props.content : \"inline\"}`}\n height={height}\n actionLabel={props.kind === \"html\" ? labels.loadPreview : labels.loadSitePreview}\n >\n <div style={{ height }}>\n <LoadedChatInteractiveBlock {...props} />\n </div>\n </DeferredChatMedia>\n );\n}\n\nfunction LoadedChatInteractiveBlock(props: ChatInteractiveBlockProps) {\n const labels = useArtifactLabels();\n if (props.kind === \"html\") return <InlineHtml {...props} />;\n try {\n const value = JSON.parse(props.content);\n if (\n !value ||\n typeof value.siteId !== \"string\" ||\n !/^[0-9a-f-]{36}$/i.test(value.siteId) ||\n (value.versionId !== undefined &&\n (typeof value.versionId !== \"string\" || !/^[0-9a-f-]{36}$/i.test(value.versionId)))\n )\n throw new Error(\"Invalid Site reference\");\n return (\n <SiteEmbed\n key={`${props.workspaceId}:${value.siteId}:${value.versionId ?? \"current\"}`}\n {...props}\n siteId={value.siteId}\n initialVersionId={value.versionId}\n />\n );\n } catch {\n return <p role=\"alert\">{labels.siteReferenceInvalid}</p>;\n }\n}\n\nfunction InlineHtml({ content, toolBridge, theme }: ChatInteractiveBlockProps) {\n const labels = useArtifactLabels();\n const html = useMemo(() => inlineHtmlDocument(content), [content]);\n const bridge = useMemo(() => toolBridge?.(), [toolBridge]);\n return (\n <ArtifactSandbox\n title={labels.preview}\n showTitle={false}\n showLiveStatus={false}\n html={html}\n toolBridge={bridge}\n height={INLINE_PREVIEW_HEIGHT}\n className=\"h-full\"\n fill\n theme={theme}\n />\n );\n}\n\nfunction SiteEmbed(\n props: ChatInteractiveBlockProps & { siteId: string; initialVersionId?: string },\n) {\n const [versionId, setVersionId] = useState(props.initialVersionId);\n return (\n <SiteEmbedContent\n key={versionId ?? \"current\"}\n {...props}\n versionId={versionId}\n onVersionChange={setVersionId}\n />\n );\n}\n\nfunction SiteEmbedContent({\n workspaceId,\n client,\n toolBridge,\n theme,\n siteId,\n versionId,\n onVersionChange,\n}: ChatInteractiveBlockProps & {\n siteId: string;\n versionId?: string | undefined;\n onVersionChange: (id: string) => void;\n}) {\n const [loaded, setLoaded] = useState<{\n client: SiteSnapshotClient;\n snapshot: Awaited<ReturnType<typeof loadSiteSnapshot>>;\n } | null>(null);\n const snapshot = loaded?.client === client ? loaded.snapshot : null;\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n useEffect(() => {\n const abort = new AbortController();\n setError(false);\n setLoaded(null);\n void loadSiteSnapshot(client, workspaceId, siteId, {\n signal: abort.signal,\n ...(versionId ? { versionId } : {}),\n })\n .then((value) => {\n if (!abort.signal.aborted) setLoaded({ client, snapshot: value });\n })\n .catch(() => {\n if (!abort.signal.aborted) setError(true);\n });\n return () => abort.abort();\n }, [client, workspaceId, siteId, versionId, retry]);\n const content = snapshot?.content;\n const bridge = useMemo(\n () =>\n content\n ? toolBridge?.({\n artifactId: siteId,\n siteVersionId: content.versionId,\n requestedTools: content.requestedTools,\n })\n : undefined,\n [toolBridge, siteId, content],\n );\n const open = useOpenGeniLinkResolver()?.({ kind: \"site\", artifactId: siteId, workspaceId });\n const labels = useArtifactLabels();\n if (error)\n return (\n <p role=\"alert\">\n {labels.siteLoadFailed}{\" \"}\n <ArtifactButton size=\"sm\" onClick={() => setRetry((v) => v + 1)}>\n {labels.retry}\n </ArtifactButton>\n </p>\n );\n if (!snapshot) return <p role=\"status\">{labels.loadingSite}</p>;\n if (!content) return <p>{labels.siteUnpublished}</p>;\n return (\n <ArtifactSandbox\n title={snapshot.detail.artifact.title}\n html={content.html}\n toolBridge={bridge}\n height={SITE_PREVIEW_HEIGHT}\n className=\"h-full\"\n fill\n theme={theme}\n headerControls={\n <>\n {/* One published version has nothing to choose; keep the bar for the title. */}\n {snapshot.detail.versions.length > 1 ||\n !snapshot.detail.versions.some((v) => v.id === content.versionId) ? (\n <ArtifactSelect\n aria-label={labels.siteVersion}\n className=\"bg-transparent text-xs\"\n value={content.versionId}\n onChange={(e) => onVersionChange(e.target.value)}\n >\n {!snapshot.detail.versions.some((v) => v.id === content.versionId) && (\n <option value={content.versionId}>{labels.savedVersion}</option>\n )}\n {snapshot.detail.versions.map((v) => (\n <option key={v.id} value={v.id}>\n {labels.version(v.revision)}\n </option>\n ))}\n </ArtifactSelect>\n ) : null}\n {open?.href ? (\n <a\n className=\"shrink-0 whitespace-nowrap text-xs underline\"\n href={open.href}\n data-og-open-site=\"\"\n >\n {labels.openSite}\n </a>\n ) : open?.open ? (\n <button\n type=\"button\"\n className=\"shrink-0 cursor-pointer whitespace-nowrap text-xs underline\"\n data-og-open-site=\"\"\n onClick={() =>\n void Promise.resolve()\n .then(open.open)\n .catch(() => undefined)\n }\n >\n {labels.openSite}\n </button>\n ) : null}\n </>\n }\n />\n );\n}\n","import {\n ArrowLeftIcon,\n Globe2Icon,\n Maximize2Icon,\n PlugZapIcon,\n RefreshCwIcon,\n SparklesIcon,\n} from \"lucide-react\";\nimport { useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { SiteViewer } from \"@opengeni/sdk\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactBadge, ArtifactButton, useArtifactLabels } from \"./artifact-chrome\";\nimport {\n PublishedHtmlArtifactFrame,\n type PublishedHtmlArtifactToolBridge,\n} from \"./published-html-artifact-frame\";\n\nexport type ArtifactSandboxProps = {\n html: string;\n height?: number | undefined;\n autoHeight?: boolean | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n headerControls?: ReactNode | undefined;\n title: string;\n /** Hide the visible title/icon while retaining the accessible iframe title. */\n showTitle?: boolean | undefined;\n showLiveStatus?: boolean | undefined;\n versionLabel?: string | undefined;\n className?: string | undefined;\n editDisabled?: boolean | undefined;\n onEdit?: (() => void) | undefined;\n toolBridge?: PublishedHtmlArtifactToolBridge | undefined;\n /** Who is viewing, answered to the Site's `site.viewer` over the bridge. */\n viewer?: SiteViewer | undefined;\n connectedToolCount?: number | undefined;\n sourceFileCount?: number | undefined;\n fill?: boolean | undefined;\n};\n\n/**\n * The Site/preview frame chrome shared by the console and embedding hosts:\n * title, version and tool badges, live status, reload, and a full-screen mode\n * that escapes the host's scroll containers through the modal top layer.\n */\nexport function ArtifactSandbox(props: ArtifactSandboxProps) {\n const labels = useArtifactLabels();\n const [reloadKey, setReloadKey] = useState(0);\n const [focused, setFocused] = useState(false);\n const frameRef = useRef<HTMLDialogElement>(null);\n const modalRef = useRef(false);\n useLayoutEffect(() => {\n const frame = frameRef.current;\n if (!frame) return;\n if (focused) {\n // A fixed child of the chat timeline is still clipped and layered by its\n // scroll pane and the sibling workspace dock. The modal top layer escapes\n // both while keeping the live Site iframe mounted in the same DOM node.\n frame.close();\n frame.showModal();\n modalRef.current = true;\n } else if (modalRef.current) {\n frame.close();\n frame.show();\n modalRef.current = false;\n }\n }, [focused]);\n const reload = () => {\n setReloadKey((value) => value + 1);\n };\n return (\n <dialog\n ref={frameRef}\n open\n aria-label={props.title}\n onCancel={(event) => {\n event.preventDefault();\n setFocused(false);\n }}\n className={cn(\n \"og-root static m-0 w-full max-h-none max-w-none overflow-hidden rounded-2xl border border-border/80 bg-white p-0 text-left shadow-sm\",\n props.className,\n props.fill && \"flex min-h-0 flex-col\",\n focused &&\n \"fixed inset-0 z-50 flex h-dvh w-dvw flex-col rounded-none border-0 bg-surface shadow-none\",\n )}\n >\n <div className=\"flex min-h-12 shrink-0 items-center justify-between gap-3 border-b border-border/80 bg-surface/95 px-3 sm:px-4\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {focused ? (\n <ArtifactButton\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 shrink-0 px-2\"\n onClick={() => setFocused(false)}\n >\n <ArrowLeftIcon className=\"mr-2 size-3.5\" />\n {labels.back}\n </ArtifactButton>\n ) : null}\n {!focused && props.showTitle !== false ? (\n <span className=\"grid size-6 shrink-0 place-items-center rounded-md bg-surface-2 text-fg-muted\">\n <Globe2Icon className=\"size-3.5\" />\n </span>\n ) : null}\n {props.showTitle !== false && (\n <span className=\"truncate text-xs font-semibold text-fg\">{props.title}</span>\n )}\n {props.headerControls}\n {props.versionLabel ? (\n <ArtifactBadge className=\"hidden h-5 rounded-md border-border/80 px-1.5 text-2xs font-normal text-fg-muted sm:inline-flex\">\n {props.versionLabel}\n </ArtifactBadge>\n ) : null}\n {props.connectedToolCount ? (\n <ArtifactBadge\n className=\"hidden h-5 max-w-40 gap-1 rounded-md border-border/80 px-1.5 text-2xs font-normal text-fg-muted sm:inline-flex\"\n title={labels.toolsAvailable(props.connectedToolCount)}\n >\n <PlugZapIcon className=\"size-3\" />\n {labels.toolCount(props.connectedToolCount)}\n </ArtifactBadge>\n ) : null}\n {props.sourceFileCount ? (\n <span className=\"hidden text-2xs text-fg-subtle xl:inline\">\n {labels.sourceFileCount(props.sourceFileCount)}\n </span>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {focused && props.onEdit ? (\n <ArtifactButton\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-2\"\n disabled={props.editDisabled}\n onClick={props.onEdit}\n >\n <SparklesIcon className=\"mr-2 size-3.5\" />\n <span className=\"hidden sm:inline\">{labels.editWithAgent}</span>\n <span className=\"sm:hidden\">{labels.editShort}</span>\n </ArtifactButton>\n ) : null}\n {props.showLiveStatus !== false && (\n <span className=\"mr-1 hidden items-center gap-1.5 text-2xs font-medium text-fg-muted sm:inline-flex\">\n <span className=\"size-1.5 rounded-full bg-status-success ring-4 ring-status-success/10\" />\n {labels.live}\n </span>\n )}\n <ArtifactButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 rounded-md text-fg-muted hover:text-fg\"\n aria-label={labels.reloadSite}\n onClick={reload}\n >\n <RefreshCwIcon className=\"size-3.5\" />\n </ArtifactButton>\n {!focused ? (\n <ArtifactButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 rounded-md text-fg-muted hover:text-fg\"\n aria-label={labels.openFullScreen}\n onClick={() => setFocused(true)}\n >\n <Maximize2Icon className=\"size-3.5\" />\n </ArtifactButton>\n ) : null}\n </div>\n </div>\n <PublishedHtmlArtifactFrame\n key={reloadKey}\n title={props.title}\n html={props.html}\n autoHeight={Boolean(props.autoHeight && !focused)}\n {...(props.theme ? { theme: props.theme } : {})}\n {...(!focused && props.height ? { style: { height: props.height } } : {})}\n {...(props.toolBridge ? { toolBridge: props.toolBridge } : {})}\n {...(props.viewer ? { viewer: props.viewer } : {})}\n className={cn(\n \"block h-[clamp(30rem,62vh,48rem)] w-full border-0 bg-white\",\n props.fill && \"h-0 min-h-0 flex-1\",\n focused && \"min-h-0 flex-1\",\n )}\n />\n </dialog>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\n\n/**\n * Reserve the chat slot before starting expensive media work. Activation is\n * one-way: scrolling away must not discard an interactive preview's state.\n * The timeline parks at its initial tip in layout effects before this observer\n * is attached, so historical previews above the entry viewport stay dormant.\n */\nexport function DeferredChatMedia({\n children,\n height,\n label,\n actionLabel,\n}: {\n children: ReactNode;\n height: number;\n /** What is loading, as in \"Load {label}\". */\n label?: string | undefined;\n /** The complete (translated) activation label; overrides `label`. */\n actionLabel?: string | undefined;\n}) {\n const host = useRef<HTMLDivElement>(null);\n const [active, setActive] = useState(false);\n useEffect(() => {\n const node = host.current;\n if (active || !node) return;\n if (typeof IntersectionObserver === \"undefined\") {\n setActive(true);\n return;\n }\n let disposed = false;\n const observer = new IntersectionObserver(\n (entries) => {\n if (disposed || !entries.some((entry) => entry.isIntersecting)) return;\n setActive(true);\n observer.disconnect();\n },\n {\n root: node.closest(\"[data-og-timeline-scroller]\"),\n rootMargin: \"200px 0px\",\n },\n );\n observer.observe(node);\n return () => {\n disposed = true;\n observer.disconnect();\n };\n }, [active]);\n\n return (\n <div ref={host} data-chat-media={active ? \"active\" : \"deferred\"}>\n {active ? (\n children\n ) : (\n <div className=\"flex w-full items-center justify-center\" style={{ height }}>\n <button\n type=\"button\"\n className=\"rounded-md px-3 py-2 text-sm text-fg-muted hover:text-fg focus-visible:outline-2 focus-visible:outline-ring\"\n onClick={() => setActive(true)}\n >\n {actionLabel ?? `Load ${label ?? \"media\"}`}\n </button>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useState","useRef","useState","jsx","jsx","jsxs","useState","useEffect"]}
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode } from "react";
2
+ import type { SiteViewer } from "@opengeni/sdk";
2
3
  import { type PublishedHtmlArtifactToolBridge } from "./published-html-artifact-frame.js";
3
4
  export type ArtifactSandboxProps = {
4
5
  html: string;
@@ -15,6 +16,8 @@ export type ArtifactSandboxProps = {
15
16
  editDisabled?: boolean | undefined;
16
17
  onEdit?: (() => void) | undefined;
17
18
  toolBridge?: PublishedHtmlArtifactToolBridge | undefined;
19
+ /** Who is viewing, answered to the Site's `site.viewer` over the bridge. */
20
+ viewer?: SiteViewer | undefined;
18
21
  connectedToolCount?: number | undefined;
19
22
  sourceFileCount?: number | undefined;
20
23
  fill?: boolean | undefined;
@@ -1,6 +1,7 @@
1
- import { type OpenGeniSiteBridgeReadyMessage, type OpenGeniSiteBridgeRequestMessage, type SiteHttpRequest, type OpenGeniSiteToolCatalog } from "@opengeni/sdk/site";
2
- import type { ToolGatewayCallRequest, ToolGatewayCallResponse, ToolGatewayDeclarationsResponse, ToolGatewayResolveRequest, ToolGatewayResolvedTool, ToolGatewayInvokeRequest, ToolGatewayInvokeResponse } from "@opengeni/sdk";
1
+ import { type SiteBridgeToolHandlers } from "@opengeni/sdk/site-bridge-host";
2
+ import type { OpenGeniSiteSignInResult, OpenGeniSiteViewer } from "@opengeni/sdk/site";
3
3
  import { type CSSProperties } from "react";
4
+ export { SiteBridgeDocumentLease, SiteBridgeRequestRegistry, handleSiteBridgeRequest, openGeniSiteBridgePortFromBootstrap, siteBridgeError, siteBridgeReadyMessage, } from "@opengeni/sdk/site-bridge-host";
4
5
  export declare const PUBLISHED_HTML_ARTIFACT_IFRAME_SANDBOX: string;
5
6
  export type PublishedHtmlArtifactFrameProps = {
6
7
  html: string;
@@ -10,29 +11,19 @@ export type PublishedHtmlArtifactFrameProps = {
10
11
  className?: string;
11
12
  style?: CSSProperties;
12
13
  toolBridge?: PublishedHtmlArtifactToolBridge;
14
+ /**
15
+ * The signed-in member viewing the Site, answered to `site.viewer`. When
16
+ * omitted the frame does not advertise viewers and the SDK resolves `null`.
17
+ */
18
+ viewer?: OpenGeniSiteViewer;
19
+ /**
20
+ * Answer `site.auth.signIn()`. The console viewer is already signed in, so
21
+ * the default resolves `{ started: false }`.
22
+ */
23
+ onSignIn?: () => Promise<OpenGeniSiteSignInResult> | OpenGeniSiteSignInResult;
13
24
  };
14
- export type PublishedHtmlArtifactToolBridge = {
15
- resolve?: (request: ToolGatewayResolveRequest, options: {
16
- signal: AbortSignal;
17
- }) => Promise<ToolGatewayResolvedTool>;
18
- invoke?: (request: ToolGatewayInvokeRequest, options: {
19
- signal: AbortSignal;
20
- }) => Promise<ToolGatewayInvokeResponse>;
21
- fetch?: (request: SiteHttpRequest, signal: AbortSignal) => Promise<Response>;
22
- /** Advertise Site Data: `fetch` forwards `published-artifacts/current` routes to the pinned Site. */
23
- siteData?: boolean;
24
- catalog: (options: {
25
- signal: AbortSignal;
26
- }) => Promise<OpenGeniSiteToolCatalog>;
27
- call: (request: ToolGatewayCallRequest, options: {
28
- signal: AbortSignal;
29
- }) => Promise<ToolGatewayCallResponse>;
30
- declarations?: (options: {
31
- signal: AbortSignal;
32
- }) => Promise<ToolGatewayDeclarationsResponse>;
33
- };
34
- /** Capabilities the host advertises when a Site connects; Sites never ask for more. */
35
- export declare function siteBridgeReadyMessage(bridge: PublishedHtmlArtifactToolBridge | undefined): OpenGeniSiteBridgeReadyMessage;
25
+ /** Host handlers for Site tools and the Site HTTP channel (see `@opengeni/sdk/site-bridge-host`). */
26
+ export type PublishedHtmlArtifactToolBridge = SiteBridgeToolHandlers;
36
27
  export declare function publishedHtmlArtifactDocument(html: string, toolBridgeEnabled: boolean): string;
37
28
  /**
38
29
  * Render exact published HTML in an opaque-origin iframe. Artifact scripts,
@@ -41,30 +32,3 @@ export declare function publishedHtmlArtifactDocument(html: string, toolBridgeEn
41
32
  * or top-level navigation.
42
33
  */
43
34
  export declare function PublishedHtmlArtifactFrame(props: PublishedHtmlArtifactFrameProps): import("react").JSX.Element;
44
- export declare class SiteBridgeRequestRegistry {
45
- private readonly controllersByPort;
46
- addPort(port: MessagePort): void;
47
- start(port: MessagePort, requestId: string): AbortController | null;
48
- cancel(port: MessagePort, requestId: string): void;
49
- complete(port: MessagePort, requestId: string, controller: AbortController): void;
50
- closePort(port: MessagePort): void;
51
- closeAll(): void;
52
- }
53
- export declare class SiteBridgeDocumentLease {
54
- private readonly attachToolPort;
55
- private readonly closeActivePorts;
56
- private readonly createMessageChannel;
57
- private loaded;
58
- private bootstrapPort;
59
- constructor(attachToolPort: (data: unknown, ports: readonly MessagePort[]) => void, closeActivePorts: () => void, createMessageChannel?: () => MessageChannel);
60
- load(frameWindow: Pick<Window, "postMessage">): boolean;
61
- close(): void;
62
- }
63
- export declare function openGeniSiteBridgePortFromBootstrap(data: unknown, ports: readonly MessagePort[]): MessagePort | null;
64
- export declare function handleSiteBridgeRequest(bridge: PublishedHtmlArtifactToolBridge | undefined, message: OpenGeniSiteBridgeRequestMessage, signal: AbortSignal): Promise<OpenGeniSiteToolCatalog | ToolGatewayCallResponse | ToolGatewayDeclarationsResponse | ToolGatewayResolvedTool | ToolGatewayInvokeResponse>;
65
- export declare function siteBridgeError(error: unknown, legacyCall?: boolean): {
66
- code: string;
67
- message: string;
68
- retryable: boolean;
69
- outcomeUnknown: boolean;
70
- };
@@ -1,3 +1,4 @@
1
+ import type { SiteViewer } from "@opengeni/sdk";
1
2
  import type { SiteSnapshotClient, SiteToolBridgeFactory } from "./chat-interactive-block.js";
2
3
  export type SiteViewProps = {
3
4
  client: SiteSnapshotClient;
@@ -5,6 +6,8 @@ export type SiteViewProps = {
5
6
  siteId: string;
6
7
  /** Host-owned Site API access. Omit it and the Site renders without workspace tools. */
7
8
  toolBridge?: SiteToolBridgeFactory | undefined;
9
+ /** Who is viewing, answered to the Site's `site.viewer`. */
10
+ viewer?: SiteViewer | undefined;
8
11
  theme?: "light" | "dark" | undefined;
9
12
  /** Shown instead of the archived notice; the console links to its full page. */
10
13
  archivedMessage?: string | undefined;
@@ -20,4 +23,4 @@ export type SiteViewProps = {
20
23
  * A published Site filling its container: the console's session dock and an
21
24
  * embedding host's artifact viewer render the same view.
22
25
  */
23
- export declare function SiteView({ client, workspaceId, siteId, toolBridge, theme, archivedMessage, showTitle, loadingLabel, onTitle, className, }: SiteViewProps): import("react").JSX.Element;
26
+ export declare function SiteView({ client, workspaceId, siteId, toolBridge, viewer, theme, archivedMessage, showTitle, loadingLabel, onTitle, className, }: SiteViewProps): import("react").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from "react";
2
+ export declare const LINKIFIED_LINK_CLASS = "font-medium og-link [overflow-wrap:anywhere]";
3
+ type Segment = {
4
+ kind: "text";
5
+ value: string;
6
+ } | {
7
+ kind: "link";
8
+ value: string;
9
+ };
10
+ /** Split plain text into text and bare http(s) URL segments. */
11
+ export declare function linkifySegments(text: string): Segment[];
12
+ /**
13
+ * Render plain text with bare http(s) URLs as links that open in a new tab and
14
+ * wrap anywhere, so a long sign-in or approval URL stays clickable and inside
15
+ * its card. Non-string nodes pass through unchanged.
16
+ */
17
+ export declare function linkifyText(node: ReactNode): ReactNode;
18
+ export {};
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import {
3
3
  defaultChatComposerMessages
4
- } from "./chunk-BSIADJ4U.js";
5
- import "./chunk-QQ5UGGGE.js";
4
+ } from "./chunk-6SNDCUPB.js";
5
+ import "./chunk-KZENYIA2.js";
6
6
  export {
7
7
  defaultChatComposerMessages
8
8
  };
package/dist/composer.js CHANGED
@@ -41,10 +41,10 @@ import {
41
41
  useChatComposer,
42
42
  useChatComposerController,
43
43
  useVoiceInput
44
- } from "./chunk-UPP6YD2R.js";
44
+ } from "./chunk-PWCBMEV2.js";
45
45
  import {
46
46
  defaultChatComposerMessages
47
- } from "./chunk-BSIADJ4U.js";
47
+ } from "./chunk-6SNDCUPB.js";
48
48
  import "./chunk-NX4ADH73.js";
49
49
  import {
50
50
  BillingClassMark,
@@ -54,7 +54,7 @@ import {
54
54
  PickerNavRow
55
55
  } from "./chunk-XDA5QJE7.js";
56
56
  import "./chunk-PMV53IMM.js";
57
- import "./chunk-X6KAA43Z.js";
57
+ import "./chunk-Q26UAIXI.js";
58
58
  import "./chunk-KSGQ5ODA.js";
59
59
  import "./chunk-XEA5BCMA.js";
60
60
  import "./chunk-N7S72EXK.js";
@@ -65,7 +65,7 @@ import "./chunk-KF33GTWN.js";
65
65
  import "./chunk-QHUE7E4N.js";
66
66
  import "./chunk-CM7LVUKC.js";
67
67
  import "./chunk-G76LSA76.js";
68
- import "./chunk-QQ5UGGGE.js";
68
+ import "./chunk-KZENYIA2.js";
69
69
  import "./chunk-TXS65BB2.js";
70
70
  export {
71
71
  Actions,
package/dist/connect.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  import "./chunk-M357MHH3.js";
8
8
  import {
9
9
  Markdown
10
- } from "./chunk-NIIXN66Z.js";
10
+ } from "./chunk-5XEXTWEM.js";
11
11
  import "./chunk-OYQQJL3J.js";
12
12
  import "./chunk-S2QH6EZ5.js";
13
13
  import "./chunk-4QYP6QUI.js";
@@ -18,7 +18,7 @@ import {
18
18
  } from "./chunk-PEHTX3V7.js";
19
19
  import "./chunk-KSGQ5ODA.js";
20
20
  import "./chunk-XEA5BCMA.js";
21
- import "./chunk-QQ5UGGGE.js";
21
+ import "./chunk-KZENYIA2.js";
22
22
  import "./chunk-TXS65BB2.js";
23
23
 
24
24
  // src/capability-catalog-row.tsx
package/dist/index.js CHANGED
@@ -47,7 +47,7 @@ import {
47
47
  healthPulses,
48
48
  pointsFor,
49
49
  useMachines
50
- } from "./chunk-U7A22SY4.js";
50
+ } from "./chunk-TIHSXNBC.js";
51
51
  import {
52
52
  McpConnectionCard,
53
53
  SessionCapabilityFrame,
@@ -110,7 +110,7 @@ import {
110
110
  useStartupDetails,
111
111
  useWorkspaceSessions,
112
112
  userMessageLikelyNeedsDisclosure
113
- } from "./chunk-RRYCD3QD.js";
113
+ } from "./chunk-AMVCNAGC.js";
114
114
  import {
115
115
  useThemeType
116
116
  } from "./chunk-B27E3V37.js";
@@ -150,14 +150,14 @@ import {
150
150
  useSessionEvents,
151
151
  useTurnQueue,
152
152
  useWorkspaceModelCatalog
153
- } from "./chunk-25YZS7TK.js";
153
+ } from "./chunk-O5GPRG76.js";
154
154
  import {
155
155
  buildTimeline,
156
156
  creditExhaustedFromEvents,
157
157
  extractSessionRef,
158
158
  groupTimeline,
159
159
  sessionStatusFromEvents
160
- } from "./chunk-HQN5AZFY.js";
160
+ } from "./chunk-HGKELH6Z.js";
161
161
  import {
162
162
  OpenGeniProvider,
163
163
  invalidateSharedQueries,
@@ -187,7 +187,7 @@ import {
187
187
  sandboxFileLocationFromHref,
188
188
  sandboxFilePathFromHref,
189
189
  useSecretsUi
190
- } from "./chunk-NIIXN66Z.js";
190
+ } from "./chunk-5XEXTWEM.js";
191
191
  import "./chunk-OYQQJL3J.js";
192
192
  import "./chunk-S2QH6EZ5.js";
193
193
  import {
@@ -220,8 +220,8 @@ import {
220
220
  tailPeek,
221
221
  unwrapMcpOutput,
222
222
  v4aToGitFileDiff
223
- } from "./chunk-6JUSXDF4.js";
224
- import "./chunk-ERLG2X3U.js";
223
+ } from "./chunk-HBXL6HWG.js";
224
+ import "./chunk-CORUP6JB.js";
225
225
  import "./chunk-5YJLGOM5.js";
226
226
  import {
227
227
  humanInputRequestFromEvent,
@@ -282,10 +282,10 @@ import {
282
282
  useSlashCommands,
283
283
  useTranscription,
284
284
  useVoiceInput
285
- } from "./chunk-UPP6YD2R.js";
285
+ } from "./chunk-PWCBMEV2.js";
286
286
  import {
287
287
  defaultChatComposerMessages
288
- } from "./chunk-BSIADJ4U.js";
288
+ } from "./chunk-6SNDCUPB.js";
289
289
  import "./chunk-NX4ADH73.js";
290
290
  import {
291
291
  BillingClassMark,
@@ -307,7 +307,7 @@ import {
307
307
  shouldSteerOnKey,
308
308
  shouldSubmitOnKey,
309
309
  useComposer
310
- } from "./chunk-X6KAA43Z.js";
310
+ } from "./chunk-Q26UAIXI.js";
311
311
  import {
312
312
  LightboxProvider,
313
313
  Tooltip,
@@ -377,7 +377,7 @@ import {
377
377
  stringifyPayload,
378
378
  truncate,
379
379
  tryParseJson
380
- } from "./chunk-QQ5UGGGE.js";
380
+ } from "./chunk-KZENYIA2.js";
381
381
  import {
382
382
  SandboxTerminal,
383
383
  terminalCanAcquirePty,
@@ -3830,7 +3830,7 @@ function FilesTabBody(props) {
3830
3830
  return /* @__PURE__ */ jsx6(Suspense, { fallback: /* @__PURE__ */ jsx6(WorkbenchSurfaceLoading, { name: "Files" }), children: /* @__PURE__ */ jsx6(LazySandboxFiles, { ...props }) });
3831
3831
  }
3832
3832
  var LazyBrowserViewer = lazy(async () => {
3833
- const { BrowserViewer } = await import("./browser-viewer-RZH5JVFZ.js");
3833
+ const { BrowserViewer } = await import("./browser-viewer-M7BIVFTW.js");
3834
3834
  return { default: BrowserViewer };
3835
3835
  });
3836
3836
  var LazyComputerViewer = lazy(async () => {
@@ -8,7 +8,7 @@ import {
8
8
  useBrowserSession,
9
9
  useBrowserSessions,
10
10
  useSiteAuthConnections
11
- } from "./chunk-QWA4BHC6.js";
11
+ } from "./chunk-ISN726VG.js";
12
12
  import {
13
13
  ComputerViewer,
14
14
  useComputerFrameStream,
@@ -30,7 +30,7 @@ import {
30
30
  useEmbeddedInteraction,
31
31
  useEmbeddedInterventions
32
32
  } from "./chunk-G76LSA76.js";
33
- import "./chunk-QQ5UGGGE.js";
33
+ import "./chunk-KZENYIA2.js";
34
34
  import "./chunk-TNEZNMSN.js";
35
35
  import "./chunk-5I4VRWBB.js";
36
36
  import "./chunk-TXS65BB2.js";
@@ -3,9 +3,9 @@ import {
3
3
  isTimelineUserQuestion,
4
4
  isTurnExecutionEvidence,
5
5
  timelineQuestionPlacement
6
- } from "./chunk-HQN5AZFY.js";
6
+ } from "./chunk-HGKELH6Z.js";
7
7
  import "./chunk-3PVDYTTB.js";
8
- import "./chunk-QQ5UGGGE.js";
8
+ import "./chunk-KZENYIA2.js";
9
9
 
10
10
  // src/hooks/latest-question.ts
11
11
  import { SESSION_EVENT_TYPES } from "@opengeni/sdk";
@@ -115,4 +115,4 @@ export {
115
115
  TIMELINE_TURN_ANCHOR_EVENT_TYPES,
116
116
  resolveLatestQuestion
117
117
  };
118
- //# sourceMappingURL=latest-question-6WZQV23L.js.map
118
+ //# sourceMappingURL=latest-question-CHE7E753.js.map
@@ -64,6 +64,13 @@ export declare function isSessionUsageLimitSubmissionError(error: Error): boolea
64
64
  * before a reload (only its text survives) or from an older API is recognized.
65
65
  */
66
66
  export declare function isModelUnavailableSubmissionError(error: Error): boolean;
67
+ /**
68
+ * What a published Site's assistant tells a viewer it refused, by the
69
+ * refusal's `details.code`. The draft is kept in every case.
70
+ */
71
+ export declare const COMPOSER_SITE_REFUSAL_MESSAGES: Readonly<Record<string, string>>;
72
+ /** The Site refusal code of a send refusal, if it is one. */
73
+ export declare function siteRefusalCode(error: Error): string | null;
67
74
  export declare function composerSubmissionErrorMessage(error: Error): string;
68
75
  /** These definitive refusals need a payment, allowance or model change, not an unchanged retry. */
69
76
  export declare function composerSubmissionCanRetry(error: Error): boolean;
package/dist/machines.js CHANGED
@@ -29,13 +29,13 @@ import {
29
29
  healthPulses,
30
30
  pointsFor,
31
31
  useMachines
32
- } from "./chunk-U7A22SY4.js";
32
+ } from "./chunk-TIHSXNBC.js";
33
33
  import "./chunk-CSX5FFKZ.js";
34
34
  import "./chunk-R5SBNG7S.js";
35
35
  import "./chunk-QHUE7E4N.js";
36
36
  import "./chunk-CM7LVUKC.js";
37
37
  import "./chunk-G76LSA76.js";
38
- import "./chunk-QQ5UGGGE.js";
38
+ import "./chunk-KZENYIA2.js";
39
39
  import "./chunk-TXS65BB2.js";
40
40
  export {
41
41
  CONNECTION_STATUS_META,
@@ -4,7 +4,7 @@ import {
4
4
  sandboxRowTitle,
5
5
  startupDuration,
6
6
  startupPhaseTitle
7
- } from "./chunk-ERLG2X3U.js";
7
+ } from "./chunk-CORUP6JB.js";
8
8
 
9
9
  // src/timeline/platform-activity-row.tsx
10
10
  function PlatformActivityRow({
@@ -104,4 +104,4 @@ function lucideIcon(j, s, name, children) {
104
104
  export {
105
105
  PlatformActivityRow as default
106
106
  };
107
- //# sourceMappingURL=platform-activity-row-UQDQDX4C.js.map
107
+ //# sourceMappingURL=platform-activity-row-5OCKOQWZ.js.map
@@ -29,7 +29,7 @@ import {
29
29
  setStartupDetails,
30
30
  useStartupDetails,
31
31
  userMessageLikelyNeedsDisclosure
32
- } from "./chunk-RRYCD3QD.js";
32
+ } from "./chunk-AMVCNAGC.js";
33
33
  import "./chunk-B27E3V37.js";
34
34
  import "./chunk-SHLZMAJN.js";
35
35
  import "./chunk-2HVLQ26H.js";
@@ -44,8 +44,8 @@ import {
44
44
  createOlderHistoryLoadReceipt,
45
45
  useNewConversation,
46
46
  useSessionConversation
47
- } from "./chunk-25YZS7TK.js";
48
- import "./chunk-HQN5AZFY.js";
47
+ } from "./chunk-O5GPRG76.js";
48
+ import "./chunk-HGKELH6Z.js";
49
49
  import {
50
50
  OpenGeniProvider
51
51
  } from "./chunk-R5SBNG7S.js";
@@ -54,7 +54,7 @@ import {
54
54
  SecretRefChip,
55
55
  SecretRefText,
56
56
  SecretsUiProvider
57
- } from "./chunk-NIIXN66Z.js";
57
+ } from "./chunk-5XEXTWEM.js";
58
58
  import "./chunk-OYQQJL3J.js";
59
59
  import "./chunk-S2QH6EZ5.js";
60
60
  import {
@@ -69,8 +69,8 @@ import "./chunk-5WOR7UCL.js";
69
69
  import {
70
70
  BUILT_IN_TURN_SUMMARY_FACET_IDS,
71
71
  createToolRegistry
72
- } from "./chunk-6JUSXDF4.js";
73
- import "./chunk-ERLG2X3U.js";
72
+ } from "./chunk-HBXL6HWG.js";
73
+ import "./chunk-CORUP6JB.js";
74
74
  import "./chunk-5YJLGOM5.js";
75
75
  import "./chunk-IZV5FTJC.js";
76
76
  import "./chunk-3PVDYTTB.js";
@@ -80,12 +80,12 @@ import {
80
80
  import "./chunk-O7F6UJO4.js";
81
81
  import "./chunk-UNJPZGNK.js";
82
82
  import "./chunk-PEHTX3V7.js";
83
- import "./chunk-UPP6YD2R.js";
84
- import "./chunk-BSIADJ4U.js";
83
+ import "./chunk-PWCBMEV2.js";
84
+ import "./chunk-6SNDCUPB.js";
85
85
  import "./chunk-NX4ADH73.js";
86
86
  import "./chunk-XDA5QJE7.js";
87
87
  import "./chunk-PMV53IMM.js";
88
- import "./chunk-X6KAA43Z.js";
88
+ import "./chunk-Q26UAIXI.js";
89
89
  import "./chunk-KSGQ5ODA.js";
90
90
  import "./chunk-XEA5BCMA.js";
91
91
  import "./chunk-N7S72EXK.js";
@@ -94,7 +94,7 @@ import "./chunk-KF33GTWN.js";
94
94
  import "./chunk-QHUE7E4N.js";
95
95
  import "./chunk-CM7LVUKC.js";
96
96
  import "./chunk-G76LSA76.js";
97
- import "./chunk-QQ5UGGGE.js";
97
+ import "./chunk-KZENYIA2.js";
98
98
  import "./chunk-TXS65BB2.js";
99
99
 
100
100
  // src/session-ui.ts
package/dist/session.js CHANGED
@@ -24,14 +24,14 @@ import {
24
24
  useSessionConversation,
25
25
  useSessionEvents,
26
26
  useTurnQueue
27
- } from "./chunk-25YZS7TK.js";
27
+ } from "./chunk-O5GPRG76.js";
28
28
  import {
29
29
  buildTimeline,
30
30
  creditExhaustedFromEvents,
31
31
  extractSessionRef,
32
32
  groupTimeline,
33
33
  sessionStatusFromEvents
34
- } from "./chunk-HQN5AZFY.js";
34
+ } from "./chunk-HGKELH6Z.js";
35
35
  import {
36
36
  humanInputRequestFromEvent,
37
37
  projectPendingHumanInputRequests
@@ -45,12 +45,12 @@ import {
45
45
  shouldSteerOnKey,
46
46
  shouldSubmitOnKey,
47
47
  useComposer
48
- } from "./chunk-X6KAA43Z.js";
48
+ } from "./chunk-Q26UAIXI.js";
49
49
  import "./chunk-KF33GTWN.js";
50
50
  import "./chunk-QHUE7E4N.js";
51
51
  import "./chunk-CM7LVUKC.js";
52
52
  import "./chunk-G76LSA76.js";
53
- import "./chunk-QQ5UGGGE.js";
53
+ import "./chunk-KZENYIA2.js";
54
54
  export {
55
55
  FILE_ONLY_MESSAGE_TEXT,
56
56
  approvalsFromRequiresAction,
package/dist/sites.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  SiteDetail,
4
4
  SiteList
5
- } from "./chunk-4JUSFDTA.js";
5
+ } from "./chunk-6JFN3OWG.js";
6
6
  import {
7
7
  loadSiteSnapshot
8
8
  } from "./chunk-IOYHDEP3.js";
@@ -208,7 +208,7 @@ export type StartupPhaseItem = {
208
208
  durationMs: number | null;
209
209
  /** Sandbox origin and rig marker outcomes refine the settled label only. */
210
210
  outcome: "created" | "restored" | "resumed" | "skipped" | null;
211
- blockedReason?: "capture_in_progress" | "rotation_in_progress" | "provider_recovery_in_progress" | undefined;
211
+ blockedReason?: "capture_in_progress" | "rotation_in_progress" | "provider_recovery_in_progress" | "compaction_required" | undefined;
212
212
  occurredAt: string;
213
213
  };
214
214
  /**
@@ -66,7 +66,7 @@ import {
66
66
  webSearchPresentation,
67
67
  withComputePreview,
68
68
  writeStdinPresentation
69
- } from "./chunk-6JUSXDF4.js";
69
+ } from "./chunk-HBXL6HWG.js";
70
70
  import {
71
71
  STARTUP_WAIT_TITLES,
72
72
  namedAgentTitle,
@@ -75,7 +75,7 @@ import {
75
75
  startupPhaseTitle,
76
76
  workerRowTitle,
77
77
  workerRowTitleParts
78
- } from "./chunk-ERLG2X3U.js";
78
+ } from "./chunk-CORUP6JB.js";
79
79
  import {
80
80
  timelineGroupContainsPresentedImage
81
81
  } from "./chunk-5YJLGOM5.js";
@@ -102,7 +102,7 @@ import {
102
102
  formatRelativeTime,
103
103
  stringifyPayload,
104
104
  tryParseJson
105
- } from "./chunk-QQ5UGGGE.js";
105
+ } from "./chunk-KZENYIA2.js";
106
106
 
107
107
  // src/notification-text.ts
108
108
  var INLINE = /\*\*(.+?)\*\*|__(.+?)__|`([^`]+)`|\[([^\]]+)\]\((https:\/\/[^\s)]+)\)/gu;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/react",
3
- "version": "2.0.1",
3
+ "version": "2.0.2-canary.38789554071001",
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": {
@@ -213,8 +213,8 @@
213
213
  "@dnd-kit/utilities": "3.2.2",
214
214
  "@fontsource-variable/noto-sans-arabic": "5.2.10",
215
215
  "@fontsource-variable/noto-sans-jp": "5.2.10",
216
- "@opengeni/connect": "2.0.1",
217
- "@opengeni/sdk": "2.0.1",
216
+ "@opengeni/connect": "2.0.2-canary.38789554071001",
217
+ "@opengeni/sdk": "2.0.2-canary.38789554071001",
218
218
  "clsx": "^2.1.1",
219
219
  "dequal": "2.0.3",
220
220
  "lucide-react": "^1.8.0",