@pellux/goodvibes-agent 1.4.4 → 1.5.1
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 +22 -0
- package/README.md +52 -7
- package/dist/package/main.js +7491 -12253
- package/docs/README.md +2 -2
- package/docs/channels-remote-and-api.md +1 -1
- package/docs/getting-started.md +2 -2
- package/docs/release-and-publishing.md +1 -1
- package/docs/tools-and-commands.md +5 -5
- package/package.json +4 -2
- package/release/live-verification/live-verification.json +13 -13
- package/release/live-verification/live-verification.md +15 -15
- package/release/performance-snapshot.json +2 -2
- package/release/release-notes.md +5 -7
- package/release/release-readiness.json +6 -6
- package/src/agent/behavior-discovery-summary.ts +4 -18
- package/src/agent/calendar-registry.ts +322 -0
- package/src/agent/competitive-feature-inventory.ts +268 -130
- package/src/agent/document-registry.ts +5 -1
- package/src/agent/email/email-service.ts +350 -0
- package/src/agent/email/imap-client.ts +596 -0
- package/src/agent/email/smtp-client.ts +453 -0
- package/src/agent/ics-calendar.ts +662 -0
- package/src/agent/ics-timezone.ts +172 -0
- package/src/agent/markdown-frontmatter.ts +31 -0
- package/src/agent/memory-safety.ts +1 -1
- package/src/agent/note-registry.ts +3 -9
- package/src/agent/persona-discovery.ts +3 -15
- package/src/agent/persona-registry.ts +1 -10
- package/src/agent/research-source-registry.ts +5 -1
- package/src/agent/routine-discovery.ts +3 -15
- package/src/agent/runtime-profile.ts +3 -0
- package/src/agent/skill-discovery.ts +3 -15
- package/src/agent/skill-draft-proposer.ts +203 -0
- package/src/agent/skill-draft-runner.ts +201 -0
- package/src/agent/skill-registry.ts +36 -1
- package/src/agent/skill-standard.ts +99 -0
- package/src/agent/vibe-file.ts +7 -22
- package/src/cli/completion.ts +1 -1
- package/src/cli/config-overrides.ts +10 -1
- package/src/cli/redaction.ts +17 -5
- package/src/config/provider-model.ts +2 -1
- package/src/config/secret-config.ts +13 -6
- package/src/core/activity-feed.ts +97 -0
- package/src/core/away-digest.ts +161 -0
- package/src/core/conversation-rendering.ts +7 -3
- package/src/core/conversation.ts +22 -15
- package/src/core/hardware-profile.ts +362 -0
- package/src/core/last-seen-store.ts +78 -0
- package/src/core/plain-language.ts +52 -0
- package/src/core/setup-incomplete-hint.ts +90 -0
- package/src/core/system-message-router.ts +38 -87
- package/src/input/agent-workspace-basic-command-editor-submission.ts +60 -220
- package/src/input/agent-workspace-basic-command-editors.ts +39 -141
- package/src/input/agent-workspace-categories.ts +40 -125
- package/src/input/agent-workspace-command-editor.ts +4 -0
- package/src/input/agent-workspace-host-category.ts +0 -5
- package/src/input/agent-workspace-local-editor-submission.ts +3 -1
- package/src/input/agent-workspace-navigation.ts +10 -3
- package/src/input/agent-workspace-onboarding-actions.ts +132 -0
- package/src/input/agent-workspace-onboarding-categories.ts +29 -26
- package/src/input/agent-workspace-onboarding-finish.ts +11 -4
- package/src/input/agent-workspace-onboarding-state.ts +111 -0
- package/src/input/agent-workspace-profile-editor-submission.ts +260 -0
- package/src/input/agent-workspace-profile-editors.ts +155 -0
- package/src/input/agent-workspace-subscription-editor.ts +7 -0
- package/src/input/agent-workspace-types.ts +5 -1
- package/src/input/agent-workspace.ts +65 -39
- package/src/input/command-registry.ts +18 -5
- package/src/input/commands/agent-runtime-profile-runtime.ts +2 -1
- package/src/input/commands/agent-skills-runtime.ts +60 -3
- package/src/input/commands/calendar-runtime.ts +209 -0
- package/src/input/commands/channels-runtime.ts +1 -0
- package/src/input/commands/command-error.ts +9 -0
- package/src/input/commands/compat-runtime.ts +1 -0
- package/src/input/commands/config.ts +1 -0
- package/src/input/commands/conversation-runtime.ts +1 -1
- package/src/input/commands/delegation-runtime.ts +5 -6
- package/src/input/commands/email-runtime.ts +387 -0
- package/src/input/commands/experience-runtime.ts +17 -4
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-runtime.ts +6 -1
- package/src/input/commands/knowledge-format.ts +73 -0
- package/src/input/commands/knowledge.ts +9 -74
- package/src/input/commands/local-provider-runtime.ts +2 -1
- package/src/input/commands/local-runtime.ts +10 -4
- package/src/input/commands/mcp-runtime.ts +7 -0
- package/src/input/commands/notify-runtime.ts +17 -1
- package/src/input/commands/onboarding-runtime.ts +1 -0
- package/src/input/commands/operator-actions-runtime.ts +1 -0
- package/src/input/commands/operator-runtime.ts +3 -0
- package/src/input/commands/personas-runtime.ts +1 -0
- package/src/input/commands/platform-access-runtime.ts +40 -17
- package/src/input/commands/product-runtime.ts +6 -1
- package/src/input/commands/provider-accounts-runtime.ts +3 -2
- package/src/input/commands/qrcode-runtime.ts +1 -0
- package/src/input/commands/routines-runtime.ts +1 -0
- package/src/input/commands/runtime-services.ts +0 -13
- package/src/input/commands/security-runtime.ts +1 -0
- package/src/input/commands/session-content.ts +1 -0
- package/src/input/commands/shell-core.ts +5 -2
- package/src/input/commands/subscription-runtime.ts +33 -9
- package/src/input/commands/support-bundle-runtime.ts +8 -1
- package/src/input/commands/tasks-runtime.ts +1 -0
- package/src/input/commands/tts-runtime.ts +1 -0
- package/src/input/commands/vibe-runtime.ts +1 -0
- package/src/input/commands.ts +4 -0
- package/src/input/feed-context-factory.ts +3 -12
- package/src/input/handler-command-route.ts +7 -60
- package/src/input/handler-feed-routes.ts +0 -194
- package/src/input/handler-feed.ts +2 -54
- package/src/input/handler-interactions.ts +0 -2
- package/src/input/handler-modal-stack.ts +0 -9
- package/src/input/handler-picker-routes.ts +24 -1
- package/src/input/handler-shortcuts.ts +11 -40
- package/src/input/handler-ui-state.ts +13 -0
- package/src/input/handler.ts +8 -35
- package/src/input/keybindings.ts +40 -17
- package/src/input/model-picker-local-fit.ts +130 -0
- package/src/input/shell-passthrough.ts +58 -0
- package/src/input/submission-router.ts +0 -5
- package/src/main.ts +129 -90
- package/src/renderer/activity-sidebar.ts +186 -0
- package/src/renderer/agent-workspace-context-lines.ts +5 -48
- package/src/renderer/agent-workspace-style.ts +1 -1
- package/src/renderer/agent-workspace.ts +14 -2
- package/src/renderer/compositor.ts +37 -125
- package/src/renderer/conversation-overlays.ts +3 -3
- package/src/renderer/help-overlay.ts +7 -5
- package/src/renderer/model-workspace.ts +101 -86
- package/src/{panels → renderer}/polish.ts +3 -3
- package/src/renderer/shell-surface.ts +4 -5
- package/src/renderer/status-token.ts +31 -11
- package/src/renderer/tab-strip.ts +1 -1
- package/src/renderer/tool-call.ts +7 -8
- package/src/renderer/tool-labels.ts +92 -0
- package/src/renderer/ui-factory.ts +48 -96
- package/src/runtime/bootstrap-command-context.ts +0 -5
- package/src/runtime/bootstrap-command-parts.ts +6 -15
- package/src/runtime/bootstrap-core.ts +34 -13
- package/src/runtime/bootstrap-hook-bridge.ts +3 -1
- package/src/runtime/bootstrap-shell.ts +3 -50
- package/src/runtime/bootstrap.ts +3 -4
- package/src/runtime/context.ts +1 -1
- package/src/runtime/diagnostics/panels/index.ts +0 -1
- package/src/runtime/diagnostics/panels/policy.ts +1 -1
- package/src/runtime/execution-ledger.ts +16 -1
- package/src/runtime/index.ts +6 -1
- package/src/runtime/onboarding/index.ts +1 -0
- package/src/runtime/onboarding/onboarding-state.ts +200 -0
- package/src/{panels → runtime}/provider-account-snapshot.ts +5 -2
- package/src/runtime/services.ts +16 -4
- package/src/runtime/terminal-output-guard.ts +7 -0
- package/src/runtime/tool-permission-safety.ts +1 -1
- package/src/runtime/ui/model-picker/data-provider.ts +1 -1
- package/src/runtime/ui/model-picker/health-enrichment.ts +2 -2
- package/src/runtime/ui/model-picker/types.ts +2 -2
- package/src/runtime/ui/provider-health/data-provider.ts +3 -3
- package/src/runtime/ui/provider-health/types.ts +2 -2
- package/src/runtime/ui-services.ts +0 -2
- package/src/shell/agent-workspace-fullscreen.ts +0 -1
- package/src/shell/autonomy-surfacing.ts +272 -0
- package/src/shell/session-continuity-hints.ts +0 -6
- package/src/shell/startup-wiring.ts +221 -0
- package/src/shell/ui-openers.ts +18 -29
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/agent-harness-background-processes.ts +4 -4
- package/src/tools/agent-harness-browser-cockpit-route.ts +3 -3
- package/src/tools/agent-harness-command-runner.ts +6 -1
- package/src/tools/agent-harness-document-ops.ts +26 -53
- package/src/tools/agent-harness-execution-history.ts +1 -13
- package/src/tools/agent-harness-execution-posture.ts +0 -15
- package/src/tools/agent-harness-keybinding-metadata.ts +28 -29
- package/src/tools/agent-harness-local-model-cookbook.ts +24 -1
- package/src/tools/agent-harness-metadata.ts +16 -0
- package/src/tools/agent-harness-mode-catalog.ts +2 -9
- package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
- package/src/tools/agent-harness-setup-posture-utils.ts +1 -1
- package/src/tools/agent-harness-tool-schema.ts +13 -14
- package/src/tools/agent-harness-tool.ts +27 -23
- package/src/tools/agent-harness-ui-surface-metadata.ts +10 -20
- package/src/tools/agent-harness-workspace-action-runner.ts +3 -4
- package/src/tools/agent-workspace-tool.ts +2 -33
- package/src/utils/terminal-width.ts +9 -3
- package/src/version.ts +1 -1
- package/src/input/agent-workspace-panel-route.ts +0 -44
- package/src/input/panel-integration-actions.ts +0 -26
- package/src/panels/approval-panel.ts +0 -149
- package/src/panels/automation-control-panel.ts +0 -212
- package/src/panels/base-panel.ts +0 -254
- package/src/panels/builtin/agent.ts +0 -58
- package/src/panels/builtin/knowledge.ts +0 -26
- package/src/panels/builtin/operations.ts +0 -121
- package/src/panels/builtin/session.ts +0 -138
- package/src/panels/builtin/shared.ts +0 -275
- package/src/panels/builtin/usage.ts +0 -21
- package/src/panels/builtin-panels.ts +0 -23
- package/src/panels/confirm-state.ts +0 -61
- package/src/panels/context-visualizer-panel.ts +0 -204
- package/src/panels/cost-tracker-panel.ts +0 -444
- package/src/panels/docs-panel.ts +0 -285
- package/src/panels/index.ts +0 -25
- package/src/panels/knowledge-panel.ts +0 -417
- package/src/panels/memory-panel.ts +0 -226
- package/src/panels/panel-list-panel.ts +0 -464
- package/src/panels/panel-manager.ts +0 -570
- package/src/panels/provider-accounts-panel.ts +0 -233
- package/src/panels/provider-health-domains.ts +0 -208
- package/src/panels/provider-health-panel.ts +0 -720
- package/src/panels/provider-health-tracker.ts +0 -115
- package/src/panels/provider-stats-panel.ts +0 -366
- package/src/panels/qr-panel.ts +0 -207
- package/src/panels/schedule-panel.ts +0 -321
- package/src/panels/scrollable-list-panel.ts +0 -491
- package/src/panels/search-focus.ts +0 -32
- package/src/panels/security-panel.ts +0 -295
- package/src/panels/session-browser-panel.ts +0 -395
- package/src/panels/session-maintenance.ts +0 -125
- package/src/panels/subscription-panel.ts +0 -263
- package/src/panels/system-messages-panel.ts +0 -230
- package/src/panels/tasks-panel.ts +0 -344
- package/src/panels/thinking-panel.ts +0 -304
- package/src/panels/token-budget-panel.ts +0 -475
- package/src/panels/tool-inspector-panel.ts +0 -436
- package/src/panels/types.ts +0 -54
- package/src/renderer/panel-composite.ts +0 -158
- package/src/renderer/panel-tab-bar.ts +0 -69
- package/src/renderer/panel-workspace-bar.ts +0 -42
- package/src/runtime/diagnostics/panels/panel-resources.ts +0 -118
- package/src/tools/agent-harness-panel-metadata.ts +0 -211
- /package/src/runtime/perf/{panel-health-monitor.ts → component-health.ts} +0 -0
|
@@ -36,7 +36,7 @@ const BROWSER_COCKPIT_EXPECTED_LANES = [
|
|
|
36
36
|
{
|
|
37
37
|
id: 'mobile-and-channels',
|
|
38
38
|
label: 'Mobile and channels',
|
|
39
|
-
categoryIds: ['onboarding-channels', 'onboarding-voice-media', '
|
|
39
|
+
categoryIds: ['onboarding-channels', 'onboarding-voice-media', 'personal-ops'],
|
|
40
40
|
userOutcome: 'Configure mobile-friendly messaging, notification, voice, phone, and daily personal-operation routes from one cockpit.',
|
|
41
41
|
},
|
|
42
42
|
{
|
|
@@ -48,13 +48,13 @@ const BROWSER_COCKPIT_EXPECTED_LANES = [
|
|
|
48
48
|
{
|
|
49
49
|
id: 'work-and-automation',
|
|
50
50
|
label: 'Work and automation',
|
|
51
|
-
categoryIds: ['work', 'automation'
|
|
51
|
+
categoryIds: ['work', 'automation'],
|
|
52
52
|
userOutcome: 'Approve, supervise, recover, schedule, and delegate autonomous work with touch-friendly controls and receipts.',
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
id: 'research-and-artifacts',
|
|
56
56
|
label: 'Research and artifacts',
|
|
57
|
-
categoryIds: ['research', 'documents'
|
|
57
|
+
categoryIds: ['research', 'documents'],
|
|
58
58
|
userOutcome: 'Run research, draft documents, review packets, browse artifacts, and export/share deliverables from the browser.',
|
|
59
59
|
},
|
|
60
60
|
{
|
|
@@ -34,9 +34,14 @@ export async function runCommand(deps: AgentHarnessToolDeps, args: AgentHarnessT
|
|
|
34
34
|
const commandArgs = invocationArgsFromLookup(resolved.lookup);
|
|
35
35
|
const handled = await deps.commandRegistry.execute(resolved.command.name, [...commandArgs], toolContext);
|
|
36
36
|
if (!handled) return error(`Unknown slash command /${resolved.command.name}.`);
|
|
37
|
+
const MAX_PRINTED_CHARS = 6000;
|
|
38
|
+
const raw = printed.length > 0 ? printed.join('\n') : '(no text output)';
|
|
39
|
+
const printedText = raw.length > MAX_PRINTED_CHARS
|
|
40
|
+
? `${raw.slice(0, MAX_PRINTED_CHARS)}\n... output truncated`
|
|
41
|
+
: raw;
|
|
37
42
|
return output([
|
|
38
43
|
`Command ${safeCommandDisplay(resolved.command.name)} completed.`,
|
|
39
44
|
`Resolved by ${resolved.lookup.source} ${resolved.lookup.resolvedBy}.`,
|
|
40
|
-
|
|
45
|
+
printedText,
|
|
41
46
|
].join('\n'));
|
|
42
47
|
}
|
|
@@ -222,19 +222,14 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
222
222
|
'document-draft-chat',
|
|
223
223
|
], available);
|
|
224
224
|
const uploadActions = existingActions([
|
|
225
|
-
'artifact-attach-image',
|
|
226
|
-
'artifact-paste',
|
|
227
|
-
'artifact-ingest-file',
|
|
228
|
-
'artifact-ingest-url-list',
|
|
229
|
-
'artifact-import-bookmarks',
|
|
230
|
-
'artifact-browser-history',
|
|
231
225
|
'document-attach-image',
|
|
232
|
-
'document-paste',
|
|
233
226
|
'document-ingest-file',
|
|
227
|
+
'document-ingest-url-list',
|
|
228
|
+
'knowledge-import-bookmarks',
|
|
229
|
+
'knowledge-import-browser-history',
|
|
230
|
+
'conversation-image',
|
|
234
231
|
], available);
|
|
235
232
|
const exportActions = existingActions([
|
|
236
|
-
'artifact-export-conversation',
|
|
237
|
-
'artifact-session-export',
|
|
238
233
|
'conversation-export-current',
|
|
239
234
|
'conversation-session-export',
|
|
240
235
|
'document-export-draft',
|
|
@@ -242,20 +237,14 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
242
237
|
'document-export-artifact-package',
|
|
243
238
|
'document-export-conversation',
|
|
244
239
|
'document-export-session',
|
|
245
|
-
'artifact-export-file',
|
|
246
|
-
'artifact-export-package',
|
|
247
240
|
], available);
|
|
248
241
|
const sourceActions = existingActions([
|
|
249
|
-
'artifact-source-library',
|
|
250
|
-
'artifact-show-source',
|
|
251
242
|
'research-knowledge-search',
|
|
252
243
|
'research-knowledge-ask',
|
|
253
244
|
'document-sources',
|
|
254
245
|
'document-show-source',
|
|
255
246
|
], available);
|
|
256
247
|
const mediaActions = existingActions([
|
|
257
|
-
'artifact-media-providers',
|
|
258
|
-
'artifact-generate-media',
|
|
259
248
|
'media-providers',
|
|
260
249
|
'media-generate',
|
|
261
250
|
'document-media-providers',
|
|
@@ -267,16 +256,8 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
267
256
|
'document-export-artifact-file',
|
|
268
257
|
'document-export-artifact-package',
|
|
269
258
|
'document-promote-artifact',
|
|
270
|
-
'artifact
|
|
271
|
-
'artifact
|
|
272
|
-
'artifact-export-file',
|
|
273
|
-
'artifact-export-package',
|
|
274
|
-
'artifact-promote-knowledge',
|
|
275
|
-
'artifact-insert-document',
|
|
276
|
-
'artifact-attach-document',
|
|
277
|
-
'document-artifacts',
|
|
278
|
-
'artifact-flow',
|
|
279
|
-
'artifact-show-source',
|
|
259
|
+
'document-insert-artifact',
|
|
260
|
+
'document-attach-artifact',
|
|
280
261
|
], available);
|
|
281
262
|
const modelCompareActions = existingActions([
|
|
282
263
|
'document-run-compare',
|
|
@@ -287,12 +268,6 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
287
268
|
'document-apply-compare',
|
|
288
269
|
'document-record-route-decision',
|
|
289
270
|
'document-export-compare',
|
|
290
|
-
'artifact-review-compare',
|
|
291
|
-
'artifact-diff-handoffs',
|
|
292
|
-
'artifact-judge-compare',
|
|
293
|
-
'artifact-compare-analytics',
|
|
294
|
-
'artifact-apply-compare',
|
|
295
|
-
'artifact-export-compare',
|
|
296
271
|
'document-model-routing',
|
|
297
272
|
'account-main-model',
|
|
298
273
|
], available);
|
|
@@ -314,11 +289,11 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
314
289
|
&& hasTool(context, 'agent_knowledge_ingest')
|
|
315
290
|
&& Boolean(context.platform.artifactStore?.list)
|
|
316
291
|
&& Boolean(context.platform.artifactStore?.readContent)
|
|
317
|
-
&& artifactBrowserActions.includes('
|
|
318
|
-
&& artifactBrowserActions.includes('
|
|
319
|
-
&& artifactBrowserActions.includes('
|
|
320
|
-
&& artifactBrowserActions.includes('
|
|
321
|
-
&& artifactBrowserActions.includes('
|
|
292
|
+
&& artifactBrowserActions.includes('document-browse-artifacts')
|
|
293
|
+
&& artifactBrowserActions.includes('document-show-artifact')
|
|
294
|
+
&& artifactBrowserActions.includes('document-export-artifact-file')
|
|
295
|
+
&& artifactBrowserActions.includes('document-export-artifact-package')
|
|
296
|
+
&& artifactBrowserActions.includes('document-promote-artifact');
|
|
322
297
|
const reviewerReadiness = buildReviewerReadinessChecklist(context, {
|
|
323
298
|
documentsReady,
|
|
324
299
|
modelCompareReady,
|
|
@@ -337,7 +312,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
337
312
|
next: documentsReady
|
|
338
313
|
? 'Use versioned drafts, comments, suggestions, artifact reuse, artifact packages or ZIP archives, and artifact-backed comparison as one document workflow.'
|
|
339
314
|
: 'Wire agent_documents plus browse/show/create/revise/review/export workspace actions.',
|
|
340
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
315
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Create document draft',
|
|
341
316
|
modelRoute: documentsReady ? 'agent_documents' : 'agent_harness mode:"workspace_actions" categoryId:"documents"',
|
|
342
317
|
signals: [
|
|
343
318
|
`Chat route ${snapshot.provider} / ${snapshot.modelDisplayName}`,
|
|
@@ -363,7 +338,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
363
338
|
next: uploadActions.length > 0
|
|
364
339
|
? 'Use attach, paste, or reviewed source ingest depending on whether the file is prompt context or durable Agent Knowledge.'
|
|
365
340
|
: 'Wire upload, paste, and file ingest actions before exposing this as ready.',
|
|
366
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
341
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Attach or ingest',
|
|
367
342
|
modelRoute: 'agent_harness mode:"workspace_actions" query:"upload file ingest"',
|
|
368
343
|
signals: [
|
|
369
344
|
`${uploadActions.length} upload/ingest action(s)`,
|
|
@@ -378,7 +353,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
378
353
|
outcome: 'Turn conversations, sessions, documents, and saved artifacts into local files the user can keep or reuse.',
|
|
379
354
|
current: `${exportActions.length} export action(s) are reachable for conversation, session, document, comparison, and saved artifact output.`,
|
|
380
355
|
next: 'Keep transcript, session, document, comparison, and artifact exports visible, explicit, and reusable from one place.',
|
|
381
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
356
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Export',
|
|
382
357
|
modelRoute: 'agent_harness mode:"workspace_actions" query:"export artifact"',
|
|
383
358
|
signals: [
|
|
384
359
|
`${exportActions.length} export action(s)`,
|
|
@@ -393,7 +368,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
393
368
|
outcome: 'Know what must be resolved before exporting, handing off, archiving, or applying comparison-backed route changes.',
|
|
394
369
|
current: `${reviewerReadiness.summary.documents} document draft(s), ${reviewerReadiness.summary.openComments} open comment(s), ${reviewerReadiness.summary.proposedSuggestions} proposed suggestion(s), ${reviewerReadiness.summary.savedComparisons} saved comparison(s), ${reviewerReadiness.summary.revealedJudgments} revealed judgment(s).`,
|
|
395
370
|
next: reviewerReadiness.next,
|
|
396
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
371
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Review readiness preflight',
|
|
397
372
|
modelRoute: 'agent_harness mode:"document_ops_lane" laneId:"reviewer_readiness"',
|
|
398
373
|
signals: [
|
|
399
374
|
`Reviewer readiness ${reviewerReadiness.status}`,
|
|
@@ -423,9 +398,8 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
423
398
|
'document-export-compare',
|
|
424
399
|
].includes(id)),
|
|
425
400
|
...artifactBrowserActions.filter((id) => [
|
|
426
|
-
'
|
|
427
|
-
'
|
|
428
|
-
'artifact-export-package',
|
|
401
|
+
'document-browse-artifacts',
|
|
402
|
+
'document-show-artifact',
|
|
429
403
|
].includes(id)),
|
|
430
404
|
],
|
|
431
405
|
reviewerReadiness,
|
|
@@ -445,7 +419,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
445
419
|
? `${snapshot.reviewPacketTimeline.count} packet event(s); latest ${snapshot.reviewPacketTimeline.items[0].label}.`
|
|
446
420
|
: 'No document, artifact, comparison, judgment, handoff, archive, or route-decision packet events are available yet.',
|
|
447
421
|
next: snapshot.reviewPacketTimeline.next,
|
|
448
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
422
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Review packet timeline',
|
|
449
423
|
modelRoute: 'agent_harness mode:"document_ops_lane" laneId:"review_packet_timeline"',
|
|
450
424
|
signals: [
|
|
451
425
|
`Timeline available ${snapshot.reviewPacketTimeline.available ? 'yes' : 'no'}`,
|
|
@@ -471,9 +445,8 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
471
445
|
'document-export-compare',
|
|
472
446
|
].includes(id)),
|
|
473
447
|
...artifactBrowserActions.filter((id) => [
|
|
474
|
-
'
|
|
475
|
-
'
|
|
476
|
-
'artifact-export-package',
|
|
448
|
+
'document-browse-artifacts',
|
|
449
|
+
'document-show-artifact',
|
|
477
450
|
].includes(id)),
|
|
478
451
|
],
|
|
479
452
|
},
|
|
@@ -492,7 +465,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
492
465
|
? `${snapshot.reviewPacketWizard.completedSteps}/${snapshot.reviewPacketWizard.totalSteps} step(s) complete; current ${snapshot.reviewPacketWizard.currentStepLabel}.`
|
|
493
466
|
: `${snapshot.reviewPacketWizard.completedSteps}/${snapshot.reviewPacketWizard.totalSteps} step(s) complete.`,
|
|
494
467
|
next: snapshot.reviewPacketWizard.next,
|
|
495
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
468
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Review packet wizard',
|
|
496
469
|
modelRoute: 'agent_harness mode:"document_ops_lane" laneId:"review_packet_wizard"',
|
|
497
470
|
signals: [
|
|
498
471
|
`Wizard status ${snapshot.reviewPacketWizard.status}`,
|
|
@@ -516,7 +489,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
516
489
|
outcome: 'Inspect source-backed records before citing, summarizing, or promoting knowledge.',
|
|
517
490
|
current: `${sourceActions.length} source lookup/search action(s) are reachable through isolated Agent Knowledge.`,
|
|
518
491
|
next: 'Use source search/show for citation checks; ingest reviewed files or URLs only through explicit source actions.',
|
|
519
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
492
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Sources',
|
|
520
493
|
modelRoute: 'agent_harness mode:"workspace_actions" query:"Agent Knowledge sources"',
|
|
521
494
|
signals: [
|
|
522
495
|
`Knowledge route ${snapshot.knowledgeRoute}`,
|
|
@@ -533,7 +506,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
533
506
|
next: snapshot.mediaGenerationProviderCount > 0
|
|
534
507
|
? 'Use confirmed media generation when the user asks for a concrete artifact.'
|
|
535
508
|
: 'Configure a media generation provider before claiming generated media is ready.',
|
|
536
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
509
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Generate media',
|
|
537
510
|
modelRoute: 'agent_media_generate',
|
|
538
511
|
signals: [
|
|
539
512
|
`${mediaActions.length} media action(s)`,
|
|
@@ -559,8 +532,8 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
559
532
|
`Artifact browser tool: ${hasTool(context, 'agent_artifacts') ? 'available' : 'gap'}`,
|
|
560
533
|
`Knowledge ingest tool: ${hasTool(context, 'agent_knowledge_ingest') ? 'available' : 'gap'}`,
|
|
561
534
|
`Artifact list/read store: ${context.platform.artifactStore?.list && context.platform.artifactStore?.readContent ? 'available' : 'gap'}`,
|
|
562
|
-
`Artifact export action: ${artifactBrowserActions.includes('
|
|
563
|
-
`Artifact package export action: ${artifactBrowserActions.includes('
|
|
535
|
+
`Artifact export action: ${artifactBrowserActions.includes('document-export-artifact-file') ? 'available' : 'gap'}`,
|
|
536
|
+
`Artifact package export action: ${artifactBrowserActions.includes('document-export-artifact-package') ? 'available' : 'gap'}`,
|
|
564
537
|
`Knowledge promotion action: ${artifactBrowserActions.includes('artifact-promote-knowledge') ? 'available' : 'gap'}`,
|
|
565
538
|
`Document attachment action: ${artifactBrowserActions.includes('artifact-attach-document') ? 'available' : 'gap'}`,
|
|
566
539
|
`Document insertion action: ${artifactBrowserActions.includes('artifact-insert-document') ? 'available' : 'gap'}`,
|
|
@@ -578,7 +551,7 @@ function buildLanes(context: CommandContext): readonly DocumentOpsLane[] {
|
|
|
578
551
|
next: modelCompareReady
|
|
579
552
|
? 'Use cross-session synthesis and reviewer handoff ZIP archives around saved comparison, judgment, export, route-update, route-decision receipt, and source-artifact reuse artifacts.'
|
|
580
553
|
: 'Implement a blind compare runner with selectable candidate models, identical prompt/context, rubric capture, delayed reveal, export, and route update handoff.',
|
|
581
|
-
userRoute: 'Agent Workspace -> Documents &
|
|
554
|
+
userRoute: 'Agent Workspace -> Documents & Files -> Run blind compare',
|
|
582
555
|
modelRoute: modelCompareReady ? 'agent_model_compare' : 'models action:"status"',
|
|
583
556
|
signals: [
|
|
584
557
|
`Current model ${snapshot.provider} / ${snapshot.modelDisplayName}`,
|
|
@@ -78,20 +78,8 @@ function isRecoverableRoute(record: AgentExecutionRecord): boolean {
|
|
|
78
78
|
return tool.includes('write') || tool.includes('edit') || tool.includes('patch') || tool.includes('delete');
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
function toolInspectorAvailable(context: CommandContext): boolean {
|
|
82
|
-
return Boolean(context.workspace.panelManager?.getRegisteredTypes().some((panel) => panel.id === 'tools'));
|
|
83
|
-
}
|
|
84
|
-
|
|
85
81
|
function supervisionRoutes(context: CommandContext, record: AgentExecutionRecord): readonly Record<string, unknown>[] {
|
|
86
82
|
const routes: Record<string, unknown>[] = [];
|
|
87
|
-
if (toolInspectorAvailable(context)) {
|
|
88
|
-
routes.push({
|
|
89
|
-
id: 'tool-inspector',
|
|
90
|
-
label: 'Tool Call Inspector',
|
|
91
|
-
modelRoute: 'workspace action:"open_panel" panelId:"tools"',
|
|
92
|
-
requiresConfirmation: true,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
83
|
if (record.routeKind === 'shell') {
|
|
96
84
|
if (typeof context.openProcessModal === 'function') {
|
|
97
85
|
routes.push({
|
|
@@ -397,7 +385,7 @@ function describeRecord(
|
|
|
397
385
|
modelAccess: {
|
|
398
386
|
inspectHistory: 'execution action:"history"',
|
|
399
387
|
inspectRecord: routeForRecord(record),
|
|
400
|
-
toolInspector: '
|
|
388
|
+
toolInspector: 'execution action:"status"',
|
|
401
389
|
fileRecovery: 'execution action:"recovery"',
|
|
402
390
|
},
|
|
403
391
|
} : {}),
|
|
@@ -204,10 +204,6 @@ function describeCandidate(route: ExecutionRoute, context: CommandContext, toolR
|
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
-
function toolInspectorAvailable(context: CommandContext): boolean {
|
|
208
|
-
return Boolean(context.workspace.panelManager?.getRegisteredTypes().some((panel) => panel.id === 'tools'));
|
|
209
|
-
}
|
|
210
|
-
|
|
211
207
|
function executionSupervisionRoutes(context: CommandContext, route: ExecutionRoute): readonly ExecutionSupervisionRoute[] {
|
|
212
208
|
const routes: ExecutionSupervisionRoute[] = [];
|
|
213
209
|
if (route.id === 'local-shell-command') {
|
|
@@ -228,15 +224,6 @@ function executionSupervisionRoutes(context: CommandContext, route: ExecutionRou
|
|
|
228
224
|
},
|
|
229
225
|
);
|
|
230
226
|
}
|
|
231
|
-
if (route.id === 'local-shell-command' || route.id === 'local-edit-write') {
|
|
232
|
-
routes.push({
|
|
233
|
-
id: 'tool-inspector',
|
|
234
|
-
label: 'Tool Call Inspector',
|
|
235
|
-
available: toolInspectorAvailable(context),
|
|
236
|
-
modelRoute: 'workspace action:"open_panel" panelId:"tools"',
|
|
237
|
-
requiresConfirmation: true,
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
227
|
return routes;
|
|
241
228
|
}
|
|
242
229
|
|
|
@@ -244,11 +231,9 @@ function executionSupervisionSummary(context: CommandContext): Record<string, un
|
|
|
244
231
|
return {
|
|
245
232
|
processMonitorAvailable: typeof context.openProcessModal === 'function',
|
|
246
233
|
liveTailAvailable: typeof context.openLiveTail === 'function',
|
|
247
|
-
toolInspectorAvailable: toolInspectorAvailable(context),
|
|
248
234
|
routes: [
|
|
249
235
|
'workspace action:"open" surfaceId:"process-monitor"',
|
|
250
236
|
'workspace action:"open" surfaceId:"live-tail"',
|
|
251
|
-
'workspace action:"open_panel" panelId:"tools"',
|
|
252
237
|
],
|
|
253
238
|
};
|
|
254
239
|
}
|
|
@@ -310,30 +310,37 @@ function keybindingOperationRoute(action: KeyAction): KeybindingOperationRoute {
|
|
|
310
310
|
confirmation: 'agent_harness mode:"run_keybinding" requires confirm:true and explicitUserRequest.',
|
|
311
311
|
note: 'Runs the available clear-screen route.',
|
|
312
312
|
};
|
|
313
|
-
case '
|
|
313
|
+
case 'sidebar-toggle':
|
|
314
|
+
return {
|
|
315
|
+
supported: false,
|
|
316
|
+
effect: 'visible-ui-navigation',
|
|
317
|
+
confirmation: 'Direct user interaction only.',
|
|
318
|
+
note: 'Shows or hides the activity sidebar. Layout preferences stay under user control.',
|
|
319
|
+
};
|
|
320
|
+
case 'workspace-picker':
|
|
314
321
|
return {
|
|
315
322
|
supported: true,
|
|
316
323
|
effect: 'visible-ui-navigation',
|
|
317
324
|
preferredMode: 'run_keybinding',
|
|
318
325
|
surfaceId: 'agent-workspace',
|
|
319
326
|
confirmation: 'agent_harness mode:"run_keybinding" requires confirm:true and explicitUserRequest.',
|
|
320
|
-
note: 'Opens the
|
|
327
|
+
note: 'Opens the Agent workspace home.',
|
|
321
328
|
};
|
|
322
|
-
case '
|
|
329
|
+
case 'workspace-close':
|
|
323
330
|
return {
|
|
324
331
|
supported: true,
|
|
325
332
|
effect: 'visible-ui-navigation',
|
|
326
333
|
preferredMode: 'run_keybinding',
|
|
327
334
|
confirmation: 'agent_harness mode:"run_keybinding" requires confirm:true and explicitUserRequest.',
|
|
328
|
-
note: 'Dismisses Agent workspace
|
|
335
|
+
note: 'Dismisses the Agent workspace.',
|
|
329
336
|
};
|
|
330
|
-
case '
|
|
337
|
+
case 'workspace-close-all':
|
|
331
338
|
return {
|
|
332
339
|
supported: true,
|
|
333
340
|
effect: 'visible-ui-navigation',
|
|
334
341
|
preferredMode: 'run_keybinding',
|
|
335
342
|
confirmation: 'agent_harness mode:"run_keybinding" requires confirm:true and explicitUserRequest.',
|
|
336
|
-
note: 'Dismisses Agent workspace
|
|
343
|
+
note: 'Dismisses the Agent workspace (alias chord: Ctrl+Shift+X has the same effect as Ctrl+X).',
|
|
337
344
|
};
|
|
338
345
|
case 'history-search':
|
|
339
346
|
return {
|
|
@@ -373,8 +380,8 @@ function keybindingOperationRoute(action: KeyAction): KeybindingOperationRoute {
|
|
|
373
380
|
confirmation: 'agent_harness mode:"run_keybinding" requires confirm:true and explicitUserRequest.',
|
|
374
381
|
note: 'Opens the visible nearest-block actions surface. The exact block action remains an interactive visible-shell selection because it depends on cursor/scroll position.',
|
|
375
382
|
};
|
|
376
|
-
case '
|
|
377
|
-
case '
|
|
383
|
+
case 'workspace-tab-next':
|
|
384
|
+
case 'workspace-tab-prev':
|
|
378
385
|
return {
|
|
379
386
|
supported: false,
|
|
380
387
|
effect: 'visible-ui-navigation',
|
|
@@ -558,17 +565,17 @@ export function runHarnessKeybinding(context: CommandContext, args: HarnessKeybi
|
|
|
558
565
|
if (!context.clearScreen) return runUnavailable(resolved.action, route, 'Clear-screen route is unavailable.');
|
|
559
566
|
context.clearScreen();
|
|
560
567
|
return { status: 'executed', action: resolved.action, effect: 'screen-clear', keybinding: descriptor };
|
|
561
|
-
case '
|
|
562
|
-
if (context.
|
|
563
|
-
context.
|
|
564
|
-
return { status: 'executed', action: resolved.action, effect: 'agent-workspace-opened', route: '
|
|
568
|
+
case 'workspace-picker':
|
|
569
|
+
if (context.openWorkspacePicker) {
|
|
570
|
+
context.openWorkspacePicker();
|
|
571
|
+
return { status: 'executed', action: resolved.action, effect: 'agent-workspace-opened', route: 'openWorkspacePicker', keybinding: descriptor };
|
|
565
572
|
}
|
|
566
573
|
if (context.openAgentWorkspace) {
|
|
567
574
|
context.openAgentWorkspace('home');
|
|
568
575
|
return { status: 'executed', action: resolved.action, effect: 'agent-workspace-opened', route: 'openAgentWorkspace', categoryId: 'home', keybinding: descriptor };
|
|
569
576
|
}
|
|
570
|
-
return runUnavailable(resolved.action, route, 'No
|
|
571
|
-
case '
|
|
577
|
+
return runUnavailable(resolved.action, route, 'No workspace picker or Agent workspace route is available.');
|
|
578
|
+
case 'workspace-close': {
|
|
572
579
|
const dismissedAgentWorkspace = context.dismissAgentWorkspace?.() ?? false;
|
|
573
580
|
if (dismissedAgentWorkspace) {
|
|
574
581
|
return {
|
|
@@ -579,20 +586,17 @@ export function runHarnessKeybinding(context: CommandContext, args: HarnessKeybi
|
|
|
579
586
|
keybinding: descriptor,
|
|
580
587
|
};
|
|
581
588
|
}
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
if (!active && !context.focusPrompt) return runUnavailable(resolved.action, route, 'No active Agent workspace, active panel, or prompt focus route is available.');
|
|
585
|
-
if (context.focusPrompt) context.focusPrompt();
|
|
589
|
+
if (!context.focusPrompt) return runUnavailable(resolved.action, route, 'No active Agent workspace or prompt focus route is available.');
|
|
590
|
+
context.focusPrompt();
|
|
586
591
|
context.renderRequest();
|
|
587
592
|
return {
|
|
588
593
|
status: 'executed',
|
|
589
594
|
action: resolved.action,
|
|
590
|
-
effect:
|
|
591
|
-
...(active ? { panelId: active.id } : {}),
|
|
595
|
+
effect: 'prompt-focused',
|
|
592
596
|
keybinding: descriptor,
|
|
593
597
|
};
|
|
594
598
|
}
|
|
595
|
-
case '
|
|
599
|
+
case 'workspace-close-all': {
|
|
596
600
|
const dismissedAgentWorkspace = context.dismissAgentWorkspace?.() ?? false;
|
|
597
601
|
if (dismissedAgentWorkspace) {
|
|
598
602
|
return {
|
|
@@ -603,18 +607,13 @@ export function runHarnessKeybinding(context: CommandContext, args: HarnessKeybi
|
|
|
603
607
|
keybinding: descriptor,
|
|
604
608
|
};
|
|
605
609
|
}
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
for (const panel of openPanels) managerPanel?.close(panel.id);
|
|
609
|
-
managerPanel?.hide();
|
|
610
|
-
if (openPanels.length === 0 && !context.focusPrompt) return runUnavailable(resolved.action, route, 'No active Agent workspace, open panels, or prompt focus route is available.');
|
|
611
|
-
if (context.focusPrompt) context.focusPrompt();
|
|
610
|
+
if (!context.focusPrompt) return runUnavailable(resolved.action, route, 'No active Agent workspace or prompt focus route is available.');
|
|
611
|
+
context.focusPrompt();
|
|
612
612
|
context.renderRequest();
|
|
613
613
|
return {
|
|
614
614
|
status: 'executed',
|
|
615
615
|
action: resolved.action,
|
|
616
|
-
effect: '
|
|
617
|
-
closedPanels: openPanels.map((panel) => panel.id),
|
|
616
|
+
effect: 'prompt-focused',
|
|
618
617
|
keybinding: descriptor,
|
|
619
618
|
};
|
|
620
619
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CommandContext } from '../input/command-registry.ts';
|
|
2
|
+
import { estimateModelBytes, fitAssessment, fitVerdictLabel, readHardwareProfileSync, REPRESENTATIVE_7B_PARAMS } from '../core/hardware-profile.ts';
|
|
2
3
|
import { previewHarnessText } from './agent-harness-text.ts';
|
|
3
4
|
import { localModelDetection, localModelServerHealthMap } from './agent-harness-local-model-endpoints.ts';
|
|
4
5
|
import { localHardwareProfile, localRecipeReadinessScore, localRecipeStackId, scoreLocalModelRecipe } from './agent-harness-model-readiness.ts';
|
|
@@ -83,6 +84,21 @@ export function localModelSetupPlan(
|
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Representative Q4 parameter count for a recipe's default/starter model.
|
|
89
|
+
* Used to estimate memory footprint for hardware fit annotation.
|
|
90
|
+
* Returns null for stacks where size is too variable to estimate safely.
|
|
91
|
+
*/
|
|
92
|
+
function recipeRepresentativeParamCount(recipe: LocalModelRecipe): number | null {
|
|
93
|
+
// Uses the shared REPRESENTATIVE_7B_PARAMS constant so the renderer and cookbook
|
|
94
|
+
// always reference the same basis.
|
|
95
|
+
// The generic openai-compatible stack is too varied to estimate.
|
|
96
|
+
if (recipe.id === 'ollama' || recipe.id === 'llama-cpp' || recipe.id === 'vllm') {
|
|
97
|
+
return REPRESENTATIVE_7B_PARAMS;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
|
|
86
102
|
export function localModelRecipes(): readonly LocalModelRecipe[] {
|
|
87
103
|
return [
|
|
88
104
|
{
|
|
@@ -175,7 +191,14 @@ export function describeLocalModelRecipe(
|
|
|
175
191
|
hardware: previewHarnessText(recipe.hardware, includeParameters ? 180 : 96),
|
|
176
192
|
hardwareMatched: fit.reasons.slice(0, includeParameters ? 6 : 3),
|
|
177
193
|
detected,
|
|
178
|
-
|
|
194
|
+
modelRoute: 'models action:"status" or agent_harness mode:"open_ui_surface"',
|
|
195
|
+
...(() => {
|
|
196
|
+
const paramCount = recipeRepresentativeParamCount(recipe);
|
|
197
|
+
if (paramCount === null) return {};
|
|
198
|
+
const sizeBytes = estimateModelBytes(paramCount);
|
|
199
|
+
const label = fitVerdictLabel(fitAssessment(sizeBytes, readHardwareProfileSync()));
|
|
200
|
+
return label ? { hardwareFit: label } : {};
|
|
201
|
+
})(),
|
|
179
202
|
...(includeParameters ? {
|
|
180
203
|
setup: recipe.setup,
|
|
181
204
|
modelExamples: recipe.modelExamples,
|
|
@@ -204,6 +204,22 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
|
|
|
204
204
|
boundary: 'Connected schedules require an explicit user request and do not create hidden Agent jobs or local schedulers.',
|
|
205
205
|
};
|
|
206
206
|
}
|
|
207
|
+
if (root === 'email') {
|
|
208
|
+
return {
|
|
209
|
+
effect: 'external-network',
|
|
210
|
+
confirmation,
|
|
211
|
+
preferredModelTool: `${agentHarnessModes('run_command')} (use /email set to configure, /email config to view settings)`,
|
|
212
|
+
boundary: 'Email IMAP reads are read-only (EXAMINE); sends require explicit --yes confirmation and route only to the configured account. Use /email set email.<key> <value> to configure email settings; use /email config to view current settings. The generic settings action cannot set email.* keys — /email set is the only supported path.',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
if (root === 'calendar' || root === 'cal') {
|
|
216
|
+
return {
|
|
217
|
+
effect: 'local-state',
|
|
218
|
+
confirmation,
|
|
219
|
+
preferredModelTool: agentHarnessModes('run_command'),
|
|
220
|
+
boundary: 'Calendar commands manage local ICS events only; import/export and mutations require explicit --yes confirmation. Calendar configuration is set via /calendar subcommands, not the generic settings action.',
|
|
221
|
+
};
|
|
222
|
+
}
|
|
207
223
|
if (root === 'channels' || root === 'channel' || root === 'notify') {
|
|
208
224
|
return {
|
|
209
225
|
effect: 'external-network',
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AGENT_HARNESS_MODES } from './agent-harness-tool-schema.ts';
|
|
2
|
+
import { readLimit } from './agent-harness-tool-utils.ts';
|
|
2
3
|
|
|
3
4
|
export type AgentHarnessMode = typeof AGENT_HARNESS_MODES[number];
|
|
4
5
|
|
|
@@ -35,9 +36,6 @@ export const HARNESS_MODE_DESCRIPTORS: readonly HarnessModeDescriptor[] = [
|
|
|
35
36
|
{ id: 'route_decision', kind: 'inspect', family: 'start', summary: 'Choose the best visible Agent route for a plain user task.', next: 'Prefer route action:"plan" for first-class access.', keywords: ['where should this go', 'which tool', 'route user task', 'one assistant', 'user-first route'], parameters: ['query', 'target', 'limit', 'includeParameters'] },
|
|
36
37
|
{ id: 'cli_commands', kind: 'discover', family: 'cli', summary: 'List top-level package CLI mirrors for discovery only.', next: 'Prefer workspace action:"cli_commands|cli_command".', parameters: ['query', 'limit', 'includeParameters'] },
|
|
37
38
|
{ id: 'cli_command', kind: 'inspect', family: 'cli', summary: 'Inspect one CLI command parser result, policy, aliases, and model route.', parameters: ['cliCommand', 'command', 'commandName', 'target', 'query'] },
|
|
38
|
-
{ id: 'panels', kind: 'discover', family: 'ui', summary: 'List built-in panel catalog state and workspace routes.', next: 'Prefer workspace action:"panels|panel|open_panel".', parameters: ['query', 'category', 'limit', 'includeParameters'] },
|
|
39
|
-
{ id: 'panel', kind: 'inspect', family: 'ui', summary: 'Inspect one built-in panel, open state, workspace route, and policy.', parameters: ['panelId', 'target', 'query'] },
|
|
40
|
-
{ id: 'open_panel', kind: 'effect', family: 'ui', summary: 'Route the visible shell to one built-in panel.', requiresConfirmation: true, parameters: ['panelId', 'target', 'query', 'pane', 'confirm', 'explicitUserRequest'] },
|
|
41
39
|
{ id: 'ui_surfaces', kind: 'discover', family: 'ui', summary: 'List modal, picker, and visible UI surfaces the model can request.', next: 'Prefer workspace action:"surfaces|surface|open".', keywords: ['web dashboard', 'pwa', 'browser cockpit', 'connected browser', 'mobile web'], parameters: ['query', 'limit', 'includeParameters'] },
|
|
42
40
|
{ id: 'ui_surface', kind: 'inspect', family: 'ui', summary: 'Inspect one visible modal or picker surface and route contract.', keywords: ['web dashboard', 'pwa', 'browser cockpit', 'connected browser', 'mobile web'], parameters: ['surfaceId', 'target', 'query'] },
|
|
43
41
|
{ id: 'open_ui_surface', kind: 'effect', family: 'ui', summary: 'Open one visible modal, picker, or operator workspace route.', requiresConfirmation: true, keywords: ['web dashboard', 'pwa', 'browser cockpit', 'connected browser', 'mobile web'], parameters: ['surfaceId', 'target', 'query', 'confirm', 'explicitUserRequest'] },
|
|
@@ -147,18 +145,13 @@ export const HARNESS_MODE_DESCRIPTORS: readonly HarnessModeDescriptor[] = [
|
|
|
147
145
|
{ id: 'connected_host_capability', kind: 'inspect', family: 'connected-host', summary: 'Inspect one connected-host capability and blocked surfaces.', next: 'Prefer host action:"capability".', parameters: ['capabilityId', 'target', 'query'] },
|
|
148
146
|
{ id: 'daemon', kind: 'alias', family: 'connected-host', summary: 'GoodVibes daemon -> connected_host; mutations use confirmed methods.', next: 'Prefer host action:"capabilities".', aliases: ['connected_host'], parameters: ['includeParameters'] },
|
|
149
147
|
{ id: 'daemon_status', kind: 'alias', family: 'connected-host', summary: 'GoodVibes daemon status -> connected_host_status.', next: 'Prefer host action:"status".', aliases: ['connected_host_status'], parameters: ['includeParameters'] },
|
|
148
|
+
{ id: 'propose_skill_drafts', kind: 'effect', family: 'personal-ops', summary: 'Draft up to 3 skills from recent learning candidates for review.', requiresConfirmation: true, keywords: ['skill draft', 'propose skill', 'auto-propose', 'draft skills', 'learning draft'], parameters: ['confirm', 'explicitUserRequest'] },
|
|
150
149
|
] as const;
|
|
151
150
|
|
|
152
151
|
function readString(value: unknown): string {
|
|
153
152
|
return typeof value === 'string' ? value.trim() : '';
|
|
154
153
|
}
|
|
155
154
|
|
|
156
|
-
function readLimit(value: unknown, fallback: number): number {
|
|
157
|
-
const parsed = typeof value === 'string' && value.trim() ? Number(value) : value;
|
|
158
|
-
if (typeof parsed !== 'number' || !Number.isFinite(parsed)) return fallback;
|
|
159
|
-
return Math.max(1, Math.min(500, Math.trunc(parsed)));
|
|
160
|
-
}
|
|
161
|
-
|
|
162
155
|
function describeHarnessModeDescriptor(
|
|
163
156
|
descriptor: HarnessModeDescriptor,
|
|
164
157
|
options: { readonly includeParameters?: boolean; readonly lookup?: Record<string, unknown> } = {},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CommandContext } from '../input/command-registry.ts';
|
|
2
|
-
import type { ProviderAccountRecord, ProviderAccountSnapshot } from '../
|
|
3
|
-
import { buildProviderAccountSnapshot } from '../
|
|
2
|
+
import type { ProviderAccountRecord, ProviderAccountSnapshot } from '../runtime/provider-account-snapshot.ts';
|
|
3
|
+
import { buildProviderAccountSnapshot } from '../runtime/provider-account-snapshot.ts';
|
|
4
4
|
import { requireProvider, requireServiceRegistry, requireSubscriptionManager } from '../input/commands/runtime-services.ts';
|
|
5
5
|
import { previewHarnessText } from './agent-harness-text.ts';
|
|
6
6
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { statSync } from 'node:fs';
|
|
2
|
-
import { buildProviderAccountSnapshot } from '../
|
|
2
|
+
import { buildProviderAccountSnapshot } from '../runtime/provider-account-snapshot.ts';
|
|
3
3
|
import { requireLocalUserAuthManager, requirePlatform, requireProvider, requireSecretsManager, requireServiceRegistry, requireShellPaths, requireSubscriptionManager } from '../input/commands/runtime-services.ts';
|
|
4
4
|
import { collectOnboardingSnapshot } from '../runtime/onboarding/index.ts';
|
|
5
5
|
import type { CommandContext } from '../input/command-registry.ts';
|