@pellux/goodvibes-agent 1.1.7 → 1.2.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 (255) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/README.md +46 -30
  3. package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-swtppvy9.node} +0 -0
  4. package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-ttfcdtap.node} +0 -0
  5. package/dist/package/main.js +132577 -91483
  6. package/docs/README.md +14 -7
  7. package/docs/channels-remote-and-api.md +8 -5
  8. package/docs/connected-host.md +14 -12
  9. package/docs/getting-started.md +56 -30
  10. package/docs/knowledge-artifacts-and-multimodal.md +7 -5
  11. package/docs/project-planning.md +2 -2
  12. package/docs/providers-and-routing.md +11 -3
  13. package/docs/tools-and-commands.md +114 -45
  14. package/docs/voice-and-live-tts.md +3 -1
  15. package/package.json +3 -2
  16. package/release/release-notes.md +130 -5
  17. package/release/release-readiness.json +120 -90
  18. package/src/agent/assistant-cockpit.ts +247 -0
  19. package/src/agent/autonomy-schedule-format.ts +96 -0
  20. package/src/agent/autonomy-schedule.ts +514 -0
  21. package/src/agent/channel-delivery-receipts.ts +292 -0
  22. package/src/agent/competitive-feature-inventory.ts +296 -0
  23. package/src/agent/document-registry-types.ts +106 -0
  24. package/src/agent/document-registry.ts +734 -0
  25. package/src/agent/harness-control.ts +2 -2
  26. package/src/agent/memory-prompt.ts +2 -2
  27. package/src/agent/operator-actions.ts +50 -6
  28. package/src/agent/persona-registry.ts +8 -0
  29. package/src/agent/project-context-files.ts +273 -0
  30. package/src/agent/prompt-context-receipts.ts +502 -0
  31. package/src/agent/reminder-schedule-format.ts +16 -2
  32. package/src/agent/research-run-registry.ts +582 -0
  33. package/src/agent/research-source-registry.ts +441 -0
  34. package/src/agent/routine-registry.ts +19 -3
  35. package/src/agent/routine-schedule-format.ts +27 -2
  36. package/src/agent/runtime-profile-starters.ts +7 -0
  37. package/src/agent/runtime-profile.ts +106 -4
  38. package/src/agent/schedule-edit-format.ts +129 -0
  39. package/src/agent/schedule-edit.ts +496 -0
  40. package/src/agent/schedule-next-routes.ts +42 -0
  41. package/src/agent/setup-wizard-checkpoint.ts +140 -0
  42. package/src/agent/setup-wizard.ts +447 -0
  43. package/src/agent/skill-registry-types.ts +102 -0
  44. package/src/agent/skill-registry.ts +81 -107
  45. package/src/agent/vibe-confirmation-routes.ts +62 -0
  46. package/src/agent/vibe-file.ts +285 -0
  47. package/src/cli/agent-knowledge-command.ts +45 -2
  48. package/src/cli/help.ts +3 -0
  49. package/src/cli/profiles-command.ts +25 -11
  50. package/src/config/agent-settings-policy.ts +1 -18
  51. package/src/input/agent-workspace-activation.ts +53 -0
  52. package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
  53. package/src/input/agent-workspace-artifact-metadata.ts +17 -0
  54. package/src/input/agent-workspace-basic-command-editors.ts +5 -1
  55. package/src/input/agent-workspace-categories.ts +153 -155
  56. package/src/input/agent-workspace-channel-triage.ts +481 -0
  57. package/src/input/agent-workspace-channels.ts +263 -0
  58. package/src/input/agent-workspace-command-editor.ts +152 -0
  59. package/src/input/agent-workspace-context-snapshot.ts +349 -0
  60. package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
  61. package/src/input/agent-workspace-document-editor.ts +502 -0
  62. package/src/input/agent-workspace-document-ops-editor.ts +523 -0
  63. package/src/input/agent-workspace-host-category.ts +1 -1
  64. package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
  65. package/src/input/agent-workspace-model-compare-editor.ts +376 -0
  66. package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
  67. package/src/input/agent-workspace-model-compare-types.ts +82 -0
  68. package/src/input/agent-workspace-model-compare-utils.ts +35 -0
  69. package/src/input/agent-workspace-onboarding-categories.ts +141 -0
  70. package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
  71. package/src/input/agent-workspace-operations-command-editors.ts +22 -0
  72. package/src/input/agent-workspace-research-report-editor.ts +212 -0
  73. package/src/input/agent-workspace-research-run-editor.ts +144 -0
  74. package/src/input/agent-workspace-research-source-editor.ts +167 -0
  75. package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
  76. package/src/input/agent-workspace-review-packet-utils.ts +265 -0
  77. package/src/input/agent-workspace-settings.ts +262 -30
  78. package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
  79. package/src/input/agent-workspace-setup-snapshot.ts +198 -0
  80. package/src/input/agent-workspace-setup.ts +34 -1
  81. package/src/input/agent-workspace-snapshot.ts +162 -147
  82. package/src/input/agent-workspace-types.ts +287 -2
  83. package/src/input/agent-workspace.ts +18 -0
  84. package/src/input/command-registry.ts +9 -2
  85. package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
  86. package/src/input/commands/channels-runtime.ts +102 -114
  87. package/src/input/commands/delegation-runtime.ts +87 -24
  88. package/src/input/commands/knowledge-browser-flags.ts +12 -0
  89. package/src/input/commands/knowledge.ts +28 -14
  90. package/src/input/commands/operator-actions-runtime.ts +6 -3
  91. package/src/input/commands/schedule-runtime.ts +71 -14
  92. package/src/input/commands/session-content.ts +2 -2
  93. package/src/input/commands/shell-core.ts +2 -0
  94. package/src/input/commands/vibe-runtime.ts +140 -0
  95. package/src/input/commands.ts +2 -0
  96. package/src/input/connected-host-routes.ts +123 -0
  97. package/src/input/settings-modal-types.ts +14 -0
  98. package/src/main.ts +15 -15
  99. package/src/panels/qr-panel.ts +2 -2
  100. package/src/renderer/agent-workspace-context-lines.ts +686 -0
  101. package/src/renderer/agent-workspace.ts +30 -419
  102. package/src/renderer/settings-modal-helpers.ts +12 -0
  103. package/src/renderer/settings-modal.ts +12 -0
  104. package/src/runtime/bootstrap-command-context.ts +11 -1
  105. package/src/runtime/bootstrap-command-parts.ts +14 -3
  106. package/src/runtime/bootstrap-core.ts +39 -1
  107. package/src/runtime/bootstrap-shell.ts +6 -0
  108. package/src/runtime/bootstrap.ts +113 -30
  109. package/src/runtime/connected-host-auth.ts +3 -2
  110. package/src/runtime/execution-ledger.ts +231 -0
  111. package/src/runtime/services.ts +88 -10
  112. package/src/runtime/tool-permission-safety.ts +199 -5
  113. package/src/shell/session-continuity-hints.ts +39 -0
  114. package/src/tools/agent-artifacts-tool.ts +606 -0
  115. package/src/tools/agent-audit-tool.ts +155 -0
  116. package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
  117. package/src/tools/agent-autonomy-tool.ts +140 -0
  118. package/src/tools/agent-channel-send-tool.ts +24 -2
  119. package/src/tools/agent-channels-tool.ts +140 -0
  120. package/src/tools/agent-computer-tool.ts +168 -0
  121. package/src/tools/agent-context-policy.ts +137 -7
  122. package/src/tools/agent-context-tool.ts +143 -0
  123. package/src/tools/agent-delegation-tool.ts +128 -0
  124. package/src/tools/agent-device-tool.ts +240 -0
  125. package/src/tools/agent-documents-tool.ts +684 -0
  126. package/src/tools/agent-execution-tool.ts +230 -0
  127. package/src/tools/agent-harness-agent-orchestration.ts +703 -0
  128. package/src/tools/agent-harness-autonomy-intake.ts +785 -0
  129. package/src/tools/agent-harness-autonomy-live-records.ts +588 -0
  130. package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
  131. package/src/tools/agent-harness-autonomy-queue.ts +560 -0
  132. package/src/tools/agent-harness-background-processes-types.ts +35 -0
  133. package/src/tools/agent-harness-background-processes.ts +794 -0
  134. package/src/tools/agent-harness-browser-cockpit-route.ts +219 -0
  135. package/src/tools/agent-harness-browser-control.ts +338 -0
  136. package/src/tools/agent-harness-channel-metadata.ts +168 -10
  137. package/src/tools/agent-harness-cli-command-policy.ts +110 -0
  138. package/src/tools/agent-harness-command-catalog.ts +4 -2
  139. package/src/tools/agent-harness-command-runner.ts +42 -0
  140. package/src/tools/agent-harness-connected-host-status.ts +7 -4
  141. package/src/tools/agent-harness-delegation-posture.ts +234 -19
  142. package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
  143. package/src/tools/agent-harness-document-ops-types.ts +72 -0
  144. package/src/tools/agent-harness-document-ops.ts +671 -0
  145. package/src/tools/agent-harness-execution-history.ts +489 -0
  146. package/src/tools/agent-harness-execution-posture.ts +382 -0
  147. package/src/tools/agent-harness-file-recovery.ts +135 -0
  148. package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
  149. package/src/tools/agent-harness-learning-curator-common.ts +102 -0
  150. package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
  151. package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
  152. package/src/tools/agent-harness-learning-curator-types.ts +151 -0
  153. package/src/tools/agent-harness-learning-curator.ts +417 -0
  154. package/src/tools/agent-harness-local-model-benchmarks.ts +199 -0
  155. package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
  156. package/src/tools/agent-harness-local-model-endpoints.ts +673 -0
  157. package/src/tools/agent-harness-media-posture.ts +208 -2
  158. package/src/tools/agent-harness-memory-posture.ts +556 -0
  159. package/src/tools/agent-harness-metadata.ts +100 -168
  160. package/src/tools/agent-harness-mode-catalog.ts +84 -33
  161. package/src/tools/agent-harness-model-catalog.ts +162 -0
  162. package/src/tools/agent-harness-model-provider-health.ts +186 -0
  163. package/src/tools/agent-harness-model-readiness.ts +406 -0
  164. package/src/tools/agent-harness-model-routing-types.ts +266 -0
  165. package/src/tools/agent-harness-model-routing-utils.ts +30 -0
  166. package/src/tools/agent-harness-model-routing.ts +137 -190
  167. package/src/tools/agent-harness-operator-methods.ts +115 -133
  168. package/src/tools/agent-harness-pairing-posture.ts +431 -18
  169. package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
  170. package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
  171. package/src/tools/agent-harness-personal-ops-lanes.ts +204 -0
  172. package/src/tools/agent-harness-personal-ops-records.ts +732 -0
  173. package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
  174. package/src/tools/agent-harness-personal-ops-types.ts +222 -0
  175. package/src/tools/agent-harness-personal-ops.ts +606 -0
  176. package/src/tools/agent-harness-project-context.ts +144 -0
  177. package/src/tools/agent-harness-prompt-context.ts +589 -0
  178. package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
  179. package/src/tools/agent-harness-release-evidence.ts +9 -7
  180. package/src/tools/agent-harness-release-readiness.ts +9 -7
  181. package/src/tools/agent-harness-research-briefing.ts +427 -0
  182. package/src/tools/agent-harness-research-queue.ts +250 -0
  183. package/src/tools/agent-harness-research-runs.ts +295 -0
  184. package/src/tools/agent-harness-research-workflow.ts +322 -0
  185. package/src/tools/agent-harness-security-posture.ts +2 -2
  186. package/src/tools/agent-harness-service-posture.ts +9 -9
  187. package/src/tools/agent-harness-session-metadata.ts +3 -3
  188. package/src/tools/agent-harness-setup-connected-host.ts +501 -0
  189. package/src/tools/agent-harness-setup-describe.ts +557 -0
  190. package/src/tools/agent-harness-setup-handoffs.ts +502 -0
  191. package/src/tools/agent-harness-setup-model-helpers.ts +101 -0
  192. package/src/tools/agent-harness-setup-plan.ts +253 -0
  193. package/src/tools/agent-harness-setup-posture-types.ts +218 -0
  194. package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
  195. package/src/tools/agent-harness-setup-posture.ts +449 -221
  196. package/src/tools/agent-harness-setup-smoke.ts +508 -0
  197. package/src/tools/agent-harness-sudo-posture.ts +114 -0
  198. package/src/tools/agent-harness-tool-schema.ts +120 -7
  199. package/src/tools/agent-harness-tool-types.ts +78 -0
  200. package/src/tools/agent-harness-tool-utils.ts +43 -0
  201. package/src/tools/agent-harness-tool.ts +311 -370
  202. package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
  203. package/src/tools/agent-harness-ui-surface-types.ts +46 -0
  204. package/src/tools/agent-harness-vibe-health.ts +105 -0
  205. package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
  206. package/src/tools/agent-harness-workspace-actions.ts +114 -8
  207. package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
  208. package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
  209. package/src/tools/agent-host-tool.ts +159 -0
  210. package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
  211. package/src/tools/agent-learning-consolidation-core.ts +327 -0
  212. package/src/tools/agent-learning-consolidation-tool.ts +758 -0
  213. package/src/tools/agent-memory-tool.ts +214 -0
  214. package/src/tools/agent-model-compare-export.ts +315 -0
  215. package/src/tools/agent-model-compare-handoff.ts +592 -0
  216. package/src/tools/agent-model-compare-judgment.ts +633 -0
  217. package/src/tools/agent-model-compare-run.ts +722 -0
  218. package/src/tools/agent-model-compare-tool.ts +698 -0
  219. package/src/tools/agent-model-compare-types.ts +191 -0
  220. package/src/tools/agent-model-compare-utils.ts +93 -0
  221. package/src/tools/agent-models-tool.ts +208 -0
  222. package/src/tools/agent-operator-action-tool.ts +1 -1
  223. package/src/tools/agent-operator-method-tool.ts +643 -0
  224. package/src/tools/agent-personal-ops-tool.ts +197 -0
  225. package/src/tools/agent-policy-explanation.ts +415 -0
  226. package/src/tools/agent-research-report-tool.ts +608 -0
  227. package/src/tools/agent-research-runs-tool.ts +434 -0
  228. package/src/tools/agent-research-sources-tool.ts +443 -0
  229. package/src/tools/agent-research-tool.ts +687 -0
  230. package/src/tools/agent-review-packet-presets-core.ts +757 -0
  231. package/src/tools/agent-review-packet-presets-tool.ts +466 -0
  232. package/src/tools/agent-review-packet-share-tool.ts +305 -0
  233. package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
  234. package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
  235. package/src/tools/agent-route-planner-candidates-work.ts +251 -0
  236. package/src/tools/agent-route-planner-helpers.ts +667 -0
  237. package/src/tools/agent-route-planner.ts +185 -0
  238. package/src/tools/agent-route-tool.ts +105 -0
  239. package/src/tools/agent-schedule-edit-tool.ts +210 -0
  240. package/src/tools/agent-schedule-tool.ts +282 -0
  241. package/src/tools/agent-security-tool.ts +145 -0
  242. package/src/tools/agent-sessions-tool.ts +122 -0
  243. package/src/tools/agent-settings-import-tool.ts +104 -0
  244. package/src/tools/agent-settings-tool.ts +176 -0
  245. package/src/tools/agent-setup-tool.ts +226 -0
  246. package/src/tools/agent-support-tool.ts +122 -0
  247. package/src/tools/agent-terminal-process-tools.ts +167 -0
  248. package/src/tools/agent-tool-policy-guard-types.ts +77 -0
  249. package/src/tools/agent-tool-policy-guard.ts +106 -85
  250. package/src/tools/agent-vibe-tool.ts +297 -0
  251. package/src/tools/agent-work-plan-tool.ts +265 -6
  252. package/src/tools/agent-workspace-tool.ts +305 -0
  253. package/src/tools/artifact-archive.ts +169 -0
  254. package/src/tools/tool-definition-compaction.ts +36 -0
  255. package/src/version.ts +1 -1
@@ -0,0 +1,556 @@
1
+ import type { MemoryDoctorReport, MemoryEmbeddingProviderStatus, MemoryVectorStats } from '@pellux/goodvibes-sdk/platform/state';
2
+ import type { CommandContext } from '../input/command-registry.ts';
3
+ import { buildAgentWorkspaceRuntimeSnapshot } from '../input/agent-workspace-snapshot.ts';
4
+ import { previewHarnessText } from './agent-harness-text.ts';
5
+
6
+ type MemoryPostureStatus = 'ready' | 'needs-review' | 'empty' | 'unavailable';
7
+ type MemoryVectorPostureStatus = 'ready' | 'attention' | 'disabled' | 'unavailable';
8
+ type MemoryExternalProviderStatus = 'not-published' | 'available';
9
+ type MemoryExternalProviderSetupStatus = 'contract-needed' | 'ready';
10
+
11
+ interface AgentHarnessMemoryPostureArgs {
12
+ readonly providerId?: unknown;
13
+ readonly target?: unknown;
14
+ readonly query?: unknown;
15
+ readonly includeParameters?: unknown;
16
+ readonly limit?: unknown;
17
+ }
18
+
19
+ interface MemoryPostureProvider {
20
+ readonly id: string;
21
+ readonly label: string;
22
+ readonly kind: 'embedding' | 'external-memory';
23
+ readonly status: string;
24
+ readonly summary: string;
25
+ readonly modelRoute: string;
26
+ readonly setupRoute?: string;
27
+ readonly configured?: boolean;
28
+ readonly active?: boolean;
29
+ readonly dimensions?: number;
30
+ readonly deterministic?: boolean;
31
+ readonly metadata?: Readonly<Record<string, unknown>>;
32
+ readonly setupGuide?: MemoryExternalProviderSetupGuide;
33
+ }
34
+
35
+ interface MemoryExternalProviderSetupGuide {
36
+ readonly status: MemoryExternalProviderSetupStatus;
37
+ readonly userOutcome: string;
38
+ readonly currentState: string;
39
+ readonly safeFirstStep: string;
40
+ readonly inspectRoutes: readonly string[];
41
+ readonly nextRoutes: readonly MemoryExternalProviderRoute[];
42
+ readonly contractChecklist: readonly MemoryExternalProviderContractCheck[];
43
+ readonly receiptContract: MemoryExternalProviderReceiptContract;
44
+ readonly requiredHostContracts: readonly string[];
45
+ readonly credentialPolicy: string;
46
+ readonly confirmationPolicy: string;
47
+ }
48
+
49
+ interface MemoryExternalProviderRoute {
50
+ readonly id: string;
51
+ readonly label: string;
52
+ readonly modelRoute: string;
53
+ readonly effect: 'read-only' | 'confirmed';
54
+ readonly why: string;
55
+ }
56
+
57
+ interface MemoryExternalProviderContractCheck {
58
+ readonly id: string;
59
+ readonly label: string;
60
+ readonly status: 'missing';
61
+ readonly requiredFor: string;
62
+ readonly owner: 'goodvibes-sdk-or-daemon';
63
+ readonly inspectRoute: string;
64
+ }
65
+
66
+ interface MemoryExternalProviderReceiptContract {
67
+ readonly status: 'missing';
68
+ readonly appliesTo: readonly string[];
69
+ readonly requiredFields: readonly string[];
70
+ readonly nextWhenPublished: string;
71
+ }
72
+
73
+ export type MemoryProviderResolution =
74
+ | { readonly status: 'found'; readonly provider: Record<string, unknown> }
75
+ | { readonly status: 'ambiguous'; readonly input: string; readonly candidates: readonly Record<string, unknown>[] }
76
+ | { readonly status: 'missing_lookup'; readonly usage: string };
77
+
78
+ const EXTERNAL_MEMORY_PROVIDERS: readonly { readonly id: string; readonly label: string }[] = [
79
+ { id: 'honcho', label: 'Honcho' },
80
+ { id: 'openviking', label: 'OpenViking' },
81
+ { id: 'mem0', label: 'Mem0' },
82
+ { id: 'hindsight', label: 'Hindsight' },
83
+ { id: 'holographic', label: 'Holographic' },
84
+ { id: 'retaindb', label: 'RetainDB' },
85
+ { id: 'byterover', label: 'ByteRover' },
86
+ { id: 'supermemory', label: 'Supermemory' },
87
+ ];
88
+
89
+ const EXTERNAL_MEMORY_REQUIRED_CONTRACTS = [
90
+ 'Provider status/readiness record with stable provider id.',
91
+ 'Credential reference or setup state that never returns raw secret values.',
92
+ 'Bounded read/search route with redaction and source provenance.',
93
+ 'Explicit write/upsert/import route with confirmation and durable receipt.',
94
+ 'Forget/delete/disable route or an explicit not-supported contract.',
95
+ 'Sync/export/import receipts with timestamps and failure reasons.',
96
+ 'Prompt-injection eligibility policy for what may enter the Agent prompt.',
97
+ ] as const;
98
+
99
+ const EXTERNAL_MEMORY_RECEIPT_FIELDS = [
100
+ 'receiptId',
101
+ 'providerId',
102
+ 'operation',
103
+ 'status',
104
+ 'createdAt',
105
+ 'sourceCount',
106
+ 'redaction',
107
+ 'failureReason',
108
+ 'nextRoute',
109
+ ] as const;
110
+
111
+ function readString(value: unknown): string {
112
+ return typeof value === 'string' ? value.trim() : '';
113
+ }
114
+
115
+ function readLimit(value: unknown, fallback: number): number {
116
+ const parsed = typeof value === 'string' && value.trim() ? Number(value) : value;
117
+ if (typeof parsed !== 'number' || !Number.isFinite(parsed)) return fallback;
118
+ return Math.max(1, Math.min(200, Math.trunc(parsed)));
119
+ }
120
+
121
+ function memoryApi(context: CommandContext): {
122
+ readonly vectorStats?: () => MemoryVectorStats;
123
+ readonly doctor?: () => Promise<MemoryDoctorReport>;
124
+ } | null {
125
+ return context.clients?.agentKnowledgeApi?.memory ?? null;
126
+ }
127
+
128
+ async function readMemoryDoctor(context: CommandContext): Promise<MemoryDoctorReport | null> {
129
+ const memory = memoryApi(context);
130
+ if (!memory || typeof memory.doctor !== 'function') return null;
131
+ try {
132
+ return await memory.doctor();
133
+ } catch {
134
+ return null;
135
+ }
136
+ }
137
+
138
+ function readVectorStats(context: CommandContext, doctor: MemoryDoctorReport | null): MemoryVectorStats | null {
139
+ if (doctor?.vector) return doctor.vector;
140
+ const memory = memoryApi(context);
141
+ if (!memory || typeof memory.vectorStats !== 'function') return null;
142
+ try {
143
+ return memory.vectorStats();
144
+ } catch {
145
+ return null;
146
+ }
147
+ }
148
+
149
+ function memoryStatus(snapshot: ReturnType<typeof buildAgentWorkspaceRuntimeSnapshot>, memoryAvailable: boolean): MemoryPostureStatus {
150
+ if (!memoryAvailable) return 'unavailable';
151
+ if (snapshot.localMemoryCount === 0) return 'empty';
152
+ if (snapshot.localMemoryPromptActiveCount > 0) return 'ready';
153
+ return 'needs-review';
154
+ }
155
+
156
+ function vectorStatus(vector: MemoryVectorStats | null): MemoryVectorPostureStatus {
157
+ if (!vector) return 'unavailable';
158
+ if (!vector.enabled) return 'disabled';
159
+ if (vector.available && !vector.error) return 'ready';
160
+ return 'attention';
161
+ }
162
+
163
+ function describeEmbeddingProvider(
164
+ provider: MemoryEmbeddingProviderStatus,
165
+ activeProviderId: string | undefined,
166
+ includeParameters: boolean,
167
+ ): MemoryPostureProvider {
168
+ return {
169
+ id: provider.id,
170
+ label: provider.label,
171
+ kind: 'embedding',
172
+ status: provider.state,
173
+ summary: previewHarnessText(provider.detail ?? `${provider.configured ? 'configured' : 'not configured'} memory embedding provider`, includeParameters ? 180 : 96),
174
+ modelRoute: `memory action:"provider" providerId:"${provider.id}"`,
175
+ setupRoute: `settings action:"set" key:"provider.embeddingProvider" value:"${provider.id}" confirm:true explicitUserRequest:"..."`,
176
+ configured: provider.configured,
177
+ active: provider.id === activeProviderId,
178
+ dimensions: provider.dimensions,
179
+ ...(typeof provider.deterministic === 'boolean' ? { deterministic: provider.deterministic } : {}),
180
+ ...(includeParameters ? { metadata: provider.metadata } : {}),
181
+ };
182
+ }
183
+
184
+ function externalProviderNextRoutes(provider: typeof EXTERNAL_MEMORY_PROVIDERS[number]): readonly MemoryExternalProviderRoute[] {
185
+ return [
186
+ {
187
+ id: 'inspect-provider-contract',
188
+ label: 'Inspect provider contract',
189
+ modelRoute: `memory action:"provider" providerId:"${provider.id}" includeParameters:true`,
190
+ effect: 'read-only',
191
+ why: 'Shows the current SDK/daemon contract checklist, missing receipt fields, credential boundary, and local fallback.',
192
+ },
193
+ {
194
+ id: 'inspect-host-capability',
195
+ label: 'Inspect host capability',
196
+ modelRoute: `host action:"capability" query:"${provider.id} memory provider"`,
197
+ effect: 'read-only',
198
+ why: 'Checks whether the connected GoodVibes host publishes a provider capability record for Agent to consume.',
199
+ },
200
+ {
201
+ id: 'inspect-mcp-server',
202
+ label: 'Inspect MCP server',
203
+ modelRoute: `agent_harness mode:"mcp_servers" query:"${provider.id}"`,
204
+ effect: 'read-only',
205
+ why: 'Finds a matching MCP connector without reading secrets or invoking provider writes.',
206
+ },
207
+ {
208
+ id: 'inspect-memory-settings',
209
+ label: 'Inspect memory settings',
210
+ modelRoute: 'settings action:"list" query:"memory" includeHidden:true',
211
+ effect: 'read-only',
212
+ why: 'Shows safe setting keys and secret-ref posture before any memory-provider configuration change.',
213
+ },
214
+ ];
215
+ }
216
+
217
+ function externalProviderContractChecklist(provider: typeof EXTERNAL_MEMORY_PROVIDERS[number]): readonly MemoryExternalProviderContractCheck[] {
218
+ const providerQuery = `${provider.id} memory provider`;
219
+ return [
220
+ {
221
+ id: 'status-record',
222
+ label: 'Provider status/readiness record',
223
+ status: 'missing',
224
+ requiredFor: 'Show whether the provider is configured, reachable, and safe to use.',
225
+ owner: 'goodvibes-sdk-or-daemon',
226
+ inspectRoute: `host action:"capability" query:"${providerQuery}"`,
227
+ },
228
+ {
229
+ id: 'credential-reference',
230
+ label: 'Credential reference without raw secret values',
231
+ status: 'missing',
232
+ requiredFor: 'Let the user repair auth without exposing API keys or memory payloads.',
233
+ owner: 'goodvibes-sdk-or-daemon',
234
+ inspectRoute: 'settings action:"list" query:"memory" includeHidden:true',
235
+ },
236
+ {
237
+ id: 'bounded-read-search',
238
+ label: 'Bounded read/search route',
239
+ status: 'missing',
240
+ requiredFor: 'Review external memories with redaction, provenance, and source limits before prompt use.',
241
+ owner: 'goodvibes-sdk-or-daemon',
242
+ inspectRoute: `agent_harness mode:"mcp_servers" query:"${provider.id}"`,
243
+ },
244
+ {
245
+ id: 'confirmed-write-upsert',
246
+ label: 'Confirmed write/upsert/import route',
247
+ status: 'missing',
248
+ requiredFor: 'Write external memories only after explicit user request and confirmation.',
249
+ owner: 'goodvibes-sdk-or-daemon',
250
+ inspectRoute: `host action:"capability" query:"${providerQuery}"`,
251
+ },
252
+ {
253
+ id: 'sync-receipts',
254
+ label: 'Sync/import/export receipts',
255
+ status: 'missing',
256
+ requiredFor: 'Prove what crossed the provider boundary, when it happened, and what failed.',
257
+ owner: 'goodvibes-sdk-or-daemon',
258
+ inspectRoute: `memory action:"provider" providerId:"${provider.id}" includeParameters:true`,
259
+ },
260
+ {
261
+ id: 'prompt-eligibility-policy',
262
+ label: 'Prompt eligibility policy',
263
+ status: 'missing',
264
+ requiredFor: 'Prevent external provider records from silently entering the Agent prompt.',
265
+ owner: 'goodvibes-sdk-or-daemon',
266
+ inspectRoute: 'context action:"prompt" includeParameters:true',
267
+ },
268
+ ];
269
+ }
270
+
271
+ function externalProviderReceiptContract(providerId = '<provider-id>'): MemoryExternalProviderReceiptContract {
272
+ return {
273
+ status: 'missing',
274
+ appliesTo: ['status', 'read', 'write', 'upsert', 'import', 'export', 'sync', 'forget'],
275
+ requiredFields: EXTERNAL_MEMORY_RECEIPT_FIELDS,
276
+ nextWhenPublished: `memory action:"provider" providerId:"${providerId}" includeParameters:true should expose latest receipts and exact follow-up routes.`,
277
+ };
278
+ }
279
+
280
+ function externalProviderSetupGuide(provider: typeof EXTERNAL_MEMORY_PROVIDERS[number]): MemoryExternalProviderSetupGuide {
281
+ return {
282
+ status: 'contract-needed',
283
+ userOutcome: `Use ${provider.label} as an external memory backend only after the SDK/daemon publishes provider setup, status, read, write, and receipt contracts for Agent to consume.`,
284
+ currentState: `No concrete ${provider.label} provider record is published by the current SDK/daemon contract.`,
285
+ safeFirstStep: `Inspect connected-host and MCP setup for ${provider.label}; keep Agent-local memory as the active path until a ready provider record exists.`,
286
+ inspectRoutes: [
287
+ `memory action:"provider" providerId:"${provider.id}" includeParameters:true`,
288
+ `host action:"capability" query:"${provider.id} memory provider"`,
289
+ `agent_harness mode:"mcp_servers" query:"${provider.id}"`,
290
+ 'settings action:"list" query:"memory" includeHidden:true',
291
+ ],
292
+ nextRoutes: externalProviderNextRoutes(provider),
293
+ contractChecklist: externalProviderContractChecklist(provider),
294
+ receiptContract: externalProviderReceiptContract(provider.id),
295
+ requiredHostContracts: EXTERNAL_MEMORY_REQUIRED_CONTRACTS,
296
+ credentialPolicy: 'Provider credentials must use secret refs or connected-host auth state; raw API keys, tokens, and user memory payloads are never returned by posture inspection.',
297
+ confirmationPolicy: 'External memory writes, sync, import, export, forget/delete, and prompt-eligibility changes require explicit user request, confirmation, and durable receipts.',
298
+ };
299
+ }
300
+
301
+ function describeExternalProvider(
302
+ provider: typeof EXTERNAL_MEMORY_PROVIDERS[number],
303
+ includeParameters: boolean,
304
+ ): MemoryPostureProvider {
305
+ const status: MemoryExternalProviderStatus = 'not-published';
306
+ return {
307
+ id: provider.id,
308
+ label: provider.label,
309
+ kind: 'external-memory',
310
+ status,
311
+ summary: previewHarnessText('External memory backend records are not published by the current GoodVibes SDK/daemon contract.', includeParameters ? 180 : 96),
312
+ modelRoute: `memory action:"provider" providerId:"${provider.id}"`,
313
+ setupRoute: 'host action:"capability" query:"memory provider"',
314
+ configured: false,
315
+ ...(includeParameters ? { setupGuide: externalProviderSetupGuide(provider) } : {}),
316
+ };
317
+ }
318
+
319
+ function providerSearchText(provider: MemoryPostureProvider): string {
320
+ return [
321
+ provider.id,
322
+ provider.label,
323
+ provider.kind,
324
+ provider.status,
325
+ provider.summary,
326
+ provider.modelRoute,
327
+ provider.setupRoute ?? '',
328
+ provider.setupGuide ? [
329
+ provider.setupGuide.status,
330
+ provider.setupGuide.userOutcome,
331
+ provider.setupGuide.currentState,
332
+ provider.setupGuide.safeFirstStep,
333
+ provider.setupGuide.inspectRoutes.join('\n'),
334
+ provider.setupGuide.nextRoutes.map((route) => `${route.id} ${route.label} ${route.modelRoute} ${route.effect} ${route.why}`).join('\n'),
335
+ provider.setupGuide.contractChecklist.map((check) => `${check.id} ${check.label} ${check.status} ${check.requiredFor} ${check.inspectRoute}`).join('\n'),
336
+ provider.setupGuide.receiptContract.appliesTo.join('\n'),
337
+ provider.setupGuide.receiptContract.requiredFields.join('\n'),
338
+ provider.setupGuide.receiptContract.nextWhenPublished,
339
+ provider.setupGuide.requiredHostContracts.join('\n'),
340
+ provider.setupGuide.credentialPolicy,
341
+ provider.setupGuide.confirmationPolicy,
342
+ ].join('\n') : '',
343
+ ].join('\n').toLowerCase();
344
+ }
345
+
346
+ function compactProvider(provider: MemoryPostureProvider, includeParameters: boolean): Record<string, unknown> {
347
+ return {
348
+ id: provider.id,
349
+ label: provider.label,
350
+ kind: provider.kind,
351
+ status: provider.status,
352
+ summary: provider.summary,
353
+ modelRoute: provider.modelRoute,
354
+ ...(provider.setupRoute ? { setupRoute: provider.setupRoute } : {}),
355
+ ...(includeParameters && typeof provider.configured === 'boolean' ? { configured: provider.configured } : {}),
356
+ ...(includeParameters && typeof provider.active === 'boolean' ? { active: provider.active } : {}),
357
+ ...(includeParameters && typeof provider.dimensions === 'number' ? { dimensions: provider.dimensions } : {}),
358
+ ...(includeParameters && typeof provider.deterministic === 'boolean' ? { deterministic: provider.deterministic } : {}),
359
+ ...(includeParameters && provider.metadata ? { metadata: provider.metadata } : {}),
360
+ ...(includeParameters && provider.setupGuide ? { setupGuide: provider.setupGuide } : {}),
361
+ };
362
+ }
363
+
364
+ async function buildProviderRecords(
365
+ context: CommandContext,
366
+ args: AgentHarnessMemoryPostureArgs,
367
+ ): Promise<{
368
+ readonly doctor: MemoryDoctorReport | null;
369
+ readonly vector: MemoryVectorStats | null;
370
+ readonly providers: readonly MemoryPostureProvider[];
371
+ }> {
372
+ const includeParameters = args.includeParameters === true;
373
+ const doctor = await readMemoryDoctor(context);
374
+ const vector = readVectorStats(context, doctor);
375
+ const embeddingProviders = (doctor?.embeddings.providers ?? []).map((provider) => (
376
+ describeEmbeddingProvider(provider, doctor?.embeddings.activeProviderId, includeParameters)
377
+ ));
378
+ const externalProviders = EXTERNAL_MEMORY_PROVIDERS.map((provider) => describeExternalProvider(provider, includeParameters));
379
+ return {
380
+ doctor,
381
+ vector,
382
+ providers: [...embeddingProviders, ...externalProviders],
383
+ };
384
+ }
385
+
386
+ function nextActions(
387
+ snapshot: ReturnType<typeof buildAgentWorkspaceRuntimeSnapshot>,
388
+ memoryStatusValue: MemoryPostureStatus,
389
+ vectorStatusValue: MemoryVectorPostureStatus,
390
+ doctor: MemoryDoctorReport | null,
391
+ ): readonly string[] {
392
+ const actions: string[] = [];
393
+ if (memoryStatusValue === 'empty') actions.push('Create one durable non-secret Agent memory only after the user asks to remember it.');
394
+ if (memoryStatusValue === 'needs-review') actions.push('Review or stale memory candidates before relying on them in the prompt.');
395
+ if (snapshot.localMemoryReviewQueueCount > 0) actions.push('Use learning_curator or memory review routes to clear the memory review queue.');
396
+ if (vectorStatusValue === 'attention') actions.push('Run memory vector doctor, then rebuild the vector index if the reported issue is fixed.');
397
+ if (doctor?.embeddings.warnings.length) actions.push('Inspect the active embedding provider warning before semantic recall or rebuild work.');
398
+ actions.push('Inspect memory action:"provider" for one external backend to see the exact SDK/daemon setup contracts Agent can consume before use.');
399
+ return actions.slice(0, 6);
400
+ }
401
+
402
+ function compactVector(vector: MemoryVectorStats | null): Record<string, unknown> {
403
+ if (!vector) {
404
+ return {
405
+ status: 'unavailable',
406
+ summary: 'Memory vector stats are not exposed in this runtime.',
407
+ modelRoute: 'memory action:"status"',
408
+ };
409
+ }
410
+ return {
411
+ status: vectorStatus(vector),
412
+ backend: vector.backend,
413
+ enabled: vector.enabled,
414
+ available: vector.available,
415
+ indexedRecords: vector.indexedRecords,
416
+ dimensions: vector.dimensions,
417
+ embeddingProviderId: vector.embeddingProviderId,
418
+ embeddingProviderLabel: vector.embeddingProviderLabel,
419
+ ...(vector.error ? { error: previewHarnessText(vector.error, 160) } : {}),
420
+ modelRoute: 'agent_harness mode:"workspace_action" actionId:"memory-vector-status"',
421
+ doctorRoute: 'agent_harness mode:"workspace_action" actionId:"memory-vector-doctor"',
422
+ rebuildRoute: 'agent_harness mode:"run_workspace_action" actionId:"memory-vector-rebuild" confirm:true explicitUserRequest:"..."',
423
+ };
424
+ }
425
+
426
+ export async function memoryPostureCatalogStatus(context: CommandContext): Promise<Record<string, unknown>> {
427
+ const snapshot = buildAgentWorkspaceRuntimeSnapshot(context);
428
+ const doctor = await readMemoryDoctor(context);
429
+ const vector = readVectorStats(context, doctor);
430
+ const status = memoryStatus(snapshot, Boolean(memoryApi(context)));
431
+ const vectorState = vectorStatus(vector);
432
+ return {
433
+ modes: ['memory_posture', 'memory_provider'],
434
+ modelRoute: 'memory action:"status"',
435
+ status,
436
+ localMemories: snapshot.localMemoryCount,
437
+ reviewQueue: snapshot.localMemoryReviewQueueCount,
438
+ promptActive: snapshot.localMemoryPromptActiveCount,
439
+ vector: vectorState,
440
+ embeddingProviders: doctor?.embeddings.providers.length ?? 0,
441
+ externalProviders: EXTERNAL_MEMORY_PROVIDERS.length,
442
+ externalProviderRecordsPublished: false,
443
+ externalProviderSetupGuideStatus: 'contract-needed',
444
+ };
445
+ }
446
+
447
+ export async function memoryPostureSummary(context: CommandContext, args: AgentHarnessMemoryPostureArgs): Promise<Record<string, unknown>> {
448
+ const includeParameters = args.includeParameters === true;
449
+ const limit = readLimit(args.limit, 100);
450
+ const query = readString(args.query).toLowerCase();
451
+ const snapshot = buildAgentWorkspaceRuntimeSnapshot(context);
452
+ const { doctor, vector, providers } = await buildProviderRecords(context, args);
453
+ const status = memoryStatus(snapshot, Boolean(memoryApi(context)));
454
+ const vectorState = vectorStatus(vector);
455
+ const filteredProviders = providers
456
+ .filter((provider) => !query || providerSearchText(provider).includes(query))
457
+ .slice(0, limit)
458
+ .map((provider) => compactProvider(provider, includeParameters));
459
+ return {
460
+ status,
461
+ localMemory: {
462
+ total: snapshot.localMemoryCount,
463
+ reviewQueue: snapshot.localMemoryReviewQueueCount,
464
+ promptActive: snapshot.localMemoryPromptActiveCount,
465
+ sessionMemory: snapshot.sessionMemoryCount,
466
+ policy: 'Only reviewed, high-confidence Agent-local memories are prompt-active. Fresh/stale/setup-blocked behavior stays visible for review.',
467
+ routes: {
468
+ list: 'memory action:"list"',
469
+ search: 'memory action:"search" query:"..."',
470
+ reviewQueue: 'memory action:"curator" query:"memory review"',
471
+ create: 'memory action:"create" summary:"..." explicitUserRequest:"..."',
472
+ curator: 'memory action:"curator"',
473
+ },
474
+ },
475
+ vector: compactVector(vector),
476
+ embeddings: {
477
+ activeProviderId: doctor?.embeddings.activeProviderId ?? vector?.embeddingProviderId ?? snapshot.embeddingProvider,
478
+ warnings: doctor?.embeddings.warnings.map((warning) => previewHarnessText(warning, includeParameters ? 180 : 96)) ?? [],
479
+ syncProviders: doctor?.embeddings.syncProviders ?? [],
480
+ asyncProviders: doctor?.embeddings.asyncProviders ?? [],
481
+ },
482
+ providers: filteredProviders,
483
+ returned: filteredProviders.length,
484
+ totalProviders: providers.length,
485
+ externalMemory: {
486
+ status: 'not-published',
487
+ providerRecordsPublished: false,
488
+ setupGuideStatus: 'contract-needed',
489
+ checkedProviders: EXTERNAL_MEMORY_PROVIDERS.map((provider) => provider.id),
490
+ requiredHostContracts: EXTERNAL_MEMORY_REQUIRED_CONTRACTS,
491
+ contractChecklist: externalProviderContractChecklist({ id: '<provider-id>', label: 'External memory provider' }),
492
+ receiptContract: externalProviderReceiptContract(),
493
+ nextRoutes: [
494
+ {
495
+ id: 'inspect-one-provider',
496
+ label: 'Inspect one provider contract',
497
+ modelRoute: 'memory action:"provider" providerId:"<id>" includeParameters:true',
498
+ effect: 'read-only',
499
+ why: 'Shows provider-specific missing SDK/daemon contracts, receipt requirements, credential policy, and next routes.',
500
+ },
501
+ {
502
+ id: 'inspect-host-memory-capability',
503
+ label: 'Inspect host memory capability',
504
+ modelRoute: 'host action:"capability" query:"memory provider"',
505
+ effect: 'read-only',
506
+ why: 'Checks whether the connected host exposes a provider-backed memory capability.',
507
+ },
508
+ ],
509
+ next: 'Use Agent-local memory now. Inspect one external provider for the required SDK/daemon setup/status/read/write/receipt contracts Agent can consume before provider use.',
510
+ inspectRoute: 'host action:"capability" query:"memory provider"',
511
+ providerLookup: 'memory action:"provider" providerId:"<id>" includeParameters:true',
512
+ },
513
+ nextActions: nextActions(snapshot, status, vectorState, doctor),
514
+ policy: 'Memory posture is read-only. Memory edits, vector rebuilds, and embedding-provider changes stay on existing confirmed Agent-local routes.',
515
+ ...(includeParameters ? {
516
+ checkedAt: doctor?.checkedAt ?? null,
517
+ providerLookup: 'memory action:"provider" providerId:"<id>"',
518
+ } : {}),
519
+ };
520
+ }
521
+
522
+ export async function describeMemoryProvider(context: CommandContext, args: AgentHarnessMemoryPostureArgs): Promise<MemoryProviderResolution> {
523
+ const input = readString(args.providerId) || readString(args.target) || readString(args.query);
524
+ if (!input) {
525
+ return {
526
+ status: 'missing_lookup',
527
+ usage: 'memory action:"provider" requires providerId, target, or query. Use memory action:"status" to inspect available provider ids.',
528
+ };
529
+ }
530
+ const includeParameters = args.includeParameters !== false;
531
+ const { providers } = await buildProviderRecords(context, { ...args, includeParameters });
532
+ const normalized = input.toLowerCase();
533
+ const exact = providers.find((provider) => provider.id === input || provider.id.toLowerCase() === normalized);
534
+ if (exact) return { status: 'found', provider: compactProvider(exact, true) };
535
+ const label = providers.find((provider) => provider.label.toLowerCase() === normalized);
536
+ if (label) return { status: 'found', provider: compactProvider(label, true) };
537
+ const matches = providers.filter((provider) => providerSearchText(provider).includes(normalized));
538
+ if (matches.length === 1) return { status: 'found', provider: compactProvider(matches[0]!, true) };
539
+ if (matches.length > 1) {
540
+ return {
541
+ status: 'ambiguous',
542
+ input,
543
+ candidates: matches.slice(0, 10).map((provider) => ({
544
+ providerId: provider.id,
545
+ label: provider.label,
546
+ kind: provider.kind,
547
+ status: provider.status,
548
+ modelRoute: provider.modelRoute,
549
+ })),
550
+ };
551
+ }
552
+ return {
553
+ status: 'missing_lookup',
554
+ usage: `Unknown memory provider ${input}. Use memory action:"status" to inspect available provider ids.`,
555
+ };
556
+ }