@pellux/goodvibes-agent 0.1.61 → 0.1.62
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 +6 -0
- package/README.md +8 -8
- package/docs/README.md +2 -2
- package/docs/deployment-and-services.md +8 -8
- package/docs/getting-started.md +9 -9
- package/docs/release-and-publishing.md +4 -4
- package/package.json +1 -1
- package/src/agent/routine-schedule-format.ts +20 -20
- package/src/agent/routine-schedule-promotion.ts +1 -1
- package/src/agent/routine-schedule-receipts.ts +1 -1
- package/src/cli/agent-knowledge-command.ts +7 -7
- package/src/cli/entrypoint.ts +2 -2
- package/src/cli/help.ts +14 -14
- package/src/cli/management-commands.ts +3 -3
- package/src/cli/service-command.ts +1 -1
- package/src/cli/service-posture.ts +6 -6
- package/src/cli/status.ts +12 -12
- package/src/cli/surface-command.ts +5 -5
- package/src/input/agent-workspace-categories.ts +18 -18
- package/src/input/agent-workspace-editors.ts +1 -1
- package/src/input/agent-workspace-setup.ts +3 -3
- package/src/input/commands/delegation-runtime.ts +1 -1
- package/src/input/commands/schedule-runtime.ts +3 -3
- package/src/input/commands/shell-core.ts +1 -1
- package/src/input/handler-onboarding.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-steps.ts +13 -13
- package/src/input/settings-modal-agent-policy.ts +1 -1
- package/src/renderer/agent-workspace.ts +5 -5
- package/src/renderer/settings-modal.ts +7 -7
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GoodVibes Agent will be recorded here.
|
|
4
4
|
|
|
5
|
+
## 0.1.62 - 2026-05-31
|
|
6
|
+
|
|
7
|
+
- Tightened primary CLI help around Agent workflows instead of advanced runtime diagnostics.
|
|
8
|
+
- Reworded onboarding, workspace, and routine schedule surfaces toward Agent/operator language.
|
|
9
|
+
- Kept schedule promotion explicit while removing stale daemon-schedule wording from user-facing flows.
|
|
10
|
+
|
|
5
11
|
## 0.1.61 - 2026-05-31
|
|
6
12
|
|
|
7
13
|
- ff6766d Stop shipping repo-local skills
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
GoodVibes Agent is the personal operator assistant built on the GoodVibes terminal UI foundation. This repository is intentionally in a near-fork baseline phase: the shell, renderer, input, fullscreen workspace, command, and release bones are copied from the terminal product first, then the coding-specific behavior is removed or reshaped deliberately.
|
|
7
7
|
|
|
8
|
-
The Agent product connects to an already-running GoodVibes
|
|
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
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -65,7 +65,7 @@ goodvibes-agent --agent-profile household status
|
|
|
65
65
|
GOODVIBES_AGENT_HOME=/path/to/agent-home goodvibes-agent status
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
Profiles isolate Agent-local config, sessions, local memory, personas, skills, routines, and setup state. Starter templates seed local personas, skills, and routines for household, research, travel, operations, and personal productivity profiles; exported starter JSON can be edited and re-imported as a local starter. The
|
|
68
|
+
Profiles isolate Agent-local config, sessions, local memory, personas, skills, routines, and setup state. Starter templates seed local personas, skills, and routines for household, research, travel, operations, and personal productivity profiles; exported starter JSON can be edited and re-imported as a local starter. The GoodVibes runtime is still external and shared unless the owning host is separately configured otherwise.
|
|
69
69
|
|
|
70
70
|
Local Agent behavior is editable from the TUI:
|
|
71
71
|
|
|
@@ -81,13 +81,13 @@ Local Agent behavior is editable from the TUI:
|
|
|
81
81
|
/skills local list
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
Starting a routine records local usage and prints its steps; it does not spawn background agents or
|
|
84
|
+
Starting a routine records local usage and prints its steps; it does not spawn background agents or automation jobs. Promotion to an external schedule is separate and explicit: it calls the public `schedules.create` route only after `--yes`, can include explicit delivery targets such as `--delivery-surface slack`, records a redacted local receipt, and the generated scheduled prompt keeps Agent Knowledge isolated from default Knowledge/Wiki and non-Agent knowledge segments. Use `/schedule reconcile` to compare those local receipts against live external schedules through public `schedules.list`.
|
|
85
85
|
|
|
86
|
-
##
|
|
86
|
+
## Runtime Prerequisite
|
|
87
87
|
|
|
88
|
-
Start or restart the
|
|
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 intentionally blocks
|
|
90
|
+
Agent intentionally blocks runtime lifecycle commands:
|
|
91
91
|
|
|
92
92
|
```sh
|
|
93
93
|
goodvibes-agent serve
|
|
@@ -95,7 +95,7 @@ goodvibes-agent service start
|
|
|
95
95
|
goodvibes-agent surfaces enable web
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
-
Those commands should return explicit external-
|
|
98
|
+
Those commands should return explicit external-runtime guidance instead of mutating local service posture.
|
|
99
99
|
|
|
100
100
|
## Product Boundary
|
|
101
101
|
|
|
@@ -103,7 +103,7 @@ GoodVibes Agent owns the operator assistant surface: serial assistant flow, proa
|
|
|
103
103
|
|
|
104
104
|
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.
|
|
105
105
|
|
|
106
|
-
GoodVibes TUI owns coding execution: file edits, git/worktree workflows, coding panels, runtime-isolation UX, and WRFC execution. Agent may delegate explicit build/fix/review work to TUI through public
|
|
106
|
+
GoodVibes TUI owns coding execution: file edits, git/worktree workflows, coding panels, runtime-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.
|
|
107
107
|
|
|
108
108
|
## Package Docs
|
|
109
109
|
|
package/docs/README.md
CHANGED
|
@@ -15,8 +15,8 @@ Important baseline constraints:
|
|
|
15
15
|
- Agent installs one executable: `goodvibes-agent`.
|
|
16
16
|
- Agent uses Bun and TypeScript-authored source.
|
|
17
17
|
- Agent depends on `@pellux/goodvibes-sdk@0.33.35`.
|
|
18
|
-
- Agent connects to an externally managed
|
|
19
|
-
- Agent does not start, stop, restart, install, uninstall, or own
|
|
18
|
+
- Agent connects to an externally managed GoodVibes runtime.
|
|
19
|
+
- Agent does not start, stop, restart, install, uninstall, or own runtime connectivity or service lifecycle.
|
|
20
20
|
- Agent Knowledge/Wiki uses only `/api/goodvibes-agent/knowledge/*`; there is no default Knowledge/Wiki or non-Agent product fallback.
|
|
21
21
|
- 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>`.
|
|
22
22
|
- 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.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# Deployment And Services
|
|
2
2
|
|
|
3
|
-
GoodVibes Agent is a client/operator surface. It does not own
|
|
3
|
+
GoodVibes Agent is a client/operator surface. It does not own runtime or listener deployment.
|
|
4
4
|
|
|
5
5
|
## Service Ownership
|
|
6
6
|
|
|
7
7
|
Agent must not:
|
|
8
8
|
|
|
9
|
-
- start an embedded
|
|
9
|
+
- start an embedded runtime
|
|
10
10
|
- start an embedded HTTP listener
|
|
11
11
|
- install or uninstall OS services
|
|
12
|
-
- start, stop, or restart
|
|
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
|
|
15
|
+
Those operations belong to GoodVibes TUI or the owning runtime host.
|
|
16
16
|
|
|
17
17
|
## Agent Runtime
|
|
18
18
|
|
|
@@ -30,21 +30,21 @@ The executable is backed by TypeScript-authored source with a Bun shebang. Packa
|
|
|
30
30
|
- `goodvibes-agent` launches the TUI in a real PTY
|
|
31
31
|
- `goodvibes-agent smoke --json` when that command is available in the baseline being tested
|
|
32
32
|
|
|
33
|
-
## External
|
|
33
|
+
## External Runtime Connection
|
|
34
34
|
|
|
35
|
-
Agent reads configuration and tokens, then connects to an already-running
|
|
35
|
+
Agent reads configuration and tokens, then connects to an already-running GoodVibes runtime. The default local control-plane URL is normally:
|
|
36
36
|
|
|
37
37
|
```text
|
|
38
38
|
http://127.0.0.1:3421
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
If the
|
|
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
43
|
## Surface Commands
|
|
44
44
|
|
|
45
45
|
`goodvibes-agent surfaces`, `surfaces check`, and `surfaces show <surfaceId>` are read-only diagnostics.
|
|
46
46
|
|
|
47
|
-
`surfaces enable` and `surfaces disable` are intentionally blocked in Agent because they can mutate
|
|
47
|
+
`surfaces enable` and `surfaces disable` are intentionally blocked in Agent because they can mutate runtime/listener/web/channel posture.
|
|
48
48
|
|
|
49
49
|
## Release Rule
|
|
50
50
|
|
package/docs/getting-started.md
CHANGED
|
@@ -5,10 +5,10 @@ GoodVibes Agent is the installable public alpha of the personal operator assista
|
|
|
5
5
|
## Requirements
|
|
6
6
|
|
|
7
7
|
- Bun `1.3.10` or newer
|
|
8
|
-
- An already-running GoodVibes
|
|
9
|
-
- A
|
|
8
|
+
- An already-running GoodVibes runtime compatible with `@pellux/goodvibes-sdk@0.33.35`
|
|
9
|
+
- A runtime token/config path accepted by that external runtime
|
|
10
10
|
|
|
11
|
-
Agent does not launch the
|
|
11
|
+
Agent does not launch the runtime for you.
|
|
12
12
|
|
|
13
13
|
## Install From Package
|
|
14
14
|
|
|
@@ -46,7 +46,7 @@ Once the TUI opens, run `/agent`, `/home`, or `/operator` to open the Agent oper
|
|
|
46
46
|
|
|
47
47
|
Use `/agent-profile guide` inside that workspace to walk through starter-profile authoring. It lists built-in and local starters, exports a JSON starter for editing, imports the edited starter back into this Agent home, and creates isolated profiles from the result.
|
|
48
48
|
|
|
49
|
-
Use `/schedule receipts` to review redacted local routine promotion history and `/schedule reconcile` to compare those receipts with live
|
|
49
|
+
Use `/schedule receipts` to review redacted local routine promotion history and `/schedule reconcile` to compare those receipts with live external schedules through public `schedules.list`.
|
|
50
50
|
|
|
51
51
|
## Isolated Agent Profiles
|
|
52
52
|
|
|
@@ -67,7 +67,7 @@ goodvibes-agent --agent-profile household status
|
|
|
67
67
|
goodvibes-agent --agent-profile household
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
Named profiles isolate Agent-local config, sessions, memory, personas, skills, routines, and setup state under a profile-specific home. Starter templates seed local personas, skills, and routines for household, research, travel, operations, and personal productivity profiles; exported starter JSON can be edited and re-imported as a local starter. They do not start or isolate the external
|
|
70
|
+
Named profiles isolate Agent-local config, sessions, memory, personas, skills, routines, and setup state under a profile-specific home. Starter templates seed local personas, skills, and routines for household, research, travel, operations, and personal productivity profiles; exported starter JSON can be edited and re-imported as a local starter. They do not start or isolate the external GoodVibes runtime by themselves.
|
|
71
71
|
|
|
72
72
|
## Local Personas, Routines, And Skills
|
|
73
73
|
|
|
@@ -85,11 +85,11 @@ Personas, routines, and reusable Agent skills are local to GoodVibes Agent. They
|
|
|
85
85
|
/skills local list
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
The active persona plus enabled Agent routines and skills are injected into the main serial assistant conversation. Starting a routine records local usage and prints its steps; it does not spawn background agents or
|
|
88
|
+
The active persona plus enabled Agent routines and skills are injected into the main serial assistant conversation. Starting a routine records local usage and prints its steps; it does not spawn background agents or automation jobs. Promoting a routine to a schedule is an explicit `schedules.create` call, requires `--yes`, writes a local redacted promotion receipt, and preserves the rule that Agent Knowledge never falls back to default Knowledge/Wiki or non-Agent knowledge segments.
|
|
89
89
|
|
|
90
|
-
## External
|
|
90
|
+
## External Runtime
|
|
91
91
|
|
|
92
|
-
Start the
|
|
92
|
+
Start the runtime from GoodVibes TUI or the owning host before using runtime-backed Agent features. Agent expects the runtime to expose the public operator/Agent routes, including:
|
|
93
93
|
|
|
94
94
|
- `/status`
|
|
95
95
|
- `/api/goodvibes-agent/knowledge/status`
|
|
@@ -99,7 +99,7 @@ Start the daemon from GoodVibes TUI or the daemon host before using daemon-backe
|
|
|
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
|
-
Agent lifecycle commands that would start or mutate
|
|
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
104
|
## Current Baseline Notes
|
|
105
105
|
|
|
@@ -9,7 +9,7 @@ GoodVibes Agent's current installable public alpha version is recorded in `packa
|
|
|
9
9
|
- SDK dependency: exact pin to `@pellux/goodvibes-sdk@0.33.35`
|
|
10
10
|
- runtime: Bun
|
|
11
11
|
- source language: TypeScript
|
|
12
|
-
-
|
|
12
|
+
- runtime ownership: external only
|
|
13
13
|
|
|
14
14
|
End users install and run GoodVibes Agent with Bun:
|
|
15
15
|
|
|
@@ -44,16 +44,16 @@ Also run the package install smoke from a packed artifact. It must prove:
|
|
|
44
44
|
- `goodvibes-agent --help` works
|
|
45
45
|
- `goodvibes-agent --version` reports the package version
|
|
46
46
|
- the installed TUI launches in a PTY and does not exit immediately
|
|
47
|
-
-
|
|
47
|
+
- runtime-backed commands fail clearly when the external GoodVibes runtime is unavailable or unauthenticated
|
|
48
48
|
- no token value is printed
|
|
49
49
|
|
|
50
50
|
## Do Not Ship
|
|
51
51
|
|
|
52
|
-
Do not publish if package-facing docs or install commands refer to another package name, another executable, or Agent-owned
|
|
52
|
+
Do not publish if package-facing docs or install commands refer to another package name, another executable, or Agent-owned runtime lifecycle.
|
|
53
53
|
|
|
54
54
|
Do not publish if Agent Knowledge commands can fall back to default Knowledge/Wiki or another product-specific knowledge route. Agent Knowledge must use the isolated `/api/goodvibes-agent/knowledge/*` segment.
|
|
55
55
|
|
|
56
|
-
Do not ship
|
|
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
|
## Near-Fork Baseline Rule
|
|
59
59
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.62",
|
|
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",
|
|
@@ -27,16 +27,16 @@ export function formatRoutineSchedulePreview(preview: RoutineSchedulePromotionPr
|
|
|
27
27
|
const delivery = preview.payload.delivery;
|
|
28
28
|
const deliveryTargetCount = delivery?.targets.length ?? 0;
|
|
29
29
|
return [
|
|
30
|
-
'
|
|
30
|
+
'GoodVibes schedule preview for Agent routine',
|
|
31
31
|
` routine: ${preview.routineName} (${preview.routineId})`,
|
|
32
32
|
` route: ${preview.method} ${preview.route}`,
|
|
33
|
-
` name: ${String(preview.payload.name ?? '(
|
|
33
|
+
` name: ${String(preview.payload.name ?? '(runtime default)')}`,
|
|
34
34
|
` schedule: ${preview.payload.kind} ${schedule}`,
|
|
35
35
|
` enabled: ${preview.payload.enabled === false ? 'no' : 'yes'}`,
|
|
36
36
|
` delivery: ${delivery?.mode ?? 'none'}${deliveryTargetCount > 0 ? ` (${deliveryTargetCount} target${deliveryTargetCount === 1 ? '' : 's'})` : ''}`,
|
|
37
|
-
' target:
|
|
37
|
+
' target: GoodVibes runtime/main conversation route',
|
|
38
38
|
' policy: isolated Agent Knowledge only; no default wiki/non-Agent fallback; no WRFC unless explicitly delegated',
|
|
39
|
-
' next: rerun with --yes to create this
|
|
39
|
+
' next: rerun with --yes to create this external schedule',
|
|
40
40
|
].join('\n');
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -45,12 +45,12 @@ export function formatRoutineScheduleSuccess(result: RoutineSchedulePromotionSuc
|
|
|
45
45
|
const id = readString(record, 'id') ?? '(unknown)';
|
|
46
46
|
const status = readString(record, 'status') ?? (record.enabled === false ? 'paused' : 'enabled');
|
|
47
47
|
return [
|
|
48
|
-
'Created
|
|
48
|
+
'Created GoodVibes schedule for Agent routine',
|
|
49
49
|
` routine: ${result.routineName} (${result.routineId})`,
|
|
50
50
|
` schedule: ${id}`,
|
|
51
51
|
` status: ${status}`,
|
|
52
52
|
` route: ${result.kind} ${result.route}`,
|
|
53
|
-
' next: inspect with /schedule list or
|
|
53
|
+
' next: inspect with /schedule list or schedule observability',
|
|
54
54
|
].join('\n');
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -83,7 +83,7 @@ export function formatRoutineScheduleReceipt(receipt: RoutineScheduleReceipt): s
|
|
|
83
83
|
` status: ${receipt.status}`,
|
|
84
84
|
` routine: ${receipt.routineName} (${receipt.routineId})`,
|
|
85
85
|
` route: ${receipt.method} ${receipt.route}`,
|
|
86
|
-
`
|
|
86
|
+
` runtime: ${receipt.daemonBaseUrl}`,
|
|
87
87
|
` schedule: ${receipt.scheduleName}${receipt.scheduleId ? ` (${receipt.scheduleId})` : ''}`,
|
|
88
88
|
receipt.scheduleStatus ? ` schedule status: ${receipt.scheduleStatus}` : '',
|
|
89
89
|
` cadence: ${receipt.scheduleKind} ${receipt.scheduleValue}${receipt.timezone ? ` [${receipt.timezone}]` : ''}`,
|
|
@@ -101,18 +101,18 @@ export function formatRoutineScheduleReceipt(receipt: RoutineScheduleReceipt): s
|
|
|
101
101
|
export function formatRoutineScheduleCorrelation(result: RoutineScheduleCorrelationResult, limit = 10): string {
|
|
102
102
|
if (!result.ok) {
|
|
103
103
|
return [
|
|
104
|
-
`
|
|
104
|
+
`GoodVibes schedule reconciliation error: ${result.kind}`,
|
|
105
105
|
` ${result.error}`,
|
|
106
|
-
result.baseUrl ? `
|
|
106
|
+
result.baseUrl ? ` runtime: ${result.baseUrl}` : null,
|
|
107
107
|
` route: ${ROUTINE_SCHEDULE_LIST_METHOD} ${result.route}`,
|
|
108
108
|
result.kind === 'auth_required'
|
|
109
|
-
? ' next: pair/authenticate with the
|
|
109
|
+
? ' next: pair/authenticate with the external GoodVibes runtime, then retry.'
|
|
110
110
|
: null,
|
|
111
111
|
result.kind === 'daemon_unavailable'
|
|
112
|
-
? ' next: start/restart the external GoodVibes
|
|
112
|
+
? ' next: start/restart the external GoodVibes runtime from TUI or host tooling; Agent does not own runtime lifecycle.'
|
|
113
113
|
: null,
|
|
114
114
|
result.kind === 'version_mismatch' || result.kind === 'daemon_route_unavailable'
|
|
115
|
-
? ' next: update/restart the external GoodVibes
|
|
115
|
+
? ' next: update/restart the external GoodVibes runtime so public schedules.list is available.'
|
|
116
116
|
: null,
|
|
117
117
|
].filter((line): line is string => Boolean(line)).join('\n');
|
|
118
118
|
}
|
|
@@ -120,7 +120,7 @@ export function formatRoutineScheduleCorrelation(result: RoutineScheduleCorrelat
|
|
|
120
120
|
if (result.receiptCount === 0) {
|
|
121
121
|
return [
|
|
122
122
|
'Agent routine schedule reconciliation',
|
|
123
|
-
`
|
|
123
|
+
` runtime: ${result.baseUrl}`,
|
|
124
124
|
` route: ${result.kind} ${result.route}`,
|
|
125
125
|
` live schedules: ${result.scheduleCount}`,
|
|
126
126
|
' No local routine promotion receipts exist yet.',
|
|
@@ -132,7 +132,7 @@ export function formatRoutineScheduleCorrelation(result: RoutineScheduleCorrelat
|
|
|
132
132
|
const failed = result.correlations.filter((entry) => entry.liveStatus === 'failed-receipt').length;
|
|
133
133
|
return [
|
|
134
134
|
'Agent routine schedule reconciliation',
|
|
135
|
-
`
|
|
135
|
+
` runtime: ${result.baseUrl}`,
|
|
136
136
|
` route: ${result.kind} ${result.route}`,
|
|
137
137
|
` receipts: ${result.receiptCount}; live schedules: ${result.scheduleCount}; matched: ${matched}; missing: ${missing}; failed receipts: ${failed}`,
|
|
138
138
|
...correlations.map((entry) => {
|
|
@@ -153,21 +153,21 @@ export function formatRoutineScheduleCorrelation(result: RoutineScheduleCorrelat
|
|
|
153
153
|
|
|
154
154
|
export function formatRoutineScheduleFailure(failure: RoutineSchedulePromotionFailure): string {
|
|
155
155
|
return [
|
|
156
|
-
`
|
|
156
|
+
`GoodVibes schedule error: ${failure.kind}`,
|
|
157
157
|
` ${failure.error}`,
|
|
158
|
-
failure.baseUrl ? `
|
|
158
|
+
failure.baseUrl ? ` runtime: ${failure.baseUrl}` : null,
|
|
159
159
|
` route: ${ROUTINE_SCHEDULE_METHOD} ${failure.route}`,
|
|
160
160
|
failure.kind === 'version_mismatch' && failure.daemonVersion && failure.expectedSdkVersion
|
|
161
|
-
? ` versions:
|
|
161
|
+
? ` versions: runtime=${failure.daemonVersion} expected=${failure.expectedSdkVersion}`
|
|
162
162
|
: null,
|
|
163
163
|
failure.kind === 'auth_required'
|
|
164
|
-
? ' next: pair/authenticate with the
|
|
164
|
+
? ' next: pair/authenticate with the external GoodVibes runtime, then retry with --yes.'
|
|
165
165
|
: null,
|
|
166
166
|
failure.kind === 'daemon_unavailable'
|
|
167
|
-
? ' next: start/restart the external GoodVibes
|
|
167
|
+
? ' next: start/restart the external GoodVibes runtime from TUI or host tooling; Agent does not own runtime lifecycle.'
|
|
168
168
|
: null,
|
|
169
169
|
failure.kind === 'version_mismatch' || failure.kind === 'daemon_route_unavailable'
|
|
170
|
-
? ' next: update/restart the external GoodVibes
|
|
170
|
+
? ' next: update/restart the external GoodVibes runtime so public schedules.create is available.'
|
|
171
171
|
: null,
|
|
172
172
|
].filter((line): line is string => Boolean(line)).join('\n');
|
|
173
173
|
}
|
|
@@ -393,7 +393,7 @@ async function classifyScheduleError(
|
|
|
393
393
|
return {
|
|
394
394
|
ok: false,
|
|
395
395
|
kind: 'version_mismatch',
|
|
396
|
-
error: `External
|
|
396
|
+
error: `External runtime SDK version ${daemonVersion} does not match Agent SDK pin ${SDK_VERSION}; schedules.create is unavailable.`,
|
|
397
397
|
route: ROUTINE_SCHEDULE_ROUTE,
|
|
398
398
|
baseUrl: connection.baseUrl,
|
|
399
399
|
daemonVersion,
|
|
@@ -454,7 +454,7 @@ async function classifyScheduleListError(
|
|
|
454
454
|
return {
|
|
455
455
|
ok: false,
|
|
456
456
|
kind: 'version_mismatch',
|
|
457
|
-
error: `External
|
|
457
|
+
error: `External runtime SDK version ${daemonVersion} does not match Agent SDK pin ${SDK_VERSION}; schedules.list is unavailable.`,
|
|
458
458
|
route: ROUTINE_SCHEDULE_ROUTE,
|
|
459
459
|
baseUrl: connection.baseUrl,
|
|
460
460
|
daemonVersion,
|
|
@@ -214,7 +214,7 @@ async function classifyKnowledgeError(error: unknown, connection: AgentDaemonCon
|
|
|
214
214
|
return {
|
|
215
215
|
ok: false,
|
|
216
216
|
kind: 'version_mismatch',
|
|
217
|
-
error: `External
|
|
217
|
+
error: `External runtime SDK version ${daemonVersion} does not match Agent SDK pin ${metadata.sdkVersion}; Agent Knowledge route is unavailable.`,
|
|
218
218
|
baseUrl: connection.baseUrl,
|
|
219
219
|
route,
|
|
220
220
|
daemonVersion,
|
|
@@ -419,16 +419,16 @@ function formatFailure(failure: AgentKnowledgeFailure, json: boolean): string {
|
|
|
419
419
|
return [
|
|
420
420
|
`Agent Knowledge error: ${failure.kind}`,
|
|
421
421
|
` ${failure.error}`,
|
|
422
|
-
`
|
|
422
|
+
` runtime: ${failure.baseUrl}`,
|
|
423
423
|
` route: ${failure.route}`,
|
|
424
424
|
failure.kind === 'version_mismatch' && failure.daemonVersion && failure.expectedSdkVersion
|
|
425
|
-
? ` versions:
|
|
425
|
+
? ` versions: runtime=${failure.daemonVersion} expected=${failure.expectedSdkVersion}`
|
|
426
426
|
: null,
|
|
427
427
|
failure.kind === 'version_mismatch'
|
|
428
|
-
? ' next: update/restart the external GoodVibes
|
|
428
|
+
? ' next: update/restart the external GoodVibes runtime so /status matches the Agent SDK pin.'
|
|
429
429
|
: null,
|
|
430
430
|
failure.kind === 'daemon_route_unavailable'
|
|
431
|
-
? ' next: update/restart the external GoodVibes
|
|
431
|
+
? ' next: update/restart the external GoodVibes runtime to the SDK version required by this Agent package.'
|
|
432
432
|
: null,
|
|
433
433
|
].filter((line): line is string => Boolean(line)).join('\n');
|
|
434
434
|
}
|
|
@@ -615,11 +615,11 @@ export async function handleCompatCommand(runtime: CliCommandRuntime): Promise<C
|
|
|
615
615
|
'GoodVibes Agent compatibility',
|
|
616
616
|
` package: ${metadata.version}`,
|
|
617
617
|
` SDK pin: ${metadata.sdkVersion}`,
|
|
618
|
-
`
|
|
618
|
+
` runtime: ${daemonVersion} at ${connection.baseUrl} (${daemon.ok ? 'reachable' : 'unreachable'})`,
|
|
619
619
|
` version compatible: ${yesNo(versionCompatible)}`,
|
|
620
620
|
` operator token: ${connection.token ? 'present' : 'missing'} (${connection.tokenPath})`,
|
|
621
621
|
` Agent knowledge route: ${knowledgeRouteReady ? 'ready' : `not ready (${knowledgeRoute.ok ? 'unknown' : knowledgeRoute.kind})`}`,
|
|
622
|
-
...(versionCompatible ? [] : [' next: update/restart the external GoodVibes
|
|
622
|
+
...(versionCompatible ? [] : [' next: update/restart the external GoodVibes runtime so /status matches the Agent SDK pin.']),
|
|
623
623
|
].join('\n');
|
|
624
624
|
return {
|
|
625
625
|
output: runtime.cli.flags.outputFormat === 'json' ? JSON.stringify(value, null, 2) : text,
|
package/src/cli/entrypoint.ts
CHANGED
|
@@ -89,8 +89,8 @@ export async function prepareShellCliRuntime(
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
if (cli.command === 'serve') {
|
|
92
|
-
console.error(`${binary} connects to an already-running GoodVibes
|
|
93
|
-
console.error('Start or manage the
|
|
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
94
|
process.exit(2);
|
|
95
95
|
}
|
|
96
96
|
|
package/src/cli/help.ts
CHANGED
|
@@ -37,9 +37,9 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
|
|
|
37
37
|
' models [provider] List/use/pin selectable models and recent model history',
|
|
38
38
|
' providers List/inspect/use provider config/auth posture',
|
|
39
39
|
' profiles Manage isolated Agent runtime profile homes',
|
|
40
|
-
' routines Inspect local routines and explicitly promote one to
|
|
40
|
+
' routines Inspect local routines and explicitly promote one to an external schedule',
|
|
41
41
|
' auth Inspect and manage local users, sessions, and bootstrap auth',
|
|
42
|
-
' compat Inspect Agent SDK pin,
|
|
42
|
+
' compat Inspect Agent SDK pin, runtime version, and Agent knowledge route readiness',
|
|
43
43
|
' knowledge Use isolated Agent Knowledge/Wiki routes',
|
|
44
44
|
' ask|search Shortcuts for isolated Agent Knowledge ask/search',
|
|
45
45
|
' delegate Explicitly delegate build/fix/review work to GoodVibes TUI',
|
|
@@ -96,8 +96,8 @@ export function renderGoodVibesHelp(binary = 'goodvibes-agent'): string {
|
|
|
96
96
|
` ${binary} delegate --wrfc "fix the failing tests in ~/work/project"`,
|
|
97
97
|
` ${binary} subscription providers`,
|
|
98
98
|
` ${binary} subscription login openai start --open`,
|
|
99
|
-
` ${binary}
|
|
100
|
-
` ${binary}
|
|
99
|
+
` ${binary} pair`,
|
|
100
|
+
` ${binary} routines list`,
|
|
101
101
|
].join('\n');
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -117,7 +117,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
117
117
|
run: {
|
|
118
118
|
usage: ['run [prompt] [--output text|json|stream-json]', 'exec [prompt]'],
|
|
119
119
|
summary: 'Run a single non-interactive agent turn and write the result to stdout.',
|
|
120
|
-
examples: ['run "summarize the current project"', 'run --output json "list risks"', 'exec --output stream-json "check
|
|
120
|
+
examples: ['run "summarize the current project"', 'run --output json "list risks"', 'exec --output stream-json "check runtime status"'],
|
|
121
121
|
},
|
|
122
122
|
onboarding: {
|
|
123
123
|
usage: ['onboarding', 'setup', 'onboarding status'],
|
|
@@ -126,7 +126,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
126
126
|
},
|
|
127
127
|
status: {
|
|
128
128
|
usage: ['status', 'status --json'],
|
|
129
|
-
summary: 'Print config, provider, auth,
|
|
129
|
+
summary: 'Print Agent config, provider, auth, runtime connection, and onboarding posture.',
|
|
130
130
|
examples: ['status', 'status --json'],
|
|
131
131
|
},
|
|
132
132
|
doctor: {
|
|
@@ -141,7 +141,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
141
141
|
},
|
|
142
142
|
profiles: {
|
|
143
143
|
usage: ['profiles list', 'profiles templates', 'profiles templates export <id> <path> --yes', 'profiles templates import <path> --yes', 'profiles show <name>', 'profiles create <name> [--template <id>] --yes', 'profiles delete <name> --yes', '--agent-profile <name>'],
|
|
144
|
-
summary: 'Create and inspect isolated Agent runtime profile homes, with starter templates for household, research, travel, operations, personal productivity, and local imported starters. A profile changes Agent-local config, sessions, memory, personas, skills, routines, and setup paths without changing the
|
|
144
|
+
summary: 'Create and inspect isolated Agent runtime profile homes, with starter templates for household, research, travel, operations, personal productivity, and local imported starters. A profile changes Agent-local config, sessions, memory, personas, skills, routines, and setup paths without changing the shared GoodVibes runtime.',
|
|
145
145
|
examples: ['profiles templates', 'profiles templates export research ./research-starter.json --yes', 'profiles templates import ./research-starter.json --yes', 'profiles create household --template household --yes', '--agent-profile household status'],
|
|
146
146
|
},
|
|
147
147
|
routines: {
|
|
@@ -154,7 +154,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
154
154
|
'routines receipt <receipt-id>',
|
|
155
155
|
'routines promote <id> (--cron <expr>|--every <interval>|--at <iso-time>) [--timezone <tz>] [--name <schedule-name>] [--provider <id>] [--model <model>] [--delivery-surface <surface[:route[:label]]>|--delivery-route <route[:label]>|--delivery-webhook <url>|--delivery-link <url>] [--disabled] --yes',
|
|
156
156
|
],
|
|
157
|
-
summary: 'Inspect Agent-local routines, review local promotion receipts, reconcile receipts against live
|
|
157
|
+
summary: 'Inspect Agent-local routines, review local promotion receipts, reconcile receipts against live external schedules, and explicitly promote a reviewed routine into a GoodVibes schedule. Without --yes, promote only prints the schedules.create preview.',
|
|
158
158
|
examples: [
|
|
159
159
|
'routines list',
|
|
160
160
|
'routines show daily-operations-sweep',
|
|
@@ -176,7 +176,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
176
176
|
},
|
|
177
177
|
compat: {
|
|
178
178
|
usage: ['compat', 'compat --json'],
|
|
179
|
-
summary: 'Inspect package SDK pin, live
|
|
179
|
+
summary: 'Inspect package SDK pin, live runtime version, and Agent-specific knowledge route readiness.',
|
|
180
180
|
examples: ['compat', 'compat --json'],
|
|
181
181
|
},
|
|
182
182
|
knowledge: {
|
|
@@ -234,17 +234,17 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
234
234
|
},
|
|
235
235
|
surfaces: {
|
|
236
236
|
usage: ['surfaces [list]', 'surfaces check', 'surfaces show <surfaceId>'],
|
|
237
|
-
summary: 'Inspect browser,
|
|
237
|
+
summary: 'Inspect advanced browser, channel, and runtime connection surfaces. Agent does not mutate runtime connection posture.',
|
|
238
238
|
examples: ['surfaces', 'surfaces check', 'surfaces show slack'],
|
|
239
239
|
},
|
|
240
240
|
listener: {
|
|
241
241
|
usage: ['listener test'],
|
|
242
|
-
summary: 'Check
|
|
242
|
+
summary: 'Check advanced inbound webhook readiness, network posture, auth, and enabled channel requirements.',
|
|
243
243
|
examples: ['listener test', 'listener test --json'],
|
|
244
244
|
},
|
|
245
245
|
'control-plane': {
|
|
246
246
|
usage: ['control-plane status'],
|
|
247
|
-
summary: 'Inspect
|
|
247
|
+
summary: 'Inspect advanced runtime API reachability, local auth, bootstrap credentials, and operator tokens.',
|
|
248
248
|
examples: ['control-plane status', 'control-plane status --json'],
|
|
249
249
|
},
|
|
250
250
|
bundle: {
|
|
@@ -264,7 +264,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
264
264
|
},
|
|
265
265
|
service: {
|
|
266
266
|
usage: ['service status', 'service check'],
|
|
267
|
-
summary: 'Inspect the externally owned GoodVibes
|
|
267
|
+
summary: 'Inspect the externally owned GoodVibes runtime service posture. Agent does not install, start, stop, restart, or uninstall the runtime.',
|
|
268
268
|
examples: ['service status', 'service check --json'],
|
|
269
269
|
},
|
|
270
270
|
completion: {
|
|
@@ -274,7 +274,7 @@ const COMMAND_HELP: Record<string, CommandHelp> = {
|
|
|
274
274
|
},
|
|
275
275
|
serve: {
|
|
276
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
|
|
277
|
+
summary: 'Unavailable in GoodVibes Agent. Agent connects to an already-running GoodVibes runtime owned by GoodVibes TUI/host tooling.',
|
|
278
278
|
examples: [],
|
|
279
279
|
},
|
|
280
280
|
remote: {
|
|
@@ -329,9 +329,9 @@ export async function buildControlPlaneStatusResult(runtime: CliCommandRuntime):
|
|
|
329
329
|
};
|
|
330
330
|
const issues: string[] = [];
|
|
331
331
|
if (enabled === true && !reachable) issues.push(`Control plane is enabled but not reachable on ${binding.host}:${binding.port}.`);
|
|
332
|
-
if (enabled === true && service.enabled !== true) issues.push('Control plane is enabled on the external
|
|
333
|
-
if (enabled === true && service.autostart !== true) issues.push('Control plane is enabled on the external
|
|
334
|
-
if (enabled === true && service.restartOnFailure !== true) issues.push('Control plane is enabled on the external
|
|
332
|
+
if (enabled === true && service.enabled !== true) issues.push('Control plane is enabled on the external runtime config, but Agent service ownership is disabled.');
|
|
333
|
+
if (enabled === true && service.autostart !== true) issues.push('Control plane is enabled on the external runtime config, but autostart is off.');
|
|
334
|
+
if (enabled === true && service.restartOnFailure !== true) issues.push('Control plane is enabled on the external runtime config, but restart-on-failure is off.');
|
|
335
335
|
if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing control plane has no local auth user store.');
|
|
336
336
|
if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing control plane still has a bootstrap credential file.');
|
|
337
337
|
return {
|
|
@@ -13,7 +13,7 @@ export async function handleServiceCommand(runtime: CliCommandRuntime): Promise<
|
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
if (sub === 'install' || sub === 'start' || sub === 'restart' || sub === 'stop' || sub === 'uninstall') {
|
|
16
|
-
const text = 'GoodVibes Agent connects to an existing
|
|
16
|
+
const text = 'GoodVibes Agent connects to an existing GoodVibes runtime and does not manage runtime lifecycle. Use GoodVibes TUI or host tooling for service mutations.';
|
|
17
17
|
return {
|
|
18
18
|
output: json ? JSON.stringify({ ok: false, kind: 'daemon_lifecycle_external', action: sub, error: text }, null, 2) : text,
|
|
19
19
|
exitCode: 2,
|
|
@@ -143,7 +143,7 @@ function resolveConfiguredLogPath(runtime: CliServiceRuntime): string | undefine
|
|
|
143
143
|
function createExternalDaemonLifecycle(logPath: string | undefined): CliExternalDaemonLifecyclePosture {
|
|
144
144
|
return {
|
|
145
145
|
platform: 'manual',
|
|
146
|
-
path: 'external
|
|
146
|
+
path: 'external GoodVibes runtime host',
|
|
147
147
|
installed: false,
|
|
148
148
|
autostart: false,
|
|
149
149
|
running: false,
|
|
@@ -151,7 +151,7 @@ function createExternalDaemonLifecycle(logPath: string | undefined): CliExternal
|
|
|
151
151
|
commandPreview: 'managed outside goodvibes-agent',
|
|
152
152
|
suggestedCommands: [],
|
|
153
153
|
lastAction: 'status',
|
|
154
|
-
pidPath: 'external
|
|
154
|
+
pidPath: 'external GoodVibes runtime host',
|
|
155
155
|
lastError: null,
|
|
156
156
|
};
|
|
157
157
|
}
|
|
@@ -184,13 +184,13 @@ export async function buildCliServicePosture(
|
|
|
184
184
|
const issues: string[] = [];
|
|
185
185
|
|
|
186
186
|
if (serverBackedEnabled && !config.enabled) {
|
|
187
|
-
issues.push('
|
|
187
|
+
issues.push('Host-owned surfaces are configured, but Agent service ownership is disabled.');
|
|
188
188
|
}
|
|
189
189
|
if (config.enabled && !config.autostart) {
|
|
190
|
-
issues.push('External
|
|
190
|
+
issues.push('External runtime service config has autostart off.');
|
|
191
191
|
}
|
|
192
192
|
if (config.enabled && !config.restartOnFailure) {
|
|
193
|
-
issues.push('External
|
|
193
|
+
issues.push('External runtime service config has restart-on-failure off.');
|
|
194
194
|
}
|
|
195
195
|
for (const endpoint of endpoints) {
|
|
196
196
|
if (endpoint.enabled && options.probe && endpoint.reachable === false) {
|
|
@@ -229,7 +229,7 @@ function yesNo(value: boolean): string {
|
|
|
229
229
|
export function formatCliServicePosture(posture: CliServicePosture, json = false): string {
|
|
230
230
|
if (json) return JSON.stringify(posture, null, 2);
|
|
231
231
|
return [
|
|
232
|
-
'GoodVibes external
|
|
232
|
+
'GoodVibes external runtime diagnostics',
|
|
233
233
|
' lifecycle: managed outside goodvibes-agent',
|
|
234
234
|
` service config enabled: ${yesNo(posture.config.enabled)}`,
|
|
235
235
|
` autostart config: ${yesNo(posture.config.autostart)}`,
|
package/src/cli/status.ts
CHANGED
|
@@ -122,10 +122,10 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
122
122
|
id: 'service-disabled-for-server-surfaces',
|
|
123
123
|
area: 'service',
|
|
124
124
|
severity: 'warning',
|
|
125
|
-
summary: '
|
|
126
|
-
cause: 'One or more
|
|
127
|
-
impact: 'The external
|
|
128
|
-
action: 'Manage surface/service posture from GoodVibes TUI or the
|
|
125
|
+
summary: 'Host-owned surfaces are configured while Agent service ownership is disabled.',
|
|
126
|
+
cause: 'One or more runtime, control-plane, listener, or web settings are enabled while service.enabled is false.',
|
|
127
|
+
impact: 'The external GoodVibes runtime must own availability for those surfaces; Agent will not start or enable them.',
|
|
128
|
+
action: 'Manage surface/service posture from GoodVibes TUI or the owning host, then use Agent for read-only diagnostics.',
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
|
|
@@ -134,10 +134,10 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
134
134
|
id: 'service-autostart-disabled',
|
|
135
135
|
area: 'service',
|
|
136
136
|
severity: 'warning',
|
|
137
|
-
summary: 'External
|
|
137
|
+
summary: 'External runtime service config has autostart off.',
|
|
138
138
|
cause: 'service.enabled is true and service.autostart is false.',
|
|
139
|
-
impact: 'The external GoodVibes
|
|
140
|
-
action: 'Configure
|
|
139
|
+
impact: 'The external GoodVibes runtime may not be available after login or reboot even though service mode is selected.',
|
|
140
|
+
action: 'Configure autostart from GoodVibes TUI or the owning host; Agent will not mutate this setting.',
|
|
141
141
|
});
|
|
142
142
|
}
|
|
143
143
|
|
|
@@ -146,10 +146,10 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
146
146
|
id: 'service-restart-disabled',
|
|
147
147
|
area: 'service',
|
|
148
148
|
severity: 'warning',
|
|
149
|
-
summary: 'External
|
|
149
|
+
summary: 'External runtime service config has restart-on-failure off.',
|
|
150
150
|
cause: 'service.enabled is true and service.restartOnFailure is false.',
|
|
151
|
-
impact: 'A crashed
|
|
152
|
-
action: 'Configure restart-on-failure from GoodVibes TUI or the
|
|
151
|
+
impact: 'A crashed runtime or listener may stay down until manually restarted.',
|
|
152
|
+
action: 'Configure restart-on-failure from GoodVibes TUI or the owning host; Agent will not mutate this setting.',
|
|
153
153
|
});
|
|
154
154
|
}
|
|
155
155
|
|
|
@@ -162,8 +162,8 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
162
162
|
severity: 'warning',
|
|
163
163
|
summary: issue,
|
|
164
164
|
cause: 'The service lifecycle inspection found a mismatch between configured service/surface state and observed host state.',
|
|
165
|
-
impact: '
|
|
166
|
-
action: 'Use goodvibes-agent service check for read-only detail, then manage the
|
|
165
|
+
impact: 'Runtime, control-plane, listener, or web availability may not match the configuration.',
|
|
166
|
+
action: 'Use goodvibes-agent service check for read-only detail, then manage the runtime from GoodVibes TUI or your host tooling.',
|
|
167
167
|
});
|
|
168
168
|
}
|
|
169
169
|
}
|
|
@@ -40,8 +40,8 @@ export async function handleSurfacesCommand(runtime: CliCommandRuntime): Promise
|
|
|
40
40
|
if (sub === 'enable' || sub === 'disable') {
|
|
41
41
|
if (!target) return { output: `Usage: goodvibes-agent surfaces ${sub} <web|listener|control-plane|surfaceId>`, exitCode: 2 };
|
|
42
42
|
const text = [
|
|
43
|
-
'GoodVibes Agent does not mutate
|
|
44
|
-
'Configure those surfaces from GoodVibes TUI or the
|
|
43
|
+
'GoodVibes Agent does not mutate runtime, listener, web, or channel surface posture.',
|
|
44
|
+
'Configure those surfaces from GoodVibes TUI or the external GoodVibes runtime host, then use `goodvibes-agent surfaces check` for read-only diagnostics.',
|
|
45
45
|
].join(' ');
|
|
46
46
|
return {
|
|
47
47
|
output: formatJsonOrText(runtime.cli)({
|
|
@@ -217,9 +217,9 @@ export async function buildListenerTestResult(runtime: CliCommandRuntime): Promi
|
|
|
217
217
|
}).filter((surface) => surface.enabled === true);
|
|
218
218
|
const issues: string[] = [];
|
|
219
219
|
if (enabled !== true) issues.push('HTTP listener is disabled.');
|
|
220
|
-
if (enabled === true && service.enabled !== true) issues.push('HTTP listener is enabled on the external
|
|
221
|
-
if (enabled === true && service.autostart !== true) issues.push('HTTP listener is enabled on the external
|
|
222
|
-
if (enabled === true && service.restartOnFailure !== true) issues.push('HTTP listener is enabled on the external
|
|
220
|
+
if (enabled === true && service.enabled !== true) issues.push('HTTP listener is enabled on the external runtime config, but Agent service ownership is disabled.');
|
|
221
|
+
if (enabled === true && service.autostart !== true) issues.push('HTTP listener is enabled on the external runtime config, but autostart is off.');
|
|
222
|
+
if (enabled === true && service.restartOnFailure !== true) issues.push('HTTP listener is enabled on the external runtime config, but restart-on-failure is off.');
|
|
223
223
|
if (isNetworkFacing(enabled, binding) && !auth.userStorePresent) issues.push('Network-facing listener has no local auth user store.');
|
|
224
224
|
if (isNetworkFacing(enabled, binding) && auth.bootstrapCredentialPresent) issues.push('Network-facing listener still has a bootstrap credential file.');
|
|
225
225
|
for (const surface of surfaces) {
|
|
@@ -13,10 +13,10 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
13
13
|
{ id: 'setup-home', label: 'Setup checklist', detail: 'Jump to the first-run checklist for provider, knowledge, personas, skills, routines, memory, channels, and voice/media.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
|
|
14
14
|
{ id: 'knowledge-home', label: 'Agent Knowledge', detail: 'Jump to isolated Agent Knowledge status, ingest, search, and review flows.', targetCategoryId: 'knowledge', kind: 'workspace', safety: 'read-only' },
|
|
15
15
|
{ id: 'memory-home', label: 'Memory, skills, routines', detail: 'Jump to local memory, persona, skill, and routine setup. These are core Agent product features.', targetCategoryId: 'memory', kind: 'workspace', safety: 'safe' },
|
|
16
|
-
{ id: 'channels-home', label: 'Channels', detail: 'Jump to companion pairing and channel readiness without changing
|
|
16
|
+
{ id: 'channels-home', label: 'Channels', detail: 'Jump to companion pairing and channel readiness without changing runtime connectivity.', targetCategoryId: 'channels', kind: 'workspace', safety: 'read-only' },
|
|
17
17
|
{ id: 'voice-home', label: 'Voice and media', detail: 'Jump to voice, TTS, image input, browser, and node posture setup.', targetCategoryId: 'voice-media', kind: 'workspace', safety: 'safe' },
|
|
18
18
|
{ id: 'help', label: 'Browse commands', detail: 'Open registry-driven command help.', command: '/help', kind: 'command', safety: 'safe' },
|
|
19
|
-
{ id: 'health', label: 'Review health', detail: 'Show the local health review surface without starting or mutating
|
|
19
|
+
{ id: 'health', label: 'Review health', detail: 'Show the local health review surface without starting or mutating runtime services.', command: '/health review', kind: 'command', safety: 'read-only' },
|
|
20
20
|
],
|
|
21
21
|
},
|
|
22
22
|
{
|
|
@@ -24,7 +24,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
24
24
|
group: 'SETUP',
|
|
25
25
|
label: 'Setup',
|
|
26
26
|
summary: 'Configuration, auth, provider, and onboarding surfaces.',
|
|
27
|
-
detail: 'Agent connects to an
|
|
27
|
+
detail: 'Agent connects to an existing GoodVibes runtime and owns local assistant configuration only. Runtime lifecycle and connectivity posture remain external.',
|
|
28
28
|
actions: [
|
|
29
29
|
{ id: 'config', label: 'Open config workspace', detail: 'Use the TUI-derived fullscreen settings workspace.', command: '/config', kind: 'command', safety: 'safe' },
|
|
30
30
|
{ id: 'onboarding', label: 'Open setup wizard', detail: 'Review Agent runtime settings in the fullscreen setup flow.', command: '/onboarding', kind: 'command', safety: 'safe' },
|
|
@@ -46,12 +46,12 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
46
46
|
group: 'SETUP',
|
|
47
47
|
label: 'Channels',
|
|
48
48
|
summary: 'Companion pairing, channel posture, and delivery safety.',
|
|
49
|
-
detail: 'Agent uses externally
|
|
49
|
+
detail: 'Agent uses externally managed channel surfaces. Pairing, account inspection, and readiness checks are visible here; inbound delivery and public channel exposure stay policy-gated.',
|
|
50
50
|
actions: [
|
|
51
51
|
{ id: 'pair', label: 'Pair companion', detail: 'Open the TUI-derived QR pairing surface for companion app setup.', command: '/pair', kind: 'command', safety: 'safe' },
|
|
52
52
|
{ id: 'communication', label: 'Communication routes', detail: 'Inspect structured communication routes and recent activity.', command: '/communication', kind: 'command', safety: 'read-only' },
|
|
53
|
-
{ id: 'setup-review', label: 'Channel setup review', detail: 'Review setup posture without starting
|
|
54
|
-
{ id: 'channel-safety', label: 'Delivery safety', detail: 'External messages, channel DMs, and public delivery targets require explicit user action and
|
|
53
|
+
{ id: 'setup-review', label: 'Channel setup review', detail: 'Review setup posture without starting inbound endpoints or mutating channel state.', command: '/setup review', kind: 'command', safety: 'read-only' },
|
|
54
|
+
{ id: 'channel-safety', label: 'Delivery safety', detail: 'External messages, channel DMs, and public delivery targets require explicit user action and runtime policy. Agent will not silently send or expose channels from this workspace.', kind: 'guidance', safety: 'blocked' },
|
|
55
55
|
],
|
|
56
56
|
},
|
|
57
57
|
{
|
|
@@ -75,13 +75,13 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
75
75
|
group: 'SETUP',
|
|
76
76
|
label: 'Voice, Media & Nodes',
|
|
77
77
|
summary: 'Voice, TTS, image input, browser surface, and node/remote posture.',
|
|
78
|
-
detail: 'Voice, media, browser, and node surfaces are first-class operator surfaces. Agent uses the GoodVibes voice/media/provider/browser/remote bones while keeping
|
|
78
|
+
detail: 'Voice, media, browser, and node surfaces are first-class operator surfaces. Agent uses the GoodVibes voice/media/provider/browser/remote bones while keeping runtime ownership external and side effects explicit.',
|
|
79
79
|
actions: [
|
|
80
80
|
{ id: 'tts-config', label: 'Configure live TTS', detail: 'Open the TUI-derived config workspace at the TTS settings group.', command: '/config tts', kind: 'command', safety: 'safe' },
|
|
81
81
|
{ id: 'tts-provider', label: 'Choose TTS provider', detail: 'Open provider/model routing for spoken responses through the settings flow.', command: '/config tts.provider', kind: 'command', safety: 'safe' },
|
|
82
82
|
{ id: 'tts-speak', label: 'Speak a prompt', detail: 'Submit a normal assistant turn and play the reply through configured live TTS. Close this workspace and provide real prompt text.', command: '/tts <prompt>', kind: 'command', safety: 'safe' },
|
|
83
83
|
{ id: 'image-attach', label: 'Attach image input', detail: 'Attach an image to the next assistant turn. Close this workspace and provide a real path and prompt.', command: '/image <path> <prompt>', kind: 'command', safety: 'safe' },
|
|
84
|
-
{ id: 'browser-surface', label: 'Browser surface status', detail: 'Inspect browser/web posture through setup diagnostics without starting
|
|
84
|
+
{ id: 'browser-surface', label: 'Browser surface status', detail: 'Inspect browser/web posture through setup diagnostics without starting inbound endpoints or runtime services.', command: '/setup services', kind: 'command', safety: 'read-only' },
|
|
85
85
|
{ id: 'mcp-browser', label: 'Browser MCP tools', detail: 'Inspect MCP servers and tools, including browser/automation roles, without mutating server setup.', command: '/mcp servers', kind: 'command', safety: 'read-only' },
|
|
86
86
|
{ id: 'node-posture', label: 'Node/remote posture', detail: 'Inspect remote runner/node posture. Dispatch remains blocked unless the task is explicit build delegation to TUI.', command: '/remote list', kind: 'command', safety: 'read-only' },
|
|
87
87
|
],
|
|
@@ -91,7 +91,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
91
91
|
group: 'SETUP',
|
|
92
92
|
label: 'Profiles & Portability',
|
|
93
93
|
summary: 'Isolated Agent homes, config profiles, and setup bundles.',
|
|
94
|
-
detail: 'Profiles isolate agent state. GoodVibes Agent exposes named runtime homes, config profile pickers, profile-sync bundles, setup transfer bundles, and support bundles while keeping the
|
|
94
|
+
detail: 'Profiles isolate agent state. GoodVibes Agent exposes named runtime homes, config profile pickers, profile-sync bundles, setup transfer bundles, and support bundles while keeping the shared runtime external.',
|
|
95
95
|
actions: [
|
|
96
96
|
{ id: 'profiles-open', label: 'Open config profiles', detail: 'Open the TUI-derived config profile picker for display/provider/behavior profile files.', command: '/profiles', kind: 'command', safety: 'safe' },
|
|
97
97
|
{ id: 'runtime-profile-guide', label: 'Starter authoring guide', detail: 'Open the Agent-local starter authoring flow inside the TUI command surface.', command: '/agent-profile guide', kind: 'command', safety: 'safe' },
|
|
@@ -109,7 +109,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
109
109
|
group: 'LEARN',
|
|
110
110
|
label: 'Memory & Skills',
|
|
111
111
|
summary: 'Local assistant memory, routines, skills, and reusable behavior.',
|
|
112
|
-
detail: 'Memory, routines, skills, and personas stay Agent-local until stable shared
|
|
112
|
+
detail: 'Memory, routines, skills, and personas stay Agent-local until stable shared registry contracts exist. Secrets must not be stored as memory.',
|
|
113
113
|
actions: [
|
|
114
114
|
{ id: 'memory', label: 'Open memory', detail: 'Inspect local/session memory commands and surfaces.', command: '/memory', kind: 'command', safety: 'read-only' },
|
|
115
115
|
{ id: 'personas', label: 'Persona library', detail: 'Open the local persona workspace for active role selection and review.', targetCategoryId: 'personas', kind: 'workspace', safety: 'safe' },
|
|
@@ -160,7 +160,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
160
160
|
group: 'LEARN',
|
|
161
161
|
label: 'Routines',
|
|
162
162
|
summary: 'Repeatable workflows for the main conversation.',
|
|
163
|
-
detail: 'Routines run in the main conversation by default. Promotion to an external
|
|
163
|
+
detail: 'Routines run in the main conversation by default. Promotion to an external schedule requires a real schedule command and --yes.',
|
|
164
164
|
actions: [
|
|
165
165
|
{ id: 'routines-list', label: 'List routines', detail: 'Print the full local Agent routine library.', command: '/routines list', kind: 'command', safety: 'read-only' },
|
|
166
166
|
{ id: 'routines-enabled', label: 'Enabled routines', detail: 'Show routines available for direct use.', command: '/routines enabled', kind: 'command', safety: 'read-only' },
|
|
@@ -173,7 +173,7 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
173
173
|
{ id: 'routines-disable', label: 'Disable selected', detail: 'Disable the selected routine without deleting it.', localKind: 'routine', localOperation: 'routine-disable', kind: 'local-operation', safety: 'safe' },
|
|
174
174
|
{ id: 'routines-review', label: 'Review selected', detail: 'Mark the selected local routine reviewed after inspecting it.', localKind: 'routine', localOperation: 'routine-review', kind: 'local-operation', safety: 'safe' },
|
|
175
175
|
{ id: 'routines-delete', label: 'Delete selected', detail: 'Open a confirmation form before deleting the selected local Agent routine.', localKind: 'routine', localOperation: 'routine-delete', kind: 'local-operation', safety: 'safe' },
|
|
176
|
-
{ id: 'routines-promote', label: 'Promote to schedule', detail: 'Create an external
|
|
176
|
+
{ id: 'routines-promote', label: 'Promote to schedule', detail: 'Create an external schedule from a reviewed routine only with real timing and --yes.', command: '/routines promote <id> --cron <expr> --yes', kind: 'command', safety: 'safe' },
|
|
177
177
|
{ id: 'routines-receipts', label: 'Promotion receipts', detail: 'Inspect local redacted routine schedule promotion receipts.', command: '/routines receipts', kind: 'command', safety: 'read-only' },
|
|
178
178
|
],
|
|
179
179
|
},
|
|
@@ -194,14 +194,14 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
194
194
|
group: 'WATCH',
|
|
195
195
|
label: 'Automation',
|
|
196
196
|
summary: 'Automation and schedule observability with explicit routine promotion.',
|
|
197
|
-
detail: 'Agent does not create local automation jobs or hidden scheduler spawns. Reviewed local routines can be promoted into
|
|
197
|
+
detail: 'Agent does not create local automation jobs or hidden scheduler spawns. Reviewed local routines can be promoted into external schedules only through an explicit schedules.create command with --yes, optional delivery targets, and a redacted local receipt.',
|
|
198
198
|
actions: [
|
|
199
199
|
{ id: 'schedule-list', label: 'List schedules', detail: 'Inspect configured jobs and history without running or mutating them.', command: '/schedule list', kind: 'command', safety: 'read-only' },
|
|
200
|
-
{ id: 'schedule-promote-routine', label: 'Promote routine', detail: 'Create an external
|
|
201
|
-
{ id: 'schedule-receipts', label: 'Promotion receipts', detail: 'Review local redacted receipt history for routine-to-
|
|
202
|
-
{ id: 'schedule-reconcile', label: 'Reconcile schedules', detail: 'Compare local promotion receipts with live
|
|
203
|
-
{ id: 'schedule-policy', label: 'Local scheduler blocked', detail: 'Local schedule add/run/remove/enable/disable remain blocked; only explicit external
|
|
204
|
-
{ id: 'health-services', label: '
|
|
200
|
+
{ id: 'schedule-promote-routine', label: 'Promote routine', detail: 'Create an external schedule from a local Agent routine. Requires a real routine id, schedule expression, optional delivery target, and explicit --yes.', command: '/schedule promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes', kind: 'command', safety: 'safe' },
|
|
201
|
+
{ id: 'schedule-receipts', label: 'Promotion receipts', detail: 'Review local redacted receipt history for routine-to-schedule promotion attempts.', command: '/schedule receipts', kind: 'command', safety: 'read-only' },
|
|
202
|
+
{ id: 'schedule-reconcile', label: 'Reconcile schedules', detail: 'Compare local promotion receipts with live external schedules using schedules.list.', command: '/schedule reconcile', kind: 'command', safety: 'read-only' },
|
|
203
|
+
{ id: 'schedule-policy', label: 'Local scheduler blocked', detail: 'Local schedule add/run/remove/enable/disable remain blocked; only explicit external schedule promotion is allowed here.', kind: 'guidance', safety: 'blocked' },
|
|
204
|
+
{ id: 'health-services', label: 'Runtime health', detail: 'Inspect runtime readiness without starting, stopping, or restarting services.', command: '/health services', kind: 'command', safety: 'read-only' },
|
|
205
205
|
],
|
|
206
206
|
},
|
|
207
207
|
{
|
|
@@ -43,7 +43,7 @@ export function createLocalEditor(kind: AgentWorkspaceLocalEditorKind): AgentWor
|
|
|
43
43
|
mode: 'create',
|
|
44
44
|
title: 'Create Routine',
|
|
45
45
|
selectedFieldIndex: 0,
|
|
46
|
-
message: 'Enter a repeatable workflow. It runs in the main conversation unless explicitly promoted to
|
|
46
|
+
message: 'Enter a repeatable workflow. It runs in the main conversation unless explicitly promoted to an external schedule.',
|
|
47
47
|
fields: [
|
|
48
48
|
{ id: 'name', label: 'Name', value: '', required: true, multiline: false, hint: 'Short routine name.' },
|
|
49
49
|
{ id: 'description', label: 'Description', value: '', required: true, multiline: false, hint: 'One-line summary of the workflow.' },
|
|
@@ -34,10 +34,10 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
34
34
|
const hasActivePersona = input.activePersonaName !== '(none)' && input.activePersonaName !== '(unavailable)';
|
|
35
35
|
return [
|
|
36
36
|
{
|
|
37
|
-
id: '
|
|
38
|
-
label: 'External
|
|
37
|
+
id: 'runtime',
|
|
38
|
+
label: 'External runtime',
|
|
39
39
|
status: 'ready',
|
|
40
|
-
detail: `Agent will connect to ${input.daemonBaseUrl};
|
|
40
|
+
detail: `Agent will connect to ${input.daemonBaseUrl}; runtime lifecycle stays external.`,
|
|
41
41
|
command: '/status',
|
|
42
42
|
},
|
|
43
43
|
{
|
|
@@ -48,7 +48,7 @@ export function registerDelegationRuntimeCommands(registry: CommandRegistry): vo
|
|
|
48
48
|
if (!operator) {
|
|
49
49
|
ctx.print([
|
|
50
50
|
'Delegation unavailable: no operator client is attached.',
|
|
51
|
-
'Use the
|
|
51
|
+
'Use the shared-session route from a configured Agent runtime, or open GoodVibes TUI in the target workspace.',
|
|
52
52
|
].join('\n'));
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
@@ -56,7 +56,7 @@ function printReadOnlyScheduleBoundary(print: (text: string) => void, requestedA
|
|
|
56
56
|
` requested: ${requestedAction}`,
|
|
57
57
|
' policy: no local Agent automation jobs, scheduled spawns, or immediate automation runs',
|
|
58
58
|
' use: /schedule list',
|
|
59
|
-
'
|
|
59
|
+
' schedule route: use /schedule promote-routine <routine> --cron <expr> --yes to create an external schedule explicitly',
|
|
60
60
|
].join('\n'));
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -90,7 +90,7 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
|
|
|
90
90
|
registry.register({
|
|
91
91
|
name: 'schedule',
|
|
92
92
|
aliases: ['sched'],
|
|
93
|
-
description: 'Inspect schedules and explicitly promote local Agent routines to
|
|
93
|
+
description: 'Inspect schedules and explicitly promote local Agent routines to external schedules',
|
|
94
94
|
usage: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes',
|
|
95
95
|
argsHint: 'list | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> [--delivery-surface slack] --yes',
|
|
96
96
|
async handler(args, ctx) {
|
|
@@ -136,7 +136,7 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
|
|
|
136
136
|
if (jobs.length === 0) {
|
|
137
137
|
ctx.print(
|
|
138
138
|
'No automation jobs.\n'
|
|
139
|
-
+ 'Local add/run/enable/disable/remove are blocked. Use /schedule promote-routine <routine> --cron <expr> --yes for an explicit external
|
|
139
|
+
+ 'Local add/run/enable/disable/remove are blocked. Use /schedule promote-routine <routine> --cron <expr> --yes for an explicit external schedule.'
|
|
140
140
|
);
|
|
141
141
|
return;
|
|
142
142
|
}
|
|
@@ -122,7 +122,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
122
122
|
{ id: '/agent-skills', label: '/agent-skills', detail: 'Create, review, and enable reusable Agent skills', category: 'Agent Operator' },
|
|
123
123
|
{ id: '/routines', label: '/routines', detail: 'Create, review, start, and promote Agent routines explicitly', category: 'Agent Operator' },
|
|
124
124
|
{ id: '/delegate', label: '/delegate [task]', detail: 'Explicit build/fix/review handoff to GoodVibes TUI', category: 'Agent Operator' },
|
|
125
|
-
{ id: '/pair', label: '/pair', detail: 'Pair companion clients through the
|
|
125
|
+
{ id: '/pair', label: '/pair', detail: 'Pair companion clients through the GoodVibes runtime', category: 'Agent Operator' },
|
|
126
126
|
{ id: '/model', label: '/model [id]', detail: 'Select LLM model', category: 'Model & Provider' },
|
|
127
127
|
{ id: '/provider', label: '/provider [name]', detail: 'Switch provider', category: 'Model & Provider' },
|
|
128
128
|
{ id: '/effort', label: '/effort [level]', detail: 'Reasoning effort (instant/low/medium/high)', category: 'Model & Provider' },
|
|
@@ -487,11 +487,11 @@ export function getOnboardingRuntimePostureForHandler(handler: InputHandler, req
|
|
|
487
487
|
export async function restartOnboardingExternalServicesIfNeededForHandler(handler: InputHandler, request: OnboardingApplyRequest): Promise<OnboardingVerificationItem[]> {
|
|
488
488
|
const externalServices = handler.uiServices.platform.externalServices;
|
|
489
489
|
const state = externalServices?.inspect();
|
|
490
|
-
const serviceStatus = state?.daemonStatus?.reason ?? (state?.daemonRunning ? 'external GoodVibes
|
|
490
|
+
const serviceStatus = state?.daemonStatus?.reason ?? (state?.daemonRunning ? 'external GoodVibes runtime appears active' : 'external GoodVibes runtime is not verified from this shell');
|
|
491
491
|
return [{
|
|
492
492
|
id: 'runtime:external-service-owned',
|
|
493
493
|
status: 'pass',
|
|
494
|
-
message: `GoodVibes Agent did not start, stop, restart, or reconfigure
|
|
494
|
+
message: `GoodVibes Agent did not start, stop, restart, or reconfigure runtime lifecycle. ${serviceStatus}`,
|
|
495
495
|
target: 'service',
|
|
496
496
|
}];
|
|
497
497
|
}
|
|
@@ -503,8 +503,8 @@ export function verifyOnboardingRuntimePostureForHandler(handler: InputHandler,
|
|
|
503
503
|
id: 'runtime:external-service-owned',
|
|
504
504
|
status: 'pass',
|
|
505
505
|
message: externalState
|
|
506
|
-
? 'GoodVibes
|
|
507
|
-
: 'GoodVibes
|
|
506
|
+
? 'GoodVibes runtime lifecycle is externally managed; Agent onboarding did not request shutdown, startup, restart, bind, or surface changes.'
|
|
507
|
+
: 'GoodVibes runtime lifecycle is externally managed; no local service controller is required for Agent onboarding.',
|
|
508
508
|
target: 'service',
|
|
509
509
|
}];
|
|
510
510
|
}
|
|
@@ -47,10 +47,10 @@ export function buildCommunicationStep(): OnboardingWizardStepDefinition {
|
|
|
47
47
|
id: 'agent-communication',
|
|
48
48
|
title: 'Channels and notifications',
|
|
49
49
|
shortLabel: 'Channels',
|
|
50
|
-
description: 'Prepare the Agent for companion pairing, messaging-channel awareness, notification delivery, and safe outbound communication without
|
|
50
|
+
description: 'Prepare the Agent for companion pairing, messaging-channel awareness, notification delivery, and safe outbound communication without changing runtime connectivity.',
|
|
51
51
|
summaryTitle: 'Communication posture',
|
|
52
52
|
summaryLines: [
|
|
53
|
-
'Companion chat: paired through the
|
|
53
|
+
'Companion chat: paired through the GoodVibes runtime',
|
|
54
54
|
'Channel accounts: inspect readiness before using them',
|
|
55
55
|
'Outbound messages: explicit user action only',
|
|
56
56
|
],
|
|
@@ -59,14 +59,14 @@ export function buildCommunicationStep(): OnboardingWizardStepDefinition {
|
|
|
59
59
|
kind: 'status',
|
|
60
60
|
id: 'agent-communication.companion',
|
|
61
61
|
label: 'Companion pairing',
|
|
62
|
-
hint: 'Use /pair from the Agent workspace to pair companion clients through the already-running
|
|
62
|
+
hint: 'Use /pair from the Agent workspace to pair companion clients through the already-running GoodVibes runtime.',
|
|
63
63
|
defaultValue: 'External service route',
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
66
|
kind: 'status',
|
|
67
67
|
id: 'agent-communication.channels',
|
|
68
68
|
label: 'Messaging channels',
|
|
69
|
-
hint: 'Use the Channels workspace to inspect account readiness, delivery posture, and recent communication without changing
|
|
69
|
+
hint: 'Use the Channels workspace to inspect account readiness, delivery posture, and recent communication without changing runtime connectivity.',
|
|
70
70
|
defaultValue: 'Inspectable',
|
|
71
71
|
},
|
|
72
72
|
{
|
|
@@ -80,7 +80,7 @@ export function buildCommunicationStep(): OnboardingWizardStepDefinition {
|
|
|
80
80
|
kind: 'status',
|
|
81
81
|
id: 'agent-communication.inbound-policy',
|
|
82
82
|
label: 'Inbound command policy',
|
|
83
|
-
hint: 'Incoming channel commands stay constrained by
|
|
83
|
+
hint: 'Incoming channel commands stay constrained by runtime policy, allowlists, and account posture.',
|
|
84
84
|
defaultValue: 'Policy gated',
|
|
85
85
|
},
|
|
86
86
|
],
|
|
@@ -169,7 +169,7 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
|
|
|
169
169
|
summaryTitle: 'Agent setup posture',
|
|
170
170
|
summaryLines: [
|
|
171
171
|
'Agent owns the operator TUI and local behavior registry.',
|
|
172
|
-
'GoodVibes
|
|
172
|
+
'GoodVibes runtime lifecycle is external to this product.',
|
|
173
173
|
`Secret policy: ${controller.getStringFieldValue('agent-setup.secret-policy', secretPolicy)}`,
|
|
174
174
|
collectionIssues > 0 ? `${collectionIssues} setup snapshot issue(s)` : 'Setup snapshot collected cleanly',
|
|
175
175
|
],
|
|
@@ -184,10 +184,10 @@ export function buildAgentSetupStep(controller: OnboardingWizardController): Onb
|
|
|
184
184
|
{
|
|
185
185
|
kind: 'status',
|
|
186
186
|
id: 'agent-setup.connection',
|
|
187
|
-
label: 'GoodVibes
|
|
187
|
+
label: 'GoodVibes runtime connection',
|
|
188
188
|
hint: collectionIssues > 0
|
|
189
189
|
? `${collectionIssues} setup snapshot issue(s) were reported. Status and doctor commands show connection details.`
|
|
190
|
-
: 'Agent connects to an already-running GoodVibes
|
|
190
|
+
: 'Agent connects to an already-running GoodVibes runtime for companion chat, work plans, approvals, automation, and Agent Knowledge.',
|
|
191
191
|
defaultValue: collectionIssues > 0 ? `${collectionIssues} issue(s)` : 'External service',
|
|
192
192
|
},
|
|
193
193
|
{
|
|
@@ -423,11 +423,11 @@ export function buildAutomationStep(): OnboardingWizardStepDefinition {
|
|
|
423
423
|
id: 'agent-automation',
|
|
424
424
|
title: 'Routines and automation',
|
|
425
425
|
shortLabel: 'Routines',
|
|
426
|
-
description: 'Set the Agent automation posture: local routines run in the main conversation, while
|
|
426
|
+
description: 'Set the Agent automation posture: local routines run in the main conversation, while external schedules remain explicit.',
|
|
427
427
|
summaryTitle: 'Routine and schedule posture',
|
|
428
428
|
summaryLines: [
|
|
429
429
|
'Local routines: reusable main-conversation workflows',
|
|
430
|
-
'
|
|
430
|
+
'External schedules: explicit promotion only',
|
|
431
431
|
'Runs/cancels/retries: command-confirmed side effects',
|
|
432
432
|
],
|
|
433
433
|
fields: [
|
|
@@ -449,7 +449,7 @@ export function buildAutomationStep(): OnboardingWizardStepDefinition {
|
|
|
449
449
|
kind: 'status',
|
|
450
450
|
id: 'agent-automation.schedule-promotion',
|
|
451
451
|
label: 'Routine-to-schedule promotion',
|
|
452
|
-
hint: 'Creating
|
|
452
|
+
hint: 'Creating external schedules from routines requires a reviewed routine, a real timing expression, optional delivery target, and explicit confirmation.',
|
|
453
453
|
defaultValue: 'Explicit command',
|
|
454
454
|
},
|
|
455
455
|
{
|
|
@@ -468,7 +468,7 @@ export function buildVoiceMediaStep(): OnboardingWizardStepDefinition {
|
|
|
468
468
|
id: 'agent-voice-media',
|
|
469
469
|
title: 'Voice and media',
|
|
470
470
|
shortLabel: 'Voice',
|
|
471
|
-
description: 'Prepare voice, speech, image input, and media understanding as Agent operator surfaces rather than
|
|
471
|
+
description: 'Prepare voice, speech, image input, and media understanding as Agent operator surfaces rather than runtime lifecycle features.',
|
|
472
472
|
summaryTitle: 'Voice and media posture',
|
|
473
473
|
summaryLines: [
|
|
474
474
|
'Voice and speech: optional operator surfaces',
|
|
@@ -637,7 +637,7 @@ export function buildReviewStep(controller: OnboardingWizardController): Onboard
|
|
|
637
637
|
id: 'review.apply',
|
|
638
638
|
action: 'apply',
|
|
639
639
|
label: 'Apply Agent settings and verify',
|
|
640
|
-
hint: 'Persist the Agent-owned settings and verify that no
|
|
640
|
+
hint: 'Persist the Agent-owned settings and verify that no runtime lifecycle, non-Agent entrypoint, default wiki, or non-Agent knowledge setup was requested.',
|
|
641
641
|
defaultValue: 'Ready',
|
|
642
642
|
},
|
|
643
643
|
],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON = 'GoodVibes Agent connects to an external
|
|
1
|
+
export const AGENT_EXTERNAL_DAEMON_SETTING_LOCK_REASON = 'GoodVibes Agent connects to an external GoodVibes runtime. Change runtime lifecycle and bind posture from the owning host; Agent settings are read-only for those controls.';
|
|
2
2
|
|
|
3
3
|
const AGENT_HIDDEN_SETTING_PREFIXES = [
|
|
4
4
|
['cloud', 'flare.'].join(''),
|
|
@@ -153,8 +153,8 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
|
|
|
153
153
|
);
|
|
154
154
|
} else if (category.id === 'setup') {
|
|
155
155
|
base.push(
|
|
156
|
-
{ text: `External
|
|
157
|
-
{ text: `
|
|
156
|
+
{ text: `External runtime: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
|
|
157
|
+
{ text: `Runtime ownership: ${snapshot.daemonOwnership}; Agent never starts or restarts it`, fg: PALETTE.good },
|
|
158
158
|
{ text: `Workspace: ${snapshot.workingDirectory}`, fg: PALETTE.muted },
|
|
159
159
|
{ text: `Home: ${snapshot.homeDirectory}`, fg: PALETTE.muted },
|
|
160
160
|
{ text: '' },
|
|
@@ -166,7 +166,7 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
|
|
|
166
166
|
const configuredDefaults = snapshot.channels.filter((channel) => channel.defaultTarget === 'configured').length;
|
|
167
167
|
const disabledChannels = snapshot.channels.filter((channel) => !channel.enabled).map((channel) => channel.label).join(', ');
|
|
168
168
|
base.push(
|
|
169
|
-
{ text: `External
|
|
169
|
+
{ text: `External runtime: ${snapshot.daemonBaseUrl}`, fg: PALETTE.info },
|
|
170
170
|
{ text: `Readiness: ${readyCount}/${snapshot.channels.length} ready; ${enabledCount} enabled; ${configuredDefaults} default target(s) configured.`, fg: PALETTE.info },
|
|
171
171
|
{ text: `Disabled channels: ${disabledChannels || 'none'}.`, fg: PALETTE.dim },
|
|
172
172
|
{ text: 'Pairing: use /pair or /qrcode for companion setup.', fg: PALETTE.info },
|
|
@@ -208,7 +208,7 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
|
|
|
208
208
|
{ text: `Config profiles: ${snapshot.configProfileCount}`, fg: PALETTE.info },
|
|
209
209
|
{ text: 'Named runtime profiles isolate Agent-local config, sessions, memory, personas, skills, routines, setup, and bundles.', fg: PALETTE.good },
|
|
210
210
|
{ text: 'Starter authoring: browse, export, edit, import, and create Agent profiles from inside this workspace via /agent-profile.', fg: PALETTE.info },
|
|
211
|
-
{ text: 'The external
|
|
211
|
+
{ text: 'The external GoodVibes runtime remains shared unless the owning host is configured separately.', fg: PALETTE.warn },
|
|
212
212
|
{ text: 'Portable bundles require explicit export/import commands with real paths and --yes.', fg: PALETTE.muted },
|
|
213
213
|
);
|
|
214
214
|
} else if (category.id === 'memory') {
|
|
@@ -240,7 +240,7 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
|
|
|
240
240
|
base.push(
|
|
241
241
|
{ text: `Routines: ${snapshot.localRoutineCount}; enabled: ${snapshot.enabledRoutineCount}`, fg: PALETTE.info },
|
|
242
242
|
{ text: 'Routines are repeatable main-conversation workflows. Starting one does not create hidden jobs.', fg: PALETTE.good },
|
|
243
|
-
{ text: 'Scheduling a reviewed routine is explicit and writes to the
|
|
243
|
+
{ text: 'Scheduling a reviewed routine is explicit and writes to the external GoodVibes runtime only with --yes.', fg: PALETTE.warn },
|
|
244
244
|
{ text: '' },
|
|
245
245
|
...localLibraryLines('Routine Library', snapshot.localRoutines, 'No local routines yet. Create one here with Create routine.', workspace.selectedLocalLibraryItem('routine')?.id ?? null),
|
|
246
246
|
);
|
|
@@ -34,11 +34,11 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
|
|
|
34
34
|
wrfc: 'WRFC is external to normal Agent operation. Review these copied compatibility values only for explicit GoodVibes TUI build delegation.',
|
|
35
35
|
helper: 'Helper model defaults used by helper subsystems when they do not use the main chat route.',
|
|
36
36
|
tts: 'Text-to-speech provider, voice, and optional spoken-turn LLM overrides.',
|
|
37
|
-
service: 'External
|
|
38
|
-
controlPlane: 'External
|
|
37
|
+
service: 'External GoodVibes runtime service posture. Agent shows these compatibility keys for inspection only and does not install, start, stop, restart, or autostart services.',
|
|
38
|
+
controlPlane: 'External GoodVibes runtime control-plane settings for local admin/API access. Agent connects to that runtime and does not mutate its bind posture.',
|
|
39
39
|
httpListener: 'External HTTP listener settings for webhook and integration ingress. Agent does not start or expose the listener.',
|
|
40
40
|
web: 'External browser surface settings. Agent does not own the web listener or network bind lifecycle.',
|
|
41
|
-
batch: 'Batch execution settings reported from the external
|
|
41
|
+
batch: 'Batch execution settings reported from the external GoodVibes runtime. Agent does not own remote queue provisioning.',
|
|
42
42
|
automation: 'Scheduled and automated run settings, concurrency, timeout, catch-up, cooldown, and retention behavior.',
|
|
43
43
|
watchers: 'File/process watcher heartbeat, polling, and recovery-window behavior.',
|
|
44
44
|
runtime: 'Runtime guardrails such as companion chat limiter and event bus listener caps.',
|
|
@@ -47,10 +47,10 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
|
|
|
47
47
|
mcp: 'MCP server trust and scope review. Trust changes can expose local files, tools, databases, browsers, or remote automation depending on the server.',
|
|
48
48
|
surfaces: 'External app surfaces such as Slack, Discord, ntfy, Telegram, webhooks, chat bridges, and messaging providers.',
|
|
49
49
|
release: 'Release-channel preference.',
|
|
50
|
-
danger: 'High-impact
|
|
50
|
+
danger: 'High-impact runtime and listener switches. Agent renders host-owned switches read-only; use GoodVibes TUI or the owning host to change them.',
|
|
51
51
|
tools: 'Tool LLM and helper model routing. Empty provider/model values inherit the active chat route unless a specific helper/tool route is set.',
|
|
52
52
|
flags: 'Feature flags are SDK runtime gates. They are separate from normal config keys because they enable or disable staged runtime behavior.',
|
|
53
|
-
network: 'Read-only view of external
|
|
53
|
+
network: 'Read-only view of external GoodVibes runtime control-plane, HTTP listener, and browser web bind posture plus editable Agent network settings.',
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
const ENUM_VALUE_DESCRIPTIONS: Record<string, Record<string, string>> = {
|
|
@@ -479,7 +479,7 @@ function footerText(modal: SettingsModal): string {
|
|
|
479
479
|
if (modal.currentCategory === 'flags') return 'Focus feature flags · Up/Down flag · Left categories · Tab pane · Enter/Space toggle · Esc close';
|
|
480
480
|
const selected = modal.getSelected();
|
|
481
481
|
if (selected && isExternalDaemonOwnedSettingKey(selected.setting.key)) {
|
|
482
|
-
return 'Read-only external
|
|
482
|
+
return 'Read-only external runtime setting · Change from GoodVibes TUI or the owning host · Esc close';
|
|
483
483
|
}
|
|
484
484
|
return 'Focus settings · Up/Down setting · Left categories · Tab pane · Enter/Space edit/toggle · R reset · Esc close';
|
|
485
485
|
}
|
|
@@ -490,7 +490,7 @@ export function renderSettingsModal(
|
|
|
490
490
|
viewportHeight = 24,
|
|
491
491
|
): Line[] {
|
|
492
492
|
const notices = [
|
|
493
|
-
...(modal.lastSaveTriggeredRestart ? [`External
|
|
493
|
+
...(modal.lastSaveTriggeredRestart ? [`External runtime owner must restart ${modal.lastSaveTriggeredRestart}`] : []),
|
|
494
494
|
...(modal.lastSettingEffectMessage ? [modal.lastSettingEffectMessage] : []),
|
|
495
495
|
];
|
|
496
496
|
const metrics = getFullscreenWorkspaceMetrics({ width, height: viewportHeight });
|
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.62';
|
|
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 {
|