@pellux/goodvibes-agent 0.1.116 → 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 +48 -661
- package/README.md +64 -57
- package/bin/goodvibes-agent.ts +16 -2
- package/dist/package/main.js +199180 -192185
- package/docs/README.md +15 -8
- package/docs/channels-remote-and-api.md +50 -0
- package/docs/connected-host.md +59 -0
- package/docs/getting-started.md +61 -50
- 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 +48 -11
- package/docs/tools-and-commands.md +123 -0
- package/docs/voice-and-live-tts.md +51 -0
- package/package.json +3 -6
- package/src/agent/behavior-discovery-summary.ts +1 -3
- 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-discovery.ts +1 -3
- package/src/agent/persona-registry.ts +19 -16
- package/src/agent/record-labels.ts +107 -0
- package/src/agent/reminder-schedule-format.ts +33 -24
- package/src/agent/reminder-schedule.ts +27 -26
- package/src/agent/routine-registry.ts +54 -14
- 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 +35 -33
- package/src/agent/routine-schedule-receipts.ts +29 -27
- package/src/agent/runtime-profile-starters.ts +5 -5
- package/src/agent/runtime-profile.ts +91 -12
- package/src/agent/skill-registry.ts +210 -32
- package/src/cli/agent-knowledge-args.ts +5 -1
- package/src/cli/agent-knowledge-command.ts +40 -34
- 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 +14 -9
- package/src/cli/config-overrides.ts +37 -36
- package/src/cli/entrypoint.ts +16 -7
- package/src/cli/external-runtime.ts +10 -4
- package/src/cli/help.ts +54 -29
- package/src/cli/local-library-command.ts +203 -83
- package/src/cli/management-commands.ts +105 -68
- package/src/cli/management.ts +55 -74
- package/src/cli/memory-command.ts +66 -32
- package/src/cli/parser.ts +37 -3
- package/src/cli/profiles-command.ts +166 -31
- package/src/cli/provider-auth-routes.ts +2 -1
- package/src/cli/routines-command.ts +176 -40
- package/src/cli/service-posture.ts +16 -16
- package/src/cli/status.ts +56 -135
- package/src/core/conversation-message-snapshot.ts +131 -0
- package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
- package/src/input/agent-workspace-access-command-editors.ts +170 -0
- package/src/input/agent-workspace-activation.ts +35 -8
- package/src/input/agent-workspace-basic-command-editor-submission.ts +351 -94
- package/src/input/agent-workspace-basic-command-editors.ts +502 -9
- package/src/input/agent-workspace-categories.ts +423 -51
- package/src/input/agent-workspace-channel-command-editor-submission.ts +83 -0
- package/src/input/agent-workspace-channel-command-editors.ts +65 -0
- package/src/input/agent-workspace-channels.ts +35 -2
- package/src/input/agent-workspace-command-editor.ts +41 -3
- package/src/input/agent-workspace-config-reader.ts +16 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
- package/src/input/agent-workspace-editors.ts +166 -1
- package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
- package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
- package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
- package/src/input/agent-workspace-learned-behavior.ts +67 -0
- package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
- package/src/input/agent-workspace-library-command-editors.ts +35 -0
- 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-mcp-command-editor-submission.ts +95 -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-editor-submission.ts +232 -0
- package/src/input/agent-workspace-memory-command-editors.ts +180 -0
- package/src/input/agent-workspace-memory-editor.ts +2 -2
- package/src/input/agent-workspace-navigation.ts +81 -0
- package/src/input/agent-workspace-notify-editor-submission.ts +121 -0
- package/src/input/agent-workspace-operations-command-editor-submission.ts +208 -0
- package/src/input/agent-workspace-operations-command-editors.ts +196 -0
- package/src/input/agent-workspace-panel-route.ts +43 -0
- package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
- package/src/input/agent-workspace-provider-command-editors.ts +93 -0
- package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
- package/src/input/agent-workspace-requirements.ts +11 -0
- 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-secret-editor-submission.ts +153 -0
- package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
- package/src/input/agent-workspace-session-command-editors.ts +249 -0
- package/src/input/agent-workspace-setup.ts +37 -16
- package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
- package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
- package/src/input/agent-workspace-snapshot.ts +162 -21
- package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
- package/src/input/agent-workspace-task-command-editors.ts +47 -0
- package/src/input/agent-workspace-token.ts +18 -2
- package/src/input/agent-workspace-types.ts +212 -4
- package/src/input/agent-workspace-voice-media.ts +4 -7
- package/src/input/agent-workspace-web-research-editor.ts +104 -0
- package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
- package/src/input/agent-workspace.ts +178 -240
- package/src/input/command-registry.ts +5 -2
- package/src/input/commands/agent-runtime-profile-runtime.ts +126 -37
- package/src/input/commands/agent-skills-runtime.ts +149 -72
- package/src/input/commands/agent-workspace-runtime.ts +23 -6
- package/src/input/commands/brief-runtime.ts +55 -25
- package/src/input/commands/channels-runtime.ts +147 -33
- package/src/input/commands/compat-runtime.ts +32 -0
- 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 +149 -126
- package/src/input/commands/knowledge.ts +82 -60
- package/src/input/commands/local-provider-runtime.ts +43 -21
- package/src/input/commands/local-runtime.ts +138 -16
- package/src/input/commands/local-setup-review.ts +10 -20
- package/src/input/commands/mcp-runtime.ts +63 -46
- 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 -76
- package/src/input/commands/personas-runtime.ts +46 -31
- package/src/input/commands/planning-runtime.ts +1 -1
- package/src/input/commands/platform-access-runtime.ts +35 -98
- package/src/input/commands/product-runtime.ts +2 -2
- package/src/input/commands/provider-accounts-runtime.ts +60 -39
- package/src/input/commands/qrcode-runtime.ts +50 -9
- 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 +99 -45
- package/src/input/commands/runtime-services.ts +1 -14
- package/src/input/commands/schedule-runtime.ts +33 -20
- package/src/input/commands/security-runtime.ts +6 -11
- package/src/input/commands/session-content.ts +80 -78
- package/src/input/commands/session-workflow.ts +134 -104
- package/src/input/commands/session.ts +3 -174
- package/src/input/commands/shell-core.ts +38 -17
- package/src/input/commands/subscription-runtime.ts +54 -185
- package/src/input/commands/support-bundle-runtime.ts +53 -0
- package/src/input/commands/tasks-runtime.ts +21 -21
- package/src/input/commands/work-plan-runtime.ts +33 -8
- package/src/input/commands.ts +6 -2
- package/src/input/feed-context-factory.ts +2 -2
- 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 -26
- package/src/input/handler-feed-routes.ts +19 -12
- package/src/input/handler-feed.ts +6 -5
- package/src/input/handler-interactions.ts +9 -36
- package/src/input/handler-modal-stack.ts +3 -3
- package/src/input/handler-onboarding.ts +52 -91
- package/src/input/handler-shortcuts.ts +16 -7
- package/src/input/handler.ts +50 -23
- package/src/input/input-history.ts +5 -6
- package/src/input/keybindings.ts +27 -16
- package/src/input/mcp-workspace.ts +90 -26
- package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
- package/src/input/onboarding/onboarding-wizard-apply.ts +62 -0
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
- package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-operator-steps.ts +223 -55
- package/src/input/onboarding/onboarding-wizard-steps.ts +59 -35
- package/src/input/onboarding/onboarding-wizard-types.ts +4 -1
- package/src/input/onboarding/onboarding-wizard.ts +87 -2
- package/src/input/profile-picker-modal.ts +31 -12
- package/src/input/session-picker-modal.ts +21 -4
- package/src/input/settings-modal-agent-policy.ts +6 -6
- 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 +20 -66
- package/src/input/submission-intent.ts +0 -1
- package/src/input/submission-router.ts +3 -3
- package/src/main.ts +18 -10
- package/src/panels/approval-panel.ts +8 -8
- package/src/panels/automation-control-panel.ts +4 -4
- package/src/panels/base-panel.ts +1 -1
- package/src/panels/builtin/agent.ts +1 -1
- package/src/panels/builtin/operations.ts +3 -12
- package/src/panels/builtin/session.ts +32 -24
- package/src/panels/builtin/shared.ts +7 -7
- 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 +19 -12
- 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 +48 -7
- package/src/panels/provider-health-panel.ts +5 -4
- package/src/panels/qr-panel.ts +44 -20
- 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 +6 -6
- package/src/panels/system-messages-panel.ts +3 -3
- package/src/panels/tasks-panel.ts +21 -14
- 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 +3 -3
- package/src/provider-auth-route-display.ts +9 -0
- package/src/renderer/agent-workspace-style.ts +34 -0
- package/src/renderer/agent-workspace.ts +254 -57
- package/src/renderer/autocomplete-overlay.ts +25 -6
- package/src/renderer/block-actions.ts +1 -3
- 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 +112 -34
- package/src/renderer/history-search-overlay.ts +19 -4
- package/src/renderer/live-tail-modal.ts +27 -5
- package/src/renderer/mcp-workspace.ts +176 -43
- package/src/renderer/model-picker-overlay.ts +58 -3
- package/src/renderer/model-workspace.ts +104 -22
- package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
- package/src/renderer/process-modal.ts +27 -6
- package/src/renderer/profile-picker-modal.ts +21 -5
- 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 +88 -55
- package/src/renderer/system-message.ts +1 -1
- package/src/renderer/tool-call.ts +20 -11
- package/src/runtime/agent-runtime-events.ts +129 -0
- package/src/runtime/bootstrap-command-context.ts +7 -1
- package/src/runtime/bootstrap-command-parts.ts +11 -8
- package/src/runtime/bootstrap-core.ts +23 -65
- package/src/runtime/bootstrap-hook-bridge.ts +7 -18
- package/src/runtime/bootstrap-shell.ts +46 -8
- package/src/runtime/bootstrap.ts +36 -46
- package/src/runtime/connected-host-auth.ts +47 -0
- package/src/runtime/diagnostics/panels/index.ts +2 -2
- package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
- package/src/runtime/diagnostics/panels/policy.ts +7 -7
- package/src/runtime/index.ts +2 -5
- package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
- package/src/runtime/onboarding/apply.ts +288 -74
- package/src/runtime/onboarding/derivation.ts +10 -13
- package/src/runtime/onboarding/snapshot.ts +2 -17
- package/src/runtime/onboarding/types.ts +34 -20
- package/src/runtime/onboarding/verify.ts +105 -4
- package/src/runtime/operator-token-cleanup.ts +3 -3
- package/src/runtime/services.ts +95 -11
- 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/service-settings-sync.ts +7 -7
- package/src/shell/ui-openers.ts +17 -38
- 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 +279 -73
- 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 +13 -15
- package/src/tools/agent-work-plan-tool.ts +256 -0
- package/src/version.ts +1 -1
- package/docs/connected-services.md +0 -51
- package/src/cli/package-verification.ts +0 -274
- package/src/input/commands/policy-dispatch.ts +0 -339
- package/src/input/commands/policy.ts +0 -17
- 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
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { AgentWorkspaceActionResult, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
|
|
2
|
+
import type { AgentWorkspaceKnowledgeCommandEditorKind } from './agent-workspace-knowledge-command-editors.ts';
|
|
3
|
+
import { isAgentWorkspaceKnowledgeCommandEditorKind } from './agent-workspace-knowledge-command-editors.ts';
|
|
4
|
+
import { quoteSlashCommandArg } from './slash-command-parser.ts';
|
|
5
|
+
|
|
6
|
+
type AgentWorkspaceFieldReader = (fieldId: string) => string;
|
|
7
|
+
|
|
8
|
+
export type AgentWorkspaceKnowledgeCommandEditorSubmission =
|
|
9
|
+
| {
|
|
10
|
+
readonly kind: 'editor';
|
|
11
|
+
readonly editor: AgentWorkspaceLocalEditor;
|
|
12
|
+
readonly status: string;
|
|
13
|
+
readonly actionResult?: AgentWorkspaceActionResult;
|
|
14
|
+
}
|
|
15
|
+
| {
|
|
16
|
+
readonly kind: 'dispatch';
|
|
17
|
+
readonly command: string;
|
|
18
|
+
readonly status: string;
|
|
19
|
+
readonly actionResult: AgentWorkspaceActionResult;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function isAgentWorkspaceKnowledgeCommandSubmissionKind(kind: string): kind is AgentWorkspaceKnowledgeCommandEditorKind {
|
|
23
|
+
return isAgentWorkspaceKnowledgeCommandEditorKind(kind as AgentWorkspaceKnowledgeCommandEditorKind);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isAffirmative(value: string): boolean {
|
|
27
|
+
return /^(y|yes|true)$/i.test(value.trim());
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function splitCommaList(value: string): readonly string[] {
|
|
31
|
+
return value.split(',').map((entry) => entry.trim()).filter(Boolean);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function unconfirmed(editor: AgentWorkspaceLocalEditor, message: string): AgentWorkspaceKnowledgeCommandEditorSubmission {
|
|
35
|
+
return {
|
|
36
|
+
kind: 'editor',
|
|
37
|
+
editor: { ...editor, message },
|
|
38
|
+
status: message,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function dispatch(command: string, title: string, detail: string, safety: AgentWorkspaceActionResult['safety']): AgentWorkspaceKnowledgeCommandEditorSubmission {
|
|
43
|
+
return {
|
|
44
|
+
kind: 'dispatch',
|
|
45
|
+
command,
|
|
46
|
+
status: `${title}.`,
|
|
47
|
+
actionResult: { kind: 'dispatched', title, detail, command, safety },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function buildAgentWorkspaceKnowledgeCommandEditorSubmission(
|
|
52
|
+
editor: AgentWorkspaceLocalEditor,
|
|
53
|
+
readField: AgentWorkspaceFieldReader,
|
|
54
|
+
): AgentWorkspaceKnowledgeCommandEditorSubmission {
|
|
55
|
+
if (editor.kind === 'knowledge-get') {
|
|
56
|
+
return dispatch(
|
|
57
|
+
`/knowledge get ${quoteSlashCommandArg(readField('id'))}`,
|
|
58
|
+
'Opening Agent Knowledge item',
|
|
59
|
+
'The workspace handed a read-only Agent Knowledge item command to the shell-owned command router.',
|
|
60
|
+
'read-only',
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
if (editor.kind === 'knowledge-map') {
|
|
64
|
+
const query = readField('query');
|
|
65
|
+
const limit = readField('limit');
|
|
66
|
+
const parts = ['/knowledge', 'map'];
|
|
67
|
+
if (query.length > 0) parts.push(quoteSlashCommandArg(query));
|
|
68
|
+
if (limit.length > 0) parts.push('--limit', quoteSlashCommandArg(limit));
|
|
69
|
+
return dispatch(
|
|
70
|
+
parts.join(' '),
|
|
71
|
+
'Opening Agent Knowledge map',
|
|
72
|
+
'The workspace handed a read-only Agent Knowledge map command to the shell-owned command router.',
|
|
73
|
+
'read-only',
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
if (editor.kind === 'knowledge-connector-show') {
|
|
77
|
+
return dispatch(
|
|
78
|
+
`/knowledge connectors ${quoteSlashCommandArg(readField('connectorId'))}`,
|
|
79
|
+
'Opening Agent Knowledge connector',
|
|
80
|
+
'The workspace handed a read-only Agent Knowledge connector detail command to the shell-owned command router.',
|
|
81
|
+
'read-only',
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
if (editor.kind === 'knowledge-connector-doctor') {
|
|
85
|
+
return dispatch(
|
|
86
|
+
`/knowledge connectors doctor ${quoteSlashCommandArg(readField('connectorId'))}`,
|
|
87
|
+
'Opening Agent Knowledge connector doctor',
|
|
88
|
+
'The workspace handed a read-only Agent Knowledge connector doctor command to the shell-owned command router.',
|
|
89
|
+
'read-only',
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
if (editor.kind === 'knowledge-review-issue') {
|
|
93
|
+
if (!isAffirmative(readField('confirm'))) return unconfirmed(editor, 'Agent Knowledge issue review not confirmed. Type yes, then press Enter.');
|
|
94
|
+
const parts = [
|
|
95
|
+
'/knowledge',
|
|
96
|
+
'review-issue',
|
|
97
|
+
quoteSlashCommandArg(readField('issueId')),
|
|
98
|
+
quoteSlashCommandArg(readField('action')),
|
|
99
|
+
];
|
|
100
|
+
const reviewer = readField('reviewer');
|
|
101
|
+
const value = readField('value');
|
|
102
|
+
if (reviewer.length > 0) parts.push('--reviewer', quoteSlashCommandArg(reviewer));
|
|
103
|
+
if (value.length > 0) parts.push('--value', quoteSlashCommandArg(value));
|
|
104
|
+
parts.push('--yes');
|
|
105
|
+
return dispatch(
|
|
106
|
+
parts.join(' '),
|
|
107
|
+
'Opening Agent Knowledge issue review',
|
|
108
|
+
'The workspace handed a confirmed Agent Knowledge issue review command to the shell-owned command router.',
|
|
109
|
+
'safe',
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
if (editor.kind === 'knowledge-consolidate') {
|
|
113
|
+
if (!isAffirmative(readField('confirm'))) return unconfirmed(editor, 'Agent Knowledge consolidation not confirmed. Type yes, then press Enter.');
|
|
114
|
+
return dispatch(
|
|
115
|
+
`/knowledge consolidate ${quoteSlashCommandArg(readField('mode'))} --yes`,
|
|
116
|
+
'Opening Agent Knowledge consolidation',
|
|
117
|
+
'The workspace handed a confirmed Agent Knowledge consolidation command to the shell-owned command router.',
|
|
118
|
+
'safe',
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const subcommand = editor.kind === 'knowledge-explain' ? 'explain' : 'packet';
|
|
122
|
+
const parts = ['/knowledge', subcommand, quoteSlashCommandArg(readField('task'))];
|
|
123
|
+
for (const scope of splitCommaList(readField('scopes'))) {
|
|
124
|
+
parts.push('--scope', quoteSlashCommandArg(scope));
|
|
125
|
+
}
|
|
126
|
+
return dispatch(
|
|
127
|
+
parts.join(' '),
|
|
128
|
+
subcommand === 'explain' ? 'Opening Agent Knowledge explanation' : 'Opening Agent Knowledge prompt packet',
|
|
129
|
+
'The workspace handed a read-only Agent Knowledge context command to the shell-owned command router.',
|
|
130
|
+
'read-only',
|
|
131
|
+
);
|
|
132
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
|
|
2
|
+
|
|
3
|
+
export type AgentWorkspaceKnowledgeCommandEditorKind = Extract<
|
|
4
|
+
AgentWorkspaceEditorKind,
|
|
5
|
+
| 'knowledge-get'
|
|
6
|
+
| 'knowledge-map'
|
|
7
|
+
| 'knowledge-connector-show'
|
|
8
|
+
| 'knowledge-connector-doctor'
|
|
9
|
+
| 'knowledge-review-issue'
|
|
10
|
+
| 'knowledge-consolidate'
|
|
11
|
+
| 'knowledge-packet'
|
|
12
|
+
| 'knowledge-explain'
|
|
13
|
+
>;
|
|
14
|
+
|
|
15
|
+
export function isAgentWorkspaceKnowledgeCommandEditorKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceKnowledgeCommandEditorKind {
|
|
16
|
+
return kind === 'knowledge-get'
|
|
17
|
+
|| kind === 'knowledge-map'
|
|
18
|
+
|| kind === 'knowledge-connector-show'
|
|
19
|
+
|| kind === 'knowledge-connector-doctor'
|
|
20
|
+
|| kind === 'knowledge-review-issue'
|
|
21
|
+
|| kind === 'knowledge-consolidate'
|
|
22
|
+
|| kind === 'knowledge-packet'
|
|
23
|
+
|| kind === 'knowledge-explain';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function createAgentWorkspaceKnowledgeCommandEditor(kind: AgentWorkspaceKnowledgeCommandEditorKind): AgentWorkspaceLocalEditor {
|
|
27
|
+
if (kind === 'knowledge-get') {
|
|
28
|
+
return {
|
|
29
|
+
kind,
|
|
30
|
+
mode: 'create',
|
|
31
|
+
title: 'Show Agent Knowledge Item',
|
|
32
|
+
selectedFieldIndex: 0,
|
|
33
|
+
message: 'Show one source, node, or issue from the isolated Agent Knowledge segment.',
|
|
34
|
+
fields: [
|
|
35
|
+
{ id: 'id', label: 'Item id', value: '', required: true, multiline: false, hint: 'Agent Knowledge source, node, or issue id.' },
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (kind === 'knowledge-map') {
|
|
40
|
+
return {
|
|
41
|
+
kind,
|
|
42
|
+
mode: 'create',
|
|
43
|
+
title: 'Map Agent Knowledge',
|
|
44
|
+
selectedFieldIndex: 0,
|
|
45
|
+
message: 'Summarize the isolated Agent Knowledge graph map. Leave query blank for a bounded full map summary.',
|
|
46
|
+
fields: [
|
|
47
|
+
{ id: 'query', label: 'Query', value: '', required: false, multiline: false, hint: 'Optional map filter query.' },
|
|
48
|
+
{ id: 'limit', label: 'Limit', value: '50', required: false, multiline: false, hint: 'Maximum map records to summarize.' },
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (kind === 'knowledge-connector-show' || kind === 'knowledge-connector-doctor') {
|
|
53
|
+
const doctor = kind === 'knowledge-connector-doctor';
|
|
54
|
+
return {
|
|
55
|
+
kind,
|
|
56
|
+
mode: 'create',
|
|
57
|
+
title: doctor ? 'Doctor Agent Knowledge Connector' : 'Show Agent Knowledge Connector',
|
|
58
|
+
selectedFieldIndex: 0,
|
|
59
|
+
message: doctor
|
|
60
|
+
? 'Run a read-only readiness doctor for one Agent Knowledge connector.'
|
|
61
|
+
: 'Show one Agent Knowledge connector from the isolated Agent Knowledge connector registry.',
|
|
62
|
+
fields: [
|
|
63
|
+
{ id: 'connectorId', label: 'Connector id', value: '', required: true, multiline: false, hint: 'Connector id from the Agent Knowledge connector inventory.' },
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (kind === 'knowledge-review-issue') {
|
|
68
|
+
return {
|
|
69
|
+
kind,
|
|
70
|
+
mode: 'update',
|
|
71
|
+
title: 'Review Agent Knowledge Issue',
|
|
72
|
+
selectedFieldIndex: 0,
|
|
73
|
+
message: 'Accept, reject, resolve, reopen, edit, or forget one Agent Knowledge issue. Type yes on the final field to confirm.',
|
|
74
|
+
fields: [
|
|
75
|
+
{ id: 'issueId', label: 'Issue id', value: '', required: true, multiline: false, hint: 'Issue id from the review queue.' },
|
|
76
|
+
{ id: 'action', label: 'Action', value: 'resolve', required: true, multiline: false, hint: 'accept, reject, resolve, reopen, edit, or forget.' },
|
|
77
|
+
{ id: 'reviewer', label: 'Reviewer', value: 'agent', required: false, multiline: false, hint: 'Reviewer label. Blank defaults to agent.' },
|
|
78
|
+
{ id: 'value', label: 'Value JSON', value: '', required: false, multiline: true, hint: 'Optional JSON object for edit actions. Ctrl-J inserts a new line.' },
|
|
79
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /knowledge review-issue with --yes.' },
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (kind === 'knowledge-consolidate') {
|
|
84
|
+
return {
|
|
85
|
+
kind,
|
|
86
|
+
mode: 'update',
|
|
87
|
+
title: 'Consolidate Agent Knowledge',
|
|
88
|
+
selectedFieldIndex: 0,
|
|
89
|
+
message: 'Run isolated Agent Knowledge consolidation. Type yes on the final field to confirm.',
|
|
90
|
+
fields: [
|
|
91
|
+
{ id: 'mode', label: 'Mode', value: 'light', required: true, multiline: false, hint: 'light or deep.' },
|
|
92
|
+
{ id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /knowledge consolidate with --yes.' },
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const explain = kind === 'knowledge-explain';
|
|
97
|
+
return {
|
|
98
|
+
kind,
|
|
99
|
+
mode: 'create',
|
|
100
|
+
title: explain ? 'Explain Memory Selection' : 'Build Prompt Packet',
|
|
101
|
+
selectedFieldIndex: 0,
|
|
102
|
+
message: explain
|
|
103
|
+
? 'Explain which Agent Knowledge and memory context would be selected for a task.'
|
|
104
|
+
: 'Build a compact Agent Knowledge prompt packet for a task.',
|
|
105
|
+
fields: [
|
|
106
|
+
{ id: 'task', label: 'Task', value: '', required: true, multiline: true, hint: 'Task or question. Ctrl-J inserts a new line.' },
|
|
107
|
+
{ id: 'scopes', label: 'Scopes', value: '', required: false, multiline: false, hint: 'Optional comma-separated --scope values.' },
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
@@ -25,7 +25,7 @@ export function createAgentKnowledgeQueryEditor(mode: AgentKnowledgeQueryMode):
|
|
|
25
25
|
title: mode === 'ask' ? 'Ask Agent Knowledge' : 'Search Agent Knowledge',
|
|
26
26
|
selectedFieldIndex: 0,
|
|
27
27
|
message: mode === 'ask'
|
|
28
|
-
? 'Ask the isolated Agent Knowledge segment. If it has no answer, it fails closed instead of using another
|
|
28
|
+
? 'Ask the isolated Agent Knowledge segment. If it has no answer, it fails closed instead of using another knowledge segment.'
|
|
29
29
|
: 'Search the isolated Agent Knowledge segment. Results come from Agent-owned sources only.',
|
|
30
30
|
fields: [
|
|
31
31
|
{
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ShellPathService } from '@/runtime/index.ts';
|
|
2
|
+
import { AgentPersonaRegistry } from '../agent/persona-registry.ts';
|
|
3
|
+
import { AgentRoutineRegistry } from '../agent/routine-registry.ts';
|
|
4
|
+
import { AgentSkillRegistry } from '../agent/skill-registry.ts';
|
|
5
|
+
import type { AgentWorkspaceLocalEditorKind } from './agent-workspace-types.ts';
|
|
6
|
+
|
|
7
|
+
export interface AgentWorkspaceLearnedBehaviorInput {
|
|
8
|
+
readonly target: Exclude<AgentWorkspaceLocalEditorKind, 'memory' | 'note' | 'profile'>;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly description: string;
|
|
11
|
+
readonly notes: string;
|
|
12
|
+
readonly tags: readonly string[];
|
|
13
|
+
readonly triggers: readonly string[];
|
|
14
|
+
readonly enable: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface AgentWorkspaceLearnedBehaviorResult {
|
|
18
|
+
readonly kind: Exclude<AgentWorkspaceLocalEditorKind, 'memory' | 'note' | 'profile'>;
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly name: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function createAgentWorkspaceLearnedBehavior(
|
|
24
|
+
shellPaths: ShellPathService,
|
|
25
|
+
input: AgentWorkspaceLearnedBehaviorInput,
|
|
26
|
+
): AgentWorkspaceLearnedBehaviorResult {
|
|
27
|
+
if (input.target === 'persona') {
|
|
28
|
+
const registry = AgentPersonaRegistry.fromShellPaths(shellPaths);
|
|
29
|
+
const created = registry.create({
|
|
30
|
+
name: input.name,
|
|
31
|
+
description: input.description,
|
|
32
|
+
body: input.notes,
|
|
33
|
+
tags: input.tags,
|
|
34
|
+
triggers: input.triggers,
|
|
35
|
+
source: 'agent',
|
|
36
|
+
provenance: 'agent-workspace-learned-behavior',
|
|
37
|
+
});
|
|
38
|
+
if (input.enable) registry.setActive(created.id);
|
|
39
|
+
return { kind: 'persona', id: created.id, name: created.name };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (input.target === 'skill') {
|
|
43
|
+
const created = AgentSkillRegistry.fromShellPaths(shellPaths).create({
|
|
44
|
+
name: input.name,
|
|
45
|
+
description: input.description,
|
|
46
|
+
procedure: input.notes,
|
|
47
|
+
tags: input.tags,
|
|
48
|
+
triggers: input.triggers,
|
|
49
|
+
enabled: input.enable,
|
|
50
|
+
source: 'agent',
|
|
51
|
+
provenance: 'agent-workspace-learned-behavior',
|
|
52
|
+
});
|
|
53
|
+
return { kind: 'skill', id: created.id, name: created.name };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const created = AgentRoutineRegistry.fromShellPaths(shellPaths).create({
|
|
57
|
+
name: input.name,
|
|
58
|
+
description: input.description,
|
|
59
|
+
steps: input.notes,
|
|
60
|
+
tags: input.tags,
|
|
61
|
+
triggers: input.triggers,
|
|
62
|
+
enabled: input.enable,
|
|
63
|
+
source: 'agent',
|
|
64
|
+
provenance: 'agent-workspace-learned-behavior',
|
|
65
|
+
});
|
|
66
|
+
return { kind: 'routine', id: created.id, name: created.name };
|
|
67
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AgentWorkspaceActionResult, AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
|
|
2
|
+
import type { AgentWorkspaceLibraryCommandEditorKind } from './agent-workspace-library-command-editors.ts';
|
|
3
|
+
import { isAgentWorkspaceLibraryCommandEditorKind } from './agent-workspace-library-command-editors.ts';
|
|
4
|
+
import { quoteSlashCommandArg } from './slash-command-parser.ts';
|
|
5
|
+
|
|
6
|
+
type AgentWorkspaceFieldReader = (fieldId: string) => string;
|
|
7
|
+
|
|
8
|
+
export type AgentWorkspaceLibraryCommandEditorSubmission =
|
|
9
|
+
| {
|
|
10
|
+
readonly kind: 'editor';
|
|
11
|
+
readonly editor: AgentWorkspaceLocalEditor;
|
|
12
|
+
readonly status: string;
|
|
13
|
+
readonly actionResult?: AgentWorkspaceActionResult;
|
|
14
|
+
}
|
|
15
|
+
| {
|
|
16
|
+
readonly kind: 'dispatch';
|
|
17
|
+
readonly command: string;
|
|
18
|
+
readonly status: string;
|
|
19
|
+
readonly actionResult: AgentWorkspaceActionResult;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function isAgentWorkspaceLibraryCommandSubmissionKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceLibraryCommandEditorKind {
|
|
23
|
+
return isAgentWorkspaceLibraryCommandEditorKind(kind);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function buildAgentWorkspaceLibraryCommandEditorSubmission(
|
|
27
|
+
editor: AgentWorkspaceLocalEditor,
|
|
28
|
+
readField: AgentWorkspaceFieldReader,
|
|
29
|
+
): AgentWorkspaceLibraryCommandEditorSubmission {
|
|
30
|
+
const target = editor.kind.startsWith('persona') ? 'persona' : editor.kind.startsWith('skill') ? 'skill' : 'routine';
|
|
31
|
+
const root = target === 'persona' ? '/personas' : target === 'skill' ? '/skills' : '/routines';
|
|
32
|
+
const search = editor.kind.endsWith('search');
|
|
33
|
+
const command = search
|
|
34
|
+
? `${root} search ${quoteSlashCommandArg(readField('query'))}`
|
|
35
|
+
: `${root} show ${quoteSlashCommandArg(readField('id'))}`;
|
|
36
|
+
const label = target === 'persona' ? 'persona' : target === 'skill' ? 'skill' : 'routine';
|
|
37
|
+
const title = search ? `Opening ${label} search` : `Opening ${label} detail`;
|
|
38
|
+
return {
|
|
39
|
+
kind: 'dispatch',
|
|
40
|
+
command,
|
|
41
|
+
status: `${title}.`,
|
|
42
|
+
actionResult: {
|
|
43
|
+
kind: 'dispatched',
|
|
44
|
+
title,
|
|
45
|
+
detail: `The workspace handed read-only local ${label} ${search ? 'search' : 'detail inspection'} to the shell-owned command router.`,
|
|
46
|
+
command,
|
|
47
|
+
safety: 'read-only',
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
|
|
2
|
+
|
|
3
|
+
export type AgentWorkspaceLibraryCommandEditorKind = Extract<
|
|
4
|
+
AgentWorkspaceEditorKind,
|
|
5
|
+
'persona-search' | 'persona-show' | 'skill-search' | 'skill-show' | 'routine-search' | 'routine-show'
|
|
6
|
+
>;
|
|
7
|
+
|
|
8
|
+
export function isAgentWorkspaceLibraryCommandEditorKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceLibraryCommandEditorKind {
|
|
9
|
+
return kind === 'persona-search'
|
|
10
|
+
|| kind === 'persona-show'
|
|
11
|
+
|| kind === 'skill-search'
|
|
12
|
+
|| kind === 'skill-show'
|
|
13
|
+
|| kind === 'routine-search'
|
|
14
|
+
|| kind === 'routine-show';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function createAgentWorkspaceLibraryCommandEditor(kind: AgentWorkspaceLibraryCommandEditorKind): AgentWorkspaceLocalEditor {
|
|
18
|
+
const target = kind.startsWith('persona') ? 'persona' : kind.startsWith('skill') ? 'skill' : 'routine';
|
|
19
|
+
const search = kind.endsWith('search');
|
|
20
|
+
const label = target === 'persona' ? 'Persona' : target === 'skill' ? 'Skill' : 'Routine';
|
|
21
|
+
return {
|
|
22
|
+
kind,
|
|
23
|
+
mode: 'create',
|
|
24
|
+
title: search ? `Search ${label}s` : `Show ${label}`,
|
|
25
|
+
selectedFieldIndex: 0,
|
|
26
|
+
message: search
|
|
27
|
+
? `Search Agent-local ${target}s by name, description, tags, triggers, or body.`
|
|
28
|
+
: `Show one Agent-local ${target} by id.`,
|
|
29
|
+
fields: [
|
|
30
|
+
search
|
|
31
|
+
? { id: 'query', label: 'Search query', value: '', required: false, multiline: false, hint: `Optional text query. Blank lists every local ${target}.` }
|
|
32
|
+
: { id: 'id', label: `${label} id`, value: '', required: true, multiline: false, hint: `Existing local ${target} id.` },
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import type { MemoryApi } from '@pellux/goodvibes-sdk/platform/knowledge';
|
|
2
|
+
import type { ShellPathService } from '@/runtime/index.ts';
|
|
3
|
+
import { AgentNoteRegistry } from '../agent/note-registry.ts';
|
|
4
|
+
import { AgentPersonaRegistry } from '../agent/persona-registry.ts';
|
|
5
|
+
import { AgentRoutineRegistry } from '../agent/routine-registry.ts';
|
|
6
|
+
import { AgentSkillRegistry } from '../agent/skill-registry.ts';
|
|
7
|
+
import { quoteSlashCommandArg } from './slash-command-parser.ts';
|
|
8
|
+
import {
|
|
9
|
+
createKnowledgeUrlEditorFromNote,
|
|
10
|
+
createMemoryEditorFromNote,
|
|
11
|
+
createMemoryUpdateEditor,
|
|
12
|
+
createNoteUpdateEditor,
|
|
13
|
+
createPersonaEditorFromNote,
|
|
14
|
+
createPersonaUpdateEditor,
|
|
15
|
+
createRoutineEditorFromNote,
|
|
16
|
+
createRoutineUpdateEditor,
|
|
17
|
+
createSkillEditorFromNote,
|
|
18
|
+
createSkillUpdateEditor,
|
|
19
|
+
} from './agent-workspace-editors.ts';
|
|
20
|
+
import type {
|
|
21
|
+
AgentWorkspaceActionResult,
|
|
22
|
+
AgentWorkspaceLocalEditor,
|
|
23
|
+
AgentWorkspaceLocalEditorKind,
|
|
24
|
+
AgentWorkspaceLocalLibraryItem,
|
|
25
|
+
AgentWorkspaceLocalOperation,
|
|
26
|
+
} from './agent-workspace-types.ts';
|
|
27
|
+
|
|
28
|
+
interface AgentWorkspaceLocalOperationHost {
|
|
29
|
+
status: string;
|
|
30
|
+
lastActionResult: AgentWorkspaceActionResult | null;
|
|
31
|
+
localEditor: AgentWorkspaceLocalEditor | null;
|
|
32
|
+
hasCommandDispatch(): boolean;
|
|
33
|
+
dispatchWorkspaceCommand(command: string): void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface AgentWorkspaceLocalOperationCallbacks {
|
|
37
|
+
readonly shellPaths: () => ShellPathService | undefined;
|
|
38
|
+
readonly selectedItemForOperation: (operation: AgentWorkspaceLocalOperation) => AgentWorkspaceLocalLibraryItem | null;
|
|
39
|
+
readonly memoryApi: () => MemoryApi;
|
|
40
|
+
readonly finishLocalOperation: (kind: AgentWorkspaceLocalEditorKind, title: string, detail: string) => void;
|
|
41
|
+
readonly openDeleteEditor: (kind: AgentWorkspaceLocalEditorKind, selected: AgentWorkspaceLocalLibraryItem) => void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function setGuidanceEditor(host: AgentWorkspaceLocalOperationHost, editor: AgentWorkspaceLocalEditor, status: string): void {
|
|
45
|
+
host.localEditor = editor;
|
|
46
|
+
host.status = status;
|
|
47
|
+
host.lastActionResult = {
|
|
48
|
+
kind: 'guidance',
|
|
49
|
+
title: editor.title,
|
|
50
|
+
detail: editor.message,
|
|
51
|
+
safety: 'safe',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function applyAgentWorkspaceLocalLibraryOperation(
|
|
56
|
+
host: AgentWorkspaceLocalOperationHost,
|
|
57
|
+
operation: AgentWorkspaceLocalOperation,
|
|
58
|
+
callbacks: AgentWorkspaceLocalOperationCallbacks,
|
|
59
|
+
): void {
|
|
60
|
+
const shellPaths = callbacks.shellPaths();
|
|
61
|
+
if (!shellPaths) {
|
|
62
|
+
host.status = 'Agent-local registry files are unavailable.';
|
|
63
|
+
host.lastActionResult = {
|
|
64
|
+
kind: 'error',
|
|
65
|
+
title: 'Local registry unavailable',
|
|
66
|
+
detail: 'The Agent workspace cannot locate the Agent-local registry files for this runtime.',
|
|
67
|
+
};
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
if (operation === 'persona-clear') {
|
|
72
|
+
AgentPersonaRegistry.fromShellPaths(shellPaths).clearActive();
|
|
73
|
+
callbacks.finishLocalOperation('persona', 'Cleared active persona', 'The default Agent policy will apply to later turns.');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const selected = callbacks.selectedItemForOperation(operation);
|
|
77
|
+
if (!selected) {
|
|
78
|
+
host.status = 'No selected local registry item.';
|
|
79
|
+
host.lastActionResult = {
|
|
80
|
+
kind: 'guidance',
|
|
81
|
+
title: 'Nothing selected',
|
|
82
|
+
detail: 'Create or select a local library item before running this action.',
|
|
83
|
+
safety: 'safe',
|
|
84
|
+
};
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (operation === 'memory-edit') {
|
|
88
|
+
const memory = callbacks.memoryApi();
|
|
89
|
+
const record = memory.get(selected.id);
|
|
90
|
+
if (!record) throw new Error(`Unknown Agent memory ${selected.id}`);
|
|
91
|
+
setGuidanceEditor(host, createMemoryUpdateEditor(record), `Editing memory ${record.id}.`);
|
|
92
|
+
} else if (operation === 'memory-review') {
|
|
93
|
+
const record = callbacks.memoryApi().review(selected.id, { state: 'reviewed', confidence: selected.confidence ?? 100, reviewedBy: 'operator' });
|
|
94
|
+
if (!record) throw new Error(`Unknown Agent memory ${selected.id}`);
|
|
95
|
+
callbacks.finishLocalOperation('memory', `Reviewed memory ${record.id}`, `${record.summary} is marked reviewed.`);
|
|
96
|
+
} else if (operation === 'memory-stale') {
|
|
97
|
+
const record = callbacks.memoryApi().review(selected.id, { state: 'stale', staleReason: 'Marked stale from Agent workspace', reviewedBy: 'operator' });
|
|
98
|
+
if (!record) throw new Error(`Unknown Agent memory ${selected.id}`);
|
|
99
|
+
callbacks.finishLocalOperation('memory', `Marked memory stale ${record.id}`, `${record.summary} needs review before reuse.`);
|
|
100
|
+
} else if (operation === 'memory-delete') {
|
|
101
|
+
callbacks.openDeleteEditor('memory', selected);
|
|
102
|
+
} else if (operation === 'note-edit') {
|
|
103
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
104
|
+
if (!note) throw new Error(`Unknown note ${selected.id}`);
|
|
105
|
+
setGuidanceEditor(host, createNoteUpdateEditor(note), `Editing note ${note.title}.`);
|
|
106
|
+
} else if (operation === 'note-review') {
|
|
107
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).markReviewed(selected.id);
|
|
108
|
+
callbacks.finishLocalOperation('note', `Reviewed note ${note.title}`, `${note.title} is marked reviewed in the local scratchpad.`);
|
|
109
|
+
} else if (operation === 'note-stale') {
|
|
110
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).markStale(selected.id, 'Marked stale from Agent workspace');
|
|
111
|
+
callbacks.finishLocalOperation('note', `Marked note stale ${note.title}`, `${note.title} needs review before reuse.`);
|
|
112
|
+
} else if (operation === 'note-delete') {
|
|
113
|
+
callbacks.openDeleteEditor('note', selected);
|
|
114
|
+
} else if (operation === 'note-promote-memory') {
|
|
115
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
116
|
+
if (!note) throw new Error(`Unknown note ${selected.id}`);
|
|
117
|
+
setGuidanceEditor(host, createMemoryEditorFromNote(note), `Creating memory from note ${note.title}.`);
|
|
118
|
+
} else if (operation === 'note-promote-persona') {
|
|
119
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
120
|
+
if (!note) throw new Error(`Unknown note ${selected.id}`);
|
|
121
|
+
setGuidanceEditor(host, createPersonaEditorFromNote(note), `Creating persona from note ${note.title}.`);
|
|
122
|
+
} else if (operation === 'note-promote-skill') {
|
|
123
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
124
|
+
if (!note) throw new Error(`Unknown note ${selected.id}`);
|
|
125
|
+
setGuidanceEditor(host, createSkillEditorFromNote(note), `Creating skill from note ${note.title}.`);
|
|
126
|
+
} else if (operation === 'note-promote-routine') {
|
|
127
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
128
|
+
if (!note) throw new Error(`Unknown note ${selected.id}`);
|
|
129
|
+
setGuidanceEditor(host, createRoutineEditorFromNote(note), `Creating routine from note ${note.title}.`);
|
|
130
|
+
} else if (operation === 'note-promote-knowledge-url') {
|
|
131
|
+
const note = AgentNoteRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
132
|
+
if (!note) throw new Error(`Unknown note ${selected.id}`);
|
|
133
|
+
const sourceUrl = note.sourceUrl?.trim();
|
|
134
|
+
if (!sourceUrl) {
|
|
135
|
+
host.status = 'Selected note has no reviewed source URL.';
|
|
136
|
+
host.lastActionResult = {
|
|
137
|
+
kind: 'guidance',
|
|
138
|
+
title: 'No note source URL',
|
|
139
|
+
detail: 'Edit the selected note and add a reviewed HTTP(S) source URL before ingesting it into Agent Knowledge.',
|
|
140
|
+
safety: 'safe',
|
|
141
|
+
};
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const parsed = new URL(sourceUrl);
|
|
145
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
146
|
+
throw new Error('Selected note source URL must be HTTP or HTTPS before Agent Knowledge ingest.');
|
|
147
|
+
}
|
|
148
|
+
setGuidanceEditor(host, createKnowledgeUrlEditorFromNote(note), `Preparing Agent Knowledge ingest from note ${note.title}.`);
|
|
149
|
+
} else if (operation === 'persona-edit') {
|
|
150
|
+
const registry = AgentPersonaRegistry.fromShellPaths(shellPaths);
|
|
151
|
+
const persona = registry.get(selected.id);
|
|
152
|
+
if (!persona) throw new Error(`Unknown persona ${selected.id}`);
|
|
153
|
+
setGuidanceEditor(host, createPersonaUpdateEditor(persona, registry.snapshot().activePersonaId === persona.id), `Editing persona ${persona.name}.`);
|
|
154
|
+
} else if (operation === 'persona-use') {
|
|
155
|
+
AgentPersonaRegistry.fromShellPaths(shellPaths).setActive(selected.id);
|
|
156
|
+
callbacks.finishLocalOperation('persona', `Using persona ${selected.name}`, `${selected.name} will shape later main-conversation turns.`);
|
|
157
|
+
} else if (operation === 'persona-review') {
|
|
158
|
+
AgentPersonaRegistry.fromShellPaths(shellPaths).markReviewed(selected.id);
|
|
159
|
+
callbacks.finishLocalOperation('persona', `Reviewed persona ${selected.name}`, `${selected.name} is marked reviewed.`);
|
|
160
|
+
} else if (operation === 'persona-delete') {
|
|
161
|
+
callbacks.openDeleteEditor('persona', selected);
|
|
162
|
+
} else if (operation === 'skill-edit') {
|
|
163
|
+
const skill = AgentSkillRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
164
|
+
if (!skill) throw new Error(`Unknown skill ${selected.id}`);
|
|
165
|
+
setGuidanceEditor(host, createSkillUpdateEditor(skill), `Editing skill ${skill.name}.`);
|
|
166
|
+
} else if (operation === 'skill-enable') {
|
|
167
|
+
AgentSkillRegistry.fromShellPaths(shellPaths).setEnabled(selected.id, true);
|
|
168
|
+
callbacks.finishLocalOperation('skill', `Enabled skill ${selected.name}`, `${selected.name} can now inform main-conversation turns.`);
|
|
169
|
+
} else if (operation === 'skill-disable') {
|
|
170
|
+
AgentSkillRegistry.fromShellPaths(shellPaths).setEnabled(selected.id, false);
|
|
171
|
+
callbacks.finishLocalOperation('skill', `Disabled skill ${selected.name}`, `${selected.name} remains saved but is no longer injected into guidance.`);
|
|
172
|
+
} else if (operation === 'skill-review') {
|
|
173
|
+
AgentSkillRegistry.fromShellPaths(shellPaths).markReviewed(selected.id);
|
|
174
|
+
callbacks.finishLocalOperation('skill', `Reviewed skill ${selected.name}`, `${selected.name} is marked reviewed.`);
|
|
175
|
+
} else if (operation === 'skill-delete') {
|
|
176
|
+
callbacks.openDeleteEditor('skill', selected);
|
|
177
|
+
} else if (operation === 'routine-edit') {
|
|
178
|
+
const routine = AgentRoutineRegistry.fromShellPaths(shellPaths).get(selected.id);
|
|
179
|
+
if (!routine) throw new Error(`Unknown routine ${selected.id}`);
|
|
180
|
+
setGuidanceEditor(host, createRoutineUpdateEditor(routine), `Editing routine ${routine.name}.`);
|
|
181
|
+
} else if (operation === 'routine-start') {
|
|
182
|
+
if (host.hasCommandDispatch()) {
|
|
183
|
+
const command = `/routines start ${quoteSlashCommandArg(selected.id)}`;
|
|
184
|
+
host.dispatchWorkspaceCommand(command);
|
|
185
|
+
host.status = `Opening routine ${selected.name}.`;
|
|
186
|
+
host.lastActionResult = {
|
|
187
|
+
kind: 'dispatched',
|
|
188
|
+
title: `Opening routine ${selected.name}`,
|
|
189
|
+
detail: `${selected.name} will print its workflow steps in the main conversation. No hidden job was created.`,
|
|
190
|
+
command,
|
|
191
|
+
safety: 'safe',
|
|
192
|
+
};
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
AgentRoutineRegistry.fromShellPaths(shellPaths).markStarted(selected.id);
|
|
196
|
+
callbacks.finishLocalOperation('routine', `Started routine ${selected.name}`, `${selected.name} was marked started for this main-conversation workflow. No hidden job was created.`);
|
|
197
|
+
} else if (operation === 'routine-enable') {
|
|
198
|
+
AgentRoutineRegistry.fromShellPaths(shellPaths).setEnabled(selected.id, true);
|
|
199
|
+
callbacks.finishLocalOperation('routine', `Enabled routine ${selected.name}`, `${selected.name} can now inform main-conversation turns.`);
|
|
200
|
+
} else if (operation === 'routine-disable') {
|
|
201
|
+
AgentRoutineRegistry.fromShellPaths(shellPaths).setEnabled(selected.id, false);
|
|
202
|
+
callbacks.finishLocalOperation('routine', `Disabled routine ${selected.name}`, `${selected.name} remains saved but is no longer injected into guidance.`);
|
|
203
|
+
} else if (operation === 'routine-review') {
|
|
204
|
+
AgentRoutineRegistry.fromShellPaths(shellPaths).markReviewed(selected.id);
|
|
205
|
+
callbacks.finishLocalOperation('routine', `Reviewed routine ${selected.name}`, `${selected.name} is marked reviewed.`);
|
|
206
|
+
} else {
|
|
207
|
+
callbacks.openDeleteEditor('routine', selected);
|
|
208
|
+
}
|
|
209
|
+
} catch (error) {
|
|
210
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
211
|
+
host.status = detail;
|
|
212
|
+
host.lastActionResult = {
|
|
213
|
+
kind: 'error',
|
|
214
|
+
title: 'Local registry action failed',
|
|
215
|
+
detail,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|