@opengeni/react 7.4.0 → 7.5.0-canary.36927100590001
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 +124 -27
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +1 -0
- package/dist/artifacts.js +516 -1413
- package/dist/artifacts.js.map +1 -1
- package/dist/{browser-viewer-2E6R2Y4W.js → browser-viewer-Z7S7QEJL.js} +6 -5
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/{chunk-Y3QTZN2F.js → chunk-2VFNCX4E.js} +6 -6
- package/dist/{chunk-UDD6DLLT.js → chunk-3IJJEYW4.js} +15 -3
- package/dist/chunk-3IJJEYW4.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-5J4FOW6Q.js} +2 -10
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/{chunk-KVERXCFY.js → chunk-5KYZIQFY.js} +40 -3
- package/dist/chunk-5KYZIQFY.js.map +1 -0
- package/dist/{chunk-KNDIXZN6.js → chunk-7UAMYXJY.js} +25 -18
- package/dist/{chunk-KNDIXZN6.js.map → chunk-7UAMYXJY.js.map} +1 -1
- package/dist/{chunk-SEEVCT36.js → chunk-A4UJB2MM.js} +2 -2
- package/dist/{chunk-X4HIN6TV.js → chunk-AFLPWUQ7.js} +71 -162
- package/dist/chunk-AFLPWUQ7.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/{chunk-XEJEOAOV.js → chunk-B7WMS3CS.js} +51 -40
- package/dist/chunk-B7WMS3CS.js.map +1 -0
- package/dist/{chunk-S5JQ4R22.js → chunk-BDKR6BAR.js} +54 -24
- package/dist/chunk-BDKR6BAR.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-DYWBUX5Q.js} +24 -12
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/{chunk-YZ3YYMOM.js → chunk-E3G7SAYZ.js} +252 -624
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/{chunk-5AZSK6MV.js → chunk-LWNLETQT.js} +5 -5
- package/dist/{chunk-USXVQACU.js → chunk-M7LBYP63.js} +5 -4
- package/dist/{chunk-USXVQACU.js.map → chunk-M7LBYP63.js.map} +1 -1
- package/dist/{chunk-L4OSXQ6H.js → chunk-NBOHNRLJ.js} +1289 -1060
- package/dist/chunk-NBOHNRLJ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-3E2AITTZ.js → chunk-WUISZ3WU.js} +32 -28
- package/dist/{chunk-3E2AITTZ.js.map → chunk-WUISZ3WU.js.map} +1 -1
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/{chunk-DUEBTL3N.js → chunk-Y2PRMYLC.js} +4 -3
- package/dist/{chunk-DUEBTL3N.js.map → chunk-Y2PRMYLC.js.map} +1 -1
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/{chunk-V2ABIVYJ.js → chunk-ZXSEDZP7.js} +70 -6
- package/dist/chunk-ZXSEDZP7.js.map +1 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
- package/dist/components/artifacts/index.d.ts +7 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/browser-select-control.d.ts +3 -1
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +20 -3
- package/dist/components/open-geni-links.d.ts +16 -0
- package/dist/components/session-conversation.d.ts +20 -1
- package/dist/components/timeline-pill-geometry.d.ts +8 -0
- package/dist/components/timeline-pill-placement.d.ts +24 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/composer.js +5 -5
- package/dist/{computer-viewer-WMJE6OA3.js → computer-viewer-KJWLH3GI.js} +7 -5
- package/dist/connect.js +7 -6
- package/dist/connect.js.map +1 -1
- package/dist/conversation-timeline.d.ts +1 -1
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +26 -0
- package/dist/desktop.js.map +1 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +1 -1
- package/dist/hooks/use-composer.d.ts +4 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +460 -1386
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +8 -6
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-QB4EUCW5.js → latest-question-IS445HOW.js} +3 -3
- package/dist/lib/format.d.ts +6 -1
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/machines.js +2 -2
- package/dist/{markdown-table-layout-PFUEZ2U4.js → markdown-table-layout-QXSLK4BY.js} +37 -5
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/{queue-surface-implementation-IM2HD3SK.js → queue-surface-implementation-2CAQAIHM.js} +2 -2
- package/dist/realtime.js +3 -3
- package/dist/{sandbox-files-PXPIZAFG.js → sandbox-files-AEJTWGT4.js} +8 -5
- package/dist/sandbox-files-AEJTWGT4.js.map +1 -0
- package/dist/session-ui.d.ts +9 -2
- package/dist/session-ui.js +39 -20
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +4 -4
- package/dist/sites.js +4 -289
- package/dist/sites.js.map +1 -1
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/genie-loading.d.ts +3 -1
- package/dist/timeline/types.d.ts +8 -1
- package/dist/{timeline-annotation-selection-ODLVF4OI.js → timeline-annotation-selection-DMLMM2TX.js} +6 -1
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-pill-geometry-Z23V243M.js +110 -0
- package/dist/timeline-pill-geometry-Z23V243M.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1073 -0
- package/dist/usage.js.map +1 -0
- package/package.json +19 -3
- package/src/artifacts.ts +37 -0
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/editable-artifact-ui.tsx +3 -1
- package/src/components/artifacts/editable-artifact-view.tsx +187 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +34 -36
- package/src/components/artifacts/editable-presentation.tsx +21 -16
- package/src/components/artifacts/index.ts +41 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/browser-select-control.tsx +4 -1
- package/src/components/browser-viewer.tsx +81 -22
- package/src/components/code-editor.tsx +13 -16
- package/src/components/computer-viewer.tsx +51 -23
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/markdown-table-layout.ts +49 -5
- package/src/components/markdown.tsx +5 -2
- package/src/components/message-timeline.tsx +557 -516
- package/src/components/open-geni-links.tsx +24 -0
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/session-chrome.tsx +22 -3
- package/src/components/session-conversation.tsx +195 -102
- package/src/components/timeline-annotation-selection.tsx +7 -0
- package/src/components/timeline-pill-geometry.ts +169 -0
- package/src/components/timeline-pill-placement.ts +99 -0
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/conversation-timeline.ts +10 -2
- package/src/desktop.ts +24 -0
- package/src/editor.ts +13 -0
- package/src/hooks/use-available-models.ts +1 -1
- package/src/hooks/use-composer.ts +57 -2
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-usage.ts +100 -0
- package/src/index.ts +22 -0
- package/src/lib/format.ts +32 -6
- package/src/lib/workbench-peers.ts +62 -0
- package/src/session-ui.ts +22 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +5 -3
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/genie-loading.tsx +16 -6
- package/src/timeline/projection.ts +78 -4
- package/src/timeline/types.ts +8 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +325 -0
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-KVERXCFY.js.map +0 -1
- package/dist/chunk-L4OSXQ6H.js.map +0 -1
- package/dist/chunk-S5JQ4R22.js.map +0 -1
- package/dist/chunk-UDD6DLLT.js.map +0 -1
- package/dist/chunk-UGMKPUEM.js +0 -299
- package/dist/chunk-UGMKPUEM.js.map +0 -1
- package/dist/chunk-V2ABIVYJ.js.map +0 -1
- package/dist/chunk-X4HIN6TV.js.map +0 -1
- package/dist/chunk-XEJEOAOV.js.map +0 -1
- package/dist/chunk-YZ3YYMOM.js.map +0 -1
- package/dist/markdown-table-layout-PFUEZ2U4.js.map +0 -1
- package/dist/timeline-annotation-selection-ODLVF4OI.js.map +0 -1
- /package/dist/{browser-viewer-2E6R2Y4W.js.map → browser-viewer-Z7S7QEJL.js.map} +0 -0
- /package/dist/{computer-viewer-WMJE6OA3.js.map → chat-interactive-block-UGBTNB3L.js.map} +0 -0
- /package/dist/{chunk-Y3QTZN2F.js.map → chunk-2VFNCX4E.js.map} +0 -0
- /package/dist/{chunk-SEEVCT36.js.map → chunk-A4UJB2MM.js.map} +0 -0
- /package/dist/{chunk-5AZSK6MV.js.map → chunk-LWNLETQT.js.map} +0 -0
- /package/dist/{sandbox-files-PXPIZAFG.js.map → computer-viewer-KJWLH3GI.js.map} +0 -0
- /package/dist/{latest-question-QB4EUCW5.js.map → latest-question-IS445HOW.js.map} +0 -0
- /package/dist/{queue-surface-implementation-IM2HD3SK.js.map → queue-surface-implementation-2CAQAIHM.js.map} +0 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn
|
|
3
|
+
} from "./chunk-22KP6LR5.js";
|
|
4
|
+
|
|
5
|
+
// src/components/artifacts/artifact-chrome.tsx
|
|
6
|
+
import { OpenGeniApiError } from "@opengeni/sdk";
|
|
7
|
+
import {
|
|
8
|
+
AlertTriangleIcon,
|
|
9
|
+
ArrowLeftIcon,
|
|
10
|
+
ChevronDownIcon,
|
|
11
|
+
FileIcon,
|
|
12
|
+
FilePenLineIcon,
|
|
13
|
+
GalleryHorizontalEndIcon,
|
|
14
|
+
ImageIcon,
|
|
15
|
+
Loader2Icon,
|
|
16
|
+
PanelsTopLeftIcon,
|
|
17
|
+
RotateCcwIcon,
|
|
18
|
+
Table2Icon,
|
|
19
|
+
XIcon
|
|
20
|
+
} from "lucide-react";
|
|
21
|
+
import {
|
|
22
|
+
createContext,
|
|
23
|
+
forwardRef,
|
|
24
|
+
useContext,
|
|
25
|
+
useMemo
|
|
26
|
+
} from "react";
|
|
27
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
28
|
+
var BUTTON_BASE = "inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-hidden focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-bg disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4";
|
|
29
|
+
var BUTTON_VARIANT = {
|
|
30
|
+
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
|
31
|
+
outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-border dark:bg-input/30 dark:hover:bg-input/50"
|
|
32
|
+
};
|
|
33
|
+
var BUTTON_SIZE = {
|
|
34
|
+
sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
|
|
35
|
+
icon: "size-9",
|
|
36
|
+
"icon-sm": "size-8"
|
|
37
|
+
};
|
|
38
|
+
function ArtifactButton({
|
|
39
|
+
variant = "ghost",
|
|
40
|
+
size = "sm",
|
|
41
|
+
className,
|
|
42
|
+
type = "button",
|
|
43
|
+
...props
|
|
44
|
+
}) {
|
|
45
|
+
return /* @__PURE__ */ jsx(
|
|
46
|
+
"button",
|
|
47
|
+
{
|
|
48
|
+
type,
|
|
49
|
+
className: cn(BUTTON_BASE, BUTTON_VARIANT[variant], BUTTON_SIZE[size], className),
|
|
50
|
+
...props
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
function ArtifactBadge({ className, ...props }) {
|
|
55
|
+
return /* @__PURE__ */ jsx(
|
|
56
|
+
"span",
|
|
57
|
+
{
|
|
58
|
+
className: cn(
|
|
59
|
+
"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-border px-2 py-0.5 text-xs font-medium whitespace-nowrap text-foreground [&>svg]:pointer-events-none [&>svg]:size-3",
|
|
60
|
+
className
|
|
61
|
+
),
|
|
62
|
+
...props
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
var ArtifactSelect = forwardRef(
|
|
67
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs("span", { className: "relative inline-block max-w-full", children: [
|
|
68
|
+
/* @__PURE__ */ jsx(
|
|
69
|
+
"select",
|
|
70
|
+
{
|
|
71
|
+
ref,
|
|
72
|
+
className: cn(
|
|
73
|
+
"peer h-9 w-full appearance-none rounded-md border border-border bg-bg px-2.5 pr-8 text-sm text-fg transition-colors hover:border-border-strong focus-visible:border-ring focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
|
|
74
|
+
className
|
|
75
|
+
),
|
|
76
|
+
...props,
|
|
77
|
+
children
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
/* @__PURE__ */ jsx(
|
|
81
|
+
ChevronDownIcon,
|
|
82
|
+
{
|
|
83
|
+
"aria-hidden": "true",
|
|
84
|
+
className: "pointer-events-none absolute right-2.5 top-1/2 size-4 -translate-y-1/2 text-fg-subtle"
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
] })
|
|
88
|
+
);
|
|
89
|
+
ArtifactSelect.displayName = "ArtifactSelect";
|
|
90
|
+
function artifactKindIcon(kind) {
|
|
91
|
+
if (kind === "image") return /* @__PURE__ */ jsx(ImageIcon, { className: "size-4" });
|
|
92
|
+
if (kind === "file") return /* @__PURE__ */ jsx(FileIcon, { className: "size-4" });
|
|
93
|
+
if (kind === "site") return /* @__PURE__ */ jsx(PanelsTopLeftIcon, { className: "size-4" });
|
|
94
|
+
if (kind === "document") return /* @__PURE__ */ jsx(FilePenLineIcon, { className: "size-4" });
|
|
95
|
+
if (kind === "spreadsheet") return /* @__PURE__ */ jsx(Table2Icon, { className: "size-4" });
|
|
96
|
+
return /* @__PURE__ */ jsx(GalleryHorizontalEndIcon, { className: "size-4" });
|
|
97
|
+
}
|
|
98
|
+
function artifactKindSubtitle(kind) {
|
|
99
|
+
if (kind === "site") return "Site \xB7 published preview";
|
|
100
|
+
if (kind === "image") return "Image \xB7 retained file";
|
|
101
|
+
if (kind === "file") return "File \xB7 retained file";
|
|
102
|
+
return `${kind[0].toUpperCase()}${kind.slice(1)} \xB7 shared editor`;
|
|
103
|
+
}
|
|
104
|
+
var DEFAULT_ARTIFACT_LABELS = Object.freeze({
|
|
105
|
+
back: "Back",
|
|
106
|
+
close: "Close",
|
|
107
|
+
opening: "Opening artifact\u2026",
|
|
108
|
+
artifact: "Artifact",
|
|
109
|
+
startingEditor: "Starting the secure editing session\u2026",
|
|
110
|
+
kindSubtitle: (kind) => artifactKindSubtitle(kind),
|
|
111
|
+
live: "Live",
|
|
112
|
+
reloadSite: "Reload Site",
|
|
113
|
+
openFullScreen: "Open Site full screen",
|
|
114
|
+
editWithAgent: "Edit with Opengeni",
|
|
115
|
+
editShort: "Edit",
|
|
116
|
+
preview: "Preview",
|
|
117
|
+
loadPreview: "Load preview",
|
|
118
|
+
loadSitePreview: "Load Site preview",
|
|
119
|
+
siteVersion: "Site version",
|
|
120
|
+
savedVersion: "Saved version",
|
|
121
|
+
version: (revision) => `Version ${revision}`,
|
|
122
|
+
openSite: "Open Site",
|
|
123
|
+
loadingSite: "Loading Site\u2026",
|
|
124
|
+
siteArchived: "This Site is archived.",
|
|
125
|
+
siteUnpublished: "This Site is archived or unpublished.",
|
|
126
|
+
siteReferenceInvalid: "This Site reference is invalid.",
|
|
127
|
+
siteLoadFailed: "Couldn\u2019t load this Site.",
|
|
128
|
+
retry: "Retry",
|
|
129
|
+
tryAgain: "Try again",
|
|
130
|
+
toolCount: (count) => `${count} ${count === 1 ? "tool" : "tools"}`,
|
|
131
|
+
toolsAvailable: (count) => `${count} workspace tools available to this Site`,
|
|
132
|
+
sourceFileCount: (count) => `${count} source ${count === 1 ? "file" : "files"}`,
|
|
133
|
+
viewingDisabled: {
|
|
134
|
+
title: "Artifact viewing isn't enabled",
|
|
135
|
+
message: "This app doesn't serve editable artifacts yet."
|
|
136
|
+
},
|
|
137
|
+
editorsMissing: {
|
|
138
|
+
title: "This artifact can't open here",
|
|
139
|
+
message: "This app hasn't installed the document, spreadsheet, and presentation editors."
|
|
140
|
+
},
|
|
141
|
+
siteErrors: {
|
|
142
|
+
unavailable: {
|
|
143
|
+
title: "This Site isn't available",
|
|
144
|
+
message: "It may have been removed, or you may not have access."
|
|
145
|
+
},
|
|
146
|
+
invalid: {
|
|
147
|
+
title: "This Site link isn't valid",
|
|
148
|
+
message: "Check the address and open a Site from your workspace library."
|
|
149
|
+
},
|
|
150
|
+
transient: {
|
|
151
|
+
title: "Couldn't load this Site",
|
|
152
|
+
message: "A temporary problem prevented this Site from loading. Try again."
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
editableErrors: {
|
|
156
|
+
unavailable: {
|
|
157
|
+
title: "This artifact isn't available",
|
|
158
|
+
message: "It may have been removed, or you may not have access."
|
|
159
|
+
},
|
|
160
|
+
invalid: {
|
|
161
|
+
title: "This artifact link isn't valid",
|
|
162
|
+
message: "Check the address and open the artifact from your workspace library."
|
|
163
|
+
},
|
|
164
|
+
transient: {
|
|
165
|
+
title: "Could not open this artifact",
|
|
166
|
+
message: "A temporary problem prevented this artifact from opening. Try again."
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
reference: (id) => `Reference: ${id}`
|
|
170
|
+
});
|
|
171
|
+
var ArtifactLabelsContext = createContext(DEFAULT_ARTIFACT_LABELS);
|
|
172
|
+
function ArtifactLabelsProvider({
|
|
173
|
+
labels,
|
|
174
|
+
children
|
|
175
|
+
}) {
|
|
176
|
+
const parent = useContext(ArtifactLabelsContext);
|
|
177
|
+
const value = useMemo(() => labels ? { ...parent, ...labels } : parent, [labels, parent]);
|
|
178
|
+
return /* @__PURE__ */ jsx(ArtifactLabelsContext.Provider, { value, children });
|
|
179
|
+
}
|
|
180
|
+
function useArtifactLabels() {
|
|
181
|
+
return useContext(ArtifactLabelsContext);
|
|
182
|
+
}
|
|
183
|
+
function ArtifactViewerHeader({
|
|
184
|
+
kind,
|
|
185
|
+
title,
|
|
186
|
+
subtitle,
|
|
187
|
+
titleSlot,
|
|
188
|
+
onBack,
|
|
189
|
+
backLabel,
|
|
190
|
+
actions,
|
|
191
|
+
onClose,
|
|
192
|
+
closeLabel
|
|
193
|
+
}) {
|
|
194
|
+
const labels = useArtifactLabels();
|
|
195
|
+
backLabel ??= labels.back;
|
|
196
|
+
closeLabel ??= labels.close;
|
|
197
|
+
return /* @__PURE__ */ jsxs(
|
|
198
|
+
"div",
|
|
199
|
+
{
|
|
200
|
+
"data-og-artifact-header": "",
|
|
201
|
+
className: "flex min-h-11 shrink-0 items-center gap-2 border-b border-border px-2",
|
|
202
|
+
children: [
|
|
203
|
+
onBack ? /* @__PURE__ */ jsx(ArtifactButton, { size: "icon-sm", "aria-label": backLabel, title: backLabel, onClick: onBack, children: /* @__PURE__ */ jsx(ArrowLeftIcon, { className: "size-4" }) }) : null,
|
|
204
|
+
/* @__PURE__ */ jsx("span", { className: "flex size-7 shrink-0 items-center justify-center rounded-md bg-accent text-accent-foreground", children: kind ? artifactKindIcon(kind) : /* @__PURE__ */ jsx(FileIcon, { className: "size-4" }) }),
|
|
205
|
+
titleSlot ?? /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
206
|
+
/* @__PURE__ */ jsx("p", { className: "m-0 truncate text-sm font-medium", children: title }),
|
|
207
|
+
subtitle ?? (kind ? labels.kindSubtitle(kind) : "") ? /* @__PURE__ */ jsx("p", { className: "m-0 truncate text-xs text-fg-subtle", children: subtitle ?? (kind ? labels.kindSubtitle(kind) : "") }) : null
|
|
208
|
+
] }),
|
|
209
|
+
actions,
|
|
210
|
+
onClose ? /* @__PURE__ */ jsx(
|
|
211
|
+
ArtifactButton,
|
|
212
|
+
{
|
|
213
|
+
size: "icon-sm",
|
|
214
|
+
className: "shrink-0",
|
|
215
|
+
"aria-label": closeLabel,
|
|
216
|
+
title: closeLabel,
|
|
217
|
+
onClick: onClose,
|
|
218
|
+
children: /* @__PURE__ */ jsx(XIcon, { className: "size-4" })
|
|
219
|
+
}
|
|
220
|
+
) : null
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
function ArtifactLoading({ label }) {
|
|
226
|
+
return /* @__PURE__ */ jsx(
|
|
227
|
+
"section",
|
|
228
|
+
{
|
|
229
|
+
role: "status",
|
|
230
|
+
className: "grid h-full min-h-0 flex-1 grid-cols-[minmax(0,1fr)] place-items-center px-4 text-center",
|
|
231
|
+
children: /* @__PURE__ */ jsxs("div", { className: "max-w-sm rounded-lg border border-border bg-surface p-5 text-sm text-fg-muted", children: [
|
|
232
|
+
/* @__PURE__ */ jsx(Loader2Icon, { "aria-hidden": true, className: "mx-auto mb-3 size-5 animate-spin text-fg" }),
|
|
233
|
+
label
|
|
234
|
+
] })
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
function ArtifactProblem({
|
|
239
|
+
view,
|
|
240
|
+
onRetry
|
|
241
|
+
}) {
|
|
242
|
+
const labels = useArtifactLabels();
|
|
243
|
+
return /* @__PURE__ */ jsx(
|
|
244
|
+
"section",
|
|
245
|
+
{
|
|
246
|
+
role: "alert",
|
|
247
|
+
className: "grid h-full min-h-0 flex-1 grid-cols-[minmax(0,1fr)] place-items-center px-4 text-center",
|
|
248
|
+
children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md rounded-lg border border-border bg-surface p-5", children: [
|
|
249
|
+
/* @__PURE__ */ jsx(AlertTriangleIcon, { "aria-hidden": true, className: "mx-auto mb-3 size-5 text-status-waiting" }),
|
|
250
|
+
/* @__PURE__ */ jsx("h2", { className: "m-0 text-base font-semibold", children: view.title }),
|
|
251
|
+
/* @__PURE__ */ jsx("p", { className: "mb-0 mt-2 text-sm leading-5 text-fg-muted", children: artifactLoadErrorMessage(view, labels) }),
|
|
252
|
+
view.retryable && onRetry ? /* @__PURE__ */ jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsxs(ArtifactButton, { variant: "outline", onClick: onRetry, children: [
|
|
253
|
+
/* @__PURE__ */ jsx(RotateCcwIcon, { "aria-hidden": "true" }),
|
|
254
|
+
labels.tryAgain
|
|
255
|
+
] }) }) : null
|
|
256
|
+
] })
|
|
257
|
+
}
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
function artifactLoadErrorView(error, kind, labels = DEFAULT_ARTIFACT_LABELS) {
|
|
261
|
+
const copy = kind === "site" ? labels.siteErrors : labels.editableErrors;
|
|
262
|
+
const correlationId = error instanceof OpenGeniApiError ? error.correlationId : void 0;
|
|
263
|
+
const withSupport = (view) => correlationId ? { ...view, correlationId } : view;
|
|
264
|
+
if (error instanceof OpenGeniApiError) {
|
|
265
|
+
if (error.status === 401 || error.status === 403 || error.status === 404) {
|
|
266
|
+
return withSupport({ ...copy.unavailable, retryable: false });
|
|
267
|
+
}
|
|
268
|
+
if (error.status === 422) return withSupport({ ...copy.invalid, retryable: false });
|
|
269
|
+
return withSupport({ ...copy.transient, retryable: error.retryable });
|
|
270
|
+
}
|
|
271
|
+
return { ...copy.transient, retryable: true };
|
|
272
|
+
}
|
|
273
|
+
function artifactLoadErrorMessage(view, labels = DEFAULT_ARTIFACT_LABELS) {
|
|
274
|
+
return view.correlationId ? `${view.message} ${labels.reference(view.correlationId)}` : view.message;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export {
|
|
278
|
+
ArtifactButton,
|
|
279
|
+
ArtifactBadge,
|
|
280
|
+
ArtifactSelect,
|
|
281
|
+
artifactKindIcon,
|
|
282
|
+
artifactKindSubtitle,
|
|
283
|
+
DEFAULT_ARTIFACT_LABELS,
|
|
284
|
+
ArtifactLabelsProvider,
|
|
285
|
+
useArtifactLabels,
|
|
286
|
+
ArtifactViewerHeader,
|
|
287
|
+
ArtifactLoading,
|
|
288
|
+
ArtifactProblem,
|
|
289
|
+
artifactLoadErrorView,
|
|
290
|
+
artifactLoadErrorMessage
|
|
291
|
+
};
|
|
292
|
+
//# sourceMappingURL=chunk-5CVXZA3Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/artifacts/artifact-chrome.tsx"],"sourcesContent":["import { OpenGeniApiError } from \"@opengeni/sdk\";\nimport {\n AlertTriangleIcon,\n ArrowLeftIcon,\n ChevronDownIcon,\n FileIcon,\n FilePenLineIcon,\n GalleryHorizontalEndIcon,\n ImageIcon,\n Loader2Icon,\n PanelsTopLeftIcon,\n RotateCcwIcon,\n Table2Icon,\n XIcon,\n} from \"lucide-react\";\nimport {\n createContext,\n forwardRef,\n useContext,\n useMemo,\n type ComponentProps,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../../lib/cn\";\n\n/**\n * Shared chrome for artifact surfaces: the OpenGeni console and embedding hosts\n * render the same header, controls, and load states. Class names use the\n * package theme aliases, so the console's own Tailwind build and the compiled\n * `.og-root` stylesheet resolve them identically.\n */\n\nexport type ArtifactKind = \"document\" | \"spreadsheet\" | \"presentation\" | \"site\" | \"image\" | \"file\";\n\nconst BUTTON_BASE =\n \"inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-hidden focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-bg disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\";\nconst BUTTON_VARIANT = {\n ghost: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-border dark:bg-input/30 dark:hover:bg-input/50\",\n} as const;\nconst BUTTON_SIZE = {\n sm: \"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n} as const;\n\nexport function ArtifactButton({\n variant = \"ghost\",\n size = \"sm\",\n className,\n type = \"button\",\n ...props\n}: ComponentProps<\"button\"> & {\n variant?: keyof typeof BUTTON_VARIANT;\n size?: keyof typeof BUTTON_SIZE;\n}) {\n return (\n <button\n type={type}\n className={cn(BUTTON_BASE, BUTTON_VARIANT[variant], BUTTON_SIZE[size], className)}\n {...props}\n />\n );\n}\n\nexport function ArtifactBadge({ className, ...props }: ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-border px-2 py-0.5 text-xs font-medium whitespace-nowrap text-foreground [&>svg]:pointer-events-none [&>svg]:size-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport const ArtifactSelect = forwardRef<HTMLSelectElement, ComponentProps<\"select\">>(\n ({ className, children, ...props }, ref) => (\n <span className=\"relative inline-block max-w-full\">\n <select\n ref={ref}\n className={cn(\n \"peer h-9 w-full appearance-none rounded-md border border-border bg-bg px-2.5 pr-8 text-sm text-fg transition-colors hover:border-border-strong focus-visible:border-ring focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n {children}\n </select>\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute right-2.5 top-1/2 size-4 -translate-y-1/2 text-fg-subtle\"\n />\n </span>\n ),\n);\nArtifactSelect.displayName = \"ArtifactSelect\";\n\nexport function artifactKindIcon(kind: ArtifactKind): ReactNode {\n if (kind === \"image\") return <ImageIcon className=\"size-4\" />;\n if (kind === \"file\") return <FileIcon className=\"size-4\" />;\n if (kind === \"site\") return <PanelsTopLeftIcon className=\"size-4\" />;\n if (kind === \"document\") return <FilePenLineIcon className=\"size-4\" />;\n if (kind === \"spreadsheet\") return <Table2Icon className=\"size-4\" />;\n return <GalleryHorizontalEndIcon className=\"size-4\" />;\n}\n\nexport function artifactKindSubtitle(kind: ArtifactKind): string {\n if (kind === \"site\") return \"Site · published preview\";\n if (kind === \"image\") return \"Image · retained file\";\n if (kind === \"file\") return \"File · retained file\";\n return `${kind[0]!.toUpperCase()}${kind.slice(1)} · shared editor`;\n}\n\ntype LoadErrorCopy = Readonly<\n Record<\n \"unavailable\" | \"invalid\" | \"transient\",\n {\n title: string;\n message: string;\n }\n >\n>;\n\n/**\n * Every user-facing string in the artifact surfaces (inline Site preview, Site\n * frame, viewer header and states). Hosts translate by passing a partial\n * `labels` object; unspecified keys keep the English defaults.\n */\nexport type ArtifactLabels = Readonly<{\n back: string;\n close: string;\n /** Header title and loading copy until an artifact's title is known. */\n opening: string;\n /** Header title when an artifact cannot be opened. */\n artifact: string;\n startingEditor: string;\n kindSubtitle: (kind: ArtifactKind) => string;\n live: string;\n reloadSite: string;\n openFullScreen: string;\n editWithAgent: string;\n editShort: string;\n preview: string;\n loadPreview: string;\n loadSitePreview: string;\n siteVersion: string;\n savedVersion: string;\n version: (revision: number) => string;\n openSite: string;\n loadingSite: string;\n siteArchived: string;\n siteUnpublished: string;\n siteReferenceInvalid: string;\n siteLoadFailed: string;\n retry: string;\n tryAgain: string;\n toolCount: (count: number) => string;\n toolsAvailable: (count: number) => string;\n sourceFileCount: (count: number) => string;\n viewingDisabled: { title: string; message: string };\n editorsMissing: { title: string; message: string };\n siteErrors: LoadErrorCopy;\n editableErrors: LoadErrorCopy;\n reference: (id: string) => string;\n}>;\n\nexport const DEFAULT_ARTIFACT_LABELS: ArtifactLabels = Object.freeze({\n back: \"Back\",\n close: \"Close\",\n opening: \"Opening artifact…\",\n artifact: \"Artifact\",\n startingEditor: \"Starting the secure editing session…\",\n kindSubtitle: (kind: ArtifactKind) => artifactKindSubtitle(kind),\n live: \"Live\",\n reloadSite: \"Reload Site\",\n openFullScreen: \"Open Site full screen\",\n editWithAgent: \"Edit with Opengeni\",\n editShort: \"Edit\",\n preview: \"Preview\",\n loadPreview: \"Load preview\",\n loadSitePreview: \"Load Site preview\",\n siteVersion: \"Site version\",\n savedVersion: \"Saved version\",\n version: (revision: number) => `Version ${revision}`,\n openSite: \"Open Site\",\n loadingSite: \"Loading Site…\",\n siteArchived: \"This Site is archived.\",\n siteUnpublished: \"This Site is archived or unpublished.\",\n siteReferenceInvalid: \"This Site reference is invalid.\",\n siteLoadFailed: \"Couldn’t load this Site.\",\n retry: \"Retry\",\n tryAgain: \"Try again\",\n toolCount: (count: number) => `${count} ${count === 1 ? \"tool\" : \"tools\"}`,\n toolsAvailable: (count: number) => `${count} workspace tools available to this Site`,\n sourceFileCount: (count: number) => `${count} source ${count === 1 ? \"file\" : \"files\"}`,\n viewingDisabled: {\n title: \"Artifact viewing isn't enabled\",\n message: \"This app doesn't serve editable artifacts yet.\",\n },\n editorsMissing: {\n title: \"This artifact can't open here\",\n message: \"This app hasn't installed the document, spreadsheet, and presentation editors.\",\n },\n siteErrors: {\n unavailable: {\n title: \"This Site isn't available\",\n message: \"It may have been removed, or you may not have access.\",\n },\n invalid: {\n title: \"This Site link isn't valid\",\n message: \"Check the address and open a Site from your workspace library.\",\n },\n transient: {\n title: \"Couldn't load this Site\",\n message: \"A temporary problem prevented this Site from loading. Try again.\",\n },\n },\n editableErrors: {\n unavailable: {\n title: \"This artifact isn't available\",\n message: \"It may have been removed, or you may not have access.\",\n },\n invalid: {\n title: \"This artifact link isn't valid\",\n message: \"Check the address and open the artifact from your workspace library.\",\n },\n transient: {\n title: \"Could not open this artifact\",\n message: \"A temporary problem prevented this artifact from opening. Try again.\",\n },\n },\n reference: (id: string) => `Reference: ${id}`,\n});\n\nconst ArtifactLabelsContext = createContext<ArtifactLabels>(DEFAULT_ARTIFACT_LABELS);\n\n/** Translate every artifact surface below; nested providers override outer ones. */\nexport function ArtifactLabelsProvider({\n labels,\n children,\n}: {\n labels: Partial<ArtifactLabels> | undefined;\n children: ReactNode;\n}) {\n const parent = useContext(ArtifactLabelsContext);\n const value = useMemo(() => (labels ? { ...parent, ...labels } : parent), [labels, parent]);\n return <ArtifactLabelsContext.Provider value={value}>{children}</ArtifactLabelsContext.Provider>;\n}\n\nexport function useArtifactLabels(): ArtifactLabels {\n return useContext(ArtifactLabelsContext);\n}\n\n/**\n * One artifact header: optional Back, the kind tile, title (or a host-supplied\n * title control), trailing actions, and optional Close. The console dock and\n * embedded viewers share it.\n */\nexport function ArtifactViewerHeader({\n kind,\n title,\n subtitle,\n titleSlot,\n onBack,\n backLabel,\n actions,\n onClose,\n closeLabel,\n}: Readonly<{\n /** `null` while the host does not know the modality yet. */\n kind: ArtifactKind | null;\n title: string;\n subtitle?: string | undefined;\n /** Replaces the title text, for example with a picker. */\n titleSlot?: ReactNode;\n onBack?: (() => void) | undefined;\n backLabel?: string | undefined;\n actions?: ReactNode;\n onClose?: (() => void) | undefined;\n closeLabel?: string | undefined;\n}>) {\n const labels = useArtifactLabels();\n backLabel ??= labels.back;\n closeLabel ??= labels.close;\n return (\n <div\n data-og-artifact-header=\"\"\n className=\"flex min-h-11 shrink-0 items-center gap-2 border-b border-border px-2\"\n >\n {onBack ? (\n <ArtifactButton size=\"icon-sm\" aria-label={backLabel} title={backLabel} onClick={onBack}>\n <ArrowLeftIcon className=\"size-4\" />\n </ArtifactButton>\n ) : null}\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-md bg-accent text-accent-foreground\">\n {kind ? artifactKindIcon(kind) : <FileIcon className=\"size-4\" />}\n </span>\n {titleSlot ?? (\n <div className=\"min-w-0 flex-1\">\n <p className=\"m-0 truncate text-sm font-medium\">{title}</p>\n {(subtitle ?? (kind ? labels.kindSubtitle(kind) : \"\")) ? (\n <p className=\"m-0 truncate text-xs text-fg-subtle\">\n {subtitle ?? (kind ? labels.kindSubtitle(kind) : \"\")}\n </p>\n ) : null}\n </div>\n )}\n {actions}\n {onClose ? (\n <ArtifactButton\n size=\"icon-sm\"\n className=\"shrink-0\"\n aria-label={closeLabel}\n title={closeLabel}\n onClick={onClose}\n >\n <XIcon className=\"size-4\" />\n </ArtifactButton>\n ) : null}\n </div>\n );\n}\n\nexport function ArtifactLoading({ label }: { label: string }) {\n return (\n <section\n role=\"status\"\n className=\"grid h-full min-h-0 flex-1 grid-cols-[minmax(0,1fr)] place-items-center px-4 text-center\"\n >\n <div className=\"max-w-sm rounded-lg border border-border bg-surface p-5 text-sm text-fg-muted\">\n <Loader2Icon aria-hidden className=\"mx-auto mb-3 size-5 animate-spin text-fg\" />\n {label}\n </div>\n </section>\n );\n}\n\nexport function ArtifactProblem({\n view,\n onRetry,\n}: {\n view: ArtifactLoadErrorView;\n onRetry?: (() => void) | undefined;\n}) {\n const labels = useArtifactLabels();\n return (\n <section\n role=\"alert\"\n className=\"grid h-full min-h-0 flex-1 grid-cols-[minmax(0,1fr)] place-items-center px-4 text-center\"\n >\n <div className=\"w-full max-w-md rounded-lg border border-border bg-surface p-5\">\n <AlertTriangleIcon aria-hidden className=\"mx-auto mb-3 size-5 text-status-waiting\" />\n <h2 className=\"m-0 text-base font-semibold\">{view.title}</h2>\n <p className=\"mb-0 mt-2 text-sm leading-5 text-fg-muted\">\n {artifactLoadErrorMessage(view, labels)}\n </p>\n {view.retryable && onRetry ? (\n <div className=\"mt-4 flex justify-center\">\n <ArtifactButton variant=\"outline\" onClick={onRetry}>\n <RotateCcwIcon aria-hidden=\"true\" />\n {labels.tryAgain}\n </ArtifactButton>\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\nexport type ArtifactLoadErrorKind = \"site\" | \"editable\";\n\nexport type ArtifactLoadErrorView = Readonly<{\n title: string;\n message: string;\n retryable: boolean;\n correlationId?: string;\n}>;\n\n/** Site/editor load copy. Never surfaces raw OpenGeni API status text. */\nexport function artifactLoadErrorView(\n error: unknown,\n kind: ArtifactLoadErrorKind,\n labels: ArtifactLabels = DEFAULT_ARTIFACT_LABELS,\n): ArtifactLoadErrorView {\n const copy = kind === \"site\" ? labels.siteErrors : labels.editableErrors;\n const correlationId = error instanceof OpenGeniApiError ? error.correlationId : undefined;\n const withSupport = (view: {\n title: string;\n message: string;\n retryable: boolean;\n }): ArtifactLoadErrorView => (correlationId ? { ...view, correlationId } : view);\n if (error instanceof OpenGeniApiError) {\n if (error.status === 401 || error.status === 403 || error.status === 404) {\n return withSupport({ ...copy.unavailable, retryable: false });\n }\n if (error.status === 422) return withSupport({ ...copy.invalid, retryable: false });\n return withSupport({ ...copy.transient, retryable: error.retryable });\n }\n return { ...copy.transient, retryable: true };\n}\n\nexport function artifactLoadErrorMessage(\n view: ArtifactLoadErrorView,\n labels: ArtifactLabels = DEFAULT_ARTIFACT_LABELS,\n): string {\n return view.correlationId\n ? `${view.message} ${labels.reference(view.correlationId)}`\n : view.message;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -92,13 +92,6 @@ function decodeStreamFrame(bytes) {
|
|
|
92
92
|
return { seq, data };
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
// src/lib/host-platform.ts
|
|
96
|
-
function interactionHostPlatform() {
|
|
97
|
-
if (typeof navigator === "undefined") return "other";
|
|
98
|
-
const platform = navigator.platform || navigator.userAgent;
|
|
99
|
-
return /Mac|iPhone|iPad|iPod/u.test(platform) ? "mac" : "other";
|
|
100
|
-
}
|
|
101
|
-
|
|
102
95
|
export {
|
|
103
96
|
STREAM_KIND_DESKTOP,
|
|
104
97
|
STREAM_KIND_PTY,
|
|
@@ -110,7 +103,6 @@ export {
|
|
|
110
103
|
encodeStreamClose,
|
|
111
104
|
encodeStreamFrame,
|
|
112
105
|
decodeStreamOpenAck,
|
|
113
|
-
decodeStreamFrame
|
|
114
|
-
interactionHostPlatform
|
|
106
|
+
decodeStreamFrame
|
|
115
107
|
};
|
|
116
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-5J4FOW6Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/relay-wire.ts"],"sourcesContent":["// Minimal HAND-MIRROR of the relay stream wire messages the desktop frame client\n// needs (`StreamOpen`/`StreamClose` encode; `StreamOpenAck` + `StreamFrame` decode). It exists\n// because the publish-closure guard (scripts/publish-closure-guard.ts) forbids\n// `@opengeni/react` from depending on `@opengeni/agent-proto` — the published SDK\n// closure may only reach `@opengeni/sdk` among `@opengeni/*` packages. So, exactly\n// as the guard prescribes (\"hand-mirror it\"), we re-encode just these three\n// messages against the third-party `@bufbuild/protobuf/wire` runtime (the same\n// runtime `@opengeni/agent-proto` generates against), byte-compatible with the\n// generated code. Field numbers copied verbatim from\n// `packages/agent-proto/src/gen/opengeni_agent.ts`:\n// StreamChannel: channelId=1, workspaceId=2, agentId=3, kind=4(int32), port=5(uint32)\n// StreamOpen: channel=1(msg), token=2, role=3(int32), resumeFromSeq=4(uint64, omitted when \"0\")\n// StreamOpenAck: accepted=1(bool), error=2(AgentError msg), resumeFromSeq=3\n// AgentError: code=1, message=2, retryable=3, detail=4 (we read only message)\n// StreamFrame: channelId=1, seq=2, data=3(bytes), producedAtMs=4 (we read only data)\n// StreamClose: channelId=1, reason=2(int32), message=3\nimport { BinaryReader, BinaryWriter } from \"@bufbuild/protobuf/wire\";\n\n/** `StreamKind.STREAM_KIND_DESKTOP` (agent-proto enum value). */\nexport const STREAM_KIND_DESKTOP = 2;\n/** `StreamKind.STREAM_KIND_PTY` (agent-proto enum value). */\nexport const STREAM_KIND_PTY = 1;\n/** `StreamKind.STREAM_KIND_BROWSER` (agent-proto enum value). */\nexport const STREAM_KIND_BROWSER = 3;\n/** `StreamKind.STREAM_KIND_COMPUTER` (agent-proto enum value). */\nexport const STREAM_KIND_COMPUTER = 4;\n/** `StreamRole.STREAM_ROLE_CLIENT` (agent-proto enum value). */\nexport const STREAM_ROLE_CLIENT = 2;\n/** `StreamCloseReason.STREAM_CLOSE_REASON_NORMAL`. */\nexport const STREAM_CLOSE_REASON_NORMAL = 1;\n\nexport interface RelayChannel {\n channelId: string;\n workspaceId: string;\n agentId: string;\n kind: number;\n port: number;\n}\n\nexport interface RelayStreamOpen {\n channel: RelayChannel;\n token: string;\n role: number;\n resumeFromSeq: string;\n}\n\nfunction encodeChannel(message: RelayChannel, writer: BinaryWriter): BinaryWriter {\n if (message.channelId !== \"\") writer.uint32(10).string(message.channelId);\n if (message.workspaceId !== \"\") writer.uint32(18).string(message.workspaceId);\n if (message.agentId !== \"\") writer.uint32(26).string(message.agentId);\n if (message.kind !== 0) writer.uint32(32).int32(message.kind);\n if (message.port !== 0) writer.uint32(40).uint32(message.port);\n return writer;\n}\n\n/** Encode a `StreamOpen`, byte-compatible with `StreamOpen.encode(...).finish()`. */\nexport function encodeStreamOpen(message: RelayStreamOpen): Uint8Array {\n const writer = new BinaryWriter();\n encodeChannel(message.channel, writer.uint32(10).fork()).join();\n if (message.token !== \"\") writer.uint32(18).string(message.token);\n if (message.role !== 0) writer.uint32(24).int32(message.role);\n if (message.resumeFromSeq !== \"0\") writer.uint32(32).uint64(message.resumeFromSeq);\n return writer.finish();\n}\n\n/** Encode an intentional viewer detach. Transport loss omits this message so\n * reconnect/resume remains available. */\nexport function encodeStreamClose(message: {\n channelId: string;\n reason: number;\n message: string;\n}): Uint8Array {\n const writer = new BinaryWriter();\n if (message.channelId !== \"\") writer.uint32(10).string(message.channelId);\n if (message.reason !== 0) writer.uint32(16).int32(message.reason);\n if (message.message !== \"\") writer.uint32(26).string(message.message);\n return writer.finish();\n}\n\n/** Encode a viewer→agent PTY input `StreamFrame`. */\nexport function encodeStreamFrame(message: {\n channelId: string;\n seq: string;\n data: Uint8Array;\n producedAtMs: string;\n}): Uint8Array {\n const writer = new BinaryWriter();\n if (message.channelId !== \"\") writer.uint32(10).string(message.channelId);\n if (message.seq !== \"0\") writer.uint32(16).uint64(message.seq);\n if (message.data.length > 0) writer.uint32(26).bytes(message.data);\n if (message.producedAtMs !== \"0\") writer.uint32(32).uint64(message.producedAtMs);\n return writer.finish();\n}\n\n/** The only `AgentError` field we surface from a rejected ack. */\nfunction decodeAgentErrorMessage(reader: BinaryReader, length: number): { message?: string } {\n const end = reader.pos + length;\n let message: string | undefined;\n while (reader.pos < end) {\n const tag = reader.uint32();\n if (tag >>> 3 === 2 && tag === 18) {\n message = reader.string();\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) break;\n reader.skip(tag & 7);\n }\n return message !== undefined ? { message } : {};\n}\n\n/** Decode a `StreamOpenAck` (we need `accepted` + the error message). */\nexport function decodeStreamOpenAck(bytes: Uint8Array): {\n accepted: boolean;\n error?: { message?: string };\n} {\n const reader = new BinaryReader(bytes);\n const end = reader.len;\n let accepted = false;\n let error: { message?: string } | undefined;\n while (reader.pos < end) {\n const tag = reader.uint32();\n if (tag >>> 3 === 1 && tag === 8) {\n accepted = reader.bool();\n continue;\n }\n if (tag >>> 3 === 2 && tag === 18) {\n error = decodeAgentErrorMessage(reader, reader.uint32());\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) break;\n reader.skip(tag & 7);\n }\n return error !== undefined ? { accepted, error } : { accepted };\n}\n\n/** Decode the sequence plus `data` from a `StreamFrame`. */\nexport function decodeStreamFrame(bytes: Uint8Array): { seq: string; data: Uint8Array } {\n const reader = new BinaryReader(bytes);\n const end = reader.len;\n let seq = \"0\";\n let data = new Uint8Array(0);\n while (reader.pos < end) {\n const tag = reader.uint32();\n if (tag >>> 3 === 2 && tag === 16) {\n seq = reader.uint64().toString();\n continue;\n }\n if (tag >>> 3 === 3 && tag === 26) {\n // Copy into a fresh ArrayBuffer-backed view: BinaryReader.bytes() returns\n // `Uint8Array<ArrayBufferLike>` (a view into the message buffer), which both\n // narrows the type to `Uint8Array<ArrayBuffer>` and isolates just this frame.\n data = new Uint8Array(reader.bytes());\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) break;\n reader.skip(tag & 7);\n }\n return { seq, data };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
composerSubmissionCanRetry,
|
|
3
|
+
composerSubmissionErrorMessage
|
|
4
|
+
} from "./chunk-3IJJEYW4.js";
|
|
1
5
|
import {
|
|
2
6
|
useSessionEventTrigger
|
|
3
7
|
} from "./chunk-KZ73RL76.js";
|
|
@@ -51,7 +55,8 @@ function restoreOptimisticSendOperations(key) {
|
|
|
51
55
|
newerShadow: operation.newerShadow ?? { text: "", resources: [], annotations: [] },
|
|
52
56
|
state: operation.state === "sending" || operation.state === "queued" ? "sending" : operation.state,
|
|
53
57
|
outcomeUnknown: operation.state === "sending" || operation.state === "queued" ? true : operation.outcomeUnknown,
|
|
54
|
-
error: operation.state === "sending" ? "Delivery was interrupted; retry to reconcile this message." : operation.error,
|
|
58
|
+
error: operation.state === "sending" ? "Delivery was interrupted; retry to reconcile this message." : operation.error ? composerSubmissionErrorMessage(new Error(operation.error)) : void 0,
|
|
59
|
+
retryable: operation.state === "sending" || operation.outcomeUnknown ? true : operation.retryable ?? (operation.error ? composerSubmissionCanRetry(new Error(operation.error)) : true),
|
|
55
60
|
input: operation.input,
|
|
56
61
|
canRetry: !hasMcpCredentialUpdates
|
|
57
62
|
}));
|
|
@@ -917,7 +922,8 @@ function useComposer(sessionId, options = {}) {
|
|
|
917
922
|
(candidate) => candidate.clientEventId === operation.clientEventId ? {
|
|
918
923
|
...candidate,
|
|
919
924
|
state: "failed",
|
|
920
|
-
error: problem.message,
|
|
925
|
+
error: outcomeUnknown ? problem.message : composerSubmissionErrorMessage(problem),
|
|
926
|
+
retryable: outcomeUnknown || composerSubmissionCanRetry(problem),
|
|
921
927
|
outcomeUnknown
|
|
922
928
|
} : candidate
|
|
923
929
|
)
|
|
@@ -1528,6 +1534,7 @@ function useComposer(sessionId, options = {}) {
|
|
|
1528
1534
|
if (operation.outcomeUnknown) {
|
|
1529
1535
|
return { ...operation, state: "sending", error: void 0 };
|
|
1530
1536
|
}
|
|
1537
|
+
if (operation.retryable === false) return operation;
|
|
1531
1538
|
const nextClientEventId = generateClientEventId();
|
|
1532
1539
|
const currentPersonalResourceAttachment = resolveSendExtras(
|
|
1533
1540
|
sendExtrasRef.current
|
|
@@ -1553,6 +1560,7 @@ function useComposer(sessionId, options = {}) {
|
|
|
1553
1560
|
occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1554
1561
|
state: "sending",
|
|
1555
1562
|
error: void 0,
|
|
1563
|
+
retryable: void 0,
|
|
1556
1564
|
outcomeUnknown: false,
|
|
1557
1565
|
canRetry: true
|
|
1558
1566
|
};
|
|
@@ -1891,6 +1899,34 @@ function useComposer(sessionId, options = {}) {
|
|
|
1891
1899
|
const extras = resolveSendExtras(sendExtrasRef.current);
|
|
1892
1900
|
return valueRef.current.length > 0 || annotationsRef.current.length > 0 || restoredResourcesRef.current.length > 0 || (extras.resources?.length ?? 0) > 0 || current?.sourceTurnId !== null && current?.sourceTurnId !== void 0;
|
|
1893
1901
|
}, []);
|
|
1902
|
+
const restoreOptimisticMessage = useCallback(
|
|
1903
|
+
(clientEventId) => {
|
|
1904
|
+
if (targetKeyRef.current !== targetKey || draftLoading || pendingOperationRef.current || hasDraftContent())
|
|
1905
|
+
return;
|
|
1906
|
+
const operation = optimisticSendsRef.current.find(
|
|
1907
|
+
(candidate) => candidate.clientEventId === clientEventId
|
|
1908
|
+
);
|
|
1909
|
+
if (!operation || operation.state !== "failed" || operation.outcomeUnknown) return;
|
|
1910
|
+
localEditRevision.current += 1;
|
|
1911
|
+
valueRef.current = operation.text;
|
|
1912
|
+
restoredResourcesRef.current = [...operation.resources];
|
|
1913
|
+
annotationsRef.current = cloneAnnotations(operation.annotations);
|
|
1914
|
+
setValue(operation.text);
|
|
1915
|
+
setRestoredResources(restoredResourcesRef.current);
|
|
1916
|
+
setAnnotations(annotationsRef.current);
|
|
1917
|
+
setError(null);
|
|
1918
|
+
setOptimisticDraftShadow({
|
|
1919
|
+
text: operation.text,
|
|
1920
|
+
resources: restoredResourcesRef.current,
|
|
1921
|
+
annotations: annotationsRef.current,
|
|
1922
|
+
policy: policyRef.current ?? void 0
|
|
1923
|
+
});
|
|
1924
|
+
replaceOptimisticSends(
|
|
1925
|
+
(current) => current.filter((candidate) => candidate.clientEventId !== clientEventId)
|
|
1926
|
+
);
|
|
1927
|
+
},
|
|
1928
|
+
[draftLoading, hasDraftContent, replaceOptimisticSends, setOptimisticDraftShadow, targetKey]
|
|
1929
|
+
);
|
|
1894
1930
|
const resolveDraftConflict = useCallback(
|
|
1895
1931
|
async (choice) => {
|
|
1896
1932
|
const ownedTargetKey = targetKey;
|
|
@@ -1968,6 +2004,7 @@ function useComposer(sessionId, options = {}) {
|
|
|
1968
2004
|
send,
|
|
1969
2005
|
optimisticMessages: visibleOptimisticMessages,
|
|
1970
2006
|
retryOptimisticMessage,
|
|
2007
|
+
restoreOptimisticMessage: !draftLoading && !pendingOperationRef.current && !hasDraftContent() ? restoreOptimisticMessage : void 0,
|
|
1971
2008
|
removeOptimisticMessage,
|
|
1972
2009
|
steer,
|
|
1973
2010
|
steering: visibleSteering,
|
|
@@ -2096,4 +2133,4 @@ export {
|
|
|
2096
2133
|
shouldSubmitOnKey,
|
|
2097
2134
|
shouldSteerOnKey
|
|
2098
2135
|
};
|
|
2099
|
-
//# sourceMappingURL=chunk-
|
|
2136
|
+
//# sourceMappingURL=chunk-5KYZIQFY.js.map
|