@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.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/CHANGELOG.md +18 -9
- package/README.md +3 -3
- package/docs/README.md +1 -1
- package/docs/getting-started.md +3 -3
- package/docs/release-and-publishing.md +2 -2
- package/package.json +1 -3
- package/src/agent/routine-schedule-args.ts +219 -0
- package/src/agent/routine-schedule-format.ts +173 -0
- package/src/agent/routine-schedule-promotion.ts +3 -811
- package/src/agent/routine-schedule-receipts.ts +502 -0
- package/src/cli/agent-knowledge-command.ts +6 -6
- package/src/cli/help.ts +3 -25
- package/src/cli/package-verification.ts +23 -16
- package/src/cli/redaction.ts +4 -1
- package/src/cli/routines-command.ts +10 -6
- package/src/cli/service-posture.ts +47 -280
- package/src/cli/status.ts +0 -1
- package/src/cli/tui-startup.ts +23 -0
- package/src/config/secret-config.ts +0 -2
- package/src/input/agent-workspace-categories.ts +219 -0
- package/src/input/agent-workspace-editors.ts +143 -0
- package/src/input/agent-workspace-snapshot.ts +265 -0
- package/src/input/agent-workspace-types.ts +142 -0
- package/src/input/agent-workspace.ts +22 -766
- package/src/input/commands/agent-runtime-profile-runtime.ts +1 -1
- package/src/input/commands/delegation-runtime.ts +1 -1
- package/src/input/commands/experience-runtime.ts +3 -4
- package/src/input/commands/guidance-runtime.ts +1 -2
- package/src/input/commands/health-runtime.ts +3 -65
- package/src/input/commands/knowledge.ts +7 -7
- package/src/input/commands/local-setup-review.ts +0 -61
- package/src/input/commands/local-setup-transfer.ts +0 -3
- package/src/input/commands/local-setup.ts +2 -15
- package/src/input/commands/planning-runtime.ts +4 -1
- package/src/input/commands/platform-access-runtime.ts +1 -10
- package/src/input/commands/platform-services-runtime.ts +0 -1
- package/src/input/commands/recall-query.ts +1 -1
- package/src/input/commands/routines-runtime.ts +10 -6
- package/src/input/commands/schedule-runtime.ts +10 -6
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/commands/tasks-runtime.ts +1 -14
- package/src/input/commands.ts +0 -4
- package/src/input/handler-onboarding.ts +10 -120
- package/src/input/onboarding/onboarding-wizard-apply.ts +5 -196
- package/src/input/onboarding/onboarding-wizard-constants.ts +8 -119
- package/src/input/onboarding/onboarding-wizard-helpers.ts +2 -53
- package/src/input/onboarding/onboarding-wizard-rules.ts +2 -236
- package/src/input/onboarding/onboarding-wizard-state.ts +1 -69
- package/src/input/onboarding/onboarding-wizard-steps.ts +584 -737
- package/src/input/onboarding/onboarding-wizard-types.ts +8 -26
- package/src/input/onboarding/onboarding-wizard.ts +4 -109
- package/src/input/settings-modal-agent-policy.ts +10 -0
- package/src/input/settings-modal-types.ts +2 -4
- package/src/input/settings-modal.ts +3 -1
- package/src/input/submission-router.ts +0 -1
- package/src/main.ts +13 -12
- package/src/panels/approval-panel.ts +1 -2
- package/src/panels/builtin/operations.ts +1 -2
- package/src/panels/knowledge-panel.ts +2 -2
- package/src/panels/project-planning-panel.ts +4 -1
- package/src/panels/provider-health-domains.ts +0 -22
- package/src/panels/provider-health-panel.ts +1 -5
- package/src/panels/session-browser-panel.ts +0 -5
- package/src/panels/tasks-panel.ts +2 -64
- package/src/renderer/agent-workspace.ts +1 -1
- package/src/renderer/help-overlay.ts +1 -2
- package/src/renderer/semantic-diff.ts +1 -1
- package/src/renderer/settings-modal-helpers.ts +0 -16
- package/src/renderer/settings-modal.ts +3 -5
- package/src/runtime/bootstrap-hook-bridge.ts +0 -3
- package/src/runtime/bootstrap-shell.ts +2 -1
- package/src/runtime/bootstrap.ts +1 -1
- package/src/runtime/index.ts +0 -1
- package/src/runtime/onboarding/derivation.ts +1 -28
- package/src/runtime/onboarding/snapshot.ts +0 -1
- package/src/runtime/onboarding/types.ts +1 -4
- package/src/runtime/services.ts +4 -23
- package/src/runtime/ui-read-models.ts +4 -3
- package/src/shell/service-settings-sync.ts +15 -244
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/wrfc-agent-guard.ts +3 -3
- package/src/verification/live-verifier.ts +11 -5
- package/src/verification/verification-ledger.ts +3 -6
- package/src/version.ts +1 -1
- package/src/input/commands/agent-externalized-tui.ts +0 -73
- package/src/input/commands/cloudflare-runtime.ts +0 -385
- package/src/input/handler-onboarding-cloudflare.ts +0 -322
- package/src/input/onboarding/onboarding-runtime-status.ts +0 -87
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +0 -494
- package/src/input/onboarding/onboarding-wizard-cloudflare.ts +0 -199
- package/src/input/onboarding/onboarding-wizard-external-surface-extra-specs.ts +0 -130
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +0 -762
- package/src/runtime/cloudflare-control-plane.ts +0 -350
- 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 {
|
|
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
|
|
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', '
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
package/src/runtime/bootstrap.ts
CHANGED
|
@@ -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,
|
|
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
|
|
package/src/runtime/index.ts
CHANGED
|
@@ -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,
|
|
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
|
|
|
@@ -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 {
|
package/src/runtime/services.ts
CHANGED
|
@@ -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
|
-
{
|
|
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(
|
|
58
|
-
...createOperationsReadModels(
|
|
59
|
-
...createObservabilityReadModels(
|
|
58
|
+
...createCoreReadModels(sdkRuntimeServices),
|
|
59
|
+
...createOperationsReadModels(sdkRuntimeServices, options),
|
|
60
|
+
...createObservabilityReadModels(sdkRuntimeServices, options),
|
|
60
61
|
};
|
|
61
62
|
}
|