@robota-sdk/agent-subagent-runner 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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,658 @@
1
+ # @robota-sdk/agent-subagent-runner
2
+
3
+ ## 3.0.0-beta.84
4
+
5
+ ### Patch Changes
6
+
7
+ - 9c6a8db: A background agent's tool call that needs approval now reaches a person instead of being refused
8
+ automatically. The child process asks the parent session's own approver, identified as a background
9
+ agent naming its task, and parks the call until an answer arrives; cancelling the task dismisses any
10
+ still-parked ask immediately rather than leaving it outstanding. A parent with no approver attached
11
+ (print mode, a truly headless run) still fails every such call closed, the same default as before.
12
+
13
+ An agent task's result and its background-task-workspace entry now report how many of its tool calls
14
+ were refused and why (denied by a person, no approver attached, the approver itself failed, or the
15
+ task ended before an attached approver answered) — present only when at least one call was refused, so
16
+ a task that finished as it always did carries no new field.
17
+
18
+ A workspace entry for a `/loop`-managed iteration now carries a stable `loopId`, so a surface can stop
19
+ the loop itself rather than only cancelling its disposable wake timer, and a snapshot can include a
20
+ self-paced loop summary for an iteration that has no background-task entry of its own yet.
21
+
22
+ - Updated dependencies [9f46375]
23
+ - Updated dependencies [e8d70ac]
24
+ - Updated dependencies [9c6a8db]
25
+ - Updated dependencies [9c6a8db]
26
+ - @robota-sdk/agent-core@3.0.0-beta.84
27
+ - @robota-sdk/agent-framework@3.0.0-beta.84
28
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.84
29
+ - @robota-sdk/agent-executor@3.0.0-beta.84
30
+ - @robota-sdk/agent-process@3.0.0-beta.84
31
+
32
+ ## 3.0.0-beta.83
33
+
34
+ ### Minor Changes
35
+
36
+ - e8779c9: A subagent consults the sandbox its shell tools run under, as its parent does. With
37
+ `autoAllowBashIfSandboxed` on, a confined command the subagent's gate leaves to the mode now runs
38
+ without a prompt. Before, a `context: fork` skill asked for approval, and a print run refused it.
39
+ An Agent-tool subagent in `auto` mode sent a command allowed by a broad rule like `Bash(npm *)` to
40
+ its classifier instead. A background policy's ceiling is still checked first: nothing outside it
41
+ runs.
42
+
43
+ - `agent-framework` (minor): `createSubagentSession` takes a `commandSandbox` option. The fork and the
44
+ in-process runner derive it from the parent's sandbox, the instance their inherited tools run
45
+ under. `sandboxApprovalFor` is exported.
46
+ - `agent-subagent-runner` (minor): `ISubagentWorkerComposition` takes an optional `createSandbox`. The
47
+ worker builds that sandbox once and hands the same instance to `createTools` and to the session.
48
+ - `agent-cli` (patch): robota's worker composition builds the OS sandbox through `createSandbox`, so
49
+ a child-process subagent approves what its parent approves.
50
+
51
+ - 122e82b: A child-process subagent confines and approves commands with its parent's sandbox settings as they
52
+ stand when it starts. Before, it read its root's settings files, so a `/sandbox` change made in the
53
+ session did not reach it. `/sandbox` changes the live sandbox and only the user settings file, which
54
+ project settings outrank. A worktree child also missed the parent's untracked local settings.
55
+
56
+ - `agent-subagent-runner` (minor): the runner factory takes `parentSandboxSettings`, read at each
57
+ spawn. The start payload carries it, the IPC guard checks it is a record, and the worker hands it to
58
+ `createSandbox` as `parentSettings`.
59
+ - `agent-cli` (patch): robota sends its live sandbox's settings, and a child builds its sandbox from
60
+ them. It refuses settings it cannot read rather than falling back to the files.
61
+
62
+ - 0368058: A running child-process subagent follows a `/sandbox` change made in its parent session. Before, it
63
+ kept the settings it started with until it ended, so a long-running `auto`-mode subagent went on
64
+ auto-approving confined commands after the user turned auto-allow off.
65
+
66
+ - `agent-tools` (minor): `OsSandboxClient.watchSettings(watcher)` reports each `configure`, until
67
+ its returned function is called.
68
+ - `agent-subagent-runner` (minor): the runner factory takes `watchParentSandboxSettings`, and
69
+ forwards each change to every running child as a `sandbox_settings` message. It watches before
70
+ reading the start payload, so no change is lost while a child starts, and stops when the child
71
+ exits or fails to start. A composed sandbox may define `applyParentSettings`. The worker applies
72
+ each change through it. On settings it cannot take, it aborts the run, lets a running command
73
+ finish, and ends the run with that error.
74
+ - `agent-cli` (patch): robota watches its live sandbox, and a child applies each change to the
75
+ instance its tools and approval read.
76
+
77
+ ### Patch Changes
78
+
79
+ - 57280bf: Every published package now declares `"engines": { "node": ">=22.12.0" }`. Before, 27 of the 38
80
+ packages declared no floor (`agent-core`, `agent-tools` and every provider among them),
81
+ `agent-session` and `agent-file-authority` declared `>=20.19.0`, and the other nine declared
82
+ `>=22.0.0`, so a consumer on Node 20 saw at most a warning from a transitive dependency.
83
+
84
+ Why 22.12: `agent-cli` and `agent-ui-terminal` need Node 22 through `ink` 7, and the CommonJS entries
85
+ of `agent-tools` and its dependents, `agent-transport`/`node` and its dependents, and
86
+ `agent-ui-terminal` `require()` ESM-only dependencies (`p-limit`, `jose`, `chalk`), which Node 22
87
+ supports unflagged only from 22.12. `engines` is advisory unless the consumer enables `engine-strict`.
88
+
89
+ No code changes: `tsdown` now reads `node22.12.0` as its build target from the field.
90
+
91
+ - 18c0d5c: Every published package now exports `./package.json`, so `require('<package>/package.json')` and
92
+ `import('<package>/package.json', { with: { type: 'json' } })` work instead of failing with
93
+ `ERR_PACKAGE_PATH_NOT_EXPORTED`, and each tarball now ships the package's `CHANGELOG.md`.
94
+ - Updated dependencies [3c81769]
95
+ - Updated dependencies [724fabb]
96
+ - Updated dependencies [997f2fb]
97
+ - Updated dependencies [bfe8ed5]
98
+ - Updated dependencies [e689c8e]
99
+ - Updated dependencies [4241fc5]
100
+ - Updated dependencies [4f49d14]
101
+ - Updated dependencies [7b72344]
102
+ - Updated dependencies [6ae3f28]
103
+ - Updated dependencies [9721162]
104
+ - Updated dependencies [be0e53c]
105
+ - Updated dependencies [57f57f5]
106
+ - Updated dependencies [ba822c1]
107
+ - Updated dependencies [9721162]
108
+ - Updated dependencies [6e6b06b]
109
+ - Updated dependencies [7d77ce4]
110
+ - Updated dependencies [8bd5fac]
111
+ - Updated dependencies [57280bf]
112
+ - Updated dependencies [5033dd9]
113
+ - Updated dependencies [18c0d5c]
114
+ - Updated dependencies [dbd888d]
115
+ - Updated dependencies [1887e54]
116
+ - Updated dependencies [caaab20]
117
+ - Updated dependencies [f01868f]
118
+ - Updated dependencies [e8779c9]
119
+ - Updated dependencies [5a0ee96]
120
+ - @robota-sdk/agent-framework@3.0.0-beta.83
121
+ - @robota-sdk/agent-core@3.0.0-beta.83
122
+ - @robota-sdk/agent-executor@3.0.0-beta.83
123
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.83
124
+ - @robota-sdk/agent-process@3.0.0-beta.83
125
+
126
+ ## 3.0.0-beta.82
127
+
128
+ ### Patch Changes
129
+
130
+ - Updated dependencies [c7f9203]
131
+ - @robota-sdk/agent-core@3.0.0-beta.82
132
+ - @robota-sdk/agent-framework@3.0.0-beta.82
133
+ - @robota-sdk/agent-executor@3.0.0-beta.82
134
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.82
135
+ - @robota-sdk/agent-process@3.0.0-beta.82
136
+
137
+ ## 3.0.0-beta.81
138
+
139
+ ### Patch Changes
140
+
141
+ - Updated dependencies [3038eb7]
142
+ - Updated dependencies [02b7452]
143
+ - Updated dependencies [ec5e477]
144
+ - Updated dependencies [007fd90]
145
+ - Updated dependencies [18b52cc]
146
+ - Updated dependencies [9843fe6]
147
+ - @robota-sdk/agent-core@3.0.0-beta.81
148
+ - @robota-sdk/agent-framework@3.0.0-beta.81
149
+ - @robota-sdk/agent-executor@3.0.0-beta.81
150
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.81
151
+ - @robota-sdk/agent-process@3.0.0-beta.81
152
+
153
+ ## 3.0.0-beta.80
154
+
155
+ ### Major Changes
156
+
157
+ - 807d161: **BREAKING — ARCH-010: the execution root is a required contract field, and the containment guard now fails closed.**
158
+
159
+ The file-tool containment guard was fail-open: with no root configured it answered "allowed". A tool
160
+ built with no `cwd` therefore had no boundary — measured, a `Read` constructed that way returned the
161
+ contents of `/etc/hostname` — and the child-process subagent worker called `createDefaultTools()` with
162
+ no argument at all, so subagents got exactly that. Three independent auditors found three different
163
+ symptoms of this one missing field.
164
+
165
+ **Removed — seven context-free tool singletons.** `readTool`, `writeTool`, `editTool`, `globTool`,
166
+ `grepTool`, `shellTool`, `bashTool` are gone from `@robota-sdk/agent-tools`. A module-level instance is
167
+ bound at import time and can carry no containment root, so after the guard was inverted they could only
168
+ refuse everything.
169
+
170
+ Migrate to the factory of the same name, passing the directory the tool is allowed to work in:
171
+
172
+ ```ts
173
+ // before
174
+ import { readTool, globTool } from '@robota-sdk/agent-tools';
175
+ const tools = [readTool, globTool];
176
+
177
+ // after
178
+ import { createReadTool, createGlobTool } from '@robota-sdk/agent-tools';
179
+ const cwd = process.cwd(); // or the workspace this agent is scoped to
180
+ const tools = [createReadTool({ cwd }), createGlobTool({ cwd })];
181
+ ```
182
+
183
+ `webFetchTool`, `webSearchTool` and `askUserQuestionTool` are unchanged — they touch no filesystem, so
184
+ there is no root to contain them by.
185
+
186
+ **`cwd` is now REQUIRED** on `ISandboxToolOptions`, `IContainedBuiltinToolOptions` (and everything
187
+ extending them), `ICreateDefaultToolsOptions`, `ISessionOptions` and `ISubagentOptions`. The `= {}`
188
+ default parameter was removed from every builtin factory — that default was the mechanism by which
189
+ "forgot the root" was legal. `new Session({...})` without `cwd` no longer compiles, and also throws at
190
+ construction, because a required field is only required to a TypeScript caller.
191
+
192
+ **`Session` no longer reads `process.cwd()`.** It uses the root it was given, and `getCwd()` exposes it
193
+ so a fork or subagent asks the session instead of re-deriving a root that can disagree with it.
194
+
195
+ **Behavioural change even for callers that already passed a root**: a tool that somehow reaches the
196
+ guard with no root now REFUSES with an explicit error ("no containment root is configured … this is an
197
+ assembly bug, not a path problem") instead of allowing the access.
198
+
199
+ - 0c07176: **BREAKING — ARCH-021: child-process subagents compose the PRODUCT's surface, not imported defaults.**
200
+
201
+ The child-process worker built its surface from `createDefaultProviderDefinitions()` and `createDefaultTools()` — a fixed six-vendor registry and the framework's default tool tier — while the composition root had already handed the runner the fully composed surface and the runner dropped it. So a product's custom providers and pack-contributed tools reached an **in-process** subagent and not a **child-process** one, and ARCH-006's landed invariant "every tool robota runs comes from a pack" was **false in the child**: dropping a pack did not drop its tools.
202
+
203
+ This is the second finding at that line. ARCH-010 — judged BLOCKER, a subagent `Read` returning `/etc/hostname` — patched one argument there and left the reconstruction standing.
204
+
205
+ ```ts
206
+ // the port: what the product composes, stated by the composition root
207
+ export interface ISubagentWorkerComposition {
208
+ createTools(context: { readonly cwd: string }): IToolWithEventService[];
209
+ readonly providerDefinitions: readonly IProviderDefinition[];
210
+ }
211
+
212
+ export function runSubagentWorkerMain(composition: ISubagentWorkerComposition): void;
213
+ ```
214
+
215
+ **Why a recipe and not a broker.** A composition cannot be projected across a process boundary because it is _code_: `createProvider` is a function and a tool carries `execute`. The two sound answers are to proxy the instances or to stop expressing the contract as instances. Proxying loses on containment — a proxied tool executes in the **parent**, bound to the parent's checkout, while a worktree-isolated child's execution root is a different directory — and a prior-art sweep found **no specification that defines a per-call working root for a proxied tool invocation** (MCP roots are session-scoped and pull-based). So the recipe crosses and the child builds an equivalent surface at its own root, which is what every comparable product does.
216
+
217
+ **Per package, classified against each barrel:**
218
+
219
+ - **`agent-subagent-runner` (major)** — `runSubagentWorkerMain` gains a **required** parameter; `ISubagentWorkerComposition` is added to the barrel; `ISubagentWorkerReadyMessage` gains `composedToolNames?`; and the `@robota-sdk/agent-provider-defaults` **dependency edge is removed**.
220
+ - **`agent-cli` (patch)** — composition-root wiring plus one new internal `product/` module; no barrel change.
221
+
222
+ **The structural guarantee reaches one axis, and the document says so.** Deleting the manifest edge makes the **provider** axis a compile error, because that package solely owns `createDefaultProviderDefinitions`. The **tool** axis cannot be cut the same way: `createDefaultTools` is barrel-exported by `agent-framework`, which this package must keep for `createSubagentSession`. That axis is held by a new `harness:scan` check instead — and it is the axis with the failure history, so claiming compile-time enforcement across both would have been an overclaim exactly where it matters. The cause (no defaults-aggregator leaf for the tool surface) is tracked as ARCH-035.
223
+
224
+ **Fail closed on what a recipe cannot reproduce.** A recipe carries anything that is a pure function of (execution root, serialized payload, ambient durable state) — not a live, unrepeatable handle. Today that is `sandboxClient`, and it is reachable with public code (`E2BSandboxClient` and `InMemorySandboxClient` are both on `agent-tools`' barrel). The composition root now **refuses** to select the child-process runner in that case, naming the capability, rather than yielding a sandboxed parent with a host-tool child. Projection is tracked as ARCH-033.
225
+
226
+ **Verified per run, not by construction.** The child declares its composed tool names in `ready`, so the built binary can be asked what it actually composed. Measured on the real artifact: `["Shell","Bash","Read","Write","Edit","Glob","Grep","WebFetch","WebSearch","AskUserQuestion"]` — `pack-coding`'s surface, from the product's own packs.
227
+
228
+ **Also filed rather than folded in:** ARCH-034 (in-process and child-process subagents get different tool surfaces), ARCH-036 (`deps.builtInAgents` is dropped by the child-process path), SEC-009 (`apiKey` rides in the IPC start payload; comparable products use the child's environment).
229
+
230
+ - 4772067: **BREAKING — ARCH-031: the subagent seam is derived from its transport SSOT instead of copied.**
231
+
232
+ One field family — what a subagent job IS — was declared three times as independent shapes and carried
233
+ between them by six hand-written object literals that nothing checked for totality. A field added to
234
+ either side had to be hand-copied at every hop, and a miss compiled clean as a silent no-op. TYPE-003
235
+ named this cause and derived one hop; the next two changes each dropped a field at a hop it had skipped
236
+ (CORE-025's permission policy, and ANALYTICS-001's `usage`, dropped in the very commit that added it).
237
+
238
+ ```ts
239
+ // now, in @robota-sdk/agent-interface-transport
240
+ export type ISubagentSpawnRequest = Omit<IAgentBackgroundTaskRequest, 'kind'>;
241
+ export type ISubagentJobResult = Omit<IBackgroundTaskResult, 'kind' | 'exitCode' | 'signalCode'>;
242
+ ```
243
+
244
+ All four projections collapse to spreads. `parentTaskId` and `providerProfile` now reach the runner
245
+ because they exist on the source, not because someone remembered them.
246
+
247
+ **Per package, classified against each barrel:**
248
+
249
+ - **`agent-executor` (major)** — the barrel loses `ISubagentSpawnRequest` and `ISubagentJobResult` (they
250
+ moved to their owner; re-publishing them here would be a pass-through re-export). `ISubagentJobStart`
251
+ and `ISubagentJobHandle` rename `jobId` → `taskId`, `ISubagentJobStart` gains `worktree?`, and
252
+ `ISubagentWorktreePrepareRequest` renames `jobId` → `taskId`.
253
+ - **`agent-framework` (major)** — the barrel loses eleven type-only re-exports of `agent-executor`-owned
254
+ types. They carried zero runtime values, so they bought none of the assembly convenience a runtime
255
+ facade exists for, while making one field family look like it had three owners. Separately,
256
+ `ISpawnAgentTaskRequest.permissionPolicy` goes optional → **required**.
257
+ - **`agent-subagent-runner` (major)** — `ISubagentWorkerStartPayload` renames `jobId` → `taskId` and gains
258
+ `worktree?`. This package is not in the item's declared `area:`; the audit that caught it is the reason
259
+ it is here.
260
+ - **`agent-interface-transport` (minor)** — two new barrel exports; nothing removed or renamed.
261
+ - **`agent-core` (minor)** — **two** new barrel exports. `DEFAULT_BACKGROUND_PERMISSION_POLICY` is the
262
+ intended one; collapsing the hand-listed permissions block to `export *` also surfaced
263
+ `clearRegisteredToolArgumentKeys`, which the old list had omitted. It is documented as public rather
264
+ than re-narrowed — a barrel that cannot fall out of step with its owner is the point of the collapse.
265
+ Nothing was removed: all nine previously-listed permission types remain on the barrel.
266
+ - **`agent-cli` (patch)** — migrated as the only in-repo implementer of `ISubagentWorktreeAdapter`; no
267
+ barrel change.
268
+
269
+ **`permissionPolicy` is now required at the spawn boundary**, and its default is one exported constant
270
+ owned by the permission SSOT. It was previously applied as `?? 'inherit-allowlist'` in the middle of a
271
+ projection, in **two** packages independently, with nothing keeping them equal — a security-relevant value
272
+ whose default was declared twice. Every spawn site now states its own policy.
273
+
274
+ **The worktree identity moved to the runner envelope.** It is runner-produced — the worktree does not
275
+ exist when a caller builds a request — so it rides on `ISubagentJobStart.worktree` and crosses the IPC
276
+ boundary there. The runner no longer also rewrites `request.cwd`, which had given ARCH-010's execution-root
277
+ rule two carriers that could disagree. `branchName` **relocated rather than being deleted**: it has no
278
+ reader in this repository today, and for a library that is not a reason to drop a legitimate contract.
279
+
280
+ **Renames are consistent across the SPI** (`type` → `agentType`, `jobId` → `taskId`) rather than applied to
281
+ one shape, which would have left two names for one identifier in a single file. The IPC validator's
282
+ string-literal keys are now typed against the contract, so the next rename is a compile error instead of a
283
+ runtime rejection of every start payload.
284
+
285
+ - 6fab98f: **BREAKING — DIST-006: the built `robota` binary could not spawn a subagent at all.**
286
+
287
+ `/agent run` failed on every distributed build with `Subagent worker exited before result: exit code 1`. The child's real stderr was `Cannot find module '…/agent-cli/dist/node/child-process-subagent-worker.js'`. `getDefaultSubagentWorkerPath()` resolved the worker relative to its own `import.meta.url`; INFRA-028 bundles every workspace package into `agent-cli/dist/node/bin.js`, so at runtime that directory is **agent-cli's** dist, where the worker was never emitted. It worked from source, which is why nothing caught it.
288
+
289
+ **Second occurrence of one cause.** `agent-subagent-runner/tsdown.config.ts` already carried a comment naming this exact failure: _"Without this entry the file never existed, so the child-process subagent silently failed from any dist build."_ That fix put the worker next to its OWN package's bundle; bundling then moved the resolver's notion of "next to me" one package along.
290
+
291
+ **The defect was the function, not the missing file.** `getDefaultSubagentWorkerPath()` answered _"where is my worker file on disk?"_ from a library that cannot know — the answer is a property of the packaging step. Emitting the file where the resolver looks would have fixed **one of three shipped artifacts**: the npm bundle, but not the Bun single-file binaries published on every tag, nor the Electron desktop sidecar that embeds them. A compiled single-file executable has no sibling directory to emit into.
292
+
293
+ ```ts
294
+ // removed — a question no library can answer
295
+ export function getDefaultSubagentWorkerPath(): string;
296
+
297
+ // now: the composition root states how to start a copy of ITSELF
298
+ export interface ISubagentWorkerEntry {
299
+ readonly execPath: string;
300
+ readonly args: readonly string[];
301
+ readonly execArgv?: readonly string[];
302
+ }
303
+ ```
304
+
305
+ `IChildProcessSubagentRunnerOptions.workerPath` → **`workerEntry`**, and the runner `spawn`s `execPath args… --__robota-subagent-worker` instead of forking a module path. `robota`'s own entry enters worker mode through the new `runSubagentWorkerMain()`, so **there is no second artifact and no path to get wrong**. The one seam satisfies all three shapes: a bundled Node build names the file it is executing, a `tsx` source run names the same and adds `--import tsx`, and a compiled binary names _nothing_ — `process.execPath` is the binary, and re-executing it re-enters its embedded entry.
306
+
307
+ **Per package, classified against each barrel:**
308
+
309
+ - **`agent-subagent-runner` (major)** — the barrel loses `getDefaultSubagentWorkerPath` (deleted, not renamed) and gains `SUBAGENT_WORKER_MODE_FLAG`, `isSubagentWorkerModeArgv`, `runSubagentWorkerMain`, `ISubagentWorkerEntry`. `IChildProcessSubagentRunnerOptions` renames `workerPath` → `workerEntry` and drops `execArgv` — it now has exactly one owner, on the entry descriptor. The separate `child-process-subagent-worker` bundle entry is gone.
310
+ - **`agent-cli` (patch)** — composition-root wiring only; no barrel change.
311
+
312
+ **Two things this also repairs, both found in review:**
313
+
314
+ - **The child's stderr was discarded** (`stdio: [..., 'ignore', 'ipc']`), so a worker that died before its first IPC message reported only an exit code. That is why occurrence #2 had to be diagnosed by hand. It is now captured, bounded, and appended to the error, making the next occurrence self-reporting.
315
+ - **A source run executed the BUILT worker, not the source worker**, because package `exports` resolve to `dist`. `resolveExecArgv`'s `--import tsx` branch was therefore dead code. Self-fork names the entry actually running, so source runs finally run source.
316
+
317
+ **Verified against the artifacts, not from source:** the built `dist/node/bin.js` and a real `bun --compile` single-file binary each complete the worker IPC handshake (`{type:'ready'}`), each refuse a hand-typed flag with no IPC channel (exit 2, "Silence is not success" — measured on both), and the shipped bundle no longer contains the string `child-process-subagent-worker.js` — there is nothing left to look for.
318
+
319
+ ### Minor Changes
320
+
321
+ - 9c19c50: `/fork [name] [--same-dir]` copies the live conversation into a background session.
322
+
323
+ The session writes a copy of its own record under a fresh id — messages, system prompt, tool schemas
324
+ and full history, and deliberately not the sandbox snapshot, goal, plan or branch — then spawns a
325
+ background job carrying only `resumeSessionId`. The child restores that record itself, so no
326
+ conversation crosses the child-process boundary and the worker start payload's key set is unchanged.
327
+ The background panel gains an `attach` control that switches the terminal onto the forked session; it
328
+ is a view switch, never a merge, and a missing record or a terminal task is refused with the task's
329
+ own status.
330
+
331
+ **`@robota-sdk/agent-framework` is `major` for one reason: `ICommandHostSessionAccess` gains a
332
+ required member.** `forkSession({ name? })` is not optional, so an external implementation of that
333
+ role port stops compiling until it adds the method. Every other change in this set is additive:
334
+
335
+ - `agent-interface-execution` — `TExecutionControl` gains `'attach'`.
336
+ - `agent-interface-command` — `TCommandUiIntent` gains `{ type: 'switch-session'; sessionId }`.
337
+ - `agent-subagent-runner` — `ISubagentWorkerComposition` gains the optional `openSessionStore`, and
338
+ the worker resumes a record when the job names one. A composition that registers no store and
339
+ receives no `resumeSessionId` behaves exactly as before.
340
+ - `agent-framework` also gains the fork-record builder, `SessionTurnMemory`, and
341
+ `IAgentBackgroundTaskRequest.resumeSessionId?`; `loadSessionRecord` now returns
342
+ `restoredSystemPrompt`, which makes a record field that was written and never read take effect on
343
+ restore.
344
+ - `agent-executor`, `agent-command`, `agent-transport-tui`, `agent-cli` — the spawn input, the
345
+ `/fork` module and the attach control that carry it to the surface.
346
+
347
+ - 1698be4: A child-process subagent can no longer send the parent's provider credential to a different
348
+ endpoint.
349
+
350
+ - **Before spawning a child**, the parent compares every environment variable that decides where
351
+ the provider connects or which credential it sends. If the child's environment differs, the job
352
+ is refused before the credential leaves the parent. The error names the variable, never its
353
+ value. The variables compared are:
354
+ - the proxy and TLS variables;
355
+ - the variables the provider's SDK reads, such as `OPENAI_BASE_URL`, `ANTHROPIC_AUTH_TOKEN` and
356
+ the Vertex settings;
357
+ - the credential's own variable.
358
+ - **The child** repeats the check before it builds its provider. It builds that provider from the
359
+ parent's effective connection exactly: it no longer fills in a base URL, options or a default
360
+ credential from its own registry, and a credential reference that resolves to nothing is refused.
361
+ - **Where the effective connection comes from:** the parent applies its own definition defaults
362
+ (base URL, options). `profileName` is sent only when it names the connection actually sent.
363
+ - **New contracts:**
364
+ - `IProviderDefinition.destinationEnvironment`, declared by every built-in provider.
365
+ - `createProviderFromExactProfile`, `connectionEnvironmentNames`,
366
+ `findConnectionEnvironmentDivergence`, `sealConnectionEnvironment`,
367
+ `verifyConnectionEnvironment` and `TRANSPORT_ENVIRONMENT`.
368
+ - The start payload's `connectionCheck`.
369
+ - The child-process runner's `providerDefinitions` option, now required: a provider with no
370
+ definition there is refused, because its connection cannot be checked.
371
+
372
+ - 7937c19: Split the `@robota-sdk/agent-provider` monolith into SDK-aligned leaf packages (ARCH-PROVIDER-002 Stage A). The single package that hard-bundled all three vendor SDKs (`@anthropic-ai/sdk`, `openai`, `@google/genai`) is **removed** and replaced by per-vendor leaves, each depending only on `@robota-sdk/agent-core` + its one SDK: `@robota-sdk/agent-provider-anthropic`, `@robota-sdk/agent-provider-openai`, `@robota-sdk/agent-provider-openai-compatible` (DeepSeek/Qwen/Gemma over the shared OpenAI-compatible base), `@robota-sdk/agent-provider-gemini` (+ a `./google` entry), and `@robota-sdk/agent-provider-bytedance` (media/video `IVideoGenerationProvider`). The aggregated `createDefaultProviderDefinitions()` now lives in the new `@robota-sdk/agent-builtin-providers` leaf.
373
+
374
+ Migration: replace `@robota-sdk/agent-provider/<vendor>` imports with the corresponding `@robota-sdk/agent-provider-<vendor>` package (`/deepseek`, `/qwen`, `/gemma` → `@robota-sdk/agent-provider-openai-compatible`; `/google` → `@robota-sdk/agent-provider-gemini/google`), and import `createDefaultProviderDefinitions` from `@robota-sdk/agent-builtin-providers`. Consumers now pull only the vendor SDK(s) they actually use.
375
+
376
+ - c6c56a6: Move the concrete `GitWorktreeIsolationAdapter` (git CLI + filesystem I/O) out of the reusable
377
+ `@robota-sdk/agent-executor` runtime-primitives package into the `@robota-sdk/agent-cli` composition
378
+ root, restoring the executor's "creates no Git worktrees" boundary (ARL-02 / ARCH-FIX-024, INFRA-031).
379
+
380
+ **Breaking (`@robota-sdk/agent-subagent-runner`):** `worktreeAdapter` is now a **required** option on
381
+ `createChildProcessSubagentRunnerFactory` / `IChildProcessSubagentRunnerOptions`. The concrete git
382
+ default (`createGitWorktreeIsolationAdapter()`) has been removed — inject the adapter at the composition
383
+ root. `@robota-sdk/agent-executor` no longer exports `GitWorktreeIsolationAdapter`,
384
+ `createGitWorktreeIsolationAdapter`, or `IGitWorktreeIsolationAdapterOptions` (the
385
+ `ISubagentWorktreeAdapter` port and `WorktreeSubagentRunner` remain). CLI runtime behavior is unchanged.
386
+
387
+ ### Patch Changes
388
+
389
+ - f336838: One permission evaluation order for every caller. The interactive session, background tasks and
390
+ subagents used to run two different resolvers, so the same call could be decided differently
391
+ depending on who made it. They now share `evaluatePermission`, and a background policy only adds a
392
+ ceiling, an ask-everything flag and the task's own lists to it:
393
+
394
+ deny → caller ceiling → unevaluable deny (ask) → never-auto-approve set (ask) → ask-everything →
395
+ bypassPermissions → allow → mode.
396
+
397
+ - **`ask` rules.** `permissions.ask` patterns always ask, in every mode including
398
+ `bypassPermissions`. They are matched per command like a deny rule, and are validated at
399
+ construction alongside `allow` and `deny`.
400
+ - **Never auto-approved, bypass included:** removing a critical path with `rm`/`rmdir` (the root, a
401
+ top-level directory, home, the working directory or a parent), and a modify-class write into
402
+ `.git`, `.robota`, `.claude`, `.agents`, `.mcp.json`, `.gitconfig`, `.npmrc` or a shell rc file.
403
+ Files inside an isolated worktree (`.robota/worktrees/<name>/…`) are ordinary files. With no
404
+ approver attached, an ask is a denial.
405
+ - **A ceiling is checked before bypass and before any ask.** A subagent's `inherit-allowlist` ceiling
406
+ is now the parent's _effective_ rules, read live at spawn: settings, preset lists and command
407
+ auto-allows. It used to be the raw settings file. An unevaluable deny under a policy now asks,
408
+ like everywhere else, where it used to deny outright; with no approver it is still a denial.
409
+ - **Settings layers union `permissions.allow`**, as they already did `deny`. A checked-in project
410
+ file no longer silently discards the user's allow list.
411
+ - **Print mode, `createQuery()` and headless sessions default to `default` mode**, not
412
+ `bypassPermissions`. They have no approver, so a call that would ask is denied. Pass
413
+ `--permission-mode` / `permissionMode: 'bypassPermissions'` explicitly for unattended runs.
414
+
415
+ **Breaking:**
416
+ - `@robota-sdk/agent-core` removes `resolvePermissionByPolicy` and `TPermissionPolicyDecision` in
417
+ favour of `projectPermissionPolicy` plus `evaluatePermission`'s new `context` argument.
418
+ - `@robota-sdk/agent-framework` changes the settings merge rule for `permissions.allow`, and the
419
+ default permission mode of `createQuery()` and headless sessions.
420
+
421
+ - 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).
422
+ - Updated dependencies [9c19c50]
423
+ - Updated dependencies [7b6234c]
424
+ - Updated dependencies [5307f8a]
425
+ - Updated dependencies [b462ee7]
426
+ - Updated dependencies [08a9bd6]
427
+ - Updated dependencies [818f0c8]
428
+ - Updated dependencies [4eea54b]
429
+ - Updated dependencies [30e5e50]
430
+ - Updated dependencies [bb4696a]
431
+ - Updated dependencies [1698be4]
432
+ - Updated dependencies [9368d00]
433
+ - Updated dependencies [d4189b9]
434
+ - Updated dependencies [9edae52]
435
+ - Updated dependencies [4078a72]
436
+ - Updated dependencies [4c73a0b]
437
+ - Updated dependencies [af2f2ad]
438
+ - Updated dependencies [267af5f]
439
+ - Updated dependencies [196a900]
440
+ - Updated dependencies [f336838]
441
+ - Updated dependencies [34e50f0]
442
+ - Updated dependencies [722e88a]
443
+ - Updated dependencies [a5cc36e]
444
+ - Updated dependencies [d23c848]
445
+ - Updated dependencies [b70fa3d]
446
+ - Updated dependencies [2711ec6]
447
+ - Updated dependencies [4dd45cc]
448
+ - Updated dependencies [4c5148e]
449
+ - Updated dependencies [37af5dc]
450
+ - Updated dependencies [807d161]
451
+ - Updated dependencies [fec722f]
452
+ - Updated dependencies [e82215f]
453
+ - Updated dependencies [52b7346]
454
+ - Updated dependencies [2ebff01]
455
+ - Updated dependencies [2ebff01]
456
+ - Updated dependencies [2d3b2c0]
457
+ - Updated dependencies [b078afa]
458
+ - Updated dependencies [2d3b2c0]
459
+ - Updated dependencies [baa6863]
460
+ - Updated dependencies [2d3b2c0]
461
+ - Updated dependencies [3a8876b]
462
+ - Updated dependencies [4772067]
463
+ - Updated dependencies [7b85767]
464
+ - Updated dependencies [0f98419]
465
+ - Updated dependencies [64ba748]
466
+ - Updated dependencies [9fbab1b]
467
+ - Updated dependencies [d312755]
468
+ - Updated dependencies [a009f5b]
469
+ - Updated dependencies [1e3f91a]
470
+ - Updated dependencies [4f3c075]
471
+ - Updated dependencies [475e085]
472
+ - Updated dependencies [e477440]
473
+ - Updated dependencies [9dcb5da]
474
+ - Updated dependencies [a95ca85]
475
+ - Updated dependencies [b6d14ce]
476
+ - Updated dependencies [0382a51]
477
+ - Updated dependencies [93d061d]
478
+ - Updated dependencies [39554a1]
479
+ - Updated dependencies [d28430a]
480
+ - Updated dependencies [bed26ea]
481
+ - Updated dependencies [fe48835]
482
+ - Updated dependencies [1e40b5b]
483
+ - Updated dependencies [c6c56a6]
484
+ - Updated dependencies [4b76cfa]
485
+ - Updated dependencies [d9bd9ec]
486
+ - Updated dependencies [8865acf]
487
+ - Updated dependencies [90e7a10]
488
+ - Updated dependencies [fcb0da3]
489
+ - Updated dependencies [07b627f]
490
+ - Updated dependencies [d0de5b2]
491
+ - Updated dependencies [9665c6e]
492
+ - Updated dependencies [44393be]
493
+ - Updated dependencies [c7fa299]
494
+ - Updated dependencies [5134b3b]
495
+ - Updated dependencies [dd444c1]
496
+ - Updated dependencies [1f57e7f]
497
+ - Updated dependencies [833afe1]
498
+ - Updated dependencies [d6b9404]
499
+ - Updated dependencies [7863b16]
500
+ - Updated dependencies [fde558e]
501
+ - Updated dependencies [db5c439]
502
+ - Updated dependencies [4a01a87]
503
+ - Updated dependencies [cbee54e]
504
+ - Updated dependencies [9814afc]
505
+ - Updated dependencies [242a644]
506
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.80
507
+ - @robota-sdk/agent-framework@3.0.0-beta.80
508
+ - @robota-sdk/agent-executor@3.0.0-beta.80
509
+ - @robota-sdk/agent-core@3.0.0-beta.80
510
+ - @robota-sdk/agent-process@3.0.0-beta.80
511
+
512
+ ## 3.0.0-beta.79
513
+
514
+ ### Patch Changes
515
+
516
+ - @robota-sdk/agent-core@3.0.0-beta.79
517
+ - @robota-sdk/agent-executor@3.0.0-beta.79
518
+ - @robota-sdk/agent-framework@3.0.0-beta.79
519
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.79
520
+ - @robota-sdk/agent-provider@3.0.0-beta.79
521
+
522
+ ## 3.0.0-beta.78
523
+
524
+ ### Patch Changes
525
+
526
+ - Updated dependencies [6f308d1]
527
+ - @robota-sdk/agent-core@3.0.0-beta.78
528
+ - @robota-sdk/agent-provider@3.0.0-beta.78
529
+ - @robota-sdk/agent-executor@3.0.0-beta.78
530
+ - @robota-sdk/agent-framework@3.0.0-beta.78
531
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.78
532
+
533
+ ## 3.0.0-beta.77
534
+
535
+ ### Patch Changes
536
+
537
+ - Updated dependencies
538
+ - @robota-sdk/agent-core@3.0.0-beta.77
539
+ - @robota-sdk/agent-process@3.0.0-beta.77
540
+ - @robota-sdk/agent-executor@3.0.0-beta.77
541
+ - @robota-sdk/agent-framework@3.0.0-beta.77
542
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.77
543
+ - @robota-sdk/agent-provider@3.0.0-beta.77
544
+
545
+ ## 3.0.0-beta.76
546
+
547
+ ### Patch Changes
548
+
549
+ - Updated dependencies
550
+ - Updated dependencies [c0a6287]
551
+ - Updated dependencies [9df3a88]
552
+ - Updated dependencies
553
+ - Updated dependencies
554
+ - Updated dependencies [576af62]
555
+ - @robota-sdk/agent-core@3.0.0-beta.76
556
+ - @robota-sdk/agent-framework@3.0.0-beta.76
557
+ - @robota-sdk/agent-provider@3.0.0-beta.76
558
+ - @robota-sdk/agent-executor@3.0.0-beta.76
559
+
560
+ ## 3.0.0-beta.75
561
+
562
+ ### Patch Changes
563
+
564
+ - Updated dependencies
565
+ - @robota-sdk/agent-framework@3.0.0-beta.75
566
+ - @robota-sdk/agent-core@3.0.0-beta.75
567
+ - @robota-sdk/agent-executor@3.0.0-beta.75
568
+ - @robota-sdk/agent-provider@3.0.0-beta.75
569
+
570
+ ## 3.0.0-beta.74
571
+
572
+ ### Patch Changes
573
+
574
+ - Updated dependencies
575
+ - @robota-sdk/agent-framework@3.0.0-beta.74
576
+ - @robota-sdk/agent-core@3.0.0-beta.74
577
+ - @robota-sdk/agent-executor@3.0.0-beta.74
578
+ - @robota-sdk/agent-provider@3.0.0-beta.74
579
+
580
+ ## 3.0.0-beta.73
581
+
582
+ ### Patch Changes
583
+
584
+ - @robota-sdk/agent-core@3.0.0-beta.73
585
+ - @robota-sdk/agent-executor@3.0.0-beta.73
586
+ - @robota-sdk/agent-framework@3.0.0-beta.73
587
+ - @robota-sdk/agent-provider@3.0.0-beta.73
588
+
589
+ ## 3.0.0-beta.72
590
+
591
+ ### Patch Changes
592
+
593
+ - Updated dependencies
594
+ - @robota-sdk/agent-framework@3.0.0-beta.72
595
+ - @robota-sdk/agent-core@3.0.0-beta.72
596
+ - @robota-sdk/agent-executor@3.0.0-beta.72
597
+ - @robota-sdk/agent-provider@3.0.0-beta.72
598
+
599
+ ## 3.0.0-beta.71
600
+
601
+ ### Patch Changes
602
+
603
+ - fix(context): unify token estimation to single SSOT — status bar and /context list now use the same serialized JSON estimate
604
+ - Updated dependencies
605
+ - @robota-sdk/agent-core@3.0.0-beta.71
606
+ - @robota-sdk/agent-executor@3.0.0-beta.71
607
+ - @robota-sdk/agent-framework@3.0.0-beta.71
608
+ - @robota-sdk/agent-provider@3.0.0-beta.71
609
+
610
+ ## 3.0.0-beta.70
611
+
612
+ ### Patch Changes
613
+
614
+ - Updated dependencies
615
+ - @robota-sdk/agent-framework@3.0.0-beta.70
616
+ - @robota-sdk/agent-core@3.0.0-beta.70
617
+ - @robota-sdk/agent-executor@3.0.0-beta.70
618
+ - @robota-sdk/agent-provider@3.0.0-beta.70
619
+
620
+ ## 3.0.0-beta.69
621
+
622
+ ### Patch Changes
623
+
624
+ - Updated dependencies
625
+ - @robota-sdk/agent-framework@3.0.0-beta.69
626
+ - @robota-sdk/agent-core@3.0.0-beta.69
627
+ - @robota-sdk/agent-executor@3.0.0-beta.69
628
+ - @robota-sdk/agent-provider@3.0.0-beta.69
629
+
630
+ ## 3.0.0-beta.68
631
+
632
+ ### Patch Changes
633
+
634
+ - @robota-sdk/agent-core@3.0.0-beta.68
635
+ - @robota-sdk/agent-executor@3.0.0-beta.68
636
+ - @robota-sdk/agent-framework@3.0.0-beta.68
637
+ - @robota-sdk/agent-provider@3.0.0-beta.68
638
+
639
+ ## 3.0.0-beta.67
640
+
641
+ ### Patch Changes
642
+
643
+ - CLIR: agent-cli layer separation, agent-framework interactive session improvements, subagent runner fix, TUI interface README
644
+ - Updated dependencies
645
+ - @robota-sdk/agent-framework@3.0.0-beta.67
646
+ - @robota-sdk/agent-core@3.0.0-beta.67
647
+ - @robota-sdk/agent-executor@3.0.0-beta.67
648
+ - @robota-sdk/agent-provider@3.0.0-beta.67
649
+
650
+ ## 3.0.0-beta.66
651
+
652
+ ### Patch Changes
653
+
654
+ - Updated dependencies
655
+ - @robota-sdk/agent-framework@3.0.0-beta.66
656
+ - @robota-sdk/agent-core@3.0.0-beta.66
657
+ - @robota-sdk/agent-executor@3.0.0-beta.66
658
+ - @robota-sdk/agent-provider@3.0.0-beta.66