@pellux/goodvibes-agent 0.1.117 → 1.0.1
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 +20 -4
- package/README.md +35 -14
- package/bin/goodvibes-agent.ts +16 -2
- package/dist/package/main.js +176093 -171065
- package/docs/README.md +11 -5
- package/docs/channels-remote-and-api.md +50 -0
- package/docs/connected-host.md +3 -3
- package/docs/getting-started.md +29 -15
- package/docs/knowledge-artifacts-and-multimodal.md +91 -0
- package/docs/project-planning.md +79 -0
- package/docs/providers-and-routing.md +46 -0
- package/docs/release-and-publishing.md +44 -9
- package/docs/tools-and-commands.md +123 -0
- package/docs/voice-and-live-tts.md +51 -0
- package/package.json +2 -5
- package/src/agent/channel-delivery.ts +201 -0
- package/src/agent/media-generation.ts +159 -0
- package/src/agent/memory-prompt.ts +0 -1
- package/src/agent/note-registry.ts +329 -0
- package/src/agent/operator-actions.ts +343 -0
- package/src/agent/persona-registry.ts +15 -14
- package/src/agent/record-labels.ts +107 -0
- package/src/agent/reminder-schedule-format.ts +33 -24
- package/src/agent/reminder-schedule.ts +26 -25
- package/src/agent/routine-registry.ts +13 -12
- package/src/agent/routine-schedule-args.ts +2 -1
- package/src/agent/routine-schedule-format.ts +77 -53
- package/src/agent/routine-schedule-promotion.ts +34 -32
- package/src/agent/routine-schedule-receipts.ts +28 -26
- package/src/agent/runtime-profile-starters.ts +2 -2
- package/src/agent/runtime-profile.ts +18 -17
- package/src/agent/skill-registry.ts +25 -24
- package/src/cli/agent-knowledge-args.ts +5 -1
- package/src/cli/agent-knowledge-command.ts +39 -33
- package/src/cli/agent-knowledge-format.ts +80 -67
- package/src/cli/agent-knowledge-methods.ts +1 -1
- package/src/cli/agent-knowledge-runtime.ts +32 -26
- package/src/cli/bundle-command.ts +13 -8
- package/src/cli/config-overrides.ts +37 -36
- package/src/cli/external-runtime.ts +10 -4
- package/src/cli/help.ts +29 -11
- package/src/cli/local-library-command.ts +159 -73
- package/src/cli/management-commands.ts +98 -62
- package/src/cli/management.ts +52 -26
- package/src/cli/memory-command.ts +66 -32
- package/src/cli/parser.ts +37 -24
- package/src/cli/profiles-command.ts +52 -35
- package/src/cli/provider-auth-routes.ts +2 -1
- package/src/cli/routines-command.ts +59 -39
- package/src/cli/service-posture.ts +6 -6
- package/src/cli/status.ts +46 -121
- package/src/core/conversation-message-snapshot.ts +131 -0
- package/src/input/agent-workspace-activation.ts +33 -7
- package/src/input/agent-workspace-basic-command-editor-submission.ts +7 -3
- package/src/input/agent-workspace-basic-command-editors.ts +30 -10
- package/src/input/agent-workspace-categories.ts +276 -64
- package/src/input/agent-workspace-channel-command-editor-submission.ts +34 -0
- package/src/input/agent-workspace-channel-command-editors.ts +23 -5
- package/src/input/agent-workspace-channels.ts +35 -2
- package/src/input/agent-workspace-command-editor.ts +18 -2
- package/src/input/agent-workspace-config-reader.ts +16 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +1 -1
- package/src/input/agent-workspace-editors.ts +140 -2
- package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
- package/src/input/agent-workspace-knowledge-url-editor.ts +4 -11
- package/src/input/agent-workspace-learned-behavior.ts +2 -2
- package/src/input/agent-workspace-library-command-editor-submission.ts +1 -1
- package/src/input/agent-workspace-library-command-editors.ts +2 -2
- package/src/input/agent-workspace-local-operations.ts +218 -0
- package/src/input/agent-workspace-local-selection.ts +75 -0
- package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
- package/src/input/agent-workspace-media-command-editors.ts +27 -0
- package/src/input/agent-workspace-memory-command-editors.ts +1 -1
- package/src/input/agent-workspace-memory-editor.ts +2 -2
- package/src/input/agent-workspace-navigation.ts +38 -2
- package/src/input/agent-workspace-notify-editor-submission.ts +16 -2
- package/src/input/agent-workspace-operations-command-editor-submission.ts +63 -1
- package/src/input/agent-workspace-operations-command-editors.ts +80 -3
- package/src/input/agent-workspace-panel-route.ts +43 -0
- package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
- package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
- package/src/input/agent-workspace-search.ts +169 -0
- package/src/input/agent-workspace-setup.ts +22 -11
- package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +6 -6
- package/src/input/agent-workspace-skill-bundle-command-editors.ts +10 -10
- package/src/input/agent-workspace-snapshot.ts +112 -13
- package/src/input/agent-workspace-task-command-editors.ts +4 -4
- package/src/input/agent-workspace-token.ts +18 -2
- package/src/input/agent-workspace-types.ts +92 -4
- package/src/input/agent-workspace-voice-media.ts +3 -6
- package/src/input/agent-workspace-web-research-editor.ts +104 -0
- package/src/input/agent-workspace.ts +136 -208
- package/src/input/command-registry.ts +4 -1
- package/src/input/commands/agent-local-library-args.ts +52 -0
- package/src/input/commands/agent-runtime-profile-runtime.ts +45 -41
- package/src/input/commands/agent-skills-runtime.ts +87 -99
- package/src/input/commands/agent-workspace-runtime.ts +23 -7
- package/src/input/commands/brief-runtime.ts +25 -24
- package/src/input/commands/channels-runtime.ts +145 -31
- package/src/input/commands/delegation-runtime.ts +29 -23
- package/src/input/commands/experience-runtime.ts +6 -4
- package/src/input/commands/guidance-runtime.ts +4 -4
- package/src/input/commands/health-runtime.ts +140 -115
- package/src/input/commands/knowledge.ts +57 -56
- package/src/input/commands/local-provider-runtime.ts +36 -18
- package/src/input/commands/local-runtime.ts +138 -16
- package/src/input/commands/local-setup-review.ts +7 -7
- package/src/input/commands/mcp-runtime.ts +118 -50
- package/src/input/commands/notify-runtime.ts +38 -9
- package/src/input/commands/operator-actions-runtime.ts +138 -0
- package/src/input/commands/operator-runtime.ts +6 -17
- package/src/input/commands/personas-runtime.ts +49 -59
- package/src/input/commands/planning-runtime.ts +1 -1
- package/src/input/commands/platform-access-runtime.ts +29 -29
- package/src/input/commands/provider-accounts-runtime.ts +60 -39
- package/src/input/commands/qrcode-runtime.ts +45 -6
- package/src/input/commands/recall-bundle.ts +11 -11
- package/src/input/commands/recall-capture.ts +13 -11
- package/src/input/commands/recall-query.ts +29 -21
- package/src/input/commands/recall-review.ts +2 -1
- package/src/input/commands/routines-runtime.ts +63 -72
- package/src/input/commands/schedule-runtime.ts +33 -20
- package/src/input/commands/security-runtime.ts +4 -4
- package/src/input/commands/session-content.ts +80 -78
- package/src/input/commands/session-workflow.ts +132 -93
- package/src/input/commands/session.ts +3 -174
- package/src/input/commands/shell-core.ts +32 -17
- package/src/input/commands/subscription-runtime.ts +53 -179
- package/src/input/commands/tasks-runtime.ts +20 -20
- package/src/input/commands/work-plan-runtime.ts +33 -8
- package/src/input/commands.ts +2 -2
- package/src/input/feed-context-factory.ts +2 -1
- package/src/input/file-picker.ts +3 -2
- package/src/input/handler-command-route.ts +4 -7
- package/src/input/handler-content-actions.ts +89 -1
- package/src/input/handler-feed-routes.ts +19 -12
- package/src/input/handler-feed.ts +6 -3
- package/src/input/handler-interactions.ts +7 -5
- package/src/input/handler-modal-stack.ts +3 -3
- package/src/input/handler-onboarding.ts +24 -80
- package/src/input/handler-shortcuts.ts +15 -4
- package/src/input/handler.ts +47 -17
- package/src/input/input-history.ts +5 -6
- package/src/input/keybindings.ts +22 -11
- package/src/input/onboarding/onboarding-wizard-apply.ts +13 -0
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
- package/src/input/onboarding/onboarding-wizard-operator-steps.ts +147 -57
- package/src/input/onboarding/onboarding-wizard-steps.ts +46 -29
- package/src/input/onboarding/onboarding-wizard-types.ts +3 -1
- package/src/input/onboarding/onboarding-wizard.ts +68 -0
- package/src/input/profile-picker-modal.ts +31 -12
- package/src/input/session-picker-modal.ts +22 -4
- package/src/input/settings-modal-behavior.ts +0 -3
- package/src/input/settings-modal-subscriptions.ts +3 -3
- package/src/input/settings-modal-types.ts +2 -13
- package/src/input/settings-modal.ts +6 -52
- package/src/input/submission-intent.ts +0 -1
- package/src/input/submission-router.ts +3 -3
- package/src/main.ts +18 -8
- package/src/panels/approval-panel.ts +8 -8
- package/src/panels/automation-control-panel.ts +2 -2
- package/src/panels/base-panel.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -1
- package/src/panels/builtin/operations.ts +1 -10
- package/src/panels/builtin/session.ts +9 -9
- package/src/panels/builtin/shared.ts +2 -2
- package/src/panels/cost-tracker-panel.ts +1 -1
- package/src/panels/docs-panel.ts +5 -3
- package/src/panels/index.ts +0 -1
- package/src/panels/knowledge-panel.ts +6 -5
- package/src/panels/memory-panel.ts +7 -6
- package/src/panels/panel-list-panel.ts +36 -80
- package/src/panels/project-planning-panel.ts +18 -11
- package/src/panels/provider-account-snapshot.ts +51 -25
- package/src/panels/provider-accounts-panel.ts +33 -18
- package/src/panels/provider-health-domains.ts +45 -4
- package/src/panels/provider-health-panel.ts +5 -4
- package/src/panels/qr-panel.ts +1 -1
- package/src/panels/schedule-panel.ts +9 -17
- package/src/panels/security-panel.ts +8 -8
- package/src/panels/session-browser-panel.ts +10 -10
- package/src/panels/subscription-panel.ts +3 -3
- package/src/panels/system-messages-panel.ts +1 -1
- package/src/panels/tasks-panel.ts +20 -13
- package/src/panels/tool-inspector-panel.ts +19 -12
- package/src/panels/work-plan-panel.ts +5 -5
- package/src/planning/project-planning-coordinator.ts +1 -1
- package/src/provider-auth-route-display.ts +9 -0
- package/src/renderer/agent-workspace-style.ts +34 -0
- package/src/renderer/agent-workspace.ts +228 -52
- package/src/renderer/autocomplete-overlay.ts +25 -6
- package/src/renderer/bookmark-modal.ts +19 -4
- package/src/renderer/buffer.ts +4 -2
- package/src/renderer/context-inspector.ts +50 -13
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +19 -6
- package/src/renderer/help-overlay.ts +106 -33
- package/src/renderer/history-search-overlay.ts +19 -4
- package/src/renderer/live-tail-modal.ts +27 -5
- package/src/renderer/mcp-workspace.ts +164 -50
- package/src/renderer/model-picker-overlay.ts +58 -2
- package/src/renderer/model-workspace.ts +104 -20
- package/src/renderer/process-modal.ts +27 -6
- package/src/renderer/profile-picker-modal.ts +20 -4
- package/src/renderer/search-overlay.ts +25 -5
- package/src/renderer/selection-modal-overlay.ts +46 -14
- package/src/renderer/session-picker-modal.ts +18 -1
- package/src/renderer/settings-modal-helpers.ts +2 -40
- package/src/renderer/settings-modal.ts +83 -50
- package/src/renderer/tool-call.ts +20 -11
- package/src/runtime/agent-runtime-events.ts +6 -6
- package/src/runtime/bootstrap-command-context.ts +7 -1
- package/src/runtime/bootstrap-command-parts.ts +9 -7
- package/src/runtime/bootstrap-core.ts +19 -1
- package/src/runtime/bootstrap-hook-bridge.ts +7 -18
- package/src/runtime/bootstrap-shell.ts +4 -4
- package/src/runtime/bootstrap.ts +31 -22
- package/src/runtime/connected-host-auth.ts +7 -2
- package/src/runtime/diagnostics/panels/index.ts +2 -2
- package/src/runtime/diagnostics/panels/policy.ts +7 -7
- package/src/runtime/index.ts +2 -1
- package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
- package/src/runtime/onboarding/apply.ts +80 -79
- package/src/runtime/onboarding/derivation.ts +5 -8
- package/src/runtime/onboarding/snapshot.ts +0 -15
- package/src/runtime/onboarding/types.ts +8 -19
- package/src/runtime/onboarding/verify.ts +32 -10
- package/src/runtime/operator-token-cleanup.ts +1 -1
- package/src/runtime/services.ts +91 -22
- package/src/runtime/store/selectors/index.ts +3 -3
- package/src/runtime/store/state.ts +1 -4
- package/src/runtime/surface-feature-flags.ts +41 -6
- package/src/runtime/ui-read-models.ts +3 -4
- package/src/runtime/ui-services.ts +6 -6
- package/src/shell/blocking-input.ts +2 -1
- package/src/shell/ui-openers.ts +3 -13
- package/src/tools/agent-analysis-registry-policy.ts +0 -1
- package/src/tools/agent-channel-send-tool.ts +133 -0
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
- package/src/tools/agent-knowledge-tool.ts +170 -0
- package/src/tools/agent-local-registry-tool.ts +269 -69
- package/src/tools/agent-media-generate-tool.ts +133 -0
- package/src/tools/agent-notify-tool.ts +143 -0
- package/src/tools/agent-operator-action-tool.ts +137 -0
- package/src/tools/agent-operator-briefing-tool.ts +217 -0
- package/src/tools/agent-reminder-schedule-tool.ts +237 -0
- package/src/tools/agent-tool-policy-guard.ts +8 -8
- package/src/tools/agent-work-plan-tool.ts +256 -0
- package/src/version.ts +1 -1
- package/src/input/commands/policy-dispatch.ts +0 -339
- package/src/input/commands/policy.ts +0 -13
- package/src/panels/panel-picker.ts +0 -105
- package/src/panels/policy-panel.ts +0 -308
- package/src/renderer/panel-picker-overlay.ts +0 -202
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { createShellPathService } from '@/runtime/index.ts';
|
|
2
|
+
import { formatAgentRecordOrigin, formatAgentRecordReviewState } from '../agent/record-labels.ts';
|
|
2
3
|
import { discoverRoutines, type DiscoveredRoutineRecord } from '../agent/routine-discovery.ts';
|
|
3
4
|
import { AgentRoutineRegistry, evaluateAgentRoutineReadiness, type AgentRoutineRecord } from '../agent/routine-registry.ts';
|
|
4
5
|
import { buildAgentSkillRequirements, formatAgentSkillRequirement } from '../agent/skill-registry.ts';
|
|
5
6
|
import {
|
|
6
7
|
buildRoutineSchedulePreview,
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
promoteRoutineToConnectedSchedule,
|
|
9
|
+
resolveAgentConnectedHostConnection,
|
|
9
10
|
} from '../agent/routine-schedule-promotion.ts';
|
|
10
11
|
import { parseRoutineSchedulePromotionArgs } from '../agent/routine-schedule-args.ts';
|
|
11
12
|
import {
|
|
@@ -42,6 +43,7 @@ interface ParsedRoutineOptions {
|
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
const ROUTINE_CREATE_USAGE = 'Usage: goodvibes-agent routines create --name <name> --description <summary> --steps <steps> [--tags a,b] [--triggers a,b] [--requires-env A,B] [--requires-command gh,jq] [--enabled]';
|
|
46
|
+
const ROUTINE_VALUE_OPTIONS = ['name', 'description', 'steps', 'tags', 'triggers', 'requires-env', 'requires-command', 'requires-commands'] as const;
|
|
45
47
|
|
|
46
48
|
function jsonOrText(runtime: CliCommandRuntime, value: unknown, text: string): string {
|
|
47
49
|
return runtime.cli.flags.outputFormat === 'json' ? JSON.stringify(value, null, 2) : text;
|
|
@@ -82,19 +84,30 @@ function splitList(value: string | undefined): readonly string[] {
|
|
|
82
84
|
}
|
|
83
85
|
|
|
84
86
|
function parseRoutineOptions(args: readonly string[]): ParsedRoutineOptions {
|
|
87
|
+
const valued: ReadonlySet<string> = new Set(ROUTINE_VALUE_OPTIONS);
|
|
85
88
|
const flags = new Map<string, string>();
|
|
86
89
|
const positionals: string[] = [];
|
|
87
90
|
let yes = false;
|
|
88
91
|
for (let index = 0; index < args.length; index += 1) {
|
|
89
92
|
const token = args[index] ?? '';
|
|
93
|
+
if (token === '--') {
|
|
94
|
+
positionals.push(...args.slice(index + 1));
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
90
97
|
if (token === '--yes') {
|
|
91
98
|
yes = true;
|
|
92
99
|
continue;
|
|
93
100
|
}
|
|
94
|
-
if (token.startsWith('--')) {
|
|
95
|
-
const
|
|
101
|
+
if (token.startsWith('--') && token.length > 2) {
|
|
102
|
+
const raw = token.slice(2);
|
|
103
|
+
const equalIndex = raw.indexOf('=');
|
|
104
|
+
if (equalIndex >= 0) {
|
|
105
|
+
flags.set(raw.slice(0, equalIndex), raw.slice(equalIndex + 1));
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const key = raw;
|
|
96
109
|
const next = args[index + 1];
|
|
97
|
-
if (next !== undefined && !next.startsWith('--')) {
|
|
110
|
+
if (next !== undefined && (valued.has(key) || !next.startsWith('--'))) {
|
|
98
111
|
flags.set(key, next);
|
|
99
112
|
index += 1;
|
|
100
113
|
} else {
|
|
@@ -146,17 +159,17 @@ function parseImportFlags(args: readonly string[]): {
|
|
|
146
159
|
|
|
147
160
|
function summarizeRoutine(routine: AgentRoutineRecord): string {
|
|
148
161
|
const enabled = routine.enabled ? 'enabled' : 'disabled';
|
|
149
|
-
const tags = routine.tags.length > 0 ? `
|
|
162
|
+
const tags = routine.tags.length > 0 ? ` tags ${routine.tags.join(', ')}` : '';
|
|
150
163
|
const readiness = evaluateAgentRoutineReadiness(routine);
|
|
151
164
|
const ready = readiness.ready ? 'ready' : `needs ${readiness.missing.map(formatAgentSkillRequirement).join(',')}`;
|
|
152
|
-
return ` ${routine.id} ${enabled} ${routine.reviewState} ${ready} starts
|
|
165
|
+
return ` ${routine.id} ${enabled} ${formatAgentRecordReviewState(routine.reviewState)} ${ready} starts ${routine.startCount} ${routine.name} - ${routine.description}${tags}`;
|
|
153
166
|
}
|
|
154
167
|
|
|
155
168
|
function summarizeDiscoveredRoutine(routine: DiscoveredRoutineRecord): string {
|
|
156
169
|
const description = routine.description ? ` - ${routine.description}` : '';
|
|
157
170
|
return [
|
|
158
171
|
` ${routine.name} ${routine.origin}${description}`,
|
|
159
|
-
` path
|
|
172
|
+
` path ${routine.path}`,
|
|
160
173
|
].join('\n');
|
|
161
174
|
}
|
|
162
175
|
|
|
@@ -208,13 +221,13 @@ function renderRoutineList(title: string, path: string, routines: readonly Agent
|
|
|
208
221
|
if (routines.length === 0) {
|
|
209
222
|
return [
|
|
210
223
|
title,
|
|
211
|
-
` ${emptyMessage ?? 'No local
|
|
224
|
+
` ${emptyMessage ?? 'No Agent-local routines yet.'}`,
|
|
212
225
|
emptyMessage ? '' : ' Open /agent routines in the TUI, or use goodvibes-agent routines create for scripted setup.',
|
|
213
226
|
].filter(Boolean).join('\n');
|
|
214
227
|
}
|
|
215
228
|
return [
|
|
216
229
|
`${title} (${routines.length})`,
|
|
217
|
-
` store
|
|
230
|
+
` store ${path}`,
|
|
218
231
|
...routines.map(summarizeRoutine),
|
|
219
232
|
].join('\n');
|
|
220
233
|
}
|
|
@@ -223,20 +236,19 @@ function renderRoutine(routine: AgentRoutineRecord): string {
|
|
|
223
236
|
const readiness = evaluateAgentRoutineReadiness(routine);
|
|
224
237
|
return [
|
|
225
238
|
`Routine ${routine.name}`,
|
|
226
|
-
` id
|
|
227
|
-
` enabled
|
|
228
|
-
` readiness
|
|
229
|
-
` requirements
|
|
230
|
-
readiness.missing.length > 0 ? ` missing
|
|
231
|
-
` review
|
|
232
|
-
`
|
|
233
|
-
`
|
|
234
|
-
`
|
|
235
|
-
`
|
|
236
|
-
`
|
|
237
|
-
`
|
|
238
|
-
`
|
|
239
|
-
routine.staleReason ? ` stale reason: ${routine.staleReason}` : '',
|
|
239
|
+
` id ${routine.id}`,
|
|
240
|
+
` enabled ${routine.enabled ? 'yes' : 'no'}`,
|
|
241
|
+
` readiness ${readiness.ready ? 'ready' : 'needs setup'}`,
|
|
242
|
+
` requirements ${routine.requirements.map(formatAgentSkillRequirement).join(', ') || '(none)'}`,
|
|
243
|
+
readiness.missing.length > 0 ? ` missing ${readiness.missing.map(formatAgentSkillRequirement).join(', ')}` : '',
|
|
244
|
+
` review ${formatAgentRecordReviewState(routine.reviewState)}`,
|
|
245
|
+
` origin ${formatAgentRecordOrigin(routine.source, routine.provenance)}`,
|
|
246
|
+
` tags ${routine.tags.join(', ') || '(none)'}`,
|
|
247
|
+
` triggers ${routine.triggers.join(', ') || '(manual)'}`,
|
|
248
|
+
` started ${routine.startCount}${routine.lastStartedAt ? `; last ${routine.lastStartedAt}` : ''}`,
|
|
249
|
+
` created ${routine.createdAt}`,
|
|
250
|
+
` updated ${routine.updatedAt}`,
|
|
251
|
+
routine.staleReason ? ` stale reason ${routine.staleReason}` : '',
|
|
240
252
|
'',
|
|
241
253
|
routine.description,
|
|
242
254
|
'',
|
|
@@ -267,7 +279,7 @@ async function handleRoutinePromotion(runtime: CliCommandRuntime, args: readonly
|
|
|
267
279
|
const failure: RoutinesCommandFailure = {
|
|
268
280
|
ok: false,
|
|
269
281
|
kind: 'routine_not_found',
|
|
270
|
-
error: `Unknown Agent routine
|
|
282
|
+
error: `Unknown Agent routine ${parsed.routineId ?? ''}`,
|
|
271
283
|
};
|
|
272
284
|
return {
|
|
273
285
|
output: json ? JSON.stringify(failure, null, 2) : failure.error,
|
|
@@ -286,8 +298,8 @@ async function handleRoutinePromotion(runtime: CliCommandRuntime, args: readonly
|
|
|
286
298
|
exitCode: 0,
|
|
287
299
|
};
|
|
288
300
|
}
|
|
289
|
-
const connection =
|
|
290
|
-
const result = await
|
|
301
|
+
const connection = resolveAgentConnectedHostConnection(runtime.configManager, runtime.homeDirectory);
|
|
302
|
+
const result = await promoteRoutineToConnectedSchedule(connection, preview);
|
|
291
303
|
const receipt = routineReceiptStore(runtime).append(connection, preview, result);
|
|
292
304
|
if (!result.ok) {
|
|
293
305
|
return {
|
|
@@ -339,7 +351,7 @@ export async function handleRoutinesCommand(runtime: CliCommandRuntime): Promise
|
|
|
339
351
|
: 'Agent routines',
|
|
340
352
|
snapshot.path,
|
|
341
353
|
routines,
|
|
342
|
-
normalized === 'attention' || normalized === 'needs-setup' ? 'No local
|
|
354
|
+
normalized === 'attention' || normalized === 'needs-setup' ? 'No Agent-local routines need setup.' : undefined,
|
|
343
355
|
)),
|
|
344
356
|
exitCode: 0,
|
|
345
357
|
};
|
|
@@ -374,7 +386,7 @@ export async function handleRoutinesCommand(runtime: CliCommandRuntime): Promise
|
|
|
374
386
|
const failure: RoutinesCommandFailure = {
|
|
375
387
|
ok: false,
|
|
376
388
|
kind: 'routine_discovery_not_found',
|
|
377
|
-
error: `Unknown discovered Agent routine
|
|
389
|
+
error: `Unknown discovered Agent routine ${parsed.name}\nRun goodvibes-agent routines discover to inspect available routine files.`,
|
|
378
390
|
};
|
|
379
391
|
return {
|
|
380
392
|
output: runtime.cli.flags.outputFormat === 'json' ? JSON.stringify(failure, null, 2) : failure.error,
|
|
@@ -390,12 +402,12 @@ export async function handleRoutinesCommand(runtime: CliCommandRuntime): Promise
|
|
|
390
402
|
return {
|
|
391
403
|
output: jsonOrText(runtime, value, [
|
|
392
404
|
'Agent routine import preview',
|
|
393
|
-
` name
|
|
394
|
-
` origin
|
|
395
|
-
` path
|
|
396
|
-
` description
|
|
397
|
-
` steps characters
|
|
398
|
-
' next
|
|
405
|
+
` name ${discovered.name}`,
|
|
406
|
+
` origin ${discovered.origin}`,
|
|
407
|
+
` path ${discovered.path}`,
|
|
408
|
+
` description ${discovered.description || '(none)'}`,
|
|
409
|
+
` steps characters ${discovered.steps.length}`,
|
|
410
|
+
' next rerun with --yes to import into the Agent-local routine registry',
|
|
399
411
|
].join('\n')),
|
|
400
412
|
exitCode: 0,
|
|
401
413
|
};
|
|
@@ -420,7 +432,11 @@ export async function handleRoutinesCommand(runtime: CliCommandRuntime): Promise
|
|
|
420
432
|
data: routine,
|
|
421
433
|
};
|
|
422
434
|
return {
|
|
423
|
-
output: jsonOrText(runtime, value,
|
|
435
|
+
output: jsonOrText(runtime, value, [
|
|
436
|
+
`Imported Agent routine ${routine.id}: ${routine.name}${routine.enabled ? ' (enabled)' : ''}`,
|
|
437
|
+
` name ${routine.name}`,
|
|
438
|
+
` enabled ${routine.enabled ? 'yes' : 'no'}`,
|
|
439
|
+
].join('\n')),
|
|
424
440
|
exitCode: 0,
|
|
425
441
|
};
|
|
426
442
|
}
|
|
@@ -447,7 +463,11 @@ export async function handleRoutinesCommand(runtime: CliCommandRuntime): Promise
|
|
|
447
463
|
data: routine,
|
|
448
464
|
};
|
|
449
465
|
return {
|
|
450
|
-
output: jsonOrText(runtime, value,
|
|
466
|
+
output: jsonOrText(runtime, value, [
|
|
467
|
+
`Created Agent routine ${routine.id}: ${routine.name}${routine.enabled ? ' (enabled)' : ''}`,
|
|
468
|
+
` name ${routine.name}`,
|
|
469
|
+
` enabled ${routine.enabled ? 'yes' : 'no'}`,
|
|
470
|
+
].join('\n')),
|
|
451
471
|
exitCode: 0,
|
|
452
472
|
};
|
|
453
473
|
} catch (error) {
|
|
@@ -491,7 +511,7 @@ export async function handleRoutinesCommand(runtime: CliCommandRuntime): Promise
|
|
|
491
511
|
if (normalized === 'reconcile' || normalized === 'sync' || normalized === 'status') {
|
|
492
512
|
const store = routineReceiptStore(runtime);
|
|
493
513
|
const result = await reconcileRoutineScheduleReceipts(
|
|
494
|
-
|
|
514
|
+
resolveAgentConnectedHostConnection(runtime.configManager, runtime.homeDirectory),
|
|
495
515
|
store.snapshot(),
|
|
496
516
|
);
|
|
497
517
|
return {
|
|
@@ -504,7 +524,7 @@ export async function handleRoutinesCommand(runtime: CliCommandRuntime): Promise
|
|
|
504
524
|
if (!id) return { output: 'Usage: goodvibes-agent routines receipt <receipt-id>', exitCode: 2 };
|
|
505
525
|
const receipt = routineReceiptStore(runtime).get(id);
|
|
506
526
|
if (!receipt) {
|
|
507
|
-
const failure: RoutinesCommandFailure = { ok: false, kind: 'routine_schedule_receipt_not_found', error: `Unknown routine schedule receipt
|
|
527
|
+
const failure: RoutinesCommandFailure = { ok: false, kind: 'routine_schedule_receipt_not_found', error: `Unknown routine schedule receipt ${id}` };
|
|
508
528
|
return {
|
|
509
529
|
output: runtime.cli.flags.outputFormat === 'json' ? JSON.stringify(failure, null, 2) : failure.error,
|
|
510
530
|
exitCode: 1,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { closeSync, existsSync, openSync, readSync, statSync } from 'node:fs';
|
|
2
2
|
import net from 'node:net';
|
|
3
3
|
import { isAbsolute, join } from 'node:path';
|
|
4
|
-
import type { ConfigManager } from '../config/index.ts';
|
|
4
|
+
import type { ConfigKey, ConfigManager } from '../config/index.ts';
|
|
5
5
|
import { resolveRuntimeEndpointBinding } from './endpoints.ts';
|
|
6
6
|
import type { RuntimeEndpointBinding, RuntimeEndpointId } from './endpoints.ts';
|
|
7
7
|
import { classifyBindPosture, isNetworkFacing } from './network-posture.ts';
|
|
@@ -60,7 +60,7 @@ export interface CliServicePosture {
|
|
|
60
60
|
readonly issues: readonly string[];
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
const ENDPOINTS: readonly { readonly id: RuntimeEndpointId; readonly label: string; readonly enabledKey:
|
|
63
|
+
const ENDPOINTS: readonly { readonly id: RuntimeEndpointId; readonly label: string; readonly enabledKey: ConfigKey }[] = [
|
|
64
64
|
{ id: 'controlPlane', label: 'runtime connection', enabledKey: 'controlPlane.enabled' },
|
|
65
65
|
{ id: 'httpListener', label: 'inbound events endpoint', enabledKey: 'danger.httpListener' },
|
|
66
66
|
{ id: 'web', label: 'browser companion route', enabledKey: 'web.enabled' },
|
|
@@ -161,7 +161,7 @@ export async function buildCliServicePosture(
|
|
|
161
161
|
options: CliServicePostureOptions = {},
|
|
162
162
|
): Promise<CliServicePosture> {
|
|
163
163
|
const endpoints = await Promise.all(ENDPOINTS.map(async (endpoint): Promise<CliServiceEndpointPosture> => {
|
|
164
|
-
const enabled = runtime.configManager.get(endpoint.enabledKey
|
|
164
|
+
const enabled = runtime.configManager.get(endpoint.enabledKey) === true;
|
|
165
165
|
const binding = resolveRuntimeEndpointBinding(runtime.configManager, endpoint.id);
|
|
166
166
|
return {
|
|
167
167
|
id: endpoint.id,
|
|
@@ -232,12 +232,12 @@ export function formatCliServicePosture(posture: CliServicePosture, json = false
|
|
|
232
232
|
` log: ${posture.log.path ?? 'n/a'} (${posture.log.exists ? 'present' : 'missing'})`,
|
|
233
233
|
...(posture.log.readError ? [` log read error: ${posture.log.readError}`] : []),
|
|
234
234
|
'',
|
|
235
|
-
'Connected API checks
|
|
235
|
+
'Connected API checks',
|
|
236
236
|
...posture.endpoints.map((endpoint) =>
|
|
237
|
-
` ${endpoint.label}
|
|
237
|
+
` ${endpoint.label} enabled ${yesNo(endpoint.enabled)} ${endpoint.binding.hostMode} ${endpoint.binding.host}:${endpoint.binding.port} posture ${endpoint.bindPosture.label}${endpoint.reachable === undefined ? '' : ` reachable ${yesNo(endpoint.reachable)}`}`,
|
|
238
238
|
),
|
|
239
239
|
'',
|
|
240
|
-
posture.issues.length === 0 ? 'Readiness
|
|
240
|
+
posture.issues.length === 0 ? 'Readiness ready' : 'Readiness needs attention',
|
|
241
241
|
...posture.issues.map((issue) => ` - ${issue}`),
|
|
242
242
|
].join('\n');
|
|
243
243
|
}
|
package/src/cli/status.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
2
2
|
import type { OnboardingCheckMarkersState } from '../runtime/onboarding/index.ts';
|
|
3
3
|
import { resolveRuntimeEndpointBinding } from './endpoints.ts';
|
|
4
|
-
import { isNetworkFacing } from './network-posture.ts';
|
|
5
4
|
import type { GoodVibesCliOutputFormat } from './types.ts';
|
|
6
5
|
import type { CliServicePosture } from './service-posture.ts';
|
|
7
6
|
import type { CliExternalRuntimeSnapshot } from './external-runtime.ts';
|
|
8
7
|
import { getProviderIdFromModel } from '../config/provider-model.ts';
|
|
8
|
+
import { formatAgentRecordSource } from '../agent/record-labels.ts';
|
|
9
|
+
import { formatAgentKnowledgeFailureKind } from './agent-knowledge-format.ts';
|
|
9
10
|
|
|
10
11
|
export interface CliStatusOptions {
|
|
11
12
|
readonly configManager: Pick<ConfigManager, 'get'>;
|
|
@@ -30,7 +31,7 @@ export interface CliAuthStatus {
|
|
|
30
31
|
|
|
31
32
|
export interface CliDoctorFinding {
|
|
32
33
|
readonly id: string;
|
|
33
|
-
readonly area: 'auth' | '
|
|
34
|
+
readonly area: 'auth' | 'onboarding' | 'runtime' | 'security' | 'secrets';
|
|
34
35
|
readonly severity: 'warning' | 'risk';
|
|
35
36
|
readonly summary: string;
|
|
36
37
|
readonly cause: string;
|
|
@@ -92,29 +93,11 @@ function secretPolicyLabel(policy: unknown): string {
|
|
|
92
93
|
return String(policy ?? 'unknown');
|
|
93
94
|
}
|
|
94
95
|
|
|
95
|
-
function bindLine(label: string, enabled: unknown, binding: { readonly hostMode: string; readonly host: string; readonly port: number }): string {
|
|
96
|
-
return ` ${label}: ${yesNo(enabled)} (${binding.hostMode} ${binding.host}:${binding.port})`;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
96
|
export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliDoctorFinding[] {
|
|
100
97
|
const config = options.configManager;
|
|
101
|
-
const serviceEnabled = config.get('service.enabled') === true;
|
|
102
|
-
const daemonEnabled = config.get('danger.daemon') === true;
|
|
103
|
-
const listenerEnabled = config.get('danger.httpListener') === true;
|
|
104
|
-
const webEnabled = config.get('web.enabled') === true;
|
|
105
|
-
const controlPlaneEnabled = config.get('controlPlane.enabled') === true;
|
|
106
|
-
const controlPlaneBinding = resolveRuntimeEndpointBinding(config, 'controlPlane');
|
|
107
|
-
const httpListenerBinding = resolveRuntimeEndpointBinding(config, 'httpListener');
|
|
108
|
-
const webBinding = resolveRuntimeEndpointBinding(config, 'web');
|
|
109
98
|
const permissionMode = config.get('permissions.mode');
|
|
110
99
|
const secretPolicy = config.get('storage.secretPolicy');
|
|
111
100
|
const marker = options.onboardingMarkers?.effective;
|
|
112
|
-
const serverBackedEnabled = daemonEnabled || controlPlaneEnabled || listenerEnabled || webEnabled;
|
|
113
|
-
const networkFacingSurfaces = [
|
|
114
|
-
['runtime connection', controlPlaneEnabled, controlPlaneBinding],
|
|
115
|
-
['inbound events endpoint', listenerEnabled, httpListenerBinding],
|
|
116
|
-
['browser companion route', webEnabled, webBinding],
|
|
117
|
-
].filter(([, enabled, binding]) => isNetworkFacing(enabled, binding as typeof controlPlaneBinding));
|
|
118
101
|
|
|
119
102
|
const findings: CliDoctorFinding[] = [];
|
|
120
103
|
|
|
@@ -127,7 +110,7 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
127
110
|
summary: 'Connected GoodVibes host is not reachable.',
|
|
128
111
|
cause: `Agent could not reach ${options.externalRuntime.baseUrl}${options.externalRuntime.error ? `: ${options.externalRuntime.error}` : '.'}`,
|
|
129
112
|
impact: 'Companion chat, isolated Agent Knowledge, approvals, automation status, and build delegation cannot work until the connected GoodVibes host is available.',
|
|
130
|
-
action: '
|
|
113
|
+
action: 'Make the owning GoodVibes host available, then rerun goodvibes-agent status.',
|
|
131
114
|
});
|
|
132
115
|
} else if (!options.externalRuntime.compatible) {
|
|
133
116
|
findings.push({
|
|
@@ -160,24 +143,12 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
160
143
|
severity: 'warning',
|
|
161
144
|
summary: 'Isolated Agent Knowledge route is not ready.',
|
|
162
145
|
cause: `${options.externalRuntime.agentKnowledge.route} returned ${options.externalRuntime.agentKnowledge.kind}${options.externalRuntime.agentKnowledge.statusCode === null ? '' : ` (${options.externalRuntime.agentKnowledge.statusCode})`}.`,
|
|
163
|
-
impact: 'Agent Knowledge ask/search will not use
|
|
146
|
+
impact: 'Agent Knowledge ask/search will not use default or non-Agent knowledge fallback; it will fail closed until the Agent route is available.',
|
|
164
147
|
action: 'Update the connected GoodVibes host to the Agent-compatible SDK and verify goodvibes-agent compat.',
|
|
165
148
|
});
|
|
166
149
|
}
|
|
167
150
|
}
|
|
168
151
|
|
|
169
|
-
if (serverBackedEnabled && !serviceEnabled) {
|
|
170
|
-
findings.push({
|
|
171
|
-
id: 'runtime-ownership-external',
|
|
172
|
-
area: 'runtime',
|
|
173
|
-
severity: 'warning',
|
|
174
|
-
summary: 'Connected-host settings are present while Agent host ownership is disabled by design.',
|
|
175
|
-
cause: 'One or more connected API, inbound events, or browser companion settings are enabled while service.enabled is false.',
|
|
176
|
-
impact: 'The owning GoodVibes host must provide availability for those endpoints; Agent will not start or enable them.',
|
|
177
|
-
action: 'Manage connected-host availability from GoodVibes TUI or the owning host, then use Agent for read-only diagnostics.',
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
|
|
181
152
|
if (options.service) {
|
|
182
153
|
for (const issue of options.service.issues) {
|
|
183
154
|
if (findings.some((finding) => finding.summary === issue)) continue;
|
|
@@ -187,8 +158,8 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
187
158
|
severity: 'warning',
|
|
188
159
|
summary: issue,
|
|
189
160
|
cause: 'The connected-host inspection found a mismatch between configured endpoint state and observed host state.',
|
|
190
|
-
impact: '
|
|
191
|
-
action: 'Use Agent status and doctor diagnostics here, then
|
|
161
|
+
impact: 'Companion chat, Agent Knowledge, approvals, automation status, or build delegation may be unavailable.',
|
|
162
|
+
action: 'Use Agent status and doctor diagnostics here, then repair the connected GoodVibes host outside Agent.',
|
|
192
163
|
});
|
|
193
164
|
}
|
|
194
165
|
}
|
|
@@ -200,35 +171,11 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
200
171
|
severity: 'warning',
|
|
201
172
|
summary: 'Agent setup has not been applied for this user.',
|
|
202
173
|
cause: 'No global user setup completion marker was found.',
|
|
203
|
-
impact: '
|
|
174
|
+
impact: 'Provider/model, Agent Knowledge, local behavior, channel, and permission choices may still be implicit defaults.',
|
|
204
175
|
action: 'Run /setup in GoodVibes Agent or goodvibes-agent setup status to review setup state.',
|
|
205
176
|
});
|
|
206
177
|
}
|
|
207
178
|
|
|
208
|
-
if (networkFacingSurfaces.length > 0 && options.auth?.userStorePresent !== true) {
|
|
209
|
-
findings.push({
|
|
210
|
-
id: 'network-endpoint-without-runtime-auth-signal',
|
|
211
|
-
area: 'auth',
|
|
212
|
-
severity: 'risk',
|
|
213
|
-
summary: 'Network-facing connected-host endpoints are enabled without a visible auth signal.',
|
|
214
|
-
cause: `${networkFacingSurfaces.map(([name]) => name).join(', ')} are LAN/custom-bound, but Agent cannot see connected-host auth state from its local compatibility files.`,
|
|
215
|
-
impact: 'Remote access paths may be unusable or unsafe unless the owning host configured auth.',
|
|
216
|
-
action: 'Review connected-host auth outside Agent; Agent will not create local service users.',
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (networkFacingSurfaces.length > 0 && options.auth?.bootstrapCredentialPresent === true) {
|
|
221
|
-
findings.push({
|
|
222
|
-
id: 'network-endpoint-with-bootstrap-credential',
|
|
223
|
-
area: 'auth',
|
|
224
|
-
severity: 'risk',
|
|
225
|
-
summary: 'A bootstrap credential is still present while network-facing surfaces are enabled.',
|
|
226
|
-
cause: `${networkFacingSurfaces.map(([name]) => name).join(', ')} are LAN/custom-bound and auth-bootstrap.txt exists.`,
|
|
227
|
-
impact: 'Bootstrap credentials should be treated as temporary setup material, not long-lived network access credentials.',
|
|
228
|
-
action: 'Replace bootstrap auth and retire the bootstrap credential outside Agent.',
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
|
|
232
179
|
if (permissionMode === 'allow-all') {
|
|
233
180
|
findings.push({
|
|
234
181
|
id: 'allow-all-permissions',
|
|
@@ -253,18 +200,6 @@ export function buildCliDoctorFindings(options: CliStatusOptions): readonly CliD
|
|
|
253
200
|
});
|
|
254
201
|
}
|
|
255
202
|
|
|
256
|
-
if (listenerEnabled && isNetworkFacing(listenerEnabled, httpListenerBinding)) {
|
|
257
|
-
findings.push({
|
|
258
|
-
id: 'network-http-listener-enabled',
|
|
259
|
-
area: 'network',
|
|
260
|
-
severity: 'warning',
|
|
261
|
-
summary: 'The inbound events endpoint is reachable beyond loopback.',
|
|
262
|
-
cause: `Inbound events endpoint is enabled on ${httpListenerBinding.host}:${httpListenerBinding.port} with ${httpListenerBinding.hostMode} binding.`,
|
|
263
|
-
impact: 'External tools and devices may be able to reach incoming event endpoints.',
|
|
264
|
-
action: 'Keep inbound-event secrets/signature checks configured for every enabled endpoint.',
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
|
|
268
203
|
return findings;
|
|
269
204
|
}
|
|
270
205
|
|
|
@@ -315,13 +250,6 @@ export function buildCliStatusSnapshot(options: CliStatusOptions): CliStatusSnap
|
|
|
315
250
|
export function renderCliStatus(options: CliStatusOptions): string {
|
|
316
251
|
const config = options.configManager;
|
|
317
252
|
const snapshot = buildCliStatusSnapshot(options);
|
|
318
|
-
const serviceEnabled = snapshot.runtimeConnection.enabled;
|
|
319
|
-
const controlPlaneEnabled = snapshot.runtimeEndpoints.controlPlane.enabled;
|
|
320
|
-
const listenerEnabled = snapshot.runtimeEndpoints.httpListener.enabled;
|
|
321
|
-
const webEnabled = snapshot.runtimeEndpoints.web.enabled;
|
|
322
|
-
const controlPlaneBinding = snapshot.runtimeEndpoints.controlPlane;
|
|
323
|
-
const httpListenerBinding = snapshot.runtimeEndpoints.httpListener;
|
|
324
|
-
const webBinding = snapshot.runtimeEndpoints.web;
|
|
325
253
|
const marker = options.onboardingMarkers?.effective;
|
|
326
254
|
const findings = snapshot.findings;
|
|
327
255
|
const externalRuntime = snapshot.externalRuntime;
|
|
@@ -330,66 +258,63 @@ export function renderCliStatus(options: CliStatusOptions): string {
|
|
|
330
258
|
|
|
331
259
|
const lines = [
|
|
332
260
|
snapshot.title,
|
|
333
|
-
`
|
|
334
|
-
`
|
|
261
|
+
` working directory ${options.workingDirectory}`,
|
|
262
|
+
` home directory ${options.homeDirectory}`,
|
|
335
263
|
'',
|
|
336
|
-
'Provider
|
|
337
|
-
` provider
|
|
338
|
-
` model
|
|
339
|
-
` reasoning
|
|
264
|
+
'Provider',
|
|
265
|
+
` provider ${getProviderIdFromModel(config.get('provider.model'))}`,
|
|
266
|
+
` model ${String(config.get('provider.model'))}`,
|
|
267
|
+
` reasoning ${String(config.get('provider.reasoningEffort'))}`,
|
|
340
268
|
'',
|
|
341
|
-
'Auth
|
|
269
|
+
'Auth',
|
|
342
270
|
` permissions: ${permissionModeLabel(config.get('permissions.mode'))} (${String(config.get('permissions.mode'))})`,
|
|
343
271
|
` secretPolicy: ${secretPolicyLabel(config.get('storage.secretPolicy'))} (${String(config.get('storage.secretPolicy'))})`,
|
|
344
272
|
options.auth
|
|
345
|
-
? `
|
|
346
|
-
: '
|
|
273
|
+
? ` local auth store ${options.auth.userStorePresent ? 'present' : 'missing'} (${options.auth.userStorePath})`
|
|
274
|
+
: ' local auth store unknown',
|
|
347
275
|
options.auth
|
|
348
|
-
? `
|
|
349
|
-
: '
|
|
276
|
+
? ` setup credential ${options.auth.bootstrapCredentialPresent ? 'present' : 'missing'} (${options.auth.bootstrapCredentialPath})`
|
|
277
|
+
: ' setup credential unknown',
|
|
350
278
|
options.auth
|
|
351
|
-
? `
|
|
352
|
-
: '
|
|
279
|
+
? ` connected host token ${options.auth.operatorTokenPresent ? 'present' : 'missing'} (${options.auth.operatorTokenPath})`
|
|
280
|
+
: ' connected host token unknown',
|
|
353
281
|
'',
|
|
354
|
-
'Connected GoodVibes
|
|
282
|
+
'Connected GoodVibes host:',
|
|
355
283
|
...(externalRuntime ? [
|
|
356
284
|
` baseUrl: ${externalRuntime.baseUrl}`,
|
|
357
285
|
` reachable: ${yesNo(externalRuntime.reachable)}${externalRuntime.statusCode === null ? '' : ` (HTTP ${externalRuntime.statusCode})`}`,
|
|
358
286
|
` sdk: ${externalRuntime.version} expected ${externalRuntime.expectedVersion}`,
|
|
359
287
|
` compatible: ${yesNo(externalRuntime.compatible)}`,
|
|
360
|
-
`
|
|
361
|
-
` Agent Knowledge: ${externalRuntime.agentKnowledge.ready ? 'ready' : `not ready (${externalRuntime.agentKnowledge.kind})`}`,
|
|
288
|
+
` access token: ${externalRuntime.operatorToken.present ? 'present' : 'missing'} (${externalRuntime.operatorToken.path})`,
|
|
289
|
+
` Agent Knowledge: ${externalRuntime.agentKnowledge.ready ? 'ready' : `not ready (${formatAgentKnowledgeFailureKind(externalRuntime.agentKnowledge.kind)})`}`,
|
|
362
290
|
...(externalRuntime.error ? [` error: ${externalRuntime.error}`] : []),
|
|
363
291
|
] : [
|
|
364
|
-
' live check
|
|
292
|
+
' live check unavailable',
|
|
365
293
|
]),
|
|
366
294
|
'',
|
|
367
|
-
'
|
|
368
|
-
'
|
|
369
|
-
' lifecycle
|
|
370
|
-
'
|
|
295
|
+
'Agent role:',
|
|
296
|
+
' product: interactive operator TUI',
|
|
297
|
+
' host lifecycle: external',
|
|
298
|
+
' starts or exposes host: no',
|
|
371
299
|
...(options.service ? [
|
|
372
|
-
` log
|
|
300
|
+
` host log signal ${options.service.log.path ?? 'n/a'} (${options.service.log.exists ? 'present' : 'missing'})`,
|
|
373
301
|
] : []),
|
|
374
|
-
'Onboarding
|
|
375
|
-
` checked
|
|
376
|
-
` scope
|
|
377
|
-
`
|
|
302
|
+
'Onboarding',
|
|
303
|
+
` checked ${marker?.exists ? 'yes' : 'no'}`,
|
|
304
|
+
` scope ${marker?.scope ?? 'none'}`,
|
|
305
|
+
` updated ${marker?.payload ? new Date(marker.payload.updatedAt).toISOString() : 'n/a'}`,
|
|
378
306
|
];
|
|
379
307
|
|
|
380
308
|
if (options.doctor) {
|
|
381
309
|
lines.push(
|
|
382
310
|
'',
|
|
383
|
-
'
|
|
384
|
-
|
|
385
|
-
'
|
|
386
|
-
'',
|
|
387
|
-
'
|
|
388
|
-
bindLine('runtimeApi', controlPlaneEnabled, controlPlaneBinding),
|
|
389
|
-
bindLine('incomingWebhook', listenerEnabled, httpListenerBinding),
|
|
390
|
-
bindLine('browserCompanion', webEnabled, webBinding),
|
|
311
|
+
'Readiness Checks:',
|
|
312
|
+
' companion chat route',
|
|
313
|
+
' isolated Agent Knowledge route',
|
|
314
|
+
' approvals and automation status routes',
|
|
315
|
+
' explicit build delegation route',
|
|
391
316
|
);
|
|
392
|
-
lines.push('', 'Warnings
|
|
317
|
+
lines.push('', 'Warnings');
|
|
393
318
|
if (findings.length === 0) {
|
|
394
319
|
lines.push(' none');
|
|
395
320
|
} else {
|
|
@@ -411,11 +336,11 @@ export function renderOnboardingCliStatus(options: CliStatusOptions): string {
|
|
|
411
336
|
const marker = options.onboardingMarkers?.effective;
|
|
412
337
|
return [
|
|
413
338
|
'GoodVibes Agent setup status',
|
|
414
|
-
` checked
|
|
415
|
-
` scope
|
|
416
|
-
`
|
|
417
|
-
` mode
|
|
418
|
-
`
|
|
419
|
-
`
|
|
339
|
+
` checked ${marker?.exists ? 'yes' : 'no'}`,
|
|
340
|
+
` scope ${marker?.scope ?? 'none'}`,
|
|
341
|
+
` origin ${marker?.payload?.source ? formatAgentRecordSource(marker.payload.source) : 'n/a'}`,
|
|
342
|
+
` mode ${marker?.payload?.mode ?? 'n/a'}`,
|
|
343
|
+
` updated ${marker?.payload ? new Date(marker.payload.updatedAt).toISOString() : 'n/a'}`,
|
|
344
|
+
` working directory ${options.workingDirectory}`,
|
|
420
345
|
].join('\n');
|
|
421
346
|
}
|