@pellux/goodvibes-agent 0.1.117 → 1.0.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 +13 -4
- package/README.md +35 -14
- package/bin/goodvibes-agent.ts +16 -2
- package/dist/package/main.js +176073 -170980
- package/docs/README.md +11 -5
- package/docs/channels-remote-and-api.md +50 -0
- package/docs/connected-host.md +3 -3
- package/docs/getting-started.md +29 -15
- package/docs/knowledge-artifacts-and-multimodal.md +91 -0
- package/docs/project-planning.md +79 -0
- package/docs/providers-and-routing.md +46 -0
- package/docs/release-and-publishing.md +44 -9
- package/docs/tools-and-commands.md +123 -0
- package/docs/voice-and-live-tts.md +51 -0
- package/package.json +2 -5
- package/src/agent/channel-delivery.ts +201 -0
- package/src/agent/media-generation.ts +159 -0
- package/src/agent/memory-prompt.ts +0 -1
- package/src/agent/note-registry.ts +329 -0
- package/src/agent/operator-actions.ts +343 -0
- package/src/agent/persona-registry.ts +15 -14
- package/src/agent/record-labels.ts +107 -0
- package/src/agent/reminder-schedule-format.ts +33 -24
- package/src/agent/reminder-schedule.ts +26 -25
- package/src/agent/routine-registry.ts +13 -12
- package/src/agent/routine-schedule-args.ts +2 -1
- package/src/agent/routine-schedule-format.ts +77 -53
- package/src/agent/routine-schedule-promotion.ts +34 -32
- package/src/agent/routine-schedule-receipts.ts +28 -26
- package/src/agent/runtime-profile-starters.ts +2 -2
- package/src/agent/runtime-profile.ts +18 -17
- package/src/agent/skill-registry.ts +25 -24
- package/src/cli/agent-knowledge-args.ts +5 -1
- package/src/cli/agent-knowledge-command.ts +39 -33
- package/src/cli/agent-knowledge-format.ts +80 -67
- package/src/cli/agent-knowledge-methods.ts +1 -1
- package/src/cli/agent-knowledge-runtime.ts +32 -26
- package/src/cli/bundle-command.ts +13 -8
- package/src/cli/config-overrides.ts +37 -36
- package/src/cli/external-runtime.ts +10 -4
- package/src/cli/help.ts +29 -11
- package/src/cli/local-library-command.ts +134 -68
- package/src/cli/management-commands.ts +98 -62
- package/src/cli/management.ts +52 -26
- package/src/cli/memory-command.ts +66 -32
- package/src/cli/parser.ts +37 -24
- package/src/cli/profiles-command.ts +52 -35
- package/src/cli/provider-auth-routes.ts +2 -1
- package/src/cli/routines-command.ts +44 -36
- package/src/cli/service-posture.ts +6 -6
- package/src/cli/status.ts +46 -121
- package/src/core/conversation-message-snapshot.ts +131 -0
- package/src/input/agent-workspace-activation.ts +33 -7
- package/src/input/agent-workspace-basic-command-editor-submission.ts +7 -3
- package/src/input/agent-workspace-basic-command-editors.ts +30 -10
- package/src/input/agent-workspace-categories.ts +276 -64
- package/src/input/agent-workspace-channel-command-editor-submission.ts +34 -0
- package/src/input/agent-workspace-channel-command-editors.ts +23 -5
- package/src/input/agent-workspace-channels.ts +35 -2
- package/src/input/agent-workspace-command-editor.ts +18 -2
- package/src/input/agent-workspace-config-reader.ts +16 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +1 -1
- package/src/input/agent-workspace-editors.ts +140 -2
- package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
- package/src/input/agent-workspace-learned-behavior.ts +2 -2
- package/src/input/agent-workspace-library-command-editor-submission.ts +1 -1
- package/src/input/agent-workspace-library-command-editors.ts +2 -2
- package/src/input/agent-workspace-local-operations.ts +218 -0
- package/src/input/agent-workspace-local-selection.ts +75 -0
- package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
- package/src/input/agent-workspace-media-command-editors.ts +27 -0
- package/src/input/agent-workspace-memory-command-editors.ts +1 -1
- package/src/input/agent-workspace-memory-editor.ts +2 -2
- package/src/input/agent-workspace-navigation.ts +38 -2
- package/src/input/agent-workspace-notify-editor-submission.ts +16 -2
- package/src/input/agent-workspace-operations-command-editor-submission.ts +63 -1
- package/src/input/agent-workspace-operations-command-editors.ts +80 -3
- package/src/input/agent-workspace-panel-route.ts +43 -0
- package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
- package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
- package/src/input/agent-workspace-search.ts +169 -0
- package/src/input/agent-workspace-setup.ts +22 -11
- package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +6 -6
- package/src/input/agent-workspace-skill-bundle-command-editors.ts +10 -10
- package/src/input/agent-workspace-snapshot.ts +112 -13
- package/src/input/agent-workspace-task-command-editors.ts +4 -4
- package/src/input/agent-workspace-token.ts +18 -2
- package/src/input/agent-workspace-types.ts +92 -4
- package/src/input/agent-workspace-voice-media.ts +3 -6
- package/src/input/agent-workspace-web-research-editor.ts +104 -0
- package/src/input/agent-workspace.ts +136 -208
- package/src/input/command-registry.ts +4 -1
- package/src/input/commands/agent-runtime-profile-runtime.ts +45 -41
- package/src/input/commands/agent-skills-runtime.ts +83 -70
- package/src/input/commands/agent-workspace-runtime.ts +23 -7
- package/src/input/commands/brief-runtime.ts +25 -24
- package/src/input/commands/channels-runtime.ts +145 -31
- package/src/input/commands/delegation-runtime.ts +29 -23
- package/src/input/commands/experience-runtime.ts +6 -4
- package/src/input/commands/guidance-runtime.ts +4 -4
- package/src/input/commands/health-runtime.ts +140 -115
- package/src/input/commands/knowledge.ts +57 -56
- package/src/input/commands/local-provider-runtime.ts +36 -18
- package/src/input/commands/local-runtime.ts +138 -16
- package/src/input/commands/local-setup-review.ts +7 -7
- package/src/input/commands/mcp-runtime.ts +56 -35
- package/src/input/commands/notify-runtime.ts +38 -9
- package/src/input/commands/operator-actions-runtime.ts +138 -0
- package/src/input/commands/operator-runtime.ts +6 -17
- package/src/input/commands/personas-runtime.ts +45 -30
- package/src/input/commands/planning-runtime.ts +1 -1
- package/src/input/commands/platform-access-runtime.ts +29 -29
- package/src/input/commands/provider-accounts-runtime.ts +60 -39
- package/src/input/commands/qrcode-runtime.ts +45 -6
- package/src/input/commands/recall-bundle.ts +11 -11
- package/src/input/commands/recall-capture.ts +13 -11
- package/src/input/commands/recall-query.ts +29 -21
- package/src/input/commands/recall-review.ts +2 -1
- package/src/input/commands/routines-runtime.ts +59 -43
- package/src/input/commands/schedule-runtime.ts +33 -20
- package/src/input/commands/security-runtime.ts +4 -4
- package/src/input/commands/session-content.ts +80 -78
- package/src/input/commands/session-workflow.ts +132 -93
- package/src/input/commands/session.ts +3 -174
- package/src/input/commands/shell-core.ts +32 -17
- package/src/input/commands/subscription-runtime.ts +53 -179
- package/src/input/commands/tasks-runtime.ts +20 -20
- package/src/input/commands/work-plan-runtime.ts +33 -8
- package/src/input/commands.ts +2 -2
- package/src/input/feed-context-factory.ts +2 -1
- package/src/input/file-picker.ts +3 -2
- package/src/input/handler-command-route.ts +4 -7
- package/src/input/handler-content-actions.ts +89 -1
- package/src/input/handler-feed-routes.ts +19 -12
- package/src/input/handler-feed.ts +6 -3
- package/src/input/handler-interactions.ts +7 -5
- package/src/input/handler-modal-stack.ts +3 -3
- package/src/input/handler-onboarding.ts +24 -80
- package/src/input/handler-shortcuts.ts +15 -4
- package/src/input/handler.ts +47 -17
- package/src/input/input-history.ts +5 -6
- package/src/input/keybindings.ts +22 -11
- package/src/input/onboarding/onboarding-wizard-apply.ts +13 -0
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
- package/src/input/onboarding/onboarding-wizard-operator-steps.ts +147 -57
- package/src/input/onboarding/onboarding-wizard-steps.ts +46 -29
- package/src/input/onboarding/onboarding-wizard-types.ts +3 -1
- package/src/input/onboarding/onboarding-wizard.ts +68 -0
- package/src/input/profile-picker-modal.ts +31 -12
- package/src/input/session-picker-modal.ts +21 -4
- package/src/input/settings-modal-behavior.ts +0 -3
- package/src/input/settings-modal-subscriptions.ts +3 -3
- package/src/input/settings-modal-types.ts +2 -13
- package/src/input/settings-modal.ts +6 -52
- package/src/input/submission-intent.ts +0 -1
- package/src/input/submission-router.ts +3 -3
- package/src/main.ts +18 -8
- package/src/panels/approval-panel.ts +8 -8
- package/src/panels/automation-control-panel.ts +2 -2
- package/src/panels/base-panel.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -1
- package/src/panels/builtin/operations.ts +1 -10
- package/src/panels/builtin/session.ts +9 -9
- package/src/panels/builtin/shared.ts +2 -2
- package/src/panels/cost-tracker-panel.ts +1 -1
- package/src/panels/docs-panel.ts +5 -3
- package/src/panels/index.ts +0 -1
- package/src/panels/knowledge-panel.ts +6 -5
- package/src/panels/memory-panel.ts +7 -6
- package/src/panels/panel-list-panel.ts +36 -80
- package/src/panels/project-planning-panel.ts +18 -11
- package/src/panels/provider-account-snapshot.ts +51 -25
- package/src/panels/provider-accounts-panel.ts +33 -18
- package/src/panels/provider-health-domains.ts +45 -4
- package/src/panels/provider-health-panel.ts +5 -4
- package/src/panels/qr-panel.ts +1 -1
- package/src/panels/schedule-panel.ts +9 -17
- package/src/panels/security-panel.ts +8 -8
- package/src/panels/session-browser-panel.ts +10 -10
- package/src/panels/subscription-panel.ts +3 -3
- package/src/panels/system-messages-panel.ts +1 -1
- package/src/panels/tasks-panel.ts +20 -13
- package/src/panels/tool-inspector-panel.ts +19 -12
- package/src/panels/work-plan-panel.ts +5 -5
- package/src/planning/project-planning-coordinator.ts +1 -1
- package/src/provider-auth-route-display.ts +9 -0
- package/src/renderer/agent-workspace-style.ts +34 -0
- package/src/renderer/agent-workspace.ts +228 -52
- package/src/renderer/autocomplete-overlay.ts +25 -6
- package/src/renderer/bookmark-modal.ts +19 -4
- package/src/renderer/buffer.ts +4 -2
- package/src/renderer/context-inspector.ts +50 -13
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +19 -6
- package/src/renderer/help-overlay.ts +106 -33
- package/src/renderer/history-search-overlay.ts +19 -4
- package/src/renderer/live-tail-modal.ts +27 -5
- package/src/renderer/mcp-workspace.ts +164 -50
- package/src/renderer/model-picker-overlay.ts +58 -2
- package/src/renderer/model-workspace.ts +104 -20
- package/src/renderer/process-modal.ts +27 -6
- package/src/renderer/profile-picker-modal.ts +20 -4
- package/src/renderer/search-overlay.ts +25 -5
- package/src/renderer/selection-modal-overlay.ts +46 -14
- package/src/renderer/session-picker-modal.ts +18 -1
- package/src/renderer/settings-modal-helpers.ts +2 -40
- package/src/renderer/settings-modal.ts +83 -50
- package/src/renderer/tool-call.ts +20 -11
- package/src/runtime/agent-runtime-events.ts +6 -6
- package/src/runtime/bootstrap-command-context.ts +7 -1
- package/src/runtime/bootstrap-command-parts.ts +9 -7
- package/src/runtime/bootstrap-core.ts +19 -1
- package/src/runtime/bootstrap-hook-bridge.ts +7 -18
- package/src/runtime/bootstrap-shell.ts +4 -4
- package/src/runtime/bootstrap.ts +31 -22
- package/src/runtime/connected-host-auth.ts +7 -2
- package/src/runtime/diagnostics/panels/index.ts +2 -2
- package/src/runtime/diagnostics/panels/policy.ts +7 -7
- package/src/runtime/index.ts +2 -1
- package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
- package/src/runtime/onboarding/apply.ts +80 -79
- package/src/runtime/onboarding/derivation.ts +5 -8
- package/src/runtime/onboarding/snapshot.ts +0 -15
- package/src/runtime/onboarding/types.ts +8 -19
- package/src/runtime/onboarding/verify.ts +32 -10
- package/src/runtime/operator-token-cleanup.ts +1 -1
- package/src/runtime/services.ts +91 -22
- package/src/runtime/store/selectors/index.ts +3 -3
- package/src/runtime/store/state.ts +1 -4
- package/src/runtime/surface-feature-flags.ts +41 -6
- package/src/runtime/ui-read-models.ts +3 -4
- package/src/runtime/ui-services.ts +6 -6
- package/src/shell/blocking-input.ts +2 -1
- package/src/shell/ui-openers.ts +3 -13
- package/src/tools/agent-analysis-registry-policy.ts +0 -1
- package/src/tools/agent-channel-send-tool.ts +133 -0
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
- package/src/tools/agent-knowledge-tool.ts +170 -0
- package/src/tools/agent-local-registry-tool.ts +269 -69
- package/src/tools/agent-media-generate-tool.ts +133 -0
- package/src/tools/agent-notify-tool.ts +143 -0
- package/src/tools/agent-operator-action-tool.ts +137 -0
- package/src/tools/agent-operator-briefing-tool.ts +217 -0
- package/src/tools/agent-reminder-schedule-tool.ts +237 -0
- package/src/tools/agent-tool-policy-guard.ts +8 -8
- package/src/tools/agent-work-plan-tool.ts +256 -0
- package/src/version.ts +1 -1
- package/src/input/commands/policy-dispatch.ts +0 -339
- package/src/input/commands/policy.ts +0 -13
- package/src/panels/panel-picker.ts +0 -105
- package/src/panels/policy-panel.ts +0 -308
- package/src/renderer/panel-picker-overlay.ts +0 -202
|
@@ -2,7 +2,24 @@ import type { AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agen
|
|
|
2
2
|
|
|
3
3
|
export type AgentWorkspaceOperationsCommandEditorKind = Extract<
|
|
4
4
|
AgentWorkspaceEditorKind,
|
|
5
|
-
|
|
5
|
+
| 'plan-seed'
|
|
6
|
+
| 'plan-show'
|
|
7
|
+
| 'plan-approve'
|
|
8
|
+
| 'plan-override'
|
|
9
|
+
| 'plan-clear'
|
|
10
|
+
| 'health-repair'
|
|
11
|
+
| 'approval-review'
|
|
12
|
+
| 'approval-approve'
|
|
13
|
+
| 'approval-deny'
|
|
14
|
+
| 'approval-cancel'
|
|
15
|
+
| 'automation-job-run'
|
|
16
|
+
| 'automation-job-pause'
|
|
17
|
+
| 'automation-job-resume'
|
|
18
|
+
| 'automation-run-cancel'
|
|
19
|
+
| 'automation-run-retry'
|
|
20
|
+
| 'schedule-run'
|
|
21
|
+
| 'routine-receipt'
|
|
22
|
+
| 'schedule-receipt'
|
|
6
23
|
>;
|
|
7
24
|
|
|
8
25
|
export function isAgentWorkspaceOperationsCommandEditorKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceOperationsCommandEditorKind {
|
|
@@ -13,6 +30,15 @@ export function isAgentWorkspaceOperationsCommandEditorKind(kind: AgentWorkspace
|
|
|
13
30
|
|| kind === 'plan-clear'
|
|
14
31
|
|| kind === 'health-repair'
|
|
15
32
|
|| kind === 'approval-review'
|
|
33
|
+
|| kind === 'approval-approve'
|
|
34
|
+
|| kind === 'approval-deny'
|
|
35
|
+
|| kind === 'approval-cancel'
|
|
36
|
+
|| kind === 'automation-job-run'
|
|
37
|
+
|| kind === 'automation-job-pause'
|
|
38
|
+
|| kind === 'automation-job-resume'
|
|
39
|
+
|| kind === 'automation-run-cancel'
|
|
40
|
+
|| kind === 'automation-run-retry'
|
|
41
|
+
|| kind === 'schedule-run'
|
|
16
42
|
|| kind === 'routine-receipt'
|
|
17
43
|
|| kind === 'schedule-receipt';
|
|
18
44
|
}
|
|
@@ -24,7 +50,7 @@ export function createAgentWorkspaceOperationsCommandEditor(kind: AgentWorkspace
|
|
|
24
50
|
mode: 'create',
|
|
25
51
|
title: 'Seed Planning Goal',
|
|
26
52
|
selectedFieldIndex: 0,
|
|
27
|
-
message: 'Seed Agent planning state from a concrete goal. This stays in the main Agent planning flow and does not
|
|
53
|
+
message: 'Seed Agent planning state from a concrete goal. This stays in the main Agent planning flow and does not create coding-role Agent jobs.',
|
|
28
54
|
fields: [
|
|
29
55
|
{ id: 'goal', label: 'Planning goal', value: '', required: true, multiline: true, hint: 'Describe the goal or operating plan to evaluate. Ctrl-J inserts a new line.' },
|
|
30
56
|
],
|
|
@@ -36,7 +62,7 @@ export function createAgentWorkspaceOperationsCommandEditor(kind: AgentWorkspace
|
|
|
36
62
|
mode: 'create',
|
|
37
63
|
title: 'Show Health Repair Guidance',
|
|
38
64
|
selectedFieldIndex: 0,
|
|
39
|
-
message: 'Show health repair guidance for one domain. Agent does not
|
|
65
|
+
message: 'Show health repair guidance for one domain. Agent does not manage connected-host hosting or mutate connected-host lifecycle.',
|
|
40
66
|
fields: [
|
|
41
67
|
{ id: 'domain', label: 'Domain', value: 'settings', required: true, multiline: false, hint: 'settings, auth, accounts, host, remote, mcp, continuity, or maintenance.' },
|
|
42
68
|
],
|
|
@@ -54,6 +80,57 @@ export function createAgentWorkspaceOperationsCommandEditor(kind: AgentWorkspace
|
|
|
54
80
|
],
|
|
55
81
|
};
|
|
56
82
|
}
|
|
83
|
+
if (kind === 'approval-approve' || kind === 'approval-deny' || kind === 'approval-cancel') {
|
|
84
|
+
const verb = kind === 'approval-approve' ? 'Approve' : kind === 'approval-deny' ? 'Deny' : 'Cancel';
|
|
85
|
+
return {
|
|
86
|
+
kind,
|
|
87
|
+
mode: 'update',
|
|
88
|
+
title: `${verb} Approval`,
|
|
89
|
+
selectedFieldIndex: 0,
|
|
90
|
+
message: `${verb} one pending connected-host approval request. This is an explicit operator action and requires typed confirmation.`,
|
|
91
|
+
fields: [
|
|
92
|
+
{ id: 'approvalId', label: 'Approval id', value: '', required: true, multiline: false, hint: 'Approval request id from the approval list.' },
|
|
93
|
+
{ id: 'note', label: 'Note', value: '', required: false, multiline: true, hint: 'Optional approval note. Ctrl-J inserts a new line.' },
|
|
94
|
+
{ id: 'remember', label: 'Remember', value: '', required: false, multiline: false, hint: 'yes/no when you explicitly want to set the connected-host remember flag; blank leaves it unset.' },
|
|
95
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: `Type yes to run /approval ${kind.replace('approval-', '')} with --yes.` },
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (
|
|
100
|
+
kind === 'automation-job-run'
|
|
101
|
+
|| kind === 'automation-job-pause'
|
|
102
|
+
|| kind === 'automation-job-resume'
|
|
103
|
+
|| kind === 'automation-run-cancel'
|
|
104
|
+
|| kind === 'automation-run-retry'
|
|
105
|
+
|| kind === 'schedule-run'
|
|
106
|
+
) {
|
|
107
|
+
const job = kind.startsWith('automation-job-');
|
|
108
|
+
const run = kind.startsWith('automation-run-');
|
|
109
|
+
const label = job ? 'Job id' : run ? 'Run id' : 'Schedule id';
|
|
110
|
+
const field = job ? 'jobId' : run ? 'runId' : 'scheduleId';
|
|
111
|
+
const action = kind === 'automation-job-run'
|
|
112
|
+
? 'Run Automation Job'
|
|
113
|
+
: kind === 'automation-job-pause'
|
|
114
|
+
? 'Pause Automation Job'
|
|
115
|
+
: kind === 'automation-job-resume'
|
|
116
|
+
? 'Resume Automation Job'
|
|
117
|
+
: kind === 'automation-run-cancel'
|
|
118
|
+
? 'Cancel Automation Run'
|
|
119
|
+
: kind === 'automation-run-retry'
|
|
120
|
+
? 'Retry Automation Run'
|
|
121
|
+
: 'Run Schedule';
|
|
122
|
+
return {
|
|
123
|
+
kind,
|
|
124
|
+
mode: 'update',
|
|
125
|
+
title: action,
|
|
126
|
+
selectedFieldIndex: 0,
|
|
127
|
+
message: `${action} through the connected host. This is never automatic and requires typed confirmation.`,
|
|
128
|
+
fields: [
|
|
129
|
+
{ id: field, label, value: '', required: true, multiline: false, hint: `${label} from the Automation workspace list.` },
|
|
130
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run the confirmed connected-host action with --yes.' },
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
57
134
|
if (kind === 'plan-approve') {
|
|
58
135
|
return {
|
|
59
136
|
kind,
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { AgentWorkspaceCategoryId } from './agent-workspace-types.ts';
|
|
2
|
+
|
|
3
|
+
const PANEL_CATEGORY_ROUTES = {
|
|
4
|
+
knowledge: 'knowledge',
|
|
5
|
+
memory: 'memory',
|
|
6
|
+
'work-plan': 'work',
|
|
7
|
+
'project-planning': 'work',
|
|
8
|
+
plan: 'work',
|
|
9
|
+
approval: 'work',
|
|
10
|
+
tasks: 'work',
|
|
11
|
+
'provider-health': 'setup',
|
|
12
|
+
automation: 'automation',
|
|
13
|
+
schedule: 'automation',
|
|
14
|
+
providers: 'setup',
|
|
15
|
+
accounts: 'setup',
|
|
16
|
+
subscription: 'setup',
|
|
17
|
+
cost: 'setup',
|
|
18
|
+
tokens: 'setup',
|
|
19
|
+
security: 'tools',
|
|
20
|
+
policy: 'tools',
|
|
21
|
+
tools: 'tools',
|
|
22
|
+
'qr-code': 'channels',
|
|
23
|
+
sessions: 'conversation',
|
|
24
|
+
context: 'conversation',
|
|
25
|
+
thinking: 'conversation',
|
|
26
|
+
'system-messages': 'conversation',
|
|
27
|
+
docs: 'home',
|
|
28
|
+
'panel-list': 'home',
|
|
29
|
+
} as const satisfies Readonly<Record<string, AgentWorkspaceCategoryId>>;
|
|
30
|
+
|
|
31
|
+
type AgentWorkspacePanelRouteId = keyof typeof PANEL_CATEGORY_ROUTES;
|
|
32
|
+
|
|
33
|
+
function hasPanelCategoryRoute(panelId: string): panelId is AgentWorkspacePanelRouteId {
|
|
34
|
+
return Object.prototype.hasOwnProperty.call(PANEL_CATEGORY_ROUTES, panelId);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function agentWorkspaceCategoryForPanel(panelId: string): AgentWorkspaceCategoryId {
|
|
38
|
+
return hasPanelCategoryRoute(panelId) ? PANEL_CATEGORY_ROUTES[panelId] : 'home';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function agentWorkspaceCommandForPanel(panelId: string): string {
|
|
42
|
+
return `/agent ${agentWorkspaceCategoryForPanel(panelId)}`;
|
|
43
|
+
}
|
|
@@ -32,7 +32,7 @@ export function createReminderScheduleEditor(): AgentWorkspaceLocalEditor {
|
|
|
32
32
|
{ id: 'scheduleValue', label: 'Schedule value', value: '', required: true, multiline: false, hint: 'Examples: 2026-06-01T09:00:00-05:00, 7d, or 0 9 * * *.' },
|
|
33
33
|
{ id: 'timezone', label: 'Timezone', value: '', required: false, multiline: false, hint: 'Optional IANA timezone for cron schedules, for example America/Chicago.' },
|
|
34
34
|
{ id: 'scheduleName', label: 'Schedule name', value: '', required: false, multiline: false, hint: 'Optional display name for the connected reminder.' },
|
|
35
|
-
{ id: 'deliveryChannel', label: 'Delivery channel', value: '', required: false, multiline: false, hint: 'Optional channel target, for example slack
|
|
35
|
+
{ id: 'deliveryChannel', label: 'Delivery channel', value: '', required: false, multiline: false, hint: 'Optional channel target, for example slack, slack:ops-alerts:Ops, or telephony:+15551234567.' },
|
|
36
36
|
{ id: 'disabled', label: 'Create disabled', value: 'no', required: false, multiline: false, hint: 'yes/no. Default no.' },
|
|
37
37
|
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /schedule remind with --yes.' },
|
|
38
38
|
],
|
|
@@ -30,12 +30,12 @@ export function createRoutineScheduleEditor(
|
|
|
30
30
|
selectedFieldIndex: 0,
|
|
31
31
|
message: `Create one connected schedule from a reviewed local routine. Selected: ${selected}. Type yes on the final field to confirm.`,
|
|
32
32
|
fields: [
|
|
33
|
-
{ id: 'routineId', label: 'Routine id', value: selectedRoutine?.id ?? '', required: true, multiline: false, hint: '
|
|
33
|
+
{ id: 'routineId', label: 'Routine id', value: selectedRoutine?.id ?? '', required: true, multiline: false, hint: 'Agent-local routine id to promote.' },
|
|
34
34
|
{ id: 'scheduleKind', label: 'Schedule type', value: 'cron', required: true, multiline: false, hint: 'cron, every, or at.' },
|
|
35
35
|
{ id: 'scheduleValue', label: 'Schedule value', value: '', required: true, multiline: false, hint: 'Examples: 0 9 * * *, 7d, or 2026-06-01T09:00:00-05:00.' },
|
|
36
36
|
{ id: 'timezone', label: 'Timezone', value: '', required: false, multiline: false, hint: 'Optional IANA timezone, for example America/Chicago.' },
|
|
37
37
|
{ id: 'scheduleName', label: 'Schedule name', value: selectedRoutine?.name ?? '', required: false, multiline: false, hint: 'Optional display name for the connected schedule.' },
|
|
38
|
-
{ id: 'deliveryChannel', label: 'Delivery channel', value: '', required: false, multiline: false, hint: 'Optional channel target, for example slack
|
|
38
|
+
{ id: 'deliveryChannel', label: 'Delivery channel', value: '', required: false, multiline: false, hint: 'Optional channel target, for example slack, slack:ops-alerts:Ops, or telephony:+15551234567.' },
|
|
39
39
|
{ id: 'disabled', label: 'Create disabled', value: 'no', required: false, multiline: false, hint: 'yes/no. Default no.' },
|
|
40
40
|
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /schedule promote-routine with --yes.' },
|
|
41
41
|
],
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AgentWorkspaceActionResult,
|
|
3
|
+
AgentWorkspaceActionSearchResult,
|
|
4
|
+
AgentWorkspaceCategory,
|
|
5
|
+
AgentWorkspaceFocusPane,
|
|
6
|
+
} from './agent-workspace-types.ts';
|
|
7
|
+
|
|
8
|
+
export interface AgentWorkspaceSearchHost {
|
|
9
|
+
readonly categories: readonly AgentWorkspaceCategory[];
|
|
10
|
+
readonly selectedCategory: AgentWorkspaceCategory;
|
|
11
|
+
actionSearchActive: boolean;
|
|
12
|
+
actionSearchQuery: string;
|
|
13
|
+
focusPane: AgentWorkspaceFocusPane;
|
|
14
|
+
selectedCategoryIndex: number;
|
|
15
|
+
selectedActionIndex: number;
|
|
16
|
+
status: string;
|
|
17
|
+
lastActionResult: AgentWorkspaceActionResult | null;
|
|
18
|
+
focusActions(): void;
|
|
19
|
+
clampSelection(): void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function searchAgentWorkspaceActions(
|
|
23
|
+
categories: readonly AgentWorkspaceCategory[],
|
|
24
|
+
query: string,
|
|
25
|
+
): readonly AgentWorkspaceActionSearchResult[] {
|
|
26
|
+
const normalized = query.trim().toLowerCase();
|
|
27
|
+
if (!normalized) return [];
|
|
28
|
+
const terms = normalized.split(/\s+/).filter(Boolean);
|
|
29
|
+
const results: Array<{ readonly result: AgentWorkspaceActionSearchResult; readonly score: number }> = [];
|
|
30
|
+
categories.forEach((category, categoryIndex) => {
|
|
31
|
+
category.actions.forEach((action, actionIndex) => {
|
|
32
|
+
const haystack = [
|
|
33
|
+
category.id,
|
|
34
|
+
category.label,
|
|
35
|
+
category.summary,
|
|
36
|
+
category.detail,
|
|
37
|
+
action.id,
|
|
38
|
+
action.label,
|
|
39
|
+
action.detail,
|
|
40
|
+
action.command ?? '',
|
|
41
|
+
action.editorKind ?? '',
|
|
42
|
+
action.targetCategoryId ?? '',
|
|
43
|
+
action.localOperation ?? '',
|
|
44
|
+
action.safety,
|
|
45
|
+
].join(' ').toLowerCase();
|
|
46
|
+
if (terms.every((term) => haystack.includes(term))) {
|
|
47
|
+
const result = { category, categoryIndex, action, actionIndex };
|
|
48
|
+
results.push({ result, score: scoreActionSearchResult(result, normalized, terms) });
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
return results
|
|
53
|
+
.sort((left, right) => right.score - left.score || left.result.categoryIndex - right.result.categoryIndex || left.result.actionIndex - right.result.actionIndex)
|
|
54
|
+
.map((entry) => entry.result);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function scoreField(value: string | undefined, terms: readonly string[], exactQuery: string, exactWeight: number, termWeight: number): number {
|
|
58
|
+
const normalized = (value ?? '').toLowerCase();
|
|
59
|
+
if (!normalized) return 0;
|
|
60
|
+
const bareNormalized = normalized.replace(/^\//, '');
|
|
61
|
+
let score = bareNormalized === exactQuery || normalized === exactQuery
|
|
62
|
+
? exactWeight
|
|
63
|
+
: exactQuery.includes(' ') && normalized.includes(exactQuery)
|
|
64
|
+
? exactWeight
|
|
65
|
+
: 0;
|
|
66
|
+
for (const term of terms) {
|
|
67
|
+
if (normalized.includes(term)) score += termWeight;
|
|
68
|
+
}
|
|
69
|
+
return score;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function scoreActionSearchResult(
|
|
73
|
+
result: AgentWorkspaceActionSearchResult,
|
|
74
|
+
exactQuery: string,
|
|
75
|
+
terms: readonly string[],
|
|
76
|
+
): number {
|
|
77
|
+
const { category, action } = result;
|
|
78
|
+
let score = 0;
|
|
79
|
+
score += scoreField(action.id, terms, exactQuery, 90, 28);
|
|
80
|
+
score += scoreField(action.editorKind, terms, exactQuery, 85, 26);
|
|
81
|
+
score += scoreField(action.command, terms, exactQuery, 75, 22);
|
|
82
|
+
score += scoreField(action.label, terms, exactQuery, 65, 18);
|
|
83
|
+
score += scoreField(action.localOperation, terms, exactQuery, 50, 16);
|
|
84
|
+
score += scoreField(action.targetCategoryId, terms, exactQuery, 40, 12);
|
|
85
|
+
score += scoreField(action.detail, terms, exactQuery, 24, 6);
|
|
86
|
+
score += scoreField(category.id, terms, exactQuery, 30, 8);
|
|
87
|
+
score += scoreField(category.label, terms, exactQuery, 25, 7);
|
|
88
|
+
score += scoreField(category.summary, terms, exactQuery, 12, 3);
|
|
89
|
+
score += scoreField(category.detail, terms, exactQuery, 8, 2);
|
|
90
|
+
|
|
91
|
+
if (category.id === 'setup' && !terms.includes('setup')) score -= 14;
|
|
92
|
+
if (action.id.startsWith('setup-') && !terms.includes('setup')) score -= 18;
|
|
93
|
+
if (action.kind === 'workspace' && !terms.includes('open')) score -= 4;
|
|
94
|
+
return score;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function beginAgentWorkspaceActionSearch(host: AgentWorkspaceSearchHost): void {
|
|
98
|
+
host.actionSearchActive = true;
|
|
99
|
+
host.actionSearchQuery = '';
|
|
100
|
+
host.focusPane = 'actions';
|
|
101
|
+
host.selectedActionIndex = 0;
|
|
102
|
+
host.status = 'Search Agent workspace actions.';
|
|
103
|
+
host.lastActionResult = {
|
|
104
|
+
kind: 'guidance',
|
|
105
|
+
title: 'Action search',
|
|
106
|
+
detail: 'Type to filter every Agent workspace action. Enter opens the selected result; Esc clears search.',
|
|
107
|
+
safety: 'safe',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function appendAgentWorkspaceActionSearchText(host: AgentWorkspaceSearchHost, text: string): void {
|
|
112
|
+
if (!host.actionSearchActive || text.length === 0) return;
|
|
113
|
+
host.actionSearchQuery += text.replace(/[\r\n]+/g, ' ');
|
|
114
|
+
host.selectedActionIndex = 0;
|
|
115
|
+
host.status = actionSearchStatus(host);
|
|
116
|
+
host.clampSelection();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function backspaceAgentWorkspaceActionSearch(host: AgentWorkspaceSearchHost): void {
|
|
120
|
+
if (!host.actionSearchActive || host.actionSearchQuery.length === 0) return;
|
|
121
|
+
const chars = Array.from(host.actionSearchQuery);
|
|
122
|
+
chars.pop();
|
|
123
|
+
host.actionSearchQuery = chars.join('');
|
|
124
|
+
host.selectedActionIndex = 0;
|
|
125
|
+
host.status = host.actionSearchQuery.length === 0 ? 'Search Agent workspace actions.' : actionSearchStatus(host);
|
|
126
|
+
host.clampSelection();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function clearAgentWorkspaceActionSearch(host: AgentWorkspaceSearchHost): void {
|
|
130
|
+
if (!host.actionSearchActive) return;
|
|
131
|
+
host.actionSearchActive = false;
|
|
132
|
+
host.actionSearchQuery = '';
|
|
133
|
+
host.selectedActionIndex = Math.max(0, Math.min(host.selectedActionIndex, host.selectedCategory.actions.length - 1));
|
|
134
|
+
host.status = 'Action search cleared.';
|
|
135
|
+
host.clampSelection();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function commitAgentWorkspaceActionSearchSelection(
|
|
139
|
+
host: AgentWorkspaceSearchHost,
|
|
140
|
+
result: AgentWorkspaceActionSearchResult | null,
|
|
141
|
+
): boolean {
|
|
142
|
+
if (!host.actionSearchActive) return true;
|
|
143
|
+
if (!result) {
|
|
144
|
+
host.status = host.actionSearchQuery.trim().length === 0
|
|
145
|
+
? 'Type a search query before opening an action.'
|
|
146
|
+
: `No Agent workspace actions match "${host.actionSearchQuery}".`;
|
|
147
|
+
host.lastActionResult = {
|
|
148
|
+
kind: 'guidance',
|
|
149
|
+
title: 'No action selected',
|
|
150
|
+
detail: 'Type a different search query or press Esc to return to normal workspace navigation.',
|
|
151
|
+
safety: 'safe',
|
|
152
|
+
};
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
host.selectedCategoryIndex = result.categoryIndex;
|
|
156
|
+
host.selectedActionIndex = result.actionIndex;
|
|
157
|
+
host.actionSearchActive = false;
|
|
158
|
+
host.actionSearchQuery = '';
|
|
159
|
+
host.focusActions();
|
|
160
|
+
host.clampSelection();
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function actionSearchStatus(host: AgentWorkspaceSearchHost): string {
|
|
165
|
+
const count = searchAgentWorkspaceActions(host.categories, host.actionSearchQuery).length;
|
|
166
|
+
return count === 0
|
|
167
|
+
? `No Agent workspace actions match "${host.actionSearchQuery}".`
|
|
168
|
+
: `Found ${count} Agent workspace action(s) for "${host.actionSearchQuery}".`;
|
|
169
|
+
}
|
|
@@ -17,6 +17,8 @@ export interface AgentWorkspaceSetupChecklistInput {
|
|
|
17
17
|
readonly sessionMemoryCount: number;
|
|
18
18
|
readonly localMemoryCount: number;
|
|
19
19
|
readonly localMemoryReviewQueueCount: number;
|
|
20
|
+
readonly localNoteCount: number;
|
|
21
|
+
readonly localNoteReviewQueueCount: number;
|
|
20
22
|
readonly routineCount: number;
|
|
21
23
|
readonly enabledRoutineCount: number;
|
|
22
24
|
readonly missingRoutineRequirementCount: number;
|
|
@@ -55,8 +57,8 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
55
57
|
id: 'runtime',
|
|
56
58
|
label: 'Connected host',
|
|
57
59
|
status: 'ready',
|
|
58
|
-
detail: `Agent will connect to ${input.runtimeBaseUrl};
|
|
59
|
-
command: '
|
|
60
|
+
detail: `Agent will connect to ${input.runtimeBaseUrl}; connected-host ownership stays outside this product.`,
|
|
61
|
+
command: 'Home -> Review health',
|
|
60
62
|
},
|
|
61
63
|
{
|
|
62
64
|
id: 'provider-model',
|
|
@@ -65,14 +67,14 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
65
67
|
detail: providerReady
|
|
66
68
|
? `Current chat route is ${input.provider} / ${input.model}.`
|
|
67
69
|
: 'Choose a provider and model before relying on assistant turns.',
|
|
68
|
-
command: '
|
|
70
|
+
command: 'Setup -> Provider and model',
|
|
69
71
|
},
|
|
70
72
|
{
|
|
71
73
|
id: 'agent-knowledge',
|
|
72
74
|
label: 'Agent Knowledge',
|
|
73
75
|
status: 'recommended',
|
|
74
76
|
detail: 'Check isolated Agent Knowledge status, then ingest source-backed material into the Agent segment only.',
|
|
75
|
-
command: '
|
|
77
|
+
command: 'Knowledge',
|
|
76
78
|
},
|
|
77
79
|
{
|
|
78
80
|
id: 'profile',
|
|
@@ -83,7 +85,7 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
83
85
|
: discoveredBehaviorCount > 0
|
|
84
86
|
? `${discoveredBehaviorCount} discovered behavior file(s) can seed an isolated Agent profile from the Profiles workspace.`
|
|
85
87
|
: `${input.runtimeStarterTemplateCount} starter template(s) are available if this machine needs separate operator identities.`,
|
|
86
|
-
command: '
|
|
88
|
+
command: 'Profiles',
|
|
87
89
|
},
|
|
88
90
|
{
|
|
89
91
|
id: 'persona',
|
|
@@ -94,7 +96,7 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
94
96
|
: input.discoveredPersonas.count > 0
|
|
95
97
|
? `${input.discoveredPersonas.count} discovered persona file(s) can be imported into the Agent-local registry.${sampleNames(input.discoveredPersonas)}`
|
|
96
98
|
: 'Create or choose a persona to make the assistant voice and policy explicit.',
|
|
97
|
-
command: '
|
|
99
|
+
command: 'Personas',
|
|
98
100
|
},
|
|
99
101
|
{
|
|
100
102
|
id: 'skills',
|
|
@@ -111,7 +113,7 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
111
113
|
: input.discoveredSkills.count > 0
|
|
112
114
|
? `${input.discoveredSkills.count} discovered skill file(s) can be imported as local reusable procedures.${sampleNames(input.discoveredSkills)}`
|
|
113
115
|
: 'Create reusable local skills and bundles for repeated workflows.',
|
|
114
|
-
command: '
|
|
116
|
+
command: 'Skills',
|
|
115
117
|
},
|
|
116
118
|
{
|
|
117
119
|
id: 'routines',
|
|
@@ -124,7 +126,7 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
124
126
|
: input.discoveredRoutines.count > 0
|
|
125
127
|
? `${input.discoveredRoutines.count} discovered routine file(s) can be imported as main-conversation workflows.${sampleNames(input.discoveredRoutines)}`
|
|
126
128
|
: 'Create local routines first; promote schedules only with explicit confirmation.',
|
|
127
|
-
command: '
|
|
129
|
+
command: 'Routines',
|
|
128
130
|
},
|
|
129
131
|
{
|
|
130
132
|
id: 'memory',
|
|
@@ -133,7 +135,16 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
133
135
|
detail: input.localMemoryCount > 0
|
|
134
136
|
? `${input.localMemoryCount} Agent memory record(s) are available; ${input.localMemoryReviewQueueCount} need review.`
|
|
135
137
|
: 'Memory starts empty; durable facts should be stored deliberately and never include secrets.',
|
|
136
|
-
command: '
|
|
138
|
+
command: 'Memory',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 'notes',
|
|
142
|
+
label: 'Scratchpad notes',
|
|
143
|
+
status: setupStatusForCount(input.localNoteCount, 'ready', 'optional'),
|
|
144
|
+
detail: input.localNoteCount > 0
|
|
145
|
+
? `${input.localNoteCount} Agent scratchpad note(s) are available; ${input.localNoteReviewQueueCount} need review.`
|
|
146
|
+
: 'Notes start empty; use them for source triage, temporary decisions, and handoff before promoting anything durable.',
|
|
147
|
+
command: 'Notes',
|
|
137
148
|
},
|
|
138
149
|
{
|
|
139
150
|
id: 'channels',
|
|
@@ -142,14 +153,14 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
|
|
|
142
153
|
detail: input.readyChannelCount > 0
|
|
143
154
|
? `${input.readyChannelCount} external channel(s) are ready.`
|
|
144
155
|
: 'Pair or review channels only when you want the assistant reachable outside this terminal.',
|
|
145
|
-
command: '
|
|
156
|
+
command: 'Channels',
|
|
146
157
|
},
|
|
147
158
|
{
|
|
148
159
|
id: 'voice-media',
|
|
149
160
|
label: 'Voice and media',
|
|
150
161
|
status: input.voiceProviderCount > 0 || input.mediaProviderCount > 0 ? 'ready' : 'optional',
|
|
151
162
|
detail: `${input.voiceProviderCount} voice provider(s), ${input.mediaProviderCount} media provider(s). Configure these only when useful.`,
|
|
152
|
-
command: '
|
|
163
|
+
command: 'Voice & Media',
|
|
153
164
|
},
|
|
154
165
|
];
|
|
155
166
|
}
|
|
@@ -50,12 +50,12 @@ export function buildAgentWorkspaceSkillBundleCommandEditorSubmission(
|
|
|
50
50
|
): AgentWorkspaceSkillBundleCommandEditorSubmission {
|
|
51
51
|
if (editor.kind === 'skill-bundle-search') {
|
|
52
52
|
const query = readField('query').trim();
|
|
53
|
-
const command = query.length > 0 ? `/
|
|
53
|
+
const command = query.length > 0 ? `/skills bundle search ${quoteSlashCommandArg(query)}` : '/skills bundle search';
|
|
54
54
|
return dispatch(command, 'Opening skill bundle search', 'The workspace handed a read-only skill bundle search command to the shell-owned command router.', 'read-only');
|
|
55
55
|
}
|
|
56
56
|
if (editor.kind === 'skill-bundle-show') {
|
|
57
57
|
return dispatch(
|
|
58
|
-
`/
|
|
58
|
+
`/skills bundle show ${quoteSlashCommandArg(readField('id'))}`,
|
|
59
59
|
'Opening skill bundle detail',
|
|
60
60
|
'The workspace handed a read-only skill bundle detail command to the shell-owned command router.',
|
|
61
61
|
'read-only',
|
|
@@ -63,7 +63,7 @@ export function buildAgentWorkspaceSkillBundleCommandEditorSubmission(
|
|
|
63
63
|
}
|
|
64
64
|
if (editor.kind === 'skill-bundle-update') {
|
|
65
65
|
if (!isAffirmative(readField('confirm'))) return unconfirmed(editor, 'Skill bundle update not confirmed. Type yes, then press Enter.');
|
|
66
|
-
const parts = ['/
|
|
66
|
+
const parts = ['/skills', 'bundle', 'update', quoteSlashCommandArg(readField('id'))];
|
|
67
67
|
const name = readField('name');
|
|
68
68
|
const description = readField('description');
|
|
69
69
|
const skills = readField('skills');
|
|
@@ -76,7 +76,7 @@ export function buildAgentWorkspaceSkillBundleCommandEditorSubmission(
|
|
|
76
76
|
if (!isAffirmative(readField('confirm'))) return unconfirmed(editor, 'Skill bundle action not confirmed. Type yes, then press Enter.');
|
|
77
77
|
const verb = editor.kind.replace('skill-bundle-', '');
|
|
78
78
|
return dispatch(
|
|
79
|
-
`/
|
|
79
|
+
`/skills bundle ${verb} ${quoteSlashCommandArg(readField('id'))}`,
|
|
80
80
|
`Opening skill bundle ${verb}`,
|
|
81
81
|
`The workspace handed a confirmed skill bundle ${verb} command to the shell-owned command router.`,
|
|
82
82
|
'safe',
|
|
@@ -85,7 +85,7 @@ export function buildAgentWorkspaceSkillBundleCommandEditorSubmission(
|
|
|
85
85
|
if (editor.kind === 'skill-bundle-stale') {
|
|
86
86
|
if (!isAffirmative(readField('confirm'))) return unconfirmed(editor, 'Skill bundle stale action not confirmed. Type yes, then press Enter.');
|
|
87
87
|
return dispatch(
|
|
88
|
-
`/
|
|
88
|
+
`/skills bundle stale ${quoteSlashCommandArg(readField('id'))} ${quoteSlashCommandArg(readField('reason'))}`,
|
|
89
89
|
'Opening skill bundle stale review',
|
|
90
90
|
'The workspace handed a confirmed skill bundle stale command to the shell-owned command router.',
|
|
91
91
|
'safe',
|
|
@@ -93,7 +93,7 @@ export function buildAgentWorkspaceSkillBundleCommandEditorSubmission(
|
|
|
93
93
|
}
|
|
94
94
|
if (!isAffirmative(readField('confirm'))) return unconfirmed(editor, 'Skill bundle delete not confirmed. Type yes, then press Enter.');
|
|
95
95
|
return dispatch(
|
|
96
|
-
`/
|
|
96
|
+
`/skills bundle delete ${quoteSlashCommandArg(readField('id'))} --yes`,
|
|
97
97
|
'Opening skill bundle delete',
|
|
98
98
|
'The workspace handed a confirmed skill bundle delete command to the shell-owned command router.',
|
|
99
99
|
'safe',
|
|
@@ -30,7 +30,7 @@ export function createAgentWorkspaceSkillBundleCommandEditor(kind: AgentWorkspac
|
|
|
30
30
|
mode: 'create',
|
|
31
31
|
title: 'Search Skill Bundles',
|
|
32
32
|
selectedFieldIndex: 0,
|
|
33
|
-
message: 'Search local
|
|
33
|
+
message: 'Search Agent-local skill bundles by name, description, or member skill.',
|
|
34
34
|
fields: [
|
|
35
35
|
{ id: 'query', label: 'Search query', value: '', required: false, multiline: false, hint: 'Optional text query. Blank lists every bundle.' },
|
|
36
36
|
],
|
|
@@ -42,7 +42,7 @@ export function createAgentWorkspaceSkillBundleCommandEditor(kind: AgentWorkspac
|
|
|
42
42
|
mode: 'create',
|
|
43
43
|
title: 'Show Skill Bundle',
|
|
44
44
|
selectedFieldIndex: 0,
|
|
45
|
-
message: 'Show one local
|
|
45
|
+
message: 'Show one Agent-local skill bundle with readiness and member skills.',
|
|
46
46
|
fields: [
|
|
47
47
|
{ id: 'id', label: 'Bundle id', value: '', required: true, multiline: false, hint: 'Existing local skill bundle id.' },
|
|
48
48
|
],
|
|
@@ -54,13 +54,13 @@ export function createAgentWorkspaceSkillBundleCommandEditor(kind: AgentWorkspac
|
|
|
54
54
|
mode: 'update',
|
|
55
55
|
title: 'Update Skill Bundle',
|
|
56
56
|
selectedFieldIndex: 0,
|
|
57
|
-
message: 'Update one local
|
|
57
|
+
message: 'Update one Agent-local skill bundle. Type yes on the final field to confirm.',
|
|
58
58
|
fields: [
|
|
59
59
|
{ id: 'id', label: 'Bundle id', value: '', required: true, multiline: false, hint: 'Existing local skill bundle id.' },
|
|
60
60
|
{ id: 'name', label: 'Name', value: '', required: false, multiline: false, hint: 'Optional replacement name.' },
|
|
61
61
|
{ id: 'description', label: 'Description', value: '', required: false, multiline: false, hint: 'Optional replacement one-line description.' },
|
|
62
62
|
{ id: 'skills', label: 'Skill ids', value: '', required: false, multiline: false, hint: 'Optional replacement comma-separated local skill ids.' },
|
|
63
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /
|
|
63
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /skills bundle update.' },
|
|
64
64
|
],
|
|
65
65
|
};
|
|
66
66
|
}
|
|
@@ -70,11 +70,11 @@ export function createAgentWorkspaceSkillBundleCommandEditor(kind: AgentWorkspac
|
|
|
70
70
|
mode: 'update',
|
|
71
71
|
title: 'Mark Skill Bundle Stale',
|
|
72
72
|
selectedFieldIndex: 0,
|
|
73
|
-
message: 'Mark one local
|
|
73
|
+
message: 'Mark one Agent-local skill bundle stale with a review reason. Type yes on the final field to confirm.',
|
|
74
74
|
fields: [
|
|
75
75
|
{ id: 'id', label: 'Bundle id', value: '', required: true, multiline: false, hint: 'Existing local skill bundle id.' },
|
|
76
76
|
{ id: 'reason', label: 'Reason', value: '', required: true, multiline: true, hint: 'Why this bundle needs review. Ctrl-J inserts a new line.' },
|
|
77
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /
|
|
77
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /skills bundle stale.' },
|
|
78
78
|
],
|
|
79
79
|
};
|
|
80
80
|
}
|
|
@@ -84,10 +84,10 @@ export function createAgentWorkspaceSkillBundleCommandEditor(kind: AgentWorkspac
|
|
|
84
84
|
mode: 'delete',
|
|
85
85
|
title: 'Delete Skill Bundle',
|
|
86
86
|
selectedFieldIndex: 0,
|
|
87
|
-
message: 'Delete one local
|
|
87
|
+
message: 'Delete one Agent-local skill bundle. This does not delete member skills. Type yes to confirm.',
|
|
88
88
|
fields: [
|
|
89
89
|
{ id: 'id', label: 'Bundle id', value: '', required: true, multiline: false, hint: 'Existing local skill bundle id.' },
|
|
90
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /
|
|
90
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /skills bundle delete with --yes.' },
|
|
91
91
|
],
|
|
92
92
|
};
|
|
93
93
|
}
|
|
@@ -101,10 +101,10 @@ export function createAgentWorkspaceSkillBundleCommandEditor(kind: AgentWorkspac
|
|
|
101
101
|
mode: 'update',
|
|
102
102
|
title: `${verb} Skill Bundle`,
|
|
103
103
|
selectedFieldIndex: 0,
|
|
104
|
-
message: `${verb} one local
|
|
104
|
+
message: `${verb} one Agent-local skill bundle. Type yes on the final field to confirm.`,
|
|
105
105
|
fields: [
|
|
106
106
|
{ id: 'id', label: 'Bundle id', value: '', required: true, multiline: false, hint: 'Existing local skill bundle id.' },
|
|
107
|
-
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: `Type yes to run /
|
|
107
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: `Type yes to run /skills bundle ${verb.toLowerCase()}.` },
|
|
108
108
|
],
|
|
109
109
|
};
|
|
110
110
|
}
|