@pellux/goodvibes-agent 0.1.114 → 0.1.117

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 (168) hide show
  1. package/CHANGELOG.md +41 -650
  2. package/README.md +40 -50
  3. package/dist/package/main.js +38224 -35673
  4. package/docs/README.md +5 -4
  5. package/docs/{connected-services.md → connected-host.md} +18 -10
  6. package/docs/getting-started.md +43 -42
  7. package/docs/release-and-publishing.md +6 -4
  8. package/package.json +3 -3
  9. package/src/agent/behavior-discovery-summary.ts +165 -0
  10. package/src/agent/persona-discovery.ts +1 -3
  11. package/src/agent/persona-registry.ts +5 -3
  12. package/src/agent/reminder-schedule-format.ts +6 -6
  13. package/src/agent/reminder-schedule.ts +1 -1
  14. package/src/agent/routine-registry.ts +43 -4
  15. package/src/agent/routine-schedule-format.ts +6 -6
  16. package/src/agent/routine-schedule-promotion.ts +1 -1
  17. package/src/agent/routine-schedule-receipts.ts +1 -1
  18. package/src/agent/runtime-profile-starters.ts +331 -0
  19. package/src/agent/runtime-profile.ts +228 -330
  20. package/src/agent/skill-registry.ts +190 -13
  21. package/src/cli/agent-knowledge-command.ts +2 -2
  22. package/src/cli/agent-knowledge-format.ts +2 -2
  23. package/src/cli/agent-knowledge-runtime.ts +1 -1
  24. package/src/cli/bundle-command.ts +1 -1
  25. package/src/cli/entrypoint.ts +16 -7
  26. package/src/cli/help.ts +26 -19
  27. package/src/cli/local-library-command.ts +75 -21
  28. package/src/cli/management-commands.ts +7 -6
  29. package/src/cli/management.ts +6 -51
  30. package/src/cli/parser.ts +23 -2
  31. package/src/cli/profiles-command.ts +247 -1
  32. package/src/cli/routines-command.ts +139 -11
  33. package/src/cli/service-posture.ts +11 -11
  34. package/src/cli/status.ts +21 -25
  35. package/src/input/agent-workspace-access-command-editor-submission.ts +149 -0
  36. package/src/input/agent-workspace-access-command-editors.ts +170 -0
  37. package/src/input/agent-workspace-activation.ts +2 -1
  38. package/src/input/agent-workspace-basic-command-editor-submission.ts +787 -0
  39. package/src/input/agent-workspace-basic-command-editors.ts +524 -459
  40. package/src/input/agent-workspace-categories.ts +177 -14
  41. package/src/input/agent-workspace-channel-command-editor-submission.ts +49 -0
  42. package/src/input/agent-workspace-channel-command-editors.ts +47 -0
  43. package/src/input/agent-workspace-command-editor.ts +25 -1
  44. package/src/input/agent-workspace-delegation-editor-submission.ts +55 -0
  45. package/src/input/agent-workspace-editors.ts +27 -0
  46. package/src/input/agent-workspace-knowledge-command-editor-submission.ts +132 -0
  47. package/src/input/agent-workspace-knowledge-command-editors.ts +110 -0
  48. package/src/input/agent-workspace-learned-behavior.ts +67 -0
  49. package/src/input/agent-workspace-library-command-editor-submission.ts +50 -0
  50. package/src/input/agent-workspace-library-command-editors.ts +35 -0
  51. package/src/input/agent-workspace-mcp-command-editor-submission.ts +95 -0
  52. package/src/input/agent-workspace-memory-command-editor-submission.ts +232 -0
  53. package/src/input/agent-workspace-memory-command-editors.ts +180 -0
  54. package/src/input/agent-workspace-navigation.ts +45 -0
  55. package/src/input/agent-workspace-notify-editor-submission.ts +107 -0
  56. package/src/input/agent-workspace-operations-command-editor-submission.ts +146 -0
  57. package/src/input/agent-workspace-operations-command-editors.ts +119 -0
  58. package/src/input/agent-workspace-provider-command-editor-submission.ts +155 -0
  59. package/src/input/agent-workspace-provider-command-editors.ts +93 -0
  60. package/src/input/agent-workspace-requirements.ts +11 -0
  61. package/src/input/agent-workspace-secret-editor-submission.ts +153 -0
  62. package/src/input/agent-workspace-session-command-editor-submission.ts +199 -0
  63. package/src/input/agent-workspace-session-command-editors.ts +249 -0
  64. package/src/input/agent-workspace-setup.ts +49 -19
  65. package/src/input/agent-workspace-skill-bundle-command-editor-submission.ts +101 -0
  66. package/src/input/agent-workspace-skill-bundle-command-editors.ts +110 -0
  67. package/src/input/agent-workspace-snapshot.ts +56 -8
  68. package/src/input/agent-workspace-task-command-editor-submission.ts +61 -0
  69. package/src/input/agent-workspace-task-command-editors.ts +47 -0
  70. package/src/input/agent-workspace-types.ts +124 -0
  71. package/src/input/agent-workspace-voice-media.ts +1 -1
  72. package/src/input/agent-workspace-workplan-editor-submission.ts +153 -0
  73. package/src/input/agent-workspace.ts +47 -37
  74. package/src/input/command-registry.ts +1 -1
  75. package/src/input/commands/agent-runtime-profile-runtime.ts +160 -6
  76. package/src/input/commands/agent-skills-runtime.ts +76 -12
  77. package/src/input/commands/agent-workspace-runtime.ts +4 -3
  78. package/src/input/commands/brief-runtime.ts +38 -9
  79. package/src/input/commands/channels-runtime.ts +3 -3
  80. package/src/input/commands/compat-runtime.ts +32 -0
  81. package/src/input/commands/health-runtime.ts +22 -24
  82. package/src/input/commands/knowledge.ts +26 -5
  83. package/src/input/commands/local-provider-runtime.ts +7 -3
  84. package/src/input/commands/local-setup-review.ts +4 -14
  85. package/src/input/commands/mcp-runtime.ts +8 -12
  86. package/src/input/commands/operator-runtime.ts +8 -67
  87. package/src/input/commands/personas-runtime.ts +1 -1
  88. package/src/input/commands/platform-access-runtime.ts +7 -70
  89. package/src/input/commands/policy-dispatch.ts +1 -1
  90. package/src/input/commands/policy.ts +1 -5
  91. package/src/input/commands/product-runtime.ts +2 -2
  92. package/src/input/commands/qrcode-runtime.ts +6 -4
  93. package/src/input/commands/routines-runtime.ts +44 -6
  94. package/src/input/commands/runtime-services.ts +1 -14
  95. package/src/input/commands/security-runtime.ts +3 -8
  96. package/src/input/commands/session-content.ts +1 -1
  97. package/src/input/commands/session-workflow.ts +5 -14
  98. package/src/input/commands/shell-core.ts +8 -2
  99. package/src/input/commands/subscription-runtime.ts +1 -6
  100. package/src/input/commands/support-bundle-runtime.ts +53 -0
  101. package/src/input/commands/tasks-runtime.ts +2 -2
  102. package/src/input/commands.ts +4 -0
  103. package/src/input/feed-context-factory.ts +0 -1
  104. package/src/input/handler-content-actions.ts +0 -25
  105. package/src/input/handler-feed.ts +0 -2
  106. package/src/input/handler-interactions.ts +2 -31
  107. package/src/input/handler-onboarding.ts +29 -12
  108. package/src/input/handler-shortcuts.ts +1 -3
  109. package/src/input/handler.ts +4 -7
  110. package/src/input/keybindings.ts +9 -9
  111. package/src/input/mcp-workspace.ts +90 -26
  112. package/src/input/onboarding/handler-onboarding-routes.ts +3 -1
  113. package/src/input/onboarding/onboarding-wizard-apply.ts +49 -0
  114. package/src/input/onboarding/onboarding-wizard-helpers.ts +1 -1
  115. package/src/input/onboarding/onboarding-wizard-operator-steps.ts +126 -11
  116. package/src/input/onboarding/onboarding-wizard-steps.ts +15 -8
  117. package/src/input/onboarding/onboarding-wizard-types.ts +1 -0
  118. package/src/input/onboarding/onboarding-wizard.ts +19 -2
  119. package/src/input/profile-picker-modal.ts +2 -2
  120. package/src/input/settings-modal-agent-policy.ts +6 -6
  121. package/src/input/settings-modal-subscriptions.ts +3 -3
  122. package/src/input/settings-modal.ts +14 -14
  123. package/src/main.ts +0 -2
  124. package/src/panels/automation-control-panel.ts +3 -3
  125. package/src/panels/builtin/agent.ts +1 -1
  126. package/src/panels/builtin/operations.ts +2 -2
  127. package/src/panels/builtin/session.ts +26 -18
  128. package/src/panels/builtin/shared.ts +6 -6
  129. package/src/panels/project-planning-panel.ts +1 -1
  130. package/src/panels/provider-health-domains.ts +3 -3
  131. package/src/panels/qr-panel.ts +44 -20
  132. package/src/panels/subscription-panel.ts +3 -3
  133. package/src/panels/system-messages-panel.ts +2 -2
  134. package/src/panels/tasks-panel.ts +4 -4
  135. package/src/planning/project-planning-coordinator.ts +2 -2
  136. package/src/renderer/agent-workspace.ts +52 -5
  137. package/src/renderer/block-actions.ts +1 -3
  138. package/src/renderer/help-overlay.ts +13 -8
  139. package/src/renderer/mcp-workspace.ts +32 -13
  140. package/src/renderer/model-picker-overlay.ts +0 -1
  141. package/src/renderer/model-workspace.ts +0 -2
  142. package/src/renderer/onboarding/onboarding-wizard.ts +20 -4
  143. package/src/renderer/panel-picker-overlay.ts +1 -1
  144. package/src/renderer/profile-picker-modal.ts +2 -2
  145. package/src/renderer/settings-modal-helpers.ts +23 -23
  146. package/src/renderer/settings-modal.ts +18 -18
  147. package/src/renderer/system-message.ts +1 -1
  148. package/src/runtime/agent-runtime-events.ts +129 -0
  149. package/src/runtime/bootstrap-command-parts.ts +3 -2
  150. package/src/runtime/bootstrap-core.ts +4 -64
  151. package/src/runtime/bootstrap-shell.ts +42 -4
  152. package/src/runtime/bootstrap.ts +8 -27
  153. package/src/runtime/connected-host-auth.ts +42 -0
  154. package/src/runtime/diagnostics/panels/panel-resources.ts +1 -1
  155. package/src/runtime/index.ts +1 -5
  156. package/src/runtime/onboarding/apply.ts +213 -0
  157. package/src/runtime/onboarding/derivation.ts +25 -6
  158. package/src/runtime/onboarding/snapshot.ts +4 -2
  159. package/src/runtime/onboarding/types.ts +28 -1
  160. package/src/runtime/onboarding/verify.ts +81 -2
  161. package/src/runtime/operator-token-cleanup.ts +2 -2
  162. package/src/runtime/services.ts +27 -12
  163. package/src/shell/service-settings-sync.ts +7 -7
  164. package/src/shell/ui-openers.ts +27 -38
  165. package/src/tools/agent-local-registry-tool.ts +10 -4
  166. package/src/tools/agent-tool-policy-guard.ts +5 -7
  167. package/src/version.ts +1 -1
  168. package/src/cli/package-verification.ts +0 -274
@@ -3,9 +3,18 @@ import { dirname } from 'node:path';
3
3
  import type { ShellPathService } from '@/runtime/index.ts';
4
4
  import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
5
5
  import { assertNoSecretLikeText } from './persona-registry.ts';
6
+ import {
7
+ evaluateAgentSkillReadiness,
8
+ formatAgentSkillRequirement,
9
+ normalizeAgentSkillRequirements,
10
+ type AgentSkillReadiness,
11
+ type AgentSkillRequirement,
12
+ } from './skill-registry.ts';
6
13
 
7
14
  export type AgentRoutineSource = 'user' | 'agent' | 'imported' | 'system';
8
15
  export type AgentRoutineReviewState = 'fresh' | 'reviewed' | 'stale';
16
+ export type AgentRoutineRequirement = AgentSkillRequirement;
17
+ export type AgentRoutineReadiness = AgentSkillReadiness;
9
18
 
10
19
  export interface AgentRoutineRecord {
11
20
  readonly id: string;
@@ -14,6 +23,7 @@ export interface AgentRoutineRecord {
14
23
  readonly steps: string;
15
24
  readonly triggers: readonly string[];
16
25
  readonly tags: readonly string[];
26
+ readonly requirements: readonly AgentRoutineRequirement[];
17
27
  readonly enabled: boolean;
18
28
  readonly source: AgentRoutineSource;
19
29
  readonly provenance: string;
@@ -32,6 +42,7 @@ export interface AgentRoutineCreateInput {
32
42
  readonly steps: string;
33
43
  readonly triggers?: readonly string[];
34
44
  readonly tags?: readonly string[];
45
+ readonly requirements?: readonly AgentRoutineRequirement[];
35
46
  readonly enabled?: boolean;
36
47
  readonly source?: AgentRoutineSource;
37
48
  readonly provenance?: string;
@@ -43,6 +54,7 @@ export interface AgentRoutineUpdateInput {
43
54
  readonly steps?: string;
44
55
  readonly triggers?: readonly string[];
45
56
  readonly tags?: readonly string[];
57
+ readonly requirements?: readonly AgentRoutineRequirement[];
46
58
  readonly provenance?: string;
47
59
  }
48
60
 
@@ -72,6 +84,18 @@ function readStringArray(value: unknown): string[] {
72
84
  return value.filter((entry): entry is string => typeof entry === 'string').map((entry) => entry.trim()).filter(Boolean);
73
85
  }
74
86
 
87
+ function readRequirementArray(value: unknown): readonly AgentRoutineRequirement[] {
88
+ if (!Array.isArray(value)) return [];
89
+ const requirements = value
90
+ .filter(isRecord)
91
+ .map((entry) => ({
92
+ kind: entry.kind === 'command' ? 'command' as const : 'env' as const,
93
+ name: readString(entry.name).trim(),
94
+ description: readString(entry.description).trim() || undefined,
95
+ }));
96
+ return normalizeAgentSkillRequirements(requirements);
97
+ }
98
+
75
99
  function readNonNegativeInteger(value: unknown): number {
76
100
  const parsed = typeof value === 'number' ? value : Number(value);
77
101
  return Number.isInteger(parsed) && parsed > 0 ? parsed : 0;
@@ -123,6 +147,7 @@ function parseRoutine(value: unknown): AgentRoutineRecord | null {
123
147
  steps,
124
148
  triggers: readStringArray(value.triggers),
125
149
  tags: readStringArray(value.tags),
150
+ requirements: readRequirementArray(value.requirements),
126
151
  enabled: value.enabled === true,
127
152
  source,
128
153
  provenance: readString(value.provenance, source).trim() || source,
@@ -151,14 +176,16 @@ function formatStore(store: RoutineStoreFile): string {
151
176
  return `${JSON.stringify(store, null, 2)}\n`;
152
177
  }
153
178
 
154
- export function routineStorePath(shellPaths: ShellPathService): string {
179
+ type AgentLocalStorePaths = Pick<ShellPathService, 'resolveUserPath'>;
180
+
181
+ export function routineStorePath(shellPaths: AgentLocalStorePaths): string {
155
182
  return shellPaths.resolveUserPath(GOODVIBES_AGENT_SURFACE_ROOT, 'routines', 'routines.json');
156
183
  }
157
184
 
158
185
  export class AgentRoutineRegistry {
159
186
  public constructor(private readonly storePath: string) {}
160
187
 
161
- public static fromShellPaths(shellPaths: ShellPathService): AgentRoutineRegistry {
188
+ public static fromShellPaths(shellPaths: AgentLocalStorePaths): AgentRoutineRegistry {
162
189
  return new AgentRoutineRegistry(routineStorePath(shellPaths));
163
190
  }
164
191
 
@@ -200,7 +227,8 @@ export class AgentRoutineRegistry {
200
227
  const description = input.description.trim();
201
228
  const steps = input.steps.trim();
202
229
  this.validateRequired(name, description, steps);
203
- assertNoSecretLikeText([name, description, steps, ...(input.tags ?? []), ...(input.triggers ?? [])]);
230
+ const requirements = normalizeAgentSkillRequirements(input.requirements);
231
+ assertNoSecretLikeText([name, description, steps, ...(input.tags ?? []), ...(input.triggers ?? []), ...requirements.flatMap((requirement) => [requirement.name, requirement.description ?? ''])]);
204
232
  const duplicate = store.routines.find((routine) => routine.name.toLowerCase() === name.toLowerCase());
205
233
  if (duplicate) throw new Error(`Routine already exists: ${duplicate.id}`);
206
234
  const timestamp = nowIso();
@@ -211,6 +239,7 @@ export class AgentRoutineRegistry {
211
239
  steps,
212
240
  triggers: normalizeList(input.triggers),
213
241
  tags: normalizeList(input.tags),
242
+ requirements,
214
243
  enabled: input.enabled === true,
215
244
  source: input.source ?? 'user',
216
245
  provenance: input.provenance?.trim() || input.source || 'user',
@@ -231,7 +260,8 @@ export class AgentRoutineRegistry {
231
260
  const description = input.description === undefined ? existing.description : input.description.trim();
232
261
  const steps = input.steps === undefined ? existing.steps : input.steps.trim();
233
262
  this.validateRequired(name, description, steps);
234
- assertNoSecretLikeText([name, description, steps, ...(input.tags ?? []), ...(input.triggers ?? [])]);
263
+ const requirements = input.requirements === undefined ? existing.requirements : normalizeAgentSkillRequirements(input.requirements);
264
+ assertNoSecretLikeText([name, description, steps, ...(input.tags ?? []), ...(input.triggers ?? []), ...requirements.flatMap((requirement) => [requirement.name, requirement.description ?? ''])]);
235
265
  const duplicate = store.routines.find((routine) => routine.id !== existing.id && routine.name.toLowerCase() === name.toLowerCase());
236
266
  if (duplicate) throw new Error(`Routine already exists: ${duplicate.id}`);
237
267
  const updated: AgentRoutineRecord = {
@@ -241,6 +271,7 @@ export class AgentRoutineRegistry {
241
271
  steps,
242
272
  triggers: input.triggers === undefined ? existing.triggers : normalizeList(input.triggers),
243
273
  tags: input.tags === undefined ? existing.tags : normalizeList(input.tags),
274
+ requirements,
244
275
  provenance: input.provenance === undefined ? existing.provenance : input.provenance.trim() || existing.provenance,
245
276
  reviewState: 'fresh',
246
277
  staleReason: undefined,
@@ -370,6 +401,13 @@ export class AgentRoutineRegistry {
370
401
  }
371
402
  }
372
403
 
404
+ export function evaluateAgentRoutineReadiness(
405
+ routine: Pick<AgentRoutineRecord, 'requirements'>,
406
+ options: Parameters<typeof evaluateAgentSkillReadiness>[1] = {},
407
+ ): AgentRoutineReadiness {
408
+ return evaluateAgentSkillReadiness(routine, options);
409
+ }
410
+
373
411
  export function buildEnabledRoutinesPrompt(shellPaths: ShellPathService): string | null {
374
412
  const enabled = AgentRoutineRegistry.fromShellPaths(shellPaths).snapshot().enabledRoutines;
375
413
  if (enabled.length === 0) return null;
@@ -382,6 +420,7 @@ export function buildEnabledRoutinesPrompt(shellPaths: ShellPathService): string
382
420
  `Description: ${routine.description}`,
383
421
  `Review state: ${routine.reviewState}`,
384
422
  `Triggers: ${routine.triggers.join(', ') || '(manual)'}`,
423
+ `Readiness: ${evaluateAgentRoutineReadiness(routine).ready ? 'ready' : `missing ${evaluateAgentRoutineReadiness(routine).missing.map(formatAgentSkillRequirement).join(', ')}`}`,
385
424
  routine.steps,
386
425
  '',
387
426
  ]),
@@ -111,13 +111,13 @@ export function formatRoutineScheduleCorrelation(result: RoutineScheduleCorrelat
111
111
  result.baseUrl ? ` runtime: ${result.baseUrl}` : null,
112
112
  ` route: ${ROUTINE_SCHEDULE_LIST_METHOD} ${result.route}`,
113
113
  result.kind === 'auth_required'
114
- ? ' next: pair/authenticate with connected GoodVibes services, then retry.'
114
+ ? ' next: pair/authenticate with the connected GoodVibes host, then retry.'
115
115
  : null,
116
116
  result.kind === 'daemon_unavailable'
117
- ? ' next: make connected GoodVibes services available outside Agent, then retry.'
117
+ ? ' next: make the connected GoodVibes host available outside Agent, then retry.'
118
118
  : null,
119
119
  result.kind === 'version_mismatch' || result.kind === 'daemon_route_unavailable'
120
- ? ' next: update connected GoodVibes services so public schedules.list is available.'
120
+ ? ' next: update the connected GoodVibes host so public schedules.list is available.'
121
121
  : null,
122
122
  ].filter((line): line is string => Boolean(line)).join('\n');
123
123
  }
@@ -166,13 +166,13 @@ export function formatRoutineScheduleFailure(failure: RoutineSchedulePromotionFa
166
166
  ? ` versions: runtime=${failure.daemonVersion} expected=${failure.expectedSdkVersion}`
167
167
  : null,
168
168
  failure.kind === 'auth_required'
169
- ? ' next: pair/authenticate with connected GoodVibes services, then retry with --yes.'
169
+ ? ' next: pair/authenticate with the connected GoodVibes host, then retry with --yes.'
170
170
  : null,
171
171
  failure.kind === 'daemon_unavailable'
172
- ? ' next: make connected GoodVibes services available outside Agent, then retry.'
172
+ ? ' next: make the connected GoodVibes host available outside Agent, then retry.'
173
173
  : null,
174
174
  failure.kind === 'version_mismatch' || failure.kind === 'daemon_route_unavailable'
175
- ? ' next: update connected GoodVibes services so public schedules.create is available.'
175
+ ? ' next: update the connected GoodVibes host so public schedules.create is available.'
176
176
  : null,
177
177
  ].filter((line): line is string => Boolean(line)).join('\n');
178
178
  }
@@ -416,7 +416,7 @@ export async function promoteRoutineToDaemonSchedule(
416
416
  return {
417
417
  ok: false,
418
418
  kind: 'auth_required',
419
- error: `No daemon operator token found at ${connection.tokenPath}`,
419
+ error: `No connected-host operator token found at ${connection.tokenPath}`,
420
420
  route: ROUTINE_SCHEDULE_ROUTE,
421
421
  baseUrl: connection.baseUrl,
422
422
  };
@@ -477,7 +477,7 @@ export async function reconcileRoutineScheduleReceipts(
477
477
  return {
478
478
  ok: false,
479
479
  kind: 'auth_required',
480
- error: `No daemon operator token found at ${connection.tokenPath}`,
480
+ error: `No connected-host operator token found at ${connection.tokenPath}`,
481
481
  route: ROUTINE_SCHEDULE_ROUTE,
482
482
  baseUrl: connection.baseUrl,
483
483
  };
@@ -0,0 +1,331 @@
1
+ import type { AgentRuntimeProfileTemplateSummary } from './runtime-profile.ts';
2
+
3
+ export interface AgentRuntimeProfileStarterTemplate extends AgentRuntimeProfileTemplateSummary {
4
+ readonly persona: {
5
+ readonly name: string;
6
+ readonly description: string;
7
+ readonly body: string;
8
+ readonly tags: readonly string[];
9
+ readonly triggers: readonly string[];
10
+ };
11
+ readonly skills: readonly {
12
+ readonly name: string;
13
+ readonly description: string;
14
+ readonly procedure: string;
15
+ readonly triggers: readonly string[];
16
+ readonly tags: readonly string[];
17
+ }[];
18
+ readonly routines: readonly {
19
+ readonly name: string;
20
+ readonly description: string;
21
+ readonly steps: string;
22
+ readonly triggers: readonly string[];
23
+ readonly tags: readonly string[];
24
+ }[];
25
+ }
26
+
27
+ export interface AgentRuntimeProfileStarterTemplateFile {
28
+ readonly version: 1;
29
+ readonly template: AgentRuntimeProfileStarterTemplate;
30
+ }
31
+
32
+ export const STARTER_TEMPLATES: readonly AgentRuntimeProfileStarterTemplate[] = [
33
+ {
34
+ id: 'household',
35
+ source: 'builtin',
36
+ name: 'Household Operator',
37
+ description: 'Coordinate household tasks, home service checks, shared routines, and family logistics.',
38
+ personaName: 'Household Operator',
39
+ skillNames: ['Household Triage', 'Home Service Check'],
40
+ routineNames: ['Weekly Household Review'],
41
+ persona: {
42
+ name: 'Household Operator',
43
+ description: 'Practical assistant for home operations, shared chores, services, and family logistics.',
44
+ body: [
45
+ 'Operate as a calm household coordinator.',
46
+ 'Track preferences, routines, device/service notes, and recurring decisions in Agent-local memory after they are durable and non-secret.',
47
+ 'Use read-only connected-host/operator routes for status checks. Require explicit approval for purchases, messages to other people, service changes, deletions, or secret handling.',
48
+ 'Keep replies concrete: next action, owner, date, and open question when one is needed.',
49
+ ].join('\n'),
50
+ tags: ['household', 'home', 'coordination'],
51
+ triggers: ['home', 'household', 'family', 'chores', 'errands'],
52
+ },
53
+ skills: [
54
+ {
55
+ name: 'Household Triage',
56
+ description: 'Turn a household request into owner, urgency, next step, and reminder/delegation posture.',
57
+ procedure: [
58
+ '1. Identify whether the task is information, coordination, purchase, repair, or reminder.',
59
+ '2. Check Agent-local memory for known preferences or constraints before asking repeat questions.',
60
+ '3. Propose the next non-destructive action. Ask before external messages, payments, account changes, or device/service changes.',
61
+ '4. Record durable non-secret decisions locally with provenance.',
62
+ ].join('\n'),
63
+ triggers: ['plan household', 'home task', 'family logistics'],
64
+ tags: ['household', 'triage'],
65
+ },
66
+ {
67
+ name: 'Home Service Check',
68
+ description: 'Review configured services and surface actionable household status without taking hidden action.',
69
+ procedure: [
70
+ '1. Inspect configured read-only status, approval, schedule, and knowledge routes.',
71
+ '2. Summarize degraded services, pending approvals, and stale routines.',
72
+ '3. Suggest explicit commands for approved follow-up instead of mutating services directly.',
73
+ ].join('\n'),
74
+ triggers: ['home status', 'service check', 'household check'],
75
+ tags: ['household', 'ops'],
76
+ },
77
+ ],
78
+ routines: [
79
+ {
80
+ name: 'Weekly Household Review',
81
+ description: 'Review open household commitments, pending approvals, and stale home notes.',
82
+ steps: [
83
+ '1. List pending local routines, workplan tasks, and approvals.',
84
+ '2. Summarize what changed since the last review from local Agent state.',
85
+ '3. Ask for confirmation before scheduling, sending messages, purchasing, or changing services.',
86
+ '4. Record reviewed preferences and stale notes locally.',
87
+ ].join('\n'),
88
+ triggers: ['weekly review', 'household review'],
89
+ tags: ['household', 'review'],
90
+ },
91
+ ],
92
+ },
93
+ {
94
+ id: 'research',
95
+ source: 'builtin',
96
+ name: 'Research Analyst',
97
+ description: 'Source-grounded research, brief generation, question tracking, and evidence review.',
98
+ personaName: 'Research Analyst',
99
+ skillNames: ['Source-grounded Brief', 'Research Gap Tracker'],
100
+ routineNames: ['Research Packet Review'],
101
+ persona: {
102
+ name: 'Research Analyst',
103
+ description: 'Evidence-first analyst for research questions, summaries, and decision support.',
104
+ body: [
105
+ 'Prefer primary sources and cite provenance clearly.',
106
+ 'Use Agent Knowledge only through the isolated Agent knowledge routes.',
107
+ 'Separate findings, confidence, gaps, and recommendations.',
108
+ 'Do not store secrets or unsupported claims as durable knowledge.',
109
+ ].join('\n'),
110
+ tags: ['research', 'analysis', 'evidence'],
111
+ triggers: ['research', 'brief', 'compare', 'investigate'],
112
+ },
113
+ skills: [
114
+ {
115
+ name: 'Source-grounded Brief',
116
+ description: 'Produce concise findings with source provenance and confidence.',
117
+ procedure: [
118
+ '1. Clarify the decision or question if the request is ambiguous.',
119
+ '2. Search current sources when freshness matters.',
120
+ '3. Return answer, evidence, confidence, gaps, and suggested follow-up.',
121
+ '4. Save durable, reviewed, non-secret facts to Agent-local memory only when useful later.',
122
+ ].join('\n'),
123
+ triggers: ['brief me', 'research this', 'compare options'],
124
+ tags: ['research', 'briefing'],
125
+ },
126
+ {
127
+ name: 'Research Gap Tracker',
128
+ description: 'Maintain open research questions and stale assumptions.',
129
+ procedure: [
130
+ '1. Extract unknowns, weak evidence, and stale facts from the current task.',
131
+ '2. Convert actionable follow-up into workplan or local routine guidance only after explicit user direction.',
132
+ '3. Mark resolved gaps with source and date.',
133
+ ].join('\n'),
134
+ triggers: ['research gaps', 'unknowns', 'follow up'],
135
+ tags: ['research', 'quality'],
136
+ },
137
+ ],
138
+ routines: [
139
+ {
140
+ name: 'Research Packet Review',
141
+ description: 'Review recent research notes for stale assumptions and missing citations.',
142
+ steps: [
143
+ '1. Inspect local memory/skills/personas relevant to the current topic.',
144
+ '2. Identify claims lacking provenance.',
145
+ '3. Recommend refresh searches for time-sensitive claims.',
146
+ '4. Mark stale local notes instead of deleting them without explicit command intent.',
147
+ ].join('\n'),
148
+ triggers: ['review research', 'research packet'],
149
+ tags: ['research', 'review'],
150
+ },
151
+ ],
152
+ },
153
+ {
154
+ id: 'travel',
155
+ source: 'builtin',
156
+ name: 'Travel Planner',
157
+ description: 'Trip planning, itinerary decisions, packing, local constraints, and travel follow-through.',
158
+ personaName: 'Travel Planner',
159
+ skillNames: ['Trip Decision Matrix', 'Travel Checklist Builder'],
160
+ routineNames: ['Pre-trip Readiness Review'],
161
+ persona: {
162
+ name: 'Travel Planner',
163
+ description: 'Travel planning assistant focused on constraints, itinerary tradeoffs, and readiness.',
164
+ body: [
165
+ 'Track destinations, dates, preferences, constraints, and open decisions locally.',
166
+ 'Search current details for prices, schedules, visa/rule changes, weather, and safety.',
167
+ 'Ask before bookings, purchases, external messages, or account changes.',
168
+ 'Keep recommendations practical and time-aware.',
169
+ ].join('\n'),
170
+ tags: ['travel', 'planning', 'logistics'],
171
+ triggers: ['trip', 'travel', 'itinerary', 'flight', 'hotel'],
172
+ },
173
+ skills: [
174
+ {
175
+ name: 'Trip Decision Matrix',
176
+ description: 'Compare travel options against user constraints and live facts.',
177
+ procedure: [
178
+ '1. List hard constraints: dates, budget, location, accessibility, work needs, and risk tolerance.',
179
+ '2. Search current schedule/price/rule data when decisions depend on fresh details.',
180
+ '3. Present ranked options with tradeoffs and next checks.',
181
+ '4. Ask for confirmation before bookings or payments.',
182
+ ].join('\n'),
183
+ triggers: ['choose travel', 'compare hotels', 'compare flights'],
184
+ tags: ['travel', 'decision'],
185
+ },
186
+ {
187
+ name: 'Travel Checklist Builder',
188
+ description: 'Create trip-specific prep lists and reminders from known constraints.',
189
+ procedure: [
190
+ '1. Infer trip type and constraints from the current conversation and local memory.',
191
+ '2. Build checklist sections for documents, packing, transport, lodging, work, health, and communications.',
192
+ '3. Keep tasks local until the user explicitly requests scheduling or external coordination.',
193
+ ].join('\n'),
194
+ triggers: ['packing list', 'trip checklist', 'travel prep'],
195
+ tags: ['travel', 'checklist'],
196
+ },
197
+ ],
198
+ routines: [
199
+ {
200
+ name: 'Pre-trip Readiness Review',
201
+ description: 'Check documents, reservations, transport, packing, weather, and open decisions.',
202
+ steps: [
203
+ '1. Review trip dates, locations, reservations, and open decisions from local Agent state.',
204
+ '2. Refresh current weather, schedule, and rule data when needed.',
205
+ '3. Summarize blockers and next confirmed action.',
206
+ '4. Ask before external sends, purchases, or reservation changes.',
207
+ ].join('\n'),
208
+ triggers: ['pre trip review', 'before travel'],
209
+ tags: ['travel', 'review'],
210
+ },
211
+ ],
212
+ },
213
+ {
214
+ id: 'operations',
215
+ source: 'builtin',
216
+ name: 'Operations Lead',
217
+ description: 'Operational monitoring, incident triage, approvals, schedules, and service health.',
218
+ personaName: 'Operations Lead',
219
+ skillNames: ['Incident Intake', 'Approval Review'],
220
+ routineNames: ['Daily Operations Sweep'],
221
+ persona: {
222
+ name: 'Operations Lead',
223
+ description: 'Operator persona for systems, incidents, runbooks, approvals, and service posture.',
224
+ body: [
225
+ 'Favor explicit state, logs, health, approvals, and next action.',
226
+ 'Use read-only connected-host/operator routes by default.',
227
+ 'Require explicit confirmation for run, pause, resume, cancel, retry, approve, deny, service changes, or writes.',
228
+ 'Delegate code/build fixes to GoodVibes TUI when explicitly requested.',
229
+ ].join('\n'),
230
+ tags: ['operations', 'incident', 'runbook'],
231
+ triggers: ['incident', 'ops', 'approval', 'automation', 'service'],
232
+ },
233
+ skills: [
234
+ {
235
+ name: 'Incident Intake',
236
+ description: 'Convert a symptom into severity, suspected system, evidence, and next safe checks.',
237
+ procedure: [
238
+ '1. Identify symptom, affected surface, time window, severity, and user impact.',
239
+ '2. Pull read-only status, approvals, schedules, runs, and workplan summaries.',
240
+ '3. Separate evidence from hypothesis.',
241
+ '4. Ask before mutating services, automation, schedules, or approvals.',
242
+ ].join('\n'),
243
+ triggers: ['incident', 'outage', 'broken', 'triage'],
244
+ tags: ['operations', 'incident'],
245
+ },
246
+ {
247
+ name: 'Approval Review',
248
+ description: 'Summarize pending approvals with risk, route, and required decision.',
249
+ procedure: [
250
+ '1. List pending approvals and classify risk labels.',
251
+ '2. Explain what each approval would allow.',
252
+ '3. Only approve, deny, or cancel from exact user command with confirmation.',
253
+ ].join('\n'),
254
+ triggers: ['approvals', 'pending approval', 'review approvals'],
255
+ tags: ['operations', 'approvals'],
256
+ },
257
+ ],
258
+ routines: [
259
+ {
260
+ name: 'Daily Operations Sweep',
261
+ description: 'Inspect service posture, pending approvals, failed runs, and stale tasks.',
262
+ steps: [
263
+ '1. Refresh connected-host status, compat, approvals, workplan, automation snapshot, runs, schedules, and capacity.',
264
+ '2. Summarize degraded items and blocked work.',
265
+ '3. Recommend exact follow-up commands with confirmation gates for side effects.',
266
+ ].join('\n'),
267
+ triggers: ['daily ops', 'operations sweep'],
268
+ tags: ['operations', 'review'],
269
+ },
270
+ ],
271
+ },
272
+ {
273
+ id: 'personal-productivity',
274
+ source: 'builtin',
275
+ name: 'Personal Productivity',
276
+ description: 'Task capture, weekly planning, focus blocks, reminders, and decision hygiene.',
277
+ personaName: 'Personal Productivity Coach',
278
+ skillNames: ['Inbox Zero Triage', 'Focus Block Planner'],
279
+ routineNames: ['Weekly Personal Planning'],
280
+ persona: {
281
+ name: 'Personal Productivity Coach',
282
+ description: 'Personal assistant for task capture, planning, prioritization, and follow-through.',
283
+ body: [
284
+ 'Keep planning lightweight and action-oriented.',
285
+ 'Capture durable preferences, commitments, and constraints locally when they are useful later.',
286
+ 'Prefer one clear next action over broad plans.',
287
+ 'Ask before sending messages, spending money, changing services, or deleting records.',
288
+ ].join('\n'),
289
+ tags: ['productivity', 'planning', 'personal'],
290
+ triggers: ['plan my day', 'prioritize', 'tasks', 'focus'],
291
+ },
292
+ skills: [
293
+ {
294
+ name: 'Inbox Zero Triage',
295
+ description: 'Sort loose tasks into do, delegate, defer, drop, or ask-for-info.',
296
+ procedure: [
297
+ '1. Capture each item as an outcome and next action.',
298
+ '2. Classify by urgency, effort, dependency, and consequence.',
299
+ '3. Recommend a short ordered list for today and parking lot for later.',
300
+ '4. Store durable commitments locally with source and date.',
301
+ ].join('\n'),
302
+ triggers: ['triage tasks', 'organize tasks', 'inbox'],
303
+ tags: ['productivity', 'triage'],
304
+ },
305
+ {
306
+ name: 'Focus Block Planner',
307
+ description: 'Design realistic focus blocks around constraints and energy.',
308
+ procedure: [
309
+ '1. Identify available time, constraints, and high-value outcome.',
310
+ '2. Split work into 25-90 minute blocks with breakpoints.',
311
+ '3. Keep schedule changes local unless the user explicitly asks for calendar or external updates.',
312
+ ].join('\n'),
313
+ triggers: ['focus block', 'plan my day', 'deep work'],
314
+ tags: ['productivity', 'focus'],
315
+ },
316
+ ],
317
+ routines: [
318
+ {
319
+ name: 'Weekly Personal Planning',
320
+ description: 'Review commitments, priorities, routines, and open decisions for the week.',
321
+ steps: [
322
+ '1. Review local tasks, routines, memory, and recent decisions.',
323
+ '2. Identify top outcomes, blockers, and decisions needed from the user.',
324
+ '3. Suggest a small weekly plan and ask before creating external reminders or sending messages.',
325
+ ].join('\n'),
326
+ triggers: ['weekly planning', 'plan my week'],
327
+ tags: ['productivity', 'review'],
328
+ },
329
+ ],
330
+ },
331
+ ];