@robota-sdk/agent-transport 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
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# @robota-sdk/agent-transport
|
|
2
2
|
|
|
3
|
+
## 3.0.0-beta.88
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @robota-sdk/agent-core@3.0.0-beta.88
|
|
8
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.88
|
|
9
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.88
|
|
10
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.88
|
|
11
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.88
|
|
12
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.88
|
|
13
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.88
|
|
14
|
+
|
|
15
|
+
## 3.0.0-beta.87
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- 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.
|
|
20
|
+
- Updated dependencies
|
|
21
|
+
- Updated dependencies [66af868]
|
|
22
|
+
- Updated dependencies [7d9cc66]
|
|
23
|
+
- Updated dependencies [7d9cc66]
|
|
24
|
+
- Updated dependencies [7d9cc66]
|
|
25
|
+
- Updated dependencies [7d9cc66]
|
|
26
|
+
- Updated dependencies [7d9cc66]
|
|
27
|
+
- Updated dependencies [7d9cc66]
|
|
28
|
+
- Updated dependencies [7d9cc66]
|
|
29
|
+
- Updated dependencies [7d9cc66]
|
|
30
|
+
- Updated dependencies [7d9cc66]
|
|
31
|
+
- Updated dependencies [7d9cc66]
|
|
32
|
+
- @robota-sdk/agent-core@3.0.0-beta.87
|
|
33
|
+
- @robota-sdk/agent-interface-analytics@3.0.0-beta.87
|
|
34
|
+
- @robota-sdk/agent-interface-command@3.0.0-beta.87
|
|
35
|
+
- @robota-sdk/agent-interface-execution@3.0.0-beta.87
|
|
36
|
+
- @robota-sdk/agent-interface-session@3.0.0-beta.87
|
|
37
|
+
- @robota-sdk/agent-interface-session-mobility@3.0.0-beta.87
|
|
38
|
+
- @robota-sdk/agent-interface-transport@3.0.0-beta.87
|
|
39
|
+
|
|
3
40
|
## 3.0.0-beta.86
|
|
4
41
|
|
|
5
42
|
### Patch Changes
|
|
@@ -99,7 +136,7 @@
|
|
|
99
136
|
- Session notices keep only `session-error` and `protocol-error`.
|
|
100
137
|
- The state gains `commandCatalog` and `sessionStatus`.
|
|
101
138
|
- `agent-command` registers `/theme` and `/keybindings` even without a terminal. They then answer
|
|
102
|
-
that they belong to the
|
|
139
|
+
that they belong to the Robota terminal, instead of being unknown.
|
|
103
140
|
- `agent-framework`:
|
|
104
141
|
- `InteractiveSession.getStatusSnapshot()`.
|
|
105
142
|
- The main-thread row previews the last chat message instead of the last record's type.
|
|
@@ -323,7 +360,7 @@
|
|
|
323
360
|
The tool reaches only files inside the workspace whose path does not look like it holds secrets
|
|
324
361
|
(`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
|
|
325
362
|
- The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
|
|
326
|
-
under
|
|
363
|
+
under `$PRODUCT_USER_STATE_DIR/peer-files/<sender>/`. It is never run and never placed in the model's context.
|
|
327
364
|
The conversation is told only its name, size and sha256. A name that leaves that directory is
|
|
328
365
|
refused, a symbolic link is never written through, and nothing is overwritten.
|
|
329
366
|
- Transfers travel on a channel of their own (a separate connection on this host, a separate data
|
|
@@ -479,7 +516,7 @@
|
|
|
479
516
|
project/user definitions > injected > built-in. `AgentDefinitionLoader` now dedupes within that tier
|
|
480
517
|
(first wins). Absent ⇒ unchanged behavior.
|
|
481
518
|
- **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
|
|
482
|
-
`agentDefinitions` through the headless and TUI channels so every
|
|
519
|
+
`agentDefinitions` through the headless and TUI channels so every Robota surface carries the seam.
|
|
483
520
|
- **`@robota-sdk/agent-cli`** — `robota`'s identity (branding, provider surface, presets,
|
|
484
521
|
`packs: [codingPack]`, base command modules, injected transports/runners/subagent factory) is declared as
|
|
485
522
|
data in a product profile and folded by `assembleProduct`. The coding command modules (`/shell`,
|
|
@@ -493,7 +530,7 @@
|
|
|
493
530
|
autocomplete popup rather than mid-list, because they arrive from `pack-coding` and both surfaces render in
|
|
494
531
|
module-insertion order. Same commands, same behavior, different position.
|
|
495
532
|
|
|
496
|
-
- 0116a29: ARCH-006 completion —
|
|
533
|
+
- 0116a29: ARCH-006 completion — Robota's capability packs now OWN its tool surface, and `pack-coding` is built by a
|
|
497
534
|
context-bound factory.
|
|
498
535
|
|
|
499
536
|
- **`@robota-sdk/pack-coding` (BREAKING)** — the module-level `codingPack` constant is **removed** and
|
|
@@ -507,9 +544,9 @@
|
|
|
507
544
|
products in one process get independently-scoped file tools. Migration: replace `codingPack` with
|
|
508
545
|
`createCodingPack({ cwd: process.cwd() })`.
|
|
509
546
|
- **`@robota-sdk/agent-cli`** — `robota`'s packs are built from the shell's resolved `cwd`
|
|
510
|
-
(`
|
|
511
|
-
`
|
|
512
|
-
is REPLACED. Every tool
|
|
547
|
+
(`createProductCapabilityPacks({ cwd })`) before command setup, and the runtime seam passes
|
|
548
|
+
`PRODUCT_PACKS_OWN_TOOL_SURFACE` (an empty `defaultTools`) so the framework's `createDefaultTools()` tier
|
|
549
|
+
is REPLACED. Every tool Robota runs now arrives from a capability pack: dropping a pack drops its tools,
|
|
513
550
|
exactly as it already dropped its command modules and subagents.
|
|
514
551
|
- **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
|
|
515
552
|
`additionalTools` and `defaultTools` through the headless and TUI channels, mirroring the existing
|
|
@@ -539,7 +576,7 @@
|
|
|
539
576
|
branch events through protocol transports, and render deterministic bounded notices in the TUI.
|
|
540
577
|
Transport-owned delivery failures now enter the owning carrier cleanup lifecycle without reversing
|
|
541
578
|
an already-committed session operation.
|
|
542
|
-
- 3244fb8: Fix a headless-run race (CI-001): the headless runner now resolves its exit code only AFTER the underlying `session.submit()` operation has fully settled, not off the terminal `complete`/`interrupted`/`error` event alone. Those events fire from inside the turn, BEFORE the turn's awaited `finally` runs session persistence / checkpoint finalize, so `run()`/`start()` previously returned while the session was still writing
|
|
579
|
+
- 3244fb8: Fix a headless-run race (CI-001): the headless runner now resolves its exit code only AFTER the underlying `session.submit()` operation has fully settled, not off the terminal `complete`/`interrupted`/`error` event alone. Those events fire from inside the turn, BEFORE the turn's awaited `finally` runs session persistence / checkpoint finalize, so `run()`/`start()` previously returned while the session was still writing `$PRODUCT_PROJECT_STATE_DIR/` under cwd — a race a caller (or a test's cleanup) could lose (`ENOTEMPTY`). Each run now also emits exactly one terminal record. No change to exit codes or output shape.
|
|
543
580
|
- 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).
|
|
544
581
|
- Updated dependencies [9c19c50]
|
|
545
582
|
- Updated dependencies [7b6234c]
|
|
@@ -673,7 +710,7 @@
|
|
|
673
710
|
|
|
674
711
|
- **Preset system (PRESET-001~017):** new `@robota-sdk/agent-preset` package layering framework
|
|
675
712
|
assembly options into named, selectable profiles (`default`, `autonomous-builder`, `careful-reviewer`,
|
|
676
|
-
`neutral-executor`) plus user-authored external presets loaded from
|
|
713
|
+
`neutral-executor`) plus user-authored external presets loaded from `$PRODUCT_USER_STATE_DIR/presets/*.json`.
|
|
677
714
|
- **Live preset switching:** `/preset` command (list + active marker + switch) and a TUI active-preset
|
|
678
715
|
display. Switching live re-applies permission posture, model/effort, persona, command-module
|
|
679
716
|
selection, parallel-subagents gating, and a self-verification system-prompt section via the single
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @robota-sdk/agent-transport
|
|
2
2
|
|
|
3
|
-
The shared protocol layer under every
|
|
3
|
+
The shared protocol layer under every agent runtime transport. It defines the transport-neutral wire messages
|
|
4
4
|
(`TClientMessage` / `TServerMessage`), the session bridge that turns those messages into calls on a live
|
|
5
5
|
session, and the delivery helpers a carrier needs (backpressure, resumable delivery, channel framing,
|
|
6
6
|
handoff payload chunking). The WebSocket and WebRTC transports carry its wire protocol, and the HTTP and
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robota-sdk/agent-transport",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.88",
|
|
4
4
|
"description": "Carrier-neutral wire protocol, session dispatch and delivery for Robota SDK transports",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/node/index.js",
|
|
@@ -70,15 +70,6 @@
|
|
|
70
70
|
},
|
|
71
71
|
"./package.json": "./package.json"
|
|
72
72
|
},
|
|
73
|
-
"repository": {
|
|
74
|
-
"type": "git",
|
|
75
|
-
"url": "https://github.com/woojubb/robota.git",
|
|
76
|
-
"directory": "packages/agent-transport"
|
|
77
|
-
},
|
|
78
|
-
"homepage": "https://docs.robota.io/en/packages/agent-transport/",
|
|
79
|
-
"bugs": {
|
|
80
|
-
"url": "https://github.com/woojubb/robota/issues"
|
|
81
|
-
},
|
|
82
73
|
"engines": {
|
|
83
74
|
"node": ">=22.12.0"
|
|
84
75
|
},
|
|
@@ -89,13 +80,13 @@
|
|
|
89
80
|
],
|
|
90
81
|
"dependencies": {
|
|
91
82
|
"jose": "6.2.3",
|
|
92
|
-
"@robota-sdk/agent-core": "3.0.0-beta.
|
|
93
|
-
"@robota-sdk/agent-interface-analytics": "3.0.0-beta.
|
|
94
|
-
"@robota-sdk/agent-interface-command": "3.0.0-beta.
|
|
95
|
-
"@robota-sdk/agent-interface-execution": "3.0.0-beta.
|
|
96
|
-
"@robota-sdk/agent-interface-session": "3.0.0-beta.
|
|
97
|
-
"@robota-sdk/agent-interface-session-mobility": "3.0.0-beta.
|
|
98
|
-
"@robota-sdk/agent-interface-transport": "3.0.0-beta.
|
|
83
|
+
"@robota-sdk/agent-core": "3.0.0-beta.88",
|
|
84
|
+
"@robota-sdk/agent-interface-analytics": "3.0.0-beta.88",
|
|
85
|
+
"@robota-sdk/agent-interface-command": "3.0.0-beta.88",
|
|
86
|
+
"@robota-sdk/agent-interface-execution": "3.0.0-beta.88",
|
|
87
|
+
"@robota-sdk/agent-interface-session": "3.0.0-beta.88",
|
|
88
|
+
"@robota-sdk/agent-interface-session-mobility": "3.0.0-beta.88",
|
|
89
|
+
"@robota-sdk/agent-interface-transport": "3.0.0-beta.88"
|
|
99
90
|
},
|
|
100
91
|
"devDependencies": {
|
|
101
92
|
"rimraf": "^5.0.10",
|
|
@@ -111,6 +102,14 @@
|
|
|
111
102
|
"volta": {
|
|
112
103
|
"extends": "../../package.json"
|
|
113
104
|
},
|
|
105
|
+
"repository": {
|
|
106
|
+
"type": "git",
|
|
107
|
+
"url": "https://github.com/woojubb/robota"
|
|
108
|
+
},
|
|
109
|
+
"bugs": {
|
|
110
|
+
"url": "https://github.com/woojubb/robota/issues"
|
|
111
|
+
},
|
|
112
|
+
"homepage": "https://robota.io/",
|
|
114
113
|
"scripts": {
|
|
115
114
|
"build": "rimraf dist && tsdown",
|
|
116
115
|
"build:js": "pnpm run build",
|
|
@@ -26,13 +26,13 @@ function response() {
|
|
|
26
26
|
describe('shared bearer resource-server gate', () => {
|
|
27
27
|
it('places the RFC 9728 metadata before the resource path and points every challenge at it', () => {
|
|
28
28
|
const resource = describeProtectedResource({
|
|
29
|
-
resource: 'https://
|
|
29
|
+
resource: 'https://agent.example.invalid/hooks/events/ci',
|
|
30
30
|
issuer: 'https://auth.example',
|
|
31
31
|
scopes: ['a', 'b'],
|
|
32
32
|
label: 'Test',
|
|
33
33
|
});
|
|
34
34
|
expect(resource.wellKnownPath).toBe('/.well-known/oauth-protected-resource/hooks/events/ci');
|
|
35
|
-
const metadata = 'https://
|
|
35
|
+
const metadata = 'https://agent.example.invalid/.well-known/oauth-protected-resource/hooks/events/ci';
|
|
36
36
|
expect(resource.challenges).toEqual({
|
|
37
37
|
missing: `Bearer resource_metadata="${metadata}"`,
|
|
38
38
|
invalid: `Bearer error="invalid_token", resource_metadata="${metadata}"`,
|
|
@@ -42,7 +42,7 @@ describe('shared bearer resource-server gate', () => {
|
|
|
42
42
|
|
|
43
43
|
it('believes X-Forwarded-For only from a trusted proxy, and only its rightmost untrusted hop', () => {
|
|
44
44
|
const server = createBearerResourceServer({
|
|
45
|
-
publicUrl: 'https://
|
|
45
|
+
publicUrl: 'https://agent.example.invalid',
|
|
46
46
|
trustedProxies: ['127.0.0.1', '10.0.0.2'],
|
|
47
47
|
label: 'Test',
|
|
48
48
|
});
|
|
@@ -94,22 +94,22 @@ describe('shared bearer resource-server gate', () => {
|
|
|
94
94
|
it('checks Host and Origin against the public URL and counts only the failures it is told of', () => {
|
|
95
95
|
let clock = 0;
|
|
96
96
|
const server = createBearerResourceServer({
|
|
97
|
-
publicUrl: 'https://
|
|
97
|
+
publicUrl: 'https://agent.example.invalid/hooks',
|
|
98
98
|
label: 'Test',
|
|
99
99
|
now: () => clock,
|
|
100
100
|
});
|
|
101
101
|
const ok = response();
|
|
102
|
-
expect(server.checkNames(request({ host: '
|
|
102
|
+
expect(server.checkNames(request({ host: 'agent.example.invalid' }), ok.res)).toBe(true);
|
|
103
103
|
expect(
|
|
104
104
|
server.checkNames(
|
|
105
|
-
request({ host: '
|
|
105
|
+
request({ host: 'agent.example.invalid:443', origin: 'https://agent.example.invalid' }),
|
|
106
106
|
ok.res,
|
|
107
107
|
),
|
|
108
108
|
).toBe(true);
|
|
109
109
|
const bad = response();
|
|
110
110
|
expect(server.checkNames(request({ host: '127.0.0.1' }), bad.res)).toBe(false);
|
|
111
111
|
expect(bad.written.status).toBe(403);
|
|
112
|
-
const peer = request({ host: '
|
|
112
|
+
const peer = request({ host: 'agent.example.invalid' }, '203.0.113.9');
|
|
113
113
|
let last = server.fail(peer);
|
|
114
114
|
for (let index = 1; index < 21; index += 1) last = server.fail(peer);
|
|
115
115
|
expect(last).toMatchObject({ remote: 'public', throttled: true });
|
|
@@ -255,7 +255,7 @@ const SERVER_SAMPLES: Readonly<Record<TServerMessage['type'], TServerMessage>> =
|
|
|
255
255
|
project_memory: {
|
|
256
256
|
type: 'project_memory',
|
|
257
257
|
requestId: 'project-memory-1',
|
|
258
|
-
result: { kind: 'memory', content: '# Memory', path: '.
|
|
258
|
+
result: { kind: 'memory', content: '# Memory', path: '.fixture-state/memory/MEMORY.md', truncated: false },
|
|
259
259
|
},
|
|
260
260
|
background_task_event: { type: 'background_task_event', event: {} as never },
|
|
261
261
|
background_job_group_event: { type: 'background_job_group_event', event: {} as never },
|
|
@@ -629,10 +629,10 @@ describe('decodeClientMessage (issue #2045)', () => {
|
|
|
629
629
|
it.each([
|
|
630
630
|
{ field: 'mcpServerEnabled', serverId: 'docs', enabled: true },
|
|
631
631
|
{ field: 'reloadMcpServers' },
|
|
632
|
-
{ field: 'pluginEnabled', pluginId: 'formatter@
|
|
632
|
+
{ field: 'pluginEnabled', pluginId: 'formatter@fixture-agent', enabled: false },
|
|
633
633
|
{ field: 'reloadPlugins' },
|
|
634
|
-
{ field: 'installPlugin', pluginId: 'linter@
|
|
635
|
-
{ field: 'uninstallPlugin', pluginId: 'formatter@
|
|
634
|
+
{ field: 'installPlugin', pluginId: 'linter@fixture-agent' },
|
|
635
|
+
{ field: 'uninstallPlugin', pluginId: 'formatter@fixture-agent' },
|
|
636
636
|
] as const)('accepts the $field settings patch (#3282 §4 part b-2)', (patch) => {
|
|
637
637
|
const message = { type: 'update-settings' as const, requestId: 'r', patch };
|
|
638
638
|
expect(decodeClientMessage(JSON.parse(JSON.stringify(message)))).toEqual({
|
|
@@ -177,10 +177,10 @@ describe('settings messages (#3282 §4a)', () => {
|
|
|
177
177
|
it.each([
|
|
178
178
|
{ field: 'mcpServerEnabled', serverId: 'docs', enabled: false },
|
|
179
179
|
{ field: 'reloadMcpServers' },
|
|
180
|
-
{ field: 'pluginEnabled', pluginId: 'formatter@
|
|
180
|
+
{ field: 'pluginEnabled', pluginId: 'formatter@fixture-agent', enabled: true },
|
|
181
181
|
{ field: 'reloadPlugins' },
|
|
182
|
-
{ field: 'installPlugin', pluginId: 'linter@
|
|
183
|
-
{ field: 'uninstallPlugin', pluginId: 'formatter@
|
|
182
|
+
{ field: 'installPlugin', pluginId: 'linter@fixture-agent' },
|
|
183
|
+
{ field: 'uninstallPlugin', pluginId: 'formatter@fixture-agent' },
|
|
184
184
|
] as const)('round-trips the $field patch through the reporter', async (patch) => {
|
|
185
185
|
const reporter = createReporter();
|
|
186
186
|
const client = attach({ reporter });
|