@robota-sdk/agent-framework 3.0.0-beta.86 → 3.0.0-beta.87

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 CHANGED
@@ -1,5 +1,66 @@
1
1
  # @robota-sdk/agent-framework
2
2
 
3
+ ## 3.0.0-beta.87
4
+
5
+ ### Minor Changes
6
+
7
+ - 7d9cc66: Keep host-declared inline human controls reachable during active turns. Plugin disable and uninstall can withdraw future dispatch without changing model invocation or host command policy.
8
+ - 7d9cc66: Expose declarative contribution descriptors for installed bundles and resolved MCP sources,
9
+ including source generations, host capability requirements and compatibility diagnostics.
10
+ Revalidate MCP approval, source identity and workspace trust before new dispatch, preserving
11
+ outcomes of calls already started and refusing retained tools after shutdown.
12
+ - 7d9cc66: Preserve an explicitly supplied host tool scheduling policy through session assembly and CLI presentation modes, retaining permission admission and conservative handling of undeclared resources.
13
+
14
+ ### Patch Changes
15
+
16
+ - Release the migrated Robota product with its public SDK namespace, robota command, compatible SDK exports, internal product configuration, and verified CLI startup and delivery corrections.
17
+ - 7d9cc66: Load declared JSON and inline bundle MCP configurations with selected-source containment, ordered whole-server replacement and file provenance. Route packaged servers through normal CLI/app MCP startup with namespaced identities, existing trust/approval/authority gates, disable overlays and value-free compatibility diagnostics.
18
+ - 7d9cc66: Load external name-only plugin manifests without inventing optional metadata. Select the recorded
19
+ installed source instead of the lexically last cached directory, refusing invalid, missing or
20
+ ambiguous revisions. Check the installed identity as well as the manifest name for disablement.
21
+ - 7d9cc66: Add user-only project memory topic correction and forgetting, prevent automatic restoration after restart, refresh retained startup context, and reconcile semantic recall with current durable source content.
22
+ - 7d9cc66: Allow consumer eval metrics to require a perfect outcome independently of aggregate scores, and reject interrupted runs as successful evaluations.
23
+ - 7d9cc66: Add explicit MCP Skills selection, bounded supervisor access and persistent host content consent.
24
+ Users can inspect verified instructions, approve the exact content fingerprint and withdraw consent;
25
+ models can discover metadata only. Consent stays separate from server admission and model-turn activation.
26
+ - 7d9cc66: Route discovered MCP Skills through the shared skill command runtime with lazy verified content, source-bound invocation names, current user consent and execution-owned activation cleanup. Keep remote shell expressions inert and defer queued user skill reads until their own turn executes.
27
+ - 7d9cc66: Restore actual interactive tool observations, identities and outcomes from persisted event history.
28
+ Show denied calls as failed in live and restored GUI conversation views.
29
+ - 7d9cc66: Retain registered tool source attribution in observations and preserve ordered outcome receipts independently of conversation summaries.
30
+ - 7d9cc66: Expose verified skill supporting resources only within their owning turn or fork, using the current host consent and manifest.
31
+ - 7d9cc66: Retain mixed tool observations alongside structured results through live session events and history
32
+ display. The shared app renderer previews inline raster images and keeps resource URIs inert, with
33
+ explicit diagnostics for unsupported media instead of silently dropping it.
34
+ - 7d9cc66: Observe scheduler queue intervals separately from pre-dispatch admission, permission and tool work.
35
+ Preserve valid duration totals when live trace detail is bounded, reporting invalid evidence explicitly
36
+ through content-free console and OTLP traces without altering dispatch, recovery or settlement.
37
+ - Updated dependencies
38
+ - Updated dependencies [66af868]
39
+ - Updated dependencies [7d9cc66]
40
+ - Updated dependencies [7d9cc66]
41
+ - Updated dependencies [7d9cc66]
42
+ - Updated dependencies [7d9cc66]
43
+ - Updated dependencies [7d9cc66]
44
+ - Updated dependencies [7d9cc66]
45
+ - Updated dependencies [7d9cc66]
46
+ - Updated dependencies [7d9cc66]
47
+ - Updated dependencies [7d9cc66]
48
+ - Updated dependencies [7d9cc66]
49
+ - Updated dependencies [7d9cc66]
50
+ - @robota-sdk/agent-core@3.0.0-beta.87
51
+ - @robota-sdk/agent-executor@3.0.0-beta.87
52
+ - @robota-sdk/agent-file-authority@3.0.0-beta.87
53
+ - @robota-sdk/agent-interface-analytics@3.0.0-beta.87
54
+ - @robota-sdk/agent-interface-command@3.0.0-beta.87
55
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.87
56
+ - @robota-sdk/agent-interface-session@3.0.0-beta.87
57
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.87
58
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.87
59
+ - @robota-sdk/agent-roundtable@3.0.0-beta.87
60
+ - @robota-sdk/agent-session@3.0.0-beta.87
61
+ - @robota-sdk/agent-tool-defaults@3.0.0-beta.87
62
+ - @robota-sdk/agent-tools@3.0.0-beta.87
63
+
3
64
  ## 3.0.0-beta.86
4
65
 
5
66
  ### Patch Changes
@@ -275,7 +336,7 @@
275
336
  - Session notices keep only `session-error` and `protocol-error`.
276
337
  - The state gains `commandCatalog` and `sessionStatus`.
277
338
  - `agent-command` registers `/theme` and `/keybindings` even without a terminal. They then answer
278
- that they belong to the robota terminal, instead of being unknown.
339
+ that they belong to the Robota terminal, instead of being unknown.
279
340
  - `agent-framework`:
280
341
  - `InteractiveSession.getStatusSnapshot()`.
281
342
  - The main-thread row previews the last chat message instead of the last record's type.
@@ -286,7 +347,7 @@
286
347
 
287
348
  - **`agent-framework`:** `supportsWorkspaceProjectMutation(platform?)` tells a host in advance whether project writes can be proven to stay under the trusted root. The project writer uses the same answer, so the two cannot disagree.
288
349
  - **`agent-cli`:**
289
- - Where project writes cannot be proven safe, a trusted workspace keeps its sessions in the user session store (`~/.robota/sessions`). They are listed for that workspace by their working directory, so `/resume`, the sessions sidebar, `--continue` and `robota session list` find them. Nothing is written under the project root.
350
+ - Where project writes cannot be proven safe, a trusted workspace keeps its sessions in the user session store (`$PRODUCT_USER_STATE_DIR/sessions`). They are listed for that workspace by their working directory, so `/resume`, the sessions sidebar, `--continue` and `robota session list` find them. Nothing is written under the project root.
290
351
  - Before this, every save in a trusted git workspace on macOS was refused, and those surfaces listed nothing.
291
352
  - Linux keeps trusted sessions in the project, as before.
292
353
  - `robota session list`, `robota usage` and `robota session analyze` report such sessions as user sessions, never as project sessions.
@@ -407,7 +468,7 @@
407
468
  stays inside the project (every platform but Linux), none is composed: a checkpoint could be
408
469
  neither saved nor restored there.
409
470
  - `agent-command` (patch): where a session has no checkpoints, `/rewind` says why: a restricted
410
- workspace is told to run `robota trust --yes` and restart robota, and a host that cannot write
471
+ workspace is told to run `robota trust --yes` and restart Robota, and a host that cannot write
411
472
  the project safely says so. `/rewind list` reports this as a failed command instead of throwing.
412
473
  - `agent-framework` (minor): a checkpoint operation on a session without a store throws
413
474
  `EditCheckpointsUnavailableError`, whose `reason` is `host-cannot-write-project`,
@@ -442,7 +503,7 @@
442
503
  under. `sandboxApprovalFor` is exported.
443
504
  - `agent-subagent-runner` (minor): `ISubagentWorkerComposition` takes an optional `createSandbox`. The
444
505
  worker builds that sandbox once and hands the same instance to `createTools` and to the session.
445
- - `agent-cli` (patch): robota's worker composition builds the OS sandbox through `createSandbox`, so
506
+ - `agent-cli` (patch): Robota's worker composition builds the OS sandbox through `createSandbox`, so
446
507
  a child-process subagent approves what its parent approves.
447
508
 
448
509
  ### Patch Changes
@@ -587,7 +648,7 @@
587
648
  The tool reaches only files inside the workspace whose path does not look like it holds secrets
588
649
  (`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
589
650
  - The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
590
- under `~/.robota/peer-files/<sender>/`. It is never run and never placed in the model's context.
651
+ under `$PRODUCT_USER_STATE_DIR/peer-files/<sender>/`. It is never run and never placed in the model's context.
591
652
  The conversation is told only its name, size and sha256. A name that leaves that directory is
592
653
  refused, a symbolic link is never written through, and nothing is overwritten.
593
654
  - Transfers travel on a channel of their own (a separate connection on this host, a separate data
@@ -720,9 +781,9 @@
720
781
  session on an earlier version cannot confirm, so its messages are refused; both sessions need this
721
782
  version to message each other.
722
783
 
723
- - ec5e477: Add a credential store port (`ICredentialStore` in `agent-core`) and keep the CLI's secrets behind it: the OS keychain through the optional `@napi-rs/keyring` binding (macOS Keychain, Windows Credential Manager, Linux Secret Service), else an owner-only file under `~/.robota/credentials`. The backend is chosen at first use, recorded, and named by `/remote-control status`; a recorded keychain that stops working fails closed instead of degrading to the file.
784
+ - ec5e477: Add a credential store port (`ICredentialStore` in `agent-core`) and keep the CLI's secrets behind it: the OS keychain through the optional `@napi-rs/keyring` binding (macOS Keychain, Windows Credential Manager, Linux Secret Service), else an owner-only file under `$PRODUCT_USER_STATE_DIR/credentials`. The backend is chosen at first use, recorded, and named by `/remote-control status`; a recorded keychain that stops working fails closed instead of degrading to the file.
724
785
 
725
- The remote-control host identity key moves into the store. The old `~/.robota/remote-host-identity.json` may have been copied by backups or dotfile sync, so it is not carried over: on the first run after upgrading a new host key is generated, the old file is removed, and the operator is told once that trusted devices must pair again.
786
+ The remote-control host identity key moves into the store. The old `$PRODUCT_USER_STATE_DIR/remote-host-identity.json` may have been copied by backups or dotfile sync, so it is not carried over: on the first run after upgrading a new host key is generated, the old file is removed, and the operator is told once that trusted devices must pair again.
726
787
 
727
788
  - 18b52cc: Built-in commands are offered to the model deliberately, each described for the model, and never
728
789
  with a trust, credential or permission-widening action.
@@ -873,7 +934,7 @@
873
934
  with an advisor. Sending history to a destination (provider type and endpoint host) the main model
874
935
  does not already use needs a one-time consent per destination, kept in the user settings file; a
875
936
  refusal is remembered for the session. The organization's `allowedProviders` applies, and
876
- `ROBOTA_DISABLE_ADVISOR=1` turns it off completely. In-process subagents inherit the advisor, bound
937
+ `PRODUCT_DISABLE_ADVISOR=1` turns it off completely. In-process subagents inherit the advisor, bound
877
938
  to their own conversation; child-process subagents do not get it.
878
939
 
879
940
  **`@robota-sdk/agent-framework` is `major` for one reason: `ICommandHostSessionAccess` gains a
@@ -910,8 +971,8 @@
910
971
  construction alongside `allow` and `deny`.
911
972
  - **Never auto-approved, bypass included:** removing a critical path with `rm`/`rmdir` (the root, a
912
973
  top-level directory, home, the working directory or a parent), and a modify-class write into
913
- `.git`, `.robota`, `.claude`, `.agents`, `.mcp.json`, `.gitconfig`, `.npmrc` or a shell rc file.
914
- Files inside an isolated worktree (`.robota/worktrees/<name>/…`) are ordinary files. With no
974
+ `.git`, `.Robota`, `.claude`, `.agents`, `.mcp.json`, `.gitconfig`, `.npmrc` or a shell rc file.
975
+ Files inside an isolated worktree (`$PRODUCT_PROJECT_STATE_DIR/worktrees/<name>/…`) are ordinary files. With no
915
976
  approver attached, an ask is a denial.
916
977
  - **A ceiling is checked before bypass and before any ask.** A subagent's `inherit-allowlist` ceiling
917
978
  is now the parent's _effective_ rules, read live at spawn: settings, preset lists and command
@@ -1205,7 +1266,7 @@
1205
1266
  `createModelCommandToolProjection`, and `buildPromptWithFileReferences` for SDK consumers.
1206
1267
 
1207
1268
  To preserve the previous identifiers, pass `modelCommandToolPrefix: 'robota_command_'` and
1208
- `promptFileReferenceTag: 'robota_file_references'` in session options, or pass those values to
1269
+ `promptFileReferenceTag: 'PRODUCT_file_references'` in session options, or pass those values to
1209
1270
  the projection and prompt-format helpers. The Robota product profile supplies both values, so
1210
1271
  the Robota CLI keeps its existing model tool names and prompt enclosure.
1211
1272
 
@@ -1326,10 +1387,10 @@
1326
1387
  - 4078a72: Model fallback chain. `--fallback-model a,b` (or the `fallbackModel` settings array; the flag wins) names up to three models a turn moves to when its model is overloaded, unavailable or failing on the server. An entry is a provider profile, `profile:model`, a bare model on the primary's provider, or `default`. The move happens only before any output has streamed, lasts for the current turn, and is shown as a system note; entries that cannot be built are passed over and entries outside the organization's `allowedProviders` are dropped with a notice. `FallbackProvider` in agent-framework implements it over the session's provider; `IChatOptions` gains `executionId`, `onModelFallback` and `preserveContextWindow`, `IAIProvider` gains optional `resolveModelRoute`, and the execution loop emits a `provider_fallback` event and attributes requests, call observations, committed replies, the response cache and usage to the model that answered. A turn that ran on more than one model records per-model `modelShares` on its usage observation, which personal usage reports split by model and provider. A `/provider` switch keeps the chain, read again for the new primary.
1327
1388
  - af2f2ad: `/cd <directory>` continues the conversation in another directory.
1328
1389
 
1329
- - **A move is a new session in the target directory.** In the TUI, robota saves a copy of the
1390
+ - **A move is a new session in the target directory.** In the TUI, Robota saves a copy of the
1330
1391
  conversation where the target's session store will find it, ends the current run through its
1331
1392
  normal end-of-life flow, and starts again in the target directory resuming that copy. The target's
1332
- settings, trust decision, tools, skills and `AGENTS.md` apply, exactly as if robota had been
1393
+ settings, trust decision, tools, skills and `AGENTS.md` apply, exactly as if Robota had been
1333
1394
  launched there. The process boundary makes the move atomic, so no tool call can straddle it.
1334
1395
  - **The system prompt is kept as recorded**, so a provider's prompt cache survives. One appended
1335
1396
  `<workspace-move>` message tells the model the new directory, and which project instructions now
@@ -1427,7 +1488,7 @@
1427
1488
  - 2711ec6: One broken skill or agent file no longer stops the session.
1428
1489
 
1429
1490
  Skill, command and agent definitions are shared with other hosts through `.claude`, and those hosts
1430
- define fields of their own. The frontmatter decoder now validates only the fields robota owns and
1491
+ define fields of their own. The frontmatter decoder now validates only the fields Robota owns and
1431
1492
  ignores the rest (nested `metadata` entries included); a malformed value of an owned field is still
1432
1493
  refused. A refused file is skipped with a single warning and still claims its name, so a
1433
1494
  lower-priority definition cannot stand in for it. An empty `argument-hint` reads as no hint. When
@@ -1475,7 +1536,7 @@
1475
1536
  project/user definitions > injected > built-in. `AgentDefinitionLoader` now dedupes within that tier
1476
1537
  (first wins). Absent ⇒ unchanged behavior.
1477
1538
  - **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
1478
- `agentDefinitions` through the headless and TUI channels so every robota surface carries the seam.
1539
+ `agentDefinitions` through the headless and TUI channels so every Robota surface carries the seam.
1479
1540
  - **`@robota-sdk/agent-cli`** — `robota`'s identity (branding, provider surface, presets,
1480
1541
  `packs: [codingPack]`, base command modules, injected transports/runners/subagent factory) is declared as
1481
1542
  data in a product profile and folded by `assembleProduct`. The coding command modules (`/shell`,
@@ -1578,7 +1639,7 @@
1578
1639
  every `packages/*/src` production tree.
1579
1640
  - 4b76cfa: NEUT-005 (wave 2): restore an actionable context-capacity hint at the surface tier, neutrally. The zero-dependency `agent-core` layer emits a product-neutral hard-capacity notice and exposes the `IAgentConfig.contextCapacityHint` seam (wave 1). This wave wires that seam end-to-end without baking product vocabulary into a neutral library:
1580
1641
 
1581
- - `agent-session`: `ISessionOptions.contextCapacityHint` is forwarded into the Robota agent config (`buildRobota`), making the core seam reachable from the consuming layer.
1642
+ - `agent-session`: `ISessionOptions.contextCapacityHint` is forwarded into the agent configuration factory, making the core seam reachable from the consuming layer.
1582
1643
  - `agent-framework`: new `deriveContextCapacityHint(commandModules)` derives the concrete remediation wording from the surface's OWN registered command set (names a registered `compact` command → `"Run /compact and retry."`; `undefined` when none, leaving the neutral core default). It is applied automatically in interactive session assembly across the TUI, print, and `--serve` surfaces.
1583
1644
  - `agent-cli`: the default command set registers `/compact`, so end users regain the actionable hint.
1584
1645
  - `agent-interface-transport`: reworded the `'allow-project'` permission comment so it no longer hardcodes a storage path (the location is owned by the consuming layer), matching the `agent-session` twin.
@@ -1591,7 +1652,7 @@
1591
1652
  constructor-injectable with the previous bilingual/dev set as the documented default; session-name
1592
1653
  sanitizer is Unicode-aware (non-Latin titles preserved).
1593
1654
  - 90e7a10: The default background observer warning code and exported `OBSERVER_FAILURE_WARNING_CODE` value
1594
- change from `ROBOTA_BACKGROUND_OBSERVER_FAILURE` to `BACKGROUND_OBSERVER_FAILURE`. Hosts matching
1655
+ change from `PRODUCT_BACKGROUND_OBSERVER_FAILURE` to `BACKGROUND_OBSERVER_FAILURE`. Hosts matching
1595
1656
  the old warning code should match the new neutral code or provide `observerFailureWarningCode` in
1596
1657
  their background manager or session options. The Robota CLI supplies its existing code explicitly
1597
1658
  across print, goal, serve, MCP, and TUI sessions.
@@ -1996,7 +2057,7 @@
1996
2057
 
1997
2058
  - **Preset system (PRESET-001~017):** new `@robota-sdk/agent-preset` package layering framework
1998
2059
  assembly options into named, selectable profiles (`default`, `autonomous-builder`, `careful-reviewer`,
1999
- `neutral-executor`) plus user-authored external presets loaded from `~/.robota/presets/*.json`.
2060
+ `neutral-executor`) plus user-authored external presets loaded from `$PRODUCT_USER_STATE_DIR/presets/*.json`.
2000
2061
  - **Live preset switching:** `/preset` command (list + active marker + switch) and a TUI active-preset
2001
2062
  display. Switching live re-applies permission posture, model/effort, persona, command-module
2002
2063
  selection, parallel-subagents gating, and a self-verification system-prompt section via the single
@@ -2217,7 +2278,7 @@
2217
2278
 
2218
2279
  ### Patch Changes
2219
2280
 
2220
- - Refresh package docs and robota.io content for the beta 57 feature set.
2281
+ - Refresh package docs and Robota.io content for the beta 57 feature set.
2221
2282
  - Updated dependencies
2222
2283
  - @robota-sdk/agent-core@3.0.0-beta.58
2223
2284
  - @robota-sdk/agent-executor@3.0.0-beta.58
package/README.md CHANGED
@@ -14,8 +14,8 @@ It has three main entry points:
14
14
  one configuration, for headless and multi-session hosts.
15
15
 
16
16
  The package has no React dependency, and it never imports a concrete provider: you create the
17
- provider (for example from `@robota-sdk/agent-provider-anthropic`) and pass it in. The `robota` CLI
18
- (`@robota-sdk/agent-cli`) is a reference app built on this package.
17
+ provider (for example from `@robota-sdk/agent-provider-anthropic`) and pass it in. The configured CLI
18
+ (`@robota-sdk/agent-cli`) is a maintained agent interface built on this package.
19
19
 
20
20
  For walkthroughs, see the [SDK guide](../../content/guide/sdk.md) and
21
21
  [Building agents](../../content/guide/building-agents.md).
@@ -26,7 +26,7 @@ For walkthroughs, see the [SDK guide](../../content/guide/sdk.md) and
26
26
  npm install @robota-sdk/agent-framework @robota-sdk/agent-provider-anthropic
27
27
  ```
28
28
 
29
- Requires Node.js 22.12 or later. `InteractiveSession` and `createQuery` work with any Robota provider
29
+ Requires Node.js 22.12 or later. `InteractiveSession` and `createQuery` work with any provider
30
30
  package given a `model`; without one they use the settings files, or Anthropic's default model.
31
31
 
32
32
  ## Quick start
@@ -230,7 +230,7 @@ const session = runtime.createSession({ permissionMode: 'plan' });
230
230
 
231
231
  `buildRuntimeSession()` is the one place a session is built from resolved options, and
232
232
  `startRuntimeHost()` adds transport start/stop and a bounded shutdown on top of it; the CLI's
233
- `robota --serve` uses both. `SessionPool` keeps several live sessions for a runtime that serves more
233
+ `<cli-name> --serve` uses both. `SessionPool` keeps several live sessions for a runtime that serves more
234
234
  than one client. Headless output is available through `createHeadlessRunner` and
235
235
  `createHeadlessTransport`, and `createProgrammaticAgent` drives a session from code.
236
236
 
@@ -378,15 +378,60 @@ that supports snapshots, `shutdown()` stores the sandbox snapshot ID, and resumi
378
378
  | Self-hosting verification | `planSelfHostingVerification`, `transitionSelfHostingLoop` |
379
379
 
380
380
  Bundle plugins use the Claude Code plugin layout: a directory with `.claude-plugin/plugin.json`
381
- (`name`, `version`, `description`, `features`) that can contribute skills, commands, hooks, MCP
382
- server configuration and agent definitions.
381
+ (`name` is required; `version` and `description` are optional) that can contribute skills,
382
+ commands, hooks, MCP server configuration and agent definitions. The loader selects the source
383
+ recorded in `installed_plugins.json`, validates its cache location and refuses invalid or missing
384
+ selected sources. Without a registry, a single cached revision is supported; multiple revisions
385
+ require an explicit installation record and are reported as `revision-unselected`. Cache directory
386
+ sorting never selects an execution source. Missing manifest versions remain absent. Enablement
387
+ checks both the installed identity and the manifest name, so renaming a manifest cannot bypass a
388
+ disabled installation. MCP dispatch revalidates this selection; other component lifetimes remain
389
+ owned by their host execution surfaces.
390
+
391
+ The loader also exposes a versioned `IContributionDescriptor` on each loaded bundle. It binds
392
+ installed identity, cache revision and source location to namespaced contributions and required
393
+ host capabilities without importing contributor code or exposing MCP credential values. A
394
+ supported declaration still requires host admission. Agent names without execution definitions
395
+ are unavailable; unconsumed custom component paths and invalid transports carry compatibility
396
+ diagnostics. The descriptor records host ownership of active-call policy; it does not establish
397
+ live retirement behavior for every component kind.
398
+
399
+ The documented MCP declaration subset supports `mcpServers` as a plugin-relative `./` JSON path,
400
+ an inline server map, or an ordered array of either. The default `.mcp.json` is read first; later
401
+ declarations replace whole server entries, with each winning entry retaining its declaring file.
402
+ Paths are checked against the selected installed revision, including symlinks. Unsupported paths
403
+ and malformed declarations produce value-free compatibility codes. Binary MCP bundles are not
404
+ supported by this adapter. See the [foreign manifest reference](https://code.claude.com/docs/en/plugins-reference).
405
+
406
+ CLI and app startup route these definitions through the existing `plugin` MCP source tier, with
407
+ `plugin-name:server-name` identities, ordinary precedence, workspace trust, approval and host stdio
408
+ authority. Inspection never connects. `${CLAUDE_PLUGIN_ROOT}` resolves to the selected plugin root;
409
+ other environment materialization remains owned by the MCP definition layer. Startup honors the
410
+ current disable overlay. Before each MCP call the host rereads enablement and the selected source;
411
+ disable, uninstall, source replacement or changed trust refuses new dispatch. Already dispatched
412
+ calls settle with their real outcomes. Fresh startup reuses durable approvals only when their
413
+ source identity and trust still match; a new revision cannot silently replace an in-flight tool.
414
+
415
+ The documented MCP declaration subset supports `mcpServers` as a plugin-relative `./` JSON path,
416
+ an inline server map, or an ordered array of either. The default `.mcp.json` is read first; later
417
+ declarations replace whole server entries, with each winning entry retaining its declaring file.
418
+ Paths are checked against the selected installed revision, including symlinks. Unsupported paths
419
+ and malformed declarations produce value-free compatibility codes. Binary MCP bundles are not
420
+ supported by this adapter. See the [foreign manifest reference](https://code.claude.com/docs/en/plugins-reference).
421
+
422
+ CLI and app startup route these definitions through the existing `plugin` MCP source tier, with
423
+ `plugin-name:server-name` identities, ordinary precedence, workspace trust, approval and host stdio
424
+ authority. Inspection never connects. `${CLAUDE_PLUGIN_ROOT}` resolves to the selected plugin root;
425
+ other environment materialization remains owned by the MCP definition layer. Startup honors the
426
+ current disable overlay; active-chain update/disable and restored-work revalidation still require
427
+ their separate lifecycle implementation.
383
428
 
384
429
  ## Settings
385
430
 
386
431
  Settings are JSON files merged in the order the host gives them, later layers winning.
387
- `$ENV:NAME` values in provider credentials are replaced with the environment variable. The Robota
388
- CLI reads `~/.robota/settings.json`, `~/.claude/settings.json`, `.robota/settings.json`,
389
- `.robota/settings.local.json`, `.claude/settings.json` and `.claude/settings.local.json`, in that
432
+ `$ENV:NAME` values in provider credentials are replaced with the environment variable. The configured
433
+ CLI reads `$PRODUCT_USER_STATE_DIR/settings.json`, `~/.claude/settings.json`, `$PRODUCT_PROJECT_STATE_DIR/settings.json`,
434
+ `$PRODUCT_PROJECT_STATE_DIR/settings.local.json`, `.claude/settings.json` and `.claude/settings.local.json`, in that
390
435
  order; project files are read only in a trusted project.
391
436
 
392
437
  ```json
@@ -433,4 +478,4 @@ examples (no provider credentials needed).
433
478
 
434
479
  ## License
435
480
 
436
- Robota is dual-licensed under the [GNU AGPL-3.0](../../LICENSE) or a [commercial license](../../COMMERCIAL.md). See [LICENSING.md](../../LICENSING.md).
481
+ This package is dual-licensed under the [GNU AGPL-3.0](../../LICENSE) or a [commercial license](../../COMMERCIAL.md). See [LICENSING.md](../../LICENSING.md).