@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
@@ -2,8 +2,7 @@ import type { Line } from '../types/grid.ts';
2
2
  import { createEmptyLine } from '../types/grid.ts';
3
3
  import { ScrollableListPanel } from './scrollable-list-panel.ts';
4
4
  import type { RuntimeTask, TaskLifecycleState } from '@/runtime/index.ts';
5
- import type { ManagedWorktreeMeta } from '@/runtime/index.ts';
6
- import type { UiReadModel, UiTasksSnapshot, UiWorktreeSnapshot } from '../runtime/ui-read-models.ts';
5
+ import type { UiReadModel, UiTasksSnapshot } from '../runtime/ui-read-models.ts';
7
6
  import {
8
7
  buildDetailBlock,
9
8
  buildEmptyState,
@@ -112,56 +111,16 @@ function parseTaskDescriptor(description: string): TaskDescriptorMeta | null {
112
111
  }
113
112
  }
114
113
 
115
- interface TaskWorktreeAttachmentReview {
116
- readonly total: number;
117
- readonly active: number;
118
- readonly paused: number;
119
- readonly kept: number;
120
- readonly discard: number;
121
- readonly pendingCleanup: number;
122
- readonly records: readonly ManagedWorktreeMeta[];
123
- }
124
-
125
- function reviewTaskWorktreeAttachments(
126
- taskId: string,
127
- worktrees?: UiReadModel<UiWorktreeSnapshot>,
128
- ): TaskWorktreeAttachmentReview {
129
- const records = (worktrees?.getSnapshot().records ?? []).filter((record) => record.taskId === taskId);
130
- return records.reduce<TaskWorktreeAttachmentReview>((summary, record) => ({
131
- total: summary.total + 1,
132
- active: summary.active + (record.state === 'active' ? 1 : 0),
133
- paused: summary.paused + (record.state === 'paused' ? 1 : 0),
134
- kept: summary.kept + (record.state === 'kept' ? 1 : 0),
135
- discard: summary.discard + (record.state === 'discard' ? 1 : 0),
136
- pendingCleanup: summary.pendingCleanup + (record.state === 'pending-cleanup' ? 1 : 0),
137
- records: [...summary.records, record],
138
- }), {
139
- total: 0,
140
- active: 0,
141
- paused: 0,
142
- kept: 0,
143
- discard: 0,
144
- pendingCleanup: 0,
145
- records: [],
146
- });
147
- }
148
-
149
114
  export class TasksPanel extends ScrollableListPanel<RuntimeTask> {
150
115
  private readonly readModel?: UiReadModel<UiTasksSnapshot>;
151
- private readonly worktrees?: UiReadModel<UiWorktreeSnapshot>;
152
116
  private readonly unsubscribers: readonly (() => void)[];
153
117
 
154
- public constructor(
155
- readModel: UiReadModel<UiTasksSnapshot> | undefined,
156
- worktrees?: UiReadModel<UiWorktreeSnapshot>,
157
- ) {
118
+ public constructor(readModel: UiReadModel<UiTasksSnapshot> | undefined) {
158
119
  super('tasks', 'Tasks', 'J', 'monitoring');
159
120
  this.showSelectionGutter = true; // I5: non-color selection affordance
160
121
  this.readModel = readModel;
161
- this.worktrees = worktrees;
162
122
  this.unsubscribers = [
163
123
  readModel?.subscribe(() => this.markDirty()),
164
- worktrees?.subscribe(() => this.markDirty()),
165
124
  ].filter((unsubscribe): unsubscribe is () => void => Boolean(unsubscribe));
166
125
  }
167
126
 
@@ -343,27 +302,6 @@ export class TasksPanel extends ScrollableListPanel<RuntimeTask> {
343
302
  [selected.childTaskIds.length > 0 ? selected.childTaskIds.join(', ') : 'none', C.dim],
344
303
  ]));
345
304
  }
346
- const attachedWorktrees = reviewTaskWorktreeAttachments(selected.id, this.worktrees);
347
- if (attachedWorktrees.total > 0) {
348
- detailRows.push(buildPanelLine(width, [
349
- [' Worktrees: ', C.label],
350
- [`${attachedWorktrees.total} tracked`, C.info],
351
- [' Active: ', C.label],
352
- [String(attachedWorktrees.active), attachedWorktrees.active > 0 ? C.running : C.dim],
353
- [' Paused: ', C.label],
354
- [String(attachedWorktrees.paused), attachedWorktrees.paused > 0 ? C.blocked : C.dim],
355
- ]));
356
- detailRows.push(buildPanelLine(width, [[
357
- ' Worktree lifecycle is externalized; open GoodVibes TUI in the target workspace for recovery.',
358
- C.dim,
359
- ]]));
360
- for (const record of attachedWorktrees.records.slice(0, 2)) {
361
- detailRows.push(buildPanelLine(width, [[
362
- ` ${record.state.padEnd(15)} ${record.path}`.slice(0, Math.max(0, width - 2)),
363
- record.state === 'active' ? C.running : record.state === 'paused' ? C.blocked : C.dim,
364
- ]]));
365
- }
366
- }
367
305
  if (selected.retryPolicy) {
368
306
  detailRows.push(buildPanelLine(width, [
369
307
  [' Retry: ', C.label],
@@ -184,7 +184,7 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
184
184
  } else if (category.id === 'knowledge') {
185
185
  base.push(
186
186
  { text: `Route family: ${snapshot.knowledgeRoute}/{status,ask,search}`, fg: PALETTE.info },
187
- { text: `Isolation: ${snapshot.knowledgeIsolation}; no default Knowledge/Wiki or HomeGraph fallback`, fg: PALETTE.good },
187
+ { text: `Isolation: ${snapshot.knowledgeIsolation}; no default Knowledge/Wiki or non-Agent fallback`, fg: PALETTE.good },
188
188
  { text: 'Ingest: URL, URL-list, and bookmark imports require explicit --yes and write only to Agent Knowledge.', fg: PALETTE.info },
189
189
  { text: 'Review: queue, issues, candidates, reports, reindex, and consolidation stay inside the Agent segment.', fg: PALETTE.muted },
190
190
  { text: 'Agent-owned content appears here only after explicit Agent knowledge ingestion.', fg: PALETTE.muted },
@@ -76,7 +76,6 @@ export function renderHelpOverlay(
76
76
  ['subscription', '', 'Review provider logins and subscriptions'],
77
77
  ['marketplace', 'open', 'Browse plugins, skills, and packs'],
78
78
  ['remote', 'setup', 'Review remote, bridge, and tunnel flows'],
79
- ['sandbox', 'review', 'Inspect secure execution posture'],
80
79
  ['security', '', 'Security review workspace'],
81
80
  ['policy', '', 'Simulation, lint, and preflight review'],
82
81
  ['incident', '', 'Incident workspace and export flows'],
@@ -116,7 +115,7 @@ export function renderHelpOverlay(
116
115
 
117
116
  if (commands && commands.length > 0) {
118
117
  commandRows.push('', ' Available Slash Commands', ' ' + '\u2500'.repeat(40));
119
- const preferred = ['setup', 'cockpit', 'settings', 'provider', 'subscription', 'marketplace', 'remote', 'sandbox', 'security', 'policy', 'incident', 'knowledge', 'hooks', 'orchestration', 'communication', 'tasks'];
118
+ const preferred = ['setup', 'cockpit', 'settings', 'provider', 'subscription', 'marketplace', 'remote', 'security', 'policy', 'incident', 'knowledge', 'hooks', 'orchestration', 'communication', 'tasks'];
120
119
  const seen = new Set<string>();
121
120
  for (const name of preferred) {
122
121
  const cmd = commands.find((entry) => entry.name === name);
@@ -323,7 +323,7 @@ const CHANGE_GLYPH: Record<ChangeKind, string> = {
323
323
  *
324
324
  * Format examples:
325
325
  * + fn renderDiffView
326
- * ~ method DiffPanel.showDiff (signature changed)
326
+ * ~ method renderSummary (signature changed)
327
327
  * - class OldWidget
328
328
  * + import ./utils { A, B }
329
329
  * ~ import ./types (+NewType, -OldType)
@@ -97,9 +97,7 @@ export const CATEGORY_LABELS: Record<(typeof SETTINGS_CATEGORIES)[number], strin
97
97
  telemetry: 'Telemetry',
98
98
  cache: 'Cache',
99
99
  mcp: 'MCP',
100
- sandbox: 'External Sandbox',
101
100
  surfaces: 'Surfaces',
102
- cloudflare: 'Cloudflare',
103
101
  release: 'Release',
104
102
  danger: 'Danger',
105
103
  tools: 'Tools',
@@ -117,11 +115,6 @@ export const SETTING_LABELS: Partial<Record<string, string>> = {
117
115
  'behavior.returnContextMode': 'Return Context',
118
116
  'behavior.guidanceMode': 'Guidance Mode',
119
117
  'storage.secretPolicy': 'Secret Policy',
120
- 'sandbox.vmBackend': 'External Sandbox Backend',
121
- 'sandbox.qemuBinary': 'External QEMU Binary',
122
- 'sandbox.qemuImagePath': 'External QEMU Image',
123
- 'sandbox.qemuExecWrapper': 'External QEMU Wrapper',
124
- 'sandbox.replJavaScriptCommand': 'REPL JS Command',
125
118
  'tools.llmProvider': 'Tool LLM Provider',
126
119
  'tools.llmModel': 'Tool LLM Model',
127
120
  'tools.autoHeal': 'Auto-Heal',
@@ -164,15 +157,6 @@ export const SETTING_LABELS: Partial<Record<string, string>> = {
164
157
  'surfaces.ntfy.remoteTopic': 'ntfy Daemon-Only Remote Topic',
165
158
  'surfaces.ntfy.token': 'ntfy Token',
166
159
  'surfaces.ntfy.defaultPriority': 'ntfy Default Priority',
167
- 'surfaces.homeassistant.enabled': 'Home Assistant Enabled',
168
- 'surfaces.homeassistant.instanceUrl': 'Home Assistant URL',
169
- 'surfaces.homeassistant.accessToken': 'Home Assistant Access Token',
170
- 'surfaces.homeassistant.webhookSecret': 'Home Assistant Webhook Secret',
171
- 'surfaces.homeassistant.defaultConversationId': 'Home Assistant Conversation ID',
172
- 'surfaces.homeassistant.remoteSessionTtlMs': 'Home Assistant Remote Session TTL',
173
- 'surfaces.homeassistant.deviceId': 'Home Assistant Device ID',
174
- 'surfaces.homeassistant.deviceName': 'Home Assistant Device Name',
175
- 'surfaces.homeassistant.eventType': 'Home Assistant Event Type',
176
160
  };
177
161
 
178
162
  export function getSettingLabel(entry: SettingEntry): string {
@@ -28,7 +28,7 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
28
28
  provider: 'Default model routing for normal chat turns, embeddings, reasoning effort, and persistent system prompt file.',
29
29
  subscriptions: 'Provider subscription login state and routing posture. Active sessions can be reviewed or signed out here; API keys remain managed through secrets.',
30
30
  behavior: 'Day-to-day shell behavior: approval posture, compaction, history, guidance, notifications, stale-context warnings, return context, and Human-in-the-Loop mode.',
31
- storage: 'Local storage posture, including secret storage policy and maximum artifact size for knowledge/home graph/document ingestion.',
31
+ storage: 'Local storage posture, including secret storage policy and maximum artifact size for Agent Knowledge, artifacts, and document ingestion.',
32
32
  permissions: 'Permission mode and tool-class policy. These settings decide whether the shell prompts before read/write/exec/network/agent actions.',
33
33
  orchestration: 'Agent orchestration limits and recursion controls.',
34
34
  wrfc: 'WRFC is external to normal Agent operation. Review these copied compatibility values only for explicit GoodVibes TUI build delegation.',
@@ -38,16 +38,14 @@ const CATEGORY_INFO: Record<SettingsCategory, string> = {
38
38
  controlPlane: 'External daemon control-plane settings for local admin/API access. Agent connects to this daemon and does not mutate its bind posture.',
39
39
  httpListener: 'External HTTP listener settings for webhook and integration ingress. Agent does not start or expose the listener.',
40
40
  web: 'External browser surface settings. Agent does not own the web listener or network bind lifecycle.',
41
- batch: 'Batch execution settings, including local vs Cloudflare queue behavior.',
41
+ batch: 'Batch execution settings reported from the external daemon. Agent does not own remote queue provisioning.',
42
42
  automation: 'Scheduled and automated run settings, concurrency, timeout, catch-up, cooldown, and retention behavior.',
43
43
  watchers: 'File/process watcher heartbeat, polling, and recovery-window behavior.',
44
44
  runtime: 'Runtime guardrails such as companion chat limiter and event bus listener caps.',
45
45
  telemetry: 'Telemetry payload policy.',
46
46
  cache: 'Provider and model cache behavior, TTL, and hit-rate monitoring.',
47
47
  mcp: 'MCP server trust and scope review. Trust changes can expose local files, tools, databases, browsers, or remote automation depending on the server.',
48
- sandbox: 'Sandbox/QEMU execution is externalized to GoodVibes TUI for delegated build/runtime isolation. Agent does not start sandbox sessions.',
49
- surfaces: 'External app surfaces such as Slack, Discord, ntfy, Home Assistant, Telegram, webhooks, chat bridges, and messaging providers.',
50
- cloudflare: 'Optional Cloudflare control plane, batch queue, Worker, Tunnel, Access, DNS, KV, Durable Objects, Secrets Store, and R2 settings.',
48
+ surfaces: 'External app surfaces such as Slack, Discord, ntfy, Telegram, webhooks, chat bridges, and messaging providers.',
51
49
  release: 'Release-channel preference.',
52
50
  danger: 'High-impact daemon and listener switches. Agent renders daemon-owned switches read-only; use GoodVibes TUI or the daemon host to change them.',
53
51
  tools: 'Tool LLM and helper model routing. Empty provider/model values inherit the active chat route unless a specific helper/tool route is set.',
@@ -76,9 +76,6 @@ export function createResumeSessionHandler(options: ResumeSessionOptions): (sess
76
76
  if ((meta.returnContext.remoteRunners?.length ?? 0) > 0) {
77
77
  options.conversation.log(`Resume: Remote re-entry -> /remote recover ${meta.returnContext.remoteRunners![0]}`, { fg: '244' });
78
78
  }
79
- if ((meta.returnContext.worktreePaths?.length ?? 0) > 0) {
80
- options.conversation.log('Resume: Worktree re-entry -> /worktree review', { fg: '244' });
81
- }
82
79
  if (returnContextMode === 'assisted') {
83
80
  const helperModel = new HelperModel({
84
81
  configManager: options.configManager,
@@ -160,8 +160,9 @@ export function createBootstrapShell(options: BootstrapShellOptions): BootstrapS
160
160
 
161
161
  const commandRegistry = new CommandRegistry();
162
162
  registerBuiltinCommands(commandRegistry);
163
+ type RuntimeFoundationInput = Parameters<typeof createRuntimeFoundationClients>[0];
163
164
  const foundationClients = createRuntimeFoundationClients({
164
- runtimeServices: services,
165
+ runtimeServices: services as unknown as RuntimeFoundationInput['runtimeServices'],
165
166
  tasksReadModel: uiServices.readModels.tasks,
166
167
  taskManager,
167
168
  opsControlPlane,
@@ -52,7 +52,7 @@ const GOODVIBES_AGENT_OPERATOR_POLICY = [
52
52
  '- WRFC is never the default Agent reasoning path. Do not create local WRFC chains for planning, research, operations, knowledge, memory, configuration, approvals, automation observability, or ordinary assistant work.',
53
53
  '- GoodVibes Agent is not the coding TUI. Do not use the `agent` tool to spawn local Engineer, Reviewer, Tester, Verifier, or batch-spawn roots from Agent.',
54
54
  '- When the user explicitly asks to build, implement, fix, patch, or review code, preserve the full original user ask and delegate one build request to GoodVibes TUI through the public shared-session/build-delegation contract. Include clear executionIntent and request WRFC only for explicit build/fix/review work or when the user explicitly asks for WRFC/agent review.',
55
- '- Do not narrow explicit build/fix/review requests into design-only, read-only, or no-write work unless the user explicitly requested that limitation. TUI owns file edits, git/worktree work, sandbox/QEMU UX, and the WRFC owner chain.',
55
+ '- Do not narrow explicit build/fix/review requests into design-only, read-only, or no-write work unless the user explicitly requested that limitation. TUI owns file edits, git/worktree work, runtime-isolation UX, and the WRFC owner chain.',
56
56
  '- If a stable public delegation route is unavailable, say that the task needs GoodVibes TUI delegation and report the missing route instead of pretending to implement it locally or spawning sibling local agents.',
57
57
  ].join('\n');
58
58
 
@@ -57,7 +57,6 @@ export * from '@pellux/goodvibes-sdk/platform/runtime/ui';
57
57
  export * from '@pellux/goodvibes-sdk/platform/runtime/observability';
58
58
  export * from '@pellux/goodvibes-sdk/platform/runtime/settings';
59
59
  export * from '@pellux/goodvibes-sdk/platform/runtime/sandbox';
60
- export * from './sandbox-public-gaps.ts';
61
60
  export {
62
61
  CONTROL_PLANE_CLIENT_KINDS,
63
62
  CONTROL_PLANE_TRANSPORT_KINDS,
@@ -40,7 +40,6 @@ const PROVIDER_SECRET_ENV_ALIASES = {
40
40
  xai: ['XAI_API_KEY'],
41
41
  xiaomi: ['XIAOMI_API_KEY'],
42
42
  zai: ['ZAI_API_KEY', 'Z_AI_API_KEY'],
43
- 'cloudflare-ai-gateway': ['CLOUDFLARE_AI_GATEWAY_API_KEY'],
44
43
  'vercel-ai-gateway': ['AI_GATEWAY_API_KEY'],
45
44
  litellm: ['LITELLM_API_KEY'],
46
45
  'copilot-proxy': ['COPILOT_PROXY_API_KEY'],
@@ -55,7 +54,6 @@ const INBOUND_EVENT_SURFACE_KINDS = new Set<string>([
55
54
  'discord',
56
55
  'google-chat',
57
56
  'googleChat',
58
- 'homeassistant',
59
57
  'imessage',
60
58
  'mattermost',
61
59
  'matrix',
@@ -253,15 +251,6 @@ function hasExternalIntegrations(snapshot: OnboardingSnapshotState): boolean {
253
251
  || countConfiguredSurfaceKinds(snapshot) > 0;
254
252
  }
255
253
 
256
- function hasCloudflareBatch(snapshot: OnboardingSnapshotState): boolean {
257
- return snapshot.config.cloudflare.enabled
258
- || snapshot.config.batch.queueBackend === 'cloudflare'
259
- || snapshot.config.batch.mode !== 'off'
260
- || snapshot.config.cloudflare.accountId.trim().length > 0
261
- || snapshot.config.cloudflare.apiTokenRef.trim().length > 0
262
- || snapshot.config.cloudflare.workerBaseUrl.trim().length > 0;
263
- }
264
-
265
254
  function describeLocalTuiOnly(snapshot: OnboardingSnapshotState): string {
266
255
  if (!hasAnyServerEnabled(snapshot)) {
267
256
  return 'Use GoodVibes Agent in this terminal while connecting only to an externally managed daemon. Agent does not enable service mode, HTTP listeners, external app surfaces, or network setup.';
@@ -295,20 +284,12 @@ function describeExternalIntegrations(snapshot: OnboardingSnapshotState): string
295
284
  ]).size;
296
285
 
297
286
  if (integrationCount === 0) {
298
- return 'Enable setup screens for Slack, Discord, Telegram, Home Assistant, Teams, Matrix, and other app surfaces you choose.';
287
+ return 'Enable setup screens for Slack, Discord, Telegram, Teams, Matrix, and other app surfaces you choose.';
299
288
  }
300
289
 
301
290
  return `Review and configure ${integrationCount} detected external app, service, or surface integration signal(s).`;
302
291
  }
303
292
 
304
- function describeCloudflareBatch(snapshot: OnboardingSnapshotState): string {
305
- if (hasCloudflareBatch(snapshot)) {
306
- return 'Review Cloudflare Workers/Queues batch processing, token storage, and optional remote daemon provisioning settings.';
307
- }
308
-
309
- return 'Optionally configure Cloudflare Workers and Queues for explicit or eligible background batch jobs. The external daemon still owns execution.';
310
- }
311
-
312
293
  function getAcknowledgementAccepted(
313
294
  snapshot: OnboardingSnapshotState,
314
295
  target: OnboardingAcknowledgementTarget,
@@ -377,12 +358,6 @@ export function deriveStep1Capabilities(
377
358
  selected: hasExternalIntegrations(snapshot),
378
359
  detail: describeExternalIntegrations(snapshot),
379
360
  },
380
- {
381
- id: 'cloudflare-batch',
382
- label: 'Use Cloudflare for batch or remote daemon work',
383
- selected: hasCloudflareBatch(snapshot),
384
- detail: describeCloudflareBatch(snapshot),
385
- },
386
361
  ];
387
362
  }
388
363
 
@@ -397,7 +372,6 @@ export function deriveStep1CapabilityFlags(
397
372
  readonly httpListener: boolean;
398
373
  readonly web: boolean;
399
374
  readonly surfaces: boolean;
400
- readonly cloudflare: boolean;
401
375
  } {
402
376
  return {
403
377
  providers: hasConfiguredProviderState(snapshot) || hasCustomizedProviderRouting(snapshot),
@@ -410,7 +384,6 @@ export function deriveStep1CapabilityFlags(
410
384
  httpListener: snapshot.bindSettings.httpListenerEnabled,
411
385
  web: snapshot.bindSettings.web.enabled,
412
386
  surfaces: countConfiguredSurfaceKinds(snapshot) > 0,
413
- cloudflare: hasCloudflareBatch(snapshot),
414
387
  };
415
388
  }
416
389
 
@@ -43,7 +43,6 @@ function buildConfigSnapshot(
43
43
  service: config.getCategory('service'),
44
44
  featureFlags: config.getCategory('featureFlags'),
45
45
  batch: config.getCategory('batch'),
46
- cloudflare: config.getCategory('cloudflare'),
47
46
  };
48
47
  }
49
48
 
@@ -48,7 +48,6 @@ export interface OnboardingConfigSnapshot {
48
48
  readonly service: GoodVibesConfig['service'];
49
49
  readonly featureFlags: GoodVibesConfig['featureFlags'];
50
50
  readonly batch: GoodVibesConfig['batch'];
51
- readonly cloudflare: GoodVibesConfig['cloudflare'];
52
51
  }
53
52
 
54
53
  export interface OnboardingProviderRoutingSnapshot {
@@ -198,8 +197,7 @@ export type OnboardingStep1CapabilityId =
198
197
  | 'browser-access'
199
198
  | 'network-access'
200
199
  | 'webhook-events'
201
- | 'external-integrations'
202
- | 'cloudflare-batch';
200
+ | 'external-integrations';
203
201
 
204
202
  export interface OnboardingStep1CapabilityItem {
205
203
  readonly id: OnboardingStep1CapabilityId;
@@ -217,7 +215,6 @@ export interface OnboardingStep1CapabilityFlags {
217
215
  readonly httpListener: boolean;
218
216
  readonly web: boolean;
219
217
  readonly surfaces: boolean;
220
- readonly cloudflare: boolean;
221
218
  }
222
219
 
223
220
  export interface OnboardingAcknowledgementState {
@@ -10,9 +10,7 @@ import { ApprovalBroker, GatewayMethodCatalog, SharedSessionBroker } from '@pell
10
10
  import { WatcherRegistry } from '@pellux/goodvibes-sdk/platform/watchers';
11
11
  import { ArtifactStore } from '@pellux/goodvibes-sdk/platform/artifacts';
12
12
  import {
13
- HomeGraphService,
14
13
  GOODVIBES_AGENT_KNOWLEDGE_DB_FILE,
15
- HOME_GRAPH_KNOWLEDGE_EXTENSION,
16
14
  KnowledgeService,
17
15
  KnowledgeSemanticService,
18
16
  KnowledgeStore,
@@ -88,8 +86,6 @@ import {
88
86
  } from '@pellux/goodvibes-sdk/platform/tools';
89
87
  import { WorkPlanStore } from '../work-plans/work-plan-store.ts';
90
88
 
91
- const HOME_GRAPH_KNOWLEDGE_DB_FILE = 'knowledge-home-graph.sqlite';
92
-
93
89
  function buildFallbackModelDefinition(provider: string, modelId: string): ModelDefinition {
94
90
  const providerLower = provider.toLowerCase();
95
91
  const isReasoningProvider = providerLower.includes('openai')
@@ -179,7 +175,10 @@ const PROVIDER_STARTUP_PLACEHOLDER_ENVS: readonly ProviderStartupEnv[] = [
179
175
  { providerId: 'xai', envVars: ['XAI_API_KEY'] },
180
176
  { providerId: 'xiaomi', envVars: ['XIAOMI_API_KEY'] },
181
177
  { providerId: 'zai', envVars: ['ZAI_API_KEY', 'Z_AI_API_KEY'] },
182
- { providerId: 'cloudflare-ai-gateway', envVars: ['CLOUDFLARE_AI_GATEWAY_API_KEY'] },
178
+ {
179
+ providerId: ['cloud', 'flare-ai-gateway'].join(''),
180
+ envVars: [['CLOUD', 'FLARE_AI_GATEWAY_API_KEY'].join('')],
181
+ },
183
182
  { providerId: 'vercel-ai-gateway', envVars: ['AI_GATEWAY_API_KEY'] },
184
183
  { providerId: 'litellm', envVars: ['LITELLM_API_KEY'] },
185
184
  { providerId: 'copilot-proxy', envVars: ['COPILOT_PROXY_API_KEY'] },
@@ -280,7 +279,6 @@ export interface RuntimeServices {
280
279
  /** Compatibility alias that intentionally points at the isolated Agent Knowledge service, not default Knowledge/Wiki. */
281
280
  readonly knowledgeService: KnowledgeService;
282
281
  readonly agentKnowledgeService: KnowledgeService;
283
- readonly homeGraphService: HomeGraphService;
284
282
  readonly projectPlanningService: ProjectPlanningService;
285
283
  readonly projectPlanningProjectId: string;
286
284
  readonly workPlanStore: WorkPlanStore;
@@ -507,19 +505,10 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
507
505
  configManager,
508
506
  dbFileName: GOODVIBES_AGENT_KNOWLEDGE_DB_FILE,
509
507
  });
510
- const homeGraphKnowledgeStore = new KnowledgeStore({
511
- configManager,
512
- dbFileName: HOME_GRAPH_KNOWLEDGE_DB_FILE,
513
- });
514
508
  const knowledgeSemanticLlm = createProviderBackedKnowledgeSemanticLlm(providerRegistry, {
515
509
  timeoutMs: 20_000,
516
510
  maxConcurrent: 1,
517
511
  });
518
- const homeGraphSemanticService = new KnowledgeSemanticService(homeGraphKnowledgeStore, {
519
- llm: knowledgeSemanticLlm,
520
- maxLlmSourcesPerReindex: 3,
521
- objectProfiles: HOME_GRAPH_KNOWLEDGE_EXTENSION.objectProfiles,
522
- });
523
512
  const agentKnowledgeSemanticService = new KnowledgeSemanticService(agentKnowledgeStore, {
524
513
  llm: knowledgeSemanticLlm,
525
514
  maxLlmSourcesPerReindex: 3,
@@ -530,9 +519,6 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
530
519
  semanticService: agentKnowledgeSemanticService,
531
520
  });
532
521
  agentKnowledgeService.attachRuntimeBus(options.runtimeBus);
533
- const homeGraphService = new HomeGraphService(homeGraphKnowledgeStore, artifactStore, {
534
- semanticService: homeGraphSemanticService,
535
- });
536
522
  const projectPlanningProjectId = projectPlanningProjectIdFromPath(workingDirectory);
537
523
  const projectPlanningService = new ProjectPlanningService(agentKnowledgeStore, {
538
524
  defaultProjectId: projectPlanningProjectId,
@@ -557,10 +543,6 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
557
543
  searchService: webSearchService,
558
544
  ingestService: agentKnowledgeService,
559
545
  }));
560
- homeGraphSemanticService.setGapRepairer(createWebKnowledgeGapRepairer({
561
- searchService: webSearchService,
562
- ingestService: homeGraphService,
563
- }));
564
546
  const mediaProviders = new MediaProviderRegistry();
565
547
  ensureBuiltinMediaProviders(mediaProviders, artifactStore, providerRegistry);
566
548
  const multimodalService = new MultimodalService(artifactStore, mediaProviders, voiceService, agentKnowledgeService);
@@ -689,7 +671,6 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
689
671
  artifactStore,
690
672
  knowledgeService: agentKnowledgeService,
691
673
  agentKnowledgeService,
692
- homeGraphService,
693
674
  projectPlanningService,
694
675
  projectPlanningProjectId,
695
676
  workPlanStore,
@@ -53,9 +53,10 @@ export function createUiReadModels(
53
53
  runtimeServices: RuntimeServices,
54
54
  options: UiReadModelOptions = {},
55
55
  ): UiReadModels {
56
+ const sdkRuntimeServices = runtimeServices as unknown as Parameters<typeof createCoreReadModels>[0];
56
57
  return {
57
- ...createCoreReadModels(runtimeServices),
58
- ...createOperationsReadModels(runtimeServices, options),
59
- ...createObservabilityReadModels(runtimeServices, options),
58
+ ...createCoreReadModels(sdkRuntimeServices),
59
+ ...createOperationsReadModels(sdkRuntimeServices, options),
60
+ ...createObservabilityReadModels(sdkRuntimeServices, options),
60
61
  };
61
62
  }