@pellux/goodvibes-agent 0.1.116 → 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 -663
- package/README.md +38 -52
- package/dist/package/main.js +37826 -35924
- package/docs/README.md +5 -4
- package/docs/{connected-services.md → connected-host.md} +18 -10
- package/docs/getting-started.md +41 -44
- package/docs/release-and-publishing.md +6 -4
- package/package.json +3 -3
- package/src/agent/behavior-discovery-summary.ts +1 -3
- 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 +3 -3
- package/src/agent/runtime-profile.ts +78 -0
- 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 +119 -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 +345 -92
- package/src/input/agent-workspace-basic-command-editors.ts +480 -7
- package/src/input/agent-workspace-categories.ts +175 -15
- 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 +23 -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 +24 -14
- 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 +50 -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 +120 -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 +89 -4
- 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 +81 -3
- package/src/input/onboarding/onboarding-wizard-steps.ts +14 -7
- 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 +26 -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 +5 -5
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/types.ts +26 -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
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { isSecretRefInput } from '@pellux/goodvibes-sdk/platform/config';
|
|
4
|
-
import {
|
|
4
|
+
import { AgentPersonaRegistry } from '../../agent/persona-registry.ts';
|
|
5
|
+
import { AgentRoutineRegistry } from '../../agent/routine-registry.ts';
|
|
6
|
+
import { readAgentRuntimeProfileSelection, resolveAgentRuntimeProfileHome } from '../../agent/runtime-profile.ts';
|
|
7
|
+
import { AgentSkillRegistry } from '../../agent/skill-registry.ts';
|
|
5
8
|
import { readOnboardingRuntimeState } from './state.ts';
|
|
6
9
|
import type {
|
|
7
10
|
OnboardingApplyOperation,
|
|
@@ -144,6 +147,78 @@ function verifyCreateAgentProfileOperation(
|
|
|
144
147
|
};
|
|
145
148
|
}
|
|
146
149
|
|
|
150
|
+
function verifySelectAgentProfileOperation(
|
|
151
|
+
deps: OnboardingVerificationDependencies,
|
|
152
|
+
operation: Extract<OnboardingApplyOperation, { kind: 'select-agent-profile' }>,
|
|
153
|
+
): OnboardingVerificationItem {
|
|
154
|
+
const resolution = resolveAgentRuntimeProfileHome(deps.shellPaths.homeDirectory, operation.name);
|
|
155
|
+
const selection = readAgentRuntimeProfileSelection(deps.shellPaths.homeDirectory);
|
|
156
|
+
const ok = selection?.id === resolution.id && selection.exists;
|
|
157
|
+
return {
|
|
158
|
+
id: `selected-agent-profile:${resolution.id}`,
|
|
159
|
+
status: ok ? 'pass' : 'fail',
|
|
160
|
+
message: ok
|
|
161
|
+
? `${resolution.id} Agent profile is selected for future launches.`
|
|
162
|
+
: `${resolution.id} Agent profile is not selected for future launches.`,
|
|
163
|
+
target: resolution.id,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function verifyCreateLocalPersonaOperation(
|
|
168
|
+
deps: OnboardingVerificationDependencies,
|
|
169
|
+
operation: Extract<OnboardingApplyOperation, { kind: 'create-local-persona' }>,
|
|
170
|
+
): OnboardingVerificationItem {
|
|
171
|
+
const registry = AgentPersonaRegistry.fromShellPaths(deps.shellPaths);
|
|
172
|
+
const persona = registry.get(operation.name);
|
|
173
|
+
const activeOk = operation.activate === false || registry.snapshot().activePersonaId === persona?.id;
|
|
174
|
+
const ok = persona !== null && activeOk;
|
|
175
|
+
const target = persona?.id ?? operation.name.trim();
|
|
176
|
+
return {
|
|
177
|
+
id: `local-persona:${target}`,
|
|
178
|
+
status: ok ? 'pass' : 'fail',
|
|
179
|
+
message: ok
|
|
180
|
+
? `${target} local Agent persona exists${operation.activate === false ? '' : ' and is active'}.`
|
|
181
|
+
: `${target} local Agent persona was not created${operation.activate === false ? '' : ' or activated'}.`,
|
|
182
|
+
target,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function verifyCreateLocalSkillOperation(
|
|
187
|
+
deps: OnboardingVerificationDependencies,
|
|
188
|
+
operation: Extract<OnboardingApplyOperation, { kind: 'create-local-skill' }>,
|
|
189
|
+
): OnboardingVerificationItem {
|
|
190
|
+
const skill = AgentSkillRegistry.fromShellPaths(deps.shellPaths).get(operation.name);
|
|
191
|
+
const enabledOk = operation.enabled === false || skill?.enabled === true;
|
|
192
|
+
const ok = skill !== null && enabledOk;
|
|
193
|
+
const target = skill?.id ?? operation.name.trim();
|
|
194
|
+
return {
|
|
195
|
+
id: `local-skill:${target}`,
|
|
196
|
+
status: ok ? 'pass' : 'fail',
|
|
197
|
+
message: ok
|
|
198
|
+
? `${target} local Agent skill exists${operation.enabled === false ? '' : ' and is enabled'}.`
|
|
199
|
+
: `${target} local Agent skill was not created${operation.enabled === false ? '' : ' or enabled'}.`,
|
|
200
|
+
target,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function verifyCreateLocalRoutineOperation(
|
|
205
|
+
deps: OnboardingVerificationDependencies,
|
|
206
|
+
operation: Extract<OnboardingApplyOperation, { kind: 'create-local-routine' }>,
|
|
207
|
+
): OnboardingVerificationItem {
|
|
208
|
+
const routine = AgentRoutineRegistry.fromShellPaths(deps.shellPaths).get(operation.name);
|
|
209
|
+
const enabledOk = operation.enabled === false || routine?.enabled === true;
|
|
210
|
+
const ok = routine !== null && enabledOk;
|
|
211
|
+
const target = routine?.id ?? operation.name.trim();
|
|
212
|
+
return {
|
|
213
|
+
id: `local-routine:${target}`,
|
|
214
|
+
status: ok ? 'pass' : 'fail',
|
|
215
|
+
message: ok
|
|
216
|
+
? `${target} local Agent routine exists${operation.enabled === false ? '' : ' and is enabled'}.`
|
|
217
|
+
: `${target} local Agent routine was not created${operation.enabled === false ? '' : ' or enabled'}.`,
|
|
218
|
+
target,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
147
222
|
async function verifyOperation(
|
|
148
223
|
deps: OnboardingVerificationDependencies,
|
|
149
224
|
operation: OnboardingApplyOperation,
|
|
@@ -152,7 +227,11 @@ async function verifyOperation(
|
|
|
152
227
|
if (operation.kind === 'set-secret') return verifySecretOperation(deps, operation);
|
|
153
228
|
if (operation.kind === 'ensure-auth-user') return verifyAuthOperation(deps, operation);
|
|
154
229
|
if (operation.kind === 'acknowledge') return verifyAcknowledgementOperation(deps, operation);
|
|
155
|
-
return verifyCreateAgentProfileOperation(deps, operation);
|
|
230
|
+
if (operation.kind === 'create-agent-profile') return verifyCreateAgentProfileOperation(deps, operation);
|
|
231
|
+
if (operation.kind === 'select-agent-profile') return verifySelectAgentProfileOperation(deps, operation);
|
|
232
|
+
if (operation.kind === 'create-local-persona') return verifyCreateLocalPersonaOperation(deps, operation);
|
|
233
|
+
if (operation.kind === 'create-local-skill') return verifyCreateLocalSkillOperation(deps, operation);
|
|
234
|
+
return verifyCreateLocalRoutineOperation(deps, operation);
|
|
156
235
|
}
|
|
157
236
|
|
|
158
237
|
export async function verifyOnboardingRequest(
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Shared helper that enumerates the legacy workspace-scoped `operator-tokens.json`
|
|
5
5
|
* locations earlier GoodVibes builds may have written. Used by the in-process
|
|
6
6
|
* bootstrap path so stale-token pruning has a single source of truth for where
|
|
7
|
-
* to look. GoodVibes Agent itself does not own
|
|
7
|
+
* to look. GoodVibes Agent itself does not own connected-host startup.
|
|
8
8
|
*
|
|
9
9
|
* Adding a new legacy location: append to `workspaceOperatorTokenCandidates` and
|
|
10
|
-
* the new path will be inspected on the next
|
|
10
|
+
* the new path will be inspected on the next connected-host boot.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { join } from 'node:path';
|
package/src/runtime/services.ts
CHANGED
|
@@ -23,7 +23,7 @@ import { MediaProviderRegistry, ensureBuiltinMediaProviders } from '@pellux/good
|
|
|
23
23
|
import { MultimodalService } from '@pellux/goodvibes-sdk/platform/multimodal';
|
|
24
24
|
import { AgentManager } from '@pellux/goodvibes-sdk/platform/tools';
|
|
25
25
|
import { AgentMessageBus } from '@pellux/goodvibes-sdk/platform/agents';
|
|
26
|
-
import { WrfcController } from '@pellux/goodvibes-sdk/platform/agents';
|
|
26
|
+
import type { WrfcController } from '@pellux/goodvibes-sdk/platform/agents';
|
|
27
27
|
import { AgentOrchestrator } from '@pellux/goodvibes-sdk/platform/agents';
|
|
28
28
|
import { ArchetypeLoader } from '@pellux/goodvibes-sdk/platform/agents';
|
|
29
29
|
import { ProcessManager } from '@pellux/goodvibes-sdk/platform/tools';
|
|
@@ -73,7 +73,7 @@ import { IdempotencyStore } from '@/runtime/index.ts';
|
|
|
73
73
|
import { OverflowHandler } from '@pellux/goodvibes-sdk/platform/tools';
|
|
74
74
|
import { ToolLLM } from '@pellux/goodvibes-sdk/platform/config';
|
|
75
75
|
import { ComponentHealthMonitor } from '@/runtime/index.ts';
|
|
76
|
-
import { WorktreeRegistry } from '@/runtime/index.ts';
|
|
76
|
+
import type { WorktreeRegistry } from '@/runtime/index.ts';
|
|
77
77
|
import { SandboxSessionRegistry } from '@/runtime/index.ts';
|
|
78
78
|
import { createShellPathService, type ShellPathService } from '@/runtime/index.ts';
|
|
79
79
|
import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
|
|
@@ -101,7 +101,7 @@ function buildFallbackModelDefinition(provider: string, modelId: string): ModelD
|
|
|
101
101
|
description: 'Configured model available before the model catalog cache has loaded.',
|
|
102
102
|
capabilities: {
|
|
103
103
|
toolCalling: true,
|
|
104
|
-
codeEditing:
|
|
104
|
+
codeEditing: false,
|
|
105
105
|
reasoning: isReasoningProvider,
|
|
106
106
|
multimodal: isReasoningProvider,
|
|
107
107
|
},
|
|
@@ -113,6 +113,24 @@ function buildFallbackModelDefinition(provider: string, modelId: string): ModelD
|
|
|
113
113
|
};
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
function createDisabledAgentWorktreeRegistry(): WorktreeRegistry {
|
|
117
|
+
const registry: Pick<WorktreeRegistry, 'list' | 'attach' | 'setState' | 'cleanup'> = {
|
|
118
|
+
async list() {
|
|
119
|
+
return [];
|
|
120
|
+
},
|
|
121
|
+
attach(_path, _target) {
|
|
122
|
+
throw new Error('GoodVibes Agent does not own local worktree attachment. Delegate build, fix, and review work to GoodVibes TUI.');
|
|
123
|
+
},
|
|
124
|
+
setState(_path, _state) {
|
|
125
|
+
throw new Error('GoodVibes Agent does not own local worktree state. Delegate build, fix, and review work to GoodVibes TUI.');
|
|
126
|
+
},
|
|
127
|
+
async cleanup(_path) {
|
|
128
|
+
throw new Error('GoodVibes Agent does not own local worktree cleanup. Delegate build, fix, and review work to GoodVibes TUI.');
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
return registry as unknown as WorktreeRegistry;
|
|
132
|
+
}
|
|
133
|
+
|
|
116
134
|
function ensureConfiguredModelIsRoutable(providerRegistry: ProviderRegistry, configManager: ConfigManager): void {
|
|
117
135
|
const configuredModel = String(configManager.get('provider.model') ?? '').trim();
|
|
118
136
|
if (!configuredModel.includes(':')) return;
|
|
@@ -335,7 +353,7 @@ export interface RuntimeServices {
|
|
|
335
353
|
readonly agentManager: AgentManager;
|
|
336
354
|
readonly agentMessageBus: AgentMessageBus;
|
|
337
355
|
readonly agentOrchestrator: AgentOrchestrator;
|
|
338
|
-
readonly wrfcController: WrfcController
|
|
356
|
+
readonly wrfcController: Pick<WrfcController, 'listChains'>;
|
|
339
357
|
readonly processManager: ProcessManager;
|
|
340
358
|
readonly modeManager: ModeManager;
|
|
341
359
|
readonly fileUndoManager: FileUndoManager;
|
|
@@ -345,7 +363,7 @@ export interface RuntimeServices {
|
|
|
345
363
|
* Agent memory is home/profile-owned and intentionally does not move on workspace swap.
|
|
346
364
|
* Called by WorkspaceSwapManager after the new directory has been verified.
|
|
347
365
|
* Stores that require a process restart emit a warn-level log; they continue serving
|
|
348
|
-
* the old path until the
|
|
366
|
+
* the old path until the externally owned GoodVibes host restarts with the new --working-dir.
|
|
349
367
|
*/
|
|
350
368
|
rerootStores(newWorkingDir: string): Promise<void>;
|
|
351
369
|
}
|
|
@@ -443,12 +461,9 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
443
461
|
configManager,
|
|
444
462
|
});
|
|
445
463
|
agentManager.setRuntimeBus(options.runtimeBus);
|
|
446
|
-
const wrfcController
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
projectRoot: workingDirectory,
|
|
450
|
-
});
|
|
451
|
-
agentManager.setWrfcController(wrfcController);
|
|
464
|
+
const wrfcController: Pick<WrfcController, 'listChains'> = {
|
|
465
|
+
listChains: () => [],
|
|
466
|
+
};
|
|
452
467
|
const hookDispatcher = new HookDispatcher({ toolLLM, projectRoot: workingDirectory }, hookActivityTracker);
|
|
453
468
|
configManager.attachHookDispatcher(hookDispatcher);
|
|
454
469
|
const hookWorkbench = createHookWorkbench({
|
|
@@ -578,7 +593,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
578
593
|
mcpRegistry.setSandboxRuntime(configManager, sandboxSessionRegistry);
|
|
579
594
|
const tokenAuditor = new ApiTokenAuditor({ managed: false });
|
|
580
595
|
const componentHealthMonitor = new ComponentHealthMonitor();
|
|
581
|
-
const worktreeRegistry =
|
|
596
|
+
const worktreeRegistry = createDisabledAgentWorktreeRegistry();
|
|
582
597
|
const webhookNotifier = new WebhookNotifier();
|
|
583
598
|
const replayEngine = new DeterministicReplayEngine(workingDirectory);
|
|
584
599
|
const providerOptimizer = new ProviderOptimizer(providerRegistry, providerCapabilityRegistry, false);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ConfigKey } from '@pellux/goodvibes-sdk/platform/config';
|
|
2
2
|
import type { CliServiceRuntime } from '../cli/service-posture.ts';
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const AGENT_EXTERNAL_HOST_SERVICE_MESSAGE = 'GoodVibes Agent uses a connected GoodVibes host and does not install, start, stop, restart, or uninstall it. Manage host lifecycle outside Agent.';
|
|
5
5
|
|
|
6
6
|
export interface ServiceSettingsSyncChange {
|
|
7
7
|
readonly key: ConfigKey;
|
|
@@ -11,13 +11,13 @@ export interface ServiceSettingsSyncChange {
|
|
|
11
11
|
|
|
12
12
|
export interface ServiceSettingsSyncResult {
|
|
13
13
|
readonly handled: boolean;
|
|
14
|
-
readonly action?: '
|
|
14
|
+
readonly action?: 'connected-host-blocked' | 'unchanged';
|
|
15
15
|
readonly message?: string;
|
|
16
16
|
readonly error?: string;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export interface ServiceSettingsSyncOptions {
|
|
20
|
-
readonly
|
|
20
|
+
readonly allowExternalHostMutation?: false;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export function syncServiceSettingToPlatform(
|
|
@@ -30,15 +30,15 @@ export function syncServiceSettingToPlatform(
|
|
|
30
30
|
return {
|
|
31
31
|
handled: true,
|
|
32
32
|
action: 'unchanged',
|
|
33
|
-
message: '
|
|
33
|
+
message: 'Connected-host setting unchanged',
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
runtime.configManager.setDynamic(change.key, change.previousValue);
|
|
38
38
|
return {
|
|
39
39
|
handled: true,
|
|
40
|
-
action: '
|
|
41
|
-
message:
|
|
42
|
-
error: '
|
|
40
|
+
action: 'connected-host-blocked',
|
|
41
|
+
message: AGENT_EXTERNAL_HOST_SERVICE_MESSAGE,
|
|
42
|
+
error: 'connected_host_lifecycle_external',
|
|
43
43
|
};
|
|
44
44
|
}
|
package/src/shell/ui-openers.ts
CHANGED
|
@@ -78,6 +78,17 @@ function buildConfiguredViaMap(
|
|
|
78
78
|
return map;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
function agentWorkspaceCategoryForPanel(panelId: string): string {
|
|
82
|
+
if (panelId === 'knowledge') return 'knowledge';
|
|
83
|
+
if (panelId === 'memory') return 'memory';
|
|
84
|
+
if (panelId === 'work-plan' || panelId === 'tasks' || panelId === 'approval') return 'work';
|
|
85
|
+
if (panelId === 'automation' || panelId === 'schedule') return 'automation';
|
|
86
|
+
if (panelId === 'provider-health' || panelId === 'providers' || panelId === 'accounts' || panelId === 'subscription') return 'setup';
|
|
87
|
+
if (panelId === 'security' || panelId === 'policy') return 'tools';
|
|
88
|
+
if (panelId === 'qr-code') return 'channels';
|
|
89
|
+
return 'home';
|
|
90
|
+
}
|
|
91
|
+
|
|
81
92
|
export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
82
93
|
const {
|
|
83
94
|
commandContext,
|
|
@@ -284,8 +295,8 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
284
295
|
render();
|
|
285
296
|
};
|
|
286
297
|
|
|
287
|
-
commandContext.openAgentWorkspace = () => {
|
|
288
|
-
input.openAgentWorkspace(commandContext);
|
|
298
|
+
commandContext.openAgentWorkspace = (categoryId?: string) => {
|
|
299
|
+
input.openAgentWorkspace(commandContext, categoryId);
|
|
289
300
|
render();
|
|
290
301
|
};
|
|
291
302
|
|
|
@@ -296,42 +307,18 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
296
307
|
};
|
|
297
308
|
|
|
298
309
|
commandContext.openPanelPicker = () => {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
panelManager.show();
|
|
308
|
-
input.panelFocused = true;
|
|
309
|
-
conversation.setSplashSuppressed(true);
|
|
310
|
-
conversation.rebuildHistory();
|
|
311
|
-
} else if (!input.panelFocused) {
|
|
312
|
-
if (panelManager.getAllOpen().length === 0) {
|
|
313
|
-
try {
|
|
314
|
-
panelManager.open('panel-list');
|
|
315
|
-
} catch {
|
|
316
|
-
// non-fatal
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
panelManager.show();
|
|
320
|
-
input.panelFocused = true;
|
|
321
|
-
conversation.setSplashSuppressed(true);
|
|
322
|
-
conversation.rebuildHistory();
|
|
323
|
-
} else {
|
|
324
|
-
panelManager.hide();
|
|
325
|
-
input.panelFocused = false;
|
|
326
|
-
conversation.setSplashSuppressed(false);
|
|
327
|
-
conversation.rebuildHistory();
|
|
328
|
-
}
|
|
310
|
+
panelManager.hide();
|
|
311
|
+
input.panelFocused = false;
|
|
312
|
+
conversation.setSplashSuppressed(false);
|
|
313
|
+
conversation.log('Panel picker is deferred in GoodVibes Agent. Opening the Agent operator workspace instead.', { fg: '214' });
|
|
314
|
+
input.openAgentWorkspace(commandContext, 'home');
|
|
315
|
+
conversation.rebuildHistory();
|
|
329
316
|
render();
|
|
330
317
|
};
|
|
331
318
|
|
|
332
319
|
commandContext.focusPanels = () => {
|
|
333
|
-
|
|
334
|
-
input.
|
|
320
|
+
input.panelFocused = false;
|
|
321
|
+
input.openAgentWorkspace(commandContext, 'home');
|
|
335
322
|
render();
|
|
336
323
|
};
|
|
337
324
|
|
|
@@ -342,10 +329,12 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
342
329
|
};
|
|
343
330
|
|
|
344
331
|
commandContext.showPanel = (panelId, pane) => {
|
|
345
|
-
|
|
346
|
-
panelManager.
|
|
347
|
-
input.panelFocused =
|
|
348
|
-
conversation.setSplashSuppressed(
|
|
332
|
+
void pane;
|
|
333
|
+
panelManager.hide();
|
|
334
|
+
input.panelFocused = false;
|
|
335
|
+
conversation.setSplashSuppressed(false);
|
|
336
|
+
conversation.log(`Panel "${panelId}" is not part of the Agent front door yet. Opening the matching Agent workspace.`, { fg: '214' });
|
|
337
|
+
input.openAgentWorkspace(commandContext, agentWorkspaceCategoryForPanel(panelId));
|
|
349
338
|
conversation.rebuildHistory();
|
|
350
339
|
render();
|
|
351
340
|
};
|
|
@@ -137,6 +137,12 @@ function requireDescription(args: AgentLocalRegistryToolArgs): string {
|
|
|
137
137
|
return description;
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
+
function requireTextField(value: unknown, fieldName: string): string {
|
|
141
|
+
const text = readString(value);
|
|
142
|
+
if (!text) throw new Error(`${fieldName} is required.`);
|
|
143
|
+
return text;
|
|
144
|
+
}
|
|
145
|
+
|
|
140
146
|
function requireSummary(args: AgentLocalRegistryToolArgs): string {
|
|
141
147
|
const summary = readString(args.summary || args.description);
|
|
142
148
|
if (!summary) throw new Error('summary is required.');
|
|
@@ -299,7 +305,7 @@ function handlePersona(shellPaths: ShellPathService, action: AgentLocalRegistryA
|
|
|
299
305
|
const persona = registry.create({
|
|
300
306
|
name: requireName(args),
|
|
301
307
|
description: requireDescription(args),
|
|
302
|
-
body:
|
|
308
|
+
body: requireTextField(args.body, 'body'),
|
|
303
309
|
tags: readStringList(args.tags),
|
|
304
310
|
triggers: readStringList(args.triggers),
|
|
305
311
|
source: 'agent',
|
|
@@ -350,7 +356,7 @@ function handleSkill(shellPaths: ShellPathService, action: AgentLocalRegistryAct
|
|
|
350
356
|
const skill = registry.create({
|
|
351
357
|
name: requireName(args),
|
|
352
358
|
description: requireDescription(args),
|
|
353
|
-
procedure:
|
|
359
|
+
procedure: requireTextField(args.procedure, 'procedure'),
|
|
354
360
|
triggers: readStringList(args.triggers),
|
|
355
361
|
tags: readStringList(args.tags),
|
|
356
362
|
enabled: args.enabled === true,
|
|
@@ -441,7 +447,7 @@ function handleRoutine(shellPaths: ShellPathService, action: AgentLocalRegistryA
|
|
|
441
447
|
const routine = registry.create({
|
|
442
448
|
name: requireName(args),
|
|
443
449
|
description: requireDescription(args),
|
|
444
|
-
steps:
|
|
450
|
+
steps: requireTextField(args.steps, 'steps'),
|
|
445
451
|
triggers: readStringList(args.triggers),
|
|
446
452
|
tags: readStringList(args.tags),
|
|
447
453
|
enabled: args.enabled === true,
|
|
@@ -469,7 +475,7 @@ function handleRoutine(shellPaths: ShellPathService, action: AgentLocalRegistryA
|
|
|
469
475
|
const routine = registry.markStarted(requireId(args));
|
|
470
476
|
return [
|
|
471
477
|
`Started Agent-local routine ${routine.id}: ${routine.name}`,
|
|
472
|
-
'Policy: same main conversation; no hidden background job,
|
|
478
|
+
'Policy: same main conversation; no hidden background job, connected-host mutation, or external side effect was started.',
|
|
473
479
|
'',
|
|
474
480
|
routine.steps,
|
|
475
481
|
].join('\n');
|
|
@@ -83,8 +83,6 @@ const READ_ONLY_AGENT_TOOL_MODES = [
|
|
|
83
83
|
'templates',
|
|
84
84
|
'get',
|
|
85
85
|
'budget',
|
|
86
|
-
'wrfc-chains',
|
|
87
|
-
'wrfc-history',
|
|
88
86
|
'cohort-status',
|
|
89
87
|
'cohort-report',
|
|
90
88
|
] as const;
|
|
@@ -174,7 +172,7 @@ const STATE_MUTATION_DENIAL = [
|
|
|
174
172
|
const SETTINGS_MUTATION_DENIAL = [
|
|
175
173
|
'GoodVibes Agent does not mutate configuration through model tools in the main conversation.',
|
|
176
174
|
'Use explicit Agent CLI/slash settings commands for intentional config changes.',
|
|
177
|
-
'Secrets, tokens, passwords,
|
|
175
|
+
'Secrets, tokens, passwords, connected-host lifecycle settings, and connected-host exposure settings require explicit user action outside the model tool surface.',
|
|
178
176
|
].join(' ');
|
|
179
177
|
|
|
180
178
|
const INSPECT_WRITE_DENIAL = [
|
|
@@ -191,8 +189,8 @@ const DURABLE_WORKFLOW_MUTATION_DENIAL = [
|
|
|
191
189
|
|
|
192
190
|
const CONTROL_MUTATION_DENIAL = [
|
|
193
191
|
'GoodVibes Agent only inspects runtime-owned product-control surfaces from the main conversation.',
|
|
194
|
-
'Product-control mutation,
|
|
195
|
-
'Use explicit Agent CLI/slash commands for Agent-owned changes, and keep
|
|
192
|
+
'Product-control mutation, connected-host lifecycle, and connected-host posture changes are disabled here.',
|
|
193
|
+
'Use explicit Agent CLI/slash commands for Agent-owned changes, and keep connected-host lifecycle external.',
|
|
196
194
|
].join(' ');
|
|
197
195
|
|
|
198
196
|
export function installAgentToolPolicyGuard(registry: ToolRegistry, options: AgentToolPolicyGuardOptions = {}): void {
|
|
@@ -250,7 +248,7 @@ export function installAgentToolPolicyGuard(registry: ToolRegistry, options: Age
|
|
|
250
248
|
modeSet: READ_ONLY_CONTROL_TOOL_MODE_SET,
|
|
251
249
|
description: [
|
|
252
250
|
'Read-only product-control inspection for GoodVibes Agent.',
|
|
253
|
-
'Command, panel, and subscription catalogs can be inspected, but product-control mutation and
|
|
251
|
+
'Command, panel, and subscription catalogs can be inspected, but product-control mutation and connected-host lifecycle are external.',
|
|
254
252
|
].join(' '),
|
|
255
253
|
denial: CONTROL_MUTATION_DENIAL,
|
|
256
254
|
});
|
|
@@ -363,7 +361,7 @@ export function wrapBlockedSettingsToolForAgentPolicy(tool: Tool): void {
|
|
|
363
361
|
tool.definition.description = [
|
|
364
362
|
'Blocked in GoodVibes Agent main conversation: configuration mutation.',
|
|
365
363
|
'Use explicit Agent CLI/slash settings commands for intentional config changes.',
|
|
366
|
-
'
|
|
364
|
+
'Connected-host lifecycle and service exposure remain externally managed outside GoodVibes Agent.',
|
|
367
365
|
].join(' ');
|
|
368
366
|
tool.definition.sideEffects = [];
|
|
369
367
|
tool.definition.parameters = {
|
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.117';
|
|
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 {
|