@opengeni/react 1.2.1-canary.37222965366001 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -1
- package/dist/artifacts.js +2 -2
- package/dist/artifacts.js.map +1 -1
- package/dist/{chunk-ERGYJIBB.js → chunk-AWZLIMKX.js} +2 -2
- package/dist/{chunk-ERGYJIBB.js.map → chunk-AWZLIMKX.js.map} +1 -1
- package/dist/{chunk-FZCP527Y.js → chunk-CJUO7J5Z.js} +2 -2
- package/dist/{chunk-742CZ3L3.js → chunk-H5X55XH7.js} +16 -200
- package/dist/chunk-H5X55XH7.js.map +1 -0
- package/dist/{chunk-4OTO7KBK.js → chunk-LJ2UTJJE.js} +2737 -1580
- package/dist/chunk-LJ2UTJJE.js.map +1 -0
- package/dist/{chunk-CY7WK5FD.js → chunk-LN6TCXD3.js} +22 -1
- package/dist/chunk-LN6TCXD3.js.map +1 -0
- package/dist/{chunk-TMYGL6X5.js → chunk-MBMPHOMA.js} +71 -6
- package/dist/chunk-MBMPHOMA.js.map +1 -0
- package/dist/{chunk-RC6BZ44Q.js → chunk-OA6HFRQP.js} +2 -2
- package/dist/{chunk-X34BSY2R.js → chunk-WZMYFJD3.js} +242 -63
- package/dist/chunk-WZMYFJD3.js.map +1 -0
- package/dist/components/approval-surface.d.ts +11 -13
- package/dist/components/composer-transcription-control.d.ts +3 -0
- package/dist/components/open-geni-chat.d.ts +26 -7
- package/dist/components/session-conversation.d.ts +26 -3
- package/dist/components/session-list.d.ts +4 -1
- package/dist/components/session-proxy-scope.d.ts +16 -2
- package/dist/components/tool-action-review.d.ts +47 -0
- package/dist/components/tool-review-history.d.ts +25 -0
- package/dist/composer.js +1 -1
- package/dist/connect.js +1 -1
- package/dist/hooks/use-client-config-flags.d.ts +37 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.js +27 -11
- package/dist/index.js.map +1 -1
- package/dist/{latest-question-YTOBHCWR.js → latest-question-GPYM2JNU.js} +3 -3
- package/dist/realtime/realtime-control.d.ts +2 -0
- package/dist/realtime.js +25 -4
- package/dist/realtime.js.map +1 -1
- package/dist/session-capability-policy.d.ts +20 -1
- package/dist/session-ui.d.ts +4 -1
- package/dist/session-ui.js +12 -6
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +6 -6
- package/dist/timeline/index.d.ts +2 -0
- package/dist/timeline/retained-loaders.d.ts +27 -0
- package/package.json +3 -3
- package/src/components/approval-surface.tsx +368 -239
- package/src/components/artifacts/session-artifact-viewer.tsx +4 -2
- package/src/components/composer-transcription-control.tsx +14 -0
- package/src/components/composer.tsx +1 -0
- package/src/components/open-geni-chat.tsx +245 -72
- package/src/components/session-conversation.tsx +243 -58
- package/src/components/session-list.tsx +9 -2
- package/src/components/session-proxy-scope.tsx +47 -7
- package/src/components/tool-action-review.tsx +649 -0
- package/src/components/tool-review-history.tsx +88 -0
- package/src/hooks/use-client-config-flags.ts +102 -0
- package/src/hooks/use-session-events.ts +19 -16
- package/src/hooks/use-transcription.ts +6 -0
- package/src/hooks/use-voice-input.ts +6 -0
- package/src/index.ts +18 -1
- package/src/realtime/realtime-control.tsx +28 -1
- package/src/session-capability-policy.ts +119 -6
- package/src/session-ui.ts +9 -1
- package/src/timeline/index.ts +10 -0
- package/src/timeline/retained-loaders.ts +86 -0
- package/src/timeline/tool-display-name.ts +5 -1
- package/src/timeline/tool-renderers.tsx +148 -8
- package/styles/compiled.css +79 -15
- package/styles/tokens.css +1 -1
- package/dist/chunk-4OTO7KBK.js.map +0 -1
- package/dist/chunk-742CZ3L3.js.map +0 -1
- package/dist/chunk-CY7WK5FD.js.map +0 -1
- package/dist/chunk-TMYGL6X5.js.map +0 -1
- package/dist/chunk-X34BSY2R.js.map +0 -1
- /package/dist/{chunk-FZCP527Y.js.map → chunk-CJUO7J5Z.js.map} +0 -0
- /package/dist/{chunk-RC6BZ44Q.js.map → chunk-OA6HFRQP.js.map} +0 -0
- /package/dist/{latest-question-YTOBHCWR.js.map → latest-question-GPYM2JNU.js.map} +0 -0
package/README.md
CHANGED
|
@@ -28,6 +28,17 @@ animation. Override the tokens to rebrand everything.
|
|
|
28
28
|
|
|
29
29
|
## Embedded connections and Sites
|
|
30
30
|
|
|
31
|
+
For a child chat's capability selection, `prepareSessionCapabilityAccess` reads
|
|
32
|
+
an ancestor-to-child access plan without writing. Show the parent chats whose
|
|
33
|
+
`request` is non-null and obtain an explicit confirmation before calling
|
|
34
|
+
`applySessionCapabilityAccess`. The plan preserves existing choices, applies
|
|
35
|
+
version-fenced updates root first, and grants no authority: each ordinary API
|
|
36
|
+
request still authorizes its caller. Invalidate the review on actor/workspace
|
|
37
|
+
changes. A partial failure may leave approved parent changes saved; prepare a
|
|
38
|
+
new plan for retry instead of rolling them back. Existing
|
|
39
|
+
`attachSessionCapability` remains a single-chat operation and never changes
|
|
40
|
+
parents implicitly.
|
|
41
|
+
|
|
31
42
|
Optional `@opengeni/react/connect` exports `useConnect`, `ConnectChooser`,
|
|
32
43
|
`ConnectSetup`, `ConnectAccounts`, and the composed `ConnectPanel`. Inject one
|
|
33
44
|
`@opengeni/connect` controller per authenticated actor/workspace and dispose it
|
|
@@ -98,6 +109,14 @@ import "@opengeni/react/compiled.css";
|
|
|
98
109
|
// or one conversation: <SessionConversation baseUrl="/api/opengeni" sessionId={sessionId} />
|
|
99
110
|
```
|
|
100
111
|
|
|
112
|
+
Bearer-token apps pass `headers` (a function runs per request) or a custom
|
|
113
|
+
`fetch`; a `client` passed with `baseUrl` replaces the one the component
|
|
114
|
+
creates:
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<OpenGeniChat baseUrl="/api/opengeni" headers={() => ({ Authorization: `Bearer ${getToken()}` })} />
|
|
118
|
+
```
|
|
119
|
+
|
|
101
120
|
The provider form keeps working, for example for several components sharing one
|
|
102
121
|
client or the headless hooks:
|
|
103
122
|
|
|
@@ -141,7 +160,13 @@ someone else's product with zero styling:
|
|
|
141
160
|
also fixes the policy server-side.
|
|
142
161
|
|
|
143
162
|
Attachments appear when the deployment enables uploads (`attachments={false}`
|
|
144
|
-
opts out),
|
|
163
|
+
opts out), the microphone appears when it reports voice input available
|
|
164
|
+
(`voiceInput={false}` opts out), generated images, video, published files and
|
|
165
|
+
screenshots display through the conversation's session scope, actions a
|
|
166
|
+
session proxy reports unavailable (`sessionCreation`, `archive`, `artifacts`)
|
|
167
|
+
are hidden, the session goal shows with Pause/Resume/Clear, sub-agent cards
|
|
168
|
+
open the child through `onOpenSession` (`OpenGeniChat` opens it in place),
|
|
169
|
+
pending tool approvals render Approve/Reject, a yes/no question
|
|
145
170
|
renders as two buttons, a failed load offers Try again, and `toolRegistry`
|
|
146
171
|
customizes tool rendering.
|
|
147
172
|
|
|
@@ -951,6 +976,9 @@ intentional changes should regenerate those snapshots and review the diff.
|
|
|
951
976
|
`loadRetainedArtifact` to render permanent generated-image receipts; a loader
|
|
952
977
|
may return verified bytes or a short-lived signed URL. The stock web app uses
|
|
953
978
|
the URL path to avoid copying multi-megabyte images into JavaScript memory.
|
|
979
|
+
`createWorkspaceRetainedArtifactLoader`, `createSessionRetainedScreenshotLoader`,
|
|
980
|
+
and `createWorkspaceRetainedVideoLoader` bind the SDK reads to a workspace
|
|
981
|
+
(and session); `SessionConversation` uses them by default.
|
|
954
982
|
- `UserMessageBody` — the shared lossless rendered-height disclosure for
|
|
955
983
|
already-sent user text. Use it inside a custom `renderMessageText` user branch
|
|
956
984
|
so attachments and voice identity remain outside the clipped Markdown region.
|
|
@@ -1383,3 +1411,26 @@ Copy and the timestamp for user messages and completed assistant messages.
|
|
|
1383
1411
|
The host owns feedback, fork authorization, and mutations; streaming assistant
|
|
1384
1412
|
messages omit this slot. Use the `group/copy` hover/focus state and preserve
|
|
1385
1413
|
visible touch targets when styling actions.
|
|
1414
|
+
|
|
1415
|
+
### Portable action reviews
|
|
1416
|
+
|
|
1417
|
+
`ApprovalSurface` accepts `loadReview(approval)` and `onViewDetails(review, path)`;
|
|
1418
|
+
load the versioned facts with `client.getToolActionReview`. It shows one selected
|
|
1419
|
+
action, counts and bounded fields instead of raw argument JSON. Keep
|
|
1420
|
+
`selectedApprovalId` and `onSelectedApprovalChange` in the host if a full-page
|
|
1421
|
+
detail route unmounts the surface, so returning cannot silently select a different
|
|
1422
|
+
action. The native `onApprove` / `onReject` identity is unchanged and duplicate
|
|
1423
|
+
submission is fenced until authoritative events remove the request.
|
|
1424
|
+
|
|
1425
|
+
Render `ToolActionReviewDetails` on the host's normal page with
|
|
1426
|
+
`client.getToolReviewDetails`, passing the review's `actionDigest`, path and offset.
|
|
1427
|
+
Details are immutable, authenticated, paginated, and redact protected values.
|
|
1428
|
+
Restore focus to the original `data-review-path` button on return. No web-app
|
|
1429
|
+
imports, iframe, second confirmation, or nested scrolling pane is required.
|
|
1430
|
+
The standalone fallback retains bounded details for older SDK approvals.
|
|
1431
|
+
|
|
1432
|
+
Wrap `MessageTimeline` in `ToolReviewHistoryProvider` with its visible events,
|
|
1433
|
+
authenticated `load(approvalId)` callback and `onViewDetails` to keep recorded
|
|
1434
|
+
reviews readable inside the corresponding tool activity. Historical receipts
|
|
1435
|
+
never render decision buttons. The same semantic tokens support light/dark
|
|
1436
|
+
embeds; `demo/approval-review.html` is the synthetic state gallery.
|
package/dist/artifacts.js
CHANGED
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
isRetainedImageContentType,
|
|
23
23
|
useRetainedImageObjectUrl
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-CJUO7J5Z.js";
|
|
25
25
|
import {
|
|
26
26
|
ArtifactBadge,
|
|
27
27
|
ArtifactButton,
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
artifactLoadErrorView,
|
|
38
38
|
useArtifactLabels
|
|
39
39
|
} from "./chunk-5CVXZA3Y.js";
|
|
40
|
-
import "./chunk-
|
|
40
|
+
import "./chunk-AWZLIMKX.js";
|
|
41
41
|
import "./chunk-XCHWDJ22.js";
|
|
42
42
|
import {
|
|
43
43
|
PUBLISHED_HTML_ARTIFACT_IFRAME_SANDBOX,
|
package/dist/artifacts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/artifacts/site-view.tsx","../src/components/artifacts/editable-artifact-view.tsx","../src/components/artifacts/editable-artifact-workbench.tsx","../src/components/artifacts/session-artifact-viewer.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { loadSiteSnapshot } from \"../../sites-ui\";\nimport {\n ArtifactLoading,\n ArtifactProblem,\n artifactLoadErrorView,\n useArtifactLabels,\n} from \"./artifact-chrome\";\nimport { ArtifactSandbox } from \"./artifact-sandbox\";\nimport type { SiteSnapshotClient, SiteToolBridgeFactory } from \"./chat-interactive-block\";\n\ntype Snapshot = Awaited<ReturnType<typeof loadSiteSnapshot>>;\n\nexport type SiteViewProps = {\n client: SiteSnapshotClient;\n workspaceId: string;\n siteId: string;\n /** Host-owned Site API access. Omit it and the Site renders without workspace tools. */\n toolBridge?: SiteToolBridgeFactory | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n /** Shown instead of the archived notice; the console links to its full page. */\n archivedMessage?: string | undefined;\n /** Show the Site title in the frame bar; hide it under a host header that already does. */\n showTitle?: boolean | undefined;\n /** Loading copy; defaults to \"Loading Site…\". */\n loadingLabel?: string | undefined;\n /** Called with the loaded title, for a host header. */\n onTitle?: ((title: string) => void) | undefined;\n className?: string | undefined;\n};\n\n/**\n * A published Site filling its container: the console's session dock and an\n * embedding host's artifact viewer render the same view.\n */\nexport function SiteView({\n client,\n workspaceId,\n siteId,\n toolBridge,\n theme,\n archivedMessage,\n showTitle = true,\n loadingLabel,\n onTitle,\n className,\n}: SiteViewProps) {\n const labels = useArtifactLabels();\n const [snapshot, setSnapshot] = useState<Snapshot | null>(null);\n const [error, setError] = useState<unknown>(null);\n const readAbort = useRef<AbortController | null>(null);\n const onTitleRef = useRef(onTitle);\n onTitleRef.current = onTitle;\n const load = useCallback(async () => {\n readAbort.current?.abort();\n const abort = new AbortController();\n readAbort.current = abort;\n try {\n setError(null);\n const next = await loadSiteSnapshot(client, workspaceId, siteId, {\n signal: abort.signal,\n includeArchivedContent: true,\n });\n if (abort.signal.aborted) return;\n setSnapshot(next);\n onTitleRef.current?.(next.detail.artifact.title);\n } catch (nextError) {\n if (abort.signal.aborted) return;\n setSnapshot(null);\n setError(nextError);\n }\n }, [client, siteId, workspaceId]);\n useEffect(() => {\n setSnapshot(null);\n void load();\n return () => readAbort.current?.abort();\n }, [load]);\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 [content, siteId, toolBridge],\n );\n if (error)\n return (\n <ArtifactProblem\n view={artifactLoadErrorView(error, \"site\", labels)}\n onRetry={() => void load()}\n />\n );\n if (!snapshot || !content) return <ArtifactLoading label={loadingLabel ?? labels.loadingSite} />;\n if (snapshot.detail.artifact.status === \"archived\")\n return (\n <div className=\"p-4 text-sm text-fg-muted\">{archivedMessage ?? labels.siteArchived}</div>\n );\n return (\n <ArtifactSandbox\n html={content.html}\n title={snapshot.detail.artifact.title}\n showTitle={showTitle}\n versionLabel={`v${snapshot.detail.artifact.currentVersion?.revision}`}\n toolBridge={bridge}\n connectedToolCount={content.requestedTools.length}\n theme={theme}\n fill\n className={className ?? \"h-full rounded-none border-0\"}\n />\n );\n}\n","import type { EditableArtifactResource } from \"@opengeni/sdk/artifacts\";\nimport {\n createBrowserEditableArtifactSession,\n type CreateBrowserEditableArtifactSessionOptions,\n type EditableArtifactBrowserRuntime,\n type EditableArtifactCacheAuthority,\n type EditableArtifactModality,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n ArtifactLoading,\n ArtifactProblem,\n artifactLoadErrorView,\n useArtifactLabels,\n type ArtifactLoadErrorView,\n} from \"./artifact-chrome\";\nimport { EditableArtifactWorkbenchHost } from \"./editable-artifact-workbench\";\n\n/**\n * The browser kernels an editor needs, one per modality, plus the host-built\n * Worker URL (for Vite: `@opengeni/sdk/editable-artifacts/worker?worker&url`).\n * Kernels come from `@opengeni/artifact-kernel-wasm-{document,spreadsheet,presentation}`.\n */\nexport type EditableArtifactRuntimes = Readonly<{\n document: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n spreadsheet: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n presentation: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n workerUrl: string;\n applicationOrigin?: string | undefined;\n /** Loopback development only. */\n allowInsecureDevelopmentAssets?: boolean | undefined;\n}>;\n\n/** Everything needed to open one artifact for the current principal. */\nexport type OpenedEditableArtifact = Readonly<{\n artifact: EditableArtifactResource;\n authority: EditableArtifactCacheAuthority;\n replicaId: string;\n}>;\n\nexport type EditableArtifactViewProps = Readonly<{\n /** Absolute API (or session proxy) base the live transport talks to. */\n baseUrl: URL;\n workspaceId: string;\n artifactId: string;\n /** Resolve metadata, cache authority, and replica; called again on retry. */\n open: (signal: AbortSignal) => Promise<OpenedEditableArtifact>;\n runtimes: EditableArtifactRuntimes;\n transport?: CreateBrowserEditableArtifactSessionOptions[\"transport\"];\n /** Show the editor's own title header (hosts with their own header hide it). */\n showHeader?: boolean | undefined;\n /** Re-open when this changes (for example the host's credential version). */\n authorityKey?: string | undefined;\n describeError?: ((error: unknown) => ArtifactLoadErrorView) | undefined;\n onTitle?: ((title: string) => void) | undefined;\n /** Loading copy; defaults to the `opening` label. */\n loadingLabel?: string | undefined;\n}>;\n\ntype LoadState =\n | Readonly<{ key: string | null; kind: \"loading\" }>\n | Readonly<{ key: string; kind: \"ready\"; value: OpenedEditableArtifact }>\n | Readonly<{ key: string; kind: \"error\"; error: unknown }>;\n\n/**\n * One editable document, spreadsheet, or presentation with its first-party\n * editor. The console dock/page and embedding hosts supply only data access.\n */\nexport function EditableArtifactView({\n baseUrl,\n workspaceId,\n artifactId,\n open,\n runtimes,\n transport,\n showHeader = true,\n authorityKey,\n describeError,\n onTitle,\n loadingLabel,\n}: EditableArtifactViewProps) {\n const [loadEpoch, setLoadEpoch] = useState(0);\n const labels = useArtifactLabels();\n const loadKey = JSON.stringify([artifactId, authorityKey, baseUrl.href, workspaceId, loadEpoch]);\n const [state, setState] = useState<LoadState>({ key: null, kind: \"loading\" });\n const current = state.key === loadKey ? state : null;\n const openRef = useRef(open);\n openRef.current = open;\n const onTitleRef = useRef(onTitle);\n onTitleRef.current = onTitle;\n useEffect(() => {\n const abort = new AbortController();\n setState({ key: loadKey, kind: \"loading\" });\n void openRef\n .current(abort.signal)\n .then((value) => {\n if (abort.signal.aborted) return;\n setState({ key: loadKey, kind: \"ready\", value });\n onTitleRef.current?.(value.artifact.title);\n })\n .catch((error: unknown) => {\n if (!abort.signal.aborted) setState({ key: loadKey, kind: \"error\", error });\n });\n return () => abort.abort();\n }, [loadKey]);\n\n const ready = current?.kind === \"ready\" ? current.value : null;\n const transportRef = useRef(transport);\n transportRef.current = transport;\n const sessionKey = useMemo(\n () =>\n ready\n ? JSON.stringify({\n baseUrl: baseUrl.href,\n authorityKey,\n workspaceId,\n artifact: { id: ready.artifact.id, modality: ready.artifact.modality },\n authority: ready.authority,\n replicaId: ready.replicaId,\n workerUrl: runtimes.workerUrl,\n })\n : \"\",\n [authorityKey, baseUrl.href, ready, runtimes.workerUrl, workspaceId],\n );\n const createSession = useCallback(() => {\n if (!ready) throw new Error(\"Artifact is not open\");\n return createBrowserEditableArtifactSession({\n baseUrl,\n workspaceId,\n artifact: ready.artifact,\n storageAuthority: ready.authority,\n replicaId: ready.replicaId,\n runtime: {\n ...runtimeFor(runtimes, ready.artifact.modality),\n workerUrl: runtimes.workerUrl,\n ...(runtimes.applicationOrigin ? { applicationOrigin: runtimes.applicationOrigin } : {}),\n ...(runtimes.allowInsecureDevelopmentAssets\n ? { allowInsecureDevelopmentAssets: true }\n : {}),\n },\n ...(transportRef.current ? { transport: transportRef.current } : {}),\n });\n }, [baseUrl, ready, runtimes, workspaceId]);\n\n if (!current || current.kind === \"loading\")\n return <ArtifactLoading label={loadingLabel ?? labels.opening} />;\n if (current.kind === \"error\") {\n return (\n <ArtifactProblem\n view={\n describeError\n ? describeError(current.error)\n : artifactLoadErrorView(current.error, \"editable\", labels)\n }\n onRetry={() => setLoadEpoch((value) => value + 1)}\n />\n );\n }\n const { artifact } = current.value;\n const surface = { title: artifact.title, showHeader };\n return (\n <div className=\"h-full min-h-0 bg-og-bg text-og-fg\">\n <EditableArtifactWorkbenchHost\n sessionKey={sessionKey}\n createSession={createSession}\n document={surface}\n spreadsheet={surface}\n presentation={surface}\n />\n </div>\n );\n}\n\nfunction runtimeFor(\n runtimes: EditableArtifactRuntimes,\n modality: EditableArtifactModality,\n): Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\"> {\n switch (modality) {\n case \"document\":\n return runtimes.document;\n case \"spreadsheet\":\n return runtimes.spreadsheet;\n case \"presentation\":\n return runtimes.presentation;\n }\n}\n","import {\n createBrowserEditableArtifactSession,\n type CreateBrowserEditableArtifactSessionOptions,\n type EditableArtifactBrowserRuntime,\n type EditableArtifactSession,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useArtifactLabels } from \"./artifact-chrome\";\nimport { EditableArtifactMessage } from \"./editable-artifact-ui\";\nimport {\n EditableDocumentArtifactSurface,\n type EditableDocumentArtifactSurfaceProps,\n} from \"./editable-document\";\nimport {\n EditablePresentationArtifactSurface,\n type EditablePresentationArtifactSurfaceProps,\n} from \"./editable-presentation\";\nimport {\n EditableSpreadsheetArtifactSurface,\n type EditableSpreadsheetArtifactSurfaceProps,\n} from \"./editable-spreadsheet\";\n\nexport type EditableArtifactWorkbenchProps = Readonly<{\n session: EditableArtifactSession;\n document?: Omit<EditableDocumentArtifactSurfaceProps, \"session\">;\n spreadsheet?: Omit<EditableSpreadsheetArtifactSurfaceProps, \"session\">;\n presentation?: Omit<EditablePresentationArtifactSurfaceProps, \"session\">;\n}>;\n\nexport type EditableArtifactWorkbenchHostProps = Omit<EditableArtifactWorkbenchProps, \"session\"> &\n Readonly<{\n /**\n * Complete identity of the browser session authority. Change this when the\n * artifact, deployment, principal, or authorization epoch changes.\n */\n sessionKey: string;\n /** Called for the active keyed lifecycle and again only after replacement or retry. */\n createSession: () => EditableArtifactSession;\n }>;\n\ntype DefaultBrowserArtifactTransport = Omit<\n NonNullable<CreateBrowserEditableArtifactSessionOptions[\"transport\"]>,\n \"apiKey\" | \"fetch\" | \"headers\" | \"webSocketFactory\"\n> &\n Readonly<{\n /** Static deployment auth headers; rotate authorizationEpoch when they change. */\n headers?: Readonly<Record<string, string>>;\n }>;\n\nexport type BrowserEditableArtifactWorkbenchOptions = Omit<\n CreateBrowserEditableArtifactSessionOptions,\n \"runtime\" | \"storage\" | \"transport\"\n> &\n Readonly<{\n /** Default module Worker only; custom Worker hosts use EditableArtifactWorkbenchHost. */\n runtime: Omit<EditableArtifactBrowserRuntime, \"workerFactory\">;\n /** Default fetch/WebSocket only; static deployment auth headers are supported. */\n transport?: DefaultBrowserArtifactTransport;\n }>;\n\nexport type BrowserEditableArtifactWorkbenchProps = Omit<\n EditableArtifactWorkbenchProps,\n \"session\"\n> &\n Readonly<{ options: BrowserEditableArtifactWorkbenchOptions }>;\n\n/**\n * One modality-neutral SDK workbench. Embedding hosts keep one route/component;\n * each artifact still renders through its complete first-party editor surface.\n */\nexport function EditableArtifactWorkbench({\n session,\n document,\n spreadsheet,\n presentation,\n}: EditableArtifactWorkbenchProps) {\n switch (session.modality) {\n case \"document\":\n return (\n <EditableDocumentArtifactSurface\n {...document}\n session={session}\n title={document?.title ?? \"Document\"}\n />\n );\n case \"spreadsheet\":\n return <EditableSpreadsheetArtifactSurface {...spreadsheet} session={session} />;\n case \"presentation\":\n return <EditablePresentationArtifactSurface {...presentation} session={session} />;\n }\n}\n\n/**\n * Route/embed composition that owns exactly one SDK session. The host supplies\n * the authenticated SDK factory; React guarantees replacement and teardown.\n */\nexport function EditableArtifactWorkbenchHost({\n sessionKey,\n createSession,\n document,\n spreadsheet,\n presentation,\n}: EditableArtifactWorkbenchHostProps) {\n const createSessionRef = useRef(createSession);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [state, setState] = useState<\n | Readonly<{ key: string; session: EditableArtifactSession; error: null }>\n | Readonly<{ key: string | null; session: null; error: Error | null }>\n >({ key: null, session: null, error: null });\n\n useEffect(() => {\n createSessionRef.current = createSession;\n }, [createSession]);\n\n useEffect(() => {\n let owned: EditableArtifactSession | null = null;\n setState({ key: sessionKey, session: null, error: null });\n try {\n owned = createSessionRef.current();\n setState({ key: sessionKey, session: owned, error: null });\n } catch (cause) {\n setState({\n key: sessionKey,\n session: null,\n error: cause instanceof Error ? cause : new Error(\"Could not create artifact session\"),\n });\n }\n return () => {\n const closing = owned;\n owned = null;\n if (closing) void closing.close().catch(() => undefined);\n };\n }, [retryEpoch, sessionKey]);\n\n const retry = useCallback(() => setRetryEpoch((value) => value + 1), []);\n const labels = useArtifactLabels();\n const currentError = state.key === sessionKey ? state.error : null;\n if (state.key === sessionKey && state.session) {\n return (\n <EditableArtifactWorkbench\n session={state.session}\n {...(document ? { document } : {})}\n {...(spreadsheet ? { spreadsheet } : {})}\n {...(presentation ? { presentation } : {})}\n />\n );\n }\n return (\n <EditableArtifactMessage\n title={currentError ? labels.editableErrors.transient.title : labels.opening}\n detail={currentError?.message ?? labels.startingEditor}\n retry={currentError ? retry : undefined}\n retryLabel={labels.retry}\n />\n );\n}\n\n/**\n * Complete default-browser composition for embedders: verified WASM Worker,\n * durable IndexedDB state, authenticated live sync, teardown, and the matching\n * first-party editor. Advanced/custom transports compose the lower-level host.\n */\nexport function BrowserEditableArtifactWorkbench({\n options,\n document,\n spreadsheet,\n presentation,\n}: BrowserEditableArtifactWorkbenchProps) {\n const sessionKey = browserSessionKey(options);\n const createSession = useCallback(() => createBrowserEditableArtifactSession(options), [options]);\n return (\n <EditableArtifactWorkbenchHost\n sessionKey={sessionKey}\n createSession={createSession}\n {...(document ? { document } : {})}\n {...(spreadsheet ? { spreadsheet } : {})}\n {...(presentation ? { presentation } : {})}\n />\n );\n}\n\nfunction browserSessionKey(options: BrowserEditableArtifactWorkbenchOptions): string {\n const transport = options.transport\n ? {\n ...options.transport,\n // Credentials must not be copied into React lifecycle keys. The\n // authorization epoch is the explicit credential/grant rotation fence.\n headers: options.transport.headers\n ? Object.keys(options.transport.headers).sort()\n : undefined,\n }\n : null;\n return JSON.stringify(\n {\n baseUrl: options.baseUrl,\n workspaceId: options.workspaceId,\n artifact: { id: options.artifact.id, modality: options.artifact.modality },\n storageAuthority: options.storageAuthority,\n runtime: options.runtime,\n replicaId: options.replicaId ?? null,\n transport,\n },\n (_key, value: unknown) => (value instanceof URL ? value.href : value),\n );\n}\n","import { SESSION_SCOPE_HEADER, type ClientConfig, type OpenGeniClient } from \"@opengeni/sdk\";\nimport { createEditableArtifactReplicaId } from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { useOpenGeni, type ClientOverride } from \"../../session-context\";\nimport {\n ArtifactLabelsProvider,\n ArtifactLoading,\n ArtifactProblem,\n ArtifactViewerHeader,\n artifactLoadErrorView,\n useArtifactLabels,\n type ArtifactKind,\n type ArtifactLabels,\n} from \"./artifact-chrome\";\nimport { EditableArtifactView, type EditableArtifactRuntimes } from \"./editable-artifact-view\";\nimport type { SiteToolBridgeFactory } from \"./chat-interactive-block\";\nimport { SiteView } from \"./site-view\";\n\n/** An artifact opened from a session: the targets agent links and Site previews name. */\nexport type SessionArtifactTarget = Readonly<\n | { kind: \"editable-artifact\"; artifactId: string; title?: string | undefined }\n | { kind: \"site\"; artifactId: string; title?: string | undefined }\n>;\n\n/** Every string the viewer shows, including its Site frame and states. */\nexport type SessionArtifactViewerLabels = Partial<ArtifactLabels>;\n\nexport type SessionArtifactViewerProps = ClientOverride &\n Readonly<{\n /** The conversation the artifact belongs to; the proxy only serves its artifacts. */\n sessionId: string;\n target: SessionArtifactTarget;\n onClose: () => void;\n /** Show a Back control, for example to return to the conversation on phones. */\n onBack?: (() => void) | undefined;\n /** Browser kernels and Worker for documents, spreadsheets, and presentations. */\n editableRuntimes?: EditableArtifactRuntimes | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n /** Host-owned Site API access; omit it and Sites render without workspace tools. */\n siteToolBridge?: SiteToolBridgeFactory | undefined;\n labels?: SessionArtifactViewerLabels | undefined;\n className?: string | undefined;\n }>;\n\ntype ViewerClient = Pick<\n OpenGeniClient,\n | \"withHeaders\"\n | \"apiUrl\"\n | \"fetchApi\"\n | \"getClientConfig\"\n | \"getEditableArtifact\"\n | \"getWorkspaceArtifact\"\n | \"getWorkspaceArtifactHtml\"\n>;\n\nconst viewerClientKeys = new WeakMap<ViewerClient, string>();\n\nfunction viewerClientKey(client: ViewerClient): string {\n let key = viewerClientKeys.get(client);\n if (!key) {\n key = crypto.randomUUID();\n viewerClientKeys.set(client, key);\n }\n return key;\n}\n\n/**\n * A host-mountable viewer for one editable artifact or Site from a session,\n * with its own header (title, Back, Close). Mount it in any sized container\n * (a side panel, a sheet); it fills it. Data flows through the provider's\n * client and `createSessionProxyHandler({ artifacts: true })`, scoped to\n * `sessionId`.\n */\nexport function SessionArtifactViewer({ labels, ...props }: SessionArtifactViewerProps) {\n return (\n <ArtifactLabelsProvider labels={labels}>\n <Viewer {...props} />\n </ArtifactLabelsProvider>\n );\n}\n\nfunction Viewer({\n client: clientOverride,\n workspaceId: workspaceOverride,\n sessionId,\n target,\n onClose,\n onBack,\n editableRuntimes,\n theme,\n siteToolBridge,\n className,\n}: Omit<SessionArtifactViewerProps, \"labels\">) {\n const labels = useArtifactLabels();\n const context = useOpenGeni({ client: clientOverride, workspaceId: workspaceOverride });\n const base = context.client as unknown as ViewerClient;\n const workspaceId = context.workspaceId;\n const client = useMemo(\n () => base.withHeaders({ [SESSION_SCOPE_HEADER]: sessionId }),\n [base, sessionId],\n );\n const [loaded, setLoaded] = useState<{\n key: string;\n client: ViewerClient;\n workspaceId: string;\n title: string;\n kind: ArtifactKind | null;\n } | null>(null);\n const targetKey = `${target.kind}:${target.artifactId}`;\n const current =\n loaded?.key === targetKey && loaded.client === client && loaded.workspaceId === workspaceId\n ? loaded\n : null;\n const kind: ArtifactKind | null = target.kind === \"site\" ? \"site\" : (current?.kind ?? null);\n const [unavailable, setUnavailable] = useState<{\n key: string;\n client: ViewerClient;\n workspaceId: string;\n } | null>(null);\n const markUnavailable = useCallback(\n () => setUnavailable({ key: targetKey, client, workspaceId }),\n [client, targetKey, workspaceId],\n );\n const title =\n current?.title ??\n target.title ??\n (unavailable?.key === targetKey &&\n unavailable.client === client &&\n unavailable.workspaceId === workspaceId\n ? labels.artifact\n : labels.opening);\n return (\n <section\n aria-label={title}\n data-og-artifact-viewer={target.kind}\n className={cn(\"og-root flex h-full min-h-0 w-full min-w-0 flex-col bg-bg text-fg\", className)}\n >\n <ArtifactViewerHeader\n kind={kind}\n title={title}\n onBack={onBack}\n backLabel={labels.back}\n onClose={onClose}\n closeLabel={labels.close}\n />\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {target.kind === \"site\" ? (\n <SiteView\n key={targetKey}\n client={client}\n workspaceId={workspaceId}\n siteId={target.artifactId}\n theme={theme}\n toolBridge={siteToolBridge}\n showTitle={false}\n onTitle={(next) =>\n setLoaded({ key: targetKey, client, workspaceId, title: next, kind: \"site\" })\n }\n />\n ) : (\n <EditableBody\n key={targetKey}\n client={client}\n workspaceId={workspaceId}\n sessionId={sessionId}\n artifactId={target.artifactId}\n runtimes={editableRuntimes}\n onOpened={(next, modality) =>\n setLoaded({ key: targetKey, client, workspaceId, title: next, kind: modality })\n }\n onUnavailable={markUnavailable}\n />\n )}\n </div>\n </section>\n );\n}\n\nfunction EditableBody({\n client,\n workspaceId,\n sessionId,\n artifactId,\n runtimes,\n onOpened,\n onUnavailable,\n}: {\n client: ViewerClient;\n workspaceId: string;\n sessionId: string;\n artifactId: string;\n runtimes: EditableArtifactRuntimes | undefined;\n onOpened: (title: string, modality: ArtifactKind) => void;\n onUnavailable: () => void;\n}) {\n const labels = useArtifactLabels();\n const clientKey = viewerClientKey(client);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [configState, setConfigState] = useState<{\n client: ViewerClient;\n workspaceId: string;\n sessionId: string;\n result:\n | { kind: \"ready\"; config: NonNullable<ClientConfig[\"artifacts\"]> }\n | { kind: \"unavailable\" }\n | { kind: \"error\"; error: unknown };\n } | null>(null);\n const current =\n configState?.client === client &&\n configState.workspaceId === workspaceId &&\n configState.sessionId === sessionId\n ? configState.result\n : null;\n const config = current?.kind === \"ready\" ? current.config : null;\n const scopeRef = useRef({ client, workspaceId, sessionId });\n scopeRef.current = { client, workspaceId, sessionId };\n useEffect(() => {\n let live = true;\n setConfigState(null);\n client.getClientConfig().then(\n (value) =>\n live &&\n setConfigState({\n client,\n workspaceId,\n sessionId,\n result: value.artifacts\n ? { kind: \"ready\", config: value.artifacts }\n : { kind: \"unavailable\" },\n }),\n (error: unknown) =>\n live &&\n setConfigState({ client, workspaceId, sessionId, result: { kind: \"error\", error } }),\n );\n return () => {\n live = false;\n };\n }, [client, retryEpoch, sessionId, workspaceId]);\n const baseUrl = useMemo(\n () => new URL(client.apiUrl(\"/\"), globalThis.location?.href ?? \"http://localhost/\"),\n [client],\n );\n const transport = useMemo(() => {\n if (!config) return undefined;\n const socket = new URL(config.editableLiveUrl);\n let scope = new AbortController();\n const checkCurrent = (signal: AbortSignal) => {\n signal.throwIfAborted();\n if (\n scopeRef.current.client !== client ||\n scopeRef.current.workspaceId !== workspaceId ||\n scopeRef.current.sessionId !== sessionId\n ) {\n throw new DOMException(\"Artifact viewer scope changed\", \"AbortError\");\n }\n };\n return {\n activate: () => {\n if (scope.signal.aborted) scope = new AbortController();\n },\n abort: () => scope.abort(),\n fetch: (async (input: RequestInfo | URL, init?: RequestInit) => {\n const signal = AbortSignal.any([scope.signal, ...(init?.signal ? [init.signal] : [])]);\n checkCurrent(signal);\n const url = new URL(input instanceof Request ? input.url : input, baseUrl);\n if (\n init?.method === \"POST\" &&\n url.pathname ===\n new URL(\n `v1/workspaces/${encodeURIComponent(workspaceId)}/editable-artifacts/${encodeURIComponent(artifactId)}/live-ticket`,\n baseUrl,\n ).pathname\n ) {\n // A reconnect must revalidate the current host principal before\n // minting a ticket for the editor's retained cache partition.\n const next = (await client.getClientConfig({ signal })).artifacts;\n checkCurrent(signal);\n if (!next || artifactCapabilityKey(next) !== artifactCapabilityKey(config)) {\n setConfigState({\n client,\n workspaceId,\n sessionId,\n result: next ? { kind: \"ready\", config: next } : { kind: \"unavailable\" },\n });\n scope.abort();\n signal.throwIfAborted();\n }\n const { replicaId } = (await new Request(input, init).json()) as {\n replicaId?: unknown;\n };\n if (typeof replicaId !== \"string\") throw new TypeError(\"Artifact replica is required\");\n await client.getEditableArtifact(workspaceId, artifactId, { replicaId, signal });\n checkCurrent(signal);\n }\n return client.fetchApi(url, { ...init, signal });\n }) as typeof fetch,\n webSocketUrl: socket,\n ...(isLoopback(baseUrl) && isLoopback(socket)\n ? { allowInsecureDevelopmentTransport: true }\n : {}),\n };\n }, [artifactId, baseUrl, client, config, sessionId, workspaceId]);\n useEffect(() => {\n transport?.activate();\n return () => transport?.abort();\n }, [transport]);\n const blocked = current !== null && (current.kind !== \"ready\" || !runtimes);\n useEffect(() => {\n if (blocked) onUnavailable();\n }, [blocked, onUnavailable]);\n if (!current) return <ArtifactLoading label={labels.opening} />;\n if (current.kind === \"error\") {\n return (\n <ArtifactProblem\n view={artifactLoadErrorView(current.error, \"editable\", labels)}\n onRetry={() => setRetryEpoch((value) => value + 1)}\n />\n );\n }\n if (!config || !transport) {\n return <ArtifactProblem view={{ ...labels.viewingDisabled, retryable: false }} />;\n }\n if (!runtimes) {\n return <ArtifactProblem view={{ ...labels.editorsMissing, retryable: false }} />;\n }\n return (\n <EditableArtifactView\n baseUrl={baseUrl}\n workspaceId={workspaceId}\n artifactId={artifactId}\n authorityKey={JSON.stringify([clientKey, sessionId, artifactCapabilityKey(config)])}\n runtimes={{\n ...runtimes,\n ...(isLoopback(baseUrl) ? { allowInsecureDevelopmentAssets: true } : {}),\n }}\n transport={transport}\n showHeader={false}\n open={async (signal) => {\n const replicaId = createEditableArtifactReplicaId();\n const artifact = await client.getEditableArtifact(workspaceId, artifactId, {\n replicaId,\n signal,\n });\n signal.throwIfAborted();\n onOpened(artifact.title, artifact.modality);\n return {\n artifact,\n replicaId,\n authority: {\n deploymentOrigin: baseUrl.origin,\n workspaceId,\n ...config.cachePartition,\n },\n };\n }}\n />\n );\n}\n\nfunction artifactCapabilityKey(config: NonNullable<ClientConfig[\"artifacts\"]>): string {\n return JSON.stringify([\n config.editableLiveUrl,\n config.cachePartition.accountId,\n config.cachePartition.principalId,\n config.cachePartition.authorizationEpoch,\n ]);\n}\n\nfunction isLoopback(url: URL): boolean {\n return (\n (url.protocol === \"http:\" || url.protocol === \"ws:\") &&\n (url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\" || url.hostname === \"[::1]\")\n );\n}\n"],"mappings":"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","names":["createBrowserEditableArtifactSession","useCallback","useEffect","useMemo","useRef","useState","useCallback","useEffect","useRef","useState","jsx","useRef","useState","useEffect","useCallback","jsx","useState","useRef","useEffect","useMemo","useCallback","createBrowserEditableArtifactSession","useCallback","useEffect","useMemo","useRef","useState","jsx","useMemo","useState","useCallback","useRef","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/artifacts/site-view.tsx","../src/components/artifacts/editable-artifact-view.tsx","../src/components/artifacts/editable-artifact-workbench.tsx","../src/components/artifacts/session-artifact-viewer.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { loadSiteSnapshot } from \"../../sites-ui\";\nimport {\n ArtifactLoading,\n ArtifactProblem,\n artifactLoadErrorView,\n useArtifactLabels,\n} from \"./artifact-chrome\";\nimport { ArtifactSandbox } from \"./artifact-sandbox\";\nimport type { SiteSnapshotClient, SiteToolBridgeFactory } from \"./chat-interactive-block\";\n\ntype Snapshot = Awaited<ReturnType<typeof loadSiteSnapshot>>;\n\nexport type SiteViewProps = {\n client: SiteSnapshotClient;\n workspaceId: string;\n siteId: string;\n /** Host-owned Site API access. Omit it and the Site renders without workspace tools. */\n toolBridge?: SiteToolBridgeFactory | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n /** Shown instead of the archived notice; the console links to its full page. */\n archivedMessage?: string | undefined;\n /** Show the Site title in the frame bar; hide it under a host header that already does. */\n showTitle?: boolean | undefined;\n /** Loading copy; defaults to \"Loading Site…\". */\n loadingLabel?: string | undefined;\n /** Called with the loaded title, for a host header. */\n onTitle?: ((title: string) => void) | undefined;\n className?: string | undefined;\n};\n\n/**\n * A published Site filling its container: the console's session dock and an\n * embedding host's artifact viewer render the same view.\n */\nexport function SiteView({\n client,\n workspaceId,\n siteId,\n toolBridge,\n theme,\n archivedMessage,\n showTitle = true,\n loadingLabel,\n onTitle,\n className,\n}: SiteViewProps) {\n const labels = useArtifactLabels();\n const [snapshot, setSnapshot] = useState<Snapshot | null>(null);\n const [error, setError] = useState<unknown>(null);\n const readAbort = useRef<AbortController | null>(null);\n const onTitleRef = useRef(onTitle);\n onTitleRef.current = onTitle;\n const load = useCallback(async () => {\n readAbort.current?.abort();\n const abort = new AbortController();\n readAbort.current = abort;\n try {\n setError(null);\n const next = await loadSiteSnapshot(client, workspaceId, siteId, {\n signal: abort.signal,\n includeArchivedContent: true,\n });\n if (abort.signal.aborted) return;\n setSnapshot(next);\n onTitleRef.current?.(next.detail.artifact.title);\n } catch (nextError) {\n if (abort.signal.aborted) return;\n setSnapshot(null);\n setError(nextError);\n }\n }, [client, siteId, workspaceId]);\n useEffect(() => {\n setSnapshot(null);\n void load();\n return () => readAbort.current?.abort();\n }, [load]);\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 [content, siteId, toolBridge],\n );\n if (error)\n return (\n <ArtifactProblem\n view={artifactLoadErrorView(error, \"site\", labels)}\n onRetry={() => void load()}\n />\n );\n if (!snapshot || !content) return <ArtifactLoading label={loadingLabel ?? labels.loadingSite} />;\n if (snapshot.detail.artifact.status === \"archived\")\n return (\n <div className=\"p-4 text-sm text-fg-muted\">{archivedMessage ?? labels.siteArchived}</div>\n );\n return (\n <ArtifactSandbox\n html={content.html}\n title={snapshot.detail.artifact.title}\n showTitle={showTitle}\n versionLabel={`v${snapshot.detail.artifact.currentVersion?.revision}`}\n toolBridge={bridge}\n connectedToolCount={content.requestedTools.length}\n theme={theme}\n fill\n className={className ?? \"h-full rounded-none border-0\"}\n />\n );\n}\n","import type { EditableArtifactResource } from \"@opengeni/sdk/artifacts\";\nimport {\n createBrowserEditableArtifactSession,\n type CreateBrowserEditableArtifactSessionOptions,\n type EditableArtifactBrowserRuntime,\n type EditableArtifactCacheAuthority,\n type EditableArtifactModality,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n ArtifactLoading,\n ArtifactProblem,\n artifactLoadErrorView,\n useArtifactLabels,\n type ArtifactLoadErrorView,\n} from \"./artifact-chrome\";\nimport { EditableArtifactWorkbenchHost } from \"./editable-artifact-workbench\";\n\n/**\n * The browser kernels an editor needs, one per modality, plus the host-built\n * Worker URL (for Vite: `@opengeni/sdk/editable-artifacts/worker?worker&url`).\n * Kernels come from `@opengeni/artifact-kernel-wasm-{document,spreadsheet,presentation}`.\n */\nexport type EditableArtifactRuntimes = Readonly<{\n document: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n spreadsheet: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n presentation: Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\">;\n workerUrl: string;\n applicationOrigin?: string | undefined;\n /** Loopback development only. */\n allowInsecureDevelopmentAssets?: boolean | undefined;\n}>;\n\n/** Everything needed to open one artifact for the current principal. */\nexport type OpenedEditableArtifact = Readonly<{\n artifact: EditableArtifactResource;\n authority: EditableArtifactCacheAuthority;\n replicaId: string;\n}>;\n\nexport type EditableArtifactViewProps = Readonly<{\n /** Absolute API (or session proxy) base the live transport talks to. */\n baseUrl: URL;\n workspaceId: string;\n artifactId: string;\n /** Resolve metadata, cache authority, and replica; called again on retry. */\n open: (signal: AbortSignal) => Promise<OpenedEditableArtifact>;\n runtimes: EditableArtifactRuntimes;\n transport?: CreateBrowserEditableArtifactSessionOptions[\"transport\"];\n /** Show the editor's own title header (hosts with their own header hide it). */\n showHeader?: boolean | undefined;\n /** Re-open when this changes (for example the host's credential version). */\n authorityKey?: string | undefined;\n describeError?: ((error: unknown) => ArtifactLoadErrorView) | undefined;\n onTitle?: ((title: string) => void) | undefined;\n /** Loading copy; defaults to the `opening` label. */\n loadingLabel?: string | undefined;\n}>;\n\ntype LoadState =\n | Readonly<{ key: string | null; kind: \"loading\" }>\n | Readonly<{ key: string; kind: \"ready\"; value: OpenedEditableArtifact }>\n | Readonly<{ key: string; kind: \"error\"; error: unknown }>;\n\n/**\n * One editable document, spreadsheet, or presentation with its first-party\n * editor. The console dock/page and embedding hosts supply only data access.\n */\nexport function EditableArtifactView({\n baseUrl,\n workspaceId,\n artifactId,\n open,\n runtimes,\n transport,\n showHeader = true,\n authorityKey,\n describeError,\n onTitle,\n loadingLabel,\n}: EditableArtifactViewProps) {\n const [loadEpoch, setLoadEpoch] = useState(0);\n const labels = useArtifactLabels();\n const loadKey = JSON.stringify([artifactId, authorityKey, baseUrl.href, workspaceId, loadEpoch]);\n const [state, setState] = useState<LoadState>({ key: null, kind: \"loading\" });\n const current = state.key === loadKey ? state : null;\n const openRef = useRef(open);\n openRef.current = open;\n const onTitleRef = useRef(onTitle);\n onTitleRef.current = onTitle;\n useEffect(() => {\n const abort = new AbortController();\n setState({ key: loadKey, kind: \"loading\" });\n void openRef\n .current(abort.signal)\n .then((value) => {\n if (abort.signal.aborted) return;\n setState({ key: loadKey, kind: \"ready\", value });\n onTitleRef.current?.(value.artifact.title);\n })\n .catch((error: unknown) => {\n if (!abort.signal.aborted) setState({ key: loadKey, kind: \"error\", error });\n });\n return () => abort.abort();\n }, [loadKey]);\n\n const ready = current?.kind === \"ready\" ? current.value : null;\n const transportRef = useRef(transport);\n transportRef.current = transport;\n const sessionKey = useMemo(\n () =>\n ready\n ? JSON.stringify({\n baseUrl: baseUrl.href,\n authorityKey,\n workspaceId,\n artifact: { id: ready.artifact.id, modality: ready.artifact.modality },\n authority: ready.authority,\n replicaId: ready.replicaId,\n workerUrl: runtimes.workerUrl,\n })\n : \"\",\n [authorityKey, baseUrl.href, ready, runtimes.workerUrl, workspaceId],\n );\n const createSession = useCallback(() => {\n if (!ready) throw new Error(\"Artifact is not open\");\n return createBrowserEditableArtifactSession({\n baseUrl,\n workspaceId,\n artifact: ready.artifact,\n storageAuthority: ready.authority,\n replicaId: ready.replicaId,\n runtime: {\n ...runtimeFor(runtimes, ready.artifact.modality),\n workerUrl: runtimes.workerUrl,\n ...(runtimes.applicationOrigin ? { applicationOrigin: runtimes.applicationOrigin } : {}),\n ...(runtimes.allowInsecureDevelopmentAssets\n ? { allowInsecureDevelopmentAssets: true }\n : {}),\n },\n ...(transportRef.current ? { transport: transportRef.current } : {}),\n });\n }, [baseUrl, ready, runtimes, workspaceId]);\n\n if (!current || current.kind === \"loading\")\n return <ArtifactLoading label={loadingLabel ?? labels.opening} />;\n if (current.kind === \"error\") {\n return (\n <ArtifactProblem\n view={\n describeError\n ? describeError(current.error)\n : artifactLoadErrorView(current.error, \"editable\", labels)\n }\n onRetry={() => setLoadEpoch((value) => value + 1)}\n />\n );\n }\n const { artifact } = current.value;\n const surface = { title: artifact.title, showHeader };\n return (\n <div className=\"h-full min-h-0 bg-og-bg text-og-fg\">\n <EditableArtifactWorkbenchHost\n sessionKey={sessionKey}\n createSession={createSession}\n document={surface}\n spreadsheet={surface}\n presentation={surface}\n />\n </div>\n );\n}\n\nfunction runtimeFor(\n runtimes: EditableArtifactRuntimes,\n modality: EditableArtifactModality,\n): Omit<EditableArtifactBrowserRuntime, \"workerUrl\" | \"workerFactory\"> {\n switch (modality) {\n case \"document\":\n return runtimes.document;\n case \"spreadsheet\":\n return runtimes.spreadsheet;\n case \"presentation\":\n return runtimes.presentation;\n }\n}\n","import {\n createBrowserEditableArtifactSession,\n type CreateBrowserEditableArtifactSessionOptions,\n type EditableArtifactBrowserRuntime,\n type EditableArtifactSession,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useArtifactLabels } from \"./artifact-chrome\";\nimport { EditableArtifactMessage } from \"./editable-artifact-ui\";\nimport {\n EditableDocumentArtifactSurface,\n type EditableDocumentArtifactSurfaceProps,\n} from \"./editable-document\";\nimport {\n EditablePresentationArtifactSurface,\n type EditablePresentationArtifactSurfaceProps,\n} from \"./editable-presentation\";\nimport {\n EditableSpreadsheetArtifactSurface,\n type EditableSpreadsheetArtifactSurfaceProps,\n} from \"./editable-spreadsheet\";\n\nexport type EditableArtifactWorkbenchProps = Readonly<{\n session: EditableArtifactSession;\n document?: Omit<EditableDocumentArtifactSurfaceProps, \"session\">;\n spreadsheet?: Omit<EditableSpreadsheetArtifactSurfaceProps, \"session\">;\n presentation?: Omit<EditablePresentationArtifactSurfaceProps, \"session\">;\n}>;\n\nexport type EditableArtifactWorkbenchHostProps = Omit<EditableArtifactWorkbenchProps, \"session\"> &\n Readonly<{\n /**\n * Complete identity of the browser session authority. Change this when the\n * artifact, deployment, principal, or authorization epoch changes.\n */\n sessionKey: string;\n /** Called for the active keyed lifecycle and again only after replacement or retry. */\n createSession: () => EditableArtifactSession;\n }>;\n\ntype DefaultBrowserArtifactTransport = Omit<\n NonNullable<CreateBrowserEditableArtifactSessionOptions[\"transport\"]>,\n \"apiKey\" | \"fetch\" | \"headers\" | \"webSocketFactory\"\n> &\n Readonly<{\n /** Static deployment auth headers; rotate authorizationEpoch when they change. */\n headers?: Readonly<Record<string, string>>;\n }>;\n\nexport type BrowserEditableArtifactWorkbenchOptions = Omit<\n CreateBrowserEditableArtifactSessionOptions,\n \"runtime\" | \"storage\" | \"transport\"\n> &\n Readonly<{\n /** Default module Worker only; custom Worker hosts use EditableArtifactWorkbenchHost. */\n runtime: Omit<EditableArtifactBrowserRuntime, \"workerFactory\">;\n /** Default fetch/WebSocket only; static deployment auth headers are supported. */\n transport?: DefaultBrowserArtifactTransport;\n }>;\n\nexport type BrowserEditableArtifactWorkbenchProps = Omit<\n EditableArtifactWorkbenchProps,\n \"session\"\n> &\n Readonly<{ options: BrowserEditableArtifactWorkbenchOptions }>;\n\n/**\n * One modality-neutral SDK workbench. Embedding hosts keep one route/component;\n * each artifact still renders through its complete first-party editor surface.\n */\nexport function EditableArtifactWorkbench({\n session,\n document,\n spreadsheet,\n presentation,\n}: EditableArtifactWorkbenchProps) {\n switch (session.modality) {\n case \"document\":\n return (\n <EditableDocumentArtifactSurface\n {...document}\n session={session}\n title={document?.title ?? \"Document\"}\n />\n );\n case \"spreadsheet\":\n return <EditableSpreadsheetArtifactSurface {...spreadsheet} session={session} />;\n case \"presentation\":\n return <EditablePresentationArtifactSurface {...presentation} session={session} />;\n }\n}\n\n/**\n * Route/embed composition that owns exactly one SDK session. The host supplies\n * the authenticated SDK factory; React guarantees replacement and teardown.\n */\nexport function EditableArtifactWorkbenchHost({\n sessionKey,\n createSession,\n document,\n spreadsheet,\n presentation,\n}: EditableArtifactWorkbenchHostProps) {\n const createSessionRef = useRef(createSession);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [state, setState] = useState<\n | Readonly<{ key: string; session: EditableArtifactSession; error: null }>\n | Readonly<{ key: string | null; session: null; error: Error | null }>\n >({ key: null, session: null, error: null });\n\n useEffect(() => {\n createSessionRef.current = createSession;\n }, [createSession]);\n\n useEffect(() => {\n let owned: EditableArtifactSession | null = null;\n setState({ key: sessionKey, session: null, error: null });\n try {\n owned = createSessionRef.current();\n setState({ key: sessionKey, session: owned, error: null });\n } catch (cause) {\n setState({\n key: sessionKey,\n session: null,\n error: cause instanceof Error ? cause : new Error(\"Could not create artifact session\"),\n });\n }\n return () => {\n const closing = owned;\n owned = null;\n if (closing) void closing.close().catch(() => undefined);\n };\n }, [retryEpoch, sessionKey]);\n\n const retry = useCallback(() => setRetryEpoch((value) => value + 1), []);\n const labels = useArtifactLabels();\n const currentError = state.key === sessionKey ? state.error : null;\n if (state.key === sessionKey && state.session) {\n return (\n <EditableArtifactWorkbench\n session={state.session}\n {...(document ? { document } : {})}\n {...(spreadsheet ? { spreadsheet } : {})}\n {...(presentation ? { presentation } : {})}\n />\n );\n }\n return (\n <EditableArtifactMessage\n title={currentError ? labels.editableErrors.transient.title : labels.opening}\n detail={currentError?.message ?? labels.startingEditor}\n retry={currentError ? retry : undefined}\n retryLabel={labels.retry}\n />\n );\n}\n\n/**\n * Complete default-browser composition for embedders: verified WASM Worker,\n * durable IndexedDB state, authenticated live sync, teardown, and the matching\n * first-party editor. Advanced/custom transports compose the lower-level host.\n */\nexport function BrowserEditableArtifactWorkbench({\n options,\n document,\n spreadsheet,\n presentation,\n}: BrowserEditableArtifactWorkbenchProps) {\n const sessionKey = browserSessionKey(options);\n const createSession = useCallback(() => createBrowserEditableArtifactSession(options), [options]);\n return (\n <EditableArtifactWorkbenchHost\n sessionKey={sessionKey}\n createSession={createSession}\n {...(document ? { document } : {})}\n {...(spreadsheet ? { spreadsheet } : {})}\n {...(presentation ? { presentation } : {})}\n />\n );\n}\n\nfunction browserSessionKey(options: BrowserEditableArtifactWorkbenchOptions): string {\n const transport = options.transport\n ? {\n ...options.transport,\n // Credentials must not be copied into React lifecycle keys. The\n // authorization epoch is the explicit credential/grant rotation fence.\n headers: options.transport.headers\n ? Object.keys(options.transport.headers).sort()\n : undefined,\n }\n : null;\n return JSON.stringify(\n {\n baseUrl: options.baseUrl,\n workspaceId: options.workspaceId,\n artifact: { id: options.artifact.id, modality: options.artifact.modality },\n storageAuthority: options.storageAuthority,\n runtime: options.runtime,\n replicaId: options.replicaId ?? null,\n transport,\n },\n (_key, value: unknown) => (value instanceof URL ? value.href : value),\n );\n}\n","import { SESSION_SCOPE_HEADER, type ClientConfig, type OpenGeniClient } from \"@opengeni/sdk\";\nimport { createEditableArtifactReplicaId } from \"@opengeni/sdk/editable-artifacts\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { useOpenGeni, type ClientOverride } from \"../../session-context\";\nimport {\n ArtifactLabelsProvider,\n ArtifactLoading,\n ArtifactProblem,\n ArtifactViewerHeader,\n artifactLoadErrorView,\n useArtifactLabels,\n type ArtifactKind,\n type ArtifactLabels,\n} from \"./artifact-chrome\";\nimport { EditableArtifactView, type EditableArtifactRuntimes } from \"./editable-artifact-view\";\nimport type { SiteToolBridgeFactory } from \"./chat-interactive-block\";\nimport { SiteView } from \"./site-view\";\n\n/** An artifact opened from a session: the targets agent links and Site previews name. */\nexport type SessionArtifactTarget = Readonly<\n | { kind: \"editable-artifact\"; artifactId: string; title?: string | undefined }\n | { kind: \"site\"; artifactId: string; title?: string | undefined }\n>;\n\n/** Every string the viewer shows, including its Site frame and states. */\nexport type SessionArtifactViewerLabels = Partial<ArtifactLabels>;\n\nexport type SessionArtifactViewerProps = ClientOverride &\n Readonly<{\n /** The conversation the artifact belongs to; the proxy only serves its artifacts. */\n sessionId: string;\n target: SessionArtifactTarget;\n onClose: () => void;\n /** Show a Back control, for example to return to the conversation on phones. */\n onBack?: (() => void) | undefined;\n /** Browser kernels and Worker for documents, spreadsheets, and presentations. */\n editableRuntimes?: EditableArtifactRuntimes | undefined;\n theme?: \"light\" | \"dark\" | undefined;\n /** Host-owned Site API access; omit it and Sites render without workspace tools. */\n siteToolBridge?: SiteToolBridgeFactory | undefined;\n labels?: SessionArtifactViewerLabels | undefined;\n className?: string | undefined;\n }>;\n\ntype ViewerClient = Pick<\n OpenGeniClient,\n | \"withHeaders\"\n | \"apiUrl\"\n | \"fetchApi\"\n | \"getClientConfig\"\n | \"getEditableArtifact\"\n | \"getWorkspaceArtifact\"\n | \"getWorkspaceArtifactHtml\"\n>;\n\nconst viewerClientKeys = new WeakMap<ViewerClient, string>();\n\nfunction viewerClientKey(client: ViewerClient): string {\n let key = viewerClientKeys.get(client);\n if (!key) {\n key = crypto.randomUUID();\n viewerClientKeys.set(client, key);\n }\n return key;\n}\n\n/**\n * A host-mountable viewer for one editable artifact or Site from a session,\n * with its own header (title, Back, Close). Mount it in any sized container\n * (a side panel, a sheet); it fills it. Data flows through the provider's\n * client and `createSessionProxyHandler({ artifacts: true })`, scoped to\n * `sessionId`.\n */\nexport function SessionArtifactViewer({ labels, ...props }: SessionArtifactViewerProps) {\n return (\n <ArtifactLabelsProvider labels={labels}>\n <Viewer {...props} />\n </ArtifactLabelsProvider>\n );\n}\n\nfunction Viewer({\n client: clientOverride,\n workspaceId: workspaceOverride,\n sessionId,\n target,\n onClose,\n onBack,\n editableRuntimes,\n theme,\n siteToolBridge,\n className,\n}: Omit<SessionArtifactViewerProps, \"labels\">) {\n const labels = useArtifactLabels();\n const context = useOpenGeni({ client: clientOverride, workspaceId: workspaceOverride });\n const base = context.client as unknown as ViewerClient;\n const workspaceId = context.workspaceId;\n const client = useMemo(\n () => base.withHeaders({ [SESSION_SCOPE_HEADER]: sessionId }),\n [base, sessionId],\n );\n const [loaded, setLoaded] = useState<{\n key: string;\n client: ViewerClient;\n workspaceId: string;\n title: string;\n kind: ArtifactKind | null;\n } | null>(null);\n const targetKey = `${target.kind}:${target.artifactId}`;\n const current =\n loaded?.key === targetKey && loaded.client === client && loaded.workspaceId === workspaceId\n ? loaded\n : null;\n const kind: ArtifactKind | null = target.kind === \"site\" ? \"site\" : (current?.kind ?? null);\n const [unavailable, setUnavailable] = useState<{\n key: string;\n client: ViewerClient;\n workspaceId: string;\n } | null>(null);\n const markUnavailable = useCallback(\n () => setUnavailable({ key: targetKey, client, workspaceId }),\n [client, targetKey, workspaceId],\n );\n const title =\n current?.title ??\n target.title ??\n (unavailable?.key === targetKey &&\n unavailable.client === client &&\n unavailable.workspaceId === workspaceId\n ? labels.artifact\n : labels.opening);\n return (\n <section\n aria-label={title}\n data-og-artifact-viewer={target.kind}\n className={cn(\"og-root flex h-full min-h-0 w-full min-w-0 flex-col bg-bg text-fg\", className)}\n >\n <ArtifactViewerHeader\n kind={kind}\n title={title}\n onBack={onBack}\n backLabel={labels.back}\n onClose={onClose}\n closeLabel={labels.close}\n />\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n {target.kind === \"site\" ? (\n <SiteView\n key={targetKey}\n client={client}\n workspaceId={workspaceId}\n siteId={target.artifactId}\n theme={theme}\n toolBridge={siteToolBridge}\n showTitle={false}\n onTitle={(next) =>\n setLoaded({ key: targetKey, client, workspaceId, title: next, kind: \"site\" })\n }\n />\n ) : (\n <EditableBody\n key={targetKey}\n client={client}\n workspaceId={workspaceId}\n sessionId={sessionId}\n artifactId={target.artifactId}\n runtimes={editableRuntimes}\n onOpened={(next, modality) =>\n setLoaded({ key: targetKey, client, workspaceId, title: next, kind: modality })\n }\n onUnavailable={markUnavailable}\n />\n )}\n </div>\n </section>\n );\n}\n\nfunction EditableBody({\n client,\n workspaceId,\n sessionId,\n artifactId,\n runtimes,\n onOpened,\n onUnavailable,\n}: {\n client: ViewerClient;\n workspaceId: string;\n sessionId: string;\n artifactId: string;\n runtimes: EditableArtifactRuntimes | undefined;\n onOpened: (title: string, modality: ArtifactKind) => void;\n onUnavailable: () => void;\n}) {\n const labels = useArtifactLabels();\n const clientKey = viewerClientKey(client);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [configState, setConfigState] = useState<{\n client: ViewerClient;\n workspaceId: string;\n sessionId: string;\n result:\n | { kind: \"ready\"; config: Exclude<NonNullable<ClientConfig[\"artifacts\"]>, false> }\n | { kind: \"unavailable\" }\n | { kind: \"error\"; error: unknown };\n } | null>(null);\n const current =\n configState?.client === client &&\n configState.workspaceId === workspaceId &&\n configState.sessionId === sessionId\n ? configState.result\n : null;\n const config = current?.kind === \"ready\" ? current.config : null;\n const scopeRef = useRef({ client, workspaceId, sessionId });\n scopeRef.current = { client, workspaceId, sessionId };\n useEffect(() => {\n let live = true;\n setConfigState(null);\n client.getClientConfig().then(\n (value) =>\n live &&\n setConfigState({\n client,\n workspaceId,\n sessionId,\n result: value.artifacts\n ? { kind: \"ready\", config: value.artifacts }\n : { kind: \"unavailable\" },\n }),\n (error: unknown) =>\n live &&\n setConfigState({ client, workspaceId, sessionId, result: { kind: \"error\", error } }),\n );\n return () => {\n live = false;\n };\n }, [client, retryEpoch, sessionId, workspaceId]);\n const baseUrl = useMemo(\n () => new URL(client.apiUrl(\"/\"), globalThis.location?.href ?? \"http://localhost/\"),\n [client],\n );\n const transport = useMemo(() => {\n if (!config) return undefined;\n const socket = new URL(config.editableLiveUrl);\n let scope = new AbortController();\n const checkCurrent = (signal: AbortSignal) => {\n signal.throwIfAborted();\n if (\n scopeRef.current.client !== client ||\n scopeRef.current.workspaceId !== workspaceId ||\n scopeRef.current.sessionId !== sessionId\n ) {\n throw new DOMException(\"Artifact viewer scope changed\", \"AbortError\");\n }\n };\n return {\n activate: () => {\n if (scope.signal.aborted) scope = new AbortController();\n },\n abort: () => scope.abort(),\n fetch: (async (input: RequestInfo | URL, init?: RequestInit) => {\n const signal = AbortSignal.any([scope.signal, ...(init?.signal ? [init.signal] : [])]);\n checkCurrent(signal);\n const url = new URL(input instanceof Request ? input.url : input, baseUrl);\n if (\n init?.method === \"POST\" &&\n url.pathname ===\n new URL(\n `v1/workspaces/${encodeURIComponent(workspaceId)}/editable-artifacts/${encodeURIComponent(artifactId)}/live-ticket`,\n baseUrl,\n ).pathname\n ) {\n // A reconnect must revalidate the current host principal before\n // minting a ticket for the editor's retained cache partition.\n const next = (await client.getClientConfig({ signal })).artifacts;\n checkCurrent(signal);\n if (!next || artifactCapabilityKey(next) !== artifactCapabilityKey(config)) {\n setConfigState({\n client,\n workspaceId,\n sessionId,\n result: next ? { kind: \"ready\", config: next } : { kind: \"unavailable\" },\n });\n scope.abort();\n signal.throwIfAborted();\n }\n const { replicaId } = (await new Request(input, init).json()) as {\n replicaId?: unknown;\n };\n if (typeof replicaId !== \"string\") throw new TypeError(\"Artifact replica is required\");\n await client.getEditableArtifact(workspaceId, artifactId, { replicaId, signal });\n checkCurrent(signal);\n }\n return client.fetchApi(url, { ...init, signal });\n }) as typeof fetch,\n webSocketUrl: socket,\n ...(isLoopback(baseUrl) && isLoopback(socket)\n ? { allowInsecureDevelopmentTransport: true }\n : {}),\n };\n }, [artifactId, baseUrl, client, config, sessionId, workspaceId]);\n useEffect(() => {\n transport?.activate();\n return () => transport?.abort();\n }, [transport]);\n const blocked = current !== null && (current.kind !== \"ready\" || !runtimes);\n useEffect(() => {\n if (blocked) onUnavailable();\n }, [blocked, onUnavailable]);\n if (!current) return <ArtifactLoading label={labels.opening} />;\n if (current.kind === \"error\") {\n return (\n <ArtifactProblem\n view={artifactLoadErrorView(current.error, \"editable\", labels)}\n onRetry={() => setRetryEpoch((value) => value + 1)}\n />\n );\n }\n if (!config || !transport) {\n return <ArtifactProblem view={{ ...labels.viewingDisabled, retryable: false }} />;\n }\n if (!runtimes) {\n return <ArtifactProblem view={{ ...labels.editorsMissing, retryable: false }} />;\n }\n return (\n <EditableArtifactView\n baseUrl={baseUrl}\n workspaceId={workspaceId}\n artifactId={artifactId}\n authorityKey={JSON.stringify([clientKey, sessionId, artifactCapabilityKey(config)])}\n runtimes={{\n ...runtimes,\n ...(isLoopback(baseUrl) ? { allowInsecureDevelopmentAssets: true } : {}),\n }}\n transport={transport}\n showHeader={false}\n open={async (signal) => {\n const replicaId = createEditableArtifactReplicaId();\n const artifact = await client.getEditableArtifact(workspaceId, artifactId, {\n replicaId,\n signal,\n });\n signal.throwIfAborted();\n onOpened(artifact.title, artifact.modality);\n return {\n artifact,\n replicaId,\n authority: {\n deploymentOrigin: baseUrl.origin,\n workspaceId,\n ...config.cachePartition,\n },\n };\n }}\n />\n );\n}\n\nfunction artifactCapabilityKey(\n config: Exclude<NonNullable<ClientConfig[\"artifacts\"]>, false>,\n): string {\n return JSON.stringify([\n config.editableLiveUrl,\n config.cachePartition.accountId,\n config.cachePartition.principalId,\n config.cachePartition.authorizationEpoch,\n ]);\n}\n\nfunction isLoopback(url: URL): boolean {\n return (\n (url.protocol === \"http:\" || url.protocol === \"ws:\") &&\n (url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\" || url.hostname === \"[::1]\")\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa,WAAW,SAAS,QAAQ,gBAAgB;AA4F5D;AAxDC,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,SAAS,kBAAkB;AACjC,QAAM,CAAC,UAAU,WAAW,IAAI,SAA0B,IAAI;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkB,IAAI;AAChD,QAAM,YAAY,OAA+B,IAAI;AACrD,QAAM,aAAa,OAAO,OAAO;AACjC,aAAW,UAAU;AACrB,QAAM,OAAO,YAAY,YAAY;AACnC,cAAU,SAAS,MAAM;AACzB,UAAM,QAAQ,IAAI,gBAAgB;AAClC,cAAU,UAAU;AACpB,QAAI;AACF,eAAS,IAAI;AACb,YAAM,OAAO,MAAM,iBAAiB,QAAQ,aAAa,QAAQ;AAAA,QAC/D,QAAQ,MAAM;AAAA,QACd,wBAAwB;AAAA,MAC1B,CAAC;AACD,UAAI,MAAM,OAAO,QAAS;AAC1B,kBAAY,IAAI;AAChB,iBAAW,UAAU,KAAK,OAAO,SAAS,KAAK;AAAA,IACjD,SAAS,WAAW;AAClB,UAAI,MAAM,OAAO,QAAS;AAC1B,kBAAY,IAAI;AAChB,eAAS,SAAS;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,WAAW,CAAC;AAChC,YAAU,MAAM;AACd,gBAAY,IAAI;AAChB,SAAK,KAAK;AACV,WAAO,MAAM,UAAU,SAAS,MAAM;AAAA,EACxC,GAAG,CAAC,IAAI,CAAC;AACT,QAAM,UAAU,UAAU;AAC1B,QAAM,SAAS;AAAA,IACb,MACE,UACI,aAAa;AAAA,MACX,YAAY;AAAA,MACZ,eAAe,QAAQ;AAAA,MACvB,gBAAgB,QAAQ;AAAA,IAC1B,CAAC,IACD;AAAA,IACN,CAAC,SAAS,QAAQ,UAAU;AAAA,EAC9B;AACA,MAAI;AACF,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,sBAAsB,OAAO,QAAQ,MAAM;AAAA,QACjD,SAAS,MAAM,KAAK,KAAK;AAAA;AAAA,IAC3B;AAEJ,MAAI,CAAC,YAAY,CAAC,QAAS,QAAO,oBAAC,mBAAgB,OAAO,gBAAgB,OAAO,aAAa;AAC9F,MAAI,SAAS,OAAO,SAAS,WAAW;AACtC,WACE,oBAAC,SAAI,WAAU,6BAA6B,6BAAmB,OAAO,cAAa;AAEvF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,QAAQ;AAAA,MACd,OAAO,SAAS,OAAO,SAAS;AAAA,MAChC;AAAA,MACA,cAAc,IAAI,SAAS,OAAO,SAAS,gBAAgB,QAAQ;AAAA,MACnE,YAAY;AAAA,MACZ,oBAAoB,QAAQ,eAAe;AAAA,MAC3C;AAAA,MACA,MAAI;AAAA,MACJ,WAAW,aAAa;AAAA;AAAA,EAC1B;AAEJ;;;AClHA;AAAA,EACE,wCAAAA;AAAA,OAKK;AACP,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACRlE;AAAA,EACE;AAAA,OAIK;AACP,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AA0EjD,gBAAAC,YAAA;AATD,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA,OAAO,UAAU,SAAS;AAAA;AAAA,MAC5B;AAAA,IAEJ,KAAK;AACH,aAAO,gBAAAA,KAAC,sCAAoC,GAAG,aAAa,SAAkB;AAAA,IAChF,KAAK;AACH,aAAO,gBAAAA,KAAC,uCAAqC,GAAG,cAAc,SAAkB;AAAA,EACpF;AACF;AAMO,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,mBAAmBC,QAAO,aAAa;AAC7C,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,CAAC;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAGxB,EAAE,KAAK,MAAM,SAAS,MAAM,OAAO,KAAK,CAAC;AAE3C,EAAAC,WAAU,MAAM;AACd,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,aAAa,CAAC;AAElB,EAAAA,WAAU,MAAM;AACd,QAAI,QAAwC;AAC5C,aAAS,EAAE,KAAK,YAAY,SAAS,MAAM,OAAO,KAAK,CAAC;AACxD,QAAI;AACF,cAAQ,iBAAiB,QAAQ;AACjC,eAAS,EAAE,KAAK,YAAY,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,IAC3D,SAAS,OAAO;AACd,eAAS;AAAA,QACP,KAAK;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,mCAAmC;AAAA,MACvF,CAAC;AAAA,IACH;AACA,WAAO,MAAM;AACX,YAAM,UAAU;AAChB,cAAQ;AACR,UAAI,QAAS,MAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,CAAC;AAE3B,QAAM,QAAQC,aAAY,MAAM,cAAc,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvE,QAAM,SAAS,kBAAkB;AACjC,QAAM,eAAe,MAAM,QAAQ,aAAa,MAAM,QAAQ;AAC9D,MAAI,MAAM,QAAQ,cAAc,MAAM,SAAS;AAC7C,WACE,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AAAA,QACd,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,QAC/B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA;AAAA,IAC1C;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,eAAe,OAAO,eAAe,UAAU,QAAQ,OAAO;AAAA,MACrE,QAAQ,cAAc,WAAW,OAAO;AAAA,MACxC,OAAO,eAAe,QAAQ;AAAA,MAC9B,YAAY,OAAO;AAAA;AAAA,EACrB;AAEJ;AAOO,SAAS,iCAAiC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,aAAa,kBAAkB,OAAO;AAC5C,QAAM,gBAAgBI,aAAY,MAAM,qCAAqC,OAAO,GAAG,CAAC,OAAO,CAAC;AAChG,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACrC,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA;AAAA,EAC1C;AAEJ;AAEA,SAAS,kBAAkB,SAA0D;AACnF,QAAM,YAAY,QAAQ,YACtB;AAAA,IACE,GAAG,QAAQ;AAAA;AAAA;AAAA,IAGX,SAAS,QAAQ,UAAU,UACvB,OAAO,KAAK,QAAQ,UAAU,OAAO,EAAE,KAAK,IAC5C;AAAA,EACN,IACA;AACJ,SAAO,KAAK;AAAA,IACV;AAAA,MACE,SAAS,QAAQ;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,UAAU,EAAE,IAAI,QAAQ,SAAS,IAAI,UAAU,QAAQ,SAAS,SAAS;AAAA,MACzE,kBAAkB,QAAQ;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,WAAW,QAAQ,aAAa;AAAA,MAChC;AAAA,IACF;AAAA,IACA,CAAC,MAAM,UAAoB,iBAAiB,MAAM,MAAM,OAAO;AAAA,EACjE;AACF;;;AD3DW,gBAAAK,YAAA;AA7EJ,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,CAAC;AAC5C,QAAM,SAAS,kBAAkB;AACjC,QAAM,UAAU,KAAK,UAAU,CAAC,YAAY,cAAc,QAAQ,MAAM,aAAa,SAAS,CAAC;AAC/F,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAoB,EAAE,KAAK,MAAM,MAAM,UAAU,CAAC;AAC5E,QAAM,UAAU,MAAM,QAAQ,UAAU,QAAQ;AAChD,QAAM,UAAUC,QAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,aAAaA,QAAO,OAAO;AACjC,aAAW,UAAU;AACrB,EAAAC,WAAU,MAAM;AACd,UAAM,QAAQ,IAAI,gBAAgB;AAClC,aAAS,EAAE,KAAK,SAAS,MAAM,UAAU,CAAC;AAC1C,SAAK,QACF,QAAQ,MAAM,MAAM,EACpB,KAAK,CAAC,UAAU;AACf,UAAI,MAAM,OAAO,QAAS;AAC1B,eAAS,EAAE,KAAK,SAAS,MAAM,SAAS,MAAM,CAAC;AAC/C,iBAAW,UAAU,MAAM,SAAS,KAAK;AAAA,IAC3C,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,UAAI,CAAC,MAAM,OAAO,QAAS,UAAS,EAAE,KAAK,SAAS,MAAM,SAAS,MAAM,CAAC;AAAA,IAC5E,CAAC;AACH,WAAO,MAAM,MAAM,MAAM;AAAA,EAC3B,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,QAAQ,SAAS,SAAS,UAAU,QAAQ,QAAQ;AAC1D,QAAM,eAAeD,QAAO,SAAS;AACrC,eAAa,UAAU;AACvB,QAAM,aAAaE;AAAA,IACjB,MACE,QACI,KAAK,UAAU;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA,UAAU,EAAE,IAAI,MAAM,SAAS,IAAI,UAAU,MAAM,SAAS,SAAS;AAAA,MACrE,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,MACjB,WAAW,SAAS;AAAA,IACtB,CAAC,IACD;AAAA,IACN,CAAC,cAAc,QAAQ,MAAM,OAAO,SAAS,WAAW,WAAW;AAAA,EACrE;AACA,QAAM,gBAAgBC,aAAY,MAAM;AACtC,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAClD,WAAOC,sCAAqC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,kBAAkB,MAAM;AAAA,MACxB,WAAW,MAAM;AAAA,MACjB,SAAS;AAAA,QACP,GAAG,WAAW,UAAU,MAAM,SAAS,QAAQ;AAAA,QAC/C,WAAW,SAAS;AAAA,QACpB,GAAI,SAAS,oBAAoB,EAAE,mBAAmB,SAAS,kBAAkB,IAAI,CAAC;AAAA,QACtF,GAAI,SAAS,iCACT,EAAE,gCAAgC,KAAK,IACvC,CAAC;AAAA,MACP;AAAA,MACA,GAAI,aAAa,UAAU,EAAE,WAAW,aAAa,QAAQ,IAAI,CAAC;AAAA,IACpE,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,OAAO,UAAU,WAAW,CAAC;AAE1C,MAAI,CAAC,WAAW,QAAQ,SAAS;AAC/B,WAAO,gBAAAN,KAAC,mBAAgB,OAAO,gBAAgB,OAAO,SAAS;AACjE,MAAI,QAAQ,SAAS,SAAS;AAC5B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MACE,gBACI,cAAc,QAAQ,KAAK,IAC3B,sBAAsB,QAAQ,OAAO,YAAY,MAAM;AAAA,QAE7D,SAAS,MAAM,aAAa,CAAC,UAAU,QAAQ,CAAC;AAAA;AAAA,IAClD;AAAA,EAEJ;AACA,QAAM,EAAE,SAAS,IAAI,QAAQ;AAC7B,QAAM,UAAU,EAAE,OAAO,SAAS,OAAO,WAAW;AACpD,SACE,gBAAAA,KAAC,SAAI,WAAU,sCACb,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa;AAAA,MACb,cAAc;AAAA;AAAA,EAChB,GACF;AAEJ;AAEA,SAAS,WACP,UACA,UACqE;AACrE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,EACpB;AACF;;;AE1LA,SAAS,4BAAoE;AAC7E,SAAS,uCAAuC;AAChD,SAAS,eAAAO,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AA4E5D,gBAAAC,MAwDF,YAxDE;AArBN,IAAM,mBAAmB,oBAAI,QAA8B;AAE3D,SAAS,gBAAgB,QAA8B;AACrD,MAAI,MAAM,iBAAiB,IAAI,MAAM;AACrC,MAAI,CAAC,KAAK;AACR,UAAM,OAAO,WAAW;AACxB,qBAAiB,IAAI,QAAQ,GAAG;AAAA,EAClC;AACA,SAAO;AACT;AASO,SAAS,sBAAsB,EAAE,QAAQ,GAAG,MAAM,GAA+B;AACtF,SACE,gBAAAA,KAAC,0BAAuB,QACtB,0BAAAA,KAAC,UAAQ,GAAG,OAAO,GACrB;AAEJ;AAEA,SAAS,OAAO;AAAA,EACd,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,QAAM,SAAS,kBAAkB;AACjC,QAAM,UAAU,YAAY,EAAE,QAAQ,gBAAgB,aAAa,kBAAkB,CAAC;AACtF,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAc,QAAQ;AAC5B,QAAM,SAASC;AAAA,IACb,MAAM,KAAK,YAAY,EAAE,CAAC,oBAAoB,GAAG,UAAU,CAAC;AAAA,IAC5D,CAAC,MAAM,SAAS;AAAA,EAClB;AACA,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAMlB,IAAI;AACd,QAAM,YAAY,GAAG,OAAO,IAAI,IAAI,OAAO,UAAU;AACrD,QAAM,UACJ,QAAQ,QAAQ,aAAa,OAAO,WAAW,UAAU,OAAO,gBAAgB,cAC5E,SACA;AACN,QAAM,OAA4B,OAAO,SAAS,SAAS,SAAU,SAAS,QAAQ;AACtF,QAAM,CAAC,aAAa,cAAc,IAAIA,UAI5B,IAAI;AACd,QAAM,kBAAkBC;AAAA,IACtB,MAAM,eAAe,EAAE,KAAK,WAAW,QAAQ,YAAY,CAAC;AAAA,IAC5D,CAAC,QAAQ,WAAW,WAAW;AAAA,EACjC;AACA,QAAM,QACJ,SAAS,SACT,OAAO,UACN,aAAa,QAAQ,aACtB,YAAY,WAAW,UACvB,YAAY,gBAAgB,cACxB,OAAO,WACP,OAAO;AACb,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,2BAAyB,OAAO;AAAA,MAChC,WAAW,GAAG,qEAAqE,SAAS;AAAA,MAE5F;AAAA,wBAAAH;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW,OAAO;AAAA,YAClB;AAAA,YACA,YAAY,OAAO;AAAA;AAAA,QACrB;AAAA,QACA,gBAAAA,KAAC,SAAI,WAAU,wDACZ,iBAAO,SAAS,SACf,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA,QAAQ,OAAO;AAAA,YACf;AAAA,YACA,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,SAAS,CAAC,SACR,UAAU,EAAE,KAAK,WAAW,QAAQ,aAAa,OAAO,MAAM,MAAM,OAAO,CAAC;AAAA;AAAA,UARzE;AAAA,QAUP,IAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,OAAO;AAAA,YACnB,UAAU;AAAA,YACV,UAAU,CAAC,MAAM,aACf,UAAU,EAAE,KAAK,WAAW,QAAQ,aAAa,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA,YAEhF,eAAe;AAAA;AAAA,UATV;AAAA,QAUP,GAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,SAAS,kBAAkB;AACjC,QAAM,YAAY,gBAAgB,MAAM;AACxC,QAAM,CAAC,YAAY,aAAa,IAAIE,UAAS,CAAC;AAC9C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAQ5B,IAAI;AACd,QAAM,UACJ,aAAa,WAAW,UACxB,YAAY,gBAAgB,eAC5B,YAAY,cAAc,YACtB,YAAY,SACZ;AACN,QAAM,SAAS,SAAS,SAAS,UAAU,QAAQ,SAAS;AAC5D,QAAM,WAAWE,QAAO,EAAE,QAAQ,aAAa,UAAU,CAAC;AAC1D,WAAS,UAAU,EAAE,QAAQ,aAAa,UAAU;AACpD,EAAAC,WAAU,MAAM;AACd,QAAI,OAAO;AACX,mBAAe,IAAI;AACnB,WAAO,gBAAgB,EAAE;AAAA,MACvB,CAAC,UACC,QACA,eAAe;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,MAAM,YACV,EAAE,MAAM,SAAS,QAAQ,MAAM,UAAU,IACzC,EAAE,MAAM,cAAc;AAAA,MAC5B,CAAC;AAAA,MACH,CAAC,UACC,QACA,eAAe,EAAE,QAAQ,aAAa,WAAW,QAAQ,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;AAAA,IACvF;AACA,WAAO,MAAM;AACX,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,WAAW,WAAW,CAAC;AAC/C,QAAM,UAAUJ;AAAA,IACd,MAAM,IAAI,IAAI,OAAO,OAAO,GAAG,GAAG,WAAW,UAAU,QAAQ,mBAAmB;AAAA,IAClF,CAAC,MAAM;AAAA,EACT;AACA,QAAM,YAAYA,SAAQ,MAAM;AAC9B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAS,IAAI,IAAI,OAAO,eAAe;AAC7C,QAAI,QAAQ,IAAI,gBAAgB;AAChC,UAAM,eAAe,CAAC,WAAwB;AAC5C,aAAO,eAAe;AACtB,UACE,SAAS,QAAQ,WAAW,UAC5B,SAAS,QAAQ,gBAAgB,eACjC,SAAS,QAAQ,cAAc,WAC/B;AACA,cAAM,IAAI,aAAa,iCAAiC,YAAY;AAAA,MACtE;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU,MAAM;AACd,YAAI,MAAM,OAAO,QAAS,SAAQ,IAAI,gBAAgB;AAAA,MACxD;AAAA,MACA,OAAO,MAAM,MAAM,MAAM;AAAA,MACzB,OAAQ,OAAO,OAA0B,SAAuB;AAC9D,cAAM,SAAS,YAAY,IAAI,CAAC,MAAM,QAAQ,GAAI,MAAM,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAE,CAAC;AACrF,qBAAa,MAAM;AACnB,cAAM,MAAM,IAAI,IAAI,iBAAiB,UAAU,MAAM,MAAM,OAAO,OAAO;AACzE,YACE,MAAM,WAAW,UACjB,IAAI,aACF,IAAI;AAAA,UACF,iBAAiB,mBAAmB,WAAW,CAAC,uBAAuB,mBAAmB,UAAU,CAAC;AAAA,UACrG;AAAA,QACF,EAAE,UACJ;AAGA,gBAAM,QAAQ,MAAM,OAAO,gBAAgB,EAAE,OAAO,CAAC,GAAG;AACxD,uBAAa,MAAM;AACnB,cAAI,CAAC,QAAQ,sBAAsB,IAAI,MAAM,sBAAsB,MAAM,GAAG;AAC1E,2BAAe;AAAA,cACb;AAAA,cACA;AAAA,cACA;AAAA,cACA,QAAQ,OAAO,EAAE,MAAM,SAAS,QAAQ,KAAK,IAAI,EAAE,MAAM,cAAc;AAAA,YACzE,CAAC;AACD,kBAAM,MAAM;AACZ,mBAAO,eAAe;AAAA,UACxB;AACA,gBAAM,EAAE,UAAU,IAAK,MAAM,IAAI,QAAQ,OAAO,IAAI,EAAE,KAAK;AAG3D,cAAI,OAAO,cAAc,SAAU,OAAM,IAAI,UAAU,8BAA8B;AACrF,gBAAM,OAAO,oBAAoB,aAAa,YAAY,EAAE,WAAW,OAAO,CAAC;AAC/E,uBAAa,MAAM;AAAA,QACrB;AACA,eAAO,OAAO,SAAS,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,MACjD;AAAA,MACA,cAAc;AAAA,MACd,GAAI,WAAW,OAAO,KAAK,WAAW,MAAM,IACxC,EAAE,mCAAmC,KAAK,IAC1C,CAAC;AAAA,IACP;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,QAAQ,QAAQ,WAAW,WAAW,CAAC;AAChE,EAAAI,WAAU,MAAM;AACd,eAAW,SAAS;AACpB,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,SAAS,CAAC;AACd,QAAM,UAAU,YAAY,SAAS,QAAQ,SAAS,WAAW,CAAC;AAClE,EAAAA,WAAU,MAAM;AACd,QAAI,QAAS,eAAc;AAAA,EAC7B,GAAG,CAAC,SAAS,aAAa,CAAC;AAC3B,MAAI,CAAC,QAAS,QAAO,gBAAAL,KAAC,mBAAgB,OAAO,OAAO,SAAS;AAC7D,MAAI,QAAQ,SAAS,SAAS;AAC5B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,sBAAsB,QAAQ,OAAO,YAAY,MAAM;AAAA,QAC7D,SAAS,MAAM,cAAc,CAAC,UAAU,QAAQ,CAAC;AAAA;AAAA,IACnD;AAAA,EAEJ;AACA,MAAI,CAAC,UAAU,CAAC,WAAW;AACzB,WAAO,gBAAAA,KAAC,mBAAgB,MAAM,EAAE,GAAG,OAAO,iBAAiB,WAAW,MAAM,GAAG;AAAA,EACjF;AACA,MAAI,CAAC,UAAU;AACb,WAAO,gBAAAA,KAAC,mBAAgB,MAAM,EAAE,GAAG,OAAO,gBAAgB,WAAW,MAAM,GAAG;AAAA,EAChF;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,KAAK,UAAU,CAAC,WAAW,WAAW,sBAAsB,MAAM,CAAC,CAAC;AAAA,MAClF,UAAU;AAAA,QACR,GAAG;AAAA,QACH,GAAI,WAAW,OAAO,IAAI,EAAE,gCAAgC,KAAK,IAAI,CAAC;AAAA,MACxE;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,MAAM,OAAO,WAAW;AACtB,cAAM,YAAY,gCAAgC;AAClD,cAAM,WAAW,MAAM,OAAO,oBAAoB,aAAa,YAAY;AAAA,UACzE;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO,eAAe;AACtB,iBAAS,SAAS,OAAO,SAAS,QAAQ;AAC1C,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,WAAW;AAAA,YACT,kBAAkB,QAAQ;AAAA,YAC1B;AAAA,YACA,GAAG,OAAO;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBACP,QACQ;AACR,SAAO,KAAK,UAAU;AAAA,IACpB,OAAO;AAAA,IACP,OAAO,eAAe;AAAA,IACtB,OAAO,eAAe;AAAA,IACtB,OAAO,eAAe;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,WAAW,KAAmB;AACrC,UACG,IAAI,aAAa,WAAW,IAAI,aAAa,WAC7C,IAAI,aAAa,eAAe,IAAI,aAAa,eAAe,IAAI,aAAa;AAEtF;","names":["createBrowserEditableArtifactSession","useCallback","useEffect","useMemo","useRef","useState","useCallback","useEffect","useRef","useState","jsx","useRef","useState","useEffect","useCallback","jsx","useState","useRef","useEffect","useMemo","useCallback","createBrowserEditableArtifactSession","useCallback","useEffect","useMemo","useRef","useState","jsx","useMemo","useState","useCallback","useRef","useEffect"]}
|
|
@@ -8,7 +8,7 @@ function toolMatchesLeaf(wireName, leaf) {
|
|
|
8
8
|
}
|
|
9
9
|
function toolDisplayName(name, display) {
|
|
10
10
|
if (!display && /^[a-f0-9]{64}$/.test(name)) return "Tool call";
|
|
11
|
-
const phrase = (display?.toolName ?? mcpToolLeaf(name)).replace(/[_-]+/g, " ").trim();
|
|
11
|
+
const phrase = (display?.toolName ?? mcpToolLeaf(name)).replace(/[_-]+/g, " ").trim().replace(/^batch\s+(?=\S)/i, "");
|
|
12
12
|
const title = display?.title ?? (phrase ? phrase.charAt(0).toUpperCase() + phrase.slice(1) : name);
|
|
13
13
|
return display?.accountLabel ? `${title} \u2014 ${display.accountLabel}` : title;
|
|
14
14
|
}
|
|
@@ -18,4 +18,4 @@ export {
|
|
|
18
18
|
toolMatchesLeaf,
|
|
19
19
|
toolDisplayName
|
|
20
20
|
};
|
|
21
|
-
//# sourceMappingURL=chunk-
|
|
21
|
+
//# sourceMappingURL=chunk-AWZLIMKX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/timeline/tool-display-name.ts"],"sourcesContent":["/**\n * MCP / first-party tool naming helpers.\n *\n * Wire names are often `<serverId>__<toolName>` (see prefixedMcpToolName).\n * Matching and titles must use the leaf tool name so `opengeni__session_create`\n * and bare `session_create` resolve the same UI — without inventing previews\n * from argument JSON.\n */\n\nimport type { ToolDisplayMetadata } from \"@opengeni/sdk\";\n\n/** Leaf tool name after the first `__` server boundary (or the whole name). */\nexport function mcpToolLeaf(name: string): string {\n const boundary = name.indexOf(\"__\");\n return boundary >= 0 ? name.slice(boundary + 2) : name;\n}\n\n/**\n * True when `wireName` is exactly `leaf` or ends with `__${leaf}` (MCP prefix).\n * Does not treat arbitrary suffixes as matches — the leaf must be the full\n * right-hand side after `__`.\n */\nexport function toolMatchesLeaf(wireName: string, leaf: string): boolean {\n return wireName === leaf || wireName.endsWith(`__${leaf}`);\n}\n\n/**\n * Readable label for a tool call (\"session_create\" / \"opengeni__session_create\"\n * → \"Session create\"). Title-cases the first character of the leaf phrase.\n */\nexport function toolDisplayName(name: string, display?: ToolDisplayMetadata): string {\n if (!display && /^[a-f0-9]{64}$/.test(name)) return \"Tool call\";\n const phrase = (display?.toolName ?? mcpToolLeaf(name)).replace(/[_-]+/g, \" \").trim();\n const title =\n display?.title ?? (phrase ? phrase.charAt(0).toUpperCase() + phrase.slice(1) : name);\n return display?.accountLabel ? `${title} — ${display.accountLabel}` : title;\n}\n"],"mappings":";AAYO,SAAS,YAAY,MAAsB;AAChD,QAAM,WAAW,KAAK,QAAQ,IAAI;AAClC,SAAO,YAAY,IAAI,KAAK,MAAM,WAAW,CAAC,IAAI;AACpD;AAOO,SAAS,gBAAgB,UAAkB,MAAuB;AACvE,SAAO,aAAa,QAAQ,SAAS,SAAS,KAAK,IAAI,EAAE;AAC3D;AAMO,SAAS,gBAAgB,MAAc,SAAuC;AACnF,MAAI,CAAC,WAAW,iBAAiB,KAAK,IAAI,EAAG,QAAO;
|
|
1
|
+
{"version":3,"sources":["../src/timeline/tool-display-name.ts"],"sourcesContent":["/**\n * MCP / first-party tool naming helpers.\n *\n * Wire names are often `<serverId>__<toolName>` (see prefixedMcpToolName).\n * Matching and titles must use the leaf tool name so `opengeni__session_create`\n * and bare `session_create` resolve the same UI — without inventing previews\n * from argument JSON.\n */\n\nimport type { ToolDisplayMetadata } from \"@opengeni/sdk\";\n\n/** Leaf tool name after the first `__` server boundary (or the whole name). */\nexport function mcpToolLeaf(name: string): string {\n const boundary = name.indexOf(\"__\");\n return boundary >= 0 ? name.slice(boundary + 2) : name;\n}\n\n/**\n * True when `wireName` is exactly `leaf` or ends with `__${leaf}` (MCP prefix).\n * Does not treat arbitrary suffixes as matches — the leaf must be the full\n * right-hand side after `__`.\n */\nexport function toolMatchesLeaf(wireName: string, leaf: string): boolean {\n return wireName === leaf || wireName.endsWith(`__${leaf}`);\n}\n\n/**\n * Readable label for a tool call (\"session_create\" / \"opengeni__session_create\"\n * → \"Session create\"). Title-cases the first character of the leaf phrase.\n */\nexport function toolDisplayName(name: string, display?: ToolDisplayMetadata): string {\n if (!display && /^[a-f0-9]{64}$/.test(name)) return \"Tool call\";\n // \"batch modify messages\" → \"Modify messages\": batching is transport, not the action.\n const phrase = (display?.toolName ?? mcpToolLeaf(name))\n .replace(/[_-]+/g, \" \")\n .trim()\n .replace(/^batch\\s+(?=\\S)/i, \"\");\n const title =\n display?.title ?? (phrase ? phrase.charAt(0).toUpperCase() + phrase.slice(1) : name);\n return display?.accountLabel ? `${title} — ${display.accountLabel}` : title;\n}\n"],"mappings":";AAYO,SAAS,YAAY,MAAsB;AAChD,QAAM,WAAW,KAAK,QAAQ,IAAI;AAClC,SAAO,YAAY,IAAI,KAAK,MAAM,WAAW,CAAC,IAAI;AACpD;AAOO,SAAS,gBAAgB,UAAkB,MAAuB;AACvE,SAAO,aAAa,QAAQ,SAAS,SAAS,KAAK,IAAI,EAAE;AAC3D;AAMO,SAAS,gBAAgB,MAAc,SAAuC;AACnF,MAAI,CAAC,WAAW,iBAAiB,KAAK,IAAI,EAAG,QAAO;AAEpD,QAAM,UAAU,SAAS,YAAY,YAAY,IAAI,GAClD,QAAQ,UAAU,GAAG,EACrB,KAAK,EACL,QAAQ,oBAAoB,EAAE;AACjC,QAAM,QACJ,SAAS,UAAU,SAAS,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC,IAAI;AACjF,SAAO,SAAS,eAAe,GAAG,KAAK,WAAM,QAAQ,YAAY,KAAK;AACxE;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
mcpToolLeaf
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-AWZLIMKX.js";
|
|
4
4
|
|
|
5
5
|
// src/timeline/presented-image.ts
|
|
6
6
|
import { normalizeMcpOutput, parseSandboxFileArtifactReceipt } from "@opengeni/sdk";
|
|
@@ -113,4 +113,4 @@ export {
|
|
|
113
113
|
timelineGroupContainsPresentedImage,
|
|
114
114
|
useRetainedImageObjectUrl
|
|
115
115
|
};
|
|
116
|
-
//# sourceMappingURL=chunk-
|
|
116
|
+
//# sourceMappingURL=chunk-CJUO7J5Z.js.map
|