@pellux/goodvibes-agent 0.1.56 → 0.1.58

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.
Files changed (95) hide show
  1. package/.goodvibes/GOODVIBES.md +1 -1
  2. package/CHANGELOG.md +18 -9
  3. package/README.md +3 -3
  4. package/docs/README.md +1 -1
  5. package/docs/getting-started.md +3 -3
  6. package/docs/release-and-publishing.md +2 -2
  7. package/package.json +1 -3
  8. package/src/agent/routine-schedule-args.ts +219 -0
  9. package/src/agent/routine-schedule-format.ts +173 -0
  10. package/src/agent/routine-schedule-promotion.ts +3 -811
  11. package/src/agent/routine-schedule-receipts.ts +502 -0
  12. package/src/cli/agent-knowledge-command.ts +6 -6
  13. package/src/cli/help.ts +3 -25
  14. package/src/cli/package-verification.ts +23 -16
  15. package/src/cli/redaction.ts +4 -1
  16. package/src/cli/routines-command.ts +10 -6
  17. package/src/cli/service-posture.ts +47 -280
  18. package/src/cli/status.ts +0 -1
  19. package/src/cli/tui-startup.ts +23 -0
  20. package/src/config/secret-config.ts +0 -2
  21. package/src/input/agent-workspace-categories.ts +219 -0
  22. package/src/input/agent-workspace-editors.ts +143 -0
  23. package/src/input/agent-workspace-snapshot.ts +265 -0
  24. package/src/input/agent-workspace-types.ts +142 -0
  25. package/src/input/agent-workspace.ts +22 -766
  26. package/src/input/commands/agent-runtime-profile-runtime.ts +1 -1
  27. package/src/input/commands/delegation-runtime.ts +1 -1
  28. package/src/input/commands/experience-runtime.ts +3 -4
  29. package/src/input/commands/guidance-runtime.ts +1 -2
  30. package/src/input/commands/health-runtime.ts +3 -65
  31. package/src/input/commands/knowledge.ts +7 -7
  32. package/src/input/commands/local-setup-review.ts +0 -61
  33. package/src/input/commands/local-setup-transfer.ts +0 -3
  34. package/src/input/commands/local-setup.ts +2 -15
  35. package/src/input/commands/planning-runtime.ts +4 -1
  36. package/src/input/commands/platform-access-runtime.ts +1 -10
  37. package/src/input/commands/platform-services-runtime.ts +0 -1
  38. package/src/input/commands/recall-query.ts +1 -1
  39. package/src/input/commands/routines-runtime.ts +10 -6
  40. package/src/input/commands/schedule-runtime.ts +10 -6
  41. package/src/input/commands/session-workflow.ts +1 -1
  42. package/src/input/commands/tasks-runtime.ts +1 -14
  43. package/src/input/commands.ts +0 -4
  44. package/src/input/handler-onboarding.ts +10 -120
  45. package/src/input/onboarding/onboarding-wizard-apply.ts +5 -196
  46. package/src/input/onboarding/onboarding-wizard-constants.ts +8 -119
  47. package/src/input/onboarding/onboarding-wizard-helpers.ts +2 -53
  48. package/src/input/onboarding/onboarding-wizard-rules.ts +2 -236
  49. package/src/input/onboarding/onboarding-wizard-state.ts +1 -69
  50. package/src/input/onboarding/onboarding-wizard-steps.ts +584 -737
  51. package/src/input/onboarding/onboarding-wizard-types.ts +8 -26
  52. package/src/input/onboarding/onboarding-wizard.ts +4 -109
  53. package/src/input/settings-modal-agent-policy.ts +10 -0
  54. package/src/input/settings-modal-types.ts +2 -4
  55. package/src/input/settings-modal.ts +3 -1
  56. package/src/input/submission-router.ts +0 -1
  57. package/src/main.ts +13 -12
  58. package/src/panels/approval-panel.ts +1 -2
  59. package/src/panels/builtin/operations.ts +1 -2
  60. package/src/panels/knowledge-panel.ts +2 -2
  61. package/src/panels/project-planning-panel.ts +4 -1
  62. package/src/panels/provider-health-domains.ts +0 -22
  63. package/src/panels/provider-health-panel.ts +1 -5
  64. package/src/panels/session-browser-panel.ts +0 -5
  65. package/src/panels/tasks-panel.ts +2 -64
  66. package/src/renderer/agent-workspace.ts +1 -1
  67. package/src/renderer/help-overlay.ts +1 -2
  68. package/src/renderer/semantic-diff.ts +1 -1
  69. package/src/renderer/settings-modal-helpers.ts +0 -16
  70. package/src/renderer/settings-modal.ts +3 -5
  71. package/src/runtime/bootstrap-hook-bridge.ts +0 -3
  72. package/src/runtime/bootstrap-shell.ts +2 -1
  73. package/src/runtime/bootstrap.ts +1 -1
  74. package/src/runtime/index.ts +0 -1
  75. package/src/runtime/onboarding/derivation.ts +1 -28
  76. package/src/runtime/onboarding/snapshot.ts +0 -1
  77. package/src/runtime/onboarding/types.ts +1 -4
  78. package/src/runtime/services.ts +4 -23
  79. package/src/runtime/ui-read-models.ts +4 -3
  80. package/src/shell/service-settings-sync.ts +15 -244
  81. package/src/tools/agent-context-policy.ts +1 -1
  82. package/src/tools/wrfc-agent-guard.ts +3 -3
  83. package/src/verification/live-verifier.ts +11 -5
  84. package/src/verification/verification-ledger.ts +3 -6
  85. package/src/version.ts +1 -1
  86. package/src/input/commands/agent-externalized-tui.ts +0 -73
  87. package/src/input/commands/cloudflare-runtime.ts +0 -385
  88. package/src/input/handler-onboarding-cloudflare.ts +0 -322
  89. package/src/input/onboarding/onboarding-runtime-status.ts +0 -87
  90. package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +0 -494
  91. package/src/input/onboarding/onboarding-wizard-cloudflare.ts +0 -199
  92. package/src/input/onboarding/onboarding-wizard-external-surface-extra-specs.ts +0 -130
  93. package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +0 -762
  94. package/src/runtime/cloudflare-control-plane.ts +0 -350
  95. package/src/runtime/sandbox-public-gaps.ts +0 -358
@@ -1,30 +1,7 @@
1
- import { mkdirSync } from 'node:fs';
2
- import { spawnSync } from 'node:child_process';
3
1
  import type { ConfigKey } from '@pellux/goodvibes-sdk/platform/config';
4
- import type { ManagedServiceStatus } from '@pellux/goodvibes-sdk/platform/daemon';
5
- import { logger, summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
6
- import {
7
- createPlatformServiceManager,
8
- getServiceStateRoot,
9
- type CliServiceRuntime,
10
- } from '../cli/service-posture.ts';
2
+ import type { CliServiceRuntime } from '../cli/service-posture.ts';
11
3
 
12
- type ManagedServiceAction = 'install' | 'uninstall' | 'start' | 'stop' | 'restart' | 'status';
13
-
14
- export interface ServiceManagerLike {
15
- status(): ManagedServiceStatus;
16
- install(): ManagedServiceStatus;
17
- uninstall(): ManagedServiceStatus;
18
- start(): ManagedServiceStatus;
19
- stop(): ManagedServiceStatus;
20
- restart(): ManagedServiceStatus;
21
- }
22
-
23
- export interface CommandResult {
24
- readonly status: number | null;
25
- readonly stdout?: string;
26
- readonly stderr?: string;
27
- }
4
+ export const AGENT_EXTERNAL_DAEMON_SERVICE_MESSAGE = 'GoodVibes Agent connects to an external daemon and does not install, start, stop, restart, or uninstall daemon services. Manage daemon lifecycle from GoodVibes TUI or your daemon host tooling.';
28
5
 
29
6
  export interface ServiceSettingsSyncChange {
30
7
  readonly key: ConfigKey;
@@ -34,240 +11,34 @@ export interface ServiceSettingsSyncChange {
34
11
 
35
12
  export interface ServiceSettingsSyncResult {
36
13
  readonly handled: boolean;
37
- readonly action?: ManagedServiceAction | 'install-start' | 'disable';
38
- readonly status?: ManagedServiceStatus;
14
+ readonly action?: 'external-daemon-blocked' | 'unchanged';
39
15
  readonly message?: string;
40
16
  readonly error?: string;
41
17
  }
42
18
 
43
19
  export interface ServiceSettingsSyncOptions {
44
- readonly createManager?: (runtime: CliServiceRuntime) => ServiceManagerLike;
45
- readonly runCommand?: (command: string, args: readonly string[]) => CommandResult;
46
- readonly mkdir?: typeof mkdirSync;
47
- }
48
-
49
- const SERVICE_DEFINITION_KEYS = new Set<ConfigKey>([
50
- 'service.restartOnFailure',
51
- 'service.platform',
52
- 'service.serviceName',
53
- 'service.logPath',
54
- ] as ConfigKey[]);
55
-
56
- function runCommand(command: string, args: readonly string[], options: ServiceSettingsSyncOptions): CommandResult {
57
- if (options.runCommand) return options.runCommand(command, args);
58
- return spawnSync(command, [...args], { stdio: 'pipe', encoding: 'utf-8' });
59
- }
60
-
61
- function commandError(result: CommandResult): string | null {
62
- if ((result.status ?? 1) === 0) return null;
63
- return ((result.stderr ?? '') || (result.stdout ?? '') || `command exited with ${result.status}`).trim();
64
- }
65
-
66
- function serviceName(runtime: CliServiceRuntime, fallback = 'goodvibes'): string {
67
- return String(runtime.configManager.get('service.serviceName') ?? fallback).trim() || fallback;
68
- }
69
-
70
- function runSystemd(runtime: CliServiceRuntime, args: readonly string[], options: ServiceSettingsSyncOptions): string | null {
71
- const result = runCommand('systemctl', ['--user', ...args], options);
72
- return commandError(result);
73
- }
74
-
75
- function reloadSystemdIfNeeded(
76
- runtime: CliServiceRuntime,
77
- status: ManagedServiceStatus,
78
- options: ServiceSettingsSyncOptions,
79
- ): string | null {
80
- if (status.platform !== 'systemd') return null;
81
- return runSystemd(runtime, ['daemon-reload'], options);
82
- }
83
-
84
- function disableSystemService(
85
- runtime: CliServiceRuntime,
86
- manager: ServiceManagerLike,
87
- options: ServiceSettingsSyncOptions,
88
- ): ServiceSettingsSyncResult {
89
- const before = manager.status();
90
- let disableError: string | null = null;
91
- if (before.platform === 'systemd') {
92
- disableError = before.installed || before.running
93
- ? runSystemd(runtime, ['disable', '--now', `${serviceName(runtime)}.service`], options)
94
- : null;
95
- if (disableError) {
96
- logger.warn('Settings service sync: systemd disable failed', { error: disableError });
97
- }
98
- } else if (before.running || before.installed) {
99
- const stopped = manager.stop();
100
- if (stopped.actionError) {
101
- return {
102
- handled: true,
103
- action: 'stop',
104
- status: stopped,
105
- message: `Service disable failed: ${stopped.actionError}`,
106
- error: stopped.actionError,
107
- };
108
- }
109
- }
110
-
111
- const uninstalled = manager.uninstall();
112
- const reloadError = reloadSystemdIfNeeded(runtime, uninstalled, options);
113
- const error = uninstalled.actionError ?? reloadError ?? disableError ?? undefined;
114
- return {
115
- handled: true,
116
- action: 'disable',
117
- status: uninstalled,
118
- message: error ? `Service disable failed: ${error}` : 'OS service disabled',
119
- ...(error ? { error } : {}),
120
- };
121
- }
122
-
123
- function installAndStartSystemService(
124
- runtime: CliServiceRuntime,
125
- manager: ServiceManagerLike,
126
- options: ServiceSettingsSyncOptions,
127
- ): ServiceSettingsSyncResult {
128
- (options.mkdir ?? mkdirSync)(getServiceStateRoot(runtime), { recursive: true });
129
- const installed = manager.install();
130
- if (installed.actionError) {
131
- return {
132
- handled: true,
133
- action: 'install',
134
- status: installed,
135
- message: `Service install failed: ${installed.actionError}`,
136
- error: installed.actionError,
137
- };
138
- }
139
-
140
- const reloadError = reloadSystemdIfNeeded(runtime, installed, options);
141
- if (reloadError) {
142
- return {
143
- handled: true,
144
- action: 'install',
145
- status: installed,
146
- message: `Service install failed: ${reloadError}`,
147
- error: reloadError,
148
- };
149
- }
150
-
151
- const started = manager.start();
152
- const error = started.actionError ?? undefined;
153
- return {
154
- handled: true,
155
- action: 'install-start',
156
- status: started,
157
- message: error ? `Service start failed: ${error}` : 'OS service installed and started',
158
- ...(error ? { error } : {}),
159
- };
160
- }
161
-
162
- function refreshInstalledSystemService(
163
- runtime: CliServiceRuntime,
164
- manager: ServiceManagerLike,
165
- options: ServiceSettingsSyncOptions,
166
- ): ServiceSettingsSyncResult {
167
- const before = manager.status();
168
- if (!before.installed && runtime.configManager.get('service.autostart') !== true) {
169
- return {
170
- handled: true,
171
- action: 'status',
172
- status: before,
173
- message: 'Service setting saved',
174
- };
175
- }
176
-
177
- const installed = manager.install();
178
- if (installed.actionError) {
179
- return {
180
- handled: true,
181
- action: 'install',
182
- status: installed,
183
- message: `Service update failed: ${installed.actionError}`,
184
- error: installed.actionError,
185
- };
186
- }
187
-
188
- const reloadError = reloadSystemdIfNeeded(runtime, installed, options);
189
- if (reloadError) {
190
- return {
191
- handled: true,
192
- action: 'install',
193
- status: installed,
194
- message: `Service update failed: ${reloadError}`,
195
- error: reloadError,
196
- };
197
- }
198
-
199
- const next = before.running ? manager.restart() : manager.start();
200
- const error = next.actionError ?? undefined;
201
- return {
202
- handled: true,
203
- action: before.running ? 'restart' : 'start',
204
- status: next,
205
- message: error ? `Service update failed: ${error}` : 'OS service updated',
206
- ...(error ? { error } : {}),
207
- };
20
+ readonly allowExternalDaemonMutation?: false;
208
21
  }
209
22
 
210
23
  export function syncServiceSettingToPlatform(
211
24
  runtime: CliServiceRuntime,
212
25
  change: ServiceSettingsSyncChange,
213
- options: ServiceSettingsSyncOptions = {},
26
+ _options: ServiceSettingsSyncOptions = {},
214
27
  ): ServiceSettingsSyncResult {
215
28
  if (!String(change.key).startsWith('service.')) return { handled: false };
216
- if (change.previousValue === change.value) return { handled: true, message: 'Service setting unchanged' };
217
-
218
- const manager = options.createManager?.(runtime) ?? createPlatformServiceManager(runtime);
219
-
220
- try {
221
- if (change.key === 'service.autostart') {
222
- if (change.value === true) {
223
- if (runtime.configManager.get('service.enabled') !== true) {
224
- runtime.configManager.setDynamic('service.enabled', true);
225
- }
226
- return installAndStartSystemService(runtime, manager, options);
227
- }
228
- return disableSystemService(runtime, manager, options);
229
- }
230
-
231
- if (change.key === 'service.enabled') {
232
- if (change.value === false) {
233
- if (runtime.configManager.get('service.autostart') === true) {
234
- runtime.configManager.setDynamic('service.autostart', false);
235
- }
236
- return disableSystemService(runtime, manager, options);
237
- }
238
- if (runtime.configManager.get('service.autostart') === true) {
239
- return installAndStartSystemService(runtime, manager, options);
240
- }
241
- return {
242
- handled: true,
243
- action: 'status',
244
- status: manager.status(),
245
- message: 'Service mode saved; enable autostart to install the OS service',
246
- };
247
- }
248
-
249
- if (SERVICE_DEFINITION_KEYS.has(change.key)) {
250
- if (runtime.configManager.get('service.enabled') === true && runtime.configManager.get('service.autostart') === true) {
251
- return refreshInstalledSystemService(runtime, manager, options);
252
- }
253
- return {
254
- handled: true,
255
- action: 'status',
256
- status: manager.status(),
257
- message: 'Service setting saved; enable autostart to install the OS service',
258
- };
259
- }
260
- } catch (error) {
261
- const summarized = summarizeError(error);
262
- logger.error('Settings service sync failed', { key: change.key, error: summarized });
29
+ if (change.previousValue === change.value) {
263
30
  return {
264
31
  handled: true,
265
- action: 'status',
266
- status: manager.status(),
267
- message: `Service sync failed: ${summarized}`,
268
- error: summarized,
32
+ action: 'unchanged',
33
+ message: 'External daemon service setting unchanged',
269
34
  };
270
35
  }
271
36
 
272
- return { handled: false };
37
+ runtime.configManager.setDynamic(change.key, change.previousValue);
38
+ return {
39
+ handled: true,
40
+ action: 'external-daemon-blocked',
41
+ message: AGENT_EXTERNAL_DAEMON_SERVICE_MESSAGE,
42
+ error: 'daemon_lifecycle_external',
43
+ };
273
44
  }
@@ -10,7 +10,7 @@ export function wrapBlockedContextToolForAgentPolicy(tool: Tool): void {
10
10
  tool.definition.description = [
11
11
  'Blocked in GoodVibes Agent main conversation: copied runtime context.',
12
12
  'Use explicit Agent CLI/slash status, compat, setup, and Agent Knowledge commands for product-scoped context.',
13
- 'Default Knowledge/Wiki, HomeGraph, and copied TUI runtime assumptions are not Agent fallbacks.',
13
+ 'Default Knowledge/Wiki, non-Agent knowledge segments, and copied TUI runtime assumptions are not Agent fallbacks.',
14
14
  ].join(' ');
15
15
  tool.definition.sideEffects = [];
16
16
  tool.definition.parameters = {
@@ -106,7 +106,7 @@ const READ_ONLY_TEAM_TOOL_MODES = ['list', 'show'] as const;
106
106
  const READ_ONLY_WORKLIST_TOOL_MODES = ['list', 'show'] as const;
107
107
  const READ_ONLY_PACKET_TOOL_MODES = ['list', 'show'] as const;
108
108
  const READ_ONLY_QUERY_TOOL_MODES = ['list', 'show'] as const;
109
- const READ_ONLY_CONTROL_TOOL_MODES = ['commands', 'panels', 'subscriptions', 'sandbox-presets'] as const;
109
+ const READ_ONLY_CONTROL_TOOL_MODES = ['commands', 'panels', 'subscriptions'] as const;
110
110
  const READ_ONLY_REMOTE_TOOL_MODE_SET = new Set<string>(READ_ONLY_REMOTE_TOOL_MODES);
111
111
  const READ_ONLY_CHANNEL_TOOL_MODE_SET = new Set<string>(READ_ONLY_CHANNEL_TOOL_MODES);
112
112
  const READ_ONLY_MCP_TOOL_MODE_SET = new Set<string>(READ_ONLY_MCP_TOOL_MODES);
@@ -130,7 +130,7 @@ const LOCAL_AGENT_DENIAL = [
130
130
  ].join(' ');
131
131
 
132
132
  const LOCAL_CODING_TOOL_DENIAL = [
133
- 'GoodVibes Agent does not perform direct local file mutation, local WRFC workflow execution, or local sandbox/REPL execution from the main conversation.',
133
+ 'GoodVibes Agent does not perform direct local file mutation, local WRFC workflow execution, or local runtime-isolation execution from the main conversation.',
134
134
  'For explicit build/fix/review/code execution work, delegate one request to GoodVibes TUI through the public shared-session/build-delegation contract with the full original user ask.',
135
135
  'For durable Agent memory, skills, personas, routines, and knowledge, use the Agent-owned commands and isolated Agent Knowledge routes.',
136
136
  ].join(' ');
@@ -250,7 +250,7 @@ export function installAgentToolPolicyGuard(registry: ToolRegistry, options: Age
250
250
  modeSet: READ_ONLY_CONTROL_TOOL_MODE_SET,
251
251
  description: [
252
252
  'Read-only product-control inspection for GoodVibes Agent.',
253
- 'Command, panel, subscription, and sandbox preset catalogs can be inspected, but product-control mutation and daemon lifecycle are external.',
253
+ 'Command, panel, and subscription catalogs can be inspected, but product-control mutation and daemon lifecycle are external.',
254
254
  ].join(' '),
255
255
  denial: CONTROL_MUTATION_DENIAL,
256
256
  });
@@ -4,6 +4,12 @@ import { spawn } from 'node:child_process';
4
4
  import { buildVerificationLedger } from './verification-ledger.ts';
5
5
  import { SDK_VERSION } from '../version.ts';
6
6
 
7
+ const AGENT_KNOWLEDGE_FORBIDDEN_RESPONSE_MARKERS = [
8
+ ['home', ' assistant'].join(''),
9
+ ['home', 'graph'].join(''),
10
+ ['home ', 'graph'].join(''),
11
+ ] as const;
12
+
7
13
  export type LiveVerificationStatus = 'pass' | 'warn' | 'fail' | 'skip';
8
14
 
9
15
  export interface LiveVerificationCheck {
@@ -284,7 +290,7 @@ export function buildAgentKnowledgeLiveSkipCheck(
284
290
  summary: `Skipped because external daemon SDK ${daemonVersion} does not match Agent SDK pin ${expectedSdkVersion}.`,
285
291
  detail: [
286
292
  'Agent Knowledge is intentionally isolated under /api/goodvibes-agent/knowledge/*.',
287
- 'An older daemon cannot validate those routes, and Agent must not fall back to default Knowledge/Wiki or HomeGraph.',
293
+ 'An older daemon cannot validate those routes, and Agent must not fall back to default Knowledge/Wiki or non-Agent knowledge segments.',
288
294
  'Update/restart the external daemon, then rerun live verification.',
289
295
  ].join('\n'),
290
296
  };
@@ -495,8 +501,8 @@ export async function buildLiveVerificationReport(options: LiveVerificationOptio
495
501
  return { status: 'fail', summary: 'Agent Knowledge ask was not parseable JSON.' };
496
502
  }
497
503
  const lower = body.toLowerCase();
498
- if (lower.includes('home assistant') || lower.includes('homegraph') || lower.includes('home graph')) {
499
- return { status: 'fail', summary: 'Agent Knowledge ask returned HomeGraph/Home Assistant contamination.' };
504
+ if (AGENT_KNOWLEDGE_FORBIDDEN_RESPONSE_MARKERS.some((marker) => lower.includes(marker))) {
505
+ return { status: 'fail', summary: 'Agent Knowledge ask returned non-Agent knowledge contamination.' };
500
506
  }
501
507
  return { status: 'pass', summary: 'Agent Knowledge ask stayed on the isolated Agent route.' };
502
508
  },
@@ -519,8 +525,8 @@ export async function buildLiveVerificationReport(options: LiveVerificationOptio
519
525
  return { status: 'fail', summary: 'Agent Knowledge search was not parseable JSON.' };
520
526
  }
521
527
  const lower = body.toLowerCase();
522
- if (lower.includes('home assistant') || lower.includes('homegraph') || lower.includes('home graph')) {
523
- return { status: 'fail', summary: 'Agent Knowledge search returned HomeGraph/Home Assistant contamination.' };
528
+ if (AGENT_KNOWLEDGE_FORBIDDEN_RESPONSE_MARKERS.some((marker) => lower.includes(marker))) {
529
+ return { status: 'fail', summary: 'Agent Knowledge search returned non-Agent knowledge contamination.' };
524
530
  }
525
531
  return { status: 'pass', summary: 'Agent Knowledge search stayed on the isolated Agent route.' };
526
532
  },
@@ -30,7 +30,6 @@ export interface VerificationLedger {
30
30
  const EXTERNAL_SLASH_COMMANDS = new Set([
31
31
  'auth',
32
32
  'bridge',
33
- 'cloudflare',
34
33
  'health',
35
34
  'listener',
36
35
  'login',
@@ -71,14 +70,12 @@ const ONBOARDING_CAPABILITIES = [
71
70
  'network-access',
72
71
  'webhook-events',
73
72
  'external-integrations',
74
- 'cloudflare-batch',
75
73
  ] as const;
76
74
 
77
75
  const EXTERNAL_SURFACES = [
78
76
  'bluebubbles',
79
77
  'discord',
80
78
  'googleChat',
81
- 'homeassistant',
82
79
  'imessage',
83
80
  'matrix',
84
81
  'mattermost',
@@ -185,9 +182,9 @@ export function buildVerificationLedger(root: string): VerificationLedger {
185
182
  area: 'Onboarding capability bundles',
186
183
  total: ONBOARDING_CAPABILITIES.length,
187
184
  localSignalVerified: ONBOARDING_CAPABILITIES.length,
188
- localBehaviorVerified: 5,
189
- externalOutcomeRequired: 1,
190
- notes: 'Wizard state derivation/apply can be local; Cloudflare provisioning remains external.',
185
+ localBehaviorVerified: ONBOARDING_CAPABILITIES.length,
186
+ externalOutcomeRequired: 0,
187
+ notes: 'Wizard state derivation/apply is local; daemon-backed outcomes stay external to Agent ownership.',
191
188
  },
192
189
  ];
193
190
 
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.56';
9
+ let _version = '0.1.58';
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 {
@@ -1,73 +0,0 @@
1
- import type { CommandRegistry, SlashCommand } from '../command-registry.ts';
2
-
3
- type ExternalizedCommandId = 'git' | 'diff' | 'worktree' | 'sandbox';
4
-
5
- interface ExternalizedCommandSpec {
6
- readonly name: ExternalizedCommandId;
7
- readonly aliases?: readonly string[];
8
- readonly description: string;
9
- readonly usage: string;
10
- readonly owner: string;
11
- readonly reason: string;
12
- }
13
-
14
- const EXTERNALIZED_TUI_COMMANDS: readonly ExternalizedCommandSpec[] = [
15
- {
16
- name: 'git',
17
- aliases: ['g'],
18
- description: 'Externalized: git workflows are owned by GoodVibes TUI',
19
- usage: '[status|log|diff]',
20
- owner: 'GoodVibes TUI',
21
- reason: 'Git status, commits, and repository mutation belong to the coding TUI, not the serial Agent surface.',
22
- },
23
- {
24
- name: 'diff',
25
- aliases: ['d'],
26
- description: 'Externalized: code diff review is owned by GoodVibes TUI',
27
- usage: '[session|head|working|staged|<git-ref>]',
28
- owner: 'GoodVibes TUI',
29
- reason: 'Diff views are part of delegated build/fix/review work and should stay attached to the coding TUI execution context.',
30
- },
31
- {
32
- name: 'worktree',
33
- aliases: ['worktrees'],
34
- description: 'Externalized: git worktree lifecycle is owned by GoodVibes TUI',
35
- usage: '[review|inspect|attach|recover|cleanup]',
36
- owner: 'GoodVibes TUI',
37
- reason: 'Worktree creation, attachment, recovery, and cleanup are coding-session lifecycle operations.',
38
- },
39
- {
40
- name: 'sandbox',
41
- description: 'Externalized: sandbox and QEMU workflows are owned by GoodVibes TUI',
42
- usage: '[review|probe|session|qemu|bundle|preset]',
43
- owner: 'GoodVibes TUI',
44
- reason: 'Sandbox/QEMU setup and session execution are terminal-native coding/runtime isolation workflows.',
45
- },
46
- ];
47
-
48
- function makeExternalizedCommand(spec: ExternalizedCommandSpec): SlashCommand {
49
- return {
50
- name: spec.name,
51
- aliases: spec.aliases ? [...spec.aliases] : undefined,
52
- description: spec.description,
53
- usage: spec.usage,
54
- argsHint: spec.usage,
55
- handler(_args, ctx) {
56
- ctx.print([
57
- `${spec.name} is externalized in GoodVibes Agent.`,
58
- ` owner: ${spec.owner}`,
59
- ` reason: ${spec.reason}`,
60
- ' Agent policy: no local coding TUI, git/worktree, or sandbox execution from this surface.',
61
- ' build/fix/review: ask Agent to delegate the full request to GoodVibes TUI, or run goodvibes-tui in the target workspace.',
62
- ' result: blocked here; no local files, config, worktrees, sandbox sessions, or repository state were changed.',
63
- ].join('\n'));
64
- },
65
- };
66
- }
67
-
68
- export function registerAgentExternalizedTuiCommands(registry: CommandRegistry): void {
69
- for (const spec of EXTERNALIZED_TUI_COMMANDS) {
70
- registry.register(makeExternalizedCommand(spec));
71
- }
72
- }
73
-