@robota-sdk/agent-transport 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,30 @@
1
1
  # @robota-sdk/agent-transport
2
2
 
3
+ ## 3.0.0-beta.87
4
+
5
+ ### Patch Changes
6
+
7
+ - 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.
8
+ - Updated dependencies
9
+ - Updated dependencies [66af868]
10
+ - Updated dependencies [7d9cc66]
11
+ - Updated dependencies [7d9cc66]
12
+ - Updated dependencies [7d9cc66]
13
+ - Updated dependencies [7d9cc66]
14
+ - Updated dependencies [7d9cc66]
15
+ - Updated dependencies [7d9cc66]
16
+ - Updated dependencies [7d9cc66]
17
+ - Updated dependencies [7d9cc66]
18
+ - Updated dependencies [7d9cc66]
19
+ - Updated dependencies [7d9cc66]
20
+ - @robota-sdk/agent-core@3.0.0-beta.87
21
+ - @robota-sdk/agent-interface-analytics@3.0.0-beta.87
22
+ - @robota-sdk/agent-interface-command@3.0.0-beta.87
23
+ - @robota-sdk/agent-interface-execution@3.0.0-beta.87
24
+ - @robota-sdk/agent-interface-session@3.0.0-beta.87
25
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.87
26
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.87
27
+
3
28
  ## 3.0.0-beta.86
4
29
 
5
30
  ### Patch Changes
@@ -99,7 +124,7 @@
99
124
  - Session notices keep only `session-error` and `protocol-error`.
100
125
  - The state gains `commandCatalog` and `sessionStatus`.
101
126
  - `agent-command` registers `/theme` and `/keybindings` even without a terminal. They then answer
102
- that they belong to the robota terminal, instead of being unknown.
127
+ that they belong to the Robota terminal, instead of being unknown.
103
128
  - `agent-framework`:
104
129
  - `InteractiveSession.getStatusSnapshot()`.
105
130
  - The main-thread row previews the last chat message instead of the last record's type.
@@ -323,7 +348,7 @@
323
348
  The tool reaches only files inside the workspace whose path does not look like it holds secrets
324
349
  (`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
325
350
  - The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
326
- under `~/.robota/peer-files/<sender>/`. It is never run and never placed in the model's context.
351
+ under `$PRODUCT_USER_STATE_DIR/peer-files/<sender>/`. It is never run and never placed in the model's context.
327
352
  The conversation is told only its name, size and sha256. A name that leaves that directory is
328
353
  refused, a symbolic link is never written through, and nothing is overwritten.
329
354
  - Transfers travel on a channel of their own (a separate connection on this host, a separate data
@@ -479,7 +504,7 @@
479
504
  project/user definitions > injected > built-in. `AgentDefinitionLoader` now dedupes within that tier
480
505
  (first wins). Absent ⇒ unchanged behavior.
481
506
  - **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
482
- `agentDefinitions` through the headless and TUI channels so every robota surface carries the seam.
507
+ `agentDefinitions` through the headless and TUI channels so every Robota surface carries the seam.
483
508
  - **`@robota-sdk/agent-cli`** — `robota`'s identity (branding, provider surface, presets,
484
509
  `packs: [codingPack]`, base command modules, injected transports/runners/subagent factory) is declared as
485
510
  data in a product profile and folded by `assembleProduct`. The coding command modules (`/shell`,
@@ -493,7 +518,7 @@
493
518
  autocomplete popup rather than mid-list, because they arrive from `pack-coding` and both surfaces render in
494
519
  module-insertion order. Same commands, same behavior, different position.
495
520
 
496
- - 0116a29: ARCH-006 completion — robota's capability packs now OWN its tool surface, and `pack-coding` is built by a
521
+ - 0116a29: ARCH-006 completion — Robota's capability packs now OWN its tool surface, and `pack-coding` is built by a
497
522
  context-bound factory.
498
523
 
499
524
  - **`@robota-sdk/pack-coding` (BREAKING)** — the module-level `codingPack` constant is **removed** and
@@ -507,9 +532,9 @@
507
532
  products in one process get independently-scoped file tools. Migration: replace `codingPack` with
508
533
  `createCodingPack({ cwd: process.cwd() })`.
509
534
  - **`@robota-sdk/agent-cli`** — `robota`'s packs are built from the shell's resolved `cwd`
510
- (`createRobotaPacks({ cwd })`) before command setup, and the runtime seam passes
511
- `ROBOTA_PACKS_OWN_TOOL_SURFACE` (an empty `defaultTools`) so the framework's `createDefaultTools()` tier
512
- is REPLACED. Every tool robota runs now arrives from a capability pack: dropping a pack drops its tools,
535
+ (`createProductCapabilityPacks({ cwd })`) before command setup, and the runtime seam passes
536
+ `PRODUCT_PACKS_OWN_TOOL_SURFACE` (an empty `defaultTools`) so the framework's `createDefaultTools()` tier
537
+ is REPLACED. Every tool Robota runs now arrives from a capability pack: dropping a pack drops its tools,
513
538
  exactly as it already dropped its command modules and subagents.
514
539
  - **`@robota-sdk/agent-transport` / `@robota-sdk/agent-transport-tui`** — forward the optional
515
540
  `additionalTools` and `defaultTools` through the headless and TUI channels, mirroring the existing
@@ -539,7 +564,7 @@
539
564
  branch events through protocol transports, and render deterministic bounded notices in the TUI.
540
565
  Transport-owned delivery failures now enter the owning carrier cleanup lifecycle without reversing
541
566
  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 `.robota/` under cwd — a race a caller (or a test's cleanup) could lose (`ENOTEMPTY`). Each run now also emits exactly one terminal record. No change to exit codes or output shape.
567
+ - 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
568
  - 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
569
  - Updated dependencies [9c19c50]
545
570
  - Updated dependencies [7b6234c]
@@ -673,7 +698,7 @@
673
698
 
674
699
  - **Preset system (PRESET-001~017):** new `@robota-sdk/agent-preset` package layering framework
675
700
  assembly options into named, selectable profiles (`default`, `autonomous-builder`, `careful-reviewer`,
676
- `neutral-executor`) plus user-authored external presets loaded from `~/.robota/presets/*.json`.
701
+ `neutral-executor`) plus user-authored external presets loaded from `$PRODUCT_USER_STATE_DIR/presets/*.json`.
677
702
  - **Live preset switching:** `/preset` command (list + active marker + switch) and a TUI active-preset
678
703
  display. Switching live re-applies permission posture, model/effort, persona, command-module
679
704
  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 Robota transport. It defines the transport-neutral wire messages
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.86",
3
+ "version": "3.0.0-beta.87",
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.86",
93
- "@robota-sdk/agent-interface-analytics": "3.0.0-beta.86",
94
- "@robota-sdk/agent-interface-command": "3.0.0-beta.86",
95
- "@robota-sdk/agent-interface-execution": "3.0.0-beta.86",
96
- "@robota-sdk/agent-interface-session": "3.0.0-beta.86",
97
- "@robota-sdk/agent-interface-session-mobility": "3.0.0-beta.86",
98
- "@robota-sdk/agent-interface-transport": "3.0.0-beta.86"
83
+ "@robota-sdk/agent-interface-analytics": "3.0.0-beta.87",
84
+ "@robota-sdk/agent-interface-command": "3.0.0-beta.87",
85
+ "@robota-sdk/agent-interface-execution": "3.0.0-beta.87",
86
+ "@robota-sdk/agent-interface-session": "3.0.0-beta.87",
87
+ "@robota-sdk/agent-core": "3.0.0-beta.87",
88
+ "@robota-sdk/agent-interface-transport": "3.0.0-beta.87",
89
+ "@robota-sdk/agent-interface-session-mobility": "3.0.0-beta.87"
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://robota.example/hooks/events/ci',
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://robota.example/.well-known/oauth-protected-resource/hooks/events/ci';
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://robota.example',
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://robota.example/hooks',
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: 'robota.example' }), ok.res)).toBe(true);
102
+ expect(server.checkNames(request({ host: 'agent.example.invalid' }), ok.res)).toBe(true);
103
103
  expect(
104
104
  server.checkNames(
105
- request({ host: 'robota.example:443', origin: 'https://robota.example' }),
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: 'robota.example' }, '203.0.113.9');
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: '.robota/memory/MEMORY.md', truncated: false },
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@robota', enabled: false },
632
+ { field: 'pluginEnabled', pluginId: 'formatter@fixture-agent', enabled: false },
633
633
  { field: 'reloadPlugins' },
634
- { field: 'installPlugin', pluginId: 'linter@robota' },
635
- { field: 'uninstallPlugin', pluginId: 'formatter@robota' },
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@robota', enabled: true },
180
+ { field: 'pluginEnabled', pluginId: 'formatter@fixture-agent', enabled: true },
181
181
  { field: 'reloadPlugins' },
182
- { field: 'installPlugin', pluginId: 'linter@robota' },
183
- { field: 'uninstallPlugin', pluginId: 'formatter@robota' },
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 });