@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
@@ -21,6 +21,8 @@ import type { PeerClient } from '@/runtime/index.ts';
21
21
  import type { DirectTransport } from '@/runtime/index.ts';
22
22
  import type { VoiceProviderRegistry, VoiceService } from '@pellux/goodvibes-sdk/platform/voice';
23
23
  import type { MediaProviderRegistry } from '@pellux/goodvibes-sdk/platform/media';
24
+ import type { ArtifactStore } from '@pellux/goodvibes-sdk/platform/artifacts';
25
+ import type { ChannelDeliveryRouter } from '@pellux/goodvibes-sdk/platform/channels';
24
26
  import type {
25
27
  CommandWorkspaceShellServices,
26
28
  } from '@/runtime/index.ts';
@@ -108,9 +110,8 @@ export interface CommandShellUiOpeners {
108
110
  showPanel?: (panelId: string, pane?: 'top' | 'bottom') => void;
109
111
  focusPanels?: () => void;
110
112
  focusPrompt?: () => void;
111
- openPolicyPanel?: () => void;
112
113
  openMcpWorkspace?: () => void;
113
- openAgentWorkspace?: () => void;
114
+ openAgentWorkspace?: (categoryId?: string) => void;
114
115
  openSecurityPanel?: () => void;
115
116
  openKnowledgePanel?: () => void;
116
117
  openSubscriptionPanel?: () => void;
@@ -157,6 +158,8 @@ export interface CommandPlatformConfigServices {
157
158
  readonly voiceProviderRegistry?: VoiceProviderRegistry;
158
159
  readonly voiceService?: VoiceService;
159
160
  readonly mediaProviderRegistry?: MediaProviderRegistry;
161
+ readonly artifactStore?: Pick<ArtifactStore, 'create'>;
162
+ readonly channelDeliveryRouter?: Pick<ChannelDeliveryRouter, 'deliver' | 'listStrategies'>;
160
163
  }
161
164
 
162
165
  export interface CommandPlatformServices
@@ -1,6 +1,7 @@
1
1
  import { mkdirSync } from 'node:fs';
2
2
  import { dirname } from 'node:path';
3
3
  import {
4
+ clearAgentRuntimeProfileSelection,
4
5
  createAgentRuntimeProfileFromDiscovered,
5
6
  createAgentRuntimeProfileTemplateFromDiscovered,
6
7
  createAgentRuntimeProfile,
@@ -10,9 +11,13 @@ import {
10
11
  importAgentRuntimeProfileTemplate,
11
12
  listAgentRuntimeProfiles,
12
13
  listAgentRuntimeProfileTemplates,
14
+ readAgentRuntimeProfileSelection,
15
+ resolveAgentRuntimeProfileHome,
16
+ setAgentRuntimeProfileSelection,
13
17
  type AgentRuntimeProfileInfo,
14
18
  type AgentRuntimeProfileTemplateSummary,
15
19
  } from '../../agent/runtime-profile.ts';
20
+ import { formatAgentRecordSource } from '../../agent/record-labels.ts';
16
21
  import type { CommandContext, CommandRegistry } from '../command-registry.ts';
17
22
  import { requireYesFlag, stripYesFlag } from './confirmation.ts';
18
23
  import { requireShellPaths } from './runtime-services.ts';
@@ -31,32 +36,47 @@ function parseCsvFlag(args: readonly string[], name: string): readonly string[]
31
36
  }
32
37
 
33
38
  function profileLine(profile: AgentRuntimeProfileInfo): string {
34
- const created = profile.createdAt ? ` created=${profile.createdAt}` : '';
35
- const starter = profile.starterTemplateId ? ` starter=${profile.starterTemplateId}` : '';
36
- return ` ${profile.id} home=${profile.homeDirectory}${created}${starter}`;
39
+ const created = profile.createdAt ? ` created ${profile.createdAt}` : '';
40
+ const starter = profile.starterTemplateId ? ` starter=${profile.starterTemplateId}` : '';
41
+ return ` ${profile.id} home ${profile.homeDirectory}${created}${starter}`;
37
42
  }
38
43
 
39
44
  function templateLine(template: AgentRuntimeProfileTemplateSummary): string {
40
- const source = template.source === 'local' ? `local ${template.path ?? ''}`.trim() : 'builtin';
45
+ const origin = template.source === 'local' ? `local ${template.path ?? ''}`.trim() : formatAgentRecordSource(template.source).toLowerCase();
41
46
  return [
42
- ` ${template.id} [${source}]`,
43
- ` ${template.name}: ${template.description}`,
44
- ` persona: ${template.personaName}`,
45
- ` skills: ${template.skillNames.join(', ')}`,
46
- ` routines: ${template.routineNames.join(', ')}`,
47
+ ` ${template.id} [${origin}]`,
48
+ ` ${template.name} - ${template.description}`,
49
+ ` persona ${template.personaName}`,
50
+ ` skills ${template.skillNames.join(', ')}`,
51
+ ` routines ${template.routineNames.join(', ')}`,
47
52
  ].join('\n');
48
53
  }
49
54
 
50
55
  function renderProfiles(homeDirectory: string): string {
51
56
  const profiles = listAgentRuntimeProfiles(homeDirectory);
57
+ const selected = readAgentRuntimeProfileSelection(homeDirectory);
58
+ const defaultLine = selected ? ` default: ${selected.id}${selected.exists ? '' : ' (missing)'}` : ' default: (base Agent home)';
52
59
  if (profiles.length === 0) {
53
60
  return [
54
61
  'Agent Profiles',
62
+ defaultLine,
55
63
  ' No isolated Agent profiles yet.',
56
64
  ' Create one with /agent-profile create <name> --template <id> --yes.',
57
65
  ].join('\n');
58
66
  }
59
- return ['Agent Profiles', ...profiles.map(profileLine)].join('\n');
67
+ return ['Agent Profiles', defaultLine, ...profiles.map(profileLine)].join('\n');
68
+ }
69
+
70
+ function renderProfileDetail(homeDirectory: string, name: string): string {
71
+ const profile = resolveAgentRuntimeProfileHome(homeDirectory, name);
72
+ const info = listAgentRuntimeProfiles(homeDirectory).find((entry) => entry.id === profile.id) ?? { ...profile, createdAt: null };
73
+ const starter = info.starterTemplateId ? [` starter: ${info.starterTemplateId} (${info.starterTemplateName ?? info.starterTemplateId})`] : [];
74
+ return [
75
+ `Agent profile: ${profile.id}`,
76
+ ` home ${profile.homeDirectory}`,
77
+ ...starter,
78
+ ` use goodvibes-agent --agent-profile ${profile.id}`,
79
+ ].join('\n');
60
80
  }
61
81
 
62
82
  function renderTemplates(homeDirectory: string): string {
@@ -79,8 +99,8 @@ function renderGuide(homeDirectory: string): string {
79
99
  const localCount = templates.filter((template) => template.source === 'local').length;
80
100
  return [
81
101
  'Agent Starter Authoring Guide',
82
- ` built-in starters: ${templates.length - localCount}`,
83
- ` local starters: ${localCount}`,
102
+ ` built-in starters ${templates.length - localCount}`,
103
+ ` local starters ${localCount}`,
84
104
  '',
85
105
  '1. Pick a base starter:',
86
106
  ' /agent-profile templates',
@@ -92,20 +112,20 @@ function renderGuide(homeDirectory: string): string {
92
112
  '5. Create an Agent profile from the imported starter:',
93
113
  ' /agent-profile create <name> --template <imported-id> --yes',
94
114
  '',
95
- 'This writes only Agent-local starter/profile state. It does not mutate connected GoodVibes services, default wiki, or non-Agent knowledge segments.',
115
+ 'This writes only Agent-local starter/profile state. It does not mutate connected GoodVibes host, default knowledge, or non-Agent knowledge segments.',
96
116
  ].join('\n');
97
117
  }
98
118
 
99
119
  function renderTemplatePreview(homeDirectory: string, templateId: string): string {
100
120
  const file = getAgentRuntimeProfileTemplateFile(templateId, homeDirectory);
101
121
  return [
102
- `Agent Starter Template: ${file.template.id}`,
103
- ` name: ${file.template.name}`,
104
- ` source: ${file.template.source}`,
105
- ` description: ${file.template.description}`,
106
- ` persona: ${file.template.persona.name}`,
107
- ` skills: ${file.template.skills.map((skill) => skill.name).join(', ')}`,
108
- ` routines: ${file.template.routines.map((routine) => routine.name).join(', ')}`,
122
+ `Agent Starter Template ${file.template.id}`,
123
+ ` name ${file.template.name}`,
124
+ ` origin ${formatAgentRecordSource(file.template.source)}`,
125
+ ` description ${file.template.description}`,
126
+ ` persona ${file.template.persona.name}`,
127
+ ` skills ${file.template.skills.map((skill) => skill.name).join(', ')}`,
128
+ ` routines ${file.template.routines.map((routine) => routine.name).join(', ')}`,
109
129
  '',
110
130
  'Export/edit/import to customize this starter:',
111
131
  ` /agent-profile template export ${file.template.id} ./agent-starter.json --yes`,
@@ -117,7 +137,7 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
117
137
  name: 'agent-profile',
118
138
  aliases: ['runtime-profile', 'agent-profiles'],
119
139
  description: 'Manage isolated Agent profiles and starter templates',
120
- usage: '[list|templates|guide|template show|template export|template import|template from-discovered|create|create-from-discovered|delete]',
140
+ usage: '[list|show|default|use|templates|guide|template show|template export|template import|template from-discovered|create|create-from-discovered|delete]',
121
141
  async handler(args, ctx) {
122
142
  const shellPaths = requireShellPaths(ctx);
123
143
  const homeDirectory = shellPaths.homeDirectory;
@@ -136,6 +156,72 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
136
156
  return;
137
157
  }
138
158
 
159
+ if (sub === 'show' || sub === 'path' || sub === 'home') {
160
+ const name = commandArgs[1];
161
+ if (!name) {
162
+ ctx.print('Usage: /agent-profile show <name>');
163
+ return;
164
+ }
165
+ ctx.print(renderProfileDetail(homeDirectory, name));
166
+ return;
167
+ }
168
+
169
+ if (sub === 'default') {
170
+ const target = commandArgs[1];
171
+ if (target === 'clear' || target === 'none' || target === 'base') {
172
+ if (!parsed.yes) {
173
+ requireYesFlag(ctx, 'clear the default Agent profile', '/agent-profile default clear --yes');
174
+ return;
175
+ }
176
+ clearAgentRuntimeProfileSelection(homeDirectory);
177
+ ctx.print('Default Agent profile cleared. Next launch uses the base Agent home unless --agent-profile is provided.');
178
+ return;
179
+ }
180
+ if (target) {
181
+ if (!parsed.yes) {
182
+ requireYesFlag(ctx, `set default Agent profile ${target}`, '/agent-profile default <name> --yes');
183
+ return;
184
+ }
185
+ const selected = setAgentRuntimeProfileSelection(homeDirectory, target);
186
+ ctx.print([
187
+ `Default Agent profile selected: ${selected.id}`,
188
+ ` home ${selected.homeDirectory}`,
189
+ ' next launch: goodvibes-agent',
190
+ ' explicit override goodvibes-agent --agent-profile <name>',
191
+ ].join('\n'));
192
+ return;
193
+ }
194
+ const selected = readAgentRuntimeProfileSelection(homeDirectory);
195
+ ctx.print(selected
196
+ ? [
197
+ `Default Agent profile: ${selected.id}${selected.exists ? '' : ' (missing)'}`,
198
+ ` home ${selected.homeDirectory}`,
199
+ ' next launch: goodvibes-agent',
200
+ ].join('\n')
201
+ : 'No default Agent profile selected. Next launch uses the base Agent home.');
202
+ return;
203
+ }
204
+
205
+ if (sub === 'use' || sub === 'select' || sub === 'switch') {
206
+ const name = commandArgs[1];
207
+ if (!name) {
208
+ ctx.print('Usage: /agent-profile use <name> --yes');
209
+ return;
210
+ }
211
+ if (!parsed.yes) {
212
+ requireYesFlag(ctx, `set default Agent profile ${name}`, '/agent-profile use <name> --yes');
213
+ return;
214
+ }
215
+ const selected = setAgentRuntimeProfileSelection(homeDirectory, name);
216
+ ctx.print([
217
+ `Default Agent profile selected: ${selected.id}`,
218
+ ` home ${selected.homeDirectory}`,
219
+ ' next launch: goodvibes-agent',
220
+ ' explicit override goodvibes-agent --agent-profile <name>',
221
+ ].join('\n'));
222
+ return;
223
+ }
224
+
139
225
  if (sub === 'guide' || sub === 'author') {
140
226
  ctx.print(renderGuide(homeDirectory));
141
227
  return;
@@ -166,7 +252,7 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
166
252
  const targetPath = shellPaths.resolveWorkspacePath(pathArg);
167
253
  mkdirSync(dirname(targetPath), { recursive: true });
168
254
  const template = exportAgentRuntimeProfileTemplate(homeDirectory, templateId, targetPath);
169
- ctx.print(`Agent starter template exported: ${template.id}\n path: ${template.path ?? targetPath}\n edit it, then import it with /agent-profile template import <path> --yes`);
255
+ ctx.print(`Agent starter template exported: ${template.id}\n path ${template.path ?? targetPath}\n edit it, then import it with /agent-profile template import <path> --yes`);
170
256
  return;
171
257
  }
172
258
  if (mode === 'import') {
@@ -181,7 +267,7 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
181
267
  }
182
268
  const sourcePath = shellPaths.resolveWorkspacePath(pathArg);
183
269
  const template = importAgentRuntimeProfileTemplate(homeDirectory, sourcePath);
184
- ctx.print(`Agent starter template imported: ${template.id}\n source: ${template.source}\n use: /agent-profile create <name> --template ${template.id} --yes`);
270
+ ctx.print(`Agent starter template imported: ${template.id}\n origin ${formatAgentRecordSource(template.source).toLowerCase()}\n use /agent-profile create <name> --template ${template.id} --yes`);
185
271
  return;
186
272
  }
187
273
  if (mode === 'from-discovered' || mode === 'import-discovered') {
@@ -205,10 +291,10 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
205
291
  });
206
292
  ctx.print([
207
293
  `Agent starter template created from discovered behavior: ${template.id}`,
208
- ` persona: ${template.personaName}`,
209
- ` skills: ${template.skillNames.join(', ')}`,
210
- ` routines: ${template.routineNames.join(', ')}`,
211
- ` use: /agent-profile create <name> --template ${template.id} --yes`,
294
+ ` persona ${template.personaName}`,
295
+ ` skills ${template.skillNames.join(', ')}`,
296
+ ` routines ${template.routineNames.join(', ')}`,
297
+ ` use /agent-profile create <name> --template ${template.id} --yes`,
212
298
  ].join('\n'));
213
299
  return;
214
300
  }
@@ -230,9 +316,9 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
230
316
  const profile = createAgentRuntimeProfile(homeDirectory, name, { templateId });
231
317
  ctx.print([
232
318
  `Agent profile created: ${profile.id}`,
233
- ` home: ${profile.homeDirectory}`,
319
+ ` home ${profile.homeDirectory}`,
234
320
  profile.starterTemplateId ? ` starter: ${profile.starterTemplateId}` : '',
235
- ` launch: goodvibes-agent --agent-profile ${profile.id}`,
321
+ ` launch goodvibes-agent --agent-profile ${profile.id}`,
236
322
  ].filter(Boolean).join('\n'));
237
323
  return;
238
324
  }
@@ -259,12 +345,12 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
259
345
  });
260
346
  ctx.print([
261
347
  `Agent profile created from discovered behavior: ${created.profile.id}`,
262
- ` home: ${created.profile.homeDirectory}`,
348
+ ` home ${created.profile.homeDirectory}`,
263
349
  ` starter: ${created.template.id}`,
264
- ` persona: ${created.template.personaName}`,
265
- ` skills: ${created.template.skillNames.join(', ')}`,
266
- ` routines: ${created.template.routineNames.join(', ')}`,
267
- ` launch: goodvibes-agent --agent-profile ${created.profile.id}`,
350
+ ` persona ${created.template.personaName}`,
351
+ ` skills ${created.template.skillNames.join(', ')}`,
352
+ ` routines ${created.template.routineNames.join(', ')}`,
353
+ ` launch goodvibes-agent --agent-profile ${created.profile.id}`,
268
354
  ].join('\n'));
269
355
  return;
270
356
  }
@@ -279,13 +365,16 @@ export function registerAgentRuntimeProfileRuntimeCommands(registry: CommandRegi
279
365
  requireYesFlag(ctx, `delete Agent profile ${name}`, '/agent-profile delete <name> --yes');
280
366
  return;
281
367
  }
282
- ctx.print(deleteAgentRuntimeProfile(homeDirectory, name) ? `Agent profile deleted: ${name}` : `Agent profile not found: ${name}`);
368
+ ctx.print(deleteAgentRuntimeProfile(homeDirectory, name) ? `Agent profile deleted: ${name}` : `Agent profile not found ${name}`);
283
369
  return;
284
370
  }
285
371
 
286
- ctx.print('Usage: /agent-profile [list|templates|guide|template show <id>|template export <id> <path> --yes|template import <path> --yes|create <name> [--template <id>] --yes|create-from-discovered <name> --yes|delete <name> --yes]');
372
+ ctx.print('Usage: /agent-profile [list|show <name>|default [<name>|clear] --yes|use <name> --yes|templates|guide|template show <id>|template export <id> <path> --yes|template import <path> --yes|create <name> [--template <id>] --yes|create-from-discovered <name> --yes|delete <name> --yes]');
287
373
  } catch (error) {
288
- ctx.print(`Error: ${error instanceof Error ? error.message : String(error)}`);
374
+ ctx.print([
375
+ 'Error',
376
+ ` message ${error instanceof Error ? error.message : String(error)}`,
377
+ ].join('\n'));
289
378
  }
290
379
  },
291
380
  });