@robota-sdk/agent-cli 3.0.0-beta.86 → 3.0.0-beta.88
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 +103 -48
- package/README.md +289 -39
- package/bin/{robota.cjs → agent.cjs} +1 -1
- package/dist/node/bin.js +23 -23
- package/dist/node/{bounded-output-Bgx2Cgkx-28em7iHq.js → bounded-output-BdWv9SX3-28em7iHq.js} +1 -1
- package/dist/node/{bounded-output-Bgx2Cgkx-28em7iHq.js.map → bounded-output-BdWv9SX3-28em7iHq.js.map} +1 -1
- package/dist/node/cli-core-CEWWF4d6.js +2917 -0
- package/dist/node/{command-executor-d6DdfUTD-DhFSDHvb.js → command-executor-D_UBZHxh-CVZipoOV.js} +2 -2
- package/dist/node/{command-executor-d6DdfUTD-DhFSDHvb.js.map → command-executor-D_UBZHxh-CVZipoOV.js.map} +1 -1
- package/dist/node/{command-executor-d6DdfUTD-3KEnsTnN.js → command-executor-D_UBZHxh-D7UrdAlN.js} +1 -1
- package/dist/node/headless.js +2 -2
- package/dist/node/index.d.ts +2423 -166
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +610 -580
- package/dist/node/index.js.map +1 -1
- package/dist/node/{node-BfqR16CD.js → node-BIdvEvlf.js} +1 -1
- package/dist/node/node-BUERQysz.js +15 -0
- package/dist/node/node-BWNobqRD.js +15 -0
- package/dist/node/node-BWNobqRD.js.map +1 -0
- package/dist/node/node-C4_FOvnk.js.map +1 -1
- package/dist/node/node-CEI_VczS.js +165 -0
- package/dist/node/node-CrspydTR.js +165 -0
- package/dist/node/node-CrspydTR.js.map +1 -0
- package/dist/node/node-DENLEmMT.js.map +1 -1
- package/dist/web/assets/index-BSxTg2Py.css +1 -0
- package/dist/web/assets/index-BpCxNRj_.js +309 -0
- package/dist/web/index.html +3 -3
- package/package.json +49 -44
- package/dist/node/cli-core-DOdGt9XE.js +0 -2891
- package/dist/node/node-B48couEE.js +0 -14
- package/dist/node/node-B48couEE.js.map +0 -1
- package/dist/node/node-CgLYctGm.js +0 -67
- package/dist/node/node-CgLYctGm.js.map +0 -1
- package/dist/node/node-DAOCaE6N.js +0 -67
- package/dist/node/node-DlLm_kxn.js +0 -14
- package/dist/web/assets/index-DSLs7oij.js +0 -309
- package/dist/web/assets/index-OqCBtMJ2.css +0 -1
- /package/dist/node/{bounded-output-Bgx2Cgkx-C4ucXwLR.js → bounded-output-BdWv9SX3-C4ucXwLR.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,60 @@
|
|
|
1
1
|
# @robota-sdk/agent-cli
|
|
2
2
|
|
|
3
|
+
## 3.0.0-beta.88
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- b96b81a: `--serve --http-port <port>` also serves the agent HTTP API on `127.0.0.1:<port>`, so other
|
|
8
|
+
applications and services can submit a prompt and stream its result over SSE, run a slash command,
|
|
9
|
+
abort and read the conversation without a Robota client library. Requests are admitted by the
|
|
10
|
+
bearer in `PRODUCT_HTTP_TOKEN` (at least 32 characters), which the runtime removes from its
|
|
11
|
+
environment before any command runs; the API binds loopback only and is reached from elsewhere
|
|
12
|
+
through the operator's own proxy. `--http-port` keeps its `mcp serve` meaning.
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 853e585: Print mode (`-p`, `--goal`) waits for stdout and stderr to flush before exiting, so a result larger than the pipe buffer is no longer cut off when stdout is a pipe on macOS (for example `-p /help --output-format json`).
|
|
17
|
+
|
|
18
|
+
## 3.0.0-beta.87
|
|
19
|
+
|
|
20
|
+
### Minor Changes
|
|
21
|
+
|
|
22
|
+
- 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.
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- 66af868: Restore portable default startup for generated Robota artifacts while preserving explicit product selection and immutable identity. Keep shared product configuration internal because existing SDK and CLI artifacts bundle its implementation and types.
|
|
27
|
+
- 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.
|
|
28
|
+
- 7d9cc66: Expose declarative contribution descriptors for installed bundles and resolved MCP sources,
|
|
29
|
+
including source generations, host capability requirements and compatibility diagnostics.
|
|
30
|
+
Revalidate MCP approval, source identity and workspace trust before new dispatch, preserving
|
|
31
|
+
outcomes of calls already started and refusing retained tools after shutdown.
|
|
32
|
+
- 7d9cc66: Resume hosted conversations in freshly provisioned workers using verified checkpoint records while rebuilding current prompts, policy and execution state.
|
|
33
|
+
- 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.
|
|
34
|
+
- 7d9cc66: Add owner-side clean E2B worker provisioning and verified filesystem recovery with fresh identity and epoch, explicit failure reconciliation, and no paused-memory execution fallback.
|
|
35
|
+
- 7d9cc66: Add owner-hosted organization control and OpenAI-wire gateway composition with anchored authority, mandatory verified audit, durable effect reservations, provider inventory cleanup and private content receipts. OpenAI profiles can opt into operation identities preserved across SDK retries.
|
|
36
|
+
- 7d9cc66: Load external name-only plugin manifests without inventing optional metadata. Select the recorded
|
|
37
|
+
installed source instead of the lexically last cached directory, refusing invalid, missing or
|
|
38
|
+
ambiguous revisions. Check the installed identity as well as the manifest name for disablement.
|
|
39
|
+
- 7d9cc66: Pass the child execution root and restored sandbox to hook composition. The stock CLI explicitly refuses command and HTTP hooks for separate task workers whose hook capabilities are unavailable, instead of executing those hooks on the host.
|
|
40
|
+
- 7d9cc66: Connect explicitly selected stateless MCP servers through product startup. Preserve and expose the selected protocol, bind activation approval to it, refuse unsupported selections, and report unavailable protocol capabilities without widening process or network authority.
|
|
41
|
+
- 7d9cc66: Add explicit MCP Skills selection, bounded supervisor access and persistent host content consent.
|
|
42
|
+
Users can inspect verified instructions, approve the exact content fingerprint and withdraw consent;
|
|
43
|
+
models can discover metadata only. Consent stays separate from server admission and model-turn activation.
|
|
44
|
+
- 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.
|
|
45
|
+
- 7d9cc66: Connect the desktop to an owner-bound remote task through scoped TLS credentials, durable replay protection, current company authority and a separate native operator approval channel. Keep remote credentials and local filesystem capabilities outside the renderer's remote task connection.
|
|
46
|
+
- 7d9cc66: Reconstruct visible session history from verified hosted conversation checkpoints without importing old system messages or execution events.
|
|
47
|
+
- 7d9cc66: Retain an owner shutdown signal received while a served runtime initializes, and release its signal handlers when the run settles.
|
|
48
|
+
- 7d9cc66: Require hosted admission protocol v2 with signed root-task ownership. Add a pinned E2B SDK connector that checks admitted worker ownership and network configuration before connecting, keeps management credentials outside task operations, and retains provider teardown failures.
|
|
49
|
+
- 7d9cc66: Expose verified skill supporting resources only within their owning turn or fork, using the current host consent and manifest.
|
|
50
|
+
- 7d9cc66: Run the stock hosted CLI inside an admitted E2B task worker with broker-signed scoped access, pinned worker artifacts, runtime-owned input/output and provider cleanup.
|
|
51
|
+
- 7d9cc66: Observe scheduler queue intervals separately from pre-dispatch admission, permission and tool work.
|
|
52
|
+
Preserve valid duration totals when live trace detail is bounded, reporting invalid evidence explicitly
|
|
53
|
+
through content-free console and OTLP traces without altering dispatch, recovery or settlement.
|
|
54
|
+
- 7d9cc66: Require version-3 hosted admission with broker-signed cumulative usage and owner-selected runtime ceilings. Collect accounting before dispatch, on refresh and at completion; stop and release owned execution when accounting or limits fail. Operator deployments and issuers must migrate from version 2.
|
|
55
|
+
|
|
56
|
+
Connect authenticated runtime loopback clients to the stock hosted worker daemon through owned provider command streams. Hosted serve requires a private owner-selected ingress configuration and uses a separate worker launch token; stop closes clients and the listener before cleanup settles.
|
|
57
|
+
|
|
3
58
|
## 3.0.0-beta.86
|
|
4
59
|
|
|
5
60
|
### Patch Changes
|
|
@@ -11,7 +66,7 @@
|
|
|
11
66
|
### Minor Changes
|
|
12
67
|
|
|
13
68
|
- db35dcd: MCP approvals now outlive the process, and an approval takes effect at once. The `robota` CLI keeps
|
|
14
|
-
activation decisions in
|
|
69
|
+
activation decisions in `$PRODUCT_USER_STATE_DIR/mcp-approvals.json` (owner-only) unless the host passes its own
|
|
15
70
|
`mcpApprovalStore`, so an approved server connects at later starts until its definition changes.
|
|
16
71
|
`/mcp approve <server>` now also connects the server in the running session, the way `/mcp reload`
|
|
17
72
|
does, instead of waiting for a restart. A remote server without OAuth therefore connects once
|
|
@@ -83,10 +138,10 @@
|
|
|
83
138
|
- 12a5b15: CLI fixes from the docs-refresh findings (#3275):
|
|
84
139
|
|
|
85
140
|
- `robota trust revoke` exits 0 when the revoke succeeds.
|
|
86
|
-
- `
|
|
141
|
+
- `Robota <subcommand> --help` prints that subcommand's help instead of running it, refusing an unknown option, or starting the terminal UI; commands with fuller help of their own (`usage`, `session list|view|attach`) keep printing it, and `robota mcp serve --help` prints to stdout.
|
|
87
142
|
- `robota --help` lists every option the parser accepts (`--goal`, `--goal-max-iterations`, `--provider`, `--set-current`, `--type`, `--base-url`, `--api-key`, `--api-key-env`, `--settings-scope`, `--session-log`, `--serve`, `--restricted-workspace`, `--disable-update-check`), `--effort` lists `none` and `minimal`, and `--bare` is described as what it does: print mode without instruction files or plugins.
|
|
88
143
|
- `robota session start --background --restricted-workspace` starts a background session Restricted, as the headless trust refusal already suggested.
|
|
89
|
-
- `
|
|
144
|
+
- `Robota "prompt"` opens the terminal UI with the prompt typed in, not yet sent.
|
|
90
145
|
|
|
91
146
|
- 29486da: A lost connection no longer drops a typed message or takes the person out of their session. While the
|
|
92
147
|
transport is not `connected`, the composer keeps its draft and Send explains why it cannot submit
|
|
@@ -189,7 +244,7 @@
|
|
|
189
244
|
- `agent-mcp` (breaking) — `MCP_EXTERNAL_EVENT_CAPABILITY`, `MCP_EXTERNAL_EVENT_METHOD`, `IMCPExternalEvent` and
|
|
190
245
|
`TMCPExternalEventListener` are removed, as are `IMCPSession.externalEventsDeclared`,
|
|
191
246
|
`IMCPSession.onExternalEvent`, `IMCPSession.onClose` and `MCPConnectionSupervisor.onExternalEvent`. A server
|
|
192
|
-
that declares `com.
|
|
247
|
+
that declares `com.Robota.external-event` or sends its notification is served as any other server and the
|
|
193
248
|
notification is ignored. The `zod` dependency is dropped.
|
|
194
249
|
- `agent-cli` (breaking) — `IMcpClientComposition.subscribeExternalEvent` and
|
|
195
250
|
`IMcpServerConnection.onExternalEvent` are removed.
|
|
@@ -327,7 +382,7 @@
|
|
|
327
382
|
- Session notices keep only `session-error` and `protocol-error`.
|
|
328
383
|
- The state gains `commandCatalog` and `sessionStatus`.
|
|
329
384
|
- `agent-command` registers `/theme` and `/keybindings` even without a terminal. They then answer
|
|
330
|
-
that they belong to the
|
|
385
|
+
that they belong to the Robota terminal, instead of being unknown.
|
|
331
386
|
- `agent-framework`:
|
|
332
387
|
- `InteractiveSession.getStatusSnapshot()`.
|
|
333
388
|
- The main-thread row previews the last chat message instead of the last record's type.
|
|
@@ -521,7 +576,7 @@
|
|
|
521
576
|
- The device lists read from public records are bounded per paired device, each device's newest
|
|
522
577
|
before any device's next, and the chunks of one list carry a shared version, so a read that finds
|
|
523
578
|
chunks of two versions yields no list. Records written before this change are not read as lists.
|
|
524
|
-
- CLI processes that share
|
|
579
|
+
- CLI processes that share `$PRODUCT_USER_STATE_DIR/devices/address-cache.json` apply each change to the file as it
|
|
525
580
|
is on disk, so one process no longer overwrites what another learned.
|
|
526
581
|
|
|
527
582
|
- 4241fc5: Device mesh follow-ups.
|
|
@@ -558,7 +613,7 @@
|
|
|
558
613
|
|
|
559
614
|
- **`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.
|
|
560
615
|
- **`agent-cli`:**
|
|
561
|
-
- Where project writes cannot be proven safe, a trusted workspace keeps its sessions in the user session store (
|
|
616
|
+
- 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.
|
|
562
617
|
- Before this, every save in a trusted git workspace on macOS was refused, and those surfaces listed nothing.
|
|
563
618
|
- Linux keeps trusted sessions in the project, as before.
|
|
564
619
|
- `robota session list`, `robota usage` and `robota session analyze` report such sessions as user sessions, never as project sessions.
|
|
@@ -594,7 +649,7 @@
|
|
|
594
649
|
stays inside the project (every platform but Linux), none is composed: a checkpoint could be
|
|
595
650
|
neither saved nor restored there.
|
|
596
651
|
- `agent-command` (patch): where a session has no checkpoints, `/rewind` says why: a restricted
|
|
597
|
-
workspace is told to run `robota trust --yes` and restart
|
|
652
|
+
workspace is told to run `robota trust --yes` and restart Robota, and a host that cannot write
|
|
598
653
|
the project safely says so. `/rewind list` reports this as a failed command instead of throwing.
|
|
599
654
|
- `agent-framework` (minor): a checkpoint operation on a session without a store throws
|
|
600
655
|
`EditCheckpointsUnavailableError`, whose `reason` is `host-cannot-write-project`,
|
|
@@ -634,14 +689,14 @@
|
|
|
634
689
|
under. `sandboxApprovalFor` is exported.
|
|
635
690
|
- `agent-subagent-runner` (minor): `ISubagentWorkerComposition` takes an optional `createSandbox`. The
|
|
636
691
|
worker builds that sandbox once and hands the same instance to `createTools` and to the session.
|
|
637
|
-
- `agent-cli` (patch):
|
|
692
|
+
- `agent-cli` (patch): Robota's worker composition builds the OS sandbox through `createSandbox`, so
|
|
638
693
|
a child-process subagent approves what its parent approves.
|
|
639
694
|
|
|
640
|
-
- f8a8a4d: The GUI surface's design now applies inside a `
|
|
695
|
+
- f8a8a4d: The GUI surface's design now applies inside a `agent-ui` scope that each of its root components opens,
|
|
641
696
|
so an app with design tokens of its own can embed the surface without either overriding the other. Such
|
|
642
697
|
an app imports `@robota-sdk/agent-ui-web/styles/surface.css` into its Tailwind entry; a page that is only
|
|
643
|
-
the surface keeps importing `styles/theme.css` and puts `
|
|
644
|
-
`
|
|
698
|
+
the surface keeps importing `styles/theme.css` and puts `agent-ui` on its `<html>`. `ProductMark` and
|
|
699
|
+
`ProductWordmark` are exported. The browser remote client (`RemoteClient`) follows the same design, with
|
|
645
700
|
its pairing states centred on the page.
|
|
646
701
|
- 122e82b: A child-process subagent confines and approves commands with its parent's sandbox settings as they
|
|
647
702
|
stand when it starts. Before, it read its root's settings files, so a `/sandbox` change made in the
|
|
@@ -651,7 +706,7 @@
|
|
|
651
706
|
- `agent-subagent-runner` (minor): the runner factory takes `parentSandboxSettings`, read at each
|
|
652
707
|
spawn. The start payload carries it, the IPC guard checks it is a record, and the worker hands it to
|
|
653
708
|
`createSandbox` as `parentSettings`.
|
|
654
|
-
- `agent-cli` (patch):
|
|
709
|
+
- `agent-cli` (patch): Robota sends its live sandbox's settings, and a child builds its sandbox from
|
|
655
710
|
them. It refuses settings it cannot read rather than falling back to the files.
|
|
656
711
|
|
|
657
712
|
- 0368058: A running child-process subagent follows a `/sandbox` change made in its parent session. Before, it
|
|
@@ -666,7 +721,7 @@
|
|
|
666
721
|
exits or fails to start. A composed sandbox may define `applyParentSettings`. The worker applies
|
|
667
722
|
each change through it. On settings it cannot take, it aborts the run, lets a running command
|
|
668
723
|
finish, and ends the run with that error.
|
|
669
|
-
- `agent-cli` (patch):
|
|
724
|
+
- `agent-cli` (patch): Robota watches its live sandbox, and a child applies each change to the
|
|
670
725
|
instance its tools and approval read.
|
|
671
726
|
|
|
672
727
|
- 5a0ee96: Workspace trust no longer drops on its own. A grant was keyed by the repository config file and the
|
|
@@ -702,7 +757,7 @@
|
|
|
702
757
|
pairwise secret (`derivePairRendezvous(...).relayInbox()`).
|
|
703
758
|
- `agent-cli` — a device holding the signing key reissues its roster and revocation list before they
|
|
704
759
|
expire while an interactive session runs. The host can open this device's mesh endpoint from the
|
|
705
|
-
identity under
|
|
760
|
+
identity under `$PRODUCT_USER_STATE_DIR/devices`, saving newer lists a peer hands over; no command starts it yet.
|
|
706
761
|
- `agent-command` — `/devices add|join` still reports that enrolment is not available yet.
|
|
707
762
|
|
|
708
763
|
- e15e22b: The Node WebRTC transport runs on `node-datachannel` (libdatachannel, DTLS by OpenSSL). The DTLS stack
|
|
@@ -726,7 +781,7 @@
|
|
|
726
781
|
The tool reaches only files inside the workspace whose path does not look like it holds secrets
|
|
727
782
|
(`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
|
|
728
783
|
- The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
|
|
729
|
-
under
|
|
784
|
+
under `$PRODUCT_USER_STATE_DIR/peer-files/<sender>/`. It is never run and never placed in the model's context.
|
|
730
785
|
The conversation is told only its name, size and sha256. A name that leaves that directory is
|
|
731
786
|
refused, a symbolic link is never written through, and nothing is overwritten.
|
|
732
787
|
- Transfers travel on a channel of their own (a separate connection on this host, a separate data
|
|
@@ -818,7 +873,7 @@
|
|
|
818
873
|
rate. Discovery yields candidates only: admission is still the device handshake, and an address is
|
|
819
874
|
remembered only after an admission it carried.
|
|
820
875
|
- `agent-cli` — the device mesh endpoint can look on the local network (`lan` option), remembering
|
|
821
|
-
the addresses that worked in an owner-only
|
|
876
|
+
the addresses that worked in an owner-only `$PRODUCT_USER_STATE_DIR/devices/address-cache.json`; no command starts
|
|
822
877
|
it yet.
|
|
823
878
|
|
|
824
879
|
## 3.0.0-beta.81
|
|
@@ -858,13 +913,13 @@
|
|
|
858
913
|
driver is ignored. External-event turns keep their tool-less baseline.
|
|
859
914
|
- `agent-cli`: incoming peer turns carry only their reply route.
|
|
860
915
|
|
|
861
|
-
- 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
|
|
916
|
+
- 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.
|
|
862
917
|
|
|
863
|
-
The remote-control host identity key moves into the store. The old
|
|
918
|
+
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.
|
|
864
919
|
|
|
865
920
|
- 44fc732: Add `/devices` for this device's identity among the user's devices: `list`, `init` (creates the identity: a recovery phrase, the master-certified signing key, this device's keys and certificate, the first roster and revocation list), `revoke <device-id>` (signing key only, no phrase; confirmed at the terminal) and `recover` (rotates the signing key from the phrase and revokes the old ones). Enrolling another device (`add` / `join`) comes with the device connection.
|
|
866
921
|
|
|
867
|
-
The recovery phrase never enters the session: it is shown once and read with no echo on the controlling terminal (opened apart from the session's input), on the alternate screen that is cleared afterwards, and never reaches prompt history, conversation history, transcripts, traces or the model. Without an interactive terminal the phrase commands refuse. `/devices` is operator-only: never model-invocable and refused from remote surfaces. Private keys live in the host credential store; certificates, roster, revocation lists and sequence marks are kept in owner-only files under
|
|
922
|
+
The recovery phrase never enters the session: it is shown once and read with no echo on the controlling terminal (opened apart from the session's input), on the alternate screen that is cleared afterwards, and never reaches prompt history, conversation history, transcripts, traces or the model. Without an interactive terminal the phrase commands refuse. `/devices` is operator-only: never model-invocable and refused from remote surfaces. Private keys live in the host credential store; certificates, roster, revocation lists and sequence marks are kept in owner-only files under `$PRODUCT_USER_STATE_DIR/devices`.
|
|
868
923
|
|
|
869
924
|
`agent-remote-pairing` adds `isRecoveryPhraseWord`, so a phrase can be checked one word at a time.
|
|
870
925
|
|
|
@@ -1094,7 +1149,7 @@
|
|
|
1094
1149
|
with an advisor. Sending history to a destination (provider type and endpoint host) the main model
|
|
1095
1150
|
does not already use needs a one-time consent per destination, kept in the user settings file; a
|
|
1096
1151
|
refusal is remembered for the session. The organization's `allowedProviders` applies, and
|
|
1097
|
-
`
|
|
1152
|
+
`PRODUCT_DISABLE_ADVISOR=1` turns it off completely. In-process subagents inherit the advisor, bound
|
|
1098
1153
|
to their own conversation; child-process subagents do not get it.
|
|
1099
1154
|
|
|
1100
1155
|
**`@robota-sdk/agent-framework` is `major` for one reason: `ICommandHostSessionAccess` gains a
|
|
@@ -1138,10 +1193,10 @@
|
|
|
1138
1193
|
|
|
1139
1194
|
- **Running it** (`agent-cli`):
|
|
1140
1195
|
- No shell. It runs in the project directory for a `project`/`local` definition, and in
|
|
1141
|
-
|
|
1196
|
+
`$PRODUCT_USER_STATE_DIR` otherwise.
|
|
1142
1197
|
- Its environment is the host's without runtime-loading variables (`NODE_OPTIONS`, `LD_*`,
|
|
1143
1198
|
`BASH_ENV`, …). A `project`/`local` helper also gets no credential-shaped variables.
|
|
1144
|
-
`
|
|
1199
|
+
`PRODUCT_MCP_SERVER_NAME` and `PRODUCT_MCP_SERVER_URL` are set. For a `project`/`local` helper
|
|
1145
1200
|
the URL keeps its `${VAR}` references instead of what the environment expanded them to.
|
|
1146
1201
|
- Limits: 10 s and 64 KiB of stdout. Stderr is discarded. The process tree is killed on timeout
|
|
1147
1202
|
or cancel.
|
|
@@ -1234,7 +1289,7 @@
|
|
|
1234
1289
|
of following it; registration, token and refresh requests use it.
|
|
1235
1290
|
- **Storage:** `IMCPOAuthCredentialStore` (`get`/`set`/`delete`), keyed by the server's security
|
|
1236
1291
|
identity and canonical URL together. `createFileOAuthCredentialStore` keeps 0600 files in a 0700
|
|
1237
|
-
|
|
1292
|
+
`$PRODUCT_USER_STATE_DIR/mcp-credentials/`. The issuer, token endpoint and client (with its secret, if any, and
|
|
1238
1293
|
the client authentication method dynamic registration returned) are stored with the tokens. A
|
|
1239
1294
|
sign-in stores its credential under the refresh lock, so a refresh in flight cannot overwrite it.
|
|
1240
1295
|
- **Sessions** (`createOAuthAuthenticator`, wired for every `oauth` definition):
|
|
@@ -1272,10 +1327,10 @@
|
|
|
1272
1327
|
|
|
1273
1328
|
- af2f2ad: `/cd <directory>` continues the conversation in another directory.
|
|
1274
1329
|
|
|
1275
|
-
- **A move is a new session in the target directory.** In the TUI,
|
|
1330
|
+
- **A move is a new session in the target directory.** In the TUI, Robota saves a copy of the
|
|
1276
1331
|
conversation where the target's session store will find it, ends the current run through its
|
|
1277
1332
|
normal end-of-life flow, and starts again in the target directory resuming that copy. The target's
|
|
1278
|
-
settings, trust decision, tools, skills and `AGENTS.md` apply, exactly as if
|
|
1333
|
+
settings, trust decision, tools, skills and `AGENTS.md` apply, exactly as if Robota had been
|
|
1279
1334
|
launched there. The process boundary makes the move atomic, so no tool call can straddle it.
|
|
1280
1335
|
- **The system prompt is kept as recorded**, so a provider's prompt cache survives. One appended
|
|
1281
1336
|
`<workspace-move>` message tells the model the new directory, and which project instructions now
|
|
@@ -1318,8 +1373,8 @@
|
|
|
1318
1373
|
construction alongside `allow` and `deny`.
|
|
1319
1374
|
- **Never auto-approved, bypass included:** removing a critical path with `rm`/`rmdir` (the root, a
|
|
1320
1375
|
top-level directory, home, the working directory or a parent), and a modify-class write into
|
|
1321
|
-
`.git`, `.
|
|
1322
|
-
Files inside an isolated worktree (
|
|
1376
|
+
`.git`, `.Robota`, `.claude`, `.agents`, `.mcp.json`, `.gitconfig`, `.npmrc` or a shell rc file.
|
|
1377
|
+
Files inside an isolated worktree (`$PRODUCT_PROJECT_STATE_DIR/worktrees/<name>/…`) are ordinary files. With no
|
|
1323
1378
|
approver attached, an ask is a denial.
|
|
1324
1379
|
- **A ceiling is checked before bypass and before any ask.** A subagent's `inherit-allowlist` ceiling
|
|
1325
1380
|
is now the parent's _effective_ rules, read live at spawn: settings, preset lists and command
|
|
@@ -1456,7 +1511,7 @@
|
|
|
1456
1511
|
project/user definitions > injected > built-in. `AgentDefinitionLoader` now dedupes within that tier
|
|
1457
1512
|
(first wins). Absent ⇒ unchanged behavior.
|
|
1458
1513
|
- **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
|
|
1459
|
-
`agentDefinitions` through the headless and TUI channels so every
|
|
1514
|
+
`agentDefinitions` through the headless and TUI channels so every Robota surface carries the seam.
|
|
1460
1515
|
- **`@robota-sdk/agent-cli`** — `robota`'s identity (branding, provider surface, presets,
|
|
1461
1516
|
`packs: [codingPack]`, base command modules, injected transports/runners/subagent factory) is declared as
|
|
1462
1517
|
data in a product profile and folded by `assembleProduct`. The coding command modules (`/shell`,
|
|
@@ -1503,7 +1558,7 @@
|
|
|
1503
1558
|
End-user `robota` behavior is unchanged: the assembled command-module set, provider surface, tool set,
|
|
1504
1559
|
subagent roster, preset resolution, and permission posture all match the pre-change assembly.
|
|
1505
1560
|
|
|
1506
|
-
- 0116a29: ARCH-006 completion —
|
|
1561
|
+
- 0116a29: ARCH-006 completion — Robota's capability packs now OWN its tool surface, and `pack-coding` is built by a
|
|
1507
1562
|
context-bound factory.
|
|
1508
1563
|
|
|
1509
1564
|
- **`@robota-sdk/pack-coding` (BREAKING)** — the module-level `codingPack` constant is **removed** and
|
|
@@ -1517,9 +1572,9 @@
|
|
|
1517
1572
|
products in one process get independently-scoped file tools. Migration: replace `codingPack` with
|
|
1518
1573
|
`createCodingPack({ cwd: process.cwd() })`.
|
|
1519
1574
|
- **`@robota-sdk/agent-cli`** — `robota`'s packs are built from the shell's resolved `cwd`
|
|
1520
|
-
(`
|
|
1521
|
-
`
|
|
1522
|
-
is REPLACED. Every tool
|
|
1575
|
+
(`createProductCapabilityPacks({ cwd })`) before command setup, and the runtime seam passes
|
|
1576
|
+
`PRODUCT_PACKS_OWN_TOOL_SURFACE` (an empty `defaultTools`) so the framework's `createDefaultTools()` tier
|
|
1577
|
+
is REPLACED. Every tool Robota runs now arrives from a capability pack: dropping a pack drops its tools,
|
|
1523
1578
|
exactly as it already dropped its command modules and subagents.
|
|
1524
1579
|
- **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
|
|
1525
1580
|
`additionalTools` and `defaultTools` through the headless and TUI channels, mirroring the existing
|
|
@@ -1595,7 +1650,7 @@
|
|
|
1595
1650
|
- 2711ec6: One broken skill or agent file no longer stops the session.
|
|
1596
1651
|
|
|
1597
1652
|
Skill, command and agent definitions are shared with other hosts through `.claude`, and those hosts
|
|
1598
|
-
define fields of their own. The frontmatter decoder now validates only the fields
|
|
1653
|
+
define fields of their own. The frontmatter decoder now validates only the fields Robota owns and
|
|
1599
1654
|
ignores the rest (nested `metadata` entries included); a malformed value of an owned field is still
|
|
1600
1655
|
refused. A refused file is skipped with a single warning and still claims its name, so a
|
|
1601
1656
|
lower-priority definition cannot stand in for it. An empty `argument-hint` reads as no hint. When
|
|
@@ -1621,7 +1676,7 @@
|
|
|
1621
1676
|
existing `presets` + `defaultPresetId` shape behaves exactly as before.
|
|
1622
1677
|
- **`@robota-sdk/agent-cli`** — `resolveCliPreset` is replaced by `resolveShellPreset(externalPresets,
|
|
1623
1678
|
args, settingsPreset)`, which builds the per-call registry, resolves over it, and returns
|
|
1624
|
-
`{ registry, presetId, context, options }` as one value. `
|
|
1679
|
+
`{ registry, presetId, context, options }` as one value. `createSelectedProductProfile` takes that whole value,
|
|
1625
1680
|
so the shell cannot hand the kernel a registry, id, or override context other than the ones it actually
|
|
1626
1681
|
resolved with. `robota`'s startup path no longer reads `agent-preset`'s module-global resolver; that
|
|
1627
1682
|
registry remains only as the in-session `/preset` DISCOVERY surface, which is executed inside the
|
|
@@ -1629,7 +1684,7 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
1629
1684
|
`loadExternalPresets()` call, so they cannot disagree.
|
|
1630
1685
|
|
|
1631
1686
|
End-user `robota` behavior is unchanged: the same preset resolves to the same options, external presets
|
|
1632
|
-
in
|
|
1687
|
+
in `$PRODUCT_USER_STATE_DIR/presets/*.json` remain visible to both `--preset <id>` and `/preset`, and the assembled
|
|
1633
1688
|
command-module set, provider surface, tool set, subagent roster, and permission posture are untouched.
|
|
1634
1689
|
|
|
1635
1690
|
- e82215f: **ARCH-011: replace the ambiguous transport lifecycle stub with executable conformance.**
|
|
@@ -1653,7 +1708,7 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
1653
1708
|
|
|
1654
1709
|
- 0c07176: **BREAKING — ARCH-021: child-process subagents compose the PRODUCT's surface, not imported defaults.**
|
|
1655
1710
|
|
|
1656
|
-
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
|
|
1711
|
+
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.
|
|
1657
1712
|
|
|
1658
1713
|
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.
|
|
1659
1714
|
|
|
@@ -1758,7 +1813,7 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
1758
1813
|
}
|
|
1759
1814
|
```
|
|
1760
1815
|
|
|
1761
|
-
`IChildProcessSubagentRunnerOptions.workerPath` → **`workerEntry`**, and the runner `spawn`s `execPath args… --
|
|
1816
|
+
`IChildProcessSubagentRunnerOptions.workerPath` → **`workerEntry`**, and the runner `spawn`s `execPath args… --__agent-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.
|
|
1762
1817
|
|
|
1763
1818
|
**Per package, classified against each barrel:**
|
|
1764
1819
|
|
|
@@ -1773,13 +1828,13 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
1773
1828
|
**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.
|
|
1774
1829
|
|
|
1775
1830
|
- 1e40b5b: Move handoff source/destination orchestration and its contract from agent-framework to the session-mobility owner. Import `HandoffSource`, `HandoffDestination`, and their option types from `@robota-sdk/agent-interface-session-mobility`. Mobility now applies offer and authority decisions directly, while the CLI supplies wire effects and the session-record decoder. A successful offer no longer returns a mutable authority transaction.
|
|
1776
|
-
- f3fe3db: The terminal renderer no longer reads `
|
|
1777
|
-
`
|
|
1831
|
+
- f3fe3db: The terminal renderer no longer reads `PRODUCT_SCREEN_READER_STARTUP_QUIET_MS` or
|
|
1832
|
+
`PRODUCT_SCREEN_READER_PREPARK_MS` from the process environment. SDK hosts calling `renderApp`
|
|
1778
1833
|
directly should pass raw timing choices and diagnostic labels through the new optional
|
|
1779
1834
|
`screenReaderPacing` render option. Without it, the renderer uses its existing 900 ms startup
|
|
1780
1835
|
quiet period and 50 ms pre-write park when screen-reader mode is enabled. The Robota CLI still
|
|
1781
1836
|
reads the same environment variables and preserves their validation, bounds, and warnings.
|
|
1782
|
-
- 724d5b6: The terminal renderer no longer reads `
|
|
1837
|
+
- 724d5b6: The terminal renderer no longer reads `PRODUCT_IME_CURSOR` or `PRODUCT_TURN_MARKS` from the process environment. SDK hosts calling `renderApp` directly should pass cursor and turn-mark choices through the optional `terminalCapabilities` render option. Without a host choice, the renderer keeps its terminal and TTY defaults. The Robota CLI still reads both environment variables and preserves its exact `1` and `0` overrides.
|
|
1783
1838
|
- c6c56a6: Move the concrete `GitWorktreeIsolationAdapter` (git CLI + filesystem I/O) out of the reusable
|
|
1784
1839
|
`@robota-sdk/agent-executor` runtime-primitives package into the `@robota-sdk/agent-cli` composition
|
|
1785
1840
|
root, restoring the executor's "creates no Git worktrees" boundary (ARL-02 / ARCH-FIX-024, INFRA-031).
|
|
@@ -1793,18 +1848,18 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
1793
1848
|
|
|
1794
1849
|
- 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:
|
|
1795
1850
|
|
|
1796
|
-
- `agent-session`: `ISessionOptions.contextCapacityHint` is forwarded into the
|
|
1851
|
+
- `agent-session`: `ISessionOptions.contextCapacityHint` is forwarded into the agent configuration factory, making the core seam reachable from the consuming layer.
|
|
1797
1852
|
- `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.
|
|
1798
1853
|
- `agent-cli`: the default command set registers `/compact`, so end users regain the actionable hint.
|
|
1799
1854
|
- `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.
|
|
1800
1855
|
|
|
1801
|
-
- 796ddb4: Use a neutral default MCP client name and let hosts supply their own protocol identity. Robota CLI startup now explicitly supplies its prior `
|
|
1856
|
+
- 796ddb4: Use a neutral default MCP client name and let hosts supply their own protocol identity. Robota CLI startup now explicitly supplies its prior `Robota-agent-mcp` name, preserving its initialize handshake; embedders relying on that implicit name can set `clientInfo` explicitly.
|
|
1802
1857
|
- e13c30c: MCP servers now publish a neutral submission tool by default. Hosts that need the previous
|
|
1803
|
-
`
|
|
1858
|
+
`PRODUCT_submit` tool must pass `submitTool: { name: 'PRODUCT_submit', description: '...' }` to
|
|
1804
1859
|
`createAgentMcpServer`, `createMcpTransport`, or `createMcpHttpHost`. The Robota CLI supplies its
|
|
1805
1860
|
existing name and description for both stdio and HTTP carriers.
|
|
1806
1861
|
- 90e7a10: The default background observer warning code and exported `OBSERVER_FAILURE_WARNING_CODE` value
|
|
1807
|
-
change from `
|
|
1862
|
+
change from `PRODUCT_BACKGROUND_OBSERVER_FAILURE` to `BACKGROUND_OBSERVER_FAILURE`. Hosts matching
|
|
1808
1863
|
the old warning code should match the new neutral code or provide `observerFailureWarningCode` in
|
|
1809
1864
|
their background manager or session options. The Robota CLI supplies its existing code explicitly
|
|
1810
1865
|
across print, goal, serve, MCP, and TUI sessions.
|
|
@@ -1861,7 +1916,7 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
1861
1916
|
fragment-injected `spa/remote.html` static entry, and the REMOTE-007 permission/ask render+answer
|
|
1862
1917
|
(the paired owner answers its own prompts — local == remote) shared by both the WS and RTC clients. It
|
|
1863
1918
|
reuses the isomorphic `@robota-sdk/agent-remote-pairing` leaf and takes no node/werift dependency.
|
|
1864
|
-
`agent-cli` removes the fabricated `
|
|
1919
|
+
`agent-cli` removes the fabricated `Robota-remote://pair` client-URL default and fails closed when
|
|
1865
1920
|
`transports.webrtc.options.clientUrl` is unset (no dead link).
|
|
1866
1921
|
|
|
1867
1922
|
(Bump targets corrected during REL-023 triage: `@robota-sdk/agent-web-ui` was dissolved by GUI-006 (#1141, 2026-07-12) before this work was ever published; the browser client described here now lives in `@robota-sdk/agent-transport-webrtc-web` + `@robota-sdk/agent-remote-client`.)
|
|
@@ -1979,7 +2034,7 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
1979
2034
|
|
|
1980
2035
|
- **Preset system (PRESET-001~017):** new `@robota-sdk/agent-preset` package layering framework
|
|
1981
2036
|
assembly options into named, selectable profiles (`default`, `autonomous-builder`, `careful-reviewer`,
|
|
1982
|
-
`neutral-executor`) plus user-authored external presets loaded from
|
|
2037
|
+
`neutral-executor`) plus user-authored external presets loaded from `$PRODUCT_USER_STATE_DIR/presets/*.json`.
|
|
1983
2038
|
- **Live preset switching:** `/preset` command (list + active marker + switch) and a TUI active-preset
|
|
1984
2039
|
display. Switching live re-applies permission posture, model/effort, persona, command-module
|
|
1985
2040
|
selection, parallel-subagents gating, and a self-verification system-prompt section via the single
|
|
@@ -2330,7 +2385,7 @@ args, settingsPreset)`, which builds the per-call registry, resolves over it, an
|
|
|
2330
2385
|
|
|
2331
2386
|
### Patch Changes
|
|
2332
2387
|
|
|
2333
|
-
- Refresh package docs and
|
|
2388
|
+
- Refresh package docs and Robota.io content for the beta 57 feature set.
|
|
2334
2389
|
- Updated dependencies
|
|
2335
2390
|
- @robota-sdk/agent-command-agent@3.0.0-beta.58
|
|
2336
2391
|
- @robota-sdk/agent-core@3.0.0-beta.58
|