@robota-sdk/agent-transport 3.0.0-beta.99 → 3.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/CHANGELOG.md +753 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,757 @@
|
|
|
1
1
|
# @robota-sdk/agent-transport
|
|
2
2
|
|
|
3
|
+
## 3.0.1
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- @robota-sdk/agent-core@3.0.1
|
|
7
|
+
- @robota-sdk/agent-interface-analytics@3.0.1
|
|
8
|
+
- @robota-sdk/agent-interface-command@3.0.1
|
|
9
|
+
- @robota-sdk/agent-interface-execution@3.0.1
|
|
10
|
+
- @robota-sdk/agent-interface-session@3.0.1
|
|
11
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.1
|
|
12
|
+
- @robota-sdk/agent-interface-transport@3.0.1
|
|
13
|
+
|
|
14
|
+
## 3.0.0
|
|
15
|
+
### Major Changes
|
|
16
|
+
|
|
17
|
+
- 50d2c9f: Handoff offer refusal and inventory classification now live in session mobility. The Node transport
|
|
18
|
+
entry no longer exports `buildHandoffManifest`, `IBuildManifestInput`, `ISourceRuntimeState`, or
|
|
19
|
+
`TManifestResult`. Compose `assessHandoffReadiness` and `prepareHandoffOffer` from
|
|
20
|
+
`@robota-sdk/agent-interface-session-mobility` with `sealHandoffRecord` from
|
|
21
|
+
`@robota-sdk/agent-transport/node`; check readiness before sealing and send the returned serialized
|
|
22
|
+
payload unchanged. The transport README contains the migration example.
|
|
23
|
+
- 7b72344: Every client can offer the session's commands and skills and show its status. The GUI uses them as a
|
|
24
|
+
desktop-style composer.
|
|
25
|
+
|
|
26
|
+
- `agent-interface-session` is **`major` because `IInteractiveSession` gains required members**:
|
|
27
|
+
`ISessionCommands.listSkills()` and a `statusRead` capability, `getStatusSnapshot()`. The snapshot
|
|
28
|
+
holds session, model, permission mode, effort, context and goal. An external implementation stops
|
|
29
|
+
compiling until it adds both.
|
|
30
|
+
- `agent-transport` is **`major` for the same reason on `IProtocolSession`**. It also gains the wire
|
|
31
|
+
messages `get-commands` → `commands` and `get-status` → `session_status`. Both are reads that the
|
|
32
|
+
observe role may send.
|
|
33
|
+
- `agent-interface-command` gains `ICommandSkillListEntry`, moved from `agent-framework`, which
|
|
34
|
+
re-exports it unchanged.
|
|
35
|
+
- `agent-ui-web` is **`major` because its state changes shape**:
|
|
36
|
+
- A command's outcome and a finished turn's tool calls are now conversation entries: `messages` is
|
|
37
|
+
`TConversationEntry[]`.
|
|
38
|
+
- The `uiIntentNotices` list, `dismissUiIntentNotice`, `applyUiIntentEvent`,
|
|
39
|
+
`removeUiIntentNotice` and `IUiIntentNotice` are removed. An intent now answers with an info
|
|
40
|
+
line in the conversation.
|
|
41
|
+
- Session notices keep only `session-error` and `protocol-error`.
|
|
42
|
+
- The state gains `commandCatalog` and `sessionStatus`.
|
|
43
|
+
- `agent-command` registers `/theme` and `/keybindings` even without a terminal. They then answer
|
|
44
|
+
that they belong to the configured CLI terminal, instead of being unknown.
|
|
45
|
+
- `agent-framework`:
|
|
46
|
+
- `InteractiveSession.getStatusSnapshot()`.
|
|
47
|
+
- The main-thread row previews the last chat message instead of the last record's type.
|
|
48
|
+
- `agent-cli` serves the full GUI web app, renamed from `agent-cli-web` to `agent-gui-web`, on
|
|
49
|
+
`robota --serve --open`.
|
|
50
|
+
- 6ae3f28: A served runtime can list its workspace's sessions, start a new one and switch to another without the
|
|
51
|
+
process or any client connection restarting. The GUI shows them in a sessions sidebar.
|
|
52
|
+
|
|
53
|
+
- `agent-interface-session` is **`major`** for two reasons:
|
|
54
|
+
- It adds `ISessionListing`, `ISessionDirectory` and `ISessionSwitchedEvent`.
|
|
55
|
+
- `IInteractiveSessionEvents` gains a required `session_switched` event. An exhaustive map over the
|
|
56
|
+
event names stops compiling until it classifies the new event.
|
|
57
|
+
- `agent-transport` is **`major`** for the same kind of reason:
|
|
58
|
+
- It adds the wire messages `list-sessions` → `sessions`/`sessions_error`, `new-session`,
|
|
59
|
+
`switch-session`, and the broadcast `session_switched`.
|
|
60
|
+
- It adds a `sessionDirectory` handler option. A refusal to switch comes back as a
|
|
61
|
+
`protocol_error` carrying the reason.
|
|
62
|
+
- An exhaustive map over message types must add the new variants.
|
|
63
|
+
- `agent-transport-ws` passes a configured `sessionDirectory` to every connection.
|
|
64
|
+
- `agent-framework` is **`major` because `IRuntimeHostHandle.session` is now a `SessionSlot`**, not the
|
|
65
|
+
`InteractiveSession`, and `bindTransports` receives the slot.
|
|
66
|
+
- The slot is an `IInteractiveSession` that forwards to the current session. Members outside that
|
|
67
|
+
interface are read through `host.session.current`, which changes on a switch.
|
|
68
|
+
- Adds `InteractiveSession.whenInitialized()`.
|
|
69
|
+
- Exports `listUnreadableSessions`.
|
|
70
|
+
- `agent-ui-web` is **`major`**:
|
|
71
|
+
- `IWsSessionState` gains session listing state and actions.
|
|
72
|
+
- It adds a `SessionSidebar`.
|
|
73
|
+
- `/resume` opens the sidebar.
|
|
74
|
+
- `agent-cli`: `robota --serve` provides the session directory, and refuses a switch that would lose
|
|
75
|
+
work in progress. External-event grants belong to the run: a switch reopens them on the new session,
|
|
76
|
+
as the TUI already does.
|
|
77
|
+
- External-event grant history (spent tokens, rate windows, revocations) belongs to the run. The new
|
|
78
|
+
option `externalEventGrantHistory` (from `createExternalEventGrantHistory()`) is shared by every
|
|
79
|
+
session that a served runtime or the TUI builds. A session switch therefore replays no spent token
|
|
80
|
+
and resets no rate limit. The TUI previously had this gap when it switched sessions.
|
|
81
|
+
- 57f57f5: A daemon keeps several sessions live, and each client is bound to its own: one client's switch moves
|
|
82
|
+
only that client.
|
|
83
|
+
|
|
84
|
+
- `agent-interface-session`: `ISessionBinder`/`ISessionBinding`, the session-change refusal codes with
|
|
85
|
+
`isSessionChangeRefusal`, and listing rows that may say `live` and `clients`.
|
|
86
|
+
- `agent-framework`: `SessionPool` and `SessionChangeRefusal`.
|
|
87
|
+
- `agent-transport` (**major**): a new server frame, `session_change_failed`, which an exhaustive
|
|
88
|
+
consumer must handle. A refused `new-session` or `switch-session` now answers with it, carrying a
|
|
89
|
+
`code`, instead of `protocol_error`; both requests take an optional `requestId` that it echoes.
|
|
90
|
+
- `agent-transport-ws`: the `sessionBinder` option binds each connection to its own session and
|
|
91
|
+
releases the binding when the connection closes.
|
|
92
|
+
- `agent-cli`: `robota --serve` and the daemon keep up to four sessions live. Each WebSocket client and
|
|
93
|
+
attached terminal is bound to its own session; leaving a busy session is no longer refused, and only
|
|
94
|
+
the last driver of a session with a pending prompt is kept from leaving it. Grants and the supervised
|
|
95
|
+
name stay on the runtime's first session, and its reported activity covers every live session.
|
|
96
|
+
- `agent-ui-web`: a refused new or switch shows the host's reason as a notice (an older host's
|
|
97
|
+
`protocol_error` still does); the session sidebar marks live sessions and counts the other clients
|
|
98
|
+
on each; after a reconnect to a host that keeps sessions live, the GUI returns to the session it was on.
|
|
99
|
+
- `agent-ui-terminal`: an attached terminal shows why a switch was refused, and the picker's switch
|
|
100
|
+
stays pending until the host answers; the session picker marks live sessions and their clients.
|
|
101
|
+
- ba822c1: An attached client reads a workspace entry's detail, stops a waiting self-paced loop, completes
|
|
102
|
+
subcommands, and sees status changes another client made.
|
|
103
|
+
|
|
104
|
+
- `agent-interface-session` (major): `IInteractiveSession` gains the required roles
|
|
105
|
+
`ISessionExecutionDetail` and `ISessionSelfPacedLoopControl` (`TWaitingLoopStopOutcome`), and the
|
|
106
|
+
exhaustively mapped event map gains `status_changed`.
|
|
107
|
+
- `agent-transport` (major): `IProtocolSession` gains both roles; the wire unions gain
|
|
108
|
+
`read-execution-detail`, `stop-waiting-loop`, `execution_detail`, `execution_detail_error` and
|
|
109
|
+
`waiting_loop_stop`; `status_changed` is pushed as `session_status`; `isObserverMessageType` is
|
|
110
|
+
exported from the root and `./client`.
|
|
111
|
+
- `agent-interface-command` (minor): `ICommandListEntry` gains optional `argumentHint` and
|
|
112
|
+
`subcommands` (`ICommandSubcommandEntry`).
|
|
113
|
+
- `agent-cli` (minor):
|
|
114
|
+
- `robota session attach` and an attach from `robota session view` open the full terminal UI,
|
|
115
|
+
the one `robota --attach` opens, in drive mode or, with `--observe`, read-only. The reduced
|
|
116
|
+
attached view is gone.
|
|
117
|
+
- A served runtime names each of its sessions after the session's first real turn.
|
|
118
|
+
- `agent-framework` (minor):
|
|
119
|
+
- `InteractiveSession` gains `stopWaitingSelfPacedLoop(reason?)`: it stops the one waiting loop,
|
|
120
|
+
or stops none and names `/loop stop` when several wait. `SessionSlot` forwards it and
|
|
121
|
+
`readExecutionWorkspaceDetail`.
|
|
122
|
+
- The session emits `status_changed` when its mode, model, effort, goal or name changes, after a
|
|
123
|
+
command, a turn, a rename or a goal or plan transition.
|
|
124
|
+
- A new option `autoName: true` makes the session name itself once, after its first turn, with its
|
|
125
|
+
current provider; it keeps a name it already has and lets a rename made meanwhile win. Off by
|
|
126
|
+
default.
|
|
127
|
+
- The command catalog carries each command's `argumentHint` and `subcommands`.
|
|
128
|
+
- `agent-ui-terminal` (major):
|
|
129
|
+
- The full terminal UI attached to a host's session reads a workspace entry's detail, sends input
|
|
130
|
+
to a background task, stops a waiting self-paced loop on Esc, and completes subcommands.
|
|
131
|
+
- `renderAttachedApp` takes `mode: 'drive' | 'observe'` (default `'drive'`) and `announce`. In
|
|
132
|
+
observe mode the terminal sends only what an observer may send, refuses prompts, host commands,
|
|
133
|
+
abort and loop stop with a read-only notice, still runs `/exit` and its own commands, and its
|
|
134
|
+
status bar says it is observing. `ITuiChannelSnapshot` gains `readOnly`.
|
|
135
|
+
- The in-process terminal no longer names sessions; it builds its session with `autoName: true`.
|
|
136
|
+
`ITuiInteractionChannelOptions.onAutoNamed` is removed.
|
|
137
|
+
- 6e6b06b: A wire client can now render the whole session the way the in-process terminal UI does: the full
|
|
138
|
+
history, the context window as it changes, when the history changes, and where each turn came from.
|
|
139
|
+
|
|
140
|
+
- `agent-interface-session` is **`major`**: `ISessionConversationRead` gains a required
|
|
141
|
+
`getFullHistory()`. Any implementation of it, or of `IInteractiveSession`, must add it.
|
|
142
|
+
- `agent-transport` is **`major`**:
|
|
143
|
+
- It adds `get-history { fromIndex? }` → `history { startIndex, total, entries }`. The history
|
|
144
|
+
crosses one bounded page at a time (at most 256 KiB of entries; a single larger entry is sent
|
|
145
|
+
alone), from `fromIndex` (default 0), so no reply grows with the session. The client asks for
|
|
146
|
+
the next page after the previous one arrived. Entries are `IWireHistoryEntry`: a history entry
|
|
147
|
+
with an ISO 8601 `timestamp`. An observer may send it.
|
|
148
|
+
- `complete` and `interrupted` carry the turn's result without the session's history
|
|
149
|
+
(`TWireExecutionResult`); a client reads the history with `get-history`.
|
|
150
|
+
- It adds `get-prompts`: the host sends the permission and ask prompts still open as the
|
|
151
|
+
`permission_request` / `ask_request` frames that asked them, for a client that attached later.
|
|
152
|
+
An observer may not send it.
|
|
153
|
+
- `pending` gains an optional `pendingCount`: a host sends it when it knows how many prompts are
|
|
154
|
+
queued, and a client that gets none counts the prompt it shows. The host sends `pending` in
|
|
155
|
+
reply to a `submit` once it has taken the prompt, so a prompt queued behind a running turn shows
|
|
156
|
+
as queued.
|
|
157
|
+
- `command` takes an optional `requestId`, which the host echoes on the command's
|
|
158
|
+
`command_result` or `protocol_error`.
|
|
159
|
+
- The session's `context_update` is pushed as the `context` frame that `get-context` answers with.
|
|
160
|
+
- `compact`, `skill_activation` and `memory_event` push the new `history_changed`; the client
|
|
161
|
+
reads the history again.
|
|
162
|
+
- `turn_source` is pushed as the new `turn_source` frame.
|
|
163
|
+
- An exhaustive map over `TClientMessage` or `TServerMessage` types must add the new variants,
|
|
164
|
+
and `IProtocolSession` now requires `getFullHistory()`.
|
|
165
|
+
- `agent-transport-http` is **`major`** only because `IHttpTransportSession` includes the conversation
|
|
166
|
+
read role, so a session handed to it must now provide `getFullHistory()`.
|
|
167
|
+
- `agent-framework`: `SessionSlot` forwards `getFullHistory()` to the current session.
|
|
168
|
+
- `agent-ui-web` receives the new frames and does not render them.
|
|
169
|
+
- 0ba247b: A tool result can now carry a view its source declared (an MCP app), and a surface can invoke a
|
|
170
|
+
runtime tool through the session's permission gate with a prompt. This is the contract and wiring
|
|
171
|
+
layer: nothing produces a view yet, and the GUI does not yet host one.
|
|
172
|
+
|
|
173
|
+
- `agent-core` — `IToolResult.view` carries an `IToolAppView` (source, `ui://` resource, mime type,
|
|
174
|
+
HTML, structured content, callable tools, the call's input). `view` is now a typed key of
|
|
175
|
+
`IToolResult`, so an extension that already used a `view` key with another type must rename it.
|
|
176
|
+
The view is display data: it never enters model context or the size that decides a spill, and a
|
|
177
|
+
result replaced by its reference keeps it.
|
|
178
|
+
- `agent-interface-session` — `invokeRuntimeTool` takes `permissionInteraction` (`'interactive'` or
|
|
179
|
+
the default `'deny'`), a `driverId` (a host that attributes prompts names it as the requester) and
|
|
180
|
+
an `executionId` its events carry. A finished model call's `tool_end` names its view with
|
|
181
|
+
`IToolState.appView` (`viewId`, source, resource), and the new
|
|
182
|
+
`ISessionToolAppViews.readToolAppView(viewId)` reads the document. A permission handler may take
|
|
183
|
+
`{ signal }`, and aborting it withdraws the prompt.
|
|
184
|
+
- `agent-session` — a direct call asks a person only when its caller says so, and the handler is
|
|
185
|
+
given the call's own signal; the tool end event carries the view, never in the logged result data.
|
|
186
|
+
- `agent-framework` — the view of a model's call is kept under a `viewId` the session mints, in a
|
|
187
|
+
bounded per-session store (16 views, 4 MiB each, 16 MiB in all, measured on the whole serialized
|
|
188
|
+
view), and read on demand, so the document never rides `tool_end` to every surface, never enters
|
|
189
|
+
the recorded history, and a repeated provider tool-call id cannot overwrite another turn's view.
|
|
190
|
+
A malformed view is dropped. A direct call keeps and names no view, recognised by the id it was
|
|
191
|
+
started with. A submission or agent wakeup that arrives while a direct call holds the session is
|
|
192
|
+
queued behind it, as during a turn, instead of refused. A direct call acting for a driver
|
|
193
|
+
attributes its permission prompt and tool events to that driver, and aborting its signal withdraws
|
|
194
|
+
an open prompt from every surface.
|
|
195
|
+
- `agent-transport` — a driving connection sends `call-app-tool` (answered by `app_tool_result`) and
|
|
196
|
+
`read-app-view` (answered by `app_view`). A call names its view and reaches only the tools that
|
|
197
|
+
view's source declared; a call or read that decodes but cannot be served answers `protocol_error`
|
|
198
|
+
echoing the `requestId`, while an observer's attempt is refused like any non-read. A call still
|
|
199
|
+
waiting on its prompt is cancelled when its connection goes away (for the resume bridge, when the
|
|
200
|
+
bridge is disposed). `maxFrameBytes` bounds an app answer to what a carrier's channel carries;
|
|
201
|
+
the WebRTC carrier uses a history page's worth. `IProtocolSession` now includes the runtime-tool
|
|
202
|
+
and app-view roles.
|
|
203
|
+
- `agent-ui-web` — the two new server messages are recorded as not rendered until the app-view host
|
|
204
|
+
consumes them.
|
|
205
|
+
|
|
206
|
+
An implementation of `IInteractiveSession` or `IProtocolSession` outside this repository must add
|
|
207
|
+
`readToolAppView` (and, for `IProtocolSession`, `listRuntimeTools` and `invokeRuntimeTool`); the
|
|
208
|
+
members are required so a host cannot silently lack them.
|
|
209
|
+
- e82215f: **ARCH-011: replace the ambiguous transport lifecycle stub with executable conformance.**
|
|
210
|
+
|
|
211
|
+
`ITransportAdapter` now requires a frozen `service | runner` lifecycle descriptor. `start()` resolves
|
|
212
|
+
at the concrete transport's documented readiness boundary; start before attach and repeated active
|
|
213
|
+
start reject a stable lifecycle error, repeated stop is safe, and stopped adapters can reattach and
|
|
214
|
+
restart.
|
|
215
|
+
|
|
216
|
+
Runner adapters launch separately and expose a typed terminal outcome through
|
|
217
|
+
`waitForCompletion()`. The registry accepts base adapters, rejects duplicate names, keeps
|
|
218
|
+
configuration as an optional capability, returns complete ordered records whose pending slots become
|
|
219
|
+
registry-owned `abandoned` outcomes on stop/rollback, and exposes a real-runner-only first-failure
|
|
220
|
+
wait. It serializes startup/stop, rejects active restart before mutation, and reverses partial startup
|
|
221
|
+
from the currently failing adapter with typed safe rollback details. Runtime host and serve mode
|
|
222
|
+
propagate real nonzero runner results without treating normal shutdown abandonment as failure.
|
|
223
|
+
|
|
224
|
+
HTTP, MCP, both WebSocket adapters, WebRTC, and headless invoke one shared public conformance kit.
|
|
225
|
+
The former `TuiTransport` export is removed because it ignored the attached session; use `renderApp`
|
|
226
|
+
or `TuiInteractionChannel`, which honestly own their session lifecycle.
|
|
227
|
+
- 64ba748: **BREAKING — ARCH-042: project filesystem access is now an explicit, host-issued authority instead of an ambient consequence of `cwd`.**
|
|
228
|
+
|
|
229
|
+
`@robota-sdk/agent-framework` adds `WorkspaceTrustService` and the opaque
|
|
230
|
+
`IWorkspaceProjectAuthority`, plus bounded reader, settings-writer, state-storage, and mutation
|
|
231
|
+
facets. Public session, settings, context, checkpoint, memory, contribution, query, and replay
|
|
232
|
+
contracts consume those facets. A caller that does not supply `projectAccess` is deliberately
|
|
233
|
+
restricted to user-owned host state and receives no project filesystem capability.
|
|
234
|
+
|
|
235
|
+
The framework removes or renames ambient Node/project exports. Migrate `checkSettingsFile` to
|
|
236
|
+
`checkNodeHostSettingsFile`, `readMergedProviderSettingsFromPaths` to
|
|
237
|
+
`readMergedProviderSettingsFromSources`, `resolveProviderSettingsWriteTargetPath` to
|
|
238
|
+
`resolveProviderSettingsWriteTarget`, `FileSystemMemoryStore` / `createFileSystemMemoryStore` to
|
|
239
|
+
`WorkspaceMemoryStore` / `createWorkspaceMemoryStore`, and `PluginSettingsStore` to
|
|
240
|
+
`NodeHostPluginSettingsStore`. Host-only git helpers now carry the `FromNodeHost` suffix.
|
|
241
|
+
`projectPaths`, `resolveSettingsPathForScope`, and `getProviderSettingsPaths` are removed; project
|
|
242
|
+
consumers must use the authority facets rather than recover absolute paths.
|
|
243
|
+
|
|
244
|
+
`@robota-sdk/agent-session` renames the Node filesystem implementation `SessionStore` to
|
|
245
|
+
`NodeSessionStore` and adds explicit session-log/external-payload source and sink ports. Session
|
|
246
|
+
replay no longer resolves external payload files from an ambient directory.
|
|
247
|
+
|
|
248
|
+
`@robota-sdk/agent-interface-transport` changes `ISkillExecutionPort.loadCommands(cwd, home?)` to
|
|
249
|
+
the authority-bound `loadCommands()` and removes the optional absolute-path leak
|
|
250
|
+
`IInteractiveSessionStore.getFilePath`. `@robota-sdk/agent-command` consequently replaces the
|
|
251
|
+
`cwd` option of `createSkillsCommandModule` with required `contributionSources`; default command
|
|
252
|
+
composition accepts explicit contribution sources and discovers no project skills when none are
|
|
253
|
+
provided.
|
|
254
|
+
|
|
255
|
+
`@robota-sdk/agent-cli`, `@robota-sdk/agent-transport`, and
|
|
256
|
+
`@robota-sdk/agent-transport-tui` thread the trusted-or-restricted project decision through every
|
|
257
|
+
session surface. Embedded callers that need project settings, state, context, skills, checkpoints,
|
|
258
|
+
or mutation must mint access through `WorkspaceTrustService` and pass the returned
|
|
259
|
+
`projectAccess` (and a separately approved mutation/settings facet where required). Omitting it is
|
|
260
|
+
still type-compatible but is behaviorally breaking: the surface now fails closed instead of
|
|
261
|
+
reading or writing the current directory.
|
|
262
|
+
|
|
263
|
+
### Minor Changes
|
|
264
|
+
|
|
265
|
+
- d877de2: External events arrive over HTTP: `POST <public-url>/events/<grant-id>`, on a loopback port behind the owner's own
|
|
266
|
+
HTTPS proxy or tunnel.
|
|
267
|
+
|
|
268
|
+
- `agent-transport` — `./node` exports the resource-server gate every token-admitted HTTP carrier shares:
|
|
269
|
+
`createBearerResourceServer` (Host and Origin checked against the public URL, trusted-proxy `X-Forwarded-For`,
|
|
270
|
+
a failure-only throttle per address, coarse address classes), `describeProtectedResource` (RFC 9728 metadata
|
|
271
|
+
path and body, RFC 6750 challenges), `serveProtectedResourceMetadata`, `refuseBearerToken` and
|
|
272
|
+
`parsePublicHttpsUrl`.
|
|
273
|
+
- `agent-transport-mcp` — the remote MCP gate is composed from that shared gate; its answers are unchanged.
|
|
274
|
+
- `agent-cli` — each grant is its own endpoint and audience (its resource is `<public-url>/events/<grant-id>`).
|
|
275
|
+
An admitted event answers `202 {"turnId"}`; refusals have an empty body: 401 with the `invalid_token` or
|
|
276
|
+
missing-token challenge, 403 `insufficient_scope` or a revoked grant, 400 a malformed event, 404 an unknown
|
|
277
|
+
grant, 413 a body over 16 KiB, 429 over the grant's rate or the address's failure budget, 503 when the issuer
|
|
278
|
+
or the session cannot take it. `--external-event-port <port>` (required with grants) and
|
|
279
|
+
`--external-event-trusted-proxy <ip>` work on the TUI and on `robota session start --background`. A background
|
|
280
|
+
session writes an owner-only, bounded JSONL trail of refusals and settlements under its supervised directory;
|
|
281
|
+
the TUI reports them on one line each.
|
|
282
|
+
- d61e159: The session protocol gains a read-only `observe` role.
|
|
283
|
+
|
|
284
|
+
- `createSessionMessageHandler({ role: 'observe' })` follows the session's conversation, streaming,
|
|
285
|
+
tool, background, usage and workspace events and answers reads of this session. The default role
|
|
286
|
+
stays `drive`, which is unchanged.
|
|
287
|
+
- An observer never subscribes to `permission_request` or `ask_request`. A session with only observers
|
|
288
|
+
attached therefore still denies a permission and cancels a question at once instead of waiting for a
|
|
289
|
+
surface that may not answer. Observers still see `prompt_resolved`.
|
|
290
|
+
- An observer cannot submit, run commands, abort, cancel the queue, control background tasks, answer
|
|
291
|
+
prompts, or read personal or other sessions' usage reports. Each such message is answered with a
|
|
292
|
+
`protocol_error` and changes nothing. Only an explicit list of reads is accepted, so a message type
|
|
293
|
+
added later is refused to observers until it is classified.
|
|
294
|
+
- `ATTACHED_SURFACE_MAX_PENDING_BYTES` (1 MiB) is the backpressure budget a carrier passes to
|
|
295
|
+
`createOutboundDelivery` for a terminal attached on the same host. A reader that falls that far
|
|
296
|
+
behind is cut off and reported to the carrier, and other surfaces keep streaming. No carrier uses it
|
|
297
|
+
yet.
|
|
298
|
+
- `agent-cli`: a supervised session's control endpoint no longer includes its generation in a
|
|
299
|
+
refusal to a caller that did not present it.
|
|
300
|
+
- a5961c9: Access-token verification for a remote resource server.
|
|
301
|
+
|
|
302
|
+
`agent-interface-transport` gains the contract: `IAccessTokenVerifier`, its configuration
|
|
303
|
+
`IAccessTokenVerifierConfig`, and the verdict `TAccessTokenAdmission` — admitted, or refused with one
|
|
304
|
+
`TAccessTokenRefusal` reason. A verdict never carries the token or a claim value.
|
|
305
|
+
|
|
306
|
+
`agent-transport/node` gains `createAccessTokenVerifier`, built on `jose` (now a direct, pinned
|
|
307
|
+
dependency). A token is admitted only when it is an `at+jwt` access token within a length bound,
|
|
308
|
+
issued by exactly the configured issuer, signed with a configured RS256, ES256 or EdDSA key whose
|
|
309
|
+
type, curve, `alg` and `use` agree with it, within `exp`/`nbf` with 60 s of skew, addressed to the
|
|
310
|
+
configured resource, carrying the required scopes, and from an allowlisted subject or client. The
|
|
311
|
+
host is single-tenant, so a configuration without an allowlist is refused at construction.
|
|
312
|
+
|
|
313
|
+
Keys are discovered through the issuer's metadata (RFC 8414, then OpenID discovery, with an issuer
|
|
314
|
+
equality check) and fetched over `https` through agent-core's egress boundary, byte-bounded, with
|
|
315
|
+
private-address reach granted to the issuer's host only. The key set is cached and refetched, at a
|
|
316
|
+
bounded rate, for an unknown `kid` or once it reaches a maximum age, so a key the issuer withdraws
|
|
317
|
+
stops admitting; keys are trusted only up to a bounded age, and beyond that an outage refuses.
|
|
318
|
+
|
|
319
|
+
Nothing is wired to a listener yet.
|
|
320
|
+
- c7f9203: Connected sessions can send each other files.
|
|
321
|
+
|
|
322
|
+
- `/peers send-file <session-id> <path>` sends a copy of any file the operator can read to another
|
|
323
|
+
live session on this host.
|
|
324
|
+
- The model sends a file only through the `peer_send_file` tool. Every call asks the user, showing
|
|
325
|
+
the path, size, hash and destination; no permission mode, rule or remembered consent answers it.
|
|
326
|
+
The tool reaches only files inside the workspace whose path does not look like it holds secrets
|
|
327
|
+
(`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
|
|
328
|
+
- The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
|
|
329
|
+
under `the configured user data directory<sender>/`. It is never run and never placed in the model's context.
|
|
330
|
+
The conversation is told only its name, size and sha256. A name that leaves that directory is
|
|
331
|
+
refused, a symbolic link is never written through, and nothing is overwritten.
|
|
332
|
+
- Transfers travel on a channel of their own (a separate connection on this host, a separate data
|
|
333
|
+
channel between devices), in chunks the receiver paces, up to 32 MiB, and are kept only when the
|
|
334
|
+
whole content matches the offered sha256. A transfer that ends early is discarded; there is no
|
|
335
|
+
resume.
|
|
336
|
+
|
|
337
|
+
**API**
|
|
338
|
+
|
|
339
|
+
- `agent-interface-session-mobility`: the `file` capability, which asks the operator for every
|
|
340
|
+
request; `ConnectionAuthority.authorizeFile`; `IFileOffer` and `IFileFrameChannel`.
|
|
341
|
+
- `agent-transport/node`: `sendFileOverChannel` and `receiveFileOverChannel`, the carrier over any
|
|
342
|
+
`IFileFrameChannel`; `DEFAULT_MAX_FILE_BYTES`.
|
|
343
|
+
- `agent-transport-webrtc`: `IDeviceMeshLink.openFileChannel` and `onFileChannel`.
|
|
344
|
+
- `agent-remote-pairing`: `file` joins `DEVICE_CAPABILITIES`. A device certificate that names it is
|
|
345
|
+
refused as malformed by an earlier version.
|
|
346
|
+
- `agent-core`: `IToolPermissionProfile.notInPeerTurn` withholds a tool from a turn a peer's message
|
|
347
|
+
started.
|
|
348
|
+
- `agent-framework`: `ICommandLocalPeersAdapter.prepareFile`.
|
|
349
|
+
- 3427887: `--serve --http-port` can serve the agent HTTP API as an OAuth resource server: with `--http-public-url`, `--oauth-issuer`, `--oauth-scopes` and `--oauth-allowed-subjects` (plus optional `--http-host` and `--trusted-proxy`) it may bind a non-loopback address and admits access tokens through the same shared resource-server gate as `mcp serve`. Without them it stays loopback with the `PRODUCT_HTTP_TOKEN` bearer.
|
|
350
|
+
|
|
351
|
+
The refusal answer shared by both resource-server carriers (503 for unavailable issuer keys, uncounted; counted challenge otherwise) is now `refuseAccessToken` in `@robota-sdk/agent-transport/node`.
|
|
352
|
+
- c967c57: `robota acp` runs the agent as an Agent Client Protocol (v1) agent over stdio, so an editor that launches it (Zed, JetBrains and other ACP clients) can create a session, send prompts, see streamed replies and tool calls, approve or reject permission requests, and cancel a turn. Workspace trust, permission rules and the sandbox behave as in the terminal: the editor answers prompts and widens nothing. A folder that is not trusted yet is refused at `session/new` with the `trust` command to run, a working directory other than the one the agent was started in and any editor-supplied MCP servers or extra roots are refused, and a prompt that starts with `/` runs that command.
|
|
353
|
+
|
|
354
|
+
New package `@robota-sdk/agent-transport-acp` provides `createAcpTransport`, the ACP `ITransportAdapter` the command uses.
|
|
355
|
+
|
|
356
|
+
`@robota-sdk/agent-transport/node` gains `attachStdioCarrier`, the process-input bridge and close observation a stdio protocol carrier shares. `agent-transport-mcp` now uses it for its stdio carrier; its behavior is unchanged.
|
|
357
|
+
- 4c5148e: ARCH-005 Stage S2 — `configured CLI` is now expressed as an `IProductProfile` and assembled by `assembleProduct`;
|
|
358
|
+
the hand-wired composition root in `agent-cli` is gone.
|
|
359
|
+
|
|
360
|
+
- **`@robota-sdk/agent-product`** — provider construction returns IN-KERNEL. `assembleProduct` builds the
|
|
361
|
+
provider from `providerDefinitions` + the shell's already-resolved `providerSettings` vian agent-core's
|
|
362
|
+
pure `createProviderFromConfig`; `provider` is now an OPTIONAL injected override. Both are optional, so a
|
|
363
|
+
Mode A profile can carry only `providerDefinitions`. The fold stays pure and IO-free — every
|
|
364
|
+
settings/env/file read still happens in the shell. Adds `IAssembledProduct.buildRuntimeOptions`, the pure
|
|
365
|
+
overlay `buildRuntime` delegates through, and `IAssembledProduct.providerDefinitions`.
|
|
366
|
+
**Breaking for pre-release consumers:** `IProductProfile.providerDefinitions` is now required and
|
|
367
|
+
`IProductProfile.provider` / `IAssembledProduct.provider` are now optional.
|
|
368
|
+
- **`@robota-sdk/agent-framework`** — a scoped, additive session seam: `agentDefinitions` on
|
|
369
|
+
`TInteractiveSessionOptions` / `ICreateSessionOptions`, composed into the built-in agent tier ahead of
|
|
370
|
+
`BUILT_IN_AGENTS`, so capability-pack subagents actually reach the runtime. Precedence: discovered
|
|
371
|
+
project/user definitions > injected > built-in. `AgentDefinitionLoader` now dedupes within that tier
|
|
372
|
+
(first wins). Absent ⇒ unchanged behavior.
|
|
373
|
+
- **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
|
|
374
|
+
`agentDefinitions` through the headless and TUI channels so every product surface carries the seam.
|
|
375
|
+
- **`@robota-sdk/agent-cli`** — `configured CLI`'s identity (branding, provider surface, presets,
|
|
376
|
+
`packs: [codingPack]`, base command modules, injected transports/runners/subagent factory) is declared as
|
|
377
|
+
data in a product profile and folded by `assembleProduct`. The coding command modules (`/shell`,
|
|
378
|
+
`/editor`) now come from `pack-coding` rather than the base set, so the pack is load-bearing. What remains
|
|
379
|
+
in the CLI is product-shell only: arg parsing, settings/file IO, terminal notices, first-run/init/
|
|
380
|
+
`--configure`, memory + session-resume UX, and print/serve/TUI mode dispatch.
|
|
381
|
+
|
|
382
|
+
End-user `configured CLI` behavior is unchanged in substance — the assembled command-module set, provider surface,
|
|
383
|
+
tool set, subagent roster, and preset resolution all match the pre-change assembly — with one accepted
|
|
384
|
+
cosmetic delta: `/shell` and `/editor` now appear at the END of `/help` output and of the slash-command
|
|
385
|
+
autocomplete popup rather than mid-list, because they arrive from `pack-coding` and both surfaces render in
|
|
386
|
+
module-insertion order. Same commands, same behavior, different position.
|
|
387
|
+
- 0116a29: ARCH-006 completion — the configured product's capability packs now OWN its tool surface, and `pack-coding` is built by a
|
|
388
|
+
context-bound factory.
|
|
389
|
+
|
|
390
|
+
- **`@robota-sdk/pack-coding` (BREAKING)** — the module-level `codingPack` constant is **removed** and
|
|
391
|
+
replaced by `createCodingPack({ cwd, sandboxClient })`, with `cwd` **required**. This is a safety change,
|
|
392
|
+
not a style one: `agent-tools` disarms its working-directory path guard when `cwd` is `undefined`, so a
|
|
393
|
+
pack whose file tools are built with no options contributes an **unsandboxed** `Read`/`Write`/`Edit`.
|
|
394
|
+
That was inert while `agent-framework` always supplied its own context-bound default tier, but ARCH-006
|
|
395
|
+
lets a product hand the whole tool surface to its packs (`defaultTools: []`) — and a context-free pack in
|
|
396
|
+
that position is a real hole. Keeping a zero-option export beside that seam would be a loaded gun, so it
|
|
397
|
+
is gone rather than deprecated. Each call returns fresh instances bound to the supplied context, so two
|
|
398
|
+
products in one process get independently-scoped file tools. Migration: replace `codingPack` with
|
|
399
|
+
`createCodingPack({ cwd: process.cwd() })`.
|
|
400
|
+
- **`@robota-sdk/agent-cli`** — `configured CLI`'s packs are built from the shell's resolved `cwd`
|
|
401
|
+
(`createProductCapabilityPacks({ cwd })`) before command setup, and the runtime seam passes
|
|
402
|
+
`PRODUCT_PACKS_OWN_TOOL_SURFACE` (an empty `defaultTools`) so the framework's `createDefaultTools()` tier
|
|
403
|
+
is REPLACED. Every tool the configured CLI runs now arrives from a capability pack: dropping a pack drops its tools,
|
|
404
|
+
exactly as it already dropped its command modules and subagents.
|
|
405
|
+
- **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
|
|
406
|
+
`additionalTools` and `defaultTools` through the headless and TUI channels, mirroring the existing
|
|
407
|
+
`agentDefinitions` pass-through, so print, serve and TUI carry an identical tool surface.
|
|
408
|
+
|
|
409
|
+
End-user `configured CLI` behavior is unchanged, including the security property: the real binary still answers a
|
|
410
|
+
read outside the working directory with `Access denied: "…" is outside the working directory`.
|
|
411
|
+
- 9db63ee: Add named session capability roles and explicit capability-host queries while preserving the legacy
|
|
412
|
+
`IInteractiveSession` interface shape. HTTP, MCP, protocol, WS, WebRTC, and headless transports now
|
|
413
|
+
declare only the session roles they consume, and the direct aggregate-cast floor is zero.
|
|
414
|
+
- 1e3f91a: CMD-004 Phase 2 Stage E (breaking, beta line): the legacy `TCommandEffect` union and
|
|
415
|
+
`ICommandResult.effects` are DELETED. Commands emit the split contract directly —
|
|
416
|
+
`hostActions` (session-executed via `ICommandHostAdapters`; works headless and remote) and
|
|
417
|
+
`uiIntents` (requester-routed `ui_intent` session events with UI-neutral `show-*` names).
|
|
418
|
+
Final carriers for the former notification effects: `session_renamed` and the new
|
|
419
|
+
`history_cleared` are BROADCAST session events (forwarded to every WS surface, folded by the
|
|
420
|
+
TUI transcript/title and the GUI reducer's new `sessionName`/transcript-reset state);
|
|
421
|
+
`session-execution-started` rides `result.data.sessionExecution`; the plugin-registry refresh
|
|
422
|
+
rides `result.data.pluginRegistryReloaded`. A mechanical grep floor
|
|
423
|
+
(`command-effect-grep-floor.test.ts`) keeps `tui-requested`/`TCommandEffect`/`effects:` out of
|
|
424
|
+
every `packages/*/src` production tree.
|
|
425
|
+
|
|
426
|
+
### Patch Changes
|
|
427
|
+
|
|
428
|
+
- 57280bf: Every published package now declares `"engines": { "node": ">=22.12.0" }`. Before, 27 of the 38
|
|
429
|
+
packages declared no floor (`agent-core`, `agent-tools` and every provider among them),
|
|
430
|
+
`agent-session` and `agent-file-authority` declared `>=20.19.0`, and the other nine declared
|
|
431
|
+
`>=22.0.0`, so a consumer on Node 20 saw at most a warning from a transitive dependency.
|
|
432
|
+
|
|
433
|
+
Why 22.12: `agent-cli` and `agent-ui-terminal` need Node 22 through `ink` 7, and the CommonJS entries
|
|
434
|
+
of `agent-tools` and its dependents, `agent-transport`/`node` and its dependents, and
|
|
435
|
+
`agent-ui-terminal` `require()` ESM-only dependencies (`p-limit`, `jose`, `chalk`), which Node 22
|
|
436
|
+
supports unflagged only from 22.12. `engines` is advisory unless the consumer enables `engine-strict`.
|
|
437
|
+
|
|
438
|
+
No code changes: `tsdown` now reads `node22.12.0` as its build target from the field.
|
|
439
|
+
- 18c0d5c: Every published package now exports `./package.json`, so `require('<package>/package.json')` and
|
|
440
|
+
`import('<package>/package.json', { with: { type: 'json' } })` work instead of failing with
|
|
441
|
+
`ERR_PACKAGE_PATH_NOT_EXPORTED`, and each tarball now ships the package's `CHANGELOG.md`.
|
|
442
|
+
- 9a01e78: `chunkHandoffPayload` and `HandoffChunkAssembler`, exported from the package root that also builds for the browser, no longer use Node's `Buffer`; they use `Uint8Array`, `TextEncoder`/`TextDecoder` and `btoa`/`atob`, with the same chunks and the same refusal of non-canonical base64.
|
|
443
|
+
- 2c612ba: Release the migrated Robota product with its public SDK namespace, robota command, compatible SDK exports, internal product configuration, and verified CLI startup and delivery corrections.
|
|
444
|
+
- 60f3965: **`robota mcp serve --ask-client` puts a caller's permission and ask prompts to the calling MCP client through elicitation instead of failing them.**
|
|
445
|
+
|
|
446
|
+
`@robota-sdk/agent-transport-mcp`: `createMcpTransport`, `createMcpHttpHost`,
|
|
447
|
+
`createMcpRemoteHttpHost` and `createAgentMcpServer` take `askClient`. Off by default, every prompt
|
|
448
|
+
is a tool error as before. On, and when the client declared form-mode elicitation, a permission or
|
|
449
|
+
ask prompt raised by that client's own call is put to it: a permission offers allow once or deny
|
|
450
|
+
only, never a remembered grant; an ask becomes a form (choice, multiple choice, free text); a masked
|
|
451
|
+
ask is never sent; deny, decline, cancel, a client error or an answer naming nothing offered keeps
|
|
452
|
+
today's outcome. stdio asks during the call. The HTTP hosts keep no session state, so they ask only
|
|
453
|
+
a client on the 2026-07-28 revision, through input-required rounds whose `requestState` is a
|
|
454
|
+
single-use random token naming one parked call; a 2025-era HTTP client keeps the tool error.
|
|
455
|
+
A call listens for prompts only while its own work drives the session, so a submission waiting
|
|
456
|
+
in the queue never holds another caller's prompt that it cannot answer.
|
|
457
|
+
Breaking for hand-written sessions: `IMcpTransportSession` now also requires `ISessionEvents`
|
|
458
|
+
(`on`/`off`), `ISessionPromptResolution` (`resolvePermission`/`resolveAsk`) and
|
|
459
|
+
`ISessionDriverAttribution` (`getActiveDriverId`), which `InteractiveSession` and the published
|
|
460
|
+
test double already implement.
|
|
461
|
+
|
|
462
|
+
`@robota-sdk/agent-interface-session` / `@robota-sdk/agent-session` / `@robota-sdk/agent-framework`:
|
|
463
|
+
`ISessionRuntimeTools.invokeRuntimeTool` (and `Session.invokeRuntimeTool`) accept
|
|
464
|
+
`options.permissionInteraction` and `options.driverId`. A direct call still denies a decision that
|
|
465
|
+
would need a person, and finds no one to ask a question, unless its caller passes
|
|
466
|
+
`permissionInteraction: 'interactive'`; then it asks the session's permission handler and its
|
|
467
|
+
tools get the session's ask port. `InteractiveSession` makes `driverId` the active driver while
|
|
468
|
+
the direct call runs, so a prompt the call raises carries it as `requesterDriverId`. With
|
|
469
|
+
`askClient` on, an MCP call runs under its own `mcp:<n>` driver id; a submission made that way is
|
|
470
|
+
attributed to it rather than to the owner.
|
|
471
|
+
|
|
472
|
+
`@robota-sdk/agent-transport`: exports `permissionSummaryArgument`, the argument a person recognises
|
|
473
|
+
a tool call by (`filePath` for the built-in file tools), for every transport that puts a permission
|
|
474
|
+
request to a person in its own wire form.
|
|
475
|
+
|
|
476
|
+
`@robota-sdk/agent-cli`: `mcp serve --ask-client` turns this on for whichever carrier the run serves.
|
|
477
|
+
- 04a6de4: **Reasoning text a provider streams now reaches the editor as an ACP `agent_thought_chunk`, through a new `thinking_delta` session event.**
|
|
478
|
+
|
|
479
|
+
`IChatOptions.onThinkingDelta`, `IRunOptions.onThinkingDelta` and `IResumeExecutionOptions.onThinkingDelta`
|
|
480
|
+
(typed `TThinkingDeltaCallback`) carry reasoning text from a provider through the run, and the session
|
|
481
|
+
options (`ISessionOptions.onThinkingDelta`, `ICreateSessionOptions.onThinkingDelta`) hand it to the
|
|
482
|
+
session's owner. `InteractiveSession` emits it as `thinking_delta(delta)`, beside `text_delta`. The
|
|
483
|
+
text is never part of the reply: it is not appended to the conversation, not streamed through
|
|
484
|
+
`onTextDelta`, and the core adds no record of its own for it (no text-delta log entry, no
|
|
485
|
+
`provider_stream_raw_delta`); a provider's own native payload capture and response metadata keep
|
|
486
|
+
what the provider sent, as before. A reasoning delta counts as provider activity for the idle
|
|
487
|
+
timeout whether or not anyone listens to it, so a model that is only thinking is not cut off. The
|
|
488
|
+
existing `thinking(isThinking)` event is unchanged and remains the busy indicator. Where a provider
|
|
489
|
+
sends no reasoning text, nothing is emitted and nothing new is switched on.
|
|
490
|
+
|
|
491
|
+
`@robota-sdk/agent-interface-session` is a major change because a new session event name makes an
|
|
492
|
+
exhaustive map over the event names stop compiling until it classifies the event.
|
|
493
|
+
|
|
494
|
+
`@robota-sdk/agent-transport-acp` sends each non-empty `thinking_delta` to the editor as an
|
|
495
|
+
`agent_thought_chunk`, in order with the message chunks, so `robota acp` shows the model's reasoning
|
|
496
|
+
in the editor. A turn that streamed only thoughts still shows its result text, because only reply
|
|
497
|
+
text marks a turn as streamed. The WebSocket wire, the HTTP stream, headless stream-json, `query()`
|
|
498
|
+
and the terminal UI do not carry the new event in this change (`@robota-sdk/agent-transport` and
|
|
499
|
+
`@robota-sdk/agent-ui-terminal` classify it as non-surface). A forked skill and an in-process subagent
|
|
500
|
+
pass their reply text up but not their reasoning.
|
|
501
|
+
|
|
502
|
+
Two providers already receive reasoning text and now report it. `@robota-sdk/agent-provider-openai`
|
|
503
|
+
passes `response.reasoning_summary_text.delta` events of a streamed Responses call to
|
|
504
|
+
`onThinkingDelta`; the API sends them only when the provider profile asks for a reasoning summary, and
|
|
505
|
+
no request option changed; a summary streamed in several parts, and the summary of a later reasoning
|
|
506
|
+
item, each start on a new paragraph (`\n\n`) so the parts do not run together.
|
|
507
|
+
`@robota-sdk/agent-provider-openai-compatible` reports the text of Gemma's thought channel, which the
|
|
508
|
+
provider already removed from the reply, as it streams across chunk boundaries, with each later
|
|
509
|
+
channel of one reply on a new paragraph; the reply text is unchanged. No other provider reports
|
|
510
|
+
reasoning, and Anthropic thinking is not enabled. A model fallback chain still moves to the next model when only reasoning had streamed.
|
|
511
|
+
|
|
512
|
+
The scripted test provider (`@robota-sdk/agent-core/testing`) accepts an optional `thinking` string on
|
|
513
|
+
a turn and delivers it through `onThinkingDelta` before the turn's text; the scripted session harness
|
|
514
|
+
collects `thinking_delta` and now keeps a scripted tool-call turn's `usage`, which it used to drop.
|
|
515
|
+
- 2ebff01: Emit the complete persisted checkpoint and branch lifecycle, forward plan, context-refresh, and
|
|
516
|
+
branch events through protocol transports, and render deterministic bounded notices in the TUI.
|
|
517
|
+
Transport-owned delivery failures now enter the owning carrier cleanup lifecycle without reversing
|
|
518
|
+
an already-committed session operation.
|
|
519
|
+
- c207a31: Keep automatic compaction aligned with the active model and pending input, preserve provider usage when estimating new context, and keep summary text out of the response stream. Display live context changes and successful automatic compaction in the shared app interface.
|
|
520
|
+
- 3244fb8: Fix a headless-run race (CI-001): the headless runner now resolves its exit code only AFTER the underlying `session.submit()` operation has fully settled, not off the terminal `complete`/`interrupted`/`error` event alone. Those events fire from inside the turn, BEFORE the turn's awaited `finally` runs session persistence / checkpoint finalize, so `run()`/`start()` previously returned while the session was still writing `the configured project-state directory/` under cwd — a race a caller (or a test's cleanup) could lose (`ENOTEMPTY`). Each run now also emits exactly one terminal record. No change to exit codes or output shape.
|
|
521
|
+
- 4f3c075: Assemble complete, verified package generations before switching build output; preserve the previous generation on build failure and pack only verified regular-file images. Include copied CLI web assets in affected-build ordering and artifact transfer. Preserve the CLI version in managed build paths. Public runtime contracts remain compatible (patch).
|
|
522
|
+
- 9c6a8db: The wire protocol gained several request/reply pairs so a GUI never has to scrape command output for
|
|
523
|
+
data it can read directly.
|
|
524
|
+
|
|
525
|
+
`get-settings`/`update-settings` read and write the Settings screen; a patch applies through the same
|
|
526
|
+
function its matching slash command uses, so the two paths cannot drift. `list-models` returns the
|
|
527
|
+
configured models grouped by provider profile, with the current profile and model. `get-agent-definitions`
|
|
528
|
+
returns the agent switcher's roster and current selection. `project-status`, `project-diff` and
|
|
529
|
+
`project-memory` back the Project panel's git status, one file's diff, and project memory; a host
|
|
530
|
+
without this capability answers `protocol_error` instead of hanging. `rename-session` and
|
|
531
|
+
`delete-session` rename or remove a stored session from the list, current or not, each with its own
|
|
532
|
+
success/failure reply.
|
|
533
|
+
|
|
534
|
+
The `messages` frame gained an optional `display` field — the same history projected into display
|
|
535
|
+
segments (text runs and finished tool calls, diffs included) — and the connection's own `driverId`, so
|
|
536
|
+
a reload, reconnect or resume shows tool rows and tells a co-driver's turns from its own. The `error`
|
|
537
|
+
frame gained optional `code`, `provider`, `retryAfterSeconds` and `model` fields so a renderer can say
|
|
538
|
+
what kind of failure happened (`auth`, `rate_limit`, `model_unavailable`, `network`, `provider`) instead
|
|
539
|
+
of showing only raw text; a session error this classification does not recognize is unchanged.
|
|
540
|
+
|
|
541
|
+
`TCommandSurfaceLocality` names whether a `'remote'`-sourced command is provably on this machine. The
|
|
542
|
+
WebRTC/device-mesh transport now forwards `'remote'` for it (it proves no locality, the same rule
|
|
543
|
+
already applied to pairing), and both the WS and WebRTC transports forward it into the Settings
|
|
544
|
+
read/write path, so a command that refuses a remote surface (installing a plugin) refuses identically
|
|
545
|
+
regardless of which transport carried it.
|
|
546
|
+
- Updated dependencies [9c19c50]
|
|
547
|
+
- Updated dependencies [7b6234c]
|
|
548
|
+
- Updated dependencies [5307f8a]
|
|
549
|
+
- Updated dependencies [b462ee7]
|
|
550
|
+
- Updated dependencies [37b4bd7]
|
|
551
|
+
- Updated dependencies [4eea54b]
|
|
552
|
+
- Updated dependencies [50d2c9f]
|
|
553
|
+
- Updated dependencies [3c81769]
|
|
554
|
+
- Updated dependencies [724fabb]
|
|
555
|
+
- Updated dependencies [bfe8ed5]
|
|
556
|
+
- Updated dependencies [1698be4]
|
|
557
|
+
- Updated dependencies [a5961c9]
|
|
558
|
+
- Updated dependencies [d4189b9]
|
|
559
|
+
- Updated dependencies [9edae52]
|
|
560
|
+
- Updated dependencies [4078a72]
|
|
561
|
+
- Updated dependencies [4c73a0b]
|
|
562
|
+
- Updated dependencies [af2f2ad]
|
|
563
|
+
- Updated dependencies [196a900]
|
|
564
|
+
- Updated dependencies [f336838]
|
|
565
|
+
- Updated dependencies [34e50f0]
|
|
566
|
+
- Updated dependencies [722e88a]
|
|
567
|
+
- Updated dependencies [d23c848]
|
|
568
|
+
- Updated dependencies [3038eb7]
|
|
569
|
+
- Updated dependencies [02b7452]
|
|
570
|
+
- Updated dependencies [4dd45cc]
|
|
571
|
+
- Updated dependencies [e689c8e]
|
|
572
|
+
- Updated dependencies [ec5e477]
|
|
573
|
+
- Updated dependencies [b2e0afe]
|
|
574
|
+
- Updated dependencies [007fd90]
|
|
575
|
+
- Updated dependencies [c7f9203]
|
|
576
|
+
- Updated dependencies [004fe7f]
|
|
577
|
+
- Updated dependencies [18b52cc]
|
|
578
|
+
- Updated dependencies [7b72344]
|
|
579
|
+
- Updated dependencies [6ae3f28]
|
|
580
|
+
- Updated dependencies [be0e53c]
|
|
581
|
+
- Updated dependencies [57f57f5]
|
|
582
|
+
- Updated dependencies [ba822c1]
|
|
583
|
+
- Updated dependencies [9721162]
|
|
584
|
+
- Updated dependencies [6e6b06b]
|
|
585
|
+
- Updated dependencies [8bd5fac]
|
|
586
|
+
- Updated dependencies [57280bf]
|
|
587
|
+
- Updated dependencies [5033dd9]
|
|
588
|
+
- Updated dependencies [18c0d5c]
|
|
589
|
+
- Updated dependencies [dbd888d]
|
|
590
|
+
- Updated dependencies [1887e54]
|
|
591
|
+
- Updated dependencies [9f46375]
|
|
592
|
+
- Updated dependencies [41cca13]
|
|
593
|
+
- Updated dependencies [193a0bc]
|
|
594
|
+
- Updated dependencies [ada3841]
|
|
595
|
+
- Updated dependencies [5093a30]
|
|
596
|
+
- Updated dependencies [94b2c87]
|
|
597
|
+
- Updated dependencies [3ab2eca]
|
|
598
|
+
- Updated dependencies [e8d70ac]
|
|
599
|
+
- Updated dependencies [2c612ba]
|
|
600
|
+
- Updated dependencies [66af868]
|
|
601
|
+
- Updated dependencies [fef3a50]
|
|
602
|
+
- Updated dependencies [60f3965]
|
|
603
|
+
- Updated dependencies [115e104]
|
|
604
|
+
- Updated dependencies [04719a9]
|
|
605
|
+
- Updated dependencies [04a6de4]
|
|
606
|
+
- Updated dependencies [0ba247b]
|
|
607
|
+
- Updated dependencies [6f41c53]
|
|
608
|
+
- Updated dependencies [fec722f]
|
|
609
|
+
- Updated dependencies [e82215f]
|
|
610
|
+
- Updated dependencies [52b7346]
|
|
611
|
+
- Updated dependencies [9db63ee]
|
|
612
|
+
- Updated dependencies [b078afa]
|
|
613
|
+
- Updated dependencies [2ebff01]
|
|
614
|
+
- Updated dependencies [9db63ee]
|
|
615
|
+
- Updated dependencies [2ebff01]
|
|
616
|
+
- Updated dependencies [2d3b2c0]
|
|
617
|
+
- Updated dependencies [4772067]
|
|
618
|
+
- Updated dependencies [0f98419]
|
|
619
|
+
- Updated dependencies [64ba748]
|
|
620
|
+
- Updated dependencies [9fbab1b]
|
|
621
|
+
- Updated dependencies [d312755]
|
|
622
|
+
- Updated dependencies [a009f5b]
|
|
623
|
+
- Updated dependencies [c207a31]
|
|
624
|
+
- Updated dependencies [9b4f63b]
|
|
625
|
+
- Updated dependencies [1e3f91a]
|
|
626
|
+
- Updated dependencies [4f3c075]
|
|
627
|
+
- Updated dependencies [475e085]
|
|
628
|
+
- Updated dependencies [e477440]
|
|
629
|
+
- Updated dependencies [9dcb5da]
|
|
630
|
+
- Updated dependencies [a95ca85]
|
|
631
|
+
- Updated dependencies [b6d14ce]
|
|
632
|
+
- Updated dependencies [0382a51]
|
|
633
|
+
- Updated dependencies [93d061d]
|
|
634
|
+
- Updated dependencies [39554a1]
|
|
635
|
+
- Updated dependencies [d28430a]
|
|
636
|
+
- Updated dependencies [1e40b5b]
|
|
637
|
+
- Updated dependencies [7669851]
|
|
638
|
+
- Updated dependencies [7d9cc66]
|
|
639
|
+
- Updated dependencies [7d9cc66]
|
|
640
|
+
- Updated dependencies [7d9cc66]
|
|
641
|
+
- Updated dependencies [df02568]
|
|
642
|
+
- Updated dependencies [7d9cc66]
|
|
643
|
+
- Updated dependencies [4b76cfa]
|
|
644
|
+
- Updated dependencies [07b627f]
|
|
645
|
+
- Updated dependencies [d0de5b2]
|
|
646
|
+
- Updated dependencies [9c6a8db]
|
|
647
|
+
- Updated dependencies [9c6a8db]
|
|
648
|
+
- Updated dependencies [dfb9b15]
|
|
649
|
+
- Updated dependencies [9665c6e]
|
|
650
|
+
- Updated dependencies [44393be]
|
|
651
|
+
- Updated dependencies [c7fa299]
|
|
652
|
+
- Updated dependencies [7d9cc66]
|
|
653
|
+
- Updated dependencies [7d9cc66]
|
|
654
|
+
- Updated dependencies [5134b3b]
|
|
655
|
+
- Updated dependencies [7911a7d]
|
|
656
|
+
- Updated dependencies [d6b9404]
|
|
657
|
+
- Updated dependencies [7d9cc66]
|
|
658
|
+
- Updated dependencies [62663ae]
|
|
659
|
+
- Updated dependencies [9c6a8db]
|
|
660
|
+
- Updated dependencies [23a30cd]
|
|
661
|
+
- Updated dependencies [7d9cc66]
|
|
662
|
+
- Updated dependencies [7d9cc66]
|
|
663
|
+
- Updated dependencies [5c5ff23]
|
|
664
|
+
- Updated dependencies [9814afc]
|
|
665
|
+
- Updated dependencies [7d9cc66]
|
|
666
|
+
- Updated dependencies [02053ec]
|
|
667
|
+
- Updated dependencies [9c6a8db]
|
|
668
|
+
- @robota-sdk/agent-interface-execution@3.0.0
|
|
669
|
+
- @robota-sdk/agent-interface-command@3.0.0
|
|
670
|
+
- @robota-sdk/agent-core@3.0.0
|
|
671
|
+
- @robota-sdk/agent-interface-session@3.0.0
|
|
672
|
+
- @robota-sdk/agent-interface-transport@3.0.0
|
|
673
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0
|
|
674
|
+
- @robota-sdk/agent-interface-analytics@3.0.0
|
|
675
|
+
|
|
676
|
+
## 3.0.0-beta.106
|
|
677
|
+
### Patch Changes
|
|
678
|
+
|
|
679
|
+
- @robota-sdk/agent-core@3.0.0-beta.106
|
|
680
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.106
|
|
681
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.106
|
|
682
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.106
|
|
683
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.106
|
|
684
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.106
|
|
685
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.106
|
|
686
|
+
|
|
687
|
+
## 3.0.0-beta.105
|
|
688
|
+
### Patch Changes
|
|
689
|
+
|
|
690
|
+
- @robota-sdk/agent-core@3.0.0-beta.105
|
|
691
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.105
|
|
692
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.105
|
|
693
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.105
|
|
694
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.105
|
|
695
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.105
|
|
696
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.105
|
|
697
|
+
|
|
698
|
+
## 3.0.0-beta.104
|
|
699
|
+
### Patch Changes
|
|
700
|
+
|
|
701
|
+
- @robota-sdk/agent-core@3.0.0-beta.104
|
|
702
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.104
|
|
703
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.104
|
|
704
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.104
|
|
705
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.104
|
|
706
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.104
|
|
707
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.104
|
|
708
|
+
|
|
709
|
+
## 3.0.0-beta.103
|
|
710
|
+
### Patch Changes
|
|
711
|
+
|
|
712
|
+
- Updated dependencies [6f41c53]
|
|
713
|
+
- @robota-sdk/agent-core@3.0.0-beta.103
|
|
714
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.103
|
|
715
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.103
|
|
716
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.103
|
|
717
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.103
|
|
718
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.103
|
|
719
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.103
|
|
720
|
+
|
|
721
|
+
## 3.0.0-beta.102
|
|
722
|
+
### Patch Changes
|
|
723
|
+
|
|
724
|
+
- @robota-sdk/agent-core@3.0.0-beta.102
|
|
725
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.102
|
|
726
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.102
|
|
727
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.102
|
|
728
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.102
|
|
729
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.102
|
|
730
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.102
|
|
731
|
+
|
|
732
|
+
## 3.0.0-beta.101
|
|
733
|
+
### Patch Changes
|
|
734
|
+
|
|
735
|
+
- Updated dependencies [62663ae]
|
|
736
|
+
- @robota-sdk/agent-core@3.0.0-beta.101
|
|
737
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.101
|
|
738
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.101
|
|
739
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.101
|
|
740
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.101
|
|
741
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.101
|
|
742
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.101
|
|
743
|
+
|
|
744
|
+
## 3.0.0-beta.100
|
|
745
|
+
### Patch Changes
|
|
746
|
+
|
|
747
|
+
- @robota-sdk/agent-core@3.0.0-beta.100
|
|
748
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.100
|
|
749
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.100
|
|
750
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.100
|
|
751
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.100
|
|
752
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.100
|
|
753
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.100
|
|
754
|
+
|
|
3
755
|
## 3.0.0-beta.99
|
|
4
756
|
### Patch Changes
|
|
5
757
|
|
|
@@ -250,7 +1002,7 @@
|
|
|
250
1002
|
### Minor Changes
|
|
251
1003
|
|
|
252
1004
|
- 3427887: `--serve --http-port` can serve the agent HTTP API as an OAuth resource server: with `--http-public-url`, `--oauth-issuer`, `--oauth-scopes` and `--oauth-allowed-subjects` (plus optional `--http-host` and `--trusted-proxy`) it may bind a non-loopback address and admits access tokens through the same shared resource-server gate as `mcp serve`. Without them it stays loopback with the `PRODUCT_HTTP_TOKEN` bearer.
|
|
253
|
-
|
|
1005
|
+
|
|
254
1006
|
The refusal answer shared by both resource-server carriers (503 for unavailable issuer keys, uncounted; counted challenge otherwise) is now `refuseAccessToken` in `@robota-sdk/agent-transport/node`.
|
|
255
1007
|
|
|
256
1008
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robota-sdk/agent-transport",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Carrier-neutral wire protocol, session dispatch and delivery for Robota SDK transports",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/node/index.js",
|
|
@@ -80,13 +80,13 @@
|
|
|
80
80
|
],
|
|
81
81
|
"dependencies": {
|
|
82
82
|
"jose": "6.2.3",
|
|
83
|
-
"@robota-sdk/agent-
|
|
84
|
-
"@robota-sdk/agent-interface-
|
|
85
|
-
"@robota-sdk/agent-interface-
|
|
86
|
-
"@robota-sdk/agent-
|
|
87
|
-
"@robota-sdk/agent-interface-session": "3.0.
|
|
88
|
-
"@robota-sdk/agent-interface-session-mobility": "3.0.
|
|
89
|
-
"@robota-sdk/agent-interface-transport": "3.0.
|
|
83
|
+
"@robota-sdk/agent-interface-analytics": "3.0.1",
|
|
84
|
+
"@robota-sdk/agent-interface-command": "3.0.1",
|
|
85
|
+
"@robota-sdk/agent-interface-execution": "3.0.1",
|
|
86
|
+
"@robota-sdk/agent-core": "3.0.1",
|
|
87
|
+
"@robota-sdk/agent-interface-session": "3.0.1",
|
|
88
|
+
"@robota-sdk/agent-interface-session-mobility": "3.0.1",
|
|
89
|
+
"@robota-sdk/agent-interface-transport": "3.0.1"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
92
|
"rimraf": "^5.0.10",
|