@opengeni/react 0.52.1 → 1.0.1
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 +51 -1
- package/dist/artifacts.d.ts +1 -1
- package/dist/artifacts.js +43 -14
- package/dist/artifacts.js.map +1 -1
- package/dist/{chunk-ROIRTM37.js → chunk-5UQPNLIO.js} +6 -6
- package/dist/{chunk-JR3QFY6B.js → chunk-6KLX2RH5.js} +49 -2
- package/dist/chunk-6KLX2RH5.js.map +1 -0
- package/dist/{chunk-FWS3KC3Z.js → chunk-B6WPZSTT.js} +104 -104
- package/dist/{chunk-FWS3KC3Z.js.map → chunk-B6WPZSTT.js.map} +1 -1
- package/dist/{chunk-HDBG7XGO.js → chunk-C5ZPSSS5.js} +50 -1
- package/dist/chunk-C5ZPSSS5.js.map +1 -0
- package/dist/{chunk-X4S56Y2H.js → chunk-HA46CYQK.js} +135 -11
- package/dist/chunk-HA46CYQK.js.map +1 -0
- package/dist/{chunk-724BW4TW.js → chunk-IGC6A2ZI.js} +2 -2
- package/dist/chunk-LLOLUHVG.js +5937 -0
- package/dist/chunk-LLOLUHVG.js.map +1 -0
- package/dist/{chunk-WYA65Y3F.js → chunk-MKPIAGVL.js} +13 -3
- package/dist/chunk-MKPIAGVL.js.map +1 -0
- package/dist/chunk-R3AZOAB5.js +933 -0
- package/dist/chunk-R3AZOAB5.js.map +1 -0
- package/dist/{chunk-23EJ676W.js → chunk-XBZWOM2K.js} +9 -4
- package/dist/chunk-XBZWOM2K.js.map +1 -0
- package/dist/{chunk-JAGDUCZQ.js → chunk-Y7OEDUJ5.js} +17 -13
- package/dist/chunk-Y7OEDUJ5.js.map +1 -0
- package/dist/client.d.ts +6 -4
- package/dist/components/artifacts/index.d.ts +1 -0
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +14 -0
- package/dist/components/browser-input.d.ts +7 -0
- package/dist/components/browser-viewer.d.ts +5 -4
- package/dist/components/computer-viewer.d.ts +2 -1
- package/dist/components/desktop-viewer.d.ts +26 -2
- package/dist/components/interaction-intervention-banner.d.ts +11 -0
- package/dist/components/sandbox-terminal.d.ts +4 -1
- package/dist/components/sandbox-workspace.d.ts +3 -0
- package/dist/composer.js +6 -6
- package/dist/hooks/use-auth-runs.d.ts +32 -0
- package/dist/hooks/use-browser-downloads.d.ts +25 -0
- package/dist/hooks/use-browser-identities.d.ts +5 -1
- package/dist/hooks/use-browser-session.d.ts +2 -1
- package/dist/hooks/use-browser-sessions.d.ts +1 -1
- package/dist/hooks/use-channels.d.ts +26 -0
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-session.d.ts +2 -1
- package/dist/hooks/use-computer-sessions.d.ts +1 -1
- package/dist/hooks/use-desktop-stream.d.ts +4 -0
- package/dist/hooks/use-interaction-interventions.d.ts +27 -0
- package/dist/hooks/use-interaction-invalidation.d.ts +19 -0
- package/dist/hooks/use-network-routes.d.ts +25 -0
- package/dist/hooks/use-site-auth-connections.d.ts +25 -0
- package/dist/hooks/use-supergrok-accounts.d.ts +26 -0
- package/dist/hooks/use-terminal-stream.d.ts +3 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1220 -1545
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +13 -3
- package/dist/interaction.js +520 -6
- package/dist/interaction.js.map +1 -1
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +15 -0
- package/dist/lib/host-platform.d.ts +5 -0
- package/dist/lib/relay-wire.d.ts +20 -1
- package/dist/machines.js +3 -3
- package/dist/model-policy.d.ts +1 -1
- package/dist/model-policy.js +1 -1
- package/dist/provider.d.ts +3 -2
- package/dist/realtime/realtime-control.d.ts +6 -2
- package/dist/realtime.js +138 -24
- package/dist/realtime.js.map +1 -1
- package/dist/session-context.d.ts +10 -2
- package/dist/session-ui.js +3 -3
- package/dist/session.js +11 -11
- package/dist/timeline/types.d.ts +5 -0
- package/package.json +2 -2
- package/src/artifacts.ts +3 -0
- package/src/client.ts +73 -3
- package/src/components/artifacts/index.ts +5 -0
- package/src/components/artifacts/published-html-artifact-frame.tsx +38 -0
- package/src/components/browser-input.ts +65 -0
- package/src/components/browser-viewer.tsx +1287 -177
- package/src/components/computer-viewer.tsx +611 -114
- package/src/components/desktop-viewer.tsx +114 -1
- package/src/components/interaction-intervention-banner.tsx +99 -0
- package/src/components/machines/machine-detail.tsx +1 -1
- package/src/components/model-policy-picker.tsx +15 -0
- package/src/components/sandbox-terminal.tsx +24 -7
- package/src/components/sandbox-workspace.tsx +42 -4
- package/src/components/workspace-dock.tsx +59 -5
- package/src/hooks/use-attached-browsers.ts +13 -11
- package/src/hooks/use-auth-runs.ts +278 -0
- package/src/hooks/use-browser-downloads.ts +218 -0
- package/src/hooks/use-browser-frame-stream.ts +168 -59
- package/src/hooks/use-browser-identities.ts +47 -6
- package/src/hooks/use-browser-session.ts +94 -27
- package/src/hooks/use-browser-sessions.ts +19 -14
- package/src/hooks/use-channels.ts +99 -0
- package/src/hooks/use-computer-frame-stream.ts +184 -61
- package/src/hooks/use-computer-session.ts +22 -2
- package/src/hooks/use-computer-sessions.ts +19 -13
- package/src/hooks/use-desktop-stream.ts +39 -7
- package/src/hooks/use-interaction-interventions.ts +242 -0
- package/src/hooks/use-interaction-invalidation.ts +66 -0
- package/src/hooks/use-machine-chip.ts +13 -3
- package/src/hooks/use-network-routes.ts +214 -0
- package/src/hooks/use-site-auth-connections.ts +226 -0
- package/src/hooks/use-supergrok-accounts.ts +81 -0
- package/src/hooks/use-terminal-stream.ts +288 -55
- package/src/index.ts +8 -0
- package/src/interaction.ts +30 -0
- package/src/lib/host-platform.ts +10 -0
- package/src/lib/relay-wire.ts +43 -4
- package/src/lib/terminal-capability.ts +1 -1
- package/src/model-policy.ts +19 -4
- package/src/provider.tsx +133 -1
- package/src/realtime/realtime-control.tsx +181 -26
- package/src/session-context.ts +66 -1
- package/src/timeline/activity-rail.tsx +6 -0
- package/src/timeline/projection.ts +58 -0
- package/src/timeline/types.ts +2 -0
- package/styles/compiled.css +64 -6
- package/dist/chunk-23EJ676W.js.map +0 -1
- package/dist/chunk-6BBWWOOU.js +0 -82
- package/dist/chunk-6BBWWOOU.js.map +0 -1
- package/dist/chunk-7I2KB3OK.js +0 -3895
- package/dist/chunk-7I2KB3OK.js.map +0 -1
- package/dist/chunk-HDBG7XGO.js.map +0 -1
- package/dist/chunk-JAGDUCZQ.js.map +0 -1
- package/dist/chunk-JR3QFY6B.js.map +0 -1
- package/dist/chunk-WYA65Y3F.js.map +0 -1
- package/dist/chunk-X4S56Y2H.js.map +0 -1
- package/dist/interactive-workbench-viewers-KHNOHWQE.js +0 -13
- /package/dist/{chunk-ROIRTM37.js.map → chunk-5UQPNLIO.js.map} +0 -0
- /package/dist/{chunk-724BW4TW.js.map → chunk-IGC6A2ZI.js.map} +0 -0
- /package/dist/{interactive-workbench-viewers-KHNOHWQE.js.map → interactive-workbench-viewers-TOHBXJEE.js.map} +0 -0
|
@@ -24,6 +24,8 @@ function useEmbeddedClientRefinement(override, requiredMethods, hookName) {
|
|
|
24
24
|
workspaceId,
|
|
25
25
|
workspaceControlEvent: context?.workspaceControlEvent ?? null,
|
|
26
26
|
workspaceControlConnectionState: context?.workspaceControlConnectionState ?? "idle",
|
|
27
|
+
workspaceInteractionEvent: context?.workspaceInteractionEvent ?? null,
|
|
28
|
+
workspaceInteractionConnectionState: context?.workspaceInteractionConnectionState ?? "idle",
|
|
27
29
|
registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,
|
|
28
30
|
reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION
|
|
29
31
|
};
|
|
@@ -46,19 +48,45 @@ function useOpenGeni(override = {}) {
|
|
|
46
48
|
workspaceId,
|
|
47
49
|
workspaceControlEvent: context?.workspaceControlEvent ?? null,
|
|
48
50
|
workspaceControlConnectionState: context?.workspaceControlConnectionState ?? "idle",
|
|
51
|
+
workspaceInteractionEvent: context?.workspaceInteractionEvent ?? null,
|
|
52
|
+
workspaceInteractionConnectionState: context?.workspaceInteractionConnectionState ?? "idle",
|
|
49
53
|
registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,
|
|
50
54
|
reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION
|
|
51
55
|
};
|
|
52
56
|
}
|
|
53
57
|
var BROWSER_INTERACTION_METHODS = [
|
|
58
|
+
"streamWorkspaceInteractionRevisions",
|
|
59
|
+
"listNetworkRoutes",
|
|
60
|
+
"getNetworkRoute",
|
|
61
|
+
"createNetworkRoute",
|
|
62
|
+
"updateNetworkRoute",
|
|
63
|
+
"listSiteAuthConnections",
|
|
64
|
+
"getSiteAuthConnection",
|
|
65
|
+
"createSiteAuthConnection",
|
|
66
|
+
"updateSiteAuthConnection",
|
|
67
|
+
"listAuthRuns",
|
|
68
|
+
"getAuthRun",
|
|
69
|
+
"startBrowserAuthRun",
|
|
70
|
+
"reportBrowserAuthRun",
|
|
71
|
+
"protectedBrowserAuthFill",
|
|
72
|
+
"verifyBrowserAuthRun",
|
|
73
|
+
"listInteractionInterventions",
|
|
74
|
+
"getInteractionIntervention",
|
|
75
|
+
"createInteractionIntervention",
|
|
76
|
+
"resolveInteractionIntervention",
|
|
54
77
|
"listAttachedBrowsers",
|
|
55
78
|
"getAttachedBrowser",
|
|
56
79
|
"listBrowserIdentities",
|
|
57
80
|
"getBrowserIdentity",
|
|
58
81
|
"createBrowserIdentity",
|
|
82
|
+
"updateBrowserIdentity",
|
|
59
83
|
"listBrowserRevisions",
|
|
60
84
|
"listBrowserSessions",
|
|
61
85
|
"getBrowserSession",
|
|
86
|
+
"readBrowserClipboard",
|
|
87
|
+
"listBrowserDownloads",
|
|
88
|
+
"getBrowserDownload",
|
|
89
|
+
"saveBrowserDownload",
|
|
62
90
|
"createBrowserSession",
|
|
63
91
|
"listBrowserTargets",
|
|
64
92
|
"openBrowserTarget",
|
|
@@ -76,8 +104,14 @@ var BROWSER_INTERACTION_METHODS = [
|
|
|
76
104
|
"endBrowserSession"
|
|
77
105
|
];
|
|
78
106
|
var COMPUTER_INTERACTION_METHODS = [
|
|
107
|
+
"streamWorkspaceInteractionRevisions",
|
|
108
|
+
"listInteractionInterventions",
|
|
109
|
+
"getInteractionIntervention",
|
|
110
|
+
"createInteractionIntervention",
|
|
111
|
+
"resolveInteractionIntervention",
|
|
79
112
|
"listComputerSessions",
|
|
80
113
|
"getComputerSession",
|
|
114
|
+
"readComputerClipboard",
|
|
81
115
|
"createComputerSession",
|
|
82
116
|
"listComputerTargets",
|
|
83
117
|
"observeComputerTarget",
|
|
@@ -87,6 +121,20 @@ var COMPUTER_INTERACTION_METHODS = [
|
|
|
87
121
|
"heartbeatComputerSession",
|
|
88
122
|
"endComputerSession"
|
|
89
123
|
];
|
|
124
|
+
var INTERVENTION_METHODS = [
|
|
125
|
+
"streamWorkspaceInteractionRevisions",
|
|
126
|
+
"listInteractionInterventions",
|
|
127
|
+
"getInteractionIntervention",
|
|
128
|
+
"createInteractionIntervention",
|
|
129
|
+
"resolveInteractionIntervention"
|
|
130
|
+
];
|
|
131
|
+
function useEmbeddedInterventions(override = {}) {
|
|
132
|
+
return useEmbeddedClientRefinement(
|
|
133
|
+
override,
|
|
134
|
+
INTERVENTION_METHODS,
|
|
135
|
+
"interaction intervention hooks"
|
|
136
|
+
);
|
|
137
|
+
}
|
|
90
138
|
function useEmbeddedBrowserInteraction(override = {}) {
|
|
91
139
|
return useEmbeddedClientRefinement(
|
|
92
140
|
override,
|
|
@@ -186,6 +234,7 @@ function useOpenGeniClient(override = {}) {
|
|
|
186
234
|
export {
|
|
187
235
|
OpenGeniContext,
|
|
188
236
|
useOpenGeni,
|
|
237
|
+
useEmbeddedInterventions,
|
|
189
238
|
useEmbeddedBrowserInteraction,
|
|
190
239
|
useEmbeddedComputerInteraction,
|
|
191
240
|
useEmbeddedInteraction,
|
|
@@ -199,4 +248,4 @@ export {
|
|
|
199
248
|
useEmbeddedRealtimeSession,
|
|
200
249
|
useOpenGeniClient
|
|
201
250
|
};
|
|
202
|
-
//# sourceMappingURL=chunk-
|
|
251
|
+
//# sourceMappingURL=chunk-C5ZPSSS5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/session-context.ts"],"sourcesContent":["import type {\n StreamConnectionState,\n WorkspaceControlEvent,\n WorkspaceInteractionRevisionEvent,\n} from \"@opengeni/sdk\";\nimport { createContext, useContext } from \"react\";\nimport type {\n EmbeddedFileAttachmentClientLike,\n EmbeddedGoalClientLike,\n EmbeddedHumanInputSessionClientLike,\n EmbeddedBrowserInteractionClientLike,\n EmbeddedComputerInteractionClientLike,\n EmbeddedInteractionClientLike,\n EmbeddedInterventionClientLike,\n EmbeddedRealtimeSessionClientLike,\n EmbeddedSessionClientLike,\n EmbeddedSessionLineageClientLike,\n EmbeddedSessionMcpApprovalPolicyClientLike,\n EmbeddedSessionReadClientLike,\n SessionClientLike,\n} from \"./client\";\n\nexport type OpenGeniContextValue = {\n client: SessionClientLike;\n workspaceId: string;\n workspaceControlEvent: WorkspaceControlEvent | null;\n workspaceControlConnectionState: StreamConnectionState | \"idle\" | \"error\";\n workspaceInteractionEvent: WorkspaceInteractionRevisionEvent | null;\n workspaceInteractionConnectionState: StreamConnectionState | \"idle\" | \"error\";\n registerSessionReconciler: (\n sessionId: string,\n key: string,\n reconcile: () => Promise<void>,\n ) => () => void;\n reconcileSession: (sessionId: string) => Promise<void>;\n};\n\nexport const OpenGeniContext = createContext<OpenGeniContextValue | null>(null);\n\nconst NOOP_REGISTER_RECONCILER: OpenGeniContextValue[\"registerSessionReconciler\"] = () => () =>\n undefined;\nconst NOOP_RECONCILE_SESSION: OpenGeniContextValue[\"reconcileSession\"] = async () => undefined;\n\nexport type ClientOverride = {\n client?: SessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionClientOverride = {\n client?: EmbeddedSessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedHumanInputClientOverride = {\n client?: EmbeddedHumanInputSessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionMcpApprovalPolicyClientOverride = {\n client?: EmbeddedSessionMcpApprovalPolicyClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionReadClientOverride = {\n client?: EmbeddedSessionReadClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedRealtimeSessionClientOverride = {\n client?: EmbeddedRealtimeSessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedGoalClientOverride = {\n client?: EmbeddedGoalClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionLineageClientOverride = {\n client?: EmbeddedSessionLineageClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedFileAttachmentClientOverride = {\n client?: EmbeddedFileAttachmentClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedInteractionClientOverride = {\n client?: EmbeddedInteractionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedInterventionClientOverride = {\n client?: EmbeddedInterventionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedBrowserInteractionClientOverride = {\n client?: EmbeddedBrowserInteractionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedComputerInteractionClientOverride = {\n client?: EmbeddedComputerInteractionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionContextValue = Omit<OpenGeniContextValue, \"client\"> & {\n client: EmbeddedSessionClientLike;\n};\n\ntype EmbeddedClientOverride<TClient> = {\n client?: TClient | undefined;\n workspaceId?: string | undefined;\n};\n\ntype EmbeddedClientContextValue<TClient> = Omit<OpenGeniContextValue, \"client\"> & {\n client: TClient;\n};\n\nfunction useEmbeddedClientRefinement<TClient extends object>(\n override: EmbeddedClientOverride<TClient>,\n requiredMethods: readonly string[],\n hookName: string,\n): EmbeddedClientContextValue<TClient> {\n const context = useContext(OpenGeniContext);\n const candidate = override.client ?? context?.client;\n const workspaceId = override.workspaceId ?? context?.workspaceId;\n if (!candidate || !workspaceId) {\n throw new Error(\n \"@opengeni/react: no OpenGeni client/workspace available. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId } to the hook.\",\n );\n }\n const methods = candidate as Record<string, unknown>;\n const missing = requiredMethods.filter((method) => typeof methods[method] !== \"function\");\n if (missing.length > 0) {\n throw new Error(\n `@opengeni/react: ${hookName} requires client method${missing.length === 1 ? \"\" : \"s\"} ${missing.join(\", \")}.`,\n );\n }\n return {\n client: candidate as TClient,\n workspaceId,\n workspaceControlEvent: context?.workspaceControlEvent ?? null,\n workspaceControlConnectionState: context?.workspaceControlConnectionState ?? \"idle\",\n workspaceInteractionEvent: context?.workspaceInteractionEvent ?? null,\n workspaceInteractionConnectionState: context?.workspaceInteractionConnectionState ?? \"idle\",\n registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,\n reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION,\n };\n}\n\nfunction eventClientMethods(override: object, directMethods: readonly string[]): readonly string[] {\n const hasSharedEventFeed =\n \"events\" in override && (override as { events?: unknown }).events !== undefined;\n return hasSharedEventFeed ? directMethods : [\"getSession\", \"streamEvents\", ...directMethods];\n}\n\n/** Resolve client + workspace from explicit overrides or the provider. */\nexport function useOpenGeni(override: ClientOverride = {}): OpenGeniContextValue {\n const context = useContext(OpenGeniContext);\n const client = override.client ?? context?.client;\n const workspaceId = override.workspaceId ?? context?.workspaceId;\n if (!client || !workspaceId) {\n throw new Error(\n \"@opengeni/react: no OpenGeni client/workspace available. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId } to the hook.\",\n );\n }\n return {\n client,\n workspaceId,\n workspaceControlEvent: context?.workspaceControlEvent ?? null,\n workspaceControlConnectionState: context?.workspaceControlConnectionState ?? \"idle\",\n workspaceInteractionEvent: context?.workspaceInteractionEvent ?? null,\n workspaceInteractionConnectionState: context?.workspaceInteractionConnectionState ?? \"idle\",\n registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,\n reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION,\n };\n}\n\nconst BROWSER_INTERACTION_METHODS = [\n \"streamWorkspaceInteractionRevisions\",\n \"listNetworkRoutes\",\n \"getNetworkRoute\",\n \"createNetworkRoute\",\n \"updateNetworkRoute\",\n \"listSiteAuthConnections\",\n \"getSiteAuthConnection\",\n \"createSiteAuthConnection\",\n \"updateSiteAuthConnection\",\n \"listAuthRuns\",\n \"getAuthRun\",\n \"startBrowserAuthRun\",\n \"reportBrowserAuthRun\",\n \"protectedBrowserAuthFill\",\n \"verifyBrowserAuthRun\",\n \"listInteractionInterventions\",\n \"getInteractionIntervention\",\n \"createInteractionIntervention\",\n \"resolveInteractionIntervention\",\n \"listAttachedBrowsers\",\n \"getAttachedBrowser\",\n \"listBrowserIdentities\",\n \"getBrowserIdentity\",\n \"createBrowserIdentity\",\n \"updateBrowserIdentity\",\n \"listBrowserRevisions\",\n \"listBrowserSessions\",\n \"getBrowserSession\",\n \"readBrowserClipboard\",\n \"listBrowserDownloads\",\n \"getBrowserDownload\",\n \"saveBrowserDownload\",\n \"createBrowserSession\",\n \"listBrowserTargets\",\n \"openBrowserTarget\",\n \"selectBrowserTarget\",\n \"closeBrowserTarget\",\n \"observeBrowserTarget\",\n \"actInBrowser\",\n \"getBrowserActionReceipt\",\n \"listBrowserDiagnostics\",\n \"attachBrowserSession\",\n \"heartbeatBrowserSession\",\n \"publishBrowserRevision\",\n \"suspendBrowserSession\",\n \"resumeBrowserSession\",\n \"endBrowserSession\",\n] as const;\n\nconst COMPUTER_INTERACTION_METHODS = [\n \"streamWorkspaceInteractionRevisions\",\n \"listInteractionInterventions\",\n \"getInteractionIntervention\",\n \"createInteractionIntervention\",\n \"resolveInteractionIntervention\",\n \"listComputerSessions\",\n \"getComputerSession\",\n \"readComputerClipboard\",\n \"createComputerSession\",\n \"listComputerTargets\",\n \"observeComputerTarget\",\n \"actInComputer\",\n \"getComputerActionReceipt\",\n \"attachComputerSession\",\n \"heartbeatComputerSession\",\n \"endComputerSession\",\n] as const;\n\nconst INTERVENTION_METHODS = [\n \"streamWorkspaceInteractionRevisions\",\n \"listInteractionInterventions\",\n \"getInteractionIntervention\",\n \"createInteractionIntervention\",\n \"resolveInteractionIntervention\",\n] as const;\n\n/** Resolve only the workspace-wide Browser/Computer intervention surface. */\nexport function useEmbeddedInterventions(\n override: EmbeddedInterventionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedInterventionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n INTERVENTION_METHODS,\n \"interaction intervention hooks\",\n );\n}\n\n/** Resolve only BrowserSession methods for a standalone Browser embed. */\nexport function useEmbeddedBrowserInteraction(\n override: EmbeddedBrowserInteractionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedBrowserInteractionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n BROWSER_INTERACTION_METHODS,\n \"browser interaction hooks\",\n );\n}\n\n/** Resolve only ComputerSession methods for a standalone Computer embed. */\nexport function useEmbeddedComputerInteraction(\n override: EmbeddedComputerInteractionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedComputerInteractionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n COMPUTER_INTERACTION_METHODS,\n \"computer interaction hooks\",\n );\n}\n\n/** Resolve the complete Browser + Computer client surface. */\nexport function useEmbeddedInteraction(\n override: EmbeddedInteractionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedInteractionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n [...BROWSER_INTERACTION_METHODS, ...COMPUTER_INTERACTION_METHODS],\n \"interaction hooks\",\n );\n}\n\n/**\n * Resolve the narrow client required by the session-only hooks. The full\n * provider client is structurally compatible, while an explicit host proxy\n * only needs to expose session/event/composer/queue/control operations.\n */\nexport function useEmbeddedSession(\n override: EmbeddedSessionClientOverride = {},\n): EmbeddedSessionContextValue {\n return useEmbeddedClientRefinement(\n override,\n [\n \"getSession\",\n \"listEvents\",\n \"streamEvents\",\n \"getComposerDraft\",\n \"saveComposerDraft\",\n \"sendMessage\",\n \"steerMessage\",\n \"getQueue\",\n \"moveQueueItem\",\n \"editQueueItem\",\n \"steerQueueItem\",\n \"deleteQueueItem\",\n \"pauseSession\",\n \"resumeSession\",\n \"sendApprovalDecision\",\n ],\n \"session hooks\",\n );\n}\n\n/** Resolve the exact client surface required by `useSession`. */\nexport function useEmbeddedSessionRead(\n override: EmbeddedSessionReadClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedSessionReadClientLike> {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getSession\", \"updateSession\"]),\n \"useSession\",\n );\n}\n\n/** Resolve the exact client surface required by `useGoal`. */\nexport function useEmbeddedGoal(\n override: EmbeddedGoalClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedGoalClientLike> {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getGoal\", \"updateGoal\", \"deleteGoal\"]),\n \"useGoal\",\n );\n}\n\n/** Resolve the exact client surface required by `useSessionLineage`. */\nexport function useEmbeddedSessionLineage(\n override: EmbeddedSessionLineageClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedSessionLineageClientLike> {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getSessionLineage\"]),\n \"useSessionLineage\",\n );\n}\n\n/** Resolve the exact client surface required by `useFileAttachments`. */\nexport function useEmbeddedFileAttachments(\n override: EmbeddedFileAttachmentClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedFileAttachmentClientLike> {\n return useEmbeddedClientRefinement(override, [\"uploadFile\"], \"useFileAttachments\");\n}\n\n/**\n * Resolve the structured-input refinement without widening the baseline\n * session-only proxy contract.\n */\nexport function useEmbeddedHumanInputSession(override: EmbeddedHumanInputClientOverride = {}): Omit<\n EmbeddedSessionContextValue,\n \"client\"\n> & {\n client: EmbeddedHumanInputSessionClientLike;\n} {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"listHumanInputRequests\", \"submitHumanInputResponse\"]),\n \"useHumanInputRequests\",\n );\n}\n\n/** Resolve the approval-policy refinement without widening session-only hosts. */\nexport function useEmbeddedSessionMcpApprovalPolicy(\n override: EmbeddedSessionMcpApprovalPolicyClientOverride = {},\n): Omit<EmbeddedSessionContextValue, \"client\"> & {\n client: EmbeddedSessionMcpApprovalPolicyClientLike;\n} {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getSession\", \"updateSessionMcpApprovalPolicy\"]),\n \"useSessionMcpApprovalPolicy\",\n );\n}\n\n/** Resolve the exact browser/API surface required by `@opengeni/react/realtime`. */\nexport function useEmbeddedRealtimeSession(\n override: EmbeddedRealtimeSessionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedRealtimeSessionClientLike> {\n // Preserve the existing lazy capability behavior: proxy/test clients may\n // implement only the methods reached by their selected model and lifecycle.\n // The exported structural type remains the complete embedding contract.\n return useEmbeddedClientRefinement(override, [], \"realtime hooks\");\n}\n\n/**\n * Resolve the client only — for hooks that are not workspace-scoped\n * (`useWorkspaces`, `useBillingUsage`).\n */\nexport function useOpenGeniClient(\n override: Pick<ClientOverride, \"client\"> = {},\n): SessionClientLike {\n const context = useContext(OpenGeniContext);\n const client = override.client ?? context?.client;\n if (!client) {\n throw new Error(\n \"@opengeni/react: no OpenGeni client available. Wrap the tree in <OpenGeniProvider> or pass { client } to the hook.\",\n );\n }\n return client;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
formatBytes,
|
|
3
|
-
formatRelativeTime
|
|
4
|
-
} from "./chunk-LAKLF4PA.js";
|
|
5
1
|
import {
|
|
6
2
|
useMutationRunner,
|
|
7
3
|
usePageLiveActivity,
|
|
@@ -10,7 +6,11 @@ import {
|
|
|
10
6
|
import {
|
|
11
7
|
OpenGeniContext,
|
|
12
8
|
useOpenGeni
|
|
13
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-C5ZPSSS5.js";
|
|
10
|
+
import {
|
|
11
|
+
formatBytes,
|
|
12
|
+
formatRelativeTime
|
|
13
|
+
} from "./chunk-LAKLF4PA.js";
|
|
14
14
|
import {
|
|
15
15
|
cn
|
|
16
16
|
} from "./chunk-22KP6LR5.js";
|
|
@@ -1032,7 +1032,7 @@ function MachineDetail({
|
|
|
1032
1032
|
"data-remove-machine": true,
|
|
1033
1033
|
"aria-label": `Remove machine ${machine.name}`,
|
|
1034
1034
|
onClick: () => onRemove(machine),
|
|
1035
|
-
className: "inline-flex min-h-9 items-center gap-1.5 rounded-og-sm border border-og-status-failed/40 px-2.5 py-1 font-medium text-og-xs text-og-status-failed transition-colors hover:bg-og-status-failed/10 focus-visible:outline-
|
|
1035
|
+
className: "inline-flex min-h-9 items-center gap-1.5 rounded-og-sm border border-og-status-failed/40 px-2.5 py-1 font-medium text-og-xs text-og-status-failed transition-colors hover:bg-og-status-failed/10 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-status-failed/50 pointer-coarse:min-h-11",
|
|
1036
1036
|
children: [
|
|
1037
1037
|
/* @__PURE__ */ jsx7(Trash2Icon, { className: "size-3.5", "aria-hidden": true }),
|
|
1038
1038
|
/* @__PURE__ */ jsx7("span", { className: "hidden sm:inline", children: "Remove machine" })
|
|
@@ -1738,21 +1738,28 @@ function OpenGeniProvider({
|
|
|
1738
1738
|
client,
|
|
1739
1739
|
workspaceId,
|
|
1740
1740
|
onWorkspaceControlEvent,
|
|
1741
|
+
onWorkspaceInteractionEvent,
|
|
1741
1742
|
children
|
|
1742
1743
|
}) {
|
|
1743
1744
|
const [workspaceControlEvent, setWorkspaceControlEvent] = useState3(
|
|
1744
1745
|
null
|
|
1745
1746
|
);
|
|
1746
1747
|
const [workspaceControlConnectionState, setWorkspaceControlConnectionState] = useState3("idle");
|
|
1748
|
+
const [workspaceInteractionEvent, setWorkspaceInteractionEvent] = useState3(null);
|
|
1749
|
+
const [workspaceInteractionConnectionState, setWorkspaceInteractionConnectionState] = useState3("idle");
|
|
1747
1750
|
const [contractMismatch, setContractMismatch] = useState3(
|
|
1748
1751
|
null
|
|
1749
1752
|
);
|
|
1750
1753
|
const callbackRef = useRef2(onWorkspaceControlEvent);
|
|
1754
|
+
const interactionCallbackRef = useRef2(onWorkspaceInteractionEvent);
|
|
1751
1755
|
const reconcilersRef = useRef2(/* @__PURE__ */ new Map());
|
|
1752
1756
|
const reconcileInFlightRef = useRef2(/* @__PURE__ */ new Map());
|
|
1753
1757
|
const workspaceControlSequencesRef = useRef2(/* @__PURE__ */ new Map());
|
|
1758
|
+
const workspaceInteractionSequencesRef = useRef2(/* @__PURE__ */ new Map());
|
|
1754
1759
|
const pageLive = usePageLiveActivity();
|
|
1760
|
+
const supportsWorkspaceLiveStream = "streamWorkspaceLiveEvents" in client && typeof client.streamWorkspaceLiveEvents === "function";
|
|
1755
1761
|
callbackRef.current = onWorkspaceControlEvent;
|
|
1762
|
+
interactionCallbackRef.current = onWorkspaceInteractionEvent;
|
|
1756
1763
|
const verifyApiContract = useCallback(async () => {
|
|
1757
1764
|
try {
|
|
1758
1765
|
const config = await client.getClientConfig();
|
|
@@ -1806,6 +1813,77 @@ function OpenGeniProvider({
|
|
|
1806
1813
|
[verifyApiContract]
|
|
1807
1814
|
);
|
|
1808
1815
|
useEffect(() => {
|
|
1816
|
+
if (!supportsWorkspaceLiveStream) return;
|
|
1817
|
+
const openLiveStream = client.streamWorkspaceLiveEvents;
|
|
1818
|
+
setWorkspaceControlEvent(null);
|
|
1819
|
+
setWorkspaceInteractionEvent(null);
|
|
1820
|
+
if (!pageLive) {
|
|
1821
|
+
setWorkspaceControlConnectionState("idle");
|
|
1822
|
+
setWorkspaceInteractionConnectionState("idle");
|
|
1823
|
+
return;
|
|
1824
|
+
}
|
|
1825
|
+
const controller = new AbortController();
|
|
1826
|
+
const setConnectionState = (state) => {
|
|
1827
|
+
setWorkspaceControlConnectionState(state);
|
|
1828
|
+
setWorkspaceInteractionConnectionState(state);
|
|
1829
|
+
};
|
|
1830
|
+
setConnectionState("connecting");
|
|
1831
|
+
void (async () => {
|
|
1832
|
+
try {
|
|
1833
|
+
await verifyApiContract();
|
|
1834
|
+
const workspace = await client.getWorkspace(workspaceId);
|
|
1835
|
+
const controlAfter = Math.max(
|
|
1836
|
+
workspaceControlSequencesRef.current.get(workspaceId) ?? 0,
|
|
1837
|
+
workspace.inferenceControl.revision
|
|
1838
|
+
);
|
|
1839
|
+
const interactionAfter = workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0;
|
|
1840
|
+
workspaceControlSequencesRef.current.set(workspaceId, controlAfter);
|
|
1841
|
+
const stream = openLiveStream.call(client, workspaceId, {
|
|
1842
|
+
controlAfter,
|
|
1843
|
+
interactionAfter,
|
|
1844
|
+
signal: controller.signal,
|
|
1845
|
+
onStateChange: setConnectionState
|
|
1846
|
+
});
|
|
1847
|
+
for await (const event of stream) {
|
|
1848
|
+
if (controller.signal.aborted) return;
|
|
1849
|
+
if (event.type === "workspace.control.changed") {
|
|
1850
|
+
workspaceControlSequencesRef.current.set(
|
|
1851
|
+
workspaceId,
|
|
1852
|
+
Math.max(workspaceControlSequencesRef.current.get(workspaceId) ?? 0, event.sequence)
|
|
1853
|
+
);
|
|
1854
|
+
setWorkspaceControlEvent(
|
|
1855
|
+
(current) => !current || event.sequence > current.sequence ? event : current
|
|
1856
|
+
);
|
|
1857
|
+
callbackRef.current?.(event);
|
|
1858
|
+
} else {
|
|
1859
|
+
workspaceInteractionSequencesRef.current.set(
|
|
1860
|
+
workspaceId,
|
|
1861
|
+
Math.max(
|
|
1862
|
+
workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0,
|
|
1863
|
+
event.sequence
|
|
1864
|
+
)
|
|
1865
|
+
);
|
|
1866
|
+
setWorkspaceInteractionEvent(
|
|
1867
|
+
(current) => !current || event.sequence > current.sequence ? event : current
|
|
1868
|
+
);
|
|
1869
|
+
interactionCallbackRef.current?.(event);
|
|
1870
|
+
}
|
|
1871
|
+
}
|
|
1872
|
+
} catch (error) {
|
|
1873
|
+
if (error instanceof OpenGeniApiContractMismatchError) {
|
|
1874
|
+
setContractMismatch(error);
|
|
1875
|
+
reloadForContractMismatchOnce(error);
|
|
1876
|
+
}
|
|
1877
|
+
if (!controller.signal.aborted) {
|
|
1878
|
+
setWorkspaceControlConnectionState("error");
|
|
1879
|
+
setWorkspaceInteractionConnectionState("error");
|
|
1880
|
+
}
|
|
1881
|
+
}
|
|
1882
|
+
})();
|
|
1883
|
+
return () => controller.abort();
|
|
1884
|
+
}, [client, pageLive, supportsWorkspaceLiveStream, verifyApiContract, workspaceId]);
|
|
1885
|
+
useEffect(() => {
|
|
1886
|
+
if (supportsWorkspaceLiveStream) return;
|
|
1809
1887
|
if (!pageLive) {
|
|
1810
1888
|
setWorkspaceControlConnectionState("idle");
|
|
1811
1889
|
return;
|
|
@@ -1846,13 +1924,57 @@ function OpenGeniProvider({
|
|
|
1846
1924
|
}
|
|
1847
1925
|
})();
|
|
1848
1926
|
return () => controller.abort();
|
|
1849
|
-
}, [client, pageLive, verifyApiContract, workspaceId]);
|
|
1927
|
+
}, [client, pageLive, supportsWorkspaceLiveStream, verifyApiContract, workspaceId]);
|
|
1928
|
+
useEffect(() => {
|
|
1929
|
+
if (supportsWorkspaceLiveStream) return;
|
|
1930
|
+
setWorkspaceInteractionEvent(null);
|
|
1931
|
+
if (!pageLive) {
|
|
1932
|
+
setWorkspaceInteractionConnectionState("idle");
|
|
1933
|
+
return;
|
|
1934
|
+
}
|
|
1935
|
+
const controller = new AbortController();
|
|
1936
|
+
setWorkspaceInteractionConnectionState("connecting");
|
|
1937
|
+
void (async () => {
|
|
1938
|
+
try {
|
|
1939
|
+
await verifyApiContract();
|
|
1940
|
+
const resumeAfter = workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0;
|
|
1941
|
+
const stream = client.streamWorkspaceInteractionRevisions(workspaceId, {
|
|
1942
|
+
after: resumeAfter,
|
|
1943
|
+
signal: controller.signal,
|
|
1944
|
+
onStateChange: setWorkspaceInteractionConnectionState
|
|
1945
|
+
});
|
|
1946
|
+
for await (const event of stream) {
|
|
1947
|
+
if (controller.signal.aborted) return;
|
|
1948
|
+
workspaceInteractionSequencesRef.current.set(
|
|
1949
|
+
workspaceId,
|
|
1950
|
+
Math.max(
|
|
1951
|
+
workspaceInteractionSequencesRef.current.get(workspaceId) ?? 0,
|
|
1952
|
+
event.sequence
|
|
1953
|
+
)
|
|
1954
|
+
);
|
|
1955
|
+
setWorkspaceInteractionEvent(
|
|
1956
|
+
(current) => !current || event.sequence > current.sequence ? event : current
|
|
1957
|
+
);
|
|
1958
|
+
interactionCallbackRef.current?.(event);
|
|
1959
|
+
}
|
|
1960
|
+
} catch (error) {
|
|
1961
|
+
if (error instanceof OpenGeniApiContractMismatchError) {
|
|
1962
|
+
setContractMismatch(error);
|
|
1963
|
+
reloadForContractMismatchOnce(error);
|
|
1964
|
+
}
|
|
1965
|
+
if (!controller.signal.aborted) setWorkspaceInteractionConnectionState("error");
|
|
1966
|
+
}
|
|
1967
|
+
})();
|
|
1968
|
+
return () => controller.abort();
|
|
1969
|
+
}, [client, pageLive, supportsWorkspaceLiveStream, verifyApiContract, workspaceId]);
|
|
1850
1970
|
const value = useMemo(
|
|
1851
1971
|
() => ({
|
|
1852
1972
|
client,
|
|
1853
1973
|
workspaceId,
|
|
1854
1974
|
workspaceControlEvent,
|
|
1855
1975
|
workspaceControlConnectionState,
|
|
1976
|
+
workspaceInteractionEvent,
|
|
1977
|
+
workspaceInteractionConnectionState,
|
|
1856
1978
|
registerSessionReconciler,
|
|
1857
1979
|
reconcileSession
|
|
1858
1980
|
}),
|
|
@@ -1861,6 +1983,8 @@ function OpenGeniProvider({
|
|
|
1861
1983
|
workspaceId,
|
|
1862
1984
|
workspaceControlEvent,
|
|
1863
1985
|
workspaceControlConnectionState,
|
|
1986
|
+
workspaceInteractionEvent,
|
|
1987
|
+
workspaceInteractionConnectionState,
|
|
1864
1988
|
registerSessionReconciler,
|
|
1865
1989
|
reconcileSession
|
|
1866
1990
|
]
|
|
@@ -2042,7 +2166,9 @@ function useMachines(options = {}) {
|
|
|
2042
2166
|
}
|
|
2043
2167
|
|
|
2044
2168
|
export {
|
|
2169
|
+
OpenGeniProvider,
|
|
2045
2170
|
connectionStatusForState,
|
|
2171
|
+
useMachines,
|
|
2046
2172
|
CONNECTION_STATUS_META,
|
|
2047
2173
|
MACHINE_STATE_BADGE_META,
|
|
2048
2174
|
ConnectionStatusPill,
|
|
@@ -2065,8 +2191,6 @@ export {
|
|
|
2065
2191
|
MachineDockBar,
|
|
2066
2192
|
SharedMachineDisclosure,
|
|
2067
2193
|
EnrollmentDeviceFlow,
|
|
2068
|
-
EnrollmentConsent
|
|
2069
|
-
OpenGeniProvider,
|
|
2070
|
-
useMachines
|
|
2194
|
+
EnrollmentConsent
|
|
2071
2195
|
};
|
|
2072
|
-
//# sourceMappingURL=chunk-
|
|
2196
|
+
//# sourceMappingURL=chunk-HA46CYQK.js.map
|