@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.
Files changed (285) hide show
  1. package/CHANGELOG.md +48 -661
  2. package/README.md +64 -57
  3. package/bin/goodvibes-agent.ts +16 -2
  4. package/dist/package/main.js +199180 -192185
  5. package/docs/README.md +15 -8
  6. package/docs/channels-remote-and-api.md +50 -0
  7. package/docs/connected-host.md +59 -0
  8. package/docs/getting-started.md +61 -50
  9. package/docs/knowledge-artifacts-and-multimodal.md +91 -0
  10. package/docs/project-planning.md +79 -0
  11. package/docs/providers-and-routing.md +46 -0
  12. package/docs/release-and-publishing.md +48 -11
  13. package/docs/tools-and-commands.md +123 -0
  14. package/docs/voice-and-live-tts.md +51 -0
  15. package/package.json +3 -6
  16. package/src/agent/behavior-discovery-summary.ts +1 -3
  17. package/src/agent/channel-delivery.ts +201 -0
  18. package/src/agent/media-generation.ts +159 -0
  19. package/src/agent/memory-prompt.ts +0 -1
  20. package/src/agent/note-registry.ts +329 -0
  21. package/src/agent/operator-actions.ts +343 -0
  22. package/src/agent/persona-discovery.ts +1 -3
  23. package/src/agent/persona-registry.ts +19 -16
  24. package/src/agent/record-labels.ts +107 -0
  25. package/src/agent/reminder-schedule-format.ts +33 -24
  26. package/src/agent/reminder-schedule.ts +27 -26
  27. package/src/agent/routine-registry.ts +54 -14
  28. package/src/agent/routine-schedule-args.ts +2 -1
  29. package/src/agent/routine-schedule-format.ts +77 -53
  30. package/src/agent/routine-schedule-promotion.ts +35 -33
  31. package/src/agent/routine-schedule-receipts.ts +29 -27
  32. package/src/agent/runtime-profile-starters.ts +5 -5
  33. package/src/agent/runtime-profile.ts +91 -12
  34. package/src/agent/skill-registry.ts +210 -32
  35. package/src/cli/agent-knowledge-args.ts +5 -1
  36. package/src/cli/agent-knowledge-command.ts +40 -34
  37. package/src/cli/agent-knowledge-format.ts +80 -67
  38. package/src/cli/agent-knowledge-methods.ts +1 -1
  39. package/src/cli/agent-knowledge-runtime.ts +32 -26
  40. package/src/cli/bundle-command.ts +14 -9
  41. package/src/cli/config-overrides.ts +37 -36
  42. package/src/cli/entrypoint.ts +16 -7
  43. package/src/cli/external-runtime.ts +10 -4
  44. package/src/cli/help.ts +54 -29
  45. package/src/cli/local-library-command.ts +203 -83
  46. package/src/cli/management-commands.ts +105 -68
  47. package/src/cli/management.ts +55 -74
  48. package/src/cli/memory-command.ts +66 -32
  49. package/src/cli/parser.ts +37 -3
  50. package/src/cli/profiles-command.ts +166 -31
  51. package/src/cli/provider-auth-routes.ts +2 -1
  52. package/src/cli/routines-command.ts +176 -40
  53. package/src/cli/service-posture.ts +16 -16
  54. package/src/cli/status.ts +56 -135
  55. package/src/core/conversation-message-snapshot.ts +131 -0
  56. package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
  57. package/src/input/agent-workspace-access-command-editors.ts +170 -0
  58. package/src/input/agent-workspace-activation.ts +35 -8
  59. package/src/input/agent-workspace-basic-command-editor-submission.ts +351 -94
  60. package/src/input/agent-workspace-basic-command-editors.ts +502 -9
  61. package/src/input/agent-workspace-categories.ts +423 -51
  62. package/src/input/agent-workspace-channel-command-editor-submission.ts +83 -0
  63. package/src/input/agent-workspace-channel-command-editors.ts +65 -0
  64. package/src/input/agent-workspace-channels.ts +35 -2
  65. package/src/input/agent-workspace-command-editor.ts +41 -3
  66. package/src/input/agent-workspace-config-reader.ts +16 -0
  67. package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
  68. package/src/input/agent-workspace-editors.ts +166 -1
  69. package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
  70. package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
  71. package/src/input/agent-workspace-knowledge-query-editor.ts +1 -1
  72. package/src/input/agent-workspace-learned-behavior.ts +67 -0
  73. package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
  74. package/src/input/agent-workspace-library-command-editors.ts +35 -0
  75. package/src/input/agent-workspace-local-operations.ts +218 -0
  76. package/src/input/agent-workspace-local-selection.ts +75 -0
  77. package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
  78. package/src/input/agent-workspace-media-command-editor-submission.ts +62 -0
  79. package/src/input/agent-workspace-media-command-editors.ts +27 -0
  80. package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
  81. package/src/input/agent-workspace-memory-command-editors.ts +180 -0
  82. package/src/input/agent-workspace-memory-editor.ts +2 -2
  83. package/src/input/agent-workspace-navigation.ts +81 -0
  84. package/src/input/agent-workspace-notify-editor-submission.ts +121 -0
  85. package/src/input/agent-workspace-operations-command-editor-submission.ts +208 -0
  86. package/src/input/agent-workspace-operations-command-editors.ts +196 -0
  87. package/src/input/agent-workspace-panel-route.ts +43 -0
  88. package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
  89. package/src/input/agent-workspace-provider-command-editors.ts +93 -0
  90. package/src/input/agent-workspace-reminder-schedule-editor.ts +1 -1
  91. package/src/input/agent-workspace-requirements.ts +11 -0
  92. package/src/input/agent-workspace-routine-schedule-editor.ts +2 -2
  93. package/src/input/agent-workspace-search.ts +169 -0
  94. package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
  95. package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
  96. package/src/input/agent-workspace-session-command-editors.ts +249 -0
  97. package/src/input/agent-workspace-setup.ts +37 -16
  98. package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
  99. package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
  100. package/src/input/agent-workspace-snapshot.ts +162 -21
  101. package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
  102. package/src/input/agent-workspace-task-command-editors.ts +47 -0
  103. package/src/input/agent-workspace-token.ts +18 -2
  104. package/src/input/agent-workspace-types.ts +212 -4
  105. package/src/input/agent-workspace-voice-media.ts +4 -7
  106. package/src/input/agent-workspace-web-research-editor.ts +104 -0
  107. package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
  108. package/src/input/agent-workspace.ts +178 -240
  109. package/src/input/command-registry.ts +5 -2
  110. package/src/input/commands/agent-runtime-profile-runtime.ts +126 -37
  111. package/src/input/commands/agent-skills-runtime.ts +149 -72
  112. package/src/input/commands/agent-workspace-runtime.ts +23 -6
  113. package/src/input/commands/brief-runtime.ts +55 -25
  114. package/src/input/commands/channels-runtime.ts +147 -33
  115. package/src/input/commands/compat-runtime.ts +32 -0
  116. package/src/input/commands/delegation-runtime.ts +29 -23
  117. package/src/input/commands/experience-runtime.ts +6 -4
  118. package/src/input/commands/guidance-runtime.ts +4 -4
  119. package/src/input/commands/health-runtime.ts +149 -126
  120. package/src/input/commands/knowledge.ts +82 -60
  121. package/src/input/commands/local-provider-runtime.ts +43 -21
  122. package/src/input/commands/local-runtime.ts +138 -16
  123. package/src/input/commands/local-setup-review.ts +10 -20
  124. package/src/input/commands/mcp-runtime.ts +63 -46
  125. package/src/input/commands/notify-runtime.ts +38 -9
  126. package/src/input/commands/operator-actions-runtime.ts +138 -0
  127. package/src/input/commands/operator-runtime.ts +6 -76
  128. package/src/input/commands/personas-runtime.ts +46 -31
  129. package/src/input/commands/planning-runtime.ts +1 -1
  130. package/src/input/commands/platform-access-runtime.ts +35 -98
  131. package/src/input/commands/product-runtime.ts +2 -2
  132. package/src/input/commands/provider-accounts-runtime.ts +60 -39
  133. package/src/input/commands/qrcode-runtime.ts +50 -9
  134. package/src/input/commands/recall-bundle.ts +11 -11
  135. package/src/input/commands/recall-capture.ts +13 -11
  136. package/src/input/commands/recall-query.ts +29 -21
  137. package/src/input/commands/recall-review.ts +2 -1
  138. package/src/input/commands/routines-runtime.ts +99 -45
  139. package/src/input/commands/runtime-services.ts +1 -14
  140. package/src/input/commands/schedule-runtime.ts +33 -20
  141. package/src/input/commands/security-runtime.ts +6 -11
  142. package/src/input/commands/session-content.ts +80 -78
  143. package/src/input/commands/session-workflow.ts +134 -104
  144. package/src/input/commands/session.ts +3 -174
  145. package/src/input/commands/shell-core.ts +38 -17
  146. package/src/input/commands/subscription-runtime.ts +54 -185
  147. package/src/input/commands/support-bundle-runtime.ts +53 -0
  148. package/src/input/commands/tasks-runtime.ts +21 -21
  149. package/src/input/commands/work-plan-runtime.ts +33 -8
  150. package/src/input/commands.ts +6 -2
  151. package/src/input/feed-context-factory.ts +2 -2
  152. package/src/input/file-picker.ts +3 -2
  153. package/src/input/handler-command-route.ts +4 -7
  154. package/src/input/handler-content-actions.ts +89 -26
  155. package/src/input/handler-feed-routes.ts +19 -12
  156. package/src/input/handler-feed.ts +6 -5
  157. package/src/input/handler-interactions.ts +9 -36
  158. package/src/input/handler-modal-stack.ts +3 -3
  159. package/src/input/handler-onboarding.ts +52 -91
  160. package/src/input/handler-shortcuts.ts +16 -7
  161. package/src/input/handler.ts +50 -23
  162. package/src/input/input-history.ts +5 -6
  163. package/src/input/keybindings.ts +27 -16
  164. package/src/input/mcp-workspace.ts +90 -26
  165. package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
  166. package/src/input/onboarding/onboarding-wizard-apply.ts +62 -0
  167. package/src/input/onboarding/onboarding-wizard-constants.ts +1 -0
  168. package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
  169. package/src/input/onboarding/onboarding-wizard-operator-steps.ts +223 -55
  170. package/src/input/onboarding/onboarding-wizard-steps.ts +59 -35
  171. package/src/input/onboarding/onboarding-wizard-types.ts +4 -1
  172. package/src/input/onboarding/onboarding-wizard.ts +87 -2
  173. package/src/input/profile-picker-modal.ts +31 -12
  174. package/src/input/session-picker-modal.ts +21 -4
  175. package/src/input/settings-modal-agent-policy.ts +6 -6
  176. package/src/input/settings-modal-behavior.ts +0 -3
  177. package/src/input/settings-modal-subscriptions.ts +3 -3
  178. package/src/input/settings-modal-types.ts +2 -13
  179. package/src/input/settings-modal.ts +20 -66
  180. package/src/input/submission-intent.ts +0 -1
  181. package/src/input/submission-router.ts +3 -3
  182. package/src/main.ts +18 -10
  183. package/src/panels/approval-panel.ts +8 -8
  184. package/src/panels/automation-control-panel.ts +4 -4
  185. package/src/panels/base-panel.ts +1 -1
  186. package/src/panels/builtin/agent.ts +1 -1
  187. package/src/panels/builtin/operations.ts +3 -12
  188. package/src/panels/builtin/session.ts +32 -24
  189. package/src/panels/builtin/shared.ts +7 -7
  190. package/src/panels/cost-tracker-panel.ts +1 -1
  191. package/src/panels/docs-panel.ts +5 -3
  192. package/src/panels/index.ts +0 -1
  193. package/src/panels/knowledge-panel.ts +6 -5
  194. package/src/panels/memory-panel.ts +7 -6
  195. package/src/panels/panel-list-panel.ts +36 -80
  196. package/src/panels/project-planning-panel.ts +19 -12
  197. package/src/panels/provider-account-snapshot.ts +51 -25
  198. package/src/panels/provider-accounts-panel.ts +33 -18
  199. package/src/panels/provider-health-domains.ts +48 -7
  200. package/src/panels/provider-health-panel.ts +5 -4
  201. package/src/panels/qr-panel.ts +44 -20
  202. package/src/panels/schedule-panel.ts +9 -17
  203. package/src/panels/security-panel.ts +8 -8
  204. package/src/panels/session-browser-panel.ts +10 -10
  205. package/src/panels/subscription-panel.ts +6 -6
  206. package/src/panels/system-messages-panel.ts +3 -3
  207. package/src/panels/tasks-panel.ts +21 -14
  208. package/src/panels/tool-inspector-panel.ts +19 -12
  209. package/src/panels/work-plan-panel.ts +5 -5
  210. package/src/planning/project-planning-coordinator.ts +3 -3
  211. package/src/provider-auth-route-display.ts +9 -0
  212. package/src/renderer/agent-workspace-style.ts +34 -0
  213. package/src/renderer/agent-workspace.ts +254 -57
  214. package/src/renderer/autocomplete-overlay.ts +25 -6
  215. package/src/renderer/block-actions.ts +1 -3
  216. package/src/renderer/bookmark-modal.ts +19 -4
  217. package/src/renderer/buffer.ts +4 -2
  218. package/src/renderer/context-inspector.ts +50 -13
  219. package/src/renderer/diff.ts +1 -1
  220. package/src/renderer/file-picker-overlay.ts +19 -6
  221. package/src/renderer/help-overlay.ts +112 -34
  222. package/src/renderer/history-search-overlay.ts +19 -4
  223. package/src/renderer/live-tail-modal.ts +27 -5
  224. package/src/renderer/mcp-workspace.ts +176 -43
  225. package/src/renderer/model-picker-overlay.ts +58 -3
  226. package/src/renderer/model-workspace.ts +104 -22
  227. package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
  228. package/src/renderer/process-modal.ts +27 -6
  229. package/src/renderer/profile-picker-modal.ts +21 -5
  230. package/src/renderer/search-overlay.ts +25 -5
  231. package/src/renderer/selection-modal-overlay.ts +46 -14
  232. package/src/renderer/session-picker-modal.ts +18 -1
  233. package/src/renderer/settings-modal-helpers.ts +2 -40
  234. package/src/renderer/settings-modal.ts +88 -55
  235. package/src/renderer/system-message.ts +1 -1
  236. package/src/renderer/tool-call.ts +20 -11
  237. package/src/runtime/agent-runtime-events.ts +129 -0
  238. package/src/runtime/bootstrap-command-context.ts +7 -1
  239. package/src/runtime/bootstrap-command-parts.ts +11 -8
  240. package/src/runtime/bootstrap-core.ts +23 -65
  241. package/src/runtime/bootstrap-hook-bridge.ts +7 -18
  242. package/src/runtime/bootstrap-shell.ts +46 -8
  243. package/src/runtime/bootstrap.ts +36 -46
  244. package/src/runtime/connected-host-auth.ts +47 -0
  245. package/src/runtime/diagnostics/panels/index.ts +2 -2
  246. package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
  247. package/src/runtime/diagnostics/panels/policy.ts +7 -7
  248. package/src/runtime/index.ts +2 -5
  249. package/src/runtime/onboarding/apply-file-helpers.ts +66 -0
  250. package/src/runtime/onboarding/apply.ts +288 -74
  251. package/src/runtime/onboarding/derivation.ts +10 -13
  252. package/src/runtime/onboarding/snapshot.ts +2 -17
  253. package/src/runtime/onboarding/types.ts +34 -20
  254. package/src/runtime/onboarding/verify.ts +105 -4
  255. package/src/runtime/operator-token-cleanup.ts +3 -3
  256. package/src/runtime/services.ts +95 -11
  257. package/src/runtime/store/selectors/index.ts +3 -3
  258. package/src/runtime/store/state.ts +1 -4
  259. package/src/runtime/surface-feature-flags.ts +41 -6
  260. package/src/runtime/ui-read-models.ts +3 -4
  261. package/src/runtime/ui-services.ts +6 -6
  262. package/src/shell/blocking-input.ts +2 -1
  263. package/src/shell/service-settings-sync.ts +7 -7
  264. package/src/shell/ui-openers.ts +17 -38
  265. package/src/tools/agent-analysis-registry-policy.ts +0 -1
  266. package/src/tools/agent-channel-send-tool.ts +133 -0
  267. package/src/tools/agent-context-policy.ts +1 -1
  268. package/src/tools/agent-knowledge-ingest-tool.ts +405 -0
  269. package/src/tools/agent-knowledge-tool.ts +170 -0
  270. package/src/tools/agent-local-registry-tool.ts +279 -73
  271. package/src/tools/agent-media-generate-tool.ts +133 -0
  272. package/src/tools/agent-notify-tool.ts +143 -0
  273. package/src/tools/agent-operator-action-tool.ts +137 -0
  274. package/src/tools/agent-operator-briefing-tool.ts +217 -0
  275. package/src/tools/agent-reminder-schedule-tool.ts +237 -0
  276. package/src/tools/agent-tool-policy-guard.ts +13 -15
  277. package/src/tools/agent-work-plan-tool.ts +256 -0
  278. package/src/version.ts +1 -1
  279. package/docs/connected-services.md +0 -51
  280. package/src/cli/package-verification.ts +0 -274
  281. package/src/input/commands/policy-dispatch.ts +0 -339
  282. package/src/input/commands/policy.ts +0 -17
  283. package/src/panels/panel-picker.ts +0 -105
  284. package/src/panels/policy-panel.ts +0 -308
  285. package/src/renderer/panel-picker-overlay.ts +0 -202
@@ -0,0 +1,75 @@
1
+ import type {
2
+ AgentWorkspaceActionResult,
3
+ AgentWorkspaceLocalEditorKind,
4
+ AgentWorkspaceLocalLibraryItem,
5
+ AgentWorkspaceRuntimeSnapshot,
6
+ } from './agent-workspace-types.ts';
7
+
8
+ export type AgentWorkspaceLocalSelectionIndexes = Record<AgentWorkspaceLocalEditorKind, number>;
9
+
10
+ export interface AgentWorkspaceLocalSelectionHost {
11
+ readonly runtimeSnapshot: AgentWorkspaceRuntimeSnapshot | null;
12
+ readonly selectedLibraryItemIndexes: AgentWorkspaceLocalSelectionIndexes;
13
+ status: string;
14
+ lastActionResult: AgentWorkspaceActionResult | null;
15
+ selectedLocalLibraryItem(kind: AgentWorkspaceLocalEditorKind): AgentWorkspaceLocalLibraryItem | null;
16
+ }
17
+
18
+ export function agentWorkspaceLocalLibraryItems(
19
+ snapshot: AgentWorkspaceRuntimeSnapshot | null,
20
+ kind: AgentWorkspaceLocalEditorKind,
21
+ ): readonly AgentWorkspaceLocalLibraryItem[] {
22
+ if (kind === 'memory') return snapshot?.localMemories ?? [];
23
+ if (kind === 'note') return snapshot?.localNotes ?? [];
24
+ if (kind === 'persona') return snapshot?.localPersonas ?? [];
25
+ if (kind === 'skill') return snapshot?.localSkills ?? [];
26
+ if (kind === 'profile') return [];
27
+ return snapshot?.localRoutines ?? [];
28
+ }
29
+
30
+ export function selectedAgentWorkspaceLocalLibraryItem(
31
+ snapshot: AgentWorkspaceRuntimeSnapshot | null,
32
+ indexes: AgentWorkspaceLocalSelectionIndexes,
33
+ kind: AgentWorkspaceLocalEditorKind,
34
+ ): AgentWorkspaceLocalLibraryItem | null {
35
+ const items = agentWorkspaceLocalLibraryItems(snapshot, kind);
36
+ if (items.length === 0) return null;
37
+ const index = Math.max(0, Math.min(indexes[kind], items.length - 1));
38
+ return items[index] ?? null;
39
+ }
40
+
41
+ export function clampAgentWorkspaceLocalLibrarySelection(
42
+ snapshot: AgentWorkspaceRuntimeSnapshot | null,
43
+ indexes: AgentWorkspaceLocalSelectionIndexes,
44
+ kind: AgentWorkspaceLocalEditorKind,
45
+ ): void {
46
+ const length = agentWorkspaceLocalLibraryItems(snapshot, kind).length;
47
+ indexes[kind] = length === 0 ? 0 : Math.max(0, Math.min(indexes[kind], length - 1));
48
+ }
49
+
50
+ export function moveAgentWorkspaceLocalLibraryItemSelection(
51
+ host: AgentWorkspaceLocalSelectionHost,
52
+ kind: AgentWorkspaceLocalEditorKind,
53
+ delta: number,
54
+ ): void {
55
+ const items = agentWorkspaceLocalLibraryItems(host.runtimeSnapshot, kind);
56
+ if (items.length === 0) {
57
+ host.status = `No local ${kind} records to select.`;
58
+ host.lastActionResult = {
59
+ kind: 'guidance',
60
+ title: `No ${kind} records`,
61
+ detail: `Create a local ${kind} before using selection actions.`,
62
+ safety: 'safe',
63
+ };
64
+ return;
65
+ }
66
+ host.selectedLibraryItemIndexes[kind] = Math.max(0, Math.min(items.length - 1, host.selectedLibraryItemIndexes[kind] + delta));
67
+ const selected = host.selectedLocalLibraryItem(kind);
68
+ host.status = selected ? `Selected ${kind}: ${selected.name}.` : `Selected ${kind} updated.`;
69
+ host.lastActionResult = {
70
+ kind: 'guidance',
71
+ title: selected ? `Selected ${selected.name}` : `Selected ${kind}`,
72
+ detail: selected ? `${selected.name} (${selected.id}) is now the selected local ${kind}.` : `Selection changed for ${kind}.`,
73
+ safety: 'safe',
74
+ };
75
+ }
@@ -0,0 +1,95 @@
1
+ import type { AgentWorkspaceActionResult, AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
2
+ import { quoteSlashCommandArg, tokenizeSlashCommand } from './slash-command-parser.ts';
3
+
4
+ type AgentWorkspaceFieldReader = (fieldId: string) => string;
5
+
6
+ export type AgentWorkspaceMcpCommandEditorKind = Extract<AgentWorkspaceEditorKind, 'mcp-server' | 'mcp-tools-server' | 'mcp-repair'>;
7
+
8
+ export type AgentWorkspaceMcpCommandEditorSubmission =
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 isAgentWorkspaceMcpCommandSubmissionKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceMcpCommandEditorKind {
23
+ return kind === 'mcp-server' || kind === 'mcp-tools-server' || kind === 'mcp-repair';
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
+ export function buildAgentWorkspaceMcpCommandEditorSubmission(
35
+ editor: AgentWorkspaceLocalEditor,
36
+ readField: AgentWorkspaceFieldReader,
37
+ ): AgentWorkspaceMcpCommandEditorSubmission {
38
+ if (editor.kind === 'mcp-tools-server' || editor.kind === 'mcp-repair') {
39
+ const server = quoteSlashCommandArg(readField('server'));
40
+ const tools = editor.kind === 'mcp-tools-server';
41
+ const command = tools ? `/mcp tools ${server}` : `/mcp repair ${server}`;
42
+ const title = tools ? 'Opening MCP server tools' : 'Opening MCP repair guidance';
43
+ return {
44
+ kind: 'dispatch',
45
+ command,
46
+ status: `${title}.`,
47
+ actionResult: {
48
+ kind: 'dispatched',
49
+ title,
50
+ detail: tools
51
+ ? 'The workspace handed read-only MCP server tool inspection to the shell-owned command router.'
52
+ : 'The workspace handed read-only MCP repair guidance to the shell-owned command router.',
53
+ command,
54
+ safety: 'read-only',
55
+ },
56
+ };
57
+ }
58
+ if (!isAffirmative(readField('confirm'))) {
59
+ return {
60
+ kind: 'editor',
61
+ editor: { ...editor, message: 'MCP server add/update not confirmed. Type yes, then press Enter.' },
62
+ status: 'MCP server add/update not confirmed.',
63
+ };
64
+ }
65
+ const parts = [
66
+ '/mcp',
67
+ 'add',
68
+ quoteSlashCommandArg(readField('name')),
69
+ quoteSlashCommandArg(readField('command')),
70
+ ...tokenizeSlashCommand(readField('args')).map(quoteSlashCommandArg),
71
+ ];
72
+ const scope = readField('scope');
73
+ const role = readField('role');
74
+ const trust = readField('trust');
75
+ if (scope.length > 0) parts.push('--scope', quoteSlashCommandArg(scope));
76
+ if (role.length > 0) parts.push('--role', quoteSlashCommandArg(role));
77
+ if (trust.length > 0) parts.push('--trust', quoteSlashCommandArg(trust));
78
+ for (const env of splitCommaList(readField('env'))) parts.push('--env', quoteSlashCommandArg(env));
79
+ for (const path of splitCommaList(readField('paths'))) parts.push('--path', quoteSlashCommandArg(path));
80
+ for (const host of splitCommaList(readField('hosts'))) parts.push('--host', quoteSlashCommandArg(host));
81
+ parts.push('--yes');
82
+ const command = parts.join(' ');
83
+ return {
84
+ kind: 'dispatch',
85
+ command,
86
+ status: 'Opening MCP server add/update.',
87
+ actionResult: {
88
+ kind: 'dispatched',
89
+ title: 'Opening MCP server add/update',
90
+ detail: 'The workspace handed a confirmed MCP server add/update command to the shell-owned command router.',
91
+ command,
92
+ safety: 'safe',
93
+ },
94
+ };
95
+ }
@@ -0,0 +1,62 @@
1
+ import type { AgentWorkspaceActionResult, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
2
+ import type { AgentWorkspaceMediaCommandEditorKind } from './agent-workspace-media-command-editors.ts';
3
+ import { isAgentWorkspaceMediaCommandEditorKind } from './agent-workspace-media-command-editors.ts';
4
+ import { quoteSlashCommandArg } from './slash-command-parser.ts';
5
+
6
+ type AgentWorkspaceFieldReader = (fieldId: string) => string;
7
+
8
+ export type AgentWorkspaceMediaCommandEditorSubmission =
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 isAgentWorkspaceMediaCommandSubmissionKind(kind: string): kind is AgentWorkspaceMediaCommandEditorKind {
23
+ return isAgentWorkspaceMediaCommandEditorKind(kind as AgentWorkspaceMediaCommandEditorKind);
24
+ }
25
+
26
+ function isAffirmative(value: string): boolean {
27
+ return /^(y|yes|true)$/i.test(value.trim());
28
+ }
29
+
30
+ export function buildAgentWorkspaceMediaCommandEditorSubmission(
31
+ editor: AgentWorkspaceLocalEditor,
32
+ readField: AgentWorkspaceFieldReader,
33
+ ): AgentWorkspaceMediaCommandEditorSubmission {
34
+ if (!isAffirmative(readField('confirm'))) {
35
+ return {
36
+ kind: 'editor',
37
+ editor: { ...editor, message: 'Media generation not confirmed. Type yes, then press Enter.' },
38
+ status: 'Agent media generation not confirmed.',
39
+ };
40
+ }
41
+ const parts = ['/media', 'generate'];
42
+ const provider = readField('provider');
43
+ const model = readField('model');
44
+ const mime = readField('mime');
45
+ if (provider) parts.push('--provider', quoteSlashCommandArg(provider));
46
+ if (model) parts.push('--model', quoteSlashCommandArg(model));
47
+ if (mime) parts.push('--mime', quoteSlashCommandArg(mime));
48
+ parts.push(quoteSlashCommandArg(readField('prompt')), '--yes');
49
+ const command = parts.join(' ');
50
+ return {
51
+ kind: 'dispatch',
52
+ command,
53
+ status: 'Opening media generation.',
54
+ actionResult: {
55
+ kind: 'dispatched',
56
+ title: 'Opening media generation',
57
+ detail: 'The workspace handed confirmed media generation to the shell-owned command router.',
58
+ command,
59
+ safety: 'safe',
60
+ },
61
+ };
62
+ }
@@ -0,0 +1,27 @@
1
+ import type { AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
2
+
3
+ export type AgentWorkspaceMediaCommandEditorKind = Extract<
4
+ AgentWorkspaceEditorKind,
5
+ 'media-generate'
6
+ >;
7
+
8
+ export function isAgentWorkspaceMediaCommandEditorKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceMediaCommandEditorKind {
9
+ return kind === 'media-generate';
10
+ }
11
+
12
+ export function createAgentWorkspaceMediaCommandEditor(kind: AgentWorkspaceMediaCommandEditorKind): AgentWorkspaceLocalEditor {
13
+ return {
14
+ kind,
15
+ mode: 'create',
16
+ title: 'Generate Media',
17
+ selectedFieldIndex: 0,
18
+ message: 'Generate image or video artifacts through a configured media provider. Type yes on the final field to confirm.',
19
+ fields: [
20
+ { id: 'prompt', label: 'Prompt', value: '', required: true, multiline: true, hint: 'Describe the media to generate. Ctrl-J inserts a new line.' },
21
+ { id: 'provider', label: 'Provider', value: '', required: false, multiline: false, hint: 'Optional media provider id, such as fal, comfy, runway, alibaba, or byteplus.' },
22
+ { id: 'model', label: 'Model', value: '', required: false, multiline: false, hint: 'Optional provider-specific media model id.' },
23
+ { id: 'mime', label: 'Output MIME', value: '', required: false, multiline: false, hint: 'Optional output type, such as image/png or video/mp4.' },
24
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /media generate with --yes.' },
25
+ ],
26
+ };
27
+ }
@@ -0,0 +1,232 @@
1
+ import type { AgentWorkspaceAction, AgentWorkspaceActionResult, AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
2
+ import { quoteSlashCommandArg } from './slash-command-parser.ts';
3
+ import type { AgentWorkspaceMemoryCommandEditorKind } from './agent-workspace-memory-command-editors.ts';
4
+ import { isAgentWorkspaceMemoryCommandEditorKind } from './agent-workspace-memory-command-editors.ts';
5
+
6
+ type AgentWorkspaceFieldReader = (fieldId: string) => string;
7
+
8
+ export type AgentWorkspaceMemoryCommandEditorSubmission =
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
+ type MemoryDispatchSafety = AgentWorkspaceAction['safety'];
23
+
24
+ function isAffirmative(value: string): boolean {
25
+ return /^(y|yes|true)$/i.test(value.trim());
26
+ }
27
+
28
+ function splitCommaList(value: string): readonly string[] {
29
+ return value.split(',').map((entry) => entry.trim()).filter(Boolean);
30
+ }
31
+
32
+ function unconfirmed(editor: AgentWorkspaceLocalEditor, label: string): AgentWorkspaceMemoryCommandEditorSubmission {
33
+ return {
34
+ kind: 'editor',
35
+ editor: { ...editor, message: `${label} not confirmed. Type yes, then press Enter.` },
36
+ status: `${label} not confirmed.`,
37
+ };
38
+ }
39
+
40
+ function dispatch(
41
+ command: string,
42
+ title: string,
43
+ status: string,
44
+ detail: string,
45
+ safety: MemoryDispatchSafety,
46
+ ): AgentWorkspaceMemoryCommandEditorSubmission {
47
+ return {
48
+ kind: 'dispatch',
49
+ command,
50
+ status,
51
+ actionResult: {
52
+ kind: 'dispatched',
53
+ title,
54
+ detail,
55
+ command,
56
+ safety,
57
+ },
58
+ };
59
+ }
60
+
61
+ function appendOptional(parts: string[], flag: string, value: string): void {
62
+ if (value.trim().length > 0) {
63
+ parts.push(flag, quoteSlashCommandArg(value));
64
+ }
65
+ }
66
+
67
+ function requireConfirmation(
68
+ editor: AgentWorkspaceLocalEditor,
69
+ readField: AgentWorkspaceFieldReader,
70
+ label: string,
71
+ ): AgentWorkspaceMemoryCommandEditorSubmission | null {
72
+ return isAffirmative(readField('confirm')) ? null : unconfirmed(editor, label);
73
+ }
74
+
75
+ export function isAgentWorkspaceMemoryCommandSubmissionKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceMemoryCommandEditorKind {
76
+ return isAgentWorkspaceMemoryCommandEditorKind(kind);
77
+ }
78
+
79
+ export function buildAgentWorkspaceMemoryCommandEditorSubmission(
80
+ editor: AgentWorkspaceLocalEditor,
81
+ readField: AgentWorkspaceFieldReader,
82
+ ): AgentWorkspaceMemoryCommandEditorSubmission {
83
+ if (editor.kind === 'memory-search') {
84
+ const parts = ['/memory', 'search'];
85
+ const query = readField('query');
86
+ if (query.length > 0) parts.push(quoteSlashCommandArg(query));
87
+ appendOptional(parts, '--scope', readField('scope'));
88
+ appendOptional(parts, '--cls', readField('class'));
89
+ appendOptional(parts, '--limit', readField('limit'));
90
+ if (isAffirmative(readField('semantic'))) parts.push('--semantic');
91
+ const command = parts.join(' ');
92
+ return dispatch(
93
+ command,
94
+ 'Opening Agent memory search',
95
+ 'Opening Agent memory search.',
96
+ 'The workspace handed an Agent-local memory search command to the shell-owned command router.',
97
+ 'read-only',
98
+ );
99
+ }
100
+
101
+ if (editor.kind === 'memory-get') {
102
+ const command = `/memory get ${quoteSlashCommandArg(readField('id'))}`;
103
+ return dispatch(
104
+ command,
105
+ 'Opening Agent memory record',
106
+ 'Opening Agent memory record.',
107
+ 'The workspace handed an Agent-local memory lookup command to the shell-owned command router.',
108
+ 'read-only',
109
+ );
110
+ }
111
+
112
+ if (editor.kind === 'memory-explain') {
113
+ const parts = ['/memory', 'explain', quoteSlashCommandArg(readField('task'))];
114
+ const scopes = splitCommaList(readField('scopes'));
115
+ if (scopes.length > 0) {
116
+ parts.push('--scope');
117
+ for (const scope of scopes) parts.push(quoteSlashCommandArg(scope));
118
+ }
119
+ const command = parts.join(' ');
120
+ return dispatch(
121
+ command,
122
+ 'Opening Agent memory explanation',
123
+ 'Opening Agent memory explanation.',
124
+ 'The workspace handed an Agent-local memory explanation command to the shell-owned command router.',
125
+ 'read-only',
126
+ );
127
+ }
128
+
129
+ if (editor.kind === 'memory-promote') {
130
+ const confirmation = requireConfirmation(editor, readField, 'Memory promotion');
131
+ if (confirmation) return confirmation;
132
+ const command = `/memory promote ${quoteSlashCommandArg(readField('id'))} ${quoteSlashCommandArg(readField('scope'))} --yes`;
133
+ return dispatch(
134
+ command,
135
+ 'Opening Agent memory promotion',
136
+ 'Opening Agent memory promotion.',
137
+ 'The workspace handed a confirmed Agent-local memory promotion command to the shell-owned command router.',
138
+ 'safe',
139
+ );
140
+ }
141
+
142
+ if (editor.kind === 'memory-link') {
143
+ const confirmation = requireConfirmation(editor, readField, 'Memory link');
144
+ if (confirmation) return confirmation;
145
+ const command = `/memory link ${quoteSlashCommandArg(readField('fromId'))} ${quoteSlashCommandArg(readField('toId'))} ${quoteSlashCommandArg(readField('relation'))} --yes`;
146
+ return dispatch(
147
+ command,
148
+ 'Opening Agent memory link',
149
+ 'Opening Agent memory link.',
150
+ 'The workspace handed a confirmed Agent-local memory link command to the shell-owned command router.',
151
+ 'safe',
152
+ );
153
+ }
154
+
155
+ if (editor.kind === 'memory-export') {
156
+ const confirmation = requireConfirmation(editor, readField, 'Memory bundle export');
157
+ if (confirmation) return confirmation;
158
+ const parts = ['/memory', 'export', quoteSlashCommandArg(readField('path'))];
159
+ appendOptional(parts, '--scope', readField('scope'));
160
+ appendOptional(parts, '--cls', readField('class'));
161
+ parts.push('--yes');
162
+ return dispatch(
163
+ parts.join(' '),
164
+ 'Opening Agent memory bundle export',
165
+ 'Opening Agent memory bundle export.',
166
+ 'The workspace handed a confirmed Agent-local memory export command to the shell-owned command router.',
167
+ 'safe',
168
+ );
169
+ }
170
+
171
+ if (editor.kind === 'memory-import') {
172
+ const confirmation = requireConfirmation(editor, readField, 'Memory bundle import');
173
+ if (confirmation) return confirmation;
174
+ const command = `/memory import ${quoteSlashCommandArg(readField('path'))} --yes`;
175
+ return dispatch(
176
+ command,
177
+ 'Opening Agent memory bundle import',
178
+ 'Opening Agent memory bundle import.',
179
+ 'The workspace handed a confirmed Agent-local memory import command to the shell-owned command router.',
180
+ 'safe',
181
+ );
182
+ }
183
+
184
+ if (editor.kind === 'memory-handoff-export') {
185
+ const confirmation = requireConfirmation(editor, readField, 'Memory handoff export');
186
+ if (confirmation) return confirmation;
187
+ const parts = ['/memory', 'handoff-export', quoteSlashCommandArg(readField('path'))];
188
+ appendOptional(parts, '--scope', readField('scope'));
189
+ parts.push('--yes');
190
+ return dispatch(
191
+ parts.join(' '),
192
+ 'Opening Agent memory handoff export',
193
+ 'Opening Agent memory handoff export.',
194
+ 'The workspace handed a confirmed Agent-local memory handoff export command to the shell-owned command router.',
195
+ 'safe',
196
+ );
197
+ }
198
+
199
+ if (editor.kind === 'memory-handoff-inspect') {
200
+ const command = `/memory handoff-inspect ${quoteSlashCommandArg(readField('path'))}`;
201
+ return dispatch(
202
+ command,
203
+ 'Opening Agent memory handoff inspection',
204
+ 'Opening Agent memory handoff inspection.',
205
+ 'The workspace handed an Agent-local memory handoff inspection command to the shell-owned command router.',
206
+ 'read-only',
207
+ );
208
+ }
209
+
210
+ if (editor.kind === 'memory-handoff-import') {
211
+ const confirmation = requireConfirmation(editor, readField, 'Memory handoff import');
212
+ if (confirmation) return confirmation;
213
+ const command = `/memory handoff-import ${quoteSlashCommandArg(readField('path'))} --yes`;
214
+ return dispatch(
215
+ command,
216
+ 'Opening Agent memory handoff import',
217
+ 'Opening Agent memory handoff import.',
218
+ 'The workspace handed a confirmed Agent-local memory handoff import command to the shell-owned command router.',
219
+ 'safe',
220
+ );
221
+ }
222
+
223
+ const confirmation = requireConfirmation(editor, readField, 'Memory vector rebuild');
224
+ if (confirmation) return confirmation;
225
+ return dispatch(
226
+ '/memory vector rebuild',
227
+ 'Opening Agent memory vector rebuild',
228
+ 'Opening Agent memory vector rebuild.',
229
+ 'The workspace handed a confirmed Agent-local memory vector rebuild command to the shell-owned command router.',
230
+ 'safe',
231
+ );
232
+ }
@@ -0,0 +1,180 @@
1
+ import type { AgentWorkspaceEditorKind, AgentWorkspaceLocalEditor } from './agent-workspace-types.ts';
2
+
3
+ export type AgentWorkspaceMemoryCommandEditorKind = Extract<
4
+ AgentWorkspaceEditorKind,
5
+ | 'memory-search'
6
+ | 'memory-get'
7
+ | 'memory-explain'
8
+ | 'memory-promote'
9
+ | 'memory-link'
10
+ | 'memory-export'
11
+ | 'memory-import'
12
+ | 'memory-handoff-export'
13
+ | 'memory-handoff-inspect'
14
+ | 'memory-handoff-import'
15
+ | 'memory-vector-rebuild'
16
+ >;
17
+
18
+ export function isAgentWorkspaceMemoryCommandEditorKind(kind: AgentWorkspaceEditorKind): kind is AgentWorkspaceMemoryCommandEditorKind {
19
+ return kind === 'memory-search'
20
+ || kind === 'memory-get'
21
+ || kind === 'memory-explain'
22
+ || kind === 'memory-promote'
23
+ || kind === 'memory-link'
24
+ || kind === 'memory-export'
25
+ || kind === 'memory-import'
26
+ || kind === 'memory-handoff-export'
27
+ || kind === 'memory-handoff-inspect'
28
+ || kind === 'memory-handoff-import'
29
+ || kind === 'memory-vector-rebuild';
30
+ }
31
+
32
+ export function createAgentWorkspaceMemoryCommandEditor(kind: AgentWorkspaceMemoryCommandEditorKind): AgentWorkspaceLocalEditor {
33
+ if (kind === 'memory-search') {
34
+ return {
35
+ kind,
36
+ mode: 'create',
37
+ title: 'Search Agent Memory',
38
+ selectedFieldIndex: 0,
39
+ message: 'Search Agent-local memory only. This does not query default knowledge or other product routes.',
40
+ fields: [
41
+ { id: 'query', label: 'Query', value: '', required: false, multiline: false, hint: 'Optional text query. Blank searches by filters.' },
42
+ { id: 'scope', label: 'Scope', value: '', required: false, multiline: false, hint: 'Optional session, project, or team.' },
43
+ { id: 'class', label: 'Class', value: '', required: false, multiline: false, hint: 'Optional fact, constraint, pattern, runbook, risk, etc.' },
44
+ { id: 'limit', label: 'Limit', value: '', required: false, multiline: false, hint: 'Optional result limit.' },
45
+ { id: 'semantic', label: 'Semantic', value: 'no', required: false, multiline: false, hint: 'yes/no. Uses the local vector index when available.' },
46
+ ],
47
+ };
48
+ }
49
+ if (kind === 'memory-get') {
50
+ return {
51
+ kind,
52
+ mode: 'create',
53
+ title: 'Show Agent Memory',
54
+ selectedFieldIndex: 0,
55
+ message: 'Show one Agent-local memory record with provenance and links.',
56
+ fields: [
57
+ { id: 'id', label: 'Memory id', value: '', required: true, multiline: false, hint: 'Existing Agent memory id.' },
58
+ ],
59
+ };
60
+ }
61
+ if (kind === 'memory-explain') {
62
+ return {
63
+ kind,
64
+ mode: 'create',
65
+ title: 'Explain Memory Selection',
66
+ selectedFieldIndex: 0,
67
+ message: 'Preview which reviewed Agent-local memory records would be selected for a task.',
68
+ fields: [
69
+ { id: 'task', label: 'Task', value: '', required: true, multiline: true, hint: 'Task description. Ctrl-J inserts a new line.' },
70
+ { id: 'scopes', label: 'Scopes', value: '', required: false, multiline: false, hint: 'Optional comma-separated write scopes.' },
71
+ ],
72
+ };
73
+ }
74
+ if (kind === 'memory-promote') {
75
+ return {
76
+ kind,
77
+ mode: 'update',
78
+ title: 'Promote Agent Memory',
79
+ selectedFieldIndex: 0,
80
+ message: 'Promote one Agent-local memory record to another scope. Type yes on the final field to confirm.',
81
+ fields: [
82
+ { id: 'id', label: 'Memory id', value: '', required: true, multiline: false, hint: 'Existing Agent memory id.' },
83
+ { id: 'scope', label: 'Scope', value: '', required: true, multiline: false, hint: 'session, project, or team.' },
84
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /memory promote with --yes.' },
85
+ ],
86
+ };
87
+ }
88
+ if (kind === 'memory-link') {
89
+ return {
90
+ kind,
91
+ mode: 'update',
92
+ title: 'Link Agent Memories',
93
+ selectedFieldIndex: 0,
94
+ message: 'Create one directed relation between two Agent-local memory records. Type yes on the final field to confirm.',
95
+ fields: [
96
+ { id: 'fromId', label: 'From memory id', value: '', required: true, multiline: false, hint: 'Source memory id.' },
97
+ { id: 'toId', label: 'To memory id', value: '', required: true, multiline: false, hint: 'Target memory id.' },
98
+ { id: 'relation', label: 'Relation', value: '', required: true, multiline: false, hint: 'Short relation label, such as supports, supersedes, or contradicts.' },
99
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /memory link with --yes.' },
100
+ ],
101
+ };
102
+ }
103
+ if (kind === 'memory-export') {
104
+ return {
105
+ kind,
106
+ mode: 'create',
107
+ title: 'Export Agent Memory Bundle',
108
+ selectedFieldIndex: 0,
109
+ message: 'Export Agent-local memory records and links to a reviewable JSON bundle. Type yes on the final field to confirm.',
110
+ fields: [
111
+ { id: 'path', label: 'Output path', value: 'agent-memory-bundle.json', required: true, multiline: false, hint: 'Workspace-relative JSON path to write.' },
112
+ { id: 'scope', label: 'Scope', value: '', required: false, multiline: false, hint: 'Optional session, project, or team.' },
113
+ { id: 'class', label: 'Class', value: '', required: false, multiline: false, hint: 'Optional fact, constraint, pattern, runbook, risk, etc.' },
114
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /memory export with --yes.' },
115
+ ],
116
+ };
117
+ }
118
+ if (kind === 'memory-import') {
119
+ return {
120
+ kind,
121
+ mode: 'update',
122
+ title: 'Import Agent Memory Bundle',
123
+ selectedFieldIndex: 0,
124
+ message: 'Import a reviewed Agent memory bundle into the Agent-local memory registry. Type yes on the final field to confirm.',
125
+ fields: [
126
+ { id: 'path', label: 'Bundle path', value: 'agent-memory-bundle.json', required: true, multiline: false, hint: 'Workspace-relative JSON bundle path.' },
127
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /memory import with --yes.' },
128
+ ],
129
+ };
130
+ }
131
+ if (kind === 'memory-handoff-export') {
132
+ return {
133
+ kind,
134
+ mode: 'create',
135
+ title: 'Export Memory Handoff',
136
+ selectedFieldIndex: 0,
137
+ message: 'Export a scoped Agent memory handoff bundle for review. Type yes on the final field to confirm.',
138
+ fields: [
139
+ { id: 'path', label: 'Output path', value: 'agent-memory-handoff.json', required: true, multiline: false, hint: 'Workspace-relative JSON path to write.' },
140
+ { id: 'scope', label: 'Scope', value: 'team', required: false, multiline: false, hint: 'session, project, or team. Blank defaults to team.' },
141
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /memory handoff-export with --yes.' },
142
+ ],
143
+ };
144
+ }
145
+ if (kind === 'memory-handoff-inspect') {
146
+ return {
147
+ kind,
148
+ mode: 'create',
149
+ title: 'Inspect Memory Handoff',
150
+ selectedFieldIndex: 0,
151
+ message: 'Inspect a memory handoff bundle before importing it.',
152
+ fields: [
153
+ { id: 'path', label: 'Bundle path', value: 'agent-memory-handoff.json', required: true, multiline: false, hint: 'Workspace-relative JSON handoff bundle path.' },
154
+ ],
155
+ };
156
+ }
157
+ if (kind === 'memory-handoff-import') {
158
+ return {
159
+ kind,
160
+ mode: 'update',
161
+ title: 'Import Memory Handoff',
162
+ selectedFieldIndex: 0,
163
+ message: 'Import a reviewed memory handoff bundle into Agent-local memory. Type yes on the final field to confirm.',
164
+ fields: [
165
+ { id: 'path', label: 'Bundle path', value: 'agent-memory-handoff.json', required: true, multiline: false, hint: 'Workspace-relative JSON handoff bundle path.' },
166
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /memory handoff-import with --yes.' },
167
+ ],
168
+ };
169
+ }
170
+ return {
171
+ kind,
172
+ mode: 'update',
173
+ title: 'Rebuild Memory Vector Index',
174
+ selectedFieldIndex: 0,
175
+ message: 'Rebuild the Agent-local memory vector index. Type yes on the final field to confirm.',
176
+ fields: [
177
+ { id: 'confirm', label: 'Confirm', value: '', required: true, multiline: false, hint: 'Type yes to run /memory vector rebuild.' },
178
+ ],
179
+ };
180
+ }