@pellux/goodvibes-agent 0.1.56 → 0.1.57

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 (93) hide show
  1. package/.goodvibes/GOODVIBES.md +1 -1
  2. package/CHANGELOG.md +14 -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/config/secret-config.ts +0 -2
  20. package/src/input/agent-workspace-categories.ts +219 -0
  21. package/src/input/agent-workspace-editors.ts +143 -0
  22. package/src/input/agent-workspace-snapshot.ts +265 -0
  23. package/src/input/agent-workspace-types.ts +142 -0
  24. package/src/input/agent-workspace.ts +22 -766
  25. package/src/input/commands/agent-runtime-profile-runtime.ts +1 -1
  26. package/src/input/commands/delegation-runtime.ts +1 -1
  27. package/src/input/commands/experience-runtime.ts +3 -4
  28. package/src/input/commands/guidance-runtime.ts +1 -2
  29. package/src/input/commands/health-runtime.ts +3 -65
  30. package/src/input/commands/knowledge.ts +7 -7
  31. package/src/input/commands/local-setup-review.ts +0 -61
  32. package/src/input/commands/local-setup-transfer.ts +0 -3
  33. package/src/input/commands/local-setup.ts +2 -15
  34. package/src/input/commands/planning-runtime.ts +4 -1
  35. package/src/input/commands/platform-access-runtime.ts +1 -10
  36. package/src/input/commands/platform-services-runtime.ts +0 -1
  37. package/src/input/commands/recall-query.ts +1 -1
  38. package/src/input/commands/routines-runtime.ts +10 -6
  39. package/src/input/commands/schedule-runtime.ts +10 -6
  40. package/src/input/commands/session-workflow.ts +1 -1
  41. package/src/input/commands/tasks-runtime.ts +1 -14
  42. package/src/input/commands.ts +0 -4
  43. package/src/input/handler-onboarding.ts +10 -120
  44. package/src/input/onboarding/onboarding-wizard-apply.ts +5 -196
  45. package/src/input/onboarding/onboarding-wizard-constants.ts +8 -119
  46. package/src/input/onboarding/onboarding-wizard-helpers.ts +2 -53
  47. package/src/input/onboarding/onboarding-wizard-rules.ts +2 -236
  48. package/src/input/onboarding/onboarding-wizard-state.ts +1 -69
  49. package/src/input/onboarding/onboarding-wizard-steps.ts +584 -737
  50. package/src/input/onboarding/onboarding-wizard-types.ts +8 -26
  51. package/src/input/onboarding/onboarding-wizard.ts +4 -109
  52. package/src/input/settings-modal-agent-policy.ts +10 -0
  53. package/src/input/settings-modal-types.ts +2 -4
  54. package/src/input/settings-modal.ts +3 -1
  55. package/src/input/submission-router.ts +0 -1
  56. package/src/panels/approval-panel.ts +1 -2
  57. package/src/panels/builtin/operations.ts +1 -2
  58. package/src/panels/knowledge-panel.ts +2 -2
  59. package/src/panels/project-planning-panel.ts +4 -1
  60. package/src/panels/provider-health-domains.ts +0 -22
  61. package/src/panels/provider-health-panel.ts +1 -5
  62. package/src/panels/session-browser-panel.ts +0 -5
  63. package/src/panels/tasks-panel.ts +2 -64
  64. package/src/renderer/agent-workspace.ts +1 -1
  65. package/src/renderer/help-overlay.ts +1 -2
  66. package/src/renderer/semantic-diff.ts +1 -1
  67. package/src/renderer/settings-modal-helpers.ts +0 -16
  68. package/src/renderer/settings-modal.ts +3 -5
  69. package/src/runtime/bootstrap-hook-bridge.ts +0 -3
  70. package/src/runtime/bootstrap-shell.ts +2 -1
  71. package/src/runtime/bootstrap.ts +1 -1
  72. package/src/runtime/index.ts +0 -1
  73. package/src/runtime/onboarding/derivation.ts +1 -28
  74. package/src/runtime/onboarding/snapshot.ts +0 -1
  75. package/src/runtime/onboarding/types.ts +1 -4
  76. package/src/runtime/services.ts +4 -23
  77. package/src/runtime/ui-read-models.ts +4 -3
  78. package/src/shell/service-settings-sync.ts +15 -244
  79. package/src/tools/agent-context-policy.ts +1 -1
  80. package/src/tools/wrfc-agent-guard.ts +3 -3
  81. package/src/verification/live-verifier.ts +11 -5
  82. package/src/verification/verification-ledger.ts +3 -6
  83. package/src/version.ts +1 -1
  84. package/src/input/commands/agent-externalized-tui.ts +0 -73
  85. package/src/input/commands/cloudflare-runtime.ts +0 -385
  86. package/src/input/handler-onboarding-cloudflare.ts +0 -322
  87. package/src/input/onboarding/onboarding-runtime-status.ts +0 -87
  88. package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +0 -494
  89. package/src/input/onboarding/onboarding-wizard-cloudflare.ts +0 -199
  90. package/src/input/onboarding/onboarding-wizard-external-surface-extra-specs.ts +0 -130
  91. package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +0 -762
  92. package/src/runtime/cloudflare-control-plane.ts +0 -350
  93. package/src/runtime/sandbox-public-gaps.ts +0 -358
@@ -83,7 +83,7 @@ function renderGuide(homeDirectory: string): string {
83
83
  '5. Create a runtime profile from the imported starter:',
84
84
  ' /agent-profile create <name> --template <imported-id> --yes',
85
85
  '',
86
- 'This writes only Agent-local starter/profile state. It does not mutate the daemon, default wiki, or HomeGraph.',
86
+ 'This writes only Agent-local starter/profile state. It does not mutate the daemon, default wiki, or non-Agent knowledge segments.',
87
87
  ].join('\n');
88
88
  }
89
89
 
@@ -29,7 +29,7 @@ function buildDelegationBody(task: string, wrfcRequested: boolean): string {
29
29
  'Agent policy:',
30
30
  '- GoodVibes Agent is not the coding TUI.',
31
31
  '- Preserve the full original ask.',
32
- '- GoodVibes TUI owns file edits, git/worktree flows, sandbox/QEMU UX, and any WRFC owner chain.',
32
+ '- GoodVibes TUI owns file edits, git/worktree flows, runtime-isolation UX, and any WRFC owner chain.',
33
33
  wrfcRequested
34
34
  ? '- WRFC was explicitly requested by the Agent user for this build/fix/review delegation.'
35
35
  : '- WRFC was not explicitly requested; do not turn this into WRFC solely because it came from Agent.',
@@ -200,7 +200,6 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
200
200
  ['remote', 'Remote dispatch approval with trust/artifact review.'],
201
201
  ['hook', 'Hook execution approval with deny/mutate authority review.'],
202
202
  ['plugin', 'Plugin lifecycle approval with provenance and capability review.'],
203
- ['sandbox', 'Sandbox isolation/policy change approval with WSL/VM review.'],
204
203
  ] as const;
205
204
  if (sub === 'matrix') {
206
205
  ctx.print([
@@ -213,13 +212,13 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
213
212
  const kind = (args[1] ?? '').toLowerCase();
214
213
  const entry = matrix.find(([id]) => id === kind);
215
214
  if (!entry) {
216
- ctx.print('Usage: /approval review <shell|file|network|delegate|mcp|remote|hook|plugin|sandbox>');
215
+ ctx.print('Usage: /approval review <shell|file|network|delegate|mcp|remote|hook|plugin>');
217
216
  return;
218
217
  }
219
218
  ctx.print([
220
219
  `Approval Review: ${entry[0]}`,
221
220
  ` ${entry[1]}`,
222
- ' Related surfaces: /security, /policy preflight, /trust, /sandbox, /mcp',
221
+ ' Related surfaces: /security, /policy preflight, /trust, /mcp',
223
222
  ].join('\n'));
224
223
  return;
225
224
  }
@@ -298,7 +297,7 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
298
297
  enabled: Boolean(ctx.platform.configManager.get('ui.voiceEnabled')),
299
298
  notes: [
300
299
  'Voice is optional and local-first.',
301
- 'Secure sandbox mode and operator review remain the primary control surfaces.',
300
+ 'Operator review remains the primary control surface for risky actions.',
302
301
  ],
303
302
  };
304
303
  mkdirSync(dirname(targetPath), { recursive: true });
@@ -25,8 +25,7 @@ export function registerGuidanceRuntimeCommands(registry: CommandRegistry): void
25
25
  'Welcome To GoodVibes',
26
26
  ' /onboarding - open the onboarding wizard with current settings preloaded',
27
27
  ' /setup onboarding - open the same onboarding wizard from setup workflows',
28
- ' /health review - unified startup, service, and sandbox posture',
29
- ' /sandbox - explain that sandbox/QEMU workflows are delegated to GoodVibes TUI',
28
+ ' /health review - unified startup, service, provider, and operator posture',
30
29
  ' /marketplace open - browse curated plugins, skills, hook packs, and policy packs',
31
30
  ' /remote setup - review bridge, tunnel, env, and bootstrap flows',
32
31
  ' /security - review trust posture, policy pressure, and incidents',
@@ -1,12 +1,10 @@
1
1
  import { ServiceRegistry } from '@pellux/goodvibes-sdk/platform/config';
2
- import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
3
2
  import { evaluateSessionMaintenance, formatSessionMaintenanceLines } from '@/runtime/index.ts';
4
3
  import { estimateConversationTokens } from '@pellux/goodvibes-sdk/platform/core';
5
4
  import type { CommandRegistry } from '../command-registry.ts';
6
5
  import { buildSetupReviewSnapshot } from './local-setup-review.ts';
7
6
  import { buildProviderAccountSnapshot } from '@/runtime/index.ts';
8
7
  import { getSettingsControlPlaneSnapshot } from '@/runtime/index.ts';
9
- import { listPersistedWorktreeMeta, summarizeWorktreeOwnership } from '@/runtime/index.ts';
10
8
  import { checkRecoveryFile, readLastSessionPointer } from '@/runtime/index.ts';
11
9
  import {
12
10
  openCommandPanel,
@@ -20,26 +18,12 @@ import {
20
18
  requireSessionMemoryStore,
21
19
  } from './runtime-services.ts';
22
20
 
23
- function renderSandboxHealthSummary(configManager: ConfigManager): string[] {
24
- const backend = String(configManager.get('sandbox.vmBackend') ?? 'local');
25
- const imagePath = String(configManager.get('sandbox.qemuImagePath') ?? '').trim();
26
- const wrapperPath = String(configManager.get('sandbox.qemuExecWrapper') ?? '').trim();
27
- const lines = [
28
- ` backend: ${backend}`,
29
- ` qemu image: ${imagePath || '(not configured)'}`,
30
- ` qemu wrapper: ${wrapperPath || '(not configured)'}`,
31
- ];
32
- if (backend === 'qemu' && !imagePath) lines.push(' issue: qemu backend selected without qemuImagePath');
33
- if (backend === 'qemu' && !wrapperPath) lines.push(' issue: qemu backend selected without qemuExecWrapper');
34
- return lines;
35
- }
36
-
37
21
  export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
38
22
  registry.register({
39
23
  name: 'health',
40
24
  aliases: ['doctor'],
41
- description: 'Health workspace for startup posture, service readiness, sandbox posture, and provider health',
42
- usage: '[open|review|setup|services|sandbox|provider|accounts|auth|settings|intelligence|remote|mcp|continuity|worktrees|maintenance|repair [domain]]',
25
+ description: 'Health workspace for startup posture, service readiness, provider health, and Agent continuity',
26
+ usage: '[open|review|setup|services|provider|accounts|auth|settings|intelligence|remote|mcp|continuity|maintenance|repair [domain]]',
43
27
  async handler(args, ctx) {
44
28
  const sub = (args[0] ?? 'review').toLowerCase();
45
29
  const readModels = requireReadModels(ctx);
@@ -72,14 +56,6 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
72
56
  return;
73
57
  }
74
58
 
75
- if (sub === 'sandbox') {
76
- ctx.print([
77
- 'Health Review: Sandbox',
78
- ...renderSandboxHealthSummary(ctx.platform.configManager),
79
- ].join('\n'));
80
- return;
81
- }
82
-
83
59
  if (sub === 'accounts') {
84
60
  const operatorClient = requireOperatorClient(ctx);
85
61
  const accounts = await operatorClient.providers.accountSnapshot();
@@ -259,29 +235,6 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
259
235
  return;
260
236
  }
261
237
 
262
- if (sub === 'worktrees') {
263
- const summary = readModels.worktrees.getSnapshot().summary;
264
- const issues: string[] = [];
265
- if (summary.discard > 0) issues.push(`${summary.discard} worktree(s) marked discard still tracked`);
266
- if (summary.pendingCleanup > 0) issues.push(`${summary.pendingCleanup} worktree(s) awaiting cleanup`);
267
- if ('kept' in summary && typeof (summary as { kept?: number }).kept === 'number' && (summary as { kept?: number }).kept! > 0) {
268
- // read-model summary may include kept in some implementations; ignored in rendering below if absent
269
- }
270
- if (summary.paused > 0) issues.push(`${summary.paused} paused worktree(s) may need resume or merge review`);
271
- ctx.print([
272
- 'Health Review: Worktrees',
273
- ` total: ${summary.total}`,
274
- ` active: ${summary.active}`,
275
- ` paused: ${summary.paused}`,
276
- ` discard: ${summary.discard}`,
277
- ` cleanup pending: ${summary.pendingCleanup}`,
278
- ...(issues.length > 0 ? issues.map((issue) => ` issue: ${issue}`) : [' no active worktree lifecycle issues detected']),
279
- ' next: worktree recovery is externalized to GoodVibes TUI.',
280
- ' next: use /delegate <task> only when the recovery is part of explicit build/fix/review work.',
281
- ].join('\n'));
282
- return;
283
- }
284
-
285
238
  if (sub === 'repair') {
286
239
  const domain = (args[1] ?? 'review').toLowerCase();
287
240
  const lines = ['Health Repair'];
@@ -316,12 +269,6 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
316
269
  lines.push(' /services auth-review');
317
270
  lines.push(' /health services');
318
271
  lines.push(' verify: /health services');
319
- } else if (domain === 'sandbox') {
320
- lines.push(' domain: sandbox');
321
- lines.push(' /sandbox');
322
- lines.push(' delegate sandbox/QEMU setup and execution to GoodVibes TUI');
323
- lines.push(' /health sandbox');
324
- lines.push(' verify: /health sandbox');
325
272
  } else if (domain === 'remote') {
326
273
  lines.push(' domain: remote');
327
274
  lines.push(' /remote supervisor');
@@ -347,11 +294,6 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
347
294
  lines.push(' /compact');
348
295
  lines.push(' /panel tokens');
349
296
  lines.push(' verify: /health maintenance');
350
- } else if (domain === 'worktrees') {
351
- lines.push(' domain: worktrees');
352
- lines.push(' worktree recovery is externalized to GoodVibes TUI');
353
- lines.push(' /delegate <task> when explicit build/fix/review work needs repository recovery');
354
- lines.push(' verify: /health worktrees');
355
297
  } else if (domain === 'intelligence') {
356
298
  lines.push(' domain: intelligence');
357
299
  lines.push(' /intelligence review');
@@ -360,7 +302,7 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
360
302
  lines.push(' /setup review');
361
303
  lines.push(' verify: /health intelligence');
362
304
  } else {
363
- lines.push(' domains: settings, auth, accounts, services, sandbox, remote, mcp, continuity, maintenance, worktrees, intelligence');
305
+ lines.push(' domains: settings, auth, accounts, services, remote, mcp, continuity, maintenance, intelligence');
364
306
  lines.push(' use: /health repair <domain>');
365
307
  }
366
308
  ctx.print(lines.join('\n'));
@@ -409,8 +351,6 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
409
351
  ` managed locks: ${settingsSnapshot.managedLockCount}`,
410
352
  ` local auth users: ${readModels.localAuth.getSnapshot().userCount}`,
411
353
  ` remote runners: ${snapshot.remoteRunnerCount}`,
412
- ...renderSandboxHealthSummary(ctx.platform.configManager),
413
- '',
414
354
  ...formatSessionMaintenanceLines(maintenance, 'guided').map((line) => ` ${line}`),
415
355
  ...(snapshot.issues.length > 0 ? ['', ...snapshot.issues.map((issue) => ` [${issue.severity.toUpperCase()}] ${issue.area}: ${issue.message}`)] : []),
416
356
  ...(snapshot.serviceIssues.length > 0 ? ['', ...snapshot.serviceIssues.map((issue) => ` service: ${issue}`)] : []),
@@ -418,14 +358,12 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
418
358
  'Next steps:',
419
359
  ' /health open',
420
360
  ' /health services',
421
- ' /health sandbox',
422
361
  ' /health accounts',
423
362
  ' /health auth',
424
363
  ' /health settings',
425
364
  ' /health intelligence',
426
365
  ' /health remote',
427
366
  ' /health maintenance',
428
- ' /health worktrees',
429
367
  ' /health repair <domain>',
430
368
  ' /setup onboarding',
431
369
  ].join('\n'));
@@ -12,7 +12,7 @@ type KnowledgeAskMode = NonNullable<KnowledgeAskInput['mode']>;
12
12
  function requireAgentKnowledgeApi(context: CommandContext) {
13
13
  const knowledgeApi = context.clients?.agentKnowledgeApi;
14
14
  if (!knowledgeApi) {
15
- context.print('[knowledge] Agent Knowledge API is not available in this runtime. Refusing to use default Knowledge/Wiki or HomeGraph fallback.');
15
+ context.print('[knowledge] Agent Knowledge API is not available in this runtime. Refusing to use default Knowledge/Wiki or non-Agent knowledge fallback.');
16
16
  return null;
17
17
  }
18
18
  return knowledgeApi;
@@ -28,11 +28,11 @@ function findDisallowedKnowledgeScopeFlag(args: readonly string[]): string | nul
28
28
  '--space',
29
29
  '--knowledge-space',
30
30
  '--knowledge-space-id',
31
- '--knowledgeSpaceId',
31
+ ['--knowledge', 'SpaceId'].join(''),
32
32
  '--include-all-spaces',
33
- '--includeAllSpaces',
34
- '--homegraph',
35
- '--home-graph',
33
+ ['--include', 'AllSpaces'].join(''),
34
+ ['--home', 'graph'].join(''),
35
+ ['--home', '-graph'].join(''),
36
36
  ];
37
37
  for (const token of args) {
38
38
  for (const flag of disallowed) {
@@ -45,7 +45,7 @@ function findDisallowedKnowledgeScopeFlag(args: readonly string[]): string | nul
45
45
  function printScopeFlagRejection(context: CommandContext, flag: string): void {
46
46
  context.print([
47
47
  `[knowledge] Agent Knowledge is isolated; ${flag} is not accepted.`,
48
- '[knowledge] GoodVibes Agent must not use default Knowledge/Wiki, HomeGraph, or Home Assistant spaces.',
48
+ '[knowledge] GoodVibes Agent must not use default Knowledge/Wiki or non-Agent product spaces.',
49
49
  '[knowledge] Use only /api/goodvibes-agent/knowledge/* Agent-owned routes.',
50
50
  ].join('\n'));
51
51
  }
@@ -89,7 +89,7 @@ function requireAgentKnowledgeAsk(context: CommandContext): ((input: KnowledgeAs
89
89
  const serviceAsk = context.extensions.agentKnowledgeService?.ask?.bind(context.extensions.agentKnowledgeService);
90
90
  if (serviceAsk) return serviceAsk;
91
91
 
92
- context.print('[knowledge] Agent Knowledge ask is not available in this runtime. Refusing to use default Knowledge/Wiki or HomeGraph fallback.');
92
+ context.print('[knowledge] Agent Knowledge ask is not available in this runtime. Refusing to use default Knowledge/Wiki or non-Agent knowledge fallback.');
93
93
  return null;
94
94
  }
95
95
 
@@ -2,7 +2,6 @@ import { dirname, join, resolve } from 'node:path';
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
3
  import type { CommandContext } from '../command-registry.ts';
4
4
  import { discoverSkills } from '../../panels/skills-panel.ts';
5
- import { buildSandboxReview, isRunningInWsl } from '@/runtime/index.ts';
6
5
  import { getPluginDirectories } from '../../plugins/loader';
7
6
  import { listBuiltinSubscriptionProviders } from '@pellux/goodvibes-sdk/platform/config';
8
7
  import type { SetupReviewSnapshot } from './local-setup-transfer.ts';
@@ -37,10 +36,6 @@ export async function buildSetupReviewSnapshot(ctx: CommandContext): Promise<Set
37
36
  const subscriptionManager = requireSubscriptionManager(ctx);
38
37
  const activeSubscriptionCount = subscriptionManager.list().length;
39
38
  const pendingSubscriptionCount = subscriptionManager.listPending().length;
40
- const sandboxReplIsolation = String(ctx.platform.configManager.get('sandbox.replIsolation'));
41
- const sandboxMcpIsolation = String(ctx.platform.configManager.get('sandbox.mcpIsolation'));
42
- const sandboxReview = buildSandboxReview(ctx.platform.configManager);
43
- const sandboxSecureModeReady = sandboxReview.host.secureSandboxReady;
44
39
  const quarantinedPluginCount = plugins.filter((plugin) => plugin.quarantined).length;
45
40
  const quarantinedMcpCount = mcpServers.filter((server) => server.schemaFreshness === 'quarantined').length;
46
41
  const elevatedMcpCount = mcpServers.filter((server) => server.trustMode === 'allow-all').length;
@@ -96,15 +91,6 @@ export async function buildSetupReviewSnapshot(ctx: CommandContext): Promise<Set
96
91
  area: 'remote',
97
92
  message: remoteRunnerCount > 0 ? `${remoteRunnerCount} remote runner contract(s)` : 'no remote runner contracts registered',
98
93
  },
99
- {
100
- severity: sandboxSecureModeReady || `${ctx.platform.configManager.get('sandbox.vmBackend')}` === 'local' ? 'pass' : 'warn',
101
- area: 'sandbox',
102
- message: `${ctx.platform.configManager.get('sandbox.vmBackend')}` === 'local'
103
- ? 'local mode (virtualization disabled by default)'
104
- : sandboxSecureModeReady
105
- ? `QEMU enabled: REPL=${sandboxReplIsolation}, MCP=${sandboxMcpIsolation}`
106
- : 'QEMU sandboxing requires running GoodVibes inside WSL on Windows',
107
- },
108
94
  ];
109
95
 
110
96
  return {
@@ -126,49 +112,11 @@ export async function buildSetupReviewSnapshot(ctx: CommandContext): Promise<Set
126
112
  quarantinedMcpCount,
127
113
  elevatedMcpCount,
128
114
  remoteRunnerCount,
129
- sandboxReplIsolation,
130
- sandboxMcpIsolation,
131
- sandboxSecureModeReady,
132
115
  issues,
133
116
  services,
134
117
  };
135
118
  }
136
119
 
137
- export function renderSetupSandboxReview(ctx: CommandContext, snapshot: SetupReviewSnapshot): string {
138
- const backend = `${ctx.platform.configManager.get('sandbox.vmBackend')}`;
139
- const image = String(ctx.platform.configManager.get('sandbox.qemuImagePath') ?? '').trim();
140
- const wrapper = String(ctx.platform.configManager.get('sandbox.qemuExecWrapper') ?? '').trim();
141
- const host = String(ctx.platform.configManager.get('sandbox.qemuGuestHost') ?? '').trim();
142
- const workspace = String(ctx.platform.configManager.get('sandbox.qemuWorkspacePath') ?? '').trim();
143
- const lines = [
144
- 'Setup Sandbox Review',
145
- ` backend: ${backend}`,
146
- ` repl isolation: ${snapshot.sandboxReplIsolation}`,
147
- ` mcp isolation: ${snapshot.sandboxMcpIsolation}`,
148
- ` secure mode ready: ${snapshot.sandboxSecureModeReady ? 'yes' : 'no'}`,
149
- ` qemu image: ${image || '(not configured)'}`,
150
- ` qemu wrapper: ${wrapper || '(not configured)'}`,
151
- ` guest host: ${host || '(not configured)'}`,
152
- ` guest workspace: ${workspace || '(not configured)'}`,
153
- '',
154
- ' next:',
155
- ];
156
- if (backend === 'local') {
157
- lines.push(' sandbox/QEMU setup is externalized to GoodVibes TUI');
158
- lines.push(' use GoodVibes TUI for coding/runtime isolation work');
159
- } else if (!image || !wrapper) {
160
- lines.push(' sandbox/QEMU setup is externalized to GoodVibes TUI');
161
- lines.push(' use GoodVibes TUI for coding/runtime isolation work');
162
- } else {
163
- lines.push(' sandbox sessions are blocked in Agent');
164
- lines.push(' delegate build/fix/review work to GoodVibes TUI');
165
- }
166
- if (process.platform === 'win32' && !isRunningInWsl()) {
167
- lines.push(' Run GoodVibes inside WSL before enabling QEMU sandboxing.');
168
- }
169
- return lines.join('\n');
170
- }
171
-
172
120
  export function exportSetupSupportBundle(
173
121
  targetDirArg: string,
174
122
  snapshot: SetupReviewSnapshot,
@@ -186,14 +134,5 @@ export function exportSetupSupportBundle(
186
134
  if (existsSync(hooksPath)) {
187
135
  writeFileSync(join(targetDir, 'hooks.managed.json'), readFileSync(hooksPath, 'utf-8'), 'utf-8');
188
136
  }
189
- writeFileSync(
190
- join(targetDir, 'sandbox-externalized.txt'),
191
- [
192
- 'GoodVibes Agent does not ship or manage QEMU sandbox wrappers.',
193
- 'Delegate build, fix, review, and runtime-isolation work to GoodVibes TUI.',
194
- '',
195
- ].join('\n'),
196
- 'utf-8',
197
- );
198
137
  return targetDir;
199
138
  }
@@ -25,9 +25,6 @@ export interface SetupReviewSnapshot {
25
25
  readonly quarantinedMcpCount: number;
26
26
  readonly elevatedMcpCount: number;
27
27
  readonly remoteRunnerCount: number;
28
- readonly sandboxReplIsolation: string;
29
- readonly sandboxMcpIsolation: string;
30
- readonly sandboxSecureModeReady: boolean;
31
28
  readonly issues: Array<{ severity: 'pass' | 'warn' | 'fail'; area: string; message: string }>;
32
29
  readonly services: string[];
33
30
  }
@@ -25,7 +25,7 @@ export function registerLocalSetupCommands(registry: CommandRegistry): void {
25
25
  name: 'setup',
26
26
  aliases: ['startup'],
27
27
  description: 'Launch the onboarding wizard and review Agent startup readiness',
28
- usage: '[review|doctor|services|hooks|remote|sandbox|onboarding|support-bundle <dir> --yes|export <path> --yes|transfer <export|inspect|import> <path> [--yes]|link <surface> [target]|open-link <uri>]',
28
+ usage: '[review|doctor|services|hooks|remote|onboarding|support-bundle <dir> --yes|export <path> --yes|transfer <export|inspect|import> <path> [--yes]|link <surface> [target]|open-link <uri>]',
29
29
  async handler(args, ctx) {
30
30
  const parsed = stripYesFlag(args);
31
31
  const commandArgs = [...parsed.rest];
@@ -58,7 +58,6 @@ export function registerLocalSetupCommands(registry: CommandRegistry): void {
58
58
  ` mcp quarantined: ${snapshot.quarantinedMcpCount}`,
59
59
  ` mcp elevated: ${snapshot.elevatedMcpCount}`,
60
60
  ` remote runners: ${snapshot.remoteRunnerCount}`,
61
- ' sandbox/QEMU: externalized to GoodVibes TUI for delegated build/runtime isolation',
62
61
  '',
63
62
  ` service ids: ${snapshot.services.join(', ') || '(none)'}`,
64
63
  ` plugin dirs: ${snapshot.pluginDirectories.join(', ') || '(none)'}`,
@@ -71,7 +70,6 @@ export function registerLocalSetupCommands(registry: CommandRegistry): void {
71
70
  ctx.print([
72
71
  'Startup Doctor',
73
72
  ...snapshot.issues.map((issue) => ` [${issue.severity.toUpperCase()}] ${issue.area}: ${issue.message}`),
74
- ' [INFO] sandbox: GoodVibes Agent does not own sandbox/QEMU setup; delegate build/runtime isolation to GoodVibes TUI.',
75
73
  ...(snapshot.serviceIssues.length > 0
76
74
  ? ['', ' Service issues:', ...snapshot.serviceIssues.map((issue) => ` - ${issue}`)]
77
75
  : []),
@@ -119,17 +117,6 @@ export function registerLocalSetupCommands(registry: CommandRegistry): void {
119
117
  return;
120
118
  }
121
119
 
122
- if (sub === 'sandbox') {
123
- ctx.print([
124
- 'Setup Sandbox',
125
- ' status: externalized',
126
- ' owner: GoodVibes TUI',
127
- ' reason: sandbox/QEMU setup and runtime isolation are coding/build execution surfaces.',
128
- ' result: no local Agent sandbox settings, files, or sessions were changed.',
129
- ].join('\n'));
130
- return;
131
- }
132
-
133
120
  if (sub === 'onboarding') {
134
121
  openOnboardingWizard(ctx, { mode: 'edit', reset: true });
135
122
  ctx.print('Opening onboarding wizard.');
@@ -295,7 +282,7 @@ export function registerLocalSetupCommands(registry: CommandRegistry): void {
295
282
  return;
296
283
  }
297
284
 
298
- ctx.print('Usage: /setup [review|doctor|services|hooks|remote|sandbox|onboarding|support-bundle <dir> --yes|export <path> --yes|transfer <export|inspect|import> <path> [--yes]|link <surface> [target]|open-link <uri>]');
285
+ ctx.print('Usage: /setup [review|doctor|services|hooks|remote|onboarding|support-bundle <dir> --yes|export <path> --yes|transfer <export|inspect|import> <path> [--yes]|link <surface> [target]|open-link <uri>]');
299
286
  },
300
287
  });
301
288
  }
@@ -89,11 +89,14 @@ export function registerPlanningRuntimeCommands(registry: CommandRegistry): void
89
89
  const { evaluation } = stateResult.state
90
90
  ? await persistEvaluatedNextQuestion(projectPlanningService, projectId, stateResult.state, initialEvaluation)
91
91
  : { evaluation: initialEvaluation };
92
+ const planningNamespace = String(
93
+ status[['knowledge', 'SpaceId'].join('') as keyof typeof status] ?? `project:${status.projectId}`,
94
+ );
92
95
  openProjectPlanningPanel();
93
96
  ctx.print(
94
97
  `Project planning: ${evaluation.readiness}\n` +
95
98
  `Project: ${status.projectId}\n` +
96
- `Planning namespace: ${status.knowledgeSpaceId}\n` +
99
+ `Planning namespace: ${planningNamespace}\n` +
97
100
  `Artifacts: ${status.counts.states} state, ${status.counts.decisions} decisions, ${status.counts.languageArtifacts} language\n` +
98
101
  formatNextQuestion(evaluation.nextQuestion),
99
102
  );
@@ -25,7 +25,6 @@ interface UpdateBundle {
25
25
  readonly appVersion: string;
26
26
  readonly updateChannel: 'stable' | 'preview';
27
27
  readonly subscriptionProviders: readonly string[];
28
- readonly sandboxProfile: string;
29
28
  readonly notes: readonly string[];
30
29
  }
31
30
 
@@ -61,7 +60,6 @@ function inspectUpdateBundle(bundle: UpdateBundle): string {
61
60
  ` appVersion: ${bundle.appVersion}`,
62
61
  ` updateChannel: ${bundle.updateChannel}`,
63
62
  ` subscriptionProviders: ${bundle.subscriptionProviders.length}`,
64
- ` sandboxProfile: ${bundle.sandboxProfile}`,
65
63
  ` notes: ${bundle.notes.length}`,
66
64
  ].join('\n');
67
65
  }
@@ -226,11 +224,6 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
226
224
  const serviceRegistry = requireServiceRegistry(ctx);
227
225
  const secretsManager = requireSecretsManager(ctx);
228
226
  const builtinProviders = listBuiltinSubscriptionProviders().map((entry) => entry.provider);
229
- const sandboxProfile = [
230
- `${ctx.platform.configManager.get('sandbox.replIsolation')}`,
231
- `${ctx.platform.configManager.get('sandbox.mcpIsolation')}`,
232
- `${ctx.platform.configManager.get('sandbox.vmBackend')}`,
233
- ].join('/');
234
227
  const activeSubscriptions = subscriptions.list().map((entry) => entry.provider);
235
228
  if (sub === 'review') {
236
229
  const channel = ctx.platform.configManager.get('release.channel');
@@ -240,7 +233,6 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
240
233
  ` channel: ${channel}`,
241
234
  ` built-in subscription providers: ${builtinProviders.length}${builtinProviders.length > 0 ? ` (${builtinProviders.join(', ')})` : ''}`,
242
235
  ` active subscriptions: ${activeSubscriptions.length}${activeSubscriptions.length > 0 ? ` (${activeSubscriptions.join(', ')})` : ''}`,
243
- ` sandbox profile: ${sandboxProfile}`,
244
236
  ' use /update channel <stable|preview> --yes to change release posture',
245
237
  ].join('\n'));
246
238
  return;
@@ -278,9 +270,8 @@ export function registerPlatformAccessRuntimeCommands(registry: CommandRegistry)
278
270
  appVersion: VERSION,
279
271
  updateChannel: ctx.platform.configManager.get('release.channel') as 'stable' | 'preview',
280
272
  subscriptionProviders: [...new Set([...builtinProviders, ...activeSubscriptions])],
281
- sandboxProfile,
282
273
  notes: [
283
- 'Preview channel is recommended only when operator review and sandbox isolation are enabled.',
274
+ 'Preview channel is recommended only when operator review is enabled.',
284
275
  'OAuth-backed provider subscriptions survive channel changes and continue to apply to supported provider surfaces.',
285
276
  ],
286
277
  };
@@ -220,7 +220,6 @@ export function registerPlatformServicesRuntimeCommands(registry: CommandRegistr
220
220
  buildSetupLink('remote'),
221
221
  buildSetupLink('knowledge'),
222
222
  buildSetupLink('marketplace'),
223
- buildSetupLink('sandbox'),
224
223
  ];
225
224
  if (sub === 'review') {
226
225
  ctx.print(['Deep Link Review', ...links.map((link) => ` ${link}`)].join('\n'));
@@ -8,7 +8,7 @@ export function getMemoryApi(context: CommandContext): MemoryApi | null {
8
8
  const memoryApi = context.clients?.agentKnowledgeApi?.memory;
9
9
  if (!memoryApi) {
10
10
  context.print('[recall] Agent Memory API is not available in this runtime.');
11
- context.print('[recall] Refusing to use default Knowledge/Wiki or HomeGraph fallback.');
11
+ context.print('[recall] Refusing to use default Knowledge/Wiki or non-Agent knowledge fallback.');
12
12
  return null;
13
13
  }
14
14
  return memoryApi;
@@ -1,18 +1,22 @@
1
1
  import { AgentRoutineRegistry, type AgentRoutineRecord } from '../../agent/routine-registry.ts';
2
2
  import {
3
3
  buildRoutineSchedulePreview,
4
+ promoteRoutineToDaemonSchedule,
5
+ resolveAgentDaemonConnection,
6
+ } from '../../agent/routine-schedule-promotion.ts';
7
+ import { parseRoutineSchedulePromotionArgs } from '../../agent/routine-schedule-args.ts';
8
+ import {
4
9
  formatRoutineScheduleCorrelation,
5
- formatRoutineScheduleReceipt,
6
- formatRoutineScheduleReceipts,
7
10
  formatRoutineScheduleFailure,
8
11
  formatRoutineSchedulePreview,
12
+ formatRoutineScheduleReceipt,
13
+ formatRoutineScheduleReceipts,
9
14
  formatRoutineScheduleSuccess,
10
- parseRoutineSchedulePromotionArgs,
11
- promoteRoutineToDaemonSchedule,
15
+ } from '../../agent/routine-schedule-format.ts';
16
+ import {
12
17
  reconcileRoutineScheduleReceipts,
13
- resolveAgentDaemonConnection,
14
18
  RoutineScheduleReceiptStore,
15
- } from '../../agent/routine-schedule-promotion.ts';
19
+ } from '../../agent/routine-schedule-receipts.ts';
16
20
  import type { CommandContext, CommandRegistry } from '../command-registry.ts';
17
21
  import { requireShellPaths } from './runtime-services.ts';
18
22
 
@@ -7,18 +7,22 @@ import type { AutomationScheduleDefinition } from '@pellux/goodvibes-sdk/platfor
7
7
  import { AgentRoutineRegistry } from '../../agent/routine-registry.ts';
8
8
  import {
9
9
  buildRoutineSchedulePreview,
10
+ promoteRoutineToDaemonSchedule,
11
+ resolveAgentDaemonConnection,
12
+ } from '../../agent/routine-schedule-promotion.ts';
13
+ import { parseRoutineSchedulePromotionArgs } from '../../agent/routine-schedule-args.ts';
14
+ import {
10
15
  formatRoutineScheduleCorrelation,
11
- formatRoutineScheduleReceipt,
12
- formatRoutineScheduleReceipts,
13
16
  formatRoutineScheduleFailure,
14
17
  formatRoutineSchedulePreview,
18
+ formatRoutineScheduleReceipt,
19
+ formatRoutineScheduleReceipts,
15
20
  formatRoutineScheduleSuccess,
16
- parseRoutineSchedulePromotionArgs,
17
- promoteRoutineToDaemonSchedule,
21
+ } from '../../agent/routine-schedule-format.ts';
22
+ import {
18
23
  reconcileRoutineScheduleReceipts,
19
- resolveAgentDaemonConnection,
20
24
  RoutineScheduleReceiptStore,
21
- } from '../../agent/routine-schedule-promotion.ts';
25
+ } from '../../agent/routine-schedule-receipts.ts';
22
26
  import type { CommandContext } from '../command-registry.ts';
23
27
  import { requireShellPaths } from './runtime-services.ts';
24
28
 
@@ -267,7 +267,7 @@ export async function handleSessionWorkflowCommand(args: string[], ctx: CommandC
267
267
  ctx.print(` Remote re-entry: /remote recover ${meta.returnContext.remoteRunners![0]}`);
268
268
  }
269
269
  if ((meta.returnContext.worktreePaths?.length ?? 0) > 0) {
270
- ctx.print(' Worktree re-entry: open GoodVibes TUI in the target workspace; Agent /worktree is externalized.');
270
+ ctx.print(' Worktree re-entry: open GoodVibes TUI in the target workspace; delegate explicit build/fix/review recovery from Agent.');
271
271
  }
272
272
  if (returnContextMode === 'assisted') {
273
273
  const helperModel = providerApi.createHelperModel(ctx.platform.configManager);
@@ -1,7 +1,6 @@
1
1
  import type { CommandRegistry } from '../command-registry.ts';
2
2
  import type { RuntimeTask, TaskLifecycleState } from '@/runtime/index.ts';
3
- import { reviewWorktreeAttachments } from '@/runtime/index.ts';
4
- import { requireOperatorClient, requirePanelManager, requireShellPaths } from './runtime-services.ts';
3
+ import { requireOperatorClient, requirePanelManager } from './runtime-services.ts';
5
4
 
6
5
  const BLOCKED_TASK_MUTATIONS: ReadonlySet<string> = new Set([
7
6
  'create',
@@ -108,18 +107,6 @@ export function registerTasksRuntimeCommands(registry: CommandRegistry): void {
108
107
  ` parent: ${task.parentTaskId ?? 'none'}`,
109
108
  ` children: ${task.childTaskIds.join(', ') || '(none)'}`,
110
109
  ` correlationId: ${task.correlationId ?? 'n/a'}`,
111
- ...(() => {
112
- const shellPaths = requireShellPaths(ctx);
113
- const worktrees = reviewWorktreeAttachments('task', task.id, {
114
- workingDirectory: shellPaths.workingDirectory,
115
- });
116
- return worktrees.total > 0
117
- ? [
118
- ` worktrees: ${worktrees.total} tracked (${worktrees.active} active / ${worktrees.paused} paused / ${worktrees.pendingCleanup} cleanup)`,
119
- ' worktree next: open GoodVibes TUI in the target workspace for recovery.',
120
- ]
121
- : [];
122
- })(),
123
110
  ` summary: ${summarizeTaskResult(task)}`,
124
111
  ].join('\n'));
125
112
  return;
@@ -49,11 +49,9 @@ import { registerConversationRuntimeCommands } from './commands/conversation-run
49
49
  import { registerQrcodeRuntimeCommands } from './commands/qrcode-runtime.ts';
50
50
  import { registerOnboardingRuntimeCommands } from './commands/onboarding-runtime.ts';
51
51
  import { registerTtsRuntimeCommands } from './commands/tts-runtime.ts';
52
- import { registerCloudflareRuntimeCommands } from './commands/cloudflare-runtime.ts';
53
52
  import { registerWorkPlanRuntimeCommands } from './commands/work-plan-runtime.ts';
54
53
  import { registerAgentWorkspaceRuntimeCommands } from './commands/agent-workspace-runtime.ts';
55
54
  import { registerAgentRuntimeProfileRuntimeCommands } from './commands/agent-runtime-profile-runtime.ts';
56
- import { registerAgentExternalizedTuiCommands } from './commands/agent-externalized-tui.ts';
57
55
  import { registerDelegationRuntimeCommands } from './commands/delegation-runtime.ts';
58
56
  import { registerPersonasRuntimeCommands } from './commands/personas-runtime.ts';
59
57
  import { registerAgentSkillsRuntimeCommands } from './commands/agent-skills-runtime.ts';
@@ -74,7 +72,6 @@ export function registerBuiltinCommands(registry: CommandRegistry): void {
74
72
  registerConfigCommand(registry);
75
73
  registerOperatorRuntimeCommands(registry);
76
74
  registerIntegrationRuntimeCommands(registry);
77
- registerAgentExternalizedTuiCommands(registry);
78
75
  registerNotifyRuntimeCommands(registry);
79
76
  registerReplayRuntimeCommands(registry);
80
77
  registerShareRuntimeCommands(registry);
@@ -109,7 +106,6 @@ export function registerBuiltinCommands(registry: CommandRegistry): void {
109
106
  registerQrcodeRuntimeCommands(registry);
110
107
  registerOnboardingRuntimeCommands(registry);
111
108
  registerTtsRuntimeCommands(registry);
112
- registerCloudflareRuntimeCommands(registry);
113
109
  registerWorkPlanRuntimeCommands(registry);
114
110
  registerLocalRuntimeCommands(registry);
115
111
  registerSessionWorkflowCommands(registry);