@pellux/goodvibes-agent 0.1.71 → 0.1.73
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 +12 -0
- package/README.md +6 -6
- package/docs/README.md +3 -3
- package/docs/getting-started.md +1 -1
- package/docs/runtime-connection.md +37 -0
- package/package.json +2 -2
- package/src/cli/agent-knowledge-command.ts +1 -1
- package/src/cli/config-overrides.ts +1 -5
- package/src/cli/entrypoint.ts +0 -6
- package/src/cli/help.ts +0 -43
- package/src/cli/index.ts +0 -2
- package/src/cli/management-commands.ts +1 -109
- package/src/cli/management.ts +1 -32
- package/src/cli/package-verification.ts +18 -4
- package/src/cli/parser.ts +0 -16
- package/src/cli/status.ts +1 -1
- package/src/cli/types.ts +0 -8
- package/src/input/agent-workspace-categories.ts +11 -11
- package/src/input/commands/delegation-runtime.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-steps.ts +8 -8
- package/src/input/settings-modal-types.ts +6 -6
- package/src/panels/confirm-state.ts +1 -1
- package/src/renderer/settings-modal-helpers.ts +7 -7
- package/src/renderer/settings-modal.ts +12 -12
- package/src/runtime/bootstrap.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +87 -58
- package/src/runtime/onboarding/types.ts +13 -11
- package/src/tools/wrfc-agent-guard.ts +1 -1
- package/src/version.ts +1 -1
- package/docs/deployment-and-services.md +0 -52
- package/src/cli/service-command.ts +0 -26
- package/src/cli/surface-command.ts +0 -247
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.73 - 2026-05-31
|
|
6
|
+
|
|
7
|
+
- Replaced copied first-run capability language with Agent-specific setup: operator TUI, provider access, isolated Agent Knowledge, local memory/skills, channels, automation review, and explicit TUI delegation.
|
|
8
|
+
- Reworked the fullscreen settings workspace grouping and descriptions around Agent experience, models, local Agent state, tools/automation, and external runtime connection.
|
|
9
|
+
- Added package-facing guards and regressions so copied browser/network/listener setup wording does not return to shipped Agent docs.
|
|
10
|
+
|
|
11
|
+
## 0.1.72 - 2026-05-31
|
|
12
|
+
|
|
13
|
+
- Removed copied runtime lifecycle and transport words from the Agent CLI parser, command handler, detailed help, and package exports.
|
|
14
|
+
- Replaced package-facing deployment/service docs with runtime-connection docs focused on the external runtime prerequisite and Agent product boundary.
|
|
15
|
+
- Added regression coverage so hidden lifecycle words are treated as normal TUI prompts instead of supported Agent commands.
|
|
16
|
+
|
|
5
17
|
## 0.1.71 - 2026-05-31
|
|
6
18
|
|
|
7
19
|
- Stopped importing copied TUI slash-command modules that do not belong to the Agent product surface.
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
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
|
-
The Agent product connects to an already-running GoodVibes runtime. It does not install, start, stop, restart, or own runtime
|
|
8
|
+
The Agent product connects to an already-running GoodVibes runtime. It does not install, start, stop, restart, or own runtime hosting.
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -50,7 +50,7 @@ bun run package:install-check
|
|
|
50
50
|
bun run publish:check
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
Inside the Agent TUI, use `/agent`, `/home`, or `/operator` to open the operator workspace. It is the Agent-first fullscreen
|
|
53
|
+
Inside the Agent TUI, use `/agent`, `/home`, or `/operator` to open the operator workspace. It is the Agent-first fullscreen workspace for setup, status, knowledge, local memory/skills, work-plan/approval review, automation observability, and explicit build delegation to GoodVibes TUI.
|
|
54
54
|
|
|
55
55
|
Inside the workspace, use `/agent-profile guide` to author custom profile starters without leaving the Agent TUI. The guided flow lists starters, exports starter JSON, imports edited local starters, and creates isolated Agent profiles from them.
|
|
56
56
|
|
|
@@ -87,22 +87,22 @@ 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 reports unavailable, unauthenticated, or incompatible runtime state through `goodvibes-agent status`, `goodvibes-agent doctor`, and the TUI status
|
|
90
|
+
Agent reports unavailable, unauthenticated, or incompatible runtime state through `goodvibes-agent status`, `goodvibes-agent doctor`, and the TUI status views. It does not provide runtime hosting commands.
|
|
91
91
|
|
|
92
92
|
## Product Boundary
|
|
93
93
|
|
|
94
|
-
GoodVibes Agent owns the operator assistant
|
|
94
|
+
GoodVibes Agent owns the operator assistant TUI: serial assistant flow, proactive safe actions, local memory/routines/skills/personas, Agent knowledge routes, companion chat, approvals/automation observability, and explicit build delegation.
|
|
95
95
|
|
|
96
96
|
Agent Knowledge/Wiki is its own product segment. Agent uses `/api/goodvibes-agent/knowledge/*` and must not fall back to default Knowledge/Wiki or other product-specific knowledge routes.
|
|
97
97
|
|
|
98
|
-
GoodVibes TUI owns coding execution: file edits, git/worktree workflows, coding panels,
|
|
98
|
+
GoodVibes TUI owns coding execution: file edits, git/worktree workflows, coding panels, execution isolation UX, and WRFC execution. Agent may delegate explicit build/fix/review work to TUI through public runtime/session contracts; normal assistant chat must not use shared coding sessions.
|
|
99
99
|
|
|
100
100
|
## Package Docs
|
|
101
101
|
|
|
102
102
|
Package-facing docs:
|
|
103
103
|
|
|
104
104
|
- [Getting Started](docs/getting-started.md)
|
|
105
|
-
- [
|
|
105
|
+
- [Runtime Connection](docs/runtime-connection.md)
|
|
106
106
|
- [Release And Publishing](docs/release-and-publishing.md)
|
|
107
107
|
|
|
108
108
|
The package-facing Agent documentation is limited to the docs listed above.
|
package/docs/README.md
CHANGED
|
@@ -5,7 +5,7 @@ These are the package-facing docs for GoodVibes Agent, the personal operator ass
|
|
|
5
5
|
Current package docs:
|
|
6
6
|
|
|
7
7
|
- [Getting Started](getting-started.md)
|
|
8
|
-
- [
|
|
8
|
+
- [Runtime Connection](runtime-connection.md)
|
|
9
9
|
- [Release And Publishing](release-and-publishing.md)
|
|
10
10
|
|
|
11
11
|
Important baseline constraints:
|
|
@@ -14,11 +14,11 @@ Important baseline constraints:
|
|
|
14
14
|
- Agent uses Bun and TypeScript-authored source.
|
|
15
15
|
- Agent depends on `@pellux/goodvibes-sdk@0.33.35`.
|
|
16
16
|
- Agent connects to an externally managed GoodVibes runtime.
|
|
17
|
-
- Agent does not start, stop, restart, install, uninstall, or own runtime
|
|
17
|
+
- Agent does not start, stop, restart, install, uninstall, or own runtime hosting.
|
|
18
18
|
- Agent Knowledge/Wiki uses only `/api/goodvibes-agent/knowledge/*`; there is no default Knowledge/Wiki or non-Agent product fallback.
|
|
19
19
|
- Agent supports isolated runtime homes with `GOODVIBES_AGENT_HOME=<path>` and named profile homes with `goodvibes-agent profiles create <name> --template <starter> --yes` plus `--agent-profile <name>`.
|
|
20
20
|
- Agent ships starter profile templates for household, research, travel, operations, and personal productivity local state; `profiles templates export/import` and `/agent-profile guide` support local custom starters.
|
|
21
|
-
- Local personas, routines, and Agent skills are stored under the Agent
|
|
21
|
+
- Local personas, routines, and Agent skills are stored under the Agent home and are injected only into the serial Agent conversation.
|
|
22
22
|
- Normal assistant chat is not coding-session delegation.
|
|
23
23
|
- Build/fix/review delegation to GoodVibes TUI must be explicit; WRFC is not the default Agent behavior.
|
|
24
24
|
|
package/docs/getting-started.md
CHANGED
|
@@ -99,7 +99,7 @@ Start the runtime from GoodVibes TUI or the owning host before using runtime-bac
|
|
|
99
99
|
|
|
100
100
|
Agent Knowledge/Wiki is an Agent-owned product segment. Agent commands must not fall back to default Knowledge/Wiki or other product-specific knowledge spaces.
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
Runtime-hosting commands are not part of GoodVibes Agent. Use `goodvibes-agent status`, `goodvibes-agent doctor`, and the Agent TUI status views for diagnostics.
|
|
103
103
|
|
|
104
104
|
## Current Product Notes
|
|
105
105
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Runtime Connection
|
|
2
|
+
|
|
3
|
+
GoodVibes Agent is a TUI client for an already-running GoodVibes runtime. The package exposes one executable:
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
goodvibes-agent
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
The installed command is backed by TypeScript-authored source with a Bun shebang. Package install smoke must verify:
|
|
10
|
+
|
|
11
|
+
- `goodvibes-agent --help`
|
|
12
|
+
- `goodvibes-agent --version`
|
|
13
|
+
- `goodvibes-agent status --json`
|
|
14
|
+
- `goodvibes-agent` launches the TUI in a real PTY
|
|
15
|
+
|
|
16
|
+
## Runtime Prerequisite
|
|
17
|
+
|
|
18
|
+
Start the GoodVibes runtime from the owning GoodVibes host before launching Agent. Agent expects the runtime to expose public operator routes and the isolated Agent Knowledge routes:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
http://127.0.0.1:3421
|
|
22
|
+
/api/goodvibes-agent/knowledge/status
|
|
23
|
+
/api/goodvibes-agent/knowledge/ask
|
|
24
|
+
/api/goodvibes-agent/knowledge/search
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If the runtime is unavailable, unauthenticated, or on an incompatible SDK version, Agent commands report actionable diagnostics without printing token values.
|
|
28
|
+
|
|
29
|
+
## Product Boundary
|
|
30
|
+
|
|
31
|
+
Agent owns the operator assistant TUI, local profiles, local memory/routines/skills/personas, isolated Agent Knowledge calls, companion chat, approvals/automation visibility, and explicit build delegation.
|
|
32
|
+
|
|
33
|
+
Agent does not host runtime connectivity. It does not provide commands to install, expose, start, stop, restart, or mutate the runtime host.
|
|
34
|
+
|
|
35
|
+
Agent Knowledge/Wiki is its own product segment. Agent uses `/api/goodvibes-agent/knowledge/*` only and must not fall back to default Knowledge/Wiki or other product-specific knowledge routes.
|
|
36
|
+
|
|
37
|
+
Normal assistant chat uses companion chat. Build/fix/review work is delegated explicitly to GoodVibes TUI through public runtime/session contracts, and WRFC is requested only when explicitly asked for delegated build/fix/review work.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.73",
|
|
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",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"CHANGELOG.md",
|
|
68
68
|
"docs/README.md",
|
|
69
69
|
"docs/getting-started.md",
|
|
70
|
-
"docs/
|
|
70
|
+
"docs/runtime-connection.md",
|
|
71
71
|
"docs/release-and-publishing.md"
|
|
72
72
|
],
|
|
73
73
|
"scripts": {
|
|
@@ -407,7 +407,7 @@ function buildDelegationBody(task: string, wrfcRequested: boolean): string {
|
|
|
407
407
|
'Agent policy:',
|
|
408
408
|
'- GoodVibes Agent is not the coding TUI.',
|
|
409
409
|
'- Preserve the full original ask.',
|
|
410
|
-
'- GoodVibes TUI owns file edits, git/worktree flows,
|
|
410
|
+
'- GoodVibes TUI owns file edits, git/worktree flows, execution isolation UX, and any WRFC owner chain.',
|
|
411
411
|
wrfcRequested
|
|
412
412
|
? '- WRFC was explicitly requested by the Agent user for this build/fix/review delegation.'
|
|
413
413
|
: '- WRFC was not explicitly requested; do not turn this into WRFC solely because it came from Agent.',
|
|
@@ -150,10 +150,6 @@ export function applyRuntimeCommandEndpointFlagOverrides(
|
|
|
150
150
|
flags: Pick<GoodVibesCliFlags, 'hostname' | 'port'>,
|
|
151
151
|
): readonly string[] {
|
|
152
152
|
if (flags.hostname === undefined && flags.port === undefined) return [];
|
|
153
|
-
if (command === '
|
|
154
|
-
if (command === 'listener') return applyRuntimeEndpointFlagOverrides(configManager, 'httpListener', flags);
|
|
155
|
-
if (command === 'control-plane' || command === 'pair' || command === 'serve') {
|
|
156
|
-
return applyRuntimeEndpointFlagOverrides(configManager, 'controlPlane', flags);
|
|
157
|
-
}
|
|
153
|
+
if (command === 'pair') return applyRuntimeEndpointFlagOverrides(configManager, 'controlPlane', flags);
|
|
158
154
|
return [];
|
|
159
155
|
}
|
package/src/cli/entrypoint.ts
CHANGED
|
@@ -88,12 +88,6 @@ export async function prepareShellCliRuntime(
|
|
|
88
88
|
process.exit(0);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
if (cli.command === 'serve') {
|
|
92
|
-
console.error(`${binary} connects to an already-running GoodVibes runtime and does not start or own runtime lifecycle.`);
|
|
93
|
-
console.error('Start or manage the runtime from GoodVibes TUI or host tooling, then run this Agent against it.');
|
|
94
|
-
process.exit(2);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
91
|
let ownership: ShellEntrypointOwnership;
|
|
98
92
|
try {
|
|
99
93
|
ownership = resolveShellEntrypointOwnership(
|
package/src/cli/help.ts
CHANGED
|
@@ -232,21 +232,6 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
232
232
|
summary: 'Inspect in-process runtime tasks. Agent blocks copied task submission; use run for one-shot work or delegate for explicit build/fix/review handoff.',
|
|
233
233
|
examples: ['tasks list', 'tasks show task-123', 'run "check provider readiness"', 'delegate "fix the failing tests"'],
|
|
234
234
|
},
|
|
235
|
-
surfaces: {
|
|
236
|
-
usage: ['surfaces [list]', 'surfaces check', 'surfaces show <surfaceId>'],
|
|
237
|
-
summary: 'Inspect advanced browser, channel, and runtime connection surfaces. Agent does not mutate runtime connection posture.',
|
|
238
|
-
examples: ['surfaces', 'surfaces check', 'surfaces show slack'],
|
|
239
|
-
},
|
|
240
|
-
listener: {
|
|
241
|
-
usage: ['listener test'],
|
|
242
|
-
summary: 'Check advanced inbound webhook readiness, network posture, auth, and enabled channel requirements.',
|
|
243
|
-
examples: ['listener test', 'listener test --json'],
|
|
244
|
-
},
|
|
245
|
-
'control-plane': {
|
|
246
|
-
usage: ['control-plane status'],
|
|
247
|
-
summary: 'Inspect advanced runtime API reachability, local auth, bootstrap credentials, and operator tokens.',
|
|
248
|
-
examples: ['control-plane status', 'control-plane status --json'],
|
|
249
|
-
},
|
|
250
235
|
bundle: {
|
|
251
236
|
usage: ['bundle export [path]', 'bundle inspect <path>', 'bundle import <path>'],
|
|
252
237
|
summary: 'Export, inspect, or import setup/profile/trust/support bundle data.',
|
|
@@ -257,31 +242,11 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
257
242
|
summary: 'Print companion pairing connection details and a QR code.',
|
|
258
243
|
examples: ['pair', 'qrcode'],
|
|
259
244
|
},
|
|
260
|
-
web: {
|
|
261
|
-
usage: ['web [--open]'],
|
|
262
|
-
summary: 'Show the configured browser surface URL, bind address, and enablement state.',
|
|
263
|
-
examples: ['web', 'web --open', 'web --hostname 0.0.0.0 --port 3423'],
|
|
264
|
-
},
|
|
265
|
-
service: {
|
|
266
|
-
usage: ['service status', 'service check'],
|
|
267
|
-
summary: 'Inspect the externally owned GoodVibes runtime service posture. Agent does not install, start, stop, restart, or uninstall the runtime.',
|
|
268
|
-
examples: ['service status', 'service check --json'],
|
|
269
|
-
},
|
|
270
245
|
completion: {
|
|
271
246
|
usage: ['completion <bash|zsh|fish>'],
|
|
272
247
|
summary: 'Generate shell completion scripts.',
|
|
273
248
|
examples: ['completion bash', 'completion zsh'],
|
|
274
249
|
},
|
|
275
|
-
serve: {
|
|
276
|
-
usage: ['serve [--hostname <host>] [--port <port>]', 'daemon [--hostname <host>] [--port <port>]'],
|
|
277
|
-
summary: 'Unavailable in GoodVibes Agent. Agent connects to an already-running GoodVibes runtime owned by GoodVibes TUI/host tooling.',
|
|
278
|
-
examples: [],
|
|
279
|
-
},
|
|
280
|
-
remote: {
|
|
281
|
-
usage: ['remote', 'bridge'],
|
|
282
|
-
summary: 'Inspect remote runner/node posture and bridge readiness.',
|
|
283
|
-
examples: ['remote', 'bridge'],
|
|
284
|
-
},
|
|
285
250
|
};
|
|
286
251
|
|
|
287
252
|
const HELP_ALIASES: Record<string, string> = {
|
|
@@ -295,16 +260,8 @@ const HELP_ALIASES: Record<string, string> = {
|
|
|
295
260
|
secret: 'secrets',
|
|
296
261
|
session: 'sessions',
|
|
297
262
|
task: 'tasks',
|
|
298
|
-
surface: 'surfaces',
|
|
299
|
-
webhook: 'listener',
|
|
300
|
-
controlplane: 'control-plane',
|
|
301
|
-
cp: 'control-plane',
|
|
302
263
|
qrcode: 'pair',
|
|
303
264
|
qr: 'pair',
|
|
304
|
-
daemon: 'serve',
|
|
305
|
-
server: 'serve',
|
|
306
|
-
services: 'service',
|
|
307
|
-
bridge: 'remote',
|
|
308
265
|
};
|
|
309
266
|
|
|
310
267
|
function normalizeHelpTopic(topic: string): string {
|
package/src/cli/index.ts
CHANGED
|
@@ -5,7 +5,5 @@ export * from './status.ts';
|
|
|
5
5
|
export * from './completion.ts';
|
|
6
6
|
export * from './config-overrides.ts';
|
|
7
7
|
export * from './endpoints.ts';
|
|
8
|
-
export * from './surface-command.ts';
|
|
9
|
-
export * from './service-command.ts';
|
|
10
8
|
export * from './bundle-command.ts';
|
|
11
9
|
export * from './management.ts';
|
|
@@ -8,9 +8,8 @@ import { inspectProviderAuth } from '@/runtime/index.ts';
|
|
|
8
8
|
import { getOrCreateCompanionToken, buildCompanionConnectionInfo, encodeConnectionPayload, formatConnectionBlock } from '@pellux/goodvibes-sdk/platform/pairing';
|
|
9
9
|
import { generateQrMatrix, renderQrToString } from '@pellux/goodvibes-sdk/platform/pairing';
|
|
10
10
|
import { resolveRuntimeEndpointBinding } from './endpoints.ts';
|
|
11
|
-
import { classifyBindPosture, isNetworkFacing } from './network-posture.ts';
|
|
12
11
|
import type { CliCommandRuntime } from './management.ts';
|
|
13
|
-
import { extractAuthorizationCode, formatJsonOrText, hasCommandFlag, openBrowser,
|
|
12
|
+
import { extractAuthorizationCode, formatJsonOrText, hasCommandFlag, openBrowser, urlHostForBindHost, withRuntimeServices, yesNo } from './management.ts';
|
|
14
13
|
import { GOODVIBES_AGENT_PAIRING_SURFACE } from '../config/surface.ts';
|
|
15
14
|
|
|
16
15
|
export async function renderSubscriptions(runtime: CliCommandRuntime): Promise<string> {
|
|
@@ -300,71 +299,6 @@ export async function handleTasks(runtime: CliCommandRuntime): Promise<string> {
|
|
|
300
299
|
});
|
|
301
300
|
}
|
|
302
301
|
|
|
303
|
-
export interface ControlPlaneStatusResult {
|
|
304
|
-
readonly enabled: unknown;
|
|
305
|
-
readonly hostMode: string;
|
|
306
|
-
readonly configuredHost: string;
|
|
307
|
-
readonly host: string;
|
|
308
|
-
readonly port: number;
|
|
309
|
-
readonly posture: ReturnType<typeof classifyBindPosture>;
|
|
310
|
-
readonly reachable: boolean;
|
|
311
|
-
readonly auth: ReturnType<typeof readAuthPaths>;
|
|
312
|
-
readonly service: {
|
|
313
|
-
readonly enabled: unknown;
|
|
314
|
-
readonly autostart: unknown;
|
|
315
|
-
readonly restartOnFailure: unknown;
|
|
316
|
-
};
|
|
317
|
-
readonly issues: readonly string[];
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
export async function buildControlPlaneStatusResult(runtime: CliCommandRuntime): Promise<ControlPlaneStatusResult> {
|
|
321
|
-
const binding = resolveRuntimeEndpointBinding(runtime.configManager, 'controlPlane');
|
|
322
|
-
const enabled = runtime.configManager.get('controlPlane.enabled');
|
|
323
|
-
const reachable = enabled === true ? await probeTcp(binding.host, binding.port) : false;
|
|
324
|
-
const auth = readAuthPaths(runtime);
|
|
325
|
-
const service = {
|
|
326
|
-
enabled: runtime.configManager.get('service.enabled'),
|
|
327
|
-
autostart: runtime.configManager.get('service.autostart'),
|
|
328
|
-
restartOnFailure: runtime.configManager.get('service.restartOnFailure'),
|
|
329
|
-
};
|
|
330
|
-
const issues: string[] = [];
|
|
331
|
-
if (enabled === true && !reachable) issues.push(`Runtime API is enabled but not reachable on ${binding.host}:${binding.port}.`);
|
|
332
|
-
if (enabled === true && service.enabled !== true) issues.push('Runtime API is enabled on the external runtime config, but Agent service ownership is disabled.');
|
|
333
|
-
if (enabled === true && service.autostart !== true) issues.push('Runtime API is enabled on the external runtime config, but autostart is off.');
|
|
334
|
-
if (enabled === true && service.restartOnFailure !== true) issues.push('Runtime API is enabled on the external runtime config, but restart-on-failure is off.');
|
|
335
|
-
if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing Runtime API has no local auth user store.');
|
|
336
|
-
if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing Runtime API still has a bootstrap credential file.');
|
|
337
|
-
return {
|
|
338
|
-
enabled,
|
|
339
|
-
...binding,
|
|
340
|
-
posture: classifyBindPosture(binding),
|
|
341
|
-
reachable,
|
|
342
|
-
auth,
|
|
343
|
-
service,
|
|
344
|
-
issues,
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
export function formatControlPlaneStatus(runtime: CliCommandRuntime, value: ControlPlaneStatusResult): string {
|
|
349
|
-
return formatJsonOrText(runtime.cli)(value, [
|
|
350
|
-
'GoodVibes runtime API status',
|
|
351
|
-
` enabled: ${yesNo(value.enabled)}`,
|
|
352
|
-
` bind: ${value.hostMode} ${value.host}:${value.port}`,
|
|
353
|
-
` bind posture: ${value.posture.label}`,
|
|
354
|
-
` reachable: ${yesNo(value.reachable)}`,
|
|
355
|
-
` service: enabled=${yesNo(value.service.enabled)} autostart=${yesNo(value.service.autostart)} restartOnFailure=${yesNo(value.service.restartOnFailure)}`,
|
|
356
|
-
` local auth users: ${value.auth.userStorePresent ? 'present' : 'missing'}`,
|
|
357
|
-
` bootstrap credential: ${value.auth.bootstrapCredentialPresent ? 'present' : 'missing'}`,
|
|
358
|
-
` operator tokens: ${value.auth.operatorTokenPresent ? 'present' : 'missing'}`,
|
|
359
|
-
value.issues.length === 0 ? ' readiness: ready' : ' readiness: needs attention',
|
|
360
|
-
...value.issues.map((issue) => ` - ${issue}`),
|
|
361
|
-
].join('\n'));
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
export async function renderControlPlaneStatus(runtime: CliCommandRuntime): Promise<string> {
|
|
365
|
-
return formatControlPlaneStatus(runtime, await buildControlPlaneStatusResult(runtime));
|
|
366
|
-
}
|
|
367
|
-
|
|
368
302
|
export async function renderPairing(runtime: CliCommandRuntime): Promise<string> {
|
|
369
303
|
const daemonHomeDir = join(runtime.homeDirectory, '.goodvibes', 'daemon');
|
|
370
304
|
const tokenRecord = getOrCreateCompanionToken(GOODVIBES_AGENT_PAIRING_SURFACE, { daemonHomeDir });
|
|
@@ -380,45 +314,3 @@ export async function renderPairing(runtime: CliCommandRuntime): Promise<string>
|
|
|
380
314
|
const qr = renderQrToString(generateQrMatrix(payload));
|
|
381
315
|
return [formatConnectionBlock(info, payload), '', qr].join('\n');
|
|
382
316
|
}
|
|
383
|
-
|
|
384
|
-
export async function renderRemote(runtime: CliCommandRuntime, label: 'remote' | 'bridge'): Promise<string> {
|
|
385
|
-
return await withRuntimeServices(runtime, (services) => {
|
|
386
|
-
const pools = services.remoteRunnerRegistry.listPools?.() ?? [];
|
|
387
|
-
const contracts = services.remoteRunnerRegistry.listContracts();
|
|
388
|
-
const artifacts = services.remoteRunnerRegistry.listArtifacts();
|
|
389
|
-
const value = {
|
|
390
|
-
pools: pools.length,
|
|
391
|
-
contracts: contracts.length,
|
|
392
|
-
artifacts: artifacts.length,
|
|
393
|
-
remoteFetchPrivateHosts: runtime.configManager.get('network.remoteFetch.allowPrivateHosts'),
|
|
394
|
-
};
|
|
395
|
-
return formatJsonOrText(runtime.cli)(value, [
|
|
396
|
-
`GoodVibes ${label} status`,
|
|
397
|
-
` runner pools: ${value.pools}`,
|
|
398
|
-
` contracts: ${value.contracts}`,
|
|
399
|
-
` review artifacts: ${value.artifacts}`,
|
|
400
|
-
` private-host remote fetch: ${yesNo(value.remoteFetchPrivateHosts)}`,
|
|
401
|
-
].join('\n'));
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
export function renderWeb(runtime: CliCommandRuntime): string {
|
|
406
|
-
const binding = resolveRuntimeEndpointBinding(runtime.configManager, 'web');
|
|
407
|
-
const publicBaseUrl = String(runtime.configManager.get('web.publicBaseUrl') ?? '');
|
|
408
|
-
const hasEndpointOverride = runtime.cli.flags.hostname !== undefined || runtime.cli.flags.port !== undefined;
|
|
409
|
-
const url = !hasEndpointOverride && publicBaseUrl
|
|
410
|
-
? publicBaseUrl
|
|
411
|
-
: `http://${urlHostForBindHost(binding.host)}:${binding.port}`;
|
|
412
|
-
const value = {
|
|
413
|
-
enabled: runtime.configManager.get('web.enabled'),
|
|
414
|
-
...binding,
|
|
415
|
-
url,
|
|
416
|
-
};
|
|
417
|
-
return formatJsonOrText(runtime.cli)(value, [
|
|
418
|
-
'GoodVibes web',
|
|
419
|
-
` enabled: ${yesNo(value.enabled)}`,
|
|
420
|
-
` bind: ${value.hostMode} ${value.host}:${value.port}`,
|
|
421
|
-
` url: ${value.url}`,
|
|
422
|
-
...(runtime.cli.flags.open ? [` open: ${openBrowser(value.url)}`] : []),
|
|
423
|
-
].join('\n'));
|
|
424
|
-
}
|
package/src/cli/management.ts
CHANGED
|
@@ -28,10 +28,8 @@ import { classifyProviderSetup } from './provider-classification.ts';
|
|
|
28
28
|
import { resolveRuntimeEndpointBinding } from './endpoints.ts';
|
|
29
29
|
import { applyRuntimeEndpointFlagOverrides } from './config-overrides.ts';
|
|
30
30
|
import type { RuntimeEndpointId } from './endpoints.ts';
|
|
31
|
-
import { handleServiceCommand } from './service-command.ts';
|
|
32
31
|
import { handleBundleCommand } from './bundle-command.ts';
|
|
33
|
-
import {
|
|
34
|
-
import { buildControlPlaneStatusResult, formatControlPlaneStatus, handleSecrets, handleSessions, handleTasks, renderPairing, renderRemote, renderSubscriptions, renderWeb } from './management-commands.ts';
|
|
32
|
+
import { handleSecrets, handleSessions, handleTasks, renderPairing, renderSubscriptions } from './management-commands.ts';
|
|
35
33
|
import { handleAgentKnowledgeCommand, handleAgentKnowledgeShortcutCommand, handleCompatCommand, handleDelegateCommand } from './agent-knowledge-command.ts';
|
|
36
34
|
import { handleProfilesCommand } from './profiles-command.ts';
|
|
37
35
|
import { handleRoutinesCommand } from './routines-command.ts';
|
|
@@ -672,14 +670,6 @@ export async function handleGoodVibesCliCommand(runtime: CliCommandRuntime): Pro
|
|
|
672
670
|
switch (runtime.cli.command) {
|
|
673
671
|
case 'run':
|
|
674
672
|
return { handled: true, exitCode: await runNonInteractiveAgent(runtime) };
|
|
675
|
-
case 'web':
|
|
676
|
-
console.log(renderWeb(runtime));
|
|
677
|
-
return { handled: true, exitCode: 0 };
|
|
678
|
-
case 'service': {
|
|
679
|
-
const result = await handleServiceCommand(runtime);
|
|
680
|
-
console.log(result.output);
|
|
681
|
-
return { handled: true, exitCode: result.exitCode };
|
|
682
|
-
}
|
|
683
673
|
case 'providers': {
|
|
684
674
|
const output = await renderProviders(runtime);
|
|
685
675
|
console.log(output);
|
|
@@ -747,21 +737,6 @@ export async function handleGoodVibesCliCommand(runtime: CliCommandRuntime): Pro
|
|
|
747
737
|
if (output) console.log(output);
|
|
748
738
|
return { handled: true, exitCode: exitCodeForText(output) };
|
|
749
739
|
}
|
|
750
|
-
case 'surfaces': {
|
|
751
|
-
const result = await handleSurfacesCommand(runtime);
|
|
752
|
-
console.log(result.output);
|
|
753
|
-
return { handled: true, exitCode: result.exitCode };
|
|
754
|
-
}
|
|
755
|
-
case 'listener': {
|
|
756
|
-
const result = await buildListenerTestResult(runtime);
|
|
757
|
-
console.log(formatListenerTestResult(runtime, result));
|
|
758
|
-
return { handled: true, exitCode: result.issues.length > 0 ? 1 : 0 };
|
|
759
|
-
}
|
|
760
|
-
case 'control-plane': {
|
|
761
|
-
const result = await buildControlPlaneStatusResult(runtime);
|
|
762
|
-
console.log(formatControlPlaneStatus(runtime, result));
|
|
763
|
-
return { handled: true, exitCode: result.issues.length > 0 ? 1 : 0 };
|
|
764
|
-
}
|
|
765
740
|
case 'pair':
|
|
766
741
|
console.log(await renderPairing(runtime));
|
|
767
742
|
return { handled: true, exitCode: 0 };
|
|
@@ -770,12 +745,6 @@ export async function handleGoodVibesCliCommand(runtime: CliCommandRuntime): Pro
|
|
|
770
745
|
console.log(result.output);
|
|
771
746
|
return { handled: true, exitCode: result.exitCode };
|
|
772
747
|
}
|
|
773
|
-
case 'remote':
|
|
774
|
-
console.log(await renderRemote(runtime, 'remote'));
|
|
775
|
-
return { handled: true, exitCode: 0 };
|
|
776
|
-
case 'bridge':
|
|
777
|
-
console.log(await renderRemote(runtime, 'bridge'));
|
|
778
|
-
return { handled: true, exitCode: 0 };
|
|
779
748
|
default:
|
|
780
749
|
return { handled: false, exitCode: 0 };
|
|
781
750
|
}
|
|
@@ -39,7 +39,7 @@ const REQUIRED_TARBALL_PATHS = [
|
|
|
39
39
|
'tsconfig.json',
|
|
40
40
|
'docs/README.md',
|
|
41
41
|
'docs/getting-started.md',
|
|
42
|
-
'docs/
|
|
42
|
+
'docs/runtime-connection.md',
|
|
43
43
|
'docs/release-and-publishing.md',
|
|
44
44
|
] as const;
|
|
45
45
|
const FORBIDDEN_TARBALL_PREFIXES = ['.github/', 'src/test/', 'src/.test/', '.goodvibes/', 'vendor/'] as const;
|
|
@@ -53,7 +53,7 @@ const PACKAGE_FACING_TEXT_PATHS = [
|
|
|
53
53
|
'CHANGELOG.md',
|
|
54
54
|
'docs/README.md',
|
|
55
55
|
'docs/getting-started.md',
|
|
56
|
-
'docs/
|
|
56
|
+
'docs/runtime-connection.md',
|
|
57
57
|
'docs/release-and-publishing.md',
|
|
58
58
|
] as const;
|
|
59
59
|
const PACKAGE_FACING_FORBIDDEN_TEXT = [
|
|
@@ -74,9 +74,22 @@ const PACKAGE_FACING_FORBIDDEN_TEXT = [
|
|
|
74
74
|
['capabilities', ' audit'].join(''),
|
|
75
75
|
['capabilities', ' command'].join(''),
|
|
76
76
|
['near', '-fork'].join(''),
|
|
77
|
+
['Optional ', 'Browser Access'].join(''),
|
|
78
|
+
['Optional ', 'Other-Device Access'].join(''),
|
|
79
|
+
['Optional ', 'Incoming Events'].join(''),
|
|
80
|
+
['Service ', '& Network'].join(''),
|
|
81
|
+
['Surfaces ', '& Integrations'].join(''),
|
|
82
|
+
['runtime', '-isolation'].join(''),
|
|
77
83
|
['goodvibes-agent', 'serve'].join(' '),
|
|
78
|
-
['goodvibes-agent', 'service
|
|
79
|
-
['goodvibes-agent', '
|
|
84
|
+
['goodvibes-agent', 'service'].join(' '),
|
|
85
|
+
['goodvibes-agent', 'services'].join(' '),
|
|
86
|
+
['goodvibes-agent', 'surfaces'].join(' '),
|
|
87
|
+
['goodvibes-agent', 'surface'].join(' '),
|
|
88
|
+
['goodvibes-agent', 'listener'].join(' '),
|
|
89
|
+
['goodvibes-agent', 'control-plane'].join(' '),
|
|
90
|
+
['goodvibes-agent', 'remote'].join(' '),
|
|
91
|
+
['goodvibes-agent', 'bridge'].join(' '),
|
|
92
|
+
['goodvibes-agent', 'web'].join(' '),
|
|
80
93
|
'Every plan must have a multi-agent execution strategy',
|
|
81
94
|
'NEVER skip WRFC',
|
|
82
95
|
'ALWAYS work in parallel when implementing a plan',
|
|
@@ -92,6 +105,7 @@ const PACKAGE_FACING_REQUIRED_TEXT: readonly {
|
|
|
92
105
|
{ path: 'README.md', required: ['/api/goodvibes-agent/knowledge'] },
|
|
93
106
|
{ path: 'docs/README.md', required: ['/api/goodvibes-agent/knowledge'] },
|
|
94
107
|
{ path: 'docs/getting-started.md', required: ['/api/goodvibes-agent/knowledge'] },
|
|
108
|
+
{ path: 'docs/runtime-connection.md', required: ['/api/goodvibes-agent/knowledge'] },
|
|
95
109
|
{ path: 'docs/release-and-publishing.md', required: ['/api/goodvibes-agent/knowledge'] },
|
|
96
110
|
];
|
|
97
111
|
|
package/src/cli/parser.ts
CHANGED
|
@@ -11,12 +11,6 @@ const COMMAND_ALIASES: Readonly<Record<string, GoodVibesCliCommand>> = {
|
|
|
11
11
|
run: 'run',
|
|
12
12
|
exec: 'run',
|
|
13
13
|
e: 'run',
|
|
14
|
-
serve: 'serve',
|
|
15
|
-
daemon: 'serve',
|
|
16
|
-
server: 'serve',
|
|
17
|
-
web: 'web',
|
|
18
|
-
service: 'service',
|
|
19
|
-
services: 'service',
|
|
20
14
|
status: 'status',
|
|
21
15
|
doctor: 'doctor',
|
|
22
16
|
onboarding: 'onboarding',
|
|
@@ -51,18 +45,8 @@ const COMMAND_ALIASES: Readonly<Record<string, GoodVibesCliCommand>> = {
|
|
|
51
45
|
pair: 'pair',
|
|
52
46
|
qrcode: 'pair',
|
|
53
47
|
qr: 'pair',
|
|
54
|
-
surfaces: 'surfaces',
|
|
55
|
-
surface: 'surfaces',
|
|
56
|
-
listener: 'listener',
|
|
57
|
-
'http-listener': 'listener',
|
|
58
|
-
webhook: 'listener',
|
|
59
|
-
'control-plane': 'control-plane',
|
|
60
|
-
controlplane: 'control-plane',
|
|
61
|
-
cp: 'control-plane',
|
|
62
48
|
bundle: 'bundle',
|
|
63
49
|
bundles: 'bundle',
|
|
64
|
-
remote: 'remote',
|
|
65
|
-
bridge: 'bridge',
|
|
66
50
|
completion: 'completion',
|
|
67
51
|
completions: 'completion',
|
|
68
52
|
help: 'help',
|
package/src/cli/status.ts
CHANGED
|
@@ -163,7 +163,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
163
163
|
summary: issue,
|
|
164
164
|
cause: 'The service lifecycle inspection found a mismatch between configured service/surface state and observed host state.',
|
|
165
165
|
impact: 'Runtime API, listener, or web availability may not match the configuration.',
|
|
166
|
-
action: 'Use
|
|
166
|
+
action: 'Use Agent status and doctor diagnostics here, then manage the runtime from GoodVibes TUI or your host tooling.',
|
|
167
167
|
});
|
|
168
168
|
}
|
|
169
169
|
}
|
package/src/cli/types.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
export type GoodVibesCliCommand =
|
|
2
2
|
| 'tui'
|
|
3
3
|
| 'run'
|
|
4
|
-
| 'serve'
|
|
5
|
-
| 'web'
|
|
6
|
-
| 'service'
|
|
7
4
|
| 'status'
|
|
8
5
|
| 'doctor'
|
|
9
6
|
| 'onboarding'
|
|
@@ -22,12 +19,7 @@ export type GoodVibesCliCommand =
|
|
|
22
19
|
| 'sessions'
|
|
23
20
|
| 'tasks'
|
|
24
21
|
| 'pair'
|
|
25
|
-
| 'surfaces'
|
|
26
|
-
| 'listener'
|
|
27
|
-
| 'control-plane'
|
|
28
22
|
| 'bundle'
|
|
29
|
-
| 'remote'
|
|
30
|
-
| 'bridge'
|
|
31
23
|
| 'completion'
|
|
32
24
|
| 'help'
|
|
33
25
|
| 'version'
|