@robota-sdk/agent-transport 3.0.0-beta.82 → 3.0.0-beta.84

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +795 -0
  2. package/README.md +80 -118
  3. package/dist/browser/client.d.ts +2 -2
  4. package/dist/browser/client.js +1 -1
  5. package/dist/browser/index.d.ts +87 -13
  6. package/dist/browser/index.d.ts.map +1 -1
  7. package/dist/browser/index.js +1 -1
  8. package/dist/browser/index.js.map +1 -1
  9. package/dist/browser/observer-messages-CEeisRaF.js +2 -0
  10. package/dist/browser/observer-messages-CEeisRaF.js.map +1 -0
  11. package/dist/browser/observer-messages-Dnff2Tdb.d.ts +471 -0
  12. package/dist/browser/observer-messages-Dnff2Tdb.d.ts.map +1 -0
  13. package/dist/node/index.cjs +1 -1
  14. package/dist/node/index.d.cts +308 -16
  15. package/dist/node/index.d.cts.map +1 -1
  16. package/dist/node/index.d.ts +308 -16
  17. package/dist/node/index.d.ts.map +1 -1
  18. package/dist/node/index.js +1 -1
  19. package/dist/node/index.js.map +1 -1
  20. package/dist/node/node.cjs +1 -1
  21. package/dist/node/node.d.cts +69 -1
  22. package/dist/node/node.d.cts.map +1 -1
  23. package/dist/node/node.d.ts +70 -2
  24. package/dist/node/node.d.ts.map +1 -1
  25. package/dist/node/node.js +1 -1
  26. package/dist/node/node.js.map +1 -1
  27. package/package.json +17 -14
  28. package/src/__tests__/bearer-resource-gate.test.ts +120 -0
  29. package/src/__tests__/history-attached-budget.test.ts +216 -0
  30. package/src/__tests__/message-decoders.test.ts +496 -6
  31. package/src/__tests__/project-read-messages.test.ts +118 -0
  32. package/src/__tests__/session-detail-loop-status.test.ts +169 -0
  33. package/src/__tests__/session-directory-messages.test.ts +322 -0
  34. package/src/__tests__/session-error-classification.test.ts +113 -0
  35. package/src/__tests__/session-history-wire.test.ts +342 -0
  36. package/src/__tests__/session-message-handler-observe.test.ts +217 -0
  37. package/src/__tests__/session-message-handler.test.ts +139 -4
  38. package/src/__tests__/settings-messages.test.ts +193 -0
  39. package/src/__tests__/ws-broadcast-events.test.ts +10 -0
  40. package/src/client.ts +9 -1
  41. package/src/index.ts +18 -2
  42. package/src/loop-control-messages.ts +34 -0
  43. package/src/message-decoders.ts +238 -6
  44. package/src/node/bearer-resource-gate.ts +291 -0
  45. package/src/node/index.ts +13 -0
  46. package/src/observer-messages.ts +47 -0
  47. package/src/open-prompts.ts +76 -0
  48. package/src/outbound-delivery.ts +11 -2
  49. package/src/project-read-messages.ts +74 -0
  50. package/src/protocol-session.ts +23 -1
  51. package/src/session-directory-messages.ts +162 -0
  52. package/src/session-error-classification.ts +91 -0
  53. package/src/session-events.ts +100 -19
  54. package/src/session-message-handler.ts +110 -15
  55. package/src/session-query-messages.ts +123 -5
  56. package/src/session-resume-bridge.ts +8 -0
  57. package/src/settings-messages.ts +103 -0
  58. package/src/wire-messages.ts +238 -11
  59. package/dist/browser/message-decoders-BB8n-H2X.d.ts +0 -252
  60. package/dist/browser/message-decoders-BB8n-H2X.d.ts.map +0 -1
  61. package/dist/browser/message-decoders-CDmDoZPR.js +0 -2
  62. package/dist/browser/message-decoders-CDmDoZPR.js.map +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,795 @@
1
+ # @robota-sdk/agent-transport
2
+
3
+ ## 3.0.0-beta.84
4
+
5
+ ### Patch Changes
6
+
7
+ - 9c6a8db: The wire protocol gained several request/reply pairs so a GUI never has to scrape command output for
8
+ data it can read directly.
9
+
10
+ `get-settings`/`update-settings` read and write the Settings screen; a patch applies through the same
11
+ function its matching slash command uses, so the two paths cannot drift. `list-models` returns the
12
+ configured models grouped by provider profile, with the current profile and model. `get-agent-definitions`
13
+ returns the agent switcher's roster and current selection. `project-status`, `project-diff` and
14
+ `project-memory` back the Project panel's git status, one file's diff, and project memory; a host
15
+ without this capability answers `protocol_error` instead of hanging. `rename-session` and
16
+ `delete-session` rename or remove a stored session from the list, current or not, each with its own
17
+ success/failure reply.
18
+
19
+ The `messages` frame gained an optional `display` field — the same history projected into display
20
+ segments (text runs and finished tool calls, diffs included) — and the connection's own `driverId`, so
21
+ a reload, reconnect or resume shows tool rows and tells a co-driver's turns from its own. The `error`
22
+ frame gained optional `code`, `provider`, `retryAfterSeconds` and `model` fields so a renderer can say
23
+ what kind of failure happened (`auth`, `rate_limit`, `model_unavailable`, `network`, `provider`) instead
24
+ of showing only raw text; a session error this classification does not recognize is unchanged.
25
+
26
+ `TCommandSurfaceLocality` names whether a `'remote'`-sourced command is provably on this machine. The
27
+ WebRTC/device-mesh transport now forwards `'remote'` for it (it proves no locality, the same rule
28
+ already applied to pairing), and both the WS and WebRTC transports forward it into the Settings
29
+ read/write path, so a command that refuses a remote surface (installing a plugin) refuses identically
30
+ regardless of which transport carried it.
31
+
32
+ - Updated dependencies [9f46375]
33
+ - Updated dependencies [e8d70ac]
34
+ - Updated dependencies [9c6a8db]
35
+ - Updated dependencies [9c6a8db]
36
+ - Updated dependencies [9c6a8db]
37
+ - Updated dependencies [9c6a8db]
38
+ - @robota-sdk/agent-core@3.0.0-beta.84
39
+ - @robota-sdk/agent-interface-session@3.0.0-beta.84
40
+ - @robota-sdk/agent-interface-analytics@3.0.0-beta.84
41
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.84
42
+ - @robota-sdk/agent-interface-command@3.0.0-beta.84
43
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.84
44
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.84
45
+
46
+ ## 3.0.0-beta.83
47
+
48
+ ### Major Changes
49
+
50
+ - 7b72344: Every client can offer the session's commands and skills and show its status. The GUI uses them as a
51
+ desktop-style composer.
52
+
53
+ - `agent-interface-session` is **`major` because `IInteractiveSession` gains required members**:
54
+ `ISessionCommands.listSkills()` and a `statusRead` capability, `getStatusSnapshot()`. The snapshot
55
+ holds session, model, permission mode, effort, context and goal. An external implementation stops
56
+ compiling until it adds both.
57
+ - `agent-transport` is **`major` for the same reason on `IProtocolSession`**. It also gains the wire
58
+ messages `get-commands` → `commands` and `get-status` → `session_status`. Both are reads that the
59
+ observe role may send.
60
+ - `agent-interface-command` gains `ICommandSkillListEntry`, moved from `agent-framework`, which
61
+ re-exports it unchanged.
62
+ - `agent-ui-web` is **`major` because its state changes shape**:
63
+ - A command's outcome and a finished turn's tool calls are now conversation entries: `messages` is
64
+ `TConversationEntry[]`.
65
+ - The `uiIntentNotices` list, `dismissUiIntentNotice`, `applyUiIntentEvent`,
66
+ `removeUiIntentNotice` and `IUiIntentNotice` are removed. An intent now answers with an info
67
+ line in the conversation.
68
+ - Session notices keep only `session-error` and `protocol-error`.
69
+ - The state gains `commandCatalog` and `sessionStatus`.
70
+ - `agent-command` registers `/theme` and `/keybindings` even without a terminal. They then answer
71
+ that they belong to the robota terminal, instead of being unknown.
72
+ - `agent-framework`:
73
+ - `InteractiveSession.getStatusSnapshot()`.
74
+ - The main-thread row previews the last chat message instead of the last record's type.
75
+ - `agent-cli` serves the full GUI web app, renamed from `agent-cli-web` to `agent-gui-web`, on
76
+ `robota --serve --open`.
77
+
78
+ - 6ae3f28: A served runtime can list its workspace's sessions, start a new one and switch to another without the
79
+ process or any client connection restarting. The GUI shows them in a sessions sidebar.
80
+
81
+ - `agent-interface-session` is **`major`** for two reasons:
82
+ - It adds `ISessionListing`, `ISessionDirectory` and `ISessionSwitchedEvent`.
83
+ - `IInteractiveSessionEvents` gains a required `session_switched` event. An exhaustive map over the
84
+ event names stops compiling until it classifies the new event.
85
+ - `agent-transport` is **`major`** for the same kind of reason:
86
+ - It adds the wire messages `list-sessions` → `sessions`/`sessions_error`, `new-session`,
87
+ `switch-session`, and the broadcast `session_switched`.
88
+ - It adds a `sessionDirectory` handler option. A refusal to switch comes back as a
89
+ `protocol_error` carrying the reason.
90
+ - An exhaustive map over message types must add the new variants.
91
+ - `agent-transport-ws` passes a configured `sessionDirectory` to every connection.
92
+ - `agent-framework` is **`major` because `IRuntimeHostHandle.session` is now a `SessionSlot`**, not the
93
+ `InteractiveSession`, and `bindTransports` receives the slot.
94
+ - The slot is an `IInteractiveSession` that forwards to the current session. Members outside that
95
+ interface are read through `host.session.current`, which changes on a switch.
96
+ - Adds `InteractiveSession.whenInitialized()`.
97
+ - Exports `listUnreadableSessions`.
98
+ - `agent-ui-web` is **`major`**:
99
+ - `IWsSessionState` gains session listing state and actions.
100
+ - It adds a `SessionSidebar`.
101
+ - `/resume` opens the sidebar.
102
+ - `agent-cli`: `robota --serve` provides the session directory, and refuses a switch that would lose
103
+ work in progress. External-event grants belong to the run: a switch reopens them on the new session,
104
+ as the TUI already does.
105
+ - External-event grant history (spent tokens, rate windows, revocations) belongs to the run. The new
106
+ option `externalEventGrantHistory` (from `createExternalEventGrantHistory()`) is shared by every
107
+ session that a served runtime or the TUI builds. A session switch therefore replays no spent token
108
+ and resets no rate limit. The TUI previously had this gap when it switched sessions.
109
+
110
+ - 57f57f5: A daemon keeps several sessions live, and each client is bound to its own: one client's switch moves
111
+ only that client.
112
+
113
+ - `agent-interface-session`: `ISessionBinder`/`ISessionBinding`, the session-change refusal codes with
114
+ `isSessionChangeRefusal`, and listing rows that may say `live` and `clients`.
115
+ - `agent-framework`: `SessionPool` and `SessionChangeRefusal`.
116
+ - `agent-transport` (**major**): a new server frame, `session_change_failed`, which an exhaustive
117
+ consumer must handle. A refused `new-session` or `switch-session` now answers with it, carrying a
118
+ `code`, instead of `protocol_error`; both requests take an optional `requestId` that it echoes.
119
+ - `agent-transport-ws`: the `sessionBinder` option binds each connection to its own session and
120
+ releases the binding when the connection closes.
121
+ - `agent-cli`: `robota --serve` and the daemon keep up to four sessions live. Each WebSocket client and
122
+ attached terminal is bound to its own session; leaving a busy session is no longer refused, and only
123
+ the last driver of a session with a pending prompt is kept from leaving it. Grants and the supervised
124
+ name stay on the runtime's first session, and its reported activity covers every live session.
125
+ - `agent-ui-web`: a refused new or switch shows the host's reason as a notice (an older host's
126
+ `protocol_error` still does); the session sidebar marks live sessions and counts the other clients
127
+ on each; after a reconnect to a host that keeps sessions live, the GUI returns to the session it was on.
128
+ - `agent-ui-terminal`: an attached terminal shows why a switch was refused, and the picker's switch
129
+ stays pending until the host answers; the session picker marks live sessions and their clients.
130
+
131
+ - ba822c1: An attached client reads a workspace entry's detail, stops a waiting self-paced loop, completes
132
+ subcommands, and sees status changes another client made.
133
+
134
+ - `agent-interface-session` (major): `IInteractiveSession` gains the required roles
135
+ `ISessionExecutionDetail` and `ISessionSelfPacedLoopControl` (`TWaitingLoopStopOutcome`), and the
136
+ exhaustively mapped event map gains `status_changed`.
137
+ - `agent-transport` (major): `IProtocolSession` gains both roles; the wire unions gain
138
+ `read-execution-detail`, `stop-waiting-loop`, `execution_detail`, `execution_detail_error` and
139
+ `waiting_loop_stop`; `status_changed` is pushed as `session_status`; `isObserverMessageType` is
140
+ exported from the root and `./client`.
141
+ - `agent-interface-command` (minor): `ICommandListEntry` gains optional `argumentHint` and
142
+ `subcommands` (`ICommandSubcommandEntry`).
143
+ - `agent-cli` (minor):
144
+ - `robota session attach` and an attach from `robota session view` open the full terminal UI,
145
+ the one `robota --attach` opens, in drive mode or, with `--observe`, read-only. The reduced
146
+ attached view is gone.
147
+ - A served runtime names each of its sessions after the session's first real turn.
148
+ - `agent-framework` (minor):
149
+ - `InteractiveSession` gains `stopWaitingSelfPacedLoop(reason?)`: it stops the one waiting loop,
150
+ or stops none and names `/loop stop` when several wait. `SessionSlot` forwards it and
151
+ `readExecutionWorkspaceDetail`.
152
+ - The session emits `status_changed` when its mode, model, effort, goal or name changes, after a
153
+ command, a turn, a rename or a goal or plan transition.
154
+ - A new option `autoName: true` makes the session name itself once, after its first turn, with its
155
+ current provider; it keeps a name it already has and lets a rename made meanwhile win. Off by
156
+ default.
157
+ - The command catalog carries each command's `argumentHint` and `subcommands`.
158
+ - `agent-ui-terminal` (major):
159
+ - The full terminal UI attached to a host's session reads a workspace entry's detail, sends input
160
+ to a background task, stops a waiting self-paced loop on Esc, and completes subcommands.
161
+ - `renderAttachedApp` takes `mode: 'drive' | 'observe'` (default `'drive'`) and `announce`. In
162
+ observe mode the terminal sends only what an observer may send, refuses prompts, host commands,
163
+ abort and loop stop with a read-only notice, still runs `/exit` and its own commands, and its
164
+ status bar says it is observing. `ITuiChannelSnapshot` gains `readOnly`.
165
+ - The in-process terminal no longer names sessions; it builds its session with `autoName: true`.
166
+ `ITuiInteractionChannelOptions.onAutoNamed` is removed.
167
+
168
+ - 6e6b06b: A wire client can now render the whole session the way the in-process terminal UI does: the full
169
+ history, the context window as it changes, when the history changes, and where each turn came from.
170
+
171
+ - `agent-interface-session` is **`major`**: `ISessionConversationRead` gains a required
172
+ `getFullHistory()`. Any implementation of it, or of `IInteractiveSession`, must add it.
173
+ - `agent-transport` is **`major`**:
174
+ - It adds `get-history { fromIndex? }` → `history { startIndex, total, entries }`. The history
175
+ crosses one bounded page at a time (at most 256 KiB of entries; a single larger entry is sent
176
+ alone), from `fromIndex` (default 0), so no reply grows with the session. The client asks for
177
+ the next page after the previous one arrived. Entries are `IWireHistoryEntry`: a history entry
178
+ with an ISO 8601 `timestamp`. An observer may send it.
179
+ - `complete` and `interrupted` carry the turn's result without the session's history
180
+ (`TWireExecutionResult`); a client reads the history with `get-history`.
181
+ - It adds `get-prompts`: the host sends the permission and ask prompts still open as the
182
+ `permission_request` / `ask_request` frames that asked them, for a client that attached later.
183
+ An observer may not send it.
184
+ - `pending` gains an optional `pendingCount`: a host sends it when it knows how many prompts are
185
+ queued, and a client that gets none counts the prompt it shows. The host sends `pending` in
186
+ reply to a `submit` once it has taken the prompt, so a prompt queued behind a running turn shows
187
+ as queued.
188
+ - `command` takes an optional `requestId`, which the host echoes on the command's
189
+ `command_result` or `protocol_error`.
190
+ - The session's `context_update` is pushed as the `context` frame that `get-context` answers with.
191
+ - `compact`, `skill_activation` and `memory_event` push the new `history_changed`; the client
192
+ reads the history again.
193
+ - `turn_source` is pushed as the new `turn_source` frame.
194
+ - An exhaustive map over `TClientMessage` or `TServerMessage` types must add the new variants,
195
+ and `IProtocolSession` now requires `getFullHistory()`.
196
+ - `agent-transport-http` is **`major`** only because `IHttpTransportSession` includes the conversation
197
+ read role, so a session handed to it must now provide `getFullHistory()`.
198
+ - `agent-framework`: `SessionSlot` forwards `getFullHistory()` to the current session.
199
+ - `agent-ui-web` receives the new frames and does not render them.
200
+
201
+ ### Minor Changes
202
+
203
+ - d877de2: External events arrive over HTTP: `POST <public-url>/events/<grant-id>`, on a loopback port behind the owner's own
204
+ HTTPS proxy or tunnel.
205
+
206
+ - `agent-transport` — `./node` exports the resource-server gate every token-admitted HTTP carrier shares:
207
+ `createBearerResourceServer` (Host and Origin checked against the public URL, trusted-proxy `X-Forwarded-For`,
208
+ a failure-only throttle per address, coarse address classes), `describeProtectedResource` (RFC 9728 metadata
209
+ path and body, RFC 6750 challenges), `serveProtectedResourceMetadata`, `refuseBearerToken` and
210
+ `parsePublicHttpsUrl`.
211
+ - `agent-transport-mcp` — the remote MCP gate is composed from that shared gate; its answers are unchanged.
212
+ - `agent-cli` — each grant is its own endpoint and audience (its resource is `<public-url>/events/<grant-id>`).
213
+ An admitted event answers `202 {"turnId"}`; refusals have an empty body: 401 with the `invalid_token` or
214
+ missing-token challenge, 403 `insufficient_scope` or a revoked grant, 400 a malformed event, 404 an unknown
215
+ grant, 413 a body over 16 KiB, 429 over the grant's rate or the address's failure budget, 503 when the issuer
216
+ or the session cannot take it. `--external-event-port <port>` (required with grants) and
217
+ `--external-event-trusted-proxy <ip>` work on the TUI and on `robota session start --background`. A background
218
+ session writes an owner-only, bounded JSONL trail of refusals and settlements under its supervised directory;
219
+ the TUI reports them on one line each.
220
+
221
+ - d61e159: The session protocol gains a read-only `observe` role.
222
+
223
+ - `createSessionMessageHandler({ role: 'observe' })` follows the session's conversation, streaming,
224
+ tool, background, usage and workspace events and answers reads of this session. The default role
225
+ stays `drive`, which is unchanged.
226
+ - An observer never subscribes to `permission_request` or `ask_request`. A session with only observers
227
+ attached therefore still denies a permission and cancels a question at once instead of waiting for a
228
+ surface that may not answer. Observers still see `prompt_resolved`.
229
+ - An observer cannot submit, run commands, abort, cancel the queue, control background tasks, answer
230
+ prompts, or read personal or other sessions' usage reports. Each such message is answered with a
231
+ `protocol_error` and changes nothing. Only an explicit list of reads is accepted, so a message type
232
+ added later is refused to observers until it is classified.
233
+ - `ATTACHED_SURFACE_MAX_PENDING_BYTES` (1 MiB) is the backpressure budget a carrier passes to
234
+ `createOutboundDelivery` for a terminal attached on the same host. A reader that falls that far
235
+ behind is cut off and reported to the carrier, and other surfaces keep streaming. No carrier uses it
236
+ yet.
237
+ - `agent-cli`: a supervised session's control endpoint no longer includes its generation in a
238
+ refusal to a caller that did not present it.
239
+
240
+ ### Patch Changes
241
+
242
+ - 57280bf: Every published package now declares `"engines": { "node": ">=22.12.0" }`. Before, 27 of the 38
243
+ packages declared no floor (`agent-core`, `agent-tools` and every provider among them),
244
+ `agent-session` and `agent-file-authority` declared `>=20.19.0`, and the other nine declared
245
+ `>=22.0.0`, so a consumer on Node 20 saw at most a warning from a transitive dependency.
246
+
247
+ Why 22.12: `agent-cli` and `agent-ui-terminal` need Node 22 through `ink` 7, and the CommonJS entries
248
+ of `agent-tools` and its dependents, `agent-transport`/`node` and its dependents, and
249
+ `agent-ui-terminal` `require()` ESM-only dependencies (`p-limit`, `jose`, `chalk`), which Node 22
250
+ supports unflagged only from 22.12. `engines` is advisory unless the consumer enables `engine-strict`.
251
+
252
+ No code changes: `tsdown` now reads `node22.12.0` as its build target from the field.
253
+
254
+ - 18c0d5c: Every published package now exports `./package.json`, so `require('<package>/package.json')` and
255
+ `import('<package>/package.json', { with: { type: 'json' } })` work instead of failing with
256
+ `ERR_PACKAGE_PATH_NOT_EXPORTED`, and each tarball now ships the package's `CHANGELOG.md`.
257
+ - Updated dependencies [3c81769]
258
+ - Updated dependencies [724fabb]
259
+ - Updated dependencies [bfe8ed5]
260
+ - Updated dependencies [e689c8e]
261
+ - Updated dependencies [7b72344]
262
+ - Updated dependencies [6ae3f28]
263
+ - Updated dependencies [be0e53c]
264
+ - Updated dependencies [57f57f5]
265
+ - Updated dependencies [ba822c1]
266
+ - Updated dependencies [9721162]
267
+ - Updated dependencies [6e6b06b]
268
+ - Updated dependencies [8bd5fac]
269
+ - Updated dependencies [57280bf]
270
+ - Updated dependencies [5033dd9]
271
+ - Updated dependencies [18c0d5c]
272
+ - Updated dependencies [dbd888d]
273
+ - Updated dependencies [1887e54]
274
+ - @robota-sdk/agent-interface-analytics@3.0.0-beta.83
275
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.83
276
+ - @robota-sdk/agent-core@3.0.0-beta.83
277
+ - @robota-sdk/agent-interface-session@3.0.0-beta.83
278
+ - @robota-sdk/agent-interface-command@3.0.0-beta.83
279
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.83
280
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.83
281
+
282
+ ## 3.0.0-beta.82
283
+
284
+ ### Minor Changes
285
+
286
+ - c7f9203: Connected sessions can send each other files.
287
+
288
+ - `/peers send-file <session-id> <path>` sends a copy of any file the operator can read to another
289
+ live session on this host.
290
+ - The model sends a file only through the `peer_send_file` tool. Every call asks the user, showing
291
+ the path, size, hash and destination; no permission mode, rule or remembered consent answers it.
292
+ The tool reaches only files inside the workspace whose path does not look like it holds secrets
293
+ (`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
294
+ - The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
295
+ under `~/.robota/peer-files/<sender>/`. It is never run and never placed in the model's context.
296
+ The conversation is told only its name, size and sha256. A name that leaves that directory is
297
+ refused, a symbolic link is never written through, and nothing is overwritten.
298
+ - Transfers travel on a channel of their own (a separate connection on this host, a separate data
299
+ channel between devices), in chunks the receiver paces, up to 32 MiB, and are kept only when the
300
+ whole content matches the offered sha256. A transfer that ends early is discarded; there is no
301
+ resume.
302
+
303
+ **API**
304
+
305
+ - `agent-interface-session-mobility`: the `file` capability, which asks the operator for every
306
+ request; `ConnectionAuthority.authorizeFile`; `IFileOffer` and `IFileFrameChannel`.
307
+ - `agent-transport/node`: `sendFileOverChannel` and `receiveFileOverChannel`, the carrier over any
308
+ `IFileFrameChannel`; `DEFAULT_MAX_FILE_BYTES`.
309
+ - `agent-transport-webrtc`: `IDeviceMeshLink.openFileChannel` and `onFileChannel`.
310
+ - `agent-remote-pairing`: `file` joins `DEVICE_CAPABILITIES`. A device certificate that names it is
311
+ refused as malformed by an earlier version.
312
+ - `agent-core`: `IToolPermissionProfile.notInPeerTurn` withholds a tool from a turn a peer's message
313
+ started.
314
+ - `agent-framework`: `ICommandLocalPeersAdapter.prepareFile`.
315
+
316
+ ### Patch Changes
317
+
318
+ - Updated dependencies [c7f9203]
319
+ - Updated dependencies [004fe7f]
320
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.82
321
+ - @robota-sdk/agent-core@3.0.0-beta.82
322
+ - @robota-sdk/agent-interface-command@3.0.0-beta.82
323
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.82
324
+ - @robota-sdk/agent-interface-session@3.0.0-beta.82
325
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.82
326
+ - @robota-sdk/agent-interface-analytics@3.0.0-beta.82
327
+
328
+ ## 3.0.0-beta.81
329
+
330
+ ### Patch Changes
331
+
332
+ - Updated dependencies [3038eb7]
333
+ - Updated dependencies [02b7452]
334
+ - Updated dependencies [ec5e477]
335
+ - Updated dependencies [b2e0afe]
336
+ - Updated dependencies [007fd90]
337
+ - Updated dependencies [18b52cc]
338
+ - @robota-sdk/agent-core@3.0.0-beta.81
339
+ - @robota-sdk/agent-interface-session@3.0.0-beta.81
340
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.81
341
+ - @robota-sdk/agent-interface-command@3.0.0-beta.81
342
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.81
343
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.81
344
+ - @robota-sdk/agent-interface-analytics@3.0.0-beta.81
345
+
346
+ ## 3.0.0-beta.80
347
+
348
+ ### Major Changes
349
+
350
+ - 50d2c9f: Handoff offer refusal and inventory classification now live in session mobility. The Node transport
351
+ entry no longer exports `buildHandoffManifest`, `IBuildManifestInput`, `ISourceRuntimeState`, or
352
+ `TManifestResult`. Compose `assessHandoffReadiness` and `prepareHandoffOffer` from
353
+ `@robota-sdk/agent-interface-session-mobility` with `sealHandoffRecord` from
354
+ `@robota-sdk/agent-transport/node`; check readiness before sealing and send the returned serialized
355
+ payload unchanged. The transport README contains the migration example.
356
+ - e82215f: **ARCH-011: replace the ambiguous transport lifecycle stub with executable conformance.**
357
+
358
+ `ITransportAdapter` now requires a frozen `service | runner` lifecycle descriptor. `start()` resolves
359
+ at the concrete transport's documented readiness boundary; start before attach and repeated active
360
+ start reject a stable lifecycle error, repeated stop is safe, and stopped adapters can reattach and
361
+ restart.
362
+
363
+ Runner adapters launch separately and expose a typed terminal outcome through
364
+ `waitForCompletion()`. The registry accepts base adapters, rejects duplicate names, keeps
365
+ configuration as an optional capability, returns complete ordered records whose pending slots become
366
+ registry-owned `abandoned` outcomes on stop/rollback, and exposes a real-runner-only first-failure
367
+ wait. It serializes startup/stop, rejects active restart before mutation, and reverses partial startup
368
+ from the currently failing adapter with typed safe rollback details. Runtime host and serve mode
369
+ propagate real nonzero runner results without treating normal shutdown abandonment as failure.
370
+
371
+ HTTP, MCP, both WebSocket adapters, WebRTC, and headless invoke one shared public conformance kit.
372
+ The former `TuiTransport` export is removed because it ignored the attached session; use `renderApp`
373
+ or `TuiInteractionChannel`, which honestly own their session lifecycle.
374
+
375
+ - 64ba748: **BREAKING — ARCH-042: project filesystem access is now an explicit, host-issued authority instead of an ambient consequence of `cwd`.**
376
+
377
+ `@robota-sdk/agent-framework` adds `WorkspaceTrustService` and the opaque
378
+ `IWorkspaceProjectAuthority`, plus bounded reader, settings-writer, state-storage, and mutation
379
+ facets. Public session, settings, context, checkpoint, memory, contribution, query, and replay
380
+ contracts consume those facets. A caller that does not supply `projectAccess` is deliberately
381
+ restricted to user-owned host state and receives no project filesystem capability.
382
+
383
+ The framework removes or renames ambient Node/project exports. Migrate `checkSettingsFile` to
384
+ `checkNodeHostSettingsFile`, `readMergedProviderSettingsFromPaths` to
385
+ `readMergedProviderSettingsFromSources`, `resolveProviderSettingsWriteTargetPath` to
386
+ `resolveProviderSettingsWriteTarget`, `FileSystemMemoryStore` / `createFileSystemMemoryStore` to
387
+ `WorkspaceMemoryStore` / `createWorkspaceMemoryStore`, and `PluginSettingsStore` to
388
+ `NodeHostPluginSettingsStore`. Host-only git helpers now carry the `FromNodeHost` suffix.
389
+ `projectPaths`, `resolveSettingsPathForScope`, and `getProviderSettingsPaths` are removed; project
390
+ consumers must use the authority facets rather than recover absolute paths.
391
+
392
+ `@robota-sdk/agent-session` renames the Node filesystem implementation `SessionStore` to
393
+ `NodeSessionStore` and adds explicit session-log/external-payload source and sink ports. Session
394
+ replay no longer resolves external payload files from an ambient directory.
395
+
396
+ `@robota-sdk/agent-interface-transport` changes `ISkillExecutionPort.loadCommands(cwd, home?)` to
397
+ the authority-bound `loadCommands()` and removes the optional absolute-path leak
398
+ `IInteractiveSessionStore.getFilePath`. `@robota-sdk/agent-command` consequently replaces the
399
+ `cwd` option of `createSkillsCommandModule` with required `contributionSources`; default command
400
+ composition accepts explicit contribution sources and discovers no project skills when none are
401
+ provided.
402
+
403
+ `@robota-sdk/agent-cli`, `@robota-sdk/agent-transport`, and
404
+ `@robota-sdk/agent-transport-tui` thread the trusted-or-restricted project decision through every
405
+ session surface. Embedded callers that need project settings, state, context, skills, checkpoints,
406
+ or mutation must mint access through `WorkspaceTrustService` and pass the returned
407
+ `projectAccess` (and a separately approved mutation/settings facet where required). Omitting it is
408
+ still type-compatible but is behaviorally breaking: the surface now fails closed instead of
409
+ reading or writing the current directory.
410
+
411
+ ### Minor Changes
412
+
413
+ - a5961c9: Access-token verification for a remote resource server.
414
+
415
+ `agent-interface-transport` gains the contract: `IAccessTokenVerifier`, its configuration
416
+ `IAccessTokenVerifierConfig`, and the verdict `TAccessTokenAdmission` — admitted, or refused with one
417
+ `TAccessTokenRefusal` reason. A verdict never carries the token or a claim value.
418
+
419
+ `agent-transport/node` gains `createAccessTokenVerifier`, built on `jose` (now a direct, pinned
420
+ dependency). A token is admitted only when it is an `at+jwt` access token within a length bound,
421
+ issued by exactly the configured issuer, signed with a configured RS256, ES256 or EdDSA key whose
422
+ type, curve, `alg` and `use` agree with it, within `exp`/`nbf` with 60 s of skew, addressed to the
423
+ configured resource, carrying the required scopes, and from an allowlisted subject or client. The
424
+ host is single-tenant, so a configuration without an allowlist is refused at construction.
425
+
426
+ Keys are discovered through the issuer's metadata (RFC 8414, then OpenID discovery, with an issuer
427
+ equality check) and fetched over `https` through agent-core's egress boundary, byte-bounded, with
428
+ private-address reach granted to the issuer's host only. The key set is cached and refetched, at a
429
+ bounded rate, for an unknown `kid` or once it reaches a maximum age, so a key the issuer withdraws
430
+ stops admitting; keys are trusted only up to a bounded age, and beyond that an outage refuses.
431
+
432
+ Nothing is wired to a listener yet.
433
+
434
+ - 4c5148e: ARCH-005 Stage S2 — `robota` is now expressed as an `IProductProfile` and assembled by `assembleProduct`;
435
+ the hand-wired composition root in `agent-cli` is gone.
436
+
437
+ - **`@robota-sdk/agent-product`** — provider construction returns IN-KERNEL. `assembleProduct` builds the
438
+ provider from `providerDefinitions` + the shell's already-resolved `providerSettings` via agent-core's
439
+ pure `createProviderFromConfig`; `provider` is now an OPTIONAL injected override. Both are optional, so a
440
+ Mode A profile can carry only `providerDefinitions`. The fold stays pure and IO-free — every
441
+ settings/env/file read still happens in the shell. Adds `IAssembledProduct.buildRuntimeOptions`, the pure
442
+ overlay `buildRuntime` delegates through, and `IAssembledProduct.providerDefinitions`.
443
+ **Breaking for pre-release consumers:** `IProductProfile.providerDefinitions` is now required and
444
+ `IProductProfile.provider` / `IAssembledProduct.provider` are now optional.
445
+ - **`@robota-sdk/agent-framework`** — a scoped, additive session seam: `agentDefinitions` on
446
+ `TInteractiveSessionOptions` / `ICreateSessionOptions`, composed into the built-in agent tier ahead of
447
+ `BUILT_IN_AGENTS`, so capability-pack subagents actually reach the runtime. Precedence: discovered
448
+ project/user definitions > injected > built-in. `AgentDefinitionLoader` now dedupes within that tier
449
+ (first wins). Absent ⇒ unchanged behavior.
450
+ - **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
451
+ `agentDefinitions` through the headless and TUI channels so every robota surface carries the seam.
452
+ - **`@robota-sdk/agent-cli`** — `robota`'s identity (branding, provider surface, presets,
453
+ `packs: [codingPack]`, base command modules, injected transports/runners/subagent factory) is declared as
454
+ data in a product profile and folded by `assembleProduct`. The coding command modules (`/shell`,
455
+ `/editor`) now come from `pack-coding` rather than the base set, so the pack is load-bearing. What remains
456
+ in the CLI is product-shell only: arg parsing, settings/file IO, terminal notices, first-run/init/
457
+ `--configure`, memory + session-resume UX, and print/serve/TUI mode dispatch.
458
+
459
+ End-user `robota` behavior is unchanged in substance — the assembled command-module set, provider surface,
460
+ tool set, subagent roster, and preset resolution all match the pre-change assembly — with one accepted
461
+ cosmetic delta: `/shell` and `/editor` now appear at the END of `/help` output and of the slash-command
462
+ autocomplete popup rather than mid-list, because they arrive from `pack-coding` and both surfaces render in
463
+ module-insertion order. Same commands, same behavior, different position.
464
+
465
+ - 0116a29: ARCH-006 completion — robota's capability packs now OWN its tool surface, and `pack-coding` is built by a
466
+ context-bound factory.
467
+
468
+ - **`@robota-sdk/pack-coding` (BREAKING)** — the module-level `codingPack` constant is **removed** and
469
+ replaced by `createCodingPack({ cwd, sandboxClient })`, with `cwd` **required**. This is a safety change,
470
+ not a style one: `agent-tools` disarms its working-directory path guard when `cwd` is `undefined`, so a
471
+ pack whose file tools are built with no options contributes an **unsandboxed** `Read`/`Write`/`Edit`.
472
+ That was inert while `agent-framework` always supplied its own context-bound default tier, but ARCH-006
473
+ lets a product hand the whole tool surface to its packs (`defaultTools: []`) — and a context-free pack in
474
+ that position is a real hole. Keeping a zero-option export beside that seam would be a loaded gun, so it
475
+ is gone rather than deprecated. Each call returns fresh instances bound to the supplied context, so two
476
+ products in one process get independently-scoped file tools. Migration: replace `codingPack` with
477
+ `createCodingPack({ cwd: process.cwd() })`.
478
+ - **`@robota-sdk/agent-cli`** — `robota`'s packs are built from the shell's resolved `cwd`
479
+ (`createRobotaPacks({ cwd })`) before command setup, and the runtime seam passes
480
+ `ROBOTA_PACKS_OWN_TOOL_SURFACE` (an empty `defaultTools`) so the framework's `createDefaultTools()` tier
481
+ is REPLACED. Every tool robota runs now arrives from a capability pack: dropping a pack drops its tools,
482
+ exactly as it already dropped its command modules and subagents.
483
+ - **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
484
+ `additionalTools` and `defaultTools` through the headless and TUI channels, mirroring the existing
485
+ `agentDefinitions` pass-through, so print, serve and TUI carry an identical tool surface.
486
+
487
+ End-user `robota` behavior is unchanged, including the security property: the real binary still answers a
488
+ read outside the working directory with `Access denied: "…" is outside the working directory`.
489
+
490
+ - 9db63ee: Add named session capability roles and explicit capability-host queries while preserving the legacy
491
+ `IInteractiveSession` interface shape. HTTP, MCP, protocol, WS, WebRTC, and headless transports now
492
+ declare only the session roles they consume, and the direct aggregate-cast floor is zero.
493
+ - 1e3f91a: CMD-004 Phase 2 Stage E (breaking, beta line): the legacy `TCommandEffect` union and
494
+ `ICommandResult.effects` are DELETED. Commands emit the split contract directly —
495
+ `hostActions` (session-executed via `ICommandHostAdapters`; works headless and remote) and
496
+ `uiIntents` (requester-routed `ui_intent` session events with UI-neutral `show-*` names).
497
+ Final carriers for the former notification effects: `session_renamed` and the new
498
+ `history_cleared` are BROADCAST session events (forwarded to every WS surface, folded by the
499
+ TUI transcript/title and the GUI reducer's new `sessionName`/transcript-reset state);
500
+ `session-execution-started` rides `result.data.sessionExecution`; the plugin-registry refresh
501
+ rides `result.data.pluginRegistryReloaded`. A mechanical grep floor
502
+ (`command-effect-grep-floor.test.ts`) keeps `tui-requested`/`TCommandEffect`/`effects:` out of
503
+ every `packages/*/src` production tree.
504
+
505
+ ### Patch Changes
506
+
507
+ - 2ebff01: Emit the complete persisted checkpoint and branch lifecycle, forward plan, context-refresh, and
508
+ branch events through protocol transports, and render deterministic bounded notices in the TUI.
509
+ Transport-owned delivery failures now enter the owning carrier cleanup lifecycle without reversing
510
+ an already-committed session operation.
511
+ - 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 `.robota/` 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.
512
+ - 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).
513
+ - Updated dependencies [9c19c50]
514
+ - Updated dependencies [7b6234c]
515
+ - Updated dependencies [5307f8a]
516
+ - Updated dependencies [b462ee7]
517
+ - Updated dependencies [37b4bd7]
518
+ - Updated dependencies [4eea54b]
519
+ - Updated dependencies [50d2c9f]
520
+ - Updated dependencies [1698be4]
521
+ - Updated dependencies [a5961c9]
522
+ - Updated dependencies [d4189b9]
523
+ - Updated dependencies [9edae52]
524
+ - Updated dependencies [4078a72]
525
+ - Updated dependencies [4c73a0b]
526
+ - Updated dependencies [af2f2ad]
527
+ - Updated dependencies [196a900]
528
+ - Updated dependencies [f336838]
529
+ - Updated dependencies [34e50f0]
530
+ - Updated dependencies [722e88a]
531
+ - Updated dependencies [d23c848]
532
+ - Updated dependencies [4dd45cc]
533
+ - Updated dependencies [fec722f]
534
+ - Updated dependencies [e82215f]
535
+ - Updated dependencies [52b7346]
536
+ - Updated dependencies [9db63ee]
537
+ - Updated dependencies [b078afa]
538
+ - Updated dependencies [2ebff01]
539
+ - Updated dependencies [9db63ee]
540
+ - Updated dependencies [2ebff01]
541
+ - Updated dependencies [2d3b2c0]
542
+ - Updated dependencies [4772067]
543
+ - Updated dependencies [0f98419]
544
+ - Updated dependencies [64ba748]
545
+ - Updated dependencies [9fbab1b]
546
+ - Updated dependencies [d312755]
547
+ - Updated dependencies [a009f5b]
548
+ - Updated dependencies [1e3f91a]
549
+ - Updated dependencies [4f3c075]
550
+ - Updated dependencies [475e085]
551
+ - Updated dependencies [e477440]
552
+ - Updated dependencies [9dcb5da]
553
+ - Updated dependencies [a95ca85]
554
+ - Updated dependencies [b6d14ce]
555
+ - Updated dependencies [0382a51]
556
+ - Updated dependencies [93d061d]
557
+ - Updated dependencies [39554a1]
558
+ - Updated dependencies [d28430a]
559
+ - Updated dependencies [1e40b5b]
560
+ - Updated dependencies [7669851]
561
+ - Updated dependencies [4b76cfa]
562
+ - Updated dependencies [07b627f]
563
+ - Updated dependencies [d0de5b2]
564
+ - Updated dependencies [9665c6e]
565
+ - Updated dependencies [44393be]
566
+ - Updated dependencies [c7fa299]
567
+ - Updated dependencies [5134b3b]
568
+ - Updated dependencies [d6b9404]
569
+ - Updated dependencies [5c5ff23]
570
+ - Updated dependencies [9814afc]
571
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.80
572
+ - @robota-sdk/agent-interface-command@3.0.0-beta.80
573
+ - @robota-sdk/agent-core@3.0.0-beta.80
574
+ - @robota-sdk/agent-interface-session@3.0.0-beta.80
575
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.80
576
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.80
577
+ - @robota-sdk/agent-interface-analytics@3.0.0-beta.80
578
+
579
+ ## 3.0.0-beta.79
580
+
581
+ ### Patch Changes
582
+
583
+ - @robota-sdk/agent-core@3.0.0-beta.79
584
+ - @robota-sdk/agent-framework@3.0.0-beta.79
585
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.79
586
+
587
+ ## 3.0.0-beta.78
588
+
589
+ ### Patch Changes
590
+
591
+ - Updated dependencies [6f308d1]
592
+ - @robota-sdk/agent-core@3.0.0-beta.78
593
+ - @robota-sdk/agent-framework@3.0.0-beta.78
594
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.78
595
+
596
+ ## 3.0.0-beta.77
597
+
598
+ ### Patch Changes
599
+
600
+ - Updated dependencies
601
+ - @robota-sdk/agent-core@3.0.0-beta.77
602
+ - @robota-sdk/agent-framework@3.0.0-beta.77
603
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.77
604
+
605
+ ## 3.0.0-beta.76
606
+
607
+ ### Minor Changes
608
+
609
+ - 9df3a88: Split the consolidated `@robota-sdk/agent-transport` package into per-concern transport packages (DQ-AUDIT-005) so unrelated heavy dependencies (React/Ink, ws, Hono, MCP SDK) no longer share one publishable unit and are not dragged into non-TUI consumers' graphs:
610
+
611
+ - `@robota-sdk/agent-transport` — lean core: headless adapter + `TransportRegistry` + scripted-provider testing fixtures (no external runtime deps).
612
+ - `@robota-sdk/agent-transport-tui` — React + Ink terminal UI.
613
+ - `@robota-sdk/agent-transport-ws` — WebSocket transport + protocol (`agent-web-ui` now depends only on this for WS types).
614
+ - `@robota-sdk/agent-transport-http` — Hono HTTP transport.
615
+ - `@robota-sdk/agent-transport-mcp` — MCP server transport.
616
+
617
+ The default transport-registry wiring (pre-registering `WsTransport`) moves to the CLI composition root, removing the core→ws edge.
618
+
619
+ ### Patch Changes
620
+
621
+ - DQ-AUDIT-002 — consolidate duplicated domain data onto single owners: one model-pricing SSOT in agent-core (`MODEL_PRICES`/`lookupModelPrice`/`calculateModelCost`/`estimateBlendedCostPer1000`) consumed by agent-command and agent-plugin (drops two embedded/stale price tables); the `len/4` token estimator replaced by core `CONTEXT_ESTIMATE_CHARS_PER_TOKEN`; TUI `TContextState` derived from core `IContextWindowState`; dead pass-through re-exports removed from agent-session.
622
+ - c0a6287: Relocate session feature logic out of the CLI shell and the transport (DQ-AUDIT-004):
623
+
624
+ - Extract session-log timing analysis into the new `@robota-sdk/agent-session-analytics` package (pure analysis over canonical session records — no duplicate types, no file I/O). `agent-cli`'s `session analyze` command shrinks to thin wiring and loads records via the new `createUserSessionStore()` / existing `createProjectSessionStore()` framework facades.
625
+ - Move LLM-based session auto-naming (`generateSessionName`) from `agent-transport/tui` into `agent-framework` (session-lifecycle owner); the TUI transport now invokes it through the framework.
626
+
627
+ - Updated dependencies
628
+ - Updated dependencies [c0a6287]
629
+ - Updated dependencies [9df3a88]
630
+ - Updated dependencies
631
+ - Updated dependencies
632
+ - Updated dependencies [576af62]
633
+ - @robota-sdk/agent-core@3.0.0-beta.76
634
+ - @robota-sdk/agent-framework@3.0.0-beta.76
635
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.76
636
+
637
+ ## 3.0.0-beta.75
638
+
639
+ ### Patch Changes
640
+
641
+ - Agent preset system + live preset switching + context/history correctness fixes.
642
+
643
+ - **Preset system (PRESET-001~017):** new `@robota-sdk/agent-preset` package layering framework
644
+ assembly options into named, selectable profiles (`default`, `autonomous-builder`, `careful-reviewer`,
645
+ `neutral-executor`) plus user-authored external presets loaded from `~/.robota/presets/*.json`.
646
+ - **Live preset switching:** `/preset` command (list + active marker + switch) and a TUI active-preset
647
+ display. Switching live re-applies permission posture, model/effort, persona, command-module
648
+ selection, parallel-subagents gating, and a self-verification system-prompt section via the single
649
+ `applyPresetToSession` engine.
650
+ - **CTX-001:** the TUI Context display + session auto-compact now use the accurate provider-based token
651
+ estimate (system prompt + tool schemas included) instead of a crude history-only char heuristic.
652
+ - **HIST-001:** conversation history is now append-only — removed the silent 100-message count cap that
653
+ could drop early context; context size is managed solely by size-based compaction.
654
+
655
+ - Updated dependencies
656
+ - @robota-sdk/agent-framework@3.0.0-beta.75
657
+ - @robota-sdk/agent-core@3.0.0-beta.75
658
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.75
659
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.75
660
+
661
+ ## 3.0.0-beta.74
662
+
663
+ ### Patch Changes
664
+
665
+ - Updated dependencies
666
+ - @robota-sdk/agent-framework@3.0.0-beta.74
667
+ - @robota-sdk/agent-core@3.0.0-beta.74
668
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.74
669
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.74
670
+
671
+ ## 3.0.0-beta.73
672
+
673
+ ### Patch Changes
674
+
675
+ - d4fd33f: TUI input area UX: remove side borders and status bar box (SCREEN-001), move status bar below input area (SCREEN-002), fix top border corner characters.
676
+ - @robota-sdk/agent-core@3.0.0-beta.73
677
+ - @robota-sdk/agent-framework@3.0.0-beta.73
678
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.73
679
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.73
680
+
681
+ ## 3.0.0-beta.72
682
+
683
+ ### Patch Changes
684
+
685
+ - Revert Korean IME blank line to normal flow so it persists after session switch (AppInner remount).
686
+ - Updated dependencies
687
+ - @robota-sdk/agent-framework@3.0.0-beta.72
688
+ - @robota-sdk/agent-core@3.0.0-beta.72
689
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.72
690
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.72
691
+
692
+ ## 3.0.0-beta.71
693
+
694
+ ### Patch Changes
695
+
696
+ - fix(context): unify token estimation to single SSOT — status bar and /context list now use the same serialized JSON estimate
697
+ - Updated dependencies
698
+ - @robota-sdk/agent-core@3.0.0-beta.71
699
+ - @robota-sdk/agent-framework@3.0.0-beta.71
700
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.71
701
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.71
702
+
703
+ ## 3.0.0-beta.70
704
+
705
+ ### Patch Changes
706
+
707
+ - CLI UX fixes: /context list full LLM context breakdown (CLI-B10), logo resize fix (CLI-B03), token estimates in context list (CLI-B04)
708
+ - Updated dependencies
709
+ - @robota-sdk/agent-framework@3.0.0-beta.70
710
+ - @robota-sdk/agent-core@3.0.0-beta.70
711
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.70
712
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.70
713
+
714
+ ## 3.0.0-beta.69
715
+
716
+ ### Patch Changes
717
+
718
+ - Updated dependencies
719
+ - @robota-sdk/agent-framework@3.0.0-beta.69
720
+ - @robota-sdk/agent-core@3.0.0-beta.69
721
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.69
722
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.69
723
+
724
+ ## 3.0.0-beta.68
725
+
726
+ ### Patch Changes
727
+
728
+ - Wrap Korean IME spacer in Box position=absolute to reduce terminal cursor offset by 1 row, moving the IME candidate window closer to the input area.
729
+ - @robota-sdk/agent-core@3.0.0-beta.68
730
+ - @robota-sdk/agent-framework@3.0.0-beta.68
731
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.68
732
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.68
733
+
734
+ ## 3.0.0-beta.67
735
+
736
+ ### Patch Changes
737
+
738
+ - Updated dependencies
739
+ - @robota-sdk/agent-framework@3.0.0-beta.67
740
+ - @robota-sdk/agent-interface-tui@3.0.0-beta.67
741
+ - @robota-sdk/agent-core@3.0.0-beta.67
742
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.67
743
+
744
+ ## 3.0.0-beta.66
745
+
746
+ ### Patch Changes
747
+
748
+ - refactor: CLI-001/002 — agent-cli layer separation and monorepo-wide readability lint rules
749
+ - CLI-001: Extract startup phases into focused modules; enforce agent-cli layer separation
750
+ - CLI-002: Apply import/order, consistent-type-imports, explicit-function-return-type, prefer-const, object-shorthand across all packages
751
+ - Fix stale child-process-subagent-worker entry in agent-cli tsdown.config.ts (build fix)
752
+
753
+ - Updated dependencies
754
+ - @robota-sdk/agent-framework@3.0.0-beta.66
755
+ - @robota-sdk/agent-core@3.0.0-beta.66
756
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.66
757
+
758
+ ## 3.0.0-beta.65
759
+
760
+ ### Minor Changes
761
+
762
+ - feat(CMD-003): TUI command interaction — picker/confirm overlay on missing args
763
+ - Add `command-interaction.ts` with `ITuiPickerInteraction`, `ITuiConfirmInteraction`, `TAnyTuiCommandInteraction` types
764
+ - Add `CommandPicker` and `CommandConfirm` Ink overlay components
765
+ - Extend `TCommandSelectionResult` with `open-interaction` variant in input-area-flow
766
+ - `resolveEnterCommandSelection` opens interaction overlay when command has `onMissingArgs` and no args typed
767
+ - `InputArea` accepts `resolveInteraction` prop; renders picker/confirm overlay when active
768
+ - Add `resolveInteraction` to `IRenderOptions` / `App` / `render`
769
+ - Add `TUI_COMMAND_INTERACTIONS` registry in `agent-cli` with mode/language/provider/exit/clear interactions
770
+ - Fix `SlashAutocomplete` to show technical command name (`cmd.name`) instead of `displayName`
771
+
772
+ ### Patch Changes
773
+
774
+ - @robota-sdk/agent-core@3.0.0-beta.65
775
+ - @robota-sdk/agent-framework@3.0.0-beta.65
776
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.65
777
+
778
+ ## 3.0.0-beta.64
779
+
780
+ ### Minor Changes
781
+
782
+ - feat: add displayName and requiresPermission to command interfaces
783
+ - `ICommand`, `ISystemCommand`, `ICommandListEntry`: add optional `displayName` field for user-friendly labels
784
+ - `ISystemCommand`: add optional `requiresPermission` field for per-command permission policy declaration
785
+ - `SystemCommandExecutor`: add `resolveRequiresPermission()` — derives from `safety` when field is undefined
786
+ - All 24 built-in commands declare explicit `displayName` and `requiresPermission`
787
+ - TUI autocomplete renders `displayName ?? name`; Tab completion still inserts the technical command ID
788
+ - `/help` output shows `Display Name (/command-id)` format
789
+
790
+ ### Patch Changes
791
+
792
+ - Updated dependencies
793
+ - @robota-sdk/agent-framework@3.0.0-beta.64
794
+ - @robota-sdk/agent-core@3.0.0-beta.64
795
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.64