@pellux/goodvibes-agent 1.1.6 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +176 -0
- package/README.md +46 -30
- package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-swtppvy9.node} +0 -0
- package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-ttfcdtap.node} +0 -0
- package/dist/package/main.js +132662 -91399
- package/docs/README.md +14 -7
- package/docs/channels-remote-and-api.md +8 -5
- package/docs/connected-host.md +14 -12
- package/docs/getting-started.md +56 -30
- package/docs/knowledge-artifacts-and-multimodal.md +7 -5
- package/docs/project-planning.md +2 -2
- package/docs/providers-and-routing.md +11 -3
- package/docs/tools-and-commands.md +114 -45
- package/docs/voice-and-live-tts.md +3 -1
- package/package.json +3 -2
- package/release/release-notes.md +130 -5
- package/release/release-readiness.json +120 -90
- package/src/agent/assistant-cockpit.ts +247 -0
- package/src/agent/autonomy-schedule-format.ts +96 -0
- package/src/agent/autonomy-schedule.ts +514 -0
- package/src/agent/channel-delivery-receipts.ts +292 -0
- package/src/agent/competitive-feature-inventory.ts +296 -0
- package/src/agent/document-registry-types.ts +106 -0
- package/src/agent/document-registry.ts +734 -0
- package/src/agent/harness-control.ts +2 -2
- package/src/agent/memory-prompt.ts +2 -2
- package/src/agent/operator-actions.ts +50 -6
- package/src/agent/persona-registry.ts +8 -0
- package/src/agent/project-context-files.ts +273 -0
- package/src/agent/prompt-context-receipts.ts +502 -0
- package/src/agent/reminder-schedule-format.ts +16 -2
- package/src/agent/research-run-registry.ts +582 -0
- package/src/agent/research-source-registry.ts +441 -0
- package/src/agent/routine-registry.ts +19 -3
- package/src/agent/routine-schedule-format.ts +27 -2
- package/src/agent/runtime-profile-starters.ts +7 -0
- package/src/agent/runtime-profile.ts +106 -4
- package/src/agent/schedule-edit-format.ts +129 -0
- package/src/agent/schedule-edit.ts +496 -0
- package/src/agent/schedule-next-routes.ts +42 -0
- package/src/agent/setup-wizard-checkpoint.ts +140 -0
- package/src/agent/setup-wizard.ts +447 -0
- package/src/agent/skill-registry-types.ts +102 -0
- package/src/agent/skill-registry.ts +81 -107
- package/src/agent/vibe-confirmation-routes.ts +62 -0
- package/src/agent/vibe-file.ts +285 -0
- package/src/cli/agent-knowledge-command.ts +45 -2
- package/src/cli/help.ts +3 -0
- package/src/cli/profiles-command.ts +25 -11
- package/src/config/agent-settings-policy.ts +1 -18
- package/src/input/agent-workspace-activation.ts +53 -0
- package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
- package/src/input/agent-workspace-artifact-metadata.ts +17 -0
- package/src/input/agent-workspace-basic-command-editors.ts +5 -1
- package/src/input/agent-workspace-categories.ts +153 -155
- package/src/input/agent-workspace-channel-triage.ts +481 -0
- package/src/input/agent-workspace-channels.ts +263 -0
- package/src/input/agent-workspace-command-editor.ts +152 -0
- package/src/input/agent-workspace-context-snapshot.ts +349 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
- package/src/input/agent-workspace-document-editor.ts +502 -0
- package/src/input/agent-workspace-document-ops-editor.ts +523 -0
- package/src/input/agent-workspace-host-category.ts +1 -1
- package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
- package/src/input/agent-workspace-model-compare-editor.ts +376 -0
- package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
- package/src/input/agent-workspace-model-compare-types.ts +82 -0
- package/src/input/agent-workspace-model-compare-utils.ts +35 -0
- package/src/input/agent-workspace-onboarding-categories.ts +141 -0
- package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
- package/src/input/agent-workspace-operations-command-editors.ts +22 -0
- package/src/input/agent-workspace-research-report-editor.ts +212 -0
- package/src/input/agent-workspace-research-run-editor.ts +144 -0
- package/src/input/agent-workspace-research-source-editor.ts +167 -0
- package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
- package/src/input/agent-workspace-review-packet-utils.ts +265 -0
- package/src/input/agent-workspace-settings.ts +262 -30
- package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
- package/src/input/agent-workspace-setup-snapshot.ts +198 -0
- package/src/input/agent-workspace-setup.ts +34 -1
- package/src/input/agent-workspace-snapshot.ts +162 -147
- package/src/input/agent-workspace-types.ts +287 -2
- package/src/input/agent-workspace.ts +18 -0
- package/src/input/command-registry.ts +9 -2
- package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
- package/src/input/commands/channels-runtime.ts +102 -114
- package/src/input/commands/delegation-runtime.ts +87 -24
- package/src/input/commands/knowledge-browser-flags.ts +12 -0
- package/src/input/commands/knowledge.ts +28 -14
- package/src/input/commands/operator-actions-runtime.ts +6 -3
- package/src/input/commands/schedule-runtime.ts +71 -14
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/shell-core.ts +2 -0
- package/src/input/commands/vibe-runtime.ts +140 -0
- package/src/input/commands.ts +2 -0
- package/src/input/connected-host-routes.ts +123 -0
- package/src/input/settings-modal-types.ts +14 -0
- package/src/main.ts +15 -15
- package/src/panels/qr-panel.ts +2 -2
- package/src/renderer/agent-workspace-context-lines.ts +686 -0
- package/src/renderer/agent-workspace.ts +30 -419
- package/src/renderer/settings-modal-helpers.ts +12 -0
- package/src/renderer/settings-modal.ts +12 -0
- package/src/runtime/bootstrap-command-context.ts +11 -1
- package/src/runtime/bootstrap-command-parts.ts +14 -3
- package/src/runtime/bootstrap-core.ts +43 -1
- package/src/runtime/bootstrap-shell.ts +6 -0
- package/src/runtime/bootstrap.ts +113 -30
- package/src/runtime/connected-host-auth.ts +3 -2
- package/src/runtime/execution-ledger.ts +231 -0
- package/src/runtime/services.ts +88 -10
- package/src/runtime/tool-permission-safety.ts +287 -0
- package/src/shell/session-continuity-hints.ts +39 -0
- package/src/tools/agent-artifacts-tool.ts +606 -0
- package/src/tools/agent-audit-tool.ts +155 -0
- package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
- package/src/tools/agent-autonomy-tool.ts +140 -0
- package/src/tools/agent-channel-send-tool.ts +24 -2
- package/src/tools/agent-channels-tool.ts +140 -0
- package/src/tools/agent-computer-tool.ts +168 -0
- package/src/tools/agent-context-policy.ts +267 -10
- package/src/tools/agent-context-tool.ts +143 -0
- package/src/tools/agent-delegation-tool.ts +128 -0
- package/src/tools/agent-device-tool.ts +240 -0
- package/src/tools/agent-documents-tool.ts +684 -0
- package/src/tools/agent-execution-tool.ts +230 -0
- package/src/tools/agent-harness-agent-orchestration.ts +703 -0
- package/src/tools/agent-harness-autonomy-intake.ts +785 -0
- package/src/tools/agent-harness-autonomy-live-records.ts +588 -0
- package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
- package/src/tools/agent-harness-autonomy-queue.ts +560 -0
- package/src/tools/agent-harness-background-processes-types.ts +35 -0
- package/src/tools/agent-harness-background-processes.ts +794 -0
- package/src/tools/agent-harness-browser-cockpit-route.ts +219 -0
- package/src/tools/agent-harness-browser-control.ts +338 -0
- package/src/tools/agent-harness-channel-metadata.ts +168 -10
- package/src/tools/agent-harness-cli-command-policy.ts +110 -0
- package/src/tools/agent-harness-command-catalog.ts +4 -2
- package/src/tools/agent-harness-command-runner.ts +42 -0
- package/src/tools/agent-harness-connected-host-status.ts +7 -4
- package/src/tools/agent-harness-delegation-posture.ts +234 -19
- package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
- package/src/tools/agent-harness-document-ops-types.ts +72 -0
- package/src/tools/agent-harness-document-ops.ts +671 -0
- package/src/tools/agent-harness-execution-history.ts +489 -0
- package/src/tools/agent-harness-execution-posture.ts +382 -0
- package/src/tools/agent-harness-file-recovery.ts +135 -0
- package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
- package/src/tools/agent-harness-learning-curator-common.ts +102 -0
- package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
- package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
- package/src/tools/agent-harness-learning-curator-types.ts +151 -0
- package/src/tools/agent-harness-learning-curator.ts +417 -0
- package/src/tools/agent-harness-local-model-benchmarks.ts +199 -0
- package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
- package/src/tools/agent-harness-local-model-endpoints.ts +673 -0
- package/src/tools/agent-harness-media-posture.ts +208 -2
- package/src/tools/agent-harness-memory-posture.ts +556 -0
- package/src/tools/agent-harness-metadata.ts +100 -168
- package/src/tools/agent-harness-mode-catalog.ts +84 -33
- package/src/tools/agent-harness-model-catalog.ts +162 -0
- package/src/tools/agent-harness-model-provider-health.ts +186 -0
- package/src/tools/agent-harness-model-readiness.ts +406 -0
- package/src/tools/agent-harness-model-routing-types.ts +266 -0
- package/src/tools/agent-harness-model-routing-utils.ts +30 -0
- package/src/tools/agent-harness-model-routing.ts +137 -190
- package/src/tools/agent-harness-operator-methods.ts +115 -133
- package/src/tools/agent-harness-pairing-posture.ts +431 -18
- package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
- package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
- package/src/tools/agent-harness-personal-ops-lanes.ts +204 -0
- package/src/tools/agent-harness-personal-ops-records.ts +732 -0
- package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
- package/src/tools/agent-harness-personal-ops-types.ts +222 -0
- package/src/tools/agent-harness-personal-ops.ts +606 -0
- package/src/tools/agent-harness-project-context.ts +144 -0
- package/src/tools/agent-harness-prompt-context.ts +589 -0
- package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
- package/src/tools/agent-harness-release-evidence.ts +9 -7
- package/src/tools/agent-harness-release-readiness.ts +9 -7
- package/src/tools/agent-harness-research-briefing.ts +427 -0
- package/src/tools/agent-harness-research-queue.ts +250 -0
- package/src/tools/agent-harness-research-runs.ts +295 -0
- package/src/tools/agent-harness-research-workflow.ts +322 -0
- package/src/tools/agent-harness-security-posture.ts +2 -2
- package/src/tools/agent-harness-service-posture.ts +9 -9
- package/src/tools/agent-harness-session-metadata.ts +3 -3
- package/src/tools/agent-harness-setup-connected-host.ts +501 -0
- package/src/tools/agent-harness-setup-describe.ts +557 -0
- package/src/tools/agent-harness-setup-handoffs.ts +502 -0
- package/src/tools/agent-harness-setup-model-helpers.ts +101 -0
- package/src/tools/agent-harness-setup-plan.ts +253 -0
- package/src/tools/agent-harness-setup-posture-types.ts +218 -0
- package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
- package/src/tools/agent-harness-setup-posture.ts +449 -221
- package/src/tools/agent-harness-setup-smoke.ts +508 -0
- package/src/tools/agent-harness-sudo-posture.ts +114 -0
- package/src/tools/agent-harness-tool-schema.ts +120 -7
- package/src/tools/agent-harness-tool-types.ts +78 -0
- package/src/tools/agent-harness-tool-utils.ts +43 -0
- package/src/tools/agent-harness-tool.ts +311 -370
- package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
- package/src/tools/agent-harness-ui-surface-types.ts +46 -0
- package/src/tools/agent-harness-vibe-health.ts +105 -0
- package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
- package/src/tools/agent-harness-workspace-actions.ts +114 -8
- package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
- package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
- package/src/tools/agent-host-tool.ts +159 -0
- package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
- package/src/tools/agent-learning-consolidation-core.ts +327 -0
- package/src/tools/agent-learning-consolidation-tool.ts +758 -0
- package/src/tools/agent-memory-tool.ts +214 -0
- package/src/tools/agent-model-compare-export.ts +315 -0
- package/src/tools/agent-model-compare-handoff.ts +592 -0
- package/src/tools/agent-model-compare-judgment.ts +633 -0
- package/src/tools/agent-model-compare-run.ts +722 -0
- package/src/tools/agent-model-compare-tool.ts +698 -0
- package/src/tools/agent-model-compare-types.ts +191 -0
- package/src/tools/agent-model-compare-utils.ts +93 -0
- package/src/tools/agent-models-tool.ts +208 -0
- package/src/tools/agent-operator-action-tool.ts +1 -1
- package/src/tools/agent-operator-method-tool.ts +643 -0
- package/src/tools/agent-personal-ops-tool.ts +197 -0
- package/src/tools/agent-policy-explanation.ts +415 -0
- package/src/tools/agent-research-report-tool.ts +608 -0
- package/src/tools/agent-research-runs-tool.ts +434 -0
- package/src/tools/agent-research-sources-tool.ts +443 -0
- package/src/tools/agent-research-tool.ts +687 -0
- package/src/tools/agent-review-packet-presets-core.ts +757 -0
- package/src/tools/agent-review-packet-presets-tool.ts +466 -0
- package/src/tools/agent-review-packet-share-tool.ts +305 -0
- package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
- package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
- package/src/tools/agent-route-planner-candidates-work.ts +251 -0
- package/src/tools/agent-route-planner-helpers.ts +667 -0
- package/src/tools/agent-route-planner.ts +185 -0
- package/src/tools/agent-route-tool.ts +105 -0
- package/src/tools/agent-schedule-edit-tool.ts +210 -0
- package/src/tools/agent-schedule-tool.ts +282 -0
- package/src/tools/agent-security-tool.ts +145 -0
- package/src/tools/agent-sessions-tool.ts +122 -0
- package/src/tools/agent-settings-import-tool.ts +104 -0
- package/src/tools/agent-settings-tool.ts +176 -0
- package/src/tools/agent-setup-tool.ts +226 -0
- package/src/tools/agent-support-tool.ts +122 -0
- package/src/tools/agent-terminal-process-tools.ts +167 -0
- package/src/tools/agent-tool-policy-guard-types.ts +77 -0
- package/src/tools/agent-tool-policy-guard.ts +110 -89
- package/src/tools/agent-vibe-tool.ts +297 -0
- package/src/tools/agent-work-plan-tool.ts +265 -6
- package/src/tools/agent-workspace-tool.ts +305 -0
- package/src/tools/artifact-archive.ts +169 -0
- package/src/tools/tool-definition-compaction.ts +36 -0
- package/src/tools/tool-execution-safety.ts +41 -0
- package/src/version.ts +1 -1
|
@@ -34,6 +34,18 @@ import {
|
|
|
34
34
|
reconcileRoutineScheduleReceipts,
|
|
35
35
|
RoutineScheduleReceiptStore,
|
|
36
36
|
} from '../../agent/routine-schedule-receipts.ts';
|
|
37
|
+
import {
|
|
38
|
+
buildScheduleEditPreview,
|
|
39
|
+
editConnectedSchedule,
|
|
40
|
+
enrichScheduleEditPreviewFromConnectedHost,
|
|
41
|
+
parseScheduleEditArgs,
|
|
42
|
+
resolveScheduleEditConnectedHostConnection,
|
|
43
|
+
} from '../../agent/schedule-edit.ts';
|
|
44
|
+
import {
|
|
45
|
+
formatScheduleEditFailure,
|
|
46
|
+
formatScheduleEditPreview,
|
|
47
|
+
formatScheduleEditSuccess,
|
|
48
|
+
} from '../../agent/schedule-edit-format.ts';
|
|
37
49
|
import type { CommandContext } from '../command-registry.ts';
|
|
38
50
|
import { requireShellPaths } from './runtime-services.ts';
|
|
39
51
|
import { executeConfirmedOperatorAction } from './operator-actions-runtime.ts';
|
|
@@ -119,13 +131,42 @@ async function createReminder(args: readonly string[], ctx: CommandContext): Pro
|
|
|
119
131
|
ctx.print(result.ok ? formatReminderScheduleSuccess(result) : formatReminderScheduleFailure(result));
|
|
120
132
|
}
|
|
121
133
|
|
|
134
|
+
async function editSchedule(args: readonly string[], ctx: CommandContext): Promise<void> {
|
|
135
|
+
const parsed = parseScheduleEditArgs(args, {
|
|
136
|
+
defaultExplicitUserRequest: `/schedule edit ${args[0] ?? ''}`.trim(),
|
|
137
|
+
});
|
|
138
|
+
if (parsed.errors.length > 0) {
|
|
139
|
+
ctx.print([
|
|
140
|
+
'Usage: /schedule edit <schedule-id> [--cron <expr>|--every <interval>|--at <iso-time>] [--timezone <tz>] [--stagger-ms <ms>] [--name <text>] [--prompt <text>|--task <text> --success-criteria <text>] --yes',
|
|
141
|
+
...parsed.errors.map((error) => ` ${error}`),
|
|
142
|
+
].join('\n'));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
let preview = buildScheduleEditPreview(parsed);
|
|
146
|
+
if (!parsed.yes) {
|
|
147
|
+
try {
|
|
148
|
+
const shellPaths = requireShellPaths(ctx);
|
|
149
|
+
const connection = resolveScheduleEditConnectedHostConnection(ctx.platform.configManager, shellPaths.homeDirectory);
|
|
150
|
+
preview = await enrichScheduleEditPreviewFromConnectedHost(connection, preview);
|
|
151
|
+
} catch {
|
|
152
|
+
// A basic preview is still safer than blocking confirmation on local path services.
|
|
153
|
+
}
|
|
154
|
+
ctx.print(formatScheduleEditPreview(preview));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const shellPaths = requireShellPaths(ctx);
|
|
158
|
+
const connection = resolveScheduleEditConnectedHostConnection(ctx.platform.configManager, shellPaths.homeDirectory);
|
|
159
|
+
const result = await editConnectedSchedule(connection, preview);
|
|
160
|
+
ctx.print(result.ok ? formatScheduleEditSuccess(result) : formatScheduleEditFailure(result));
|
|
161
|
+
}
|
|
162
|
+
|
|
122
163
|
export function registerScheduleRuntimeCommands(registry: CommandRegistry): void {
|
|
123
164
|
registry.register({
|
|
124
165
|
name: 'schedule',
|
|
125
166
|
aliases: ['sched'],
|
|
126
167
|
description: 'Inspect schedules, create confirmed reminders, and explicitly promote Agent-local routines to connected schedules',
|
|
127
|
-
usage: 'list | remind --at <iso> --message <text> --yes | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr>
|
|
128
|
-
argsHint: 'list | remind --at <iso> --message <text> --yes | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr>
|
|
168
|
+
usage: 'list | edit <id> --cron <expr> --yes | remind --at <iso> --message <text> --yes | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> --yes',
|
|
169
|
+
argsHint: 'list | edit <id> --cron <expr> --yes | remind --at <iso> --message <text> --yes | receipts | reconcile | receipt <id> | promote-routine <routine-id> --cron <expr> --yes',
|
|
129
170
|
async handler(args, ctx) {
|
|
130
171
|
const sub = args[0];
|
|
131
172
|
|
|
@@ -163,6 +204,28 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
|
|
|
163
204
|
return;
|
|
164
205
|
}
|
|
165
206
|
|
|
207
|
+
if (sub === 'edit' || sub === 'update' || sub === 'patch') {
|
|
208
|
+
await editSchedule(args.slice(1), ctx);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (sub === 'run' || sub === 'enable' || sub === 'disable' || sub === 'delete' || sub === 'remove') {
|
|
213
|
+
const scheduleId = args[1] ?? '';
|
|
214
|
+
if (!scheduleId) {
|
|
215
|
+
ctx.print(`Usage: /schedule ${sub} <schedule-id> --yes`);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const action = sub === 'run'
|
|
219
|
+
? 'schedules.run'
|
|
220
|
+
: sub === 'enable'
|
|
221
|
+
? 'schedules.enable'
|
|
222
|
+
: sub === 'disable'
|
|
223
|
+
? 'schedules.disable'
|
|
224
|
+
: 'schedules.delete';
|
|
225
|
+
await executeConfirmedOperatorAction(ctx, action, 'scheduleId', scheduleId, args.slice(2), `/schedule ${sub} <schedule-id> --yes`);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
|
|
166
229
|
const manager = ctx.ops.automationManager;
|
|
167
230
|
if (!manager) {
|
|
168
231
|
ctx.print('Automation manager is not available in this runtime.');
|
|
@@ -191,17 +254,7 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
|
|
|
191
254
|
return;
|
|
192
255
|
}
|
|
193
256
|
|
|
194
|
-
if (sub === '
|
|
195
|
-
const scheduleId = args[1] ?? '';
|
|
196
|
-
if (!scheduleId) {
|
|
197
|
-
ctx.print('Usage: /schedule run <schedule-id> --yes');
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
await executeConfirmedOperatorAction(ctx, 'schedules.run', 'scheduleId', scheduleId, args.slice(2), '/schedule run <schedule-id> --yes');
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (sub === 'add' || sub === 'remove' || sub === 'enable' || sub === 'disable') {
|
|
257
|
+
if (sub === 'add') {
|
|
205
258
|
printReadOnlyScheduleBoundary(ctx.print, `/schedule ${args.join(' ')}`.trim());
|
|
206
259
|
return;
|
|
207
260
|
}
|
|
@@ -213,9 +266,13 @@ export function registerScheduleRuntimeCommands(registry: CommandRegistry): void
|
|
|
213
266
|
+ ' /schedule reconcile\n'
|
|
214
267
|
+ ' /schedule receipt <receipt-id>\n'
|
|
215
268
|
+ ' /schedule run <schedule-id> --yes\n'
|
|
269
|
+
+ ' /schedule enable <schedule-id> --yes\n'
|
|
270
|
+
+ ' /schedule disable <schedule-id> --yes\n'
|
|
271
|
+
+ ' /schedule delete <schedule-id> --yes\n'
|
|
272
|
+
+ ' /schedule edit <schedule-id> [--cron <expr>|--every <interval>|--at <iso-time>] [--name <text>] [--prompt <text>|--task <text> --success-criteria <text>] --yes\n'
|
|
216
273
|
+ ' /schedule remind (--cron <expr>|--every <interval>|--at <iso-time>) (--message <text>|<text...>) [--delivery-channel <channel>|--delivery-route <route>|--delivery-webhook <url>] --yes\n'
|
|
217
274
|
+ ' /schedule promote-routine <routine-id> (--cron <expr>|--every <interval>|--at <iso-time>) [--delivery-channel <channel>|--delivery-route <route>|--delivery-webhook <url>] --yes\n'
|
|
218
|
-
+ ' Local schedule
|
|
275
|
+
+ ' Local schedule creation remains blocked; schedule lifecycle/edit actions are confirmed connected-host actions.'
|
|
219
276
|
);
|
|
220
277
|
},
|
|
221
278
|
});
|
|
@@ -197,7 +197,7 @@ export function registerSessionContentCommands(registry: CommandRegistry): void
|
|
|
197
197
|
argsHint: '',
|
|
198
198
|
handler(args, ctx) {
|
|
199
199
|
if (args.length > 0) {
|
|
200
|
-
ctx.print('Usage: /undo\n Removes the last conversation turn.
|
|
200
|
+
ctx.print('Usage: /undo\n Removes the last conversation turn. Use execution action:"recovery" for local file edit undo.');
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
203
|
const success = ctx.session.conversationManager.undo();
|
|
@@ -217,7 +217,7 @@ export function registerSessionContentCommands(registry: CommandRegistry): void
|
|
|
217
217
|
argsHint: '',
|
|
218
218
|
handler(args, ctx) {
|
|
219
219
|
if (args.length > 0) {
|
|
220
|
-
ctx.print('Usage: /redo\n Restores the last undone conversation turn.
|
|
220
|
+
ctx.print('Usage: /redo\n Restores the last undone conversation turn. Use execution action:"recovery" for local file edit redo.');
|
|
221
221
|
return;
|
|
222
222
|
}
|
|
223
223
|
const success = ctx.session.conversationManager.redo();
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { AgentPersonaRegistry } from '../../agent/persona-registry.ts';
|
|
2
|
+
import {
|
|
3
|
+
discoverVibeFiles,
|
|
4
|
+
formatVibeStatus,
|
|
5
|
+
initVibeFile,
|
|
6
|
+
loadVibeImportSource,
|
|
7
|
+
resolveVibePathReference,
|
|
8
|
+
} from '../../agent/vibe-file.ts';
|
|
9
|
+
import {
|
|
10
|
+
formatVibeConfirmationRouteLines,
|
|
11
|
+
vibeImportPersonaConfirmationRoutes,
|
|
12
|
+
vibeInitConfirmationRoutes,
|
|
13
|
+
} from '../../agent/vibe-confirmation-routes.ts';
|
|
14
|
+
import type { CommandContext, CommandRegistry } from '../command-registry.ts';
|
|
15
|
+
import { parseAgentLocalLibraryArgs } from './agent-local-library-args.ts';
|
|
16
|
+
import { requireShellPaths } from './runtime-services.ts';
|
|
17
|
+
|
|
18
|
+
const VIBE_VALUE_FLAGS = ['name', 'description'] as const;
|
|
19
|
+
|
|
20
|
+
function printError(ctx: CommandContext, error: unknown): void {
|
|
21
|
+
ctx.print([
|
|
22
|
+
'Error',
|
|
23
|
+
` message ${error instanceof Error ? error.message : String(error)}`,
|
|
24
|
+
].join('\n'));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function usage(): string {
|
|
28
|
+
return [
|
|
29
|
+
'Usage: /vibe [status|init|show|import-persona]',
|
|
30
|
+
' /vibe',
|
|
31
|
+
' /vibe init [--global] [--force] --yes',
|
|
32
|
+
' /vibe show [project|global|path]',
|
|
33
|
+
' /vibe import-persona [project|global|path] [--name <name>] [--description <summary>] [--review] [--use] --yes',
|
|
34
|
+
].join('\n');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function registerVibeRuntimeCommands(registry: CommandRegistry): void {
|
|
38
|
+
registry.register({
|
|
39
|
+
name: 'vibe',
|
|
40
|
+
aliases: ['vibes'],
|
|
41
|
+
description: 'Inspect, create, and import VIBE.md personality files',
|
|
42
|
+
usage: '[status|init|show|import-persona]',
|
|
43
|
+
async handler(args, ctx) {
|
|
44
|
+
const sub = (args[0] ?? 'status').toLowerCase();
|
|
45
|
+
const shellPaths = requireShellPaths(ctx);
|
|
46
|
+
try {
|
|
47
|
+
if (sub === 'status' || sub === 'list' || sub === 'open') {
|
|
48
|
+
ctx.print(formatVibeStatus(discoverVibeFiles(shellPaths)));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (sub === 'init') {
|
|
53
|
+
const parsed = parseAgentLocalLibraryArgs(args.slice(1), { valueFlags: VIBE_VALUE_FLAGS });
|
|
54
|
+
const scope = parsed.flags.has('global') ? 'global' : 'project';
|
|
55
|
+
const previewPath = scope === 'global'
|
|
56
|
+
? resolveVibePathReference(shellPaths, 'global')
|
|
57
|
+
: resolveVibePathReference(shellPaths, 'project');
|
|
58
|
+
if (!parsed.yes) {
|
|
59
|
+
ctx.print([
|
|
60
|
+
'VIBE.md init preview',
|
|
61
|
+
` scope ${scope}`,
|
|
62
|
+
` path ${previewPath}`,
|
|
63
|
+
...formatVibeConfirmationRouteLines(vibeInitConfirmationRoutes(scope, parsed.flags.has('force'))),
|
|
64
|
+
].join('\n'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const result = initVibeFile(shellPaths, { scope, force: parsed.flags.has('force') });
|
|
68
|
+
ctx.print(result.created
|
|
69
|
+
? `Created ${scope} VIBE.md\n path ${result.path}`
|
|
70
|
+
: `VIBE.md already exists\n path ${result.path}\n next rerun with --force --yes to replace it`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (sub === 'show') {
|
|
75
|
+
const reference = args.slice(1).join(' ').trim() || 'project';
|
|
76
|
+
const source = loadVibeImportSource(shellPaths, reference);
|
|
77
|
+
ctx.print([
|
|
78
|
+
`${source.scope === 'global' ? 'Global' : 'Project'} VIBE.md`,
|
|
79
|
+
` path ${source.path}`,
|
|
80
|
+
` name ${source.name}`,
|
|
81
|
+
` description ${source.description}`,
|
|
82
|
+
'',
|
|
83
|
+
source.body,
|
|
84
|
+
].join('\n'));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (sub === 'import-persona' || sub === 'import') {
|
|
89
|
+
const parsed = parseAgentLocalLibraryArgs(args.slice(1), { valueFlags: VIBE_VALUE_FLAGS });
|
|
90
|
+
const reference = parsed.rest.join(' ').trim() || 'project';
|
|
91
|
+
const source = loadVibeImportSource(shellPaths, reference);
|
|
92
|
+
const name = parsed.flags.get('name')?.trim() || source.name;
|
|
93
|
+
const description = parsed.flags.get('description')?.trim() || source.description;
|
|
94
|
+
if (!parsed.yes) {
|
|
95
|
+
ctx.print([
|
|
96
|
+
'VIBE.md persona import preview',
|
|
97
|
+
` source ${source.scope}`,
|
|
98
|
+
` path ${source.path}`,
|
|
99
|
+
` name ${name}`,
|
|
100
|
+
` description ${description}`,
|
|
101
|
+
` body characters ${source.body.length}`,
|
|
102
|
+
...formatVibeConfirmationRouteLines(vibeImportPersonaConfirmationRoutes({
|
|
103
|
+
reference,
|
|
104
|
+
name,
|
|
105
|
+
description,
|
|
106
|
+
review: parsed.flags.has('review'),
|
|
107
|
+
use: parsed.flags.has('use'),
|
|
108
|
+
})),
|
|
109
|
+
].join('\n'));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const personaRegistry = AgentPersonaRegistry.fromShellPaths(shellPaths);
|
|
113
|
+
const persona = personaRegistry.create({
|
|
114
|
+
name,
|
|
115
|
+
description,
|
|
116
|
+
body: source.body,
|
|
117
|
+
tags: ['vibe', source.scope],
|
|
118
|
+
triggers: ['vibe'],
|
|
119
|
+
source: 'imported',
|
|
120
|
+
provenance: `Imported VIBE.md (${source.scope}): ${source.path}`,
|
|
121
|
+
});
|
|
122
|
+
if (parsed.flags.has('review')) personaRegistry.markReviewed(persona.id);
|
|
123
|
+
if (parsed.flags.has('use')) personaRegistry.setActive(persona.id);
|
|
124
|
+
ctx.print([
|
|
125
|
+
`Imported VIBE.md persona ${persona.id}: ${persona.name}`,
|
|
126
|
+
` source ${source.scope}`,
|
|
127
|
+
` path ${source.path}`,
|
|
128
|
+
` reviewed ${parsed.flags.has('review') ? 'yes' : 'no'}`,
|
|
129
|
+
` active ${parsed.flags.has('use') ? 'yes' : 'no'}`,
|
|
130
|
+
].join('\n'));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
ctx.print(usage());
|
|
135
|
+
} catch (error) {
|
|
136
|
+
printError(ctx, error);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
package/src/input/commands.ts
CHANGED
|
@@ -32,6 +32,7 @@ import { registerAgentWorkspaceRuntimeCommands } from './commands/agent-workspac
|
|
|
32
32
|
import { registerAgentRuntimeProfileRuntimeCommands } from './commands/agent-runtime-profile-runtime.ts';
|
|
33
33
|
import { registerDelegationRuntimeCommands } from './commands/delegation-runtime.ts';
|
|
34
34
|
import { registerPersonasRuntimeCommands } from './commands/personas-runtime.ts';
|
|
35
|
+
import { registerVibeRuntimeCommands } from './commands/vibe-runtime.ts';
|
|
35
36
|
import { registerAgentSkillsRuntimeCommands } from './commands/agent-skills-runtime.ts';
|
|
36
37
|
import { registerRoutinesRuntimeCommands } from './commands/routines-runtime.ts';
|
|
37
38
|
import { registerChannelsRuntimeCommands } from './commands/channels-runtime.ts';
|
|
@@ -65,6 +66,7 @@ export function registerBuiltinCommands(registry: CommandRegistry): void {
|
|
|
65
66
|
registerCompatRuntimeCommands(registry);
|
|
66
67
|
registerOperatorActionRuntimeCommands(registry);
|
|
67
68
|
registerAgentRuntimeProfileRuntimeCommands(registry);
|
|
69
|
+
registerVibeRuntimeCommands(registry);
|
|
68
70
|
registerPersonasRuntimeCommands(registry);
|
|
69
71
|
registerAgentSkillsRuntimeCommands(registry);
|
|
70
72
|
registerRoutinesRuntimeCommands(registry);
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import type { CommandContext } from './command-registry.ts';
|
|
4
|
+
|
|
5
|
+
export interface ConnectedHostConnection {
|
|
6
|
+
readonly baseUrl: string;
|
|
7
|
+
readonly token: string | null;
|
|
8
|
+
readonly tokenPath: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface ConnectedHostRouteSuccess {
|
|
12
|
+
readonly ok: true;
|
|
13
|
+
readonly route: string;
|
|
14
|
+
readonly body: unknown;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ConnectedHostRouteFailure {
|
|
18
|
+
readonly ok: false;
|
|
19
|
+
readonly route: string;
|
|
20
|
+
readonly kind: 'auth_required' | 'connected_host_unavailable' | 'connected_host_route_unavailable' | 'connected_host_error';
|
|
21
|
+
readonly baseUrl: string;
|
|
22
|
+
readonly message: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type ConnectedHostRouteResult = ConnectedHostRouteSuccess | ConnectedHostRouteFailure;
|
|
26
|
+
|
|
27
|
+
export const CONNECTED_HOST_FAILURE_LABELS: Record<ConnectedHostRouteFailure['kind'], string> = {
|
|
28
|
+
auth_required: 'auth required',
|
|
29
|
+
connected_host_unavailable: 'connected host unavailable',
|
|
30
|
+
connected_host_route_unavailable: 'connected host route unavailable',
|
|
31
|
+
connected_host_error: 'connected host error',
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
35
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function resolveConnectedHostConnection(context: CommandContext): ConnectedHostConnection {
|
|
39
|
+
const hostValue = context.platform?.configManager?.get('controlPlane.host');
|
|
40
|
+
const portValue = context.platform?.configManager?.get('controlPlane.port');
|
|
41
|
+
const host = typeof hostValue === 'string' && hostValue.trim().length > 0 ? hostValue.trim() : '127.0.0.1';
|
|
42
|
+
const port = typeof portValue === 'number' && Number.isFinite(portValue) ? portValue : 3421;
|
|
43
|
+
const homeDirectory = context.workspace?.shellPaths?.homeDirectory ?? process.env.HOME ?? '';
|
|
44
|
+
const tokenPath = join(homeDirectory, '.goodvibes', 'daemon', 'operator-tokens.json');
|
|
45
|
+
if (!existsSync(tokenPath)) return { baseUrl: `http://${host}:${port}`, token: null, tokenPath };
|
|
46
|
+
try {
|
|
47
|
+
const parsed = JSON.parse(readFileSync(tokenPath, 'utf-8')) as unknown;
|
|
48
|
+
const token = isRecord(parsed) && typeof parsed.token === 'string' ? parsed.token : null;
|
|
49
|
+
return { baseUrl: `http://${host}:${port}`, token, tokenPath };
|
|
50
|
+
} catch {
|
|
51
|
+
return { baseUrl: `http://${host}:${port}`, token: null, tokenPath };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function fetchConnectedHostReadOnlyRoute(
|
|
56
|
+
context: CommandContext,
|
|
57
|
+
route: string,
|
|
58
|
+
): Promise<ConnectedHostRouteResult> {
|
|
59
|
+
const connection = resolveConnectedHostConnection(context);
|
|
60
|
+
if (!connection.token) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
route,
|
|
64
|
+
kind: 'auth_required',
|
|
65
|
+
baseUrl: connection.baseUrl,
|
|
66
|
+
message: `No connected-host operator token found at ${connection.tokenPath}`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const response = await fetch(`${connection.baseUrl}${route}`, {
|
|
72
|
+
headers: { authorization: `Bearer ${connection.token}` },
|
|
73
|
+
});
|
|
74
|
+
const text = await response.text();
|
|
75
|
+
let body: unknown = text;
|
|
76
|
+
if (text.trim().length > 0) {
|
|
77
|
+
try {
|
|
78
|
+
body = JSON.parse(text) as unknown;
|
|
79
|
+
} catch {
|
|
80
|
+
body = text;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
const detail = isRecord(body) && typeof body.error === 'string' ? body.error : text;
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
route,
|
|
88
|
+
kind: response.status === 401 || response.status === 403
|
|
89
|
+
? 'auth_required'
|
|
90
|
+
: response.status === 404
|
|
91
|
+
? 'connected_host_route_unavailable'
|
|
92
|
+
: 'connected_host_error',
|
|
93
|
+
baseUrl: connection.baseUrl,
|
|
94
|
+
message: `HTTP ${response.status}${detail ? `: ${detail}` : ''}`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return { ok: true, route, body };
|
|
98
|
+
} catch (error) {
|
|
99
|
+
return {
|
|
100
|
+
ok: false,
|
|
101
|
+
route,
|
|
102
|
+
kind: 'connected_host_unavailable',
|
|
103
|
+
baseUrl: connection.baseUrl,
|
|
104
|
+
message: error instanceof Error ? error.message : String(error),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function formatConnectedHostRouteFailure(
|
|
110
|
+
title: string,
|
|
111
|
+
failure: ConnectedHostRouteFailure,
|
|
112
|
+
policy = 'read-only; no mutation route was called',
|
|
113
|
+
): string {
|
|
114
|
+
return [
|
|
115
|
+
`${title}: unavailable`,
|
|
116
|
+
` status: ${CONNECTED_HOST_FAILURE_LABELS[failure.kind]}`,
|
|
117
|
+
` kind: ${failure.kind}`,
|
|
118
|
+
` connected host: ${failure.baseUrl}`,
|
|
119
|
+
` route: ${failure.route}`,
|
|
120
|
+
` error: ${failure.message}`,
|
|
121
|
+
` policy: ${policy}`,
|
|
122
|
+
].join('\n');
|
|
123
|
+
}
|
|
@@ -32,6 +32,18 @@ export type SettingsCategory =
|
|
|
32
32
|
| 'tts'
|
|
33
33
|
| 'surfaces'
|
|
34
34
|
| 'automation'
|
|
35
|
+
| 'service'
|
|
36
|
+
| 'controlPlane'
|
|
37
|
+
| 'httpListener'
|
|
38
|
+
| 'web'
|
|
39
|
+
| 'watchers'
|
|
40
|
+
| 'network'
|
|
41
|
+
| 'orchestration'
|
|
42
|
+
| 'runtime'
|
|
43
|
+
| 'sandbox'
|
|
44
|
+
| 'batch'
|
|
45
|
+
| 'cloudflare'
|
|
46
|
+
| 'wrfc'
|
|
35
47
|
| 'telemetry'
|
|
36
48
|
| 'cache'
|
|
37
49
|
| 'mcp'
|
|
@@ -48,6 +60,8 @@ export const SETTINGS_CATEGORY_GROUPS: ReadonlyArray<{
|
|
|
48
60
|
{ label: 'Models and Providers', categories: ['provider', 'subscriptions', 'helper', 'tools', 'tts'] },
|
|
49
61
|
{ label: 'Agent-local state', categories: ['storage', 'cache', 'telemetry'] },
|
|
50
62
|
{ label: 'Channels and Tools', categories: ['surfaces', 'mcp', 'automation'] },
|
|
63
|
+
{ label: 'Daemon Runtime', categories: ['service', 'controlPlane', 'httpListener', 'web', 'watchers', 'network'] },
|
|
64
|
+
{ label: 'Advanced Runtime', categories: ['orchestration', 'runtime', 'sandbox', 'batch', 'cloudflare', 'wrfc'] },
|
|
51
65
|
{ label: 'Advanced', categories: ['flags', 'release'] },
|
|
52
66
|
];
|
|
53
67
|
|
package/src/main.ts
CHANGED
|
@@ -44,6 +44,7 @@ import type { SessionSnapshot } from '@/runtime/index.ts';
|
|
|
44
44
|
import { handleBlockingShellInput, type PendingPermissionState } from './shell/blocking-input.ts';
|
|
45
45
|
import { createAgentWorkspaceFullscreenComposite, createFullscreenCompositeFromLines } from './shell/agent-workspace-fullscreen.ts';
|
|
46
46
|
import { getTerminalSize } from './shell/terminal-size.ts';
|
|
47
|
+
import { buildShellSessionContinuityHints } from './shell/session-continuity-hints.ts';
|
|
47
48
|
import { wireShellUiOpeners } from './shell/ui-openers.ts';
|
|
48
49
|
import { deriveComposerState } from './core/composer-state.ts';
|
|
49
50
|
import { buildPersistedSessionContext, formatReturnContextForDisplay, getReturnContextMode, maybeAssistReturnContextSummary } from '@/runtime/index.ts';
|
|
@@ -128,19 +129,12 @@ async function main() {
|
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
const panelManager = ctx.services.panelManager;
|
|
131
|
-
const buildSessionContinuityHints = () =>
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
activeTasks: tasksSnapshot.tasks.filter((task) => task.status === 'running' || task.status === 'queued').length,
|
|
138
|
-
blockedTasks: tasksSnapshot.tasks.filter((task) => task.status === 'blocked').length,
|
|
139
|
-
remoteContracts: remoteSnapshot.contracts.length,
|
|
140
|
-
remoteRunners: remoteSnapshot.contracts.slice(0, 4).map((contract) => contract.runnerId),
|
|
141
|
-
openPanels: panelManager.getAllOpen().map((panel) => panel.id),
|
|
142
|
-
};
|
|
143
|
-
};
|
|
132
|
+
const buildSessionContinuityHints = () => buildShellSessionContinuityHints(
|
|
133
|
+
uiServices.readModels.session.getSnapshot(),
|
|
134
|
+
uiServices.readModels.tasks.getSnapshot(),
|
|
135
|
+
uiServices.readModels.remote.getSnapshot(),
|
|
136
|
+
panelManager.getAllOpen(),
|
|
137
|
+
);
|
|
144
138
|
const buildCurrentSessionSnapshot = (): SessionSnapshot => {
|
|
145
139
|
const messages = conversation.getMessageSnapshot();
|
|
146
140
|
const persisted = buildPersistedSessionContext(messages, conversation.getTitleSource(), buildSessionContinuityHints());
|
|
@@ -494,9 +488,13 @@ async function main() {
|
|
|
494
488
|
// Cache the current model for consistent values across the entire render frame
|
|
495
489
|
const currentModel = providerRegistry.getCurrentModel();
|
|
496
490
|
const sessionSnapshot = uiServices.readModels.session.getSnapshot();
|
|
491
|
+
const agentSnapshot = uiServices.readModels.agents.getSnapshot();
|
|
492
|
+
const activeAgents = agentSnapshot.active;
|
|
493
|
+
const primaryActiveAgent = activeAgents.find((agent) => agent.latestProgress?.trim())
|
|
494
|
+
?? activeAgents[0];
|
|
497
495
|
|
|
498
496
|
const headerLines = UIFactory.createHeader(width, currentModel.id, currentModel.provider, conversation.title || undefined);
|
|
499
|
-
const runningAgentCount =
|
|
497
|
+
const runningAgentCount = activeAgents.length;
|
|
500
498
|
const runningProcessCount = processManager.list().filter((p) => !p.status.startsWith('done')).length;
|
|
501
499
|
const cw = getPromptContentWidth();
|
|
502
500
|
const promptInfo = input.getWrappedPromptInfo(cw);
|
|
@@ -543,7 +541,9 @@ async function main() {
|
|
|
543
541
|
runningAgentCount,
|
|
544
542
|
runningProcessCount,
|
|
545
543
|
indicatorFocused: input.indicatorFocused,
|
|
546
|
-
runningAgentProgress:
|
|
544
|
+
runningAgentProgress: primaryActiveAgent
|
|
545
|
+
? `${primaryActiveAgent.label}: ${primaryActiveAgent.latestProgress?.trim() || primaryActiveAgent.status}`
|
|
546
|
+
: undefined,
|
|
547
547
|
composerMode: composerState.modeLabel,
|
|
548
548
|
composerStatus: composerState.statusLabel,
|
|
549
549
|
composerFlags: composerState.flags,
|
package/src/panels/qr-panel.ts
CHANGED
|
@@ -158,12 +158,12 @@ export class QrPanel extends BasePanel {
|
|
|
158
158
|
);
|
|
159
159
|
lines.push(
|
|
160
160
|
buildPanelLine(width, [
|
|
161
|
-
[' Connected-host operator token is missing.
|
|
161
|
+
[' Connected-host operator token is missing. Use confirmed setup to create or repair it. ', C.dim],
|
|
162
162
|
]),
|
|
163
163
|
);
|
|
164
164
|
lines.push(
|
|
165
165
|
buildPanelLine(width, [
|
|
166
|
-
['
|
|
166
|
+
[' agent_harness mode:"provision_connected_host_token" then reopen this panel. ', C.dim],
|
|
167
167
|
]),
|
|
168
168
|
);
|
|
169
169
|
}
|