@pellux/goodvibes-agent 0.1.66 → 0.1.68
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 +14 -2
- package/README.md +4 -12
- package/docs/README.md +2 -4
- package/docs/deployment-and-services.md +3 -9
- package/docs/getting-started.md +2 -2
- package/docs/release-and-publishing.md +2 -2
- package/package.json +1 -1
- package/src/cli/completion.ts +0 -9
- package/src/cli/package-verification.ts +4 -0
- package/src/input/commands/experience-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +15 -19
- package/src/input/commands/remote-runtime.ts +6 -6
- package/src/panels/provider-health-domains.ts +2 -2
- package/src/panels/remote-panel.ts +11 -11
- package/src/panels/session-browser-panel.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src/tools/wrfc-agent-guard.ts +1 -1
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GoodVibes Agent will be recorded here.
|
|
4
4
|
|
|
5
|
+
## 0.1.68 - 2026-05-31
|
|
6
|
+
|
|
7
|
+
- Removed internal foundation-phase language and blocked lifecycle command examples from package-facing docs.
|
|
8
|
+
- Stopped advertising runtime lifecycle and surface-management commands in shell completion while keeping safety blocks for accidental invocations.
|
|
9
|
+
- Added package text guards so shipped docs stay focused on the Agent TUI product path.
|
|
10
|
+
|
|
11
|
+
## 0.1.67 - 2026-05-31
|
|
12
|
+
|
|
13
|
+
- Reworked remote bridge and remote review language from copied runner/control-room wording to Agent-facing worker/review wording.
|
|
14
|
+
- Made bridge worker assignment read-only in Agent and removed hidden contract creation from remote show/contract paths.
|
|
15
|
+
- Added regressions around the remote worker review panel and bridge command wording.
|
|
16
|
+
|
|
5
17
|
## 0.1.66 - 2026-05-31
|
|
6
18
|
|
|
7
19
|
- Removed remote-runner and node/device posture wording from first-run Agent setup surfaces.
|
|
@@ -371,7 +383,7 @@ All notable changes to GoodVibes Agent will be recorded here.
|
|
|
371
383
|
## 0.1.0 - 2026-05-28
|
|
372
384
|
|
|
373
385
|
- Published the first public alpha package for `@pellux/goodvibes-agent`.
|
|
374
|
-
- Kept the
|
|
386
|
+
- Kept the GoodVibes TUI-derived shell, renderer, input, fullscreen workspace, command registry, and release foundation.
|
|
375
387
|
- Preserved Agent product policy: serial/proactive main conversation by default, no local Agent-owned WRFC/spawn fanout, and explicit GoodVibes TUI delegation for build/fix/review work.
|
|
376
388
|
- Moved Agent-owned runtime state to `.goodvibes/agent` surface roots.
|
|
377
389
|
- Updated packaged Agent guidance, reviewer persona, and provider skill to avoid copied TUI WRFC/multi-agent defaults.
|
|
@@ -380,7 +392,7 @@ All notable changes to GoodVibes Agent will be recorded here.
|
|
|
380
392
|
|
|
381
393
|
## 0.0.0 - Private Baseline
|
|
382
394
|
|
|
383
|
-
-
|
|
395
|
+
- Adopted the GoodVibes terminal foundation as the starting point for the Agent product.
|
|
384
396
|
- Renamed package identity to `@pellux/goodvibes-agent` and exposed one executable, `goodvibes-agent`.
|
|
385
397
|
- Pinned `@pellux/goodvibes-sdk` to `0.33.35`.
|
|
386
398
|
- Removed packaged runtime-host binaries and blocked Agent-owned runtime/service lifecycle commands.
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://opensource.org/licenses/MIT)
|
|
4
4
|
[](#install)
|
|
5
5
|
|
|
6
|
-
GoodVibes Agent is the personal operator assistant
|
|
6
|
+
GoodVibes Agent is the personal operator assistant TUI for GoodVibes. It is built for day-to-day operator work: chat, setup, local profiles, routines, skills, personas, isolated Agent Knowledge, status review, approvals, automation visibility, and explicit build delegation.
|
|
7
7
|
|
|
8
8
|
The Agent product connects to an already-running GoodVibes runtime. It does not install, start, stop, restart, or own runtime connectivity or service lifecycle.
|
|
9
9
|
|
|
@@ -87,15 +87,7 @@ Starting a routine records local usage and prints its steps; it does not spawn b
|
|
|
87
87
|
|
|
88
88
|
Start or restart the GoodVibes runtime from GoodVibes TUI or the owning host before launching Agent. Agent status and companion/knowledge routes connect to that external runtime, normally on `http://127.0.0.1:3421`.
|
|
89
89
|
|
|
90
|
-
Agent
|
|
91
|
-
|
|
92
|
-
```sh
|
|
93
|
-
goodvibes-agent serve
|
|
94
|
-
goodvibes-agent service start
|
|
95
|
-
goodvibes-agent surfaces enable web
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
Those commands should return explicit external-runtime guidance instead of mutating local service posture.
|
|
90
|
+
Agent reports unavailable, unauthenticated, or incompatible runtime state through `goodvibes-agent status`, `goodvibes-agent doctor`, and the TUI status surfaces. It does not provide runtime lifecycle setup commands.
|
|
99
91
|
|
|
100
92
|
## Product Boundary
|
|
101
93
|
|
|
@@ -107,10 +99,10 @@ GoodVibes TUI owns coding execution: file edits, git/worktree workflows, coding
|
|
|
107
99
|
|
|
108
100
|
## Package Docs
|
|
109
101
|
|
|
110
|
-
Package-facing docs
|
|
102
|
+
Package-facing docs:
|
|
111
103
|
|
|
112
104
|
- [Getting Started](docs/getting-started.md)
|
|
113
105
|
- [Deployment And Services](docs/deployment-and-services.md)
|
|
114
106
|
- [Release And Publishing](docs/release-and-publishing.md)
|
|
115
107
|
|
|
116
|
-
|
|
108
|
+
The package-facing Agent documentation is limited to the docs listed above.
|
package/docs/README.md
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# GoodVibes Agent Docs
|
|
2
2
|
|
|
3
|
-
These are the package-facing docs for GoodVibes Agent.
|
|
4
|
-
|
|
5
|
-
GoodVibes Agent is a near-fork of the GoodVibes terminal foundation with a different product brain. It uses the copied terminal shell, renderer, input, fullscreen workspace, command, and release bones while the Agent-specific assistant behavior is being rebuilt.
|
|
3
|
+
These are the package-facing docs for GoodVibes Agent, the personal operator assistant TUI for GoodVibes.
|
|
6
4
|
|
|
7
5
|
Current package docs:
|
|
8
6
|
|
|
@@ -24,4 +22,4 @@ Important baseline constraints:
|
|
|
24
22
|
- Normal assistant chat is not coding-session delegation.
|
|
25
23
|
- Build/fix/review delegation to GoodVibes TUI must be explicit; WRFC is not the default Agent behavior.
|
|
26
24
|
|
|
27
|
-
|
|
25
|
+
The Agent docs above define the supported alpha behavior.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Deployment And Services
|
|
2
2
|
|
|
3
|
-
GoodVibes Agent is a client/operator
|
|
3
|
+
GoodVibes Agent is a client/operator TUI. It connects to an already-running GoodVibes runtime and does not own runtime or listener deployment.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Runtime Ownership
|
|
6
6
|
|
|
7
7
|
Agent must not:
|
|
8
8
|
|
|
@@ -12,7 +12,7 @@ Agent must not:
|
|
|
12
12
|
- start, stop, or restart runtime services
|
|
13
13
|
- enable web, listener, control-plane, or channel surface posture
|
|
14
14
|
|
|
15
|
-
Those operations belong to GoodVibes TUI or the owning runtime host.
|
|
15
|
+
Those operations belong to GoodVibes TUI or the owning runtime host. Agent reports external runtime readiness but does not configure that host.
|
|
16
16
|
|
|
17
17
|
## Agent Runtime
|
|
18
18
|
|
|
@@ -40,12 +40,6 @@ http://127.0.0.1:3421
|
|
|
40
40
|
|
|
41
41
|
If the runtime is unavailable, unauthenticated, or on an incompatible SDK version, Agent commands should report actionable diagnostics without printing token values.
|
|
42
42
|
|
|
43
|
-
## Surface Commands
|
|
44
|
-
|
|
45
|
-
`goodvibes-agent surfaces`, `surfaces check`, and `surfaces show <surfaceId>` are read-only diagnostics.
|
|
46
|
-
|
|
47
|
-
`surfaces enable` and `surfaces disable` are intentionally blocked in Agent because they can mutate runtime/listener/web/channel posture.
|
|
48
|
-
|
|
49
43
|
## Release Rule
|
|
50
44
|
|
|
51
45
|
Only publish Agent releases that preserve the Agent product policy:
|
package/docs/getting-started.md
CHANGED
|
@@ -101,6 +101,6 @@ Agent Knowledge/Wiki is an Agent-owned product segment. Agent commands must not
|
|
|
101
101
|
|
|
102
102
|
Agent lifecycle commands that would start or mutate runtime posture are blocked intentionally. Use `goodvibes-agent status`, `goodvibes-agent doctor`, and read-only surface checks for diagnostics.
|
|
103
103
|
|
|
104
|
-
## Current
|
|
104
|
+
## Current Product Notes
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
Agent uses the mature GoodVibes terminal shell, renderer, input, fullscreen workspace, command registry, and release foundation. The active Agent policy is serial/proactive by default, blocks local Agent-owned WRFC/spawn fanout, and delegates explicit build/fix/review work to GoodVibes TUI instead of turning the Agent into a coding TUI.
|
|
@@ -55,6 +55,6 @@ Do not publish if Agent Knowledge commands can fall back to default Knowledge/Wi
|
|
|
55
55
|
|
|
56
56
|
Do not ship runtime host binaries from this package. If Agent later gets compiled artifacts, they must use Agent artifact names and remain separate from runtime ownership.
|
|
57
57
|
|
|
58
|
-
##
|
|
58
|
+
## Product Rule
|
|
59
59
|
|
|
60
|
-
The public alpha can include
|
|
60
|
+
The public alpha can include mature terminal foundation code, but package-facing behavior must follow Agent product policy. Follow-up work should continue pruning or reshaping coding-first surfaces while preserving the renderer, input, fullscreen workspace, command registry, and release bones.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.68",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "GoodVibes personal operator assistant TUI with a proactive Agent product brain, isolated Agent Knowledge, local profiles, routines, skills, personas, and explicit build delegation.",
|
|
6
6
|
"type": "module",
|
package/src/cli/completion.ts
CHANGED
|
@@ -2,9 +2,6 @@ const COMMANDS = [
|
|
|
2
2
|
'tui',
|
|
3
3
|
'run',
|
|
4
4
|
'exec',
|
|
5
|
-
'serve',
|
|
6
|
-
'web',
|
|
7
|
-
'service',
|
|
8
5
|
'onboarding',
|
|
9
6
|
'setup',
|
|
10
7
|
'doctor',
|
|
@@ -25,9 +22,6 @@ const COMMANDS = [
|
|
|
25
22
|
'tasks',
|
|
26
23
|
'pair',
|
|
27
24
|
'qrcode',
|
|
28
|
-
'surfaces',
|
|
29
|
-
'listener',
|
|
30
|
-
'control-plane',
|
|
31
25
|
'bundle',
|
|
32
26
|
'remote',
|
|
33
27
|
'bridge',
|
|
@@ -44,7 +38,6 @@ const OPTIONS = [
|
|
|
44
38
|
'--agent-profile',
|
|
45
39
|
'--cd',
|
|
46
40
|
'--working-dir',
|
|
47
|
-
'--daemon-home',
|
|
48
41
|
'--config',
|
|
49
42
|
'--enable',
|
|
50
43
|
'--disable',
|
|
@@ -54,8 +47,6 @@ const OPTIONS = [
|
|
|
54
47
|
'--output-format',
|
|
55
48
|
'--json',
|
|
56
49
|
'--no-alt-screen',
|
|
57
|
-
'--port',
|
|
58
|
-
'--hostname',
|
|
59
50
|
'--open',
|
|
60
51
|
'--resume',
|
|
61
52
|
'--session',
|
|
@@ -73,6 +73,10 @@ const PACKAGE_FACING_FORBIDDEN_TEXT = [
|
|
|
73
73
|
['Her', 'mes'].join(''),
|
|
74
74
|
['capabilities', ' audit'].join(''),
|
|
75
75
|
['capabilities', ' command'].join(''),
|
|
76
|
+
['near', '-fork'].join(''),
|
|
77
|
+
['goodvibes-agent', 'serve'].join(' '),
|
|
78
|
+
['goodvibes-agent', 'service start'].join(' '),
|
|
79
|
+
['goodvibes-agent', 'surfaces enable'].join(' '),
|
|
76
80
|
'Every plan must have a multi-agent execution strategy',
|
|
77
81
|
'NEVER skip WRFC',
|
|
78
82
|
'ALWAYS work in parallel when implementing a plan',
|
|
@@ -148,7 +148,7 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
|
|
|
148
148
|
name: 'worker-pool',
|
|
149
149
|
aliases: ['pool'],
|
|
150
150
|
description: 'Dedicated front-door for remote worker pool review flows',
|
|
151
|
-
usage: '[list|show <id
|
|
151
|
+
usage: '[list|show <id>]',
|
|
152
152
|
async handler(args, ctx) {
|
|
153
153
|
const sub = (args[0] ?? 'list').toLowerCase();
|
|
154
154
|
if (!ctx.executeCommand) {
|
|
@@ -164,11 +164,11 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
|
|
|
164
164
|
return;
|
|
165
165
|
}
|
|
166
166
|
if (sub === 'create' && args[1] && args.length >= 3) {
|
|
167
|
-
|
|
167
|
+
ctx.print('Remote worker pool mutation is blocked in GoodVibes Agent. Use /worker-pool list or /worker-pool show <id>.');
|
|
168
168
|
return;
|
|
169
169
|
}
|
|
170
170
|
if ((sub === 'assign' || sub === 'unassign') && args[1] && args[2]) {
|
|
171
|
-
|
|
171
|
+
ctx.print('Remote worker pool mutation is blocked in GoodVibes Agent. Use /worker-pool list or /worker-pool show <id>.');
|
|
172
172
|
return;
|
|
173
173
|
}
|
|
174
174
|
ctx.print('Usage: /worker-pool [list|show <id>]');
|
|
@@ -132,7 +132,7 @@ export function registerProductRuntimeCommands(registry: CommandRegistry): void
|
|
|
132
132
|
registry.register({
|
|
133
133
|
name: 'bridge',
|
|
134
134
|
description: 'Review self-hosted bridge and remote worker flows',
|
|
135
|
-
usage: '[status|pools|
|
|
135
|
+
usage: '[status|pools|worker <id>|review <artifactId>|export <artifactId> [path] --yes|import <path> --yes]',
|
|
136
136
|
async handler(args, ctx) {
|
|
137
137
|
const parsed = stripYesFlag(args);
|
|
138
138
|
const commandArgs = [...parsed.rest];
|
|
@@ -156,7 +156,7 @@ export function registerProductRuntimeCommands(registry: CommandRegistry): void
|
|
|
156
156
|
if (sub === 'pools') {
|
|
157
157
|
const pools = remoteRegistry.listPools();
|
|
158
158
|
ctx.print(pools.length > 0
|
|
159
|
-
? ['Bridge Pools', ...pools.map((pool) => ` ${pool.id}
|
|
159
|
+
? ['Bridge Pools', ...pools.map((pool) => ` ${pool.id} workers=${pool.runnerIds.length} trust=${pool.trustClass}`)].join('\n')
|
|
160
160
|
: 'Bridge Pools\n No worker pools registered yet.');
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
@@ -164,34 +164,30 @@ export function registerProductRuntimeCommands(registry: CommandRegistry): void
|
|
|
164
164
|
const poolId = commandArgs[1];
|
|
165
165
|
const runnerId = commandArgs[2];
|
|
166
166
|
if (!poolId || !runnerId) {
|
|
167
|
-
ctx.print('Usage: /bridge assign <pool> <
|
|
167
|
+
ctx.print('Usage: /bridge assign <pool> <worker> --yes');
|
|
168
168
|
return;
|
|
169
169
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
ctx.print(`Unable to assign runner ${runnerId} to pool ${poolId}.`);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
ctx.print(`Assigned runner ${runnerId} to bridge pool ${poolId}.`);
|
|
170
|
+
ctx.print([
|
|
171
|
+
'Bridge worker assignment is read-only in GoodVibes Agent.',
|
|
172
|
+
` requested: /bridge assign ${poolId} ${runnerId}`,
|
|
173
|
+
' policy: Agent reviews remote bridge state but does not mutate worker topology',
|
|
174
|
+
' next: inspect /bridge pools or delegate explicit build/fix/review work to GoodVibes TUI',
|
|
175
|
+
].join('\n'));
|
|
180
176
|
return;
|
|
181
177
|
}
|
|
182
|
-
if (sub === 'runner') {
|
|
178
|
+
if (sub === 'runner' || sub === 'worker') {
|
|
183
179
|
const runnerId = commandArgs[1];
|
|
184
180
|
if (!runnerId) {
|
|
185
|
-
ctx.print('Usage: /bridge
|
|
181
|
+
ctx.print('Usage: /bridge worker <id>');
|
|
186
182
|
return;
|
|
187
183
|
}
|
|
188
184
|
const contract = remoteRegistry.getContract(runnerId);
|
|
189
185
|
if (!contract) {
|
|
190
|
-
ctx.print(`Unknown
|
|
186
|
+
ctx.print(`Unknown worker contract: ${runnerId}`);
|
|
191
187
|
return;
|
|
192
188
|
}
|
|
193
189
|
ctx.print([
|
|
194
|
-
`Bridge
|
|
190
|
+
`Bridge Worker ${runnerId}`,
|
|
195
191
|
` template: ${contract.template}`,
|
|
196
192
|
` trustClass: ${contract.trustClass}`,
|
|
197
193
|
` transport: ${contract.sourceTransport}/${contract.transport.state}`,
|
|
@@ -242,10 +238,10 @@ export function registerProductRuntimeCommands(registry: CommandRegistry): void
|
|
|
242
238
|
return;
|
|
243
239
|
}
|
|
244
240
|
const artifact = await remoteRegistry.importArtifact(shellPaths.resolveWorkspacePath(pathArg));
|
|
245
|
-
ctx.print(`Imported remote bridge artifact ${artifact.id} for
|
|
241
|
+
ctx.print(`Imported remote bridge artifact ${artifact.id} for worker ${artifact.runnerId}.`);
|
|
246
242
|
return;
|
|
247
243
|
}
|
|
248
|
-
ctx.print('Usage: /bridge [status|pools|
|
|
244
|
+
ctx.print('Usage: /bridge [status|pools|worker <id>|review <artifactId>|export <artifactId> [path] --yes|import <path> --yes]');
|
|
249
245
|
},
|
|
250
246
|
});
|
|
251
247
|
|
|
@@ -36,7 +36,7 @@ export function handleRemoteCancelCommand(
|
|
|
36
36
|
ctx.print([
|
|
37
37
|
'GoodVibes Agent remote control is read-only.',
|
|
38
38
|
` requested: /remote cancel ${agentId}`,
|
|
39
|
-
' policy: Agent does not cancel local
|
|
39
|
+
' policy: Agent does not cancel local remote-worker processes from this surface',
|
|
40
40
|
' next: inspect with /remote show or delegate explicit build/fix/review work to GoodVibes TUI',
|
|
41
41
|
].join('\n'));
|
|
42
42
|
}
|
|
@@ -46,7 +46,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
|
|
|
46
46
|
name: 'remote',
|
|
47
47
|
aliases: [],
|
|
48
48
|
description: 'Inspect remote workers, delegated work receipts, and review artifacts',
|
|
49
|
-
usage: '[list | show [agentId] | supervisor [workerId] | support [workerId] | recover [workerId] | setup [export <path> --yes] | env [export <path> --yes] | tunnel [review|export <path> --yes] | bootstrap [export <path> --yes|inspect <path>] | session <export|inspect|import> <path> [--yes] | pool <list|show> ... | dispatch [template] <description> | dispatch-pool <pool> [template] <description> | contract [
|
|
49
|
+
usage: '[list | show [agentId] | supervisor [workerId] | support [workerId] | recover [workerId] | setup [export <path> --yes] | env [export <path> --yes] | tunnel [review|export <path> --yes] | bootstrap [export <path> --yes|inspect <path>] | session <export|inspect|import> <path> [--yes] | pool <list|show> ... | dispatch [template] <description> | dispatch-pool <pool> [template] <description> | contract [workerId] | cancel <agentId> | export <agentId> [path] --yes | artifact list | artifact show <id> | artifact export <id> [path] --yes | review <id> | rerun-local <id> | import <path> --yes]',
|
|
50
50
|
async handler(args, ctx) {
|
|
51
51
|
if (args.length === 0) {
|
|
52
52
|
if (ctx.openRemotePanel) {
|
|
@@ -210,7 +210,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
|
|
|
210
210
|
ctx.print(agentId ? `Unknown remote connection: ${agentId}` : 'No active remote connections.');
|
|
211
211
|
return;
|
|
212
212
|
}
|
|
213
|
-
const contract = remoteRunners.
|
|
213
|
+
const contract = remoteRunners.getContract(connection.agentId);
|
|
214
214
|
ctx.print([
|
|
215
215
|
`Remote connection ${connection.agentId}`,
|
|
216
216
|
` label: ${connection.label}`,
|
|
@@ -278,14 +278,14 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
|
|
|
278
278
|
ctx.print('No remote worker contracts are available yet.');
|
|
279
279
|
return;
|
|
280
280
|
}
|
|
281
|
-
const contract = remoteRunners.
|
|
281
|
+
const contract = remoteRunners.getContract(agentId);
|
|
282
282
|
if (!contract) {
|
|
283
283
|
ctx.print(`Unknown remote worker: ${agentId}`);
|
|
284
284
|
return;
|
|
285
285
|
}
|
|
286
286
|
ctx.print([
|
|
287
287
|
`Remote worker contract ${contract.id}`,
|
|
288
|
-
`
|
|
288
|
+
` workerId: ${contract.runnerId}`,
|
|
289
289
|
` label: ${contract.label}`,
|
|
290
290
|
` pool: ${contract.poolId ?? '(none)'}`,
|
|
291
291
|
` trustClass: ${contract.trustClass}`,
|
|
@@ -422,7 +422,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
|
|
|
422
422
|
return;
|
|
423
423
|
}
|
|
424
424
|
const artifact = await remoteRunners.importArtifact(path);
|
|
425
|
-
ctx.print(`Imported remote review artifact ${artifact.id} for
|
|
425
|
+
ctx.print(`Imported remote review artifact ${artifact.id} for worker ${artifact.runnerId}.`);
|
|
426
426
|
return;
|
|
427
427
|
}
|
|
428
428
|
|
|
@@ -85,7 +85,7 @@ export function buildProviderHealthDomainSummaries(
|
|
|
85
85
|
summary: remote.supervisor.sessions.length === 0
|
|
86
86
|
? 'no remote sessions tracked'
|
|
87
87
|
: `${remote.supervisor.sessions.length} sessions / ${remote.supervisor.degradedConnections} degraded`,
|
|
88
|
-
next: remote.supervisor.degradedConnections > 0 ? '/remote recover <
|
|
88
|
+
next: remote.supervisor.degradedConnections > 0 ? '/remote recover <workerId>' : '/remote supervisor',
|
|
89
89
|
details: remote.supervisor.sessions.length === 0
|
|
90
90
|
? ['no remote sessions have been attached yet']
|
|
91
91
|
: remote.supervisor.sessions
|
|
@@ -98,7 +98,7 @@ export function buildProviderHealthDomainSummaries(
|
|
|
98
98
|
.slice(0, 3)
|
|
99
99
|
.map((entry) => `${entry.runnerId}: transport=${entry.transportState} heartbeat=${entry.heartbeat.status}${entry.lastError ? ` error=${entry.lastError}` : ''}`),
|
|
100
100
|
nextSteps: remote.supervisor.degradedConnections > 0
|
|
101
|
-
? ['/remote supervisor', '/remote recover <
|
|
101
|
+
? ['/remote supervisor', '/remote recover <workerId>', '/remote support']
|
|
102
102
|
: ['/remote supervisor'],
|
|
103
103
|
});
|
|
104
104
|
|
|
@@ -111,13 +111,13 @@ export class RemotePanel extends BasePanel {
|
|
|
111
111
|
|
|
112
112
|
public render(width: number, height: number): Line[] {
|
|
113
113
|
this.needsRender = false;
|
|
114
|
-
const intro = '
|
|
114
|
+
const intro = 'Remote worker, bridge, and review-artifact posture for delegated work.';
|
|
115
115
|
|
|
116
116
|
if (!this.readModel) {
|
|
117
117
|
const sectionLines = buildEmptyState(
|
|
118
118
|
width,
|
|
119
119
|
' Runtime store not wired into this panel yet.',
|
|
120
|
-
'The remote
|
|
120
|
+
'The remote review workspace needs the shell read model so it can display worker state and review artifacts.',
|
|
121
121
|
[
|
|
122
122
|
{ command: '/remote setup', summary: 'review bootstrap, env, tunnel, and bridge guidance' },
|
|
123
123
|
{ command: '/remote panel', summary: 'reopen the panel from the shell-owned runtime' },
|
|
@@ -125,7 +125,7 @@ export class RemotePanel extends BasePanel {
|
|
|
125
125
|
C,
|
|
126
126
|
);
|
|
127
127
|
const lines = buildPanelWorkspace(width, height, {
|
|
128
|
-
title: 'Remote
|
|
128
|
+
title: 'Remote Work Review',
|
|
129
129
|
intro,
|
|
130
130
|
sections: [{ lines: sectionLines }],
|
|
131
131
|
palette: C,
|
|
@@ -176,7 +176,7 @@ export class RemotePanel extends BasePanel {
|
|
|
176
176
|
[String(acp.totalMessages), acp.totalMessages > 0 ? C.value : C.dim],
|
|
177
177
|
]),
|
|
178
178
|
buildPanelLine(width, [
|
|
179
|
-
['
|
|
179
|
+
[' worker contracts ', C.label],
|
|
180
180
|
[String(contracts.length), C.info],
|
|
181
181
|
[' pools ', C.label],
|
|
182
182
|
[String(pools.length), pools.length > 0 ? C.info : C.dim],
|
|
@@ -204,7 +204,7 @@ export class RemotePanel extends BasePanel {
|
|
|
204
204
|
]));
|
|
205
205
|
}
|
|
206
206
|
postureLines.push(
|
|
207
|
-
buildGuidanceLine(width, '/remote recover', '
|
|
207
|
+
buildGuidanceLine(width, '/remote recover', 'inspect remote state with worker support and disconnect recovery hints', C),
|
|
208
208
|
buildGuidanceLine(width, '/remote support', 'inspect transport support before routing remote work or reattaching a session', C),
|
|
209
209
|
);
|
|
210
210
|
|
|
@@ -219,17 +219,17 @@ export class RemotePanel extends BasePanel {
|
|
|
219
219
|
...buildEmptyState(
|
|
220
220
|
width,
|
|
221
221
|
' No active ACP or remote subagent connections.',
|
|
222
|
-
'
|
|
222
|
+
'Remote review is healthy but idle. Worker contracts, session bundles, and bridge pools will appear here once delegated work exists.',
|
|
223
223
|
[
|
|
224
224
|
{ command: '/remote setup', summary: 'review remote bootstrap and environment export' },
|
|
225
225
|
{ command: '/remote env', summary: 'emit a reusable remote shell snippet' },
|
|
226
|
-
{ command: '/bridge status', summary: 'inspect
|
|
226
|
+
{ command: '/bridge status', summary: 'inspect worker pools and existing remote artifacts' },
|
|
227
227
|
],
|
|
228
228
|
C,
|
|
229
229
|
),
|
|
230
230
|
];
|
|
231
231
|
const lines = buildPanelWorkspace(width, height, {
|
|
232
|
-
title: 'Remote
|
|
232
|
+
title: 'Remote Work Review',
|
|
233
233
|
intro,
|
|
234
234
|
sections: [{ lines: buildSummaryBlock(width, 'Remote posture', idleLines, C) }],
|
|
235
235
|
footerLines,
|
|
@@ -341,7 +341,7 @@ export class RemotePanel extends BasePanel {
|
|
|
341
341
|
]));
|
|
342
342
|
} else if (selectedContract) {
|
|
343
343
|
detailRows.push(buildPanelLine(width, [
|
|
344
|
-
['
|
|
344
|
+
[' Worker: ', C.label],
|
|
345
345
|
[selectedContract.runnerId, C.value],
|
|
346
346
|
[' Template: ', C.label],
|
|
347
347
|
[selectedContract.template, C.info],
|
|
@@ -392,7 +392,7 @@ export class RemotePanel extends BasePanel {
|
|
|
392
392
|
const detailSection: PanelWorkspaceSection = {
|
|
393
393
|
lines: buildDetailBlock(width, selected ? 'Selected connection' : 'Selected contract', detailRows, C),
|
|
394
394
|
};
|
|
395
|
-
const browseTitle = viewingConnections ? 'Active Connections' : 'Registered Remote
|
|
395
|
+
const browseTitle = viewingConnections ? 'Active Connections' : 'Registered Remote Worker Contracts';
|
|
396
396
|
const rawBrowseLines: Line[] = viewingConnections
|
|
397
397
|
? activeConnections.map((connection, absolute) => {
|
|
398
398
|
return buildPanelListRow(width, [
|
|
@@ -437,7 +437,7 @@ export class RemotePanel extends BasePanel {
|
|
|
437
437
|
detailSection,
|
|
438
438
|
];
|
|
439
439
|
const lines = buildPanelWorkspace(width, height, {
|
|
440
|
-
title: 'Remote
|
|
440
|
+
title: 'Remote Work Review',
|
|
441
441
|
intro,
|
|
442
442
|
sections,
|
|
443
443
|
footerLines,
|
|
@@ -66,7 +66,7 @@ function formatReturnContextLines(returnContext: SessionInfo['returnContext']):
|
|
|
66
66
|
lines.push(`tasks: active=${returnContext.activeTasks ?? 0} blocked=${returnContext.blockedTasks ?? 0} approvals=${returnContext.pendingApprovals ?? 0}`);
|
|
67
67
|
}
|
|
68
68
|
if (returnContext.remoteRunners?.length) {
|
|
69
|
-
lines.push(`remote
|
|
69
|
+
lines.push(`remote workers: ${returnContext.remoteRunners.join(', ')}`);
|
|
70
70
|
}
|
|
71
71
|
if (returnContext.openPanels?.length) {
|
|
72
72
|
lines.push(`open panels: ${returnContext.openPanels.join(', ')}`);
|
package/src/runtime/index.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Runtime module barrel for GoodVibes Agent.
|
|
3
3
|
*
|
|
4
4
|
* SDK 0.33 intentionally removed private deep imports and the runtime root
|
|
5
|
-
* god-barrel. This file keeps the
|
|
5
|
+
* god-barrel. This file keeps the Agent app on public SDK seams
|
|
6
6
|
* while preserving the local import surface used by the shell.
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -783,7 +783,7 @@ function narrowStringEnumProperty(
|
|
|
783
783
|
property.description = description;
|
|
784
784
|
}
|
|
785
785
|
|
|
786
|
-
// Compatibility exports for
|
|
786
|
+
// Compatibility exports for inherited terminal-foundation tests/imports.
|
|
787
787
|
export const installWrfcAgentToolGuard = installAgentToolPolicyGuard;
|
|
788
788
|
export const wrapWrfcAgentTool = wrapAgentToolForAgentPolicy;
|
|
789
789
|
export const validateWrfcAgentToolInvocation = validateAgentToolInvocationForAgentPolicy;
|
package/src/version.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
// The prebuild script updates the fallback value before compilation.
|
|
7
7
|
// Uses import.meta.dir (Bun) to locate package.json relative to this file,
|
|
8
8
|
// which is correct regardless of the process working directory.
|
|
9
|
-
let _version = '0.1.
|
|
9
|
+
let _version = '0.1.68';
|
|
10
10
|
let _sdkVersion = '0.33.35';
|
|
11
11
|
try {
|
|
12
12
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|