@robota-sdk/agent-ui-web 3.0.0-beta.94 → 3.0.0-beta.96
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/CHANGELOG.md +100 -0
- package/dist/browser/index.d.ts +24 -3
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +641 -69
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +639 -67
- package/dist/node/index.d.cts +24 -3
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.ts +24 -3
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +641 -69
- package/dist/node/index.js.map +1 -1
- package/docs/SPEC.md +9 -3
- package/package.json +6 -6
- package/src/app-view/bridge.ts +217 -0
- package/src/app-view/call-tool-result.ts +58 -0
- package/src/app-view/host-context.ts +37 -0
- package/src/app-view/types.ts +12 -0
- package/src/components/AppView.tsx +147 -0
- package/src/components/ConversationView.tsx +18 -1
- package/src/components/PermissionPrompt.tsx +108 -7
- package/src/components/SessionSurface.tsx +39 -12
- package/src/hooks/server-message-handling.ts +3 -0
- package/src/hooks/session-client-types.ts +14 -0
- package/src/hooks/use-app-view-requests.ts +178 -0
- package/src/hooks/useSessionClient.ts +28 -2
- package/src/index.ts +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,105 @@
|
|
|
1
1
|
# @robota-sdk/agent-ui-web
|
|
2
2
|
|
|
3
|
+
## 3.0.0-beta.96
|
|
4
|
+
### Minor Changes
|
|
5
|
+
|
|
6
|
+
- fbb287d: Show a finished MCP tool call's app in an opaque frame with a source-bound JSON-RPC bridge. App callbacks use the session's view authority and permission prompt. Session changes and frame disposal reject pending local requests.
|
|
7
|
+
|
|
8
|
+
Hosts can provide a sandbox URL through `SessionSurface`. The web GUI serves a separate sandbox document with content restrictions and `Connection-Allowlist` enforcement. App execution requires Chromium 158 or newer and native network isolation; other browsers and hosts without the response policy show an unavailable message and retain the text result. A surface without a sandbox URL never reads the app document.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.96
|
|
13
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.96
|
|
14
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.96
|
|
15
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.96
|
|
16
|
+
- @robota-sdk/agent-transport@3.0.0-beta.96
|
|
17
|
+
|
|
18
|
+
## 3.0.0-beta.95
|
|
19
|
+
### Minor Changes
|
|
20
|
+
|
|
21
|
+
- 0ba247b: A tool result can now carry a view its source declared (an MCP app), and a surface can invoke a
|
|
22
|
+
runtime tool through the session's permission gate with a prompt. This is the contract and wiring
|
|
23
|
+
layer: nothing produces a view yet, and the GUI does not yet host one.
|
|
24
|
+
|
|
25
|
+
- `agent-core` — `IToolResult.view` carries an `IToolAppView` (source, `ui://` resource, mime type,
|
|
26
|
+
HTML, structured content, callable tools, the call's input). `view` is now a typed key of
|
|
27
|
+
`IToolResult`, so an extension that already used a `view` key with another type must rename it.
|
|
28
|
+
The view is display data: it never enters model context or the size that decides a spill, and a
|
|
29
|
+
result replaced by its reference keeps it.
|
|
30
|
+
- `agent-interface-session` — `invokeRuntimeTool` takes `permissionInteraction` (`'interactive'` or
|
|
31
|
+
the default `'deny'`), a `driverId` (a host that attributes prompts names it as the requester) and
|
|
32
|
+
an `executionId` its events carry. A finished model call's `tool_end` names its view with
|
|
33
|
+
`IToolState.appView` (`viewId`, source, resource), and the new
|
|
34
|
+
`ISessionToolAppViews.readToolAppView(viewId)` reads the document. A permission handler may take
|
|
35
|
+
`{ signal }`, and aborting it withdraws the prompt.
|
|
36
|
+
- `agent-session` — a direct call asks a person only when its caller says so, and the handler is
|
|
37
|
+
given the call's own signal; the tool end event carries the view, never in the logged result data.
|
|
38
|
+
- `agent-framework` — the view of a model's call is kept under a `viewId` the session mints, in a
|
|
39
|
+
bounded per-session store (16 views, 4 MiB each, 16 MiB in all, measured on the whole serialized
|
|
40
|
+
view), and read on demand, so the document never rides `tool_end` to every surface, never enters
|
|
41
|
+
the recorded history, and a repeated provider tool-call id cannot overwrite another turn's view.
|
|
42
|
+
A malformed view is dropped. A direct call keeps and names no view, recognised by the id it was
|
|
43
|
+
started with. A submission or agent wakeup that arrives while a direct call holds the session is
|
|
44
|
+
queued behind it, as during a turn, instead of refused. A direct call acting for a driver
|
|
45
|
+
attributes its permission prompt and tool events to that driver, and aborting its signal withdraws
|
|
46
|
+
an open prompt from every surface.
|
|
47
|
+
- `agent-transport` — a driving connection sends `call-app-tool` (answered by `app_tool_result`) and
|
|
48
|
+
`read-app-view` (answered by `app_view`). A call names its view and reaches only the tools that
|
|
49
|
+
view's source declared; a call or read that decodes but cannot be served answers `protocol_error`
|
|
50
|
+
echoing the `requestId`, while an observer's attempt is refused like any non-read. A call still
|
|
51
|
+
waiting on its prompt is cancelled when its connection goes away (for the resume bridge, when the
|
|
52
|
+
bridge is disposed). `maxFrameBytes` bounds an app answer to what a carrier's channel carries;
|
|
53
|
+
the WebRTC carrier uses a history page's worth. `IProtocolSession` now includes the runtime-tool
|
|
54
|
+
and app-view roles.
|
|
55
|
+
- `agent-ui-web` — the two new server messages are recorded as not rendered until the app-view host
|
|
56
|
+
consumes them.
|
|
57
|
+
|
|
58
|
+
An implementation of `IInteractiveSession` or `IProtocolSession` outside this repository must add
|
|
59
|
+
`readToolAppView` (and, for `IProtocolSession`, `listRuntimeTools` and `invokeRuntimeTool`); the
|
|
60
|
+
members are required so a host cannot silently lack them.
|
|
61
|
+
|
|
62
|
+
### Patch Changes
|
|
63
|
+
|
|
64
|
+
- 09e7e21: **An MCP server's form-mode elicitation during a tool call becomes a Robota ask prompt.**
|
|
65
|
+
|
|
66
|
+
`@robota-sdk/agent-mcp` opens a session with `elicitation: true` to declare form-mode elicitation and
|
|
67
|
+
answer it: a request the server raises while a tool call is in flight (a server→client
|
|
68
|
+
`elicitation/create` on the legacy era, an `input_required` round on 2026-07-28) is put to a person
|
|
69
|
+
through that call's ask port (`IMCPToolCallOptions.ask`, which the discovered tool fills from
|
|
70
|
+
`IToolExecutionContext.ask`) as one question titled with the configured server id and carrying the
|
|
71
|
+
server's message as one bounded line, with Respond and Decline, then one question per field
|
|
72
|
+
(choices, multi-select, yes/no, or free text validated against the field and re-asked once). The
|
|
73
|
+
answer continues the same call; the re-sent `tools/call` that carries it is the protocol's
|
|
74
|
+
continuation, not a replay, and a prompt is withdrawn when its call ends (an abort, or the call's
|
|
75
|
+
own timeout) — when the last in-flight call to that server ends, if there are several, since a
|
|
76
|
+
request names none of them. A request outside an in-flight call, or during a call that has no ask port, is
|
|
77
|
+
declined; a dismissal, a failing port or a second rejected answer cancels; a field named like a
|
|
78
|
+
credential is shown unmasked with a warning. URL mode is not offered. Without the opt-in nothing
|
|
79
|
+
changes: no capability is declared and an `input_required` result still closes the carrier. An
|
|
80
|
+
embedded request of another kind (sampling, roots) or more rounds than the client allows closes the
|
|
81
|
+
carrier as `input_required` does; an embedded elicitation the client refuses on its face (URL mode,
|
|
82
|
+
a malformed form) fails the call and leaves the carrier open.
|
|
83
|
+
|
|
84
|
+
`@robota-sdk/agent-cli` turns the opt-in on for the interactive terminal and the serve host driven by
|
|
85
|
+
the desktop app or the web GUI, which show the prompt, and leaves it off for print mode and for the
|
|
86
|
+
two serve-runtime hosts with no prompt surface, `mcp serve` and the ACP editor agent.
|
|
87
|
+
|
|
88
|
+
`@robota-sdk/agent-ui-web` renders an ask with `maxSelect` above 1 as a multi-select: options toggle
|
|
89
|
+
(click or 1–9), Submit answers with the ticked values once `minSelect` is met, and a toggle beyond
|
|
90
|
+
`maxSelect` is ignored, as in the terminal.
|
|
91
|
+
- Updated dependencies [c967c57]
|
|
92
|
+
- Updated dependencies [60f3965]
|
|
93
|
+
- Updated dependencies [115e104]
|
|
94
|
+
- Updated dependencies [04719a9]
|
|
95
|
+
- Updated dependencies [04a6de4]
|
|
96
|
+
- Updated dependencies [0ba247b]
|
|
97
|
+
- @robota-sdk/agent-transport@3.0.0-beta.95
|
|
98
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.95
|
|
99
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.95
|
|
100
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.95
|
|
101
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.95
|
|
102
|
+
|
|
3
103
|
## 3.0.0-beta.94
|
|
4
104
|
### Patch Changes
|
|
5
105
|
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import React$1, { ReactNode } from "react";
|
|
2
|
-
import { IAskRequestEvent, IDiffLine, IGoalState, IPermissionRequestEvent, ISettingsSnapshot, IToolState, TDriverId, TPermissionResultValue, TSettingsPatch } from "@robota-sdk/agent-interface-session";
|
|
2
|
+
import { IAskRequestEvent, IDiffLine, IGoalState, IPermissionRequestEvent, ISettingsSnapshot, IToolAppViewRef, IToolState, TDriverId, TPermissionResultValue, TSettingsPatch } from "@robota-sdk/agent-interface-session";
|
|
3
3
|
import { IWireAgentDefinitionSummary, TClientMessage, TClientMessage as TClientMessage$1, TServerMessage, TServerMessage as TServerMessage$1 } from "@robota-sdk/agent-transport";
|
|
4
4
|
import { TActionResponse } from "@robota-sdk/agent-interface-transport";
|
|
5
5
|
import { IBackgroundTaskState, IExecutionDetailRecord, IExecutionWorkspaceEntry, IExecutionWorkspaceSnapshot } from "@robota-sdk/agent-interface-execution";
|
|
6
6
|
import { TCommandUiIntent } from "@robota-sdk/agent-interface-command";
|
|
7
|
+
//#region src/app-view/types.d.ts
|
|
8
|
+
type TAppView = Extract<TServerMessage, {
|
|
9
|
+
type: 'app_view';
|
|
10
|
+
}>['view'];
|
|
11
|
+
type TAppToolOutcome = Omit<Extract<TServerMessage, {
|
|
12
|
+
type: 'app_tool_result';
|
|
13
|
+
}>, 'type' | 'requestId'>;
|
|
14
|
+
type TAppToolArguments = Extract<TClientMessage, {
|
|
15
|
+
type: 'call-app-tool';
|
|
16
|
+
}>['arguments'];
|
|
17
|
+
//#endregion
|
|
7
18
|
//#region src/client/ws-session-client.d.ts
|
|
8
19
|
type TConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
|
|
9
20
|
interface IWsSessionClientCallbacks {
|
|
@@ -146,6 +157,7 @@ interface IActiveTool {
|
|
|
146
157
|
commandName?: string;
|
|
147
158
|
/** #3288: true for an internal signal tool (e.g. goal-status) — never rendered as a call. */
|
|
148
159
|
internal?: boolean;
|
|
160
|
+
appView?: IToolAppViewRef;
|
|
149
161
|
}
|
|
150
162
|
/**
|
|
151
163
|
* #3280 §2: a prompt the host queued behind the running turn — the server has already taken it, so it
|
|
@@ -337,6 +349,8 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
|
337
349
|
* session notice) — no separate error state here.
|
|
338
350
|
*/
|
|
339
351
|
deleteSchedule: (taskId: string) => void;
|
|
352
|
+
readAppView: (viewKey: string, signal?: AbortSignal) => Promise<TAppView>;
|
|
353
|
+
callAppTool: (viewKey: string, name: string, args: TAppToolArguments, signal?: AbortSignal) => Promise<TAppToolOutcome>;
|
|
340
354
|
}
|
|
341
355
|
//#endregion
|
|
342
356
|
//#region src/hooks/useSessionClient.d.ts
|
|
@@ -505,6 +519,12 @@ declare function AgentSwitcherSheet({ state }: {
|
|
|
505
519
|
* lives only in `FreeTextField`, keyed by `prompt.id`: a cancelled or answered prompt's text can
|
|
506
520
|
* never reach the next prompt's render, masked or not, because the field is a fresh component
|
|
507
521
|
* instance rather than a value carried over in this component's own state (#3280 §3 follow-up).
|
|
522
|
+
*
|
|
523
|
+
* An ask whose `maxSelect` is above 1 is a multi-select: each option is a toggle (a click or 1–9 ticks
|
|
524
|
+
* it, nothing answers yet), and Submit — or Enter at the prompt, once the selection is allowed —
|
|
525
|
+
* answers with the ticked values in option order. Unlike the free-text field, the ticks live in this
|
|
526
|
+
* component, because the dock's keys act on them; they are tagged with `prompt.id`, so a prompt never
|
|
527
|
+
* reads the ticks of another.
|
|
508
528
|
*/
|
|
509
529
|
interface IPermissionPromptProps {
|
|
510
530
|
prompts: readonly TPendingPrompt[];
|
|
@@ -538,7 +558,7 @@ declare function PersonalUsageDashboard({ state }: {
|
|
|
538
558
|
* The full desktop layout over an `IWsSessionState`. `surface` is an optional label shown next to the
|
|
539
559
|
* mark (e.g. "app").
|
|
540
560
|
*/
|
|
541
|
-
declare function SessionSurface({ state, surface, personalUsageEnabled, onReconnect, pickFiles, getPathForFile, onOpenMemoryInEditor }: {
|
|
561
|
+
declare function SessionSurface({ state, surface, personalUsageEnabled, onReconnect, pickFiles, getPathForFile, onOpenMemoryInEditor, appViewSandboxUrl }: {
|
|
542
562
|
state: IWsSessionState;
|
|
543
563
|
surface?: string;
|
|
544
564
|
/** Desktop shells opt in; embedded/session-only surfaces keep their existing chat-only contract. */
|
|
@@ -558,6 +578,7 @@ declare function SessionSurface({ state, surface, personalUsageEnabled, onReconn
|
|
|
558
578
|
* itself is hidden (only shown "if the host supports it").
|
|
559
579
|
*/
|
|
560
580
|
onOpenMemoryInEditor?: (path: string) => void;
|
|
581
|
+
appViewSandboxUrl?: string;
|
|
561
582
|
}): React.ReactElement;
|
|
562
583
|
/**
|
|
563
584
|
* A centered chrome frame for the pre-session (loading) and fatal states — reused by app shells. Its
|
|
@@ -711,5 +732,5 @@ declare function ProductIdentityProvider({ value, children }: {
|
|
|
711
732
|
}): React.ReactElement;
|
|
712
733
|
declare function useProductIdentity(): IWebProductIdentity;
|
|
713
734
|
//#endregion
|
|
714
|
-
export { AgentActivityPanel, AgentSwitcherSheet, CenteredChrome, ConfirmDialog, ConversationView, Dialog, HelpSheet, type IActiveTool, type IClientRuntimeBridge, type IClientRuntimeEnvironment, type IClientRuntimeHost, type IClientTrustQuestion, type ICommandOutputEntry, type IComposerHandle, type IConfirmDialogProps, type IConversationMessage, type IDialogProps, type IPickedFile, type ISessionClientHandle, type ISessionNotice, type IToolGroupEntry, type IWebProductIdentity, type IWsSessionClientCallbacks, type IWsSessionState, PermissionPrompt, PersonalUsageDashboard, ProductIdentityProvider, ProductMark, ProductWordmark, SessionMonitor, SessionSidebar, SessionSurface, SettingsScreen, type TClientRuntimeState, type TClientTrustChoice, type TConnectionStatus, type TConversationEntry, type TMakeSessionClient, type TPendingPrompt, type TPersonalUsageDashboardState, type TSessionListing, type TSessionsError, applyPromptEvent, askResponse, createWsSessionClient, describeUiIntentForGui, guiScreenForUiIntent, permissionResponse, rememberSessionForRestore, resolveClientRuntimeHost, useProductIdentity, useSessionClient, useWsSession };
|
|
735
|
+
export { AgentActivityPanel, AgentSwitcherSheet, CenteredChrome, ConfirmDialog, ConversationView, Dialog, HelpSheet, type IActiveTool, type IClientRuntimeBridge, type IClientRuntimeEnvironment, type IClientRuntimeHost, type IClientTrustQuestion, type ICommandOutputEntry, type IComposerHandle, type IConfirmDialogProps, type IConversationMessage, type IDialogProps, type IPickedFile, type ISessionClientHandle, type ISessionNotice, type IToolGroupEntry, type IWebProductIdentity, type IWsSessionClientCallbacks, type IWsSessionState, PermissionPrompt, PersonalUsageDashboard, ProductIdentityProvider, ProductMark, ProductWordmark, SessionMonitor, SessionSidebar, SessionSurface, SettingsScreen, type TAppToolArguments, type TAppToolOutcome, type TAppView, type TClientRuntimeState, type TClientTrustChoice, type TConnectionStatus, type TConversationEntry, type TMakeSessionClient, type TPendingPrompt, type TPersonalUsageDashboardState, type TSessionListing, type TSessionsError, applyPromptEvent, askResponse, createWsSessionClient, describeUiIntentForGui, guiScreenForUiIntent, permissionResponse, rememberSessionForRestore, resolveClientRuntimeHost, useProductIdentity, useSessionClient, useWsSession };
|
|
715
736
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/client/ws-session-client.ts","../../src/hooks/prompt-state.ts","../../src/hooks/session-client-types.ts","../../src/hooks/useSessionClient.ts","../../src/hooks/use-session-directory.ts","../../src/components/composer-attachments.ts","../../src/components/Composer.tsx","../../src/client/runtime-host.ts","../../src/hooks/ui-intent-state.ts","../../src/components/ConversationView.tsx","../../src/components/AgentActivityPanel.tsx","../../src/components/AgentSwitcherSheet.tsx","../../src/components/PermissionPrompt.tsx","../../src/components/personal-usage-dashboard-types.ts","../../src/components/PersonalUsageDashboard.tsx","../../src/components/SessionSurface.tsx","../../src/components/SessionSidebar.tsx","../../src/components/SessionMonitor.tsx","../../src/components/Dialog.tsx","../../src/components/SettingsScreen.tsx","../../src/components/HelpSheet.tsx","../../src/components/Brand.tsx","../../src/product-identity.tsx"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/app-view/types.ts","../../src/client/ws-session-client.ts","../../src/hooks/prompt-state.ts","../../src/hooks/session-client-types.ts","../../src/hooks/useSessionClient.ts","../../src/hooks/use-session-directory.ts","../../src/components/composer-attachments.ts","../../src/components/Composer.tsx","../../src/client/runtime-host.ts","../../src/hooks/ui-intent-state.ts","../../src/components/ConversationView.tsx","../../src/components/AgentActivityPanel.tsx","../../src/components/AgentSwitcherSheet.tsx","../../src/components/PermissionPrompt.tsx","../../src/components/personal-usage-dashboard-types.ts","../../src/components/PersonalUsageDashboard.tsx","../../src/components/SessionSurface.tsx","../../src/components/SessionSidebar.tsx","../../src/components/SessionMonitor.tsx","../../src/components/Dialog.tsx","../../src/components/SettingsScreen.tsx","../../src/components/HelpSheet.tsx","../../src/components/Brand.tsx","../../src/product-identity.tsx"],"mappings":"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"}
|