@pellux/goodvibes-agent 0.1.114 → 0.1.117
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 +41 -650
- package/README.md +40 -50
- package/dist/package/main.js +38224 -35673
- package/docs/README.md +5 -4
- package/docs/{connected-services.md → connected-host.md} +18 -10
- package/docs/getting-started.md +43 -42
- package/docs/release-and-publishing.md +6 -4
- package/package.json +3 -3
- package/src/agent/behavior-discovery-summary.ts +165 -0
- package/src/agent/persona-discovery.ts +1 -3
- package/src/agent/persona-registry.ts +5 -3
- package/src/agent/reminder-schedule-format.ts +6 -6
- package/src/agent/reminder-schedule.ts +1 -1
- package/src/agent/routine-registry.ts +43 -4
- package/src/agent/routine-schedule-format.ts +6 -6
- package/src/agent/routine-schedule-promotion.ts +1 -1
- package/src/agent/routine-schedule-receipts.ts +1 -1
- package/src/agent/runtime-profile-starters.ts +331 -0
- package/src/agent/runtime-profile.ts +228 -330
- package/src/agent/skill-registry.ts +190 -13
- package/src/cli/agent-knowledge-command.ts +2 -2
- package/src/cli/agent-knowledge-format.ts +2 -2
- package/src/cli/agent-knowledge-runtime.ts +1 -1
- package/src/cli/bundle-command.ts +1 -1
- package/src/cli/entrypoint.ts +16 -7
- package/src/cli/help.ts +26 -19
- package/src/cli/local-library-command.ts +75 -21
- package/src/cli/management-commands.ts +7 -6
- package/src/cli/management.ts +6 -51
- package/src/cli/parser.ts +23 -2
- package/src/cli/profiles-command.ts +247 -1
- package/src/cli/routines-command.ts +139 -11
- package/src/cli/service-posture.ts +11 -11
- package/src/cli/status.ts +21 -25
- package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
- package/src/input/agent-workspace-access-command-editors.ts +170 -0
- package/src/input/agent-workspace-activation.ts +2 -1
- package/src/input/agent-workspace-basic-command-editor-submission.ts +787 -0
- package/src/input/agent-workspace-basic-command-editors.ts +524 -459
- package/src/input/agent-workspace-categories.ts +177 -14
- package/src/input/agent-workspace-channel-command-editor-submission.ts +49 -0
- package/src/input/agent-workspace-channel-command-editors.ts +47 -0
- package/src/input/agent-workspace-command-editor.ts +25 -1
- package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
- package/src/input/agent-workspace-editors.ts +27 -0
- package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
- package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
- package/src/input/agent-workspace-learned-behavior.ts +67 -0
- package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
- package/src/input/agent-workspace-library-command-editors.ts +35 -0
- package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
- package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
- package/src/input/agent-workspace-memory-command-editors.ts +180 -0
- package/src/input/agent-workspace-navigation.ts +45 -0
- package/src/input/agent-workspace-notify-editor-submission.ts +107 -0
- package/src/input/agent-workspace-operations-command-editor-submission.ts +146 -0
- package/src/input/agent-workspace-operations-command-editors.ts +119 -0
- package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
- package/src/input/agent-workspace-provider-command-editors.ts +93 -0
- package/src/input/agent-workspace-requirements.ts +11 -0
- package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
- package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
- package/src/input/agent-workspace-session-command-editors.ts +249 -0
- package/src/input/agent-workspace-setup.ts +49 -19
- package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
- package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
- package/src/input/agent-workspace-snapshot.ts +56 -8
- package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
- package/src/input/agent-workspace-task-command-editors.ts +47 -0
- package/src/input/agent-workspace-types.ts +124 -0
- package/src/input/agent-workspace-voice-media.ts +1 -1
- package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
- package/src/input/agent-workspace.ts +47 -37
- package/src/input/command-registry.ts +1 -1
- package/src/input/commands/agent-runtime-profile-runtime.ts +160 -6
- package/src/input/commands/agent-skills-runtime.ts +76 -12
- package/src/input/commands/agent-workspace-runtime.ts +4 -3
- package/src/input/commands/brief-runtime.ts +38 -9
- package/src/input/commands/channels-runtime.ts +3 -3
- package/src/input/commands/compat-runtime.ts +32 -0
- package/src/input/commands/health-runtime.ts +22 -24
- package/src/input/commands/knowledge.ts +26 -5
- package/src/input/commands/local-provider-runtime.ts +7 -3
- package/src/input/commands/local-setup-review.ts +4 -14
- package/src/input/commands/mcp-runtime.ts +8 -12
- package/src/input/commands/operator-runtime.ts +8 -67
- package/src/input/commands/personas-runtime.ts +1 -1
- package/src/input/commands/platform-access-runtime.ts +7 -70
- package/src/input/commands/policy-dispatch.ts +1 -1
- package/src/input/commands/policy.ts +1 -5
- package/src/input/commands/product-runtime.ts +2 -2
- package/src/input/commands/qrcode-runtime.ts +6 -4
- package/src/input/commands/routines-runtime.ts +44 -6
- package/src/input/commands/runtime-services.ts +1 -14
- package/src/input/commands/security-runtime.ts +3 -8
- package/src/input/commands/session-content.ts +1 -1
- package/src/input/commands/session-workflow.ts +5 -14
- package/src/input/commands/shell-core.ts +8 -2
- package/src/input/commands/subscription-runtime.ts +1 -6
- package/src/input/commands/support-bundle-runtime.ts +53 -0
- package/src/input/commands/tasks-runtime.ts +2 -2
- package/src/input/commands.ts +4 -0
- package/src/input/feed-context-factory.ts +0 -1
- package/src/input/handler-content-actions.ts +0 -25
- package/src/input/handler-feed.ts +0 -2
- package/src/input/handler-interactions.ts +2 -31
- package/src/input/handler-onboarding.ts +29 -12
- package/src/input/handler-shortcuts.ts +1 -3
- package/src/input/handler.ts +4 -7
- package/src/input/keybindings.ts +9 -9
- package/src/input/mcp-workspace.ts +90 -26
- package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
- package/src/input/onboarding/onboarding-wizard-apply.ts +49 -0
- package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-operator-steps.ts +126 -11
- package/src/input/onboarding/onboarding-wizard-steps.ts +15 -8
- package/src/input/onboarding/onboarding-wizard-types.ts +1 -0
- package/src/input/onboarding/onboarding-wizard.ts +19 -2
- package/src/input/profile-picker-modal.ts +2 -2
- package/src/input/settings-modal-agent-policy.ts +6 -6
- package/src/input/settings-modal-subscriptions.ts +3 -3
- package/src/input/settings-modal.ts +14 -14
- package/src/main.ts +0 -2
- package/src/panels/automation-control-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +1 -1
- package/src/panels/builtin/operations.ts +2 -2
- package/src/panels/builtin/session.ts +26 -18
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/project-planning-panel.ts +1 -1
- package/src/panels/provider-health-domains.ts +3 -3
- package/src/panels/qr-panel.ts +44 -20
- package/src/panels/subscription-panel.ts +3 -3
- package/src/panels/system-messages-panel.ts +2 -2
- package/src/panels/tasks-panel.ts +4 -4
- package/src/planning/project-planning-coordinator.ts +2 -2
- package/src/renderer/agent-workspace.ts +52 -5
- package/src/renderer/block-actions.ts +1 -3
- package/src/renderer/help-overlay.ts +13 -8
- package/src/renderer/mcp-workspace.ts +32 -13
- package/src/renderer/model-picker-overlay.ts +0 -1
- package/src/renderer/model-workspace.ts +0 -2
- package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
- package/src/renderer/panel-picker-overlay.ts +1 -1
- package/src/renderer/profile-picker-modal.ts +2 -2
- package/src/renderer/settings-modal-helpers.ts +23 -23
- package/src/renderer/settings-modal.ts +18 -18
- package/src/renderer/system-message.ts +1 -1
- package/src/runtime/agent-runtime-events.ts +129 -0
- package/src/runtime/bootstrap-command-parts.ts +3 -2
- package/src/runtime/bootstrap-core.ts +4 -64
- package/src/runtime/bootstrap-shell.ts +42 -4
- package/src/runtime/bootstrap.ts +8 -27
- package/src/runtime/connected-host-auth.ts +42 -0
- package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
- package/src/runtime/index.ts +1 -5
- package/src/runtime/onboarding/apply.ts +213 -0
- package/src/runtime/onboarding/derivation.ts +25 -6
- package/src/runtime/onboarding/snapshot.ts +4 -2
- package/src/runtime/onboarding/types.ts +28 -1
- package/src/runtime/onboarding/verify.ts +81 -2
- package/src/runtime/operator-token-cleanup.ts +2 -2
- package/src/runtime/services.ts +27 -12
- package/src/shell/service-settings-sync.ts +7 -7
- package/src/shell/ui-openers.ts +27 -38
- package/src/tools/agent-local-registry-tool.ts +10 -4
- package/src/tools/agent-tool-policy-guard.ts +5 -7
- package/src/version.ts +1 -1
- package/src/cli/package-verification.ts +0 -274
package/docs/README.md
CHANGED
|
@@ -5,7 +5,7 @@ These are the package-facing docs for GoodVibes Agent, the personal operator ass
|
|
|
5
5
|
Current package docs:
|
|
6
6
|
|
|
7
7
|
- [Getting Started](getting-started.md)
|
|
8
|
-
- [Connected
|
|
8
|
+
- [Connected Host](connected-host.md)
|
|
9
9
|
- [Release And Publishing](release-and-publishing.md)
|
|
10
10
|
|
|
11
11
|
Important baseline constraints:
|
|
@@ -13,12 +13,13 @@ Important baseline constraints:
|
|
|
13
13
|
- Agent installs one executable: `goodvibes-agent`.
|
|
14
14
|
- Agent uses Bun and TypeScript-authored source.
|
|
15
15
|
- Agent depends on `@pellux/goodvibes-sdk@0.33.35`.
|
|
16
|
-
- Agent connects to GoodVibes
|
|
17
|
-
- Agent does not start, stop, restart, install, uninstall, or own
|
|
16
|
+
- Agent connects to a GoodVibes host owned outside this product.
|
|
17
|
+
- Agent does not start, stop, restart, install, uninstall, or own the connected GoodVibes host.
|
|
18
18
|
- Agent Knowledge/Wiki uses only `/api/goodvibes-agent/knowledge/*`; there is no default Knowledge/Wiki or non-Agent product fallback.
|
|
19
19
|
- Agent supports isolated Agent homes with `GOODVIBES_AGENT_HOME=<path>` and named profile homes with `goodvibes-agent profiles create <name> --template <starter> --yes` plus `--agent-profile <name>`.
|
|
20
|
-
- Agent supports connected-
|
|
20
|
+
- Agent supports connected-host URL overrides with `--runtime-url http://host:port` or `GOODVIBES_AGENT_RUNTIME_URL=http://host:port`; these only change the Agent connection target.
|
|
21
21
|
- 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.
|
|
22
|
+
- First-run setup can seed an initial local persona, skill, and routine without writing to connected-host knowledge or non-Agent segments.
|
|
22
23
|
- Local memory, personas, routines, and Agent skills are stored under the Agent home and are injected only into the serial Agent conversation.
|
|
23
24
|
- Normal assistant chat is not coding-session delegation.
|
|
24
25
|
- Build/fix/review delegation to GoodVibes TUI must be explicit; WRFC is not the default Agent behavior.
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# Connected
|
|
1
|
+
# Connected Host
|
|
2
2
|
|
|
3
|
-
GoodVibes Agent is a TUI client for connected GoodVibes
|
|
3
|
+
GoodVibes Agent is a TUI client for a connected GoodVibes host owned outside this package. The package exposes one executable:
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
6
|
goodvibes-agent
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
The installed command is backed by TypeScript-authored source with a Bun shebang. Package install smoke
|
|
9
|
+
The installed command is backed by TypeScript-authored source with a Bun shebang. Package install smoke verifies the executable path:
|
|
10
10
|
|
|
11
11
|
- `goodvibes-agent --help`
|
|
12
12
|
- `goodvibes-agent --version`
|
|
13
13
|
- `goodvibes-agent status --json`
|
|
14
14
|
- `goodvibes-agent` launches the TUI in a real PTY
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## Host Prerequisite
|
|
17
17
|
|
|
18
|
-
Start
|
|
18
|
+
Start the owning GoodVibes host before launching Agent. Agent expects that host to expose public operator routes and the isolated Agent Knowledge routes:
|
|
19
19
|
|
|
20
20
|
```text
|
|
21
21
|
http://127.0.0.1:3421
|
|
@@ -24,10 +24,10 @@ http://127.0.0.1:3421
|
|
|
24
24
|
/api/goodvibes-agent/knowledge/search
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
If the GoodVibes API is on a different host or port, use a one-off override:
|
|
27
|
+
If the GoodVibes API is on a different host or port, use a one-off override when launching the TUI:
|
|
28
28
|
|
|
29
29
|
```sh
|
|
30
|
-
goodvibes-agent --runtime-url http://127.0.0.1:3421
|
|
30
|
+
goodvibes-agent --runtime-url http://127.0.0.1:3421
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
For a persistent shell/session override, set:
|
|
@@ -36,15 +36,23 @@ For a persistent shell/session override, set:
|
|
|
36
36
|
export GOODVIBES_AGENT_RUNTIME_URL=http://127.0.0.1:3421
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
`GOODVIBES_AGENT_BASE_URL` is accepted as a legacy alias. These values only select the connected GoodVibes API root; they do not make Agent own
|
|
39
|
+
`GOODVIBES_AGENT_BASE_URL` is accepted as a legacy alias. These values only select the connected GoodVibes API root; they do not make Agent own host processes.
|
|
40
40
|
|
|
41
|
-
If connected
|
|
41
|
+
If the connected host is unavailable, unauthenticated, or on an incompatible SDK version, the Agent TUI reports actionable diagnostics without printing token values.
|
|
42
|
+
|
|
43
|
+
Use the TUI first for those checks:
|
|
44
|
+
|
|
45
|
+
- Agent Workspace -> Home -> Host compatibility
|
|
46
|
+
- Agent Workspace -> Home -> Doctor diagnostics
|
|
47
|
+
- Agent Workspace -> Home -> Review health
|
|
48
|
+
|
|
49
|
+
`goodvibes-agent status --json`, `goodvibes-agent doctor`, and `goodvibes-agent compat` are scriptable equivalents for install checks and automation.
|
|
42
50
|
|
|
43
51
|
## Product Boundary
|
|
44
52
|
|
|
45
53
|
Agent owns the operator assistant TUI, local profiles, local memory/routines/skills/personas, isolated Agent Knowledge calls, companion chat, approvals/automation visibility, and explicit build delegation.
|
|
46
54
|
|
|
47
|
-
Agent does not own connected-
|
|
55
|
+
Agent does not own connected-host lifecycle. It does not provide commands to install, expose, start, stop, restart, or mutate the connected GoodVibes host.
|
|
48
56
|
|
|
49
57
|
Agent Knowledge/Wiki is its own product segment. Agent uses `/api/goodvibes-agent/knowledge/*` only and must not fall back to default Knowledge/Wiki or other product-specific knowledge routes.
|
|
50
58
|
|
package/docs/getting-started.md
CHANGED
|
@@ -5,12 +5,12 @@ 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
|
-
-
|
|
9
|
-
- A token/config path accepted by connected
|
|
8
|
+
- A connected GoodVibes host compatible with `@pellux/goodvibes-sdk@0.33.35`
|
|
9
|
+
- A token/config path accepted by the connected host
|
|
10
10
|
|
|
11
|
-
Agent does not launch connected
|
|
11
|
+
Agent does not launch the connected host for you.
|
|
12
12
|
|
|
13
|
-
Use the interactive TUI first. CLI subcommands are secondary support paths for install checks, setup inspection, and scriptable
|
|
13
|
+
Use the interactive TUI first. CLI subcommands are secondary support paths for install checks, setup inspection, and scriptable mirrors of workflows that are already reachable from the workspace.
|
|
14
14
|
|
|
15
15
|
## Install From Package
|
|
16
16
|
|
|
@@ -18,10 +18,6 @@ Use the interactive TUI first. CLI subcommands are secondary support paths for i
|
|
|
18
18
|
bun add -g @pellux/goodvibes-agent
|
|
19
19
|
goodvibes-agent --help
|
|
20
20
|
goodvibes-agent
|
|
21
|
-
goodvibes-agent status
|
|
22
|
-
goodvibes-agent personas list
|
|
23
|
-
goodvibes-agent skills list
|
|
24
|
-
goodvibes-agent memory list
|
|
25
21
|
```
|
|
26
22
|
|
|
27
23
|
If the installed command is not found, add Bun's global bin directory to `PATH`:
|
|
@@ -44,70 +40,75 @@ bun run dev
|
|
|
44
40
|
|
|
45
41
|
`goodvibes-agent` starts the interactive Agent TUI. On a fresh Agent home, the TUI opens Agent setup first.
|
|
46
42
|
|
|
47
|
-
After setup has been
|
|
43
|
+
After setup has been applied once, the TUI opens directly into the Agent operator workspace. You can also reopen it with `/agent`, `/home`, or `/operator`. That fullscreen workspace is the current front door for setup/config, provider/model selection, Agent Knowledge, local memory/skills/routines/personas, channel readiness, voice/media setup, read-only work/approval/automation views, and explicit GoodVibes TUI build delegation.
|
|
44
|
+
|
|
45
|
+
The setup workspace scans local Agent behavior folders and shows importable persona, skill, and routine files before asking you to create blank records. It can also create one initial local persona, skill, and routine from the setup form. Use `/personas discover`, `/agent-skills discover`, and `/routines discover` to preview files, then use the matching import action in the workspace after review.
|
|
48
46
|
|
|
49
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.
|
|
50
48
|
|
|
49
|
+
Use the Profiles workspace form to assemble a local starter template and isolated Agent profile from reviewed discovered persona, skill, and routine files. Scriptable profile commands mirror the same flow for automation; use them only when you intentionally want a shell-driven setup path.
|
|
50
|
+
|
|
51
51
|
Use the Knowledge area in that workspace to ingest a source URL without leaving the TUI. The form requires typed confirmation and writes only to the isolated Agent Knowledge segment.
|
|
52
52
|
|
|
53
|
-
Use
|
|
53
|
+
Use the Routines workspace receipt actions to review redacted local routine promotion history and reconcile those receipts with live connected schedules through public `schedules.list`. The `/schedule receipts` and `/schedule reconcile` commands are the power-user equivalents inside the TUI.
|
|
54
54
|
|
|
55
|
-
The local behavior libraries are
|
|
55
|
+
The local behavior libraries are configured in the TUI first:
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
- Memory & Skills -> Create memory or Capture learned behavior.
|
|
58
|
+
- Personas -> Create persona, Use selected, Review selected, or Delete selected.
|
|
59
|
+
- Skills -> Create skill, Create bundle, Enable selected, Review selected, or Delete selected.
|
|
60
|
+
- Routines -> Create routine, Start selected, Enable selected, Promote to schedule, or Review receipts.
|
|
61
|
+
|
|
62
|
+
The installed CLI mirrors these libraries for scripts, but it is not the primary user workflow.
|
|
63
63
|
|
|
64
64
|
## Isolated Agent Profiles
|
|
65
65
|
|
|
66
|
-
Use a separate Agent home when you want isolated local state:
|
|
66
|
+
Use a separate Agent home when you want isolated local state. The normal launch still opens the TUI:
|
|
67
67
|
|
|
68
68
|
```sh
|
|
69
|
-
GOODVIBES_AGENT_HOME=/path/to/agent-home goodvibes-agent
|
|
69
|
+
GOODVIBES_AGENT_HOME=/path/to/agent-home goodvibes-agent
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
Use named Agent profiles for repeatable local identities
|
|
72
|
+
Use named Agent profiles for repeatable local identities from Agent Workspace -> Profiles. The workspace can browse starter templates, create isolated Agent profiles, set or clear the default profile for the next launch, and export/import starter JSON.
|
|
73
|
+
|
|
74
|
+
Scriptable equivalents for automation and setup scripts:
|
|
73
75
|
|
|
74
76
|
```sh
|
|
75
77
|
goodvibes-agent profiles templates
|
|
76
78
|
goodvibes-agent profiles create household --template household --yes
|
|
79
|
+
goodvibes-agent profiles use household --yes
|
|
80
|
+
goodvibes-agent
|
|
77
81
|
goodvibes-agent profiles templates export research ./research-starter.json --yes
|
|
78
82
|
goodvibes-agent profiles templates import ./research-starter.json --yes
|
|
79
83
|
goodvibes-agent --agent-profile household status
|
|
80
84
|
goodvibes-agent --agent-profile household
|
|
81
85
|
```
|
|
82
86
|
|
|
83
|
-
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 connected
|
|
87
|
+
Named profiles isolate Agent-local config, sessions, memory, personas, skills, routines, and setup state under a profile-specific home. `profiles use <name> --yes` makes one profile the default for the next plain `goodvibes-agent` launch; `--agent-profile <name>` still overrides it for one launch, and `profiles default clear --yes` returns plain launches to the base Agent 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 connected host by themselves.
|
|
84
88
|
|
|
85
89
|
## Local Memory, Personas, Routines, And Skills
|
|
86
90
|
|
|
87
|
-
Memory, personas, routines, and reusable Agent skills are local to GoodVibes Agent. They do not write into default Knowledge/Wiki or non-Agent knowledge segments.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
/memory add fact "Prefers concise morning briefings" --scope project --tags preference
|
|
101
|
-
/memory search morning
|
|
102
|
-
```
|
|
91
|
+
Memory, personas, routines, and reusable Agent skills are local to GoodVibes Agent. First-run setup, TUI workspace forms, and CLI commands all write them to Agent-local registries. They do not write into default Knowledge/Wiki or non-Agent knowledge segments.
|
|
92
|
+
|
|
93
|
+
Use `Capture learned behavior` in the Agent workspace after reviewing a repeated workflow, lesson, or operating style. It saves one local skill, routine, or persona from the TUI and does not call connected-host mutation routes.
|
|
94
|
+
|
|
95
|
+
Day-one local behavior setup should stay in the fullscreen workspace:
|
|
96
|
+
|
|
97
|
+
- Personas -> Create persona, then Use selected.
|
|
98
|
+
- Routines -> Create routine, Start selected, or Promote to schedule after entering real timing and confirmation.
|
|
99
|
+
- Skills -> Create skill, Enable selected, and review setup requirements.
|
|
100
|
+
- Memory & Skills -> Create memory or Search memory.
|
|
101
|
+
- Channels -> inspect readiness before enabling notification delivery.
|
|
102
|
+
|
|
103
|
+
Typed slash commands are available for repeat users, but they are not required for the first-run workflow.
|
|
103
104
|
|
|
104
|
-
The active persona plus enabled Agent routines, reviewed memory, and skills are injected into the main serial assistant conversation. Starting a routine records local usage and prints its steps; it does not
|
|
105
|
+
The active persona plus enabled Agent routines, reviewed memory, and skills are injected into the main serial assistant conversation. Starting a routine records local usage and prints its steps; it does not launch local workers 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.
|
|
105
106
|
|
|
106
107
|
Use `/channels` inside the TUI for a read-only channel readiness matrix. It shows enabled channels, missing config key names, delivery posture, and risk labels without sending messages or rendering token values.
|
|
107
108
|
|
|
108
|
-
## Connected GoodVibes
|
|
109
|
+
## Connected GoodVibes Host
|
|
109
110
|
|
|
110
|
-
Start
|
|
111
|
+
Start the owning GoodVibes host before using connected Agent features. Agent expects that host to expose the public operator/Agent routes, including:
|
|
111
112
|
|
|
112
113
|
- `/status`
|
|
113
114
|
- `/api/goodvibes-agent/knowledge/status`
|
|
@@ -115,11 +116,11 @@ Start connected GoodVibes services from GoodVibes TUI or the owning host before
|
|
|
115
116
|
- `/api/goodvibes-agent/knowledge/search`
|
|
116
117
|
- `/api/goodvibes-agent/knowledge/ingest/url`
|
|
117
118
|
|
|
118
|
-
If the GoodVibes API is not on `http://127.0.0.1:3421`,
|
|
119
|
+
If the GoodVibes API is not on `http://127.0.0.1:3421`, pass `--runtime-url http://host:port` for a one-off TUI launch or set `GOODVIBES_AGENT_RUNTIME_URL=http://host:port` before launching the TUI.
|
|
119
120
|
|
|
120
121
|
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.
|
|
121
122
|
|
|
122
|
-
|
|
123
|
+
Host lifecycle commands are not part of GoodVibes Agent. Use Agent Workspace -> Home -> Host compatibility, Doctor diagnostics, and Review health for diagnostics. CLI status/doctor/compat commands are scriptable mirrors for install checks.
|
|
123
124
|
|
|
124
125
|
## Current Product Notes
|
|
125
126
|
|
|
@@ -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
|
-
- connected
|
|
12
|
+
- connected host ownership: outside Agent
|
|
13
13
|
|
|
14
14
|
End users install and run GoodVibes Agent with Bun:
|
|
15
15
|
|
|
@@ -36,6 +36,8 @@ git diff --check
|
|
|
36
36
|
|
|
37
37
|
`bun run publish:package` publishes from a staged package directory to the package registry. If `NPM_CONFIG_USERCONFIG` is already set, the registry publish command uses it. Otherwise the script creates a temporary 0600 registry userconfig from `NODE_AUTH_TOKEN` or `NPM_TOKEN`, uses it for that publish command, and removes it with the staging directory. The publish script is idempotent for reruns: if the exact package version is already present on the registry, it reports that state and exits successfully instead of failing the release retry.
|
|
38
38
|
|
|
39
|
+
`bun run release` requires product release notes instead of raw git-log output. Pass `--notes-file ./release-notes.md` or set `GOODVIBES_AGENT_RELEASE_NOTES` before a real release. Release notes should describe what changed for Agent users: TUI behavior, setup, Agent Knowledge, local behavior libraries, connected-host compatibility, package/install behavior, and safety policy. Do not use commit hashes as the shipped changelog content.
|
|
40
|
+
|
|
39
41
|
The GitHub release workflow publishes to npm only when the repository variable `PUBLISH_NPM` is `true` and the repository secret `NPM_TOKEN` is configured. Without those repository settings, the workflow still validates and creates the GitHub release, but npm publish must be run from a local environment with an exported token.
|
|
40
42
|
|
|
41
43
|
Branch CI is the only workflow that runs the full test suite and release gates. It runs `bun run test` once for the release SHA, along with typecheck, architecture, performance, build, publish, and packed install checks. The release workflow must not run tests or duplicate those gates; it verifies that branch CI passed for the exact checked-out SHA and then performs only package packing, GitHub Release creation, and optional npm publish.
|
|
@@ -52,16 +54,16 @@ Also run the package install smoke from a packed artifact. It must prove:
|
|
|
52
54
|
- `goodvibes-agent --help` works
|
|
53
55
|
- `goodvibes-agent --version` reports the package version
|
|
54
56
|
- the installed TUI launches in a PTY and does not exit immediately
|
|
55
|
-
- connected-
|
|
57
|
+
- connected-host commands fail clearly when GoodVibes host is unavailable or unauthenticated
|
|
56
58
|
- no token value is printed
|
|
57
59
|
|
|
58
60
|
## Do Not Ship
|
|
59
61
|
|
|
60
|
-
Do not publish if package-facing docs or install commands refer to another package name, another executable, or Agent-owned connected-
|
|
62
|
+
Do not publish if package-facing docs or install commands refer to another package name, another executable, or Agent-owned connected-host lifecycle.
|
|
61
63
|
|
|
62
64
|
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.
|
|
63
65
|
|
|
64
|
-
Do not ship GoodVibes service binaries from this package. If Agent later gets compiled artifacts, they must use Agent artifact names and remain separate from connected-
|
|
66
|
+
Do not ship GoodVibes service binaries from this package. If Agent later gets compiled artifacts, they must use Agent artifact names and remain separate from connected-host ownership.
|
|
65
67
|
|
|
66
68
|
## Product Rule
|
|
67
69
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.117",
|
|
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",
|
|
@@ -17,13 +17,14 @@
|
|
|
17
17
|
"!src/test",
|
|
18
18
|
"!src/**/*.test.ts",
|
|
19
19
|
"!src/**/__tests__",
|
|
20
|
+
"!src/cli/package-verification.ts",
|
|
20
21
|
"!src/verification",
|
|
21
22
|
"tsconfig.json",
|
|
22
23
|
"README.md",
|
|
23
24
|
"CHANGELOG.md",
|
|
24
25
|
"docs/README.md",
|
|
25
26
|
"docs/getting-started.md",
|
|
26
|
-
"docs/connected-
|
|
27
|
+
"docs/connected-host.md",
|
|
27
28
|
"docs/release-and-publishing.md"
|
|
28
29
|
],
|
|
29
30
|
"scripts": {
|
|
@@ -54,7 +55,6 @@
|
|
|
54
55
|
"build:all": "bun run scripts/build.ts --all",
|
|
55
56
|
"perf:check": "bun run scripts/perf-check.ts",
|
|
56
57
|
"architecture:check": "bun run scripts/check-architecture.ts",
|
|
57
|
-
"foundation:artifacts": "bun run scripts/export-foundation-artifacts.ts",
|
|
58
58
|
"verification:ledger": "bun run scripts/verification-ledger.ts",
|
|
59
59
|
"verification:live": "bun run scripts/verify-live.ts"
|
|
60
60
|
},
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import type { ShellPathService } from '@/runtime/index.ts';
|
|
4
|
+
import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
|
|
5
|
+
|
|
6
|
+
type DiscoveryOrigin = 'project-local' | 'global';
|
|
7
|
+
|
|
8
|
+
interface DiscoveryRoot {
|
|
9
|
+
readonly root: string;
|
|
10
|
+
readonly origin: DiscoveryOrigin;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface DiscoveryKindDefinition {
|
|
14
|
+
readonly roots: readonly DiscoveryRoot[];
|
|
15
|
+
readonly markers: readonly string[];
|
|
16
|
+
readonly frontmatterBodyKey?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface AgentBehaviorDiscoverySummary {
|
|
20
|
+
readonly count: number;
|
|
21
|
+
readonly projectLocalCount: number;
|
|
22
|
+
readonly globalCount: number;
|
|
23
|
+
readonly names: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AgentBehaviorDiscoverySnapshot {
|
|
27
|
+
readonly personas: AgentBehaviorDiscoverySummary;
|
|
28
|
+
readonly skills: AgentBehaviorDiscoverySummary;
|
|
29
|
+
readonly routines: AgentBehaviorDiscoverySummary;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const EMPTY_SUMMARY: AgentBehaviorDiscoverySummary = {
|
|
33
|
+
count: 0,
|
|
34
|
+
projectLocalCount: 0,
|
|
35
|
+
globalCount: 0,
|
|
36
|
+
names: [],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const EMPTY_AGENT_BEHAVIOR_DISCOVERY_SNAPSHOT: AgentBehaviorDiscoverySnapshot = {
|
|
40
|
+
personas: EMPTY_SUMMARY,
|
|
41
|
+
skills: EMPTY_SUMMARY,
|
|
42
|
+
routines: EMPTY_SUMMARY,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
function parseFrontmatter(content: string): Record<string, string> {
|
|
46
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
47
|
+
if (!match) return {};
|
|
48
|
+
const result: Record<string, string> = {};
|
|
49
|
+
for (const line of match[1].split('\n')) {
|
|
50
|
+
const [key, ...rest] = line.split(':');
|
|
51
|
+
if (key && rest.length > 0) {
|
|
52
|
+
result[key.trim()] = rest.join(':').trim();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function markdownBody(content: string): string {
|
|
59
|
+
return content.replace(/^---\n[\s\S]*?\n---\n?/, '').trim();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function readDiscoveryCandidate(path: string, origin: DiscoveryOrigin, definition: DiscoveryKindDefinition): { readonly name: string; readonly origin: DiscoveryOrigin } | null {
|
|
63
|
+
let content = '';
|
|
64
|
+
try {
|
|
65
|
+
content = readFileSync(path, 'utf-8');
|
|
66
|
+
} catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const frontmatter = parseFrontmatter(content);
|
|
71
|
+
const body = definition.frontmatterBodyKey
|
|
72
|
+
? (frontmatter[definition.frontmatterBodyKey] ?? markdownBody(content)).trim()
|
|
73
|
+
: markdownBody(content);
|
|
74
|
+
if (body.length === 0) return null;
|
|
75
|
+
const name = frontmatter.name ?? path.split(/[\\/]/).pop()?.replace(/\.md$/i, '') ?? '';
|
|
76
|
+
const normalized = name.trim();
|
|
77
|
+
return normalized ? { name: normalized, origin } : null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function candidatePaths(root: string, entry: string, markers: readonly string[]): readonly string[] {
|
|
81
|
+
if (entry.endsWith('.md')) return [join(root, entry)];
|
|
82
|
+
return markers.map((marker) => join(root, entry, marker));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function summarizeDefinition(definition: DiscoveryKindDefinition, limit: number): AgentBehaviorDiscoverySummary {
|
|
86
|
+
const seen = new Set<string>();
|
|
87
|
+
const names: string[] = [];
|
|
88
|
+
let projectLocalCount = 0;
|
|
89
|
+
let globalCount = 0;
|
|
90
|
+
|
|
91
|
+
for (const { root, origin } of definition.roots) {
|
|
92
|
+
let entries: string[] = [];
|
|
93
|
+
try {
|
|
94
|
+
entries = readdirSync(root);
|
|
95
|
+
} catch {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
for (const entry of entries.sort((left, right) => left.localeCompare(right))) {
|
|
99
|
+
for (const path of candidatePaths(root, entry, definition.markers)) {
|
|
100
|
+
const candidate = readDiscoveryCandidate(path, origin, definition);
|
|
101
|
+
if (!candidate) continue;
|
|
102
|
+
const key = candidate.name.toLowerCase();
|
|
103
|
+
if (seen.has(key)) break;
|
|
104
|
+
seen.add(key);
|
|
105
|
+
if (candidate.origin === 'project-local') projectLocalCount += 1;
|
|
106
|
+
else globalCount += 1;
|
|
107
|
+
if (names.length < limit) names.push(candidate.name);
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (seen.size === 0) return EMPTY_SUMMARY;
|
|
114
|
+
return {
|
|
115
|
+
count: seen.size,
|
|
116
|
+
projectLocalCount,
|
|
117
|
+
globalCount,
|
|
118
|
+
names,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function definitions(shellPaths: Pick<ShellPathService, 'workingDirectory' | 'homeDirectory'>): AgentBehaviorDiscoverySnapshot {
|
|
123
|
+
const cwd = shellPaths.workingDirectory;
|
|
124
|
+
const homeDir = shellPaths.homeDirectory;
|
|
125
|
+
const personas: DiscoveryKindDefinition = {
|
|
126
|
+
roots: [
|
|
127
|
+
{ root: join(cwd, '.goodvibes', 'personas'), origin: 'project-local' },
|
|
128
|
+
{ root: join(cwd, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'personas'), origin: 'project-local' },
|
|
129
|
+
{ root: join(homeDir, '.goodvibes', 'personas'), origin: 'global' },
|
|
130
|
+
{ root: join(homeDir, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'personas'), origin: 'global' },
|
|
131
|
+
],
|
|
132
|
+
markers: ['PERSONA.md', 'persona.md'],
|
|
133
|
+
frontmatterBodyKey: 'system_prompt',
|
|
134
|
+
};
|
|
135
|
+
const skills: DiscoveryKindDefinition = {
|
|
136
|
+
roots: [
|
|
137
|
+
{ root: join(cwd, '.goodvibes', 'skills'), origin: 'project-local' },
|
|
138
|
+
{ root: join(cwd, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'skills'), origin: 'project-local' },
|
|
139
|
+
{ root: join(homeDir, '.goodvibes', 'skills'), origin: 'global' },
|
|
140
|
+
{ root: join(homeDir, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'skills'), origin: 'global' },
|
|
141
|
+
],
|
|
142
|
+
markers: ['SKILL.md'],
|
|
143
|
+
};
|
|
144
|
+
const routines: DiscoveryKindDefinition = {
|
|
145
|
+
roots: [
|
|
146
|
+
{ root: join(cwd, '.goodvibes', 'routines'), origin: 'project-local' },
|
|
147
|
+
{ root: join(cwd, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'routines'), origin: 'project-local' },
|
|
148
|
+
{ root: join(homeDir, '.goodvibes', 'routines'), origin: 'global' },
|
|
149
|
+
{ root: join(homeDir, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'routines'), origin: 'global' },
|
|
150
|
+
],
|
|
151
|
+
markers: ['ROUTINE.md', 'routine.md'],
|
|
152
|
+
frontmatterBodyKey: 'steps',
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
personas: summarizeDefinition(personas, 4),
|
|
157
|
+
skills: summarizeDefinition(skills, 4),
|
|
158
|
+
routines: summarizeDefinition(routines, 4),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function summarizeAgentBehaviorDiscovery(shellPaths: Pick<ShellPathService, 'workingDirectory' | 'homeDirectory'> | undefined): AgentBehaviorDiscoverySnapshot {
|
|
163
|
+
if (!shellPaths) return EMPTY_AGENT_BEHAVIOR_DISCOVERY_SNAPSHOT;
|
|
164
|
+
return definitions(shellPaths);
|
|
165
|
+
}
|
|
@@ -14,7 +14,7 @@ export interface DiscoveredPersonaRecord {
|
|
|
14
14
|
readonly frontmatter: Record<string, string>;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const DIRECTORY_MARKERS: readonly string[] = ['PERSONA.md', 'persona.md'
|
|
17
|
+
const DIRECTORY_MARKERS: readonly string[] = ['PERSONA.md', 'persona.md'];
|
|
18
18
|
|
|
19
19
|
function parseFrontmatter(content: string): Record<string, string> {
|
|
20
20
|
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
@@ -33,10 +33,8 @@ function getPersonaDirectories(cwd: string, homeDir: string): Array<{ root: stri
|
|
|
33
33
|
return [
|
|
34
34
|
{ root: join(cwd, '.goodvibes', 'personas'), origin: 'project-local' },
|
|
35
35
|
{ root: join(cwd, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'personas'), origin: 'project-local' },
|
|
36
|
-
{ root: join(cwd, '.goodvibes', 'agents'), origin: 'project-local' },
|
|
37
36
|
{ root: join(homeDir, '.goodvibes', 'personas'), origin: 'global' },
|
|
38
37
|
{ root: join(homeDir, '.goodvibes', GOODVIBES_AGENT_SURFACE_ROOT, 'personas'), origin: 'global' },
|
|
39
|
-
{ root: join(homeDir, '.goodvibes', 'agents'), origin: 'global' },
|
|
40
38
|
];
|
|
41
39
|
}
|
|
42
40
|
|
|
@@ -158,14 +158,16 @@ function formatStore(store: PersonaStoreFile): string {
|
|
|
158
158
|
return `${JSON.stringify(store, null, 2)}\n`;
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
type AgentLocalStorePaths = Pick<ShellPathService, 'resolveUserPath'>;
|
|
162
|
+
|
|
163
|
+
export function personaStorePath(shellPaths: AgentLocalStorePaths): string {
|
|
162
164
|
return shellPaths.resolveUserPath(GOODVIBES_AGENT_SURFACE_ROOT, 'personas', 'personas.json');
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
export class AgentPersonaRegistry {
|
|
166
168
|
public constructor(private readonly storePath: string) {}
|
|
167
169
|
|
|
168
|
-
public static fromShellPaths(shellPaths:
|
|
170
|
+
public static fromShellPaths(shellPaths: AgentLocalStorePaths): AgentPersonaRegistry {
|
|
169
171
|
return new AgentPersonaRegistry(personaStorePath(shellPaths));
|
|
170
172
|
}
|
|
171
173
|
|
|
@@ -374,6 +376,6 @@ export function buildActivePersonaPrompt(shellPaths: ShellPathService): string |
|
|
|
374
376
|
'',
|
|
375
377
|
active.body,
|
|
376
378
|
'',
|
|
377
|
-
'Apply this persona inside the same serial assistant conversation. Do not
|
|
379
|
+
'Apply this persona inside the same serial assistant conversation. Do not launch local workers because a persona is active.',
|
|
378
380
|
].join('\n');
|
|
379
381
|
}
|
|
@@ -33,7 +33,7 @@ export function formatReminderSchedulePreview(preview: ReminderSchedulePreview):
|
|
|
33
33
|
` schedule: ${preview.payload.kind} ${scheduleValue(preview)}`,
|
|
34
34
|
` enabled: ${preview.payload.enabled === false ? 'no' : 'yes'}`,
|
|
35
35
|
` delivery: ${delivery?.mode ?? 'none'}${deliveryTargetCount > 0 ? ` (${deliveryTargetCount} target${deliveryTargetCount === 1 ? '' : 's'})` : ''}`,
|
|
36
|
-
' target: connected GoodVibes
|
|
36
|
+
' target: connected GoodVibes host/main conversation route',
|
|
37
37
|
' policy: reminder delivery only; isolated Agent Knowledge only; no default wiki/non-Agent fallback',
|
|
38
38
|
' next: rerun with --yes to create this connected reminder schedule',
|
|
39
39
|
].join('\n');
|
|
@@ -57,19 +57,19 @@ export function formatReminderScheduleFailure(failure: ReminderScheduleFailure):
|
|
|
57
57
|
return [
|
|
58
58
|
`GoodVibes reminder schedule error: ${failure.kind}`,
|
|
59
59
|
` ${failure.error}`,
|
|
60
|
-
failure.baseUrl ? `
|
|
60
|
+
failure.baseUrl ? ` host: ${failure.baseUrl}` : null,
|
|
61
61
|
` route: ${REMINDER_SCHEDULE_METHOD} ${failure.route}`,
|
|
62
62
|
failure.kind === 'version_mismatch' && failure.daemonVersion && failure.expectedSdkVersion
|
|
63
|
-
? ` versions:
|
|
63
|
+
? ` versions: host=${failure.daemonVersion} expected=${failure.expectedSdkVersion}`
|
|
64
64
|
: null,
|
|
65
65
|
failure.kind === 'auth_required'
|
|
66
|
-
? ' next: pair/authenticate with connected GoodVibes
|
|
66
|
+
? ' next: pair/authenticate with the connected GoodVibes host, then retry with --yes.'
|
|
67
67
|
: null,
|
|
68
68
|
failure.kind === 'daemon_unavailable'
|
|
69
|
-
? ' next: make connected GoodVibes
|
|
69
|
+
? ' next: make the connected GoodVibes host available outside Agent, then retry.'
|
|
70
70
|
: null,
|
|
71
71
|
failure.kind === 'version_mismatch' || failure.kind === 'daemon_route_unavailable'
|
|
72
|
-
? ' next: update connected GoodVibes
|
|
72
|
+
? ' next: update the connected GoodVibes host so public schedules.create is available.'
|
|
73
73
|
: null,
|
|
74
74
|
].filter((line): line is string => Boolean(line)).join('\n');
|
|
75
75
|
}
|
|
@@ -468,7 +468,7 @@ export async function createReminderSchedule(
|
|
|
468
468
|
return {
|
|
469
469
|
ok: false,
|
|
470
470
|
kind: 'auth_required',
|
|
471
|
-
error: `No
|
|
471
|
+
error: `No connected-host operator token found at ${connection.tokenPath}`,
|
|
472
472
|
route: REMINDER_SCHEDULE_ROUTE,
|
|
473
473
|
baseUrl: connection.baseUrl,
|
|
474
474
|
};
|