@pellux/goodvibes-agent 1.2.0 → 1.3.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 (77) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/dist/package/main.js +19016 -12684
  3. package/docs/README.md +3 -3
  4. package/docs/connected-host.md +2 -2
  5. package/docs/getting-started.md +11 -9
  6. package/docs/tools-and-commands.md +12 -10
  7. package/docs/voice-and-live-tts.md +2 -2
  8. package/package.json +1 -1
  9. package/release/release-notes.md +17 -5
  10. package/release/release-readiness.json +36 -36
  11. package/src/agent/competitive-feature-inventory.ts +42 -44
  12. package/src/agent/setup-wizard-artifact-receipts.ts +366 -0
  13. package/src/agent/setup-wizard.ts +245 -9
  14. package/src/input/agent-workspace-categories.ts +2 -2
  15. package/src/input/agent-workspace-onboarding-categories.ts +4 -4
  16. package/src/input/agent-workspace-settings.ts +52 -1
  17. package/src/input/agent-workspace-setup-snapshot.ts +20 -1
  18. package/src/input/agent-workspace-setup.ts +32 -5
  19. package/src/input/agent-workspace-snapshot.ts +23 -3
  20. package/src/input/agent-workspace.ts +5 -1
  21. package/src/input/setup-wizard-live-receipts.ts +76 -0
  22. package/src/renderer/agent-workspace-context-lines.ts +21 -6
  23. package/src/renderer/agent-workspace.ts +46 -10
  24. package/src/runtime/tool-permission-safety.ts +1 -1
  25. package/src/tools/agent-harness-agent-orchestration-policy.ts +75 -0
  26. package/src/tools/agent-harness-agent-orchestration.ts +216 -128
  27. package/src/tools/agent-harness-autonomy-live-records.ts +154 -0
  28. package/src/tools/agent-harness-autonomy-queue-types.ts +1 -1
  29. package/src/tools/agent-harness-autonomy-queue.ts +19 -8
  30. package/src/tools/agent-harness-autonomy-watcher-read-models.ts +509 -0
  31. package/src/tools/agent-harness-background-processes.ts +8 -4
  32. package/src/tools/agent-harness-browser-cockpit-route.ts +188 -34
  33. package/src/tools/agent-harness-browser-control.ts +12 -4
  34. package/src/tools/agent-harness-browser-pwa-read-models.ts +622 -0
  35. package/src/tools/agent-harness-device-live-read-models.ts +366 -0
  36. package/src/tools/agent-harness-execution-posture.ts +3 -0
  37. package/src/tools/agent-harness-interactive-runtime-records.ts +421 -0
  38. package/src/tools/agent-harness-local-model-benchmarks.ts +71 -1
  39. package/src/tools/agent-harness-local-model-endpoints.ts +469 -354
  40. package/src/tools/agent-harness-local-model-smoke.ts +277 -0
  41. package/src/tools/agent-harness-local-model-url.ts +78 -0
  42. package/src/tools/agent-harness-media-posture.ts +27 -12
  43. package/src/tools/agent-harness-memory-external-providers.ts +796 -0
  44. package/src/tools/agent-harness-memory-posture.ts +253 -137
  45. package/src/tools/agent-harness-memory-provider-certification.ts +219 -0
  46. package/src/tools/agent-harness-memory-refinement.ts +340 -0
  47. package/src/tools/agent-harness-mode-catalog.ts +4 -2
  48. package/src/tools/agent-harness-model-provider-health.ts +139 -42
  49. package/src/tools/agent-harness-model-readiness.ts +31 -5
  50. package/src/tools/agent-harness-model-routing-types.ts +61 -0
  51. package/src/tools/agent-harness-model-routing.ts +31 -6
  52. package/src/tools/agent-harness-pairing-posture.ts +30 -9
  53. package/src/tools/agent-harness-personal-ops-certification.ts +116 -0
  54. package/src/tools/agent-harness-personal-ops-lanes.ts +81 -15
  55. package/src/tools/agent-harness-personal-ops-operations.ts +225 -0
  56. package/src/tools/agent-harness-personal-ops-provider-records.ts +358 -0
  57. package/src/tools/agent-harness-personal-ops-provider-task-records.ts +321 -0
  58. package/src/tools/agent-harness-personal-ops-records.ts +176 -224
  59. package/src/tools/agent-harness-personal-ops-types.ts +19 -1
  60. package/src/tools/agent-harness-personal-ops.ts +18 -11
  61. package/src/tools/agent-harness-remote-read-models.ts +541 -0
  62. package/src/tools/agent-harness-research-briefing.ts +26 -7
  63. package/src/tools/agent-harness-research-live-read-models.ts +500 -0
  64. package/src/tools/agent-harness-research-runs.ts +15 -3
  65. package/src/tools/agent-harness-research-workflow.ts +92 -19
  66. package/src/tools/agent-harness-setup-model-helpers.ts +1 -0
  67. package/src/tools/agent-harness-setup-smoke.ts +26 -1
  68. package/src/tools/agent-harness-tool-schema.ts +23 -1
  69. package/src/tools/agent-harness-tool-types.ts +5 -0
  70. package/src/tools/agent-harness-tool.ts +9 -1
  71. package/src/tools/agent-harness-workspace-actions.ts +1 -1
  72. package/src/tools/agent-memory-tool.ts +40 -1
  73. package/src/tools/agent-model-compare-run.ts +13 -0
  74. package/src/tools/agent-research-runner.ts +367 -0
  75. package/src/tools/agent-research-tool.ts +7 -179
  76. package/src/tools/agent-route-planner-candidates-surfaces.ts +1 -1
  77. package/src/version.ts +1 -1
@@ -2,12 +2,11 @@ import type { MemoryDoctorReport, MemoryEmbeddingProviderStatus, MemoryVectorSta
2
2
  import type { CommandContext } from '../input/command-registry.ts';
3
3
  import { buildAgentWorkspaceRuntimeSnapshot } from '../input/agent-workspace-snapshot.ts';
4
4
  import { previewHarnessText } from './agent-harness-text.ts';
5
+ import { EXTERNAL_MEMORY_RECEIPT_FIELDS, EXTERNAL_MEMORY_REQUIRED_CONTRACTS, aggregateExternalProviderLiveRecord, aggregateExternalProviderSetupStatus, externalMemoryLiveProviderRecords, externalMemoryProviderCatalog, externalMemoryReceiptEvidence, externalProviderLiveReady, liveRecordForProvider, receiptEvidenceForProvider, setupStatusFromLiveRecord } from './agent-harness-memory-external-providers.ts';
6
+ import type { ExternalMemoryProviderCatalogEntry, MemoryExternalProviderContractCheck, MemoryExternalProviderContractStatus, MemoryExternalProviderLiveRecord, MemoryExternalProviderReceiptContract, MemoryExternalProviderReceiptEvidence, MemoryExternalProviderRoute, MemoryExternalProviderSetupGuide, MemoryExternalProviderStatus, MemoryPostureProvider, MemoryProviderResolution } from './agent-harness-memory-external-providers.ts';
5
7
 
6
8
  type MemoryPostureStatus = 'ready' | 'needs-review' | 'empty' | 'unavailable';
7
9
  type MemoryVectorPostureStatus = 'ready' | 'attention' | 'disabled' | 'unavailable';
8
- type MemoryExternalProviderStatus = 'not-published' | 'available';
9
- type MemoryExternalProviderSetupStatus = 'contract-needed' | 'ready';
10
-
11
10
  interface AgentHarnessMemoryPostureArgs {
12
11
  readonly providerId?: unknown;
13
12
  readonly target?: unknown;
@@ -16,98 +15,6 @@ interface AgentHarnessMemoryPostureArgs {
16
15
  readonly limit?: unknown;
17
16
  }
18
17
 
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
18
  function readString(value: unknown): string {
112
19
  return typeof value === 'string' ? value.trim() : '';
113
20
  }
@@ -181,8 +88,49 @@ function describeEmbeddingProvider(
181
88
  };
182
89
  }
183
90
 
184
- function externalProviderNextRoutes(provider: typeof EXTERNAL_MEMORY_PROVIDERS[number]): readonly MemoryExternalProviderRoute[] {
91
+ function externalProviderNextRoutes(
92
+ provider: ExternalMemoryProviderCatalogEntry,
93
+ liveRecord: MemoryExternalProviderLiveRecord | null = null,
94
+ ): readonly MemoryExternalProviderRoute[] {
95
+ const liveRoutes: MemoryExternalProviderRoute[] = [];
96
+ if (liveRecord?.readRoute) {
97
+ liveRoutes.push({
98
+ id: 'read-provider-memory',
99
+ label: 'Read provider memory',
100
+ modelRoute: liveRecord.readRoute,
101
+ effect: 'read-only',
102
+ why: 'Uses the daemon-published bounded read/search route with provider redaction and provenance policy.',
103
+ });
104
+ }
105
+ if (liveRecord?.writeRoute) {
106
+ liveRoutes.push({
107
+ id: 'write-provider-memory',
108
+ label: 'Write provider memory',
109
+ modelRoute: liveRecord.writeRoute,
110
+ effect: 'confirmed',
111
+ why: 'External memory writes require explicit user request, confirmation, and a durable provider receipt.',
112
+ });
113
+ }
114
+ if (liveRecord?.syncRoute) {
115
+ liveRoutes.push({
116
+ id: 'sync-provider-memory',
117
+ label: 'Sync provider memory',
118
+ modelRoute: liveRecord.syncRoute,
119
+ effect: 'confirmed',
120
+ why: 'Provider sync/import/export crosses a boundary and needs confirmation plus durable receipt evidence.',
121
+ });
122
+ }
123
+ if (liveRecord?.forgetRoute) {
124
+ liveRoutes.push({
125
+ id: 'forget-provider-memory',
126
+ label: 'Forget provider memory',
127
+ modelRoute: liveRecord.forgetRoute,
128
+ effect: 'confirmed',
129
+ why: 'Provider forget/delete/disable effects require explicit user request and durable receipt evidence.',
130
+ });
131
+ }
185
132
  return [
133
+ ...liveRoutes,
186
134
  {
187
135
  id: 'inspect-provider-contract',
188
136
  label: 'Inspect provider contract',
@@ -214,53 +162,90 @@ function externalProviderNextRoutes(provider: typeof EXTERNAL_MEMORY_PROVIDERS[n
214
162
  ];
215
163
  }
216
164
 
217
- function externalProviderContractChecklist(provider: typeof EXTERNAL_MEMORY_PROVIDERS[number]): readonly MemoryExternalProviderContractCheck[] {
165
+ function externalProviderContractChecklist(
166
+ provider: ExternalMemoryProviderCatalogEntry,
167
+ receipts: readonly MemoryExternalProviderReceiptEvidence[] = [],
168
+ liveRecord: MemoryExternalProviderLiveRecord | null = null,
169
+ ): readonly MemoryExternalProviderContractCheck[] {
218
170
  const providerQuery = `${provider.id} memory provider`;
171
+ const hasReceipts = receipts.length > 0;
172
+ const liveInspectRoute = liveRecord?.inspectRoute ?? `host action:"capability" query:"${providerQuery}"`;
173
+ const providerCertificationPublished: MemoryExternalProviderContractStatus = liveRecord?.certification?.schemaStatus === 'certified'
174
+ && liveRecord.certification.missingSignals.length === 0
175
+ ? 'published'
176
+ : 'missing';
177
+ const statusRecordStatus: MemoryExternalProviderContractStatus = liveRecord ? 'published' : 'missing';
178
+ const credentialStatus: MemoryExternalProviderContractStatus = liveRecord && (liveRecord.credentialState !== null || liveRecord.configured !== null) ? 'published' : 'missing';
179
+ const readStatus: MemoryExternalProviderContractStatus = liveRecord?.readReady === true || liveRecord?.readRoute ? 'published' : 'missing';
180
+ const writeStatus: MemoryExternalProviderContractStatus = liveRecord?.writeReady === true || liveRecord?.writeRoute ? 'published' : 'missing';
181
+ const forgetStatus: MemoryExternalProviderContractStatus = liveRecord && (liveRecord.forgetReady !== null || liveRecord.forgetRoute) ? 'published' : 'missing';
182
+ const syncStatus: MemoryExternalProviderContractStatus = liveRecord?.syncReady === true || liveRecord?.syncRoute || liveRecord?.receiptRoute || liveRecord?.receiptIds.length
183
+ ? 'published'
184
+ : hasReceipts ? 'artifact-evidence-found' : 'missing';
185
+ const promptPolicyStatus: MemoryExternalProviderContractStatus = liveRecord && liveRecord.promptEligible !== null ? 'published' : 'missing';
219
186
  return [
187
+ {
188
+ id: 'certified-provider-contract',
189
+ label: 'Certified provider schema/publication evidence',
190
+ status: providerCertificationPublished,
191
+ requiredFor: 'Treat provider readiness as release-grade instead of a legacy host hint.',
192
+ owner: 'goodvibes-sdk-or-daemon',
193
+ inspectRoute: liveInspectRoute,
194
+ },
220
195
  {
221
196
  id: 'status-record',
222
197
  label: 'Provider status/readiness record',
223
- status: 'missing',
198
+ status: statusRecordStatus,
224
199
  requiredFor: 'Show whether the provider is configured, reachable, and safe to use.',
225
200
  owner: 'goodvibes-sdk-or-daemon',
226
- inspectRoute: `host action:"capability" query:"${providerQuery}"`,
201
+ inspectRoute: liveInspectRoute,
227
202
  },
228
203
  {
229
204
  id: 'credential-reference',
230
205
  label: 'Credential reference without raw secret values',
231
- status: 'missing',
206
+ status: credentialStatus,
232
207
  requiredFor: 'Let the user repair auth without exposing API keys or memory payloads.',
233
208
  owner: 'goodvibes-sdk-or-daemon',
234
- inspectRoute: 'settings action:"list" query:"memory" includeHidden:true',
209
+ inspectRoute: liveRecord?.setupRoute ?? 'settings action:"list" query:"memory" includeHidden:true',
235
210
  },
236
211
  {
237
212
  id: 'bounded-read-search',
238
213
  label: 'Bounded read/search route',
239
- status: 'missing',
214
+ status: readStatus,
240
215
  requiredFor: 'Review external memories with redaction, provenance, and source limits before prompt use.',
241
216
  owner: 'goodvibes-sdk-or-daemon',
242
- inspectRoute: `agent_harness mode:"mcp_servers" query:"${provider.id}"`,
217
+ inspectRoute: liveRecord?.readRoute ?? `agent_harness mode:"mcp_servers" query:"${provider.id}"`,
243
218
  },
244
219
  {
245
220
  id: 'confirmed-write-upsert',
246
221
  label: 'Confirmed write/upsert/import route',
247
- status: 'missing',
222
+ status: writeStatus,
248
223
  requiredFor: 'Write external memories only after explicit user request and confirmation.',
249
224
  owner: 'goodvibes-sdk-or-daemon',
250
- inspectRoute: `host action:"capability" query:"${providerQuery}"`,
225
+ inspectRoute: liveRecord?.writeRoute ?? `host action:"capability" query:"${providerQuery}"`,
226
+ },
227
+ {
228
+ id: 'forget-contract',
229
+ label: 'Forget/delete or explicit not-supported contract',
230
+ status: forgetStatus,
231
+ requiredFor: 'Prove provider memory can be removed or that removal is explicitly unsupported before the provider is relied on.',
232
+ owner: 'goodvibes-sdk-or-daemon',
233
+ inspectRoute: liveRecord?.forgetRoute ?? liveInspectRoute,
251
234
  },
252
235
  {
253
236
  id: 'sync-receipts',
254
237
  label: 'Sync/import/export receipts',
255
- status: 'missing',
238
+ status: syncStatus,
256
239
  requiredFor: 'Prove what crossed the provider boundary, when it happened, and what failed.',
257
240
  owner: 'goodvibes-sdk-or-daemon',
258
- inspectRoute: `memory action:"provider" providerId:"${provider.id}" includeParameters:true`,
241
+ inspectRoute: liveRecord?.receiptRoute ?? liveRecord?.syncRoute ?? (hasReceipts
242
+ ? receipts[0]!.inspectRoute
243
+ : `memory action:"provider" providerId:"${provider.id}" includeParameters:true`),
259
244
  },
260
245
  {
261
246
  id: 'prompt-eligibility-policy',
262
247
  label: 'Prompt eligibility policy',
263
- status: 'missing',
248
+ status: promptPolicyStatus,
264
249
  requiredFor: 'Prevent external provider records from silently entering the Agent prompt.',
265
250
  owner: 'goodvibes-sdk-or-daemon',
266
251
  inspectRoute: 'context action:"prompt" includeParameters:true',
@@ -268,30 +253,77 @@ function externalProviderContractChecklist(provider: typeof EXTERNAL_MEMORY_PROV
268
253
  ];
269
254
  }
270
255
 
271
- function externalProviderReceiptContract(providerId = '<provider-id>'): MemoryExternalProviderReceiptContract {
256
+ function externalProviderReceiptContract(
257
+ providerId = '<provider-id>',
258
+ receipts: readonly MemoryExternalProviderReceiptEvidence[] = [],
259
+ liveRecord: MemoryExternalProviderLiveRecord | null = null,
260
+ ): MemoryExternalProviderReceiptContract {
261
+ const liveReceiptsPublished = Boolean(liveRecord && (liveRecord.receiptIds.length > 0 || liveRecord.receiptRoute || liveRecord.syncReady === true || liveRecord.syncRoute));
262
+ const liveReceiptCertified = liveRecord?.certification?.schemaStatus === 'certified' && liveRecord.certification.missingSignals.length === 0;
263
+ const artifactReceiptCertified = receipts.some((receipt) => receipt.certification?.schemaStatus === 'certified' && receipt.certification.missingSignals.length === 0);
272
264
  return {
273
- status: 'missing',
265
+ status: liveReceiptsPublished && liveReceiptCertified ? 'published' : receipts.length > 0 && artifactReceiptCertified ? 'artifact-evidence-found' : 'missing',
274
266
  appliesTo: ['status', 'read', 'write', 'upsert', 'import', 'export', 'sync', 'forget'],
275
267
  requiredFields: EXTERNAL_MEMORY_RECEIPT_FIELDS,
276
268
  nextWhenPublished: `memory action:"provider" providerId:"${providerId}" includeParameters:true should expose latest receipts and exact follow-up routes.`,
277
269
  };
278
270
  }
279
271
 
280
- function externalProviderSetupGuide(provider: typeof EXTERNAL_MEMORY_PROVIDERS[number]): MemoryExternalProviderSetupGuide {
272
+ function externalProviderSetupGuide(
273
+ provider: ExternalMemoryProviderCatalogEntry,
274
+ receipts: readonly MemoryExternalProviderReceiptEvidence[] = [],
275
+ liveRecord: MemoryExternalProviderLiveRecord | null = null,
276
+ ): MemoryExternalProviderSetupGuide {
277
+ const latestReceipt = receipts[0] ?? null;
278
+ const liveSetupStatus = setupStatusFromLiveRecord(liveRecord);
279
+ const readiness = liveRecord
280
+ ? [
281
+ `status ${liveRecord.status}`,
282
+ liveRecord.configured === null ? '' : `configured ${liveRecord.configured}`,
283
+ liveRecord.reachable === null ? '' : `reachable ${liveRecord.reachable}`,
284
+ liveRecord.readReady === null ? '' : `read ${liveRecord.readReady}`,
285
+ liveRecord.writeReady === null ? '' : `write ${liveRecord.writeReady}`,
286
+ liveRecord.syncReady === null ? '' : `sync ${liveRecord.syncReady}`,
287
+ liveRecord.forgetReady === null ? '' : `forget ${liveRecord.forgetReady}`,
288
+ liveRecord.promptEligible === null ? '' : `promptEligible ${liveRecord.promptEligible}`,
289
+ ].filter(Boolean).join(', ')
290
+ : '';
291
+ const liveInspectRoutes = liveRecord
292
+ ? [
293
+ liveRecord.inspectRoute,
294
+ liveRecord.readRoute,
295
+ liveRecord.writeRoute,
296
+ liveRecord.syncRoute,
297
+ liveRecord.forgetRoute,
298
+ liveRecord.receiptRoute,
299
+ ].filter((route): route is string => Boolean(route))
300
+ : [];
281
301
  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: [
302
+ status: liveSetupStatus ?? (latestReceipt ? 'receipt-evidence-found' : 'contract-needed'),
303
+ userOutcome: liveRecord
304
+ ? `Use ${provider.label} as an external memory backend through the daemon-published read model, with bounded reads visible before prompt use and every write/sync/forget route treated as confirmed external provider effect.`
305
+ : `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.`,
306
+ currentState: liveRecord
307
+ ? `Live ${provider.label} provider record from ${liveRecord.source} reports ${readiness || liveRecord.status}.${latestReceipt ? ` Latest durable receipt artifact ${latestReceipt.artifactId} reports ${latestReceipt.operation} ${latestReceipt.status}.` : ''}`
308
+ : latestReceipt
309
+ ? `Latest durable ${provider.label} receipt artifact ${latestReceipt.artifactId} reports ${latestReceipt.operation} ${latestReceipt.status}; live provider status/read/write records are still not published by the current SDK/daemon contract.`
310
+ : `No concrete ${provider.label} provider record is published by the current SDK/daemon contract.`,
311
+ safeFirstStep: liveRecord
312
+ ? `Inspect the live ${provider.label} record and use only the published bounded read route until the user explicitly confirms any write, sync, import/export, forget/delete, or prompt-eligibility change.`
313
+ : latestReceipt
314
+ ? `Review ${latestReceipt.artifactId}, then keep Agent-local memory as the active prompt path until a ready provider record and prompt-eligibility policy exist.`
315
+ : `Inspect connected-host and MCP setup for ${provider.label}; keep Agent-local memory as the active path until a ready provider record exists.`,
316
+ inspectRoutes: [...new Set([
287
317
  `memory action:"provider" providerId:"${provider.id}" includeParameters:true`,
318
+ ...liveInspectRoutes,
288
319
  `host action:"capability" query:"${provider.id} memory provider"`,
289
320
  `agent_harness mode:"mcp_servers" query:"${provider.id}"`,
290
321
  'settings action:"list" query:"memory" includeHidden:true',
291
- ],
292
- nextRoutes: externalProviderNextRoutes(provider),
293
- contractChecklist: externalProviderContractChecklist(provider),
294
- receiptContract: externalProviderReceiptContract(provider.id),
322
+ ])],
323
+ nextRoutes: externalProviderNextRoutes(provider, liveRecord),
324
+ contractChecklist: externalProviderContractChecklist(provider, receipts, liveRecord),
325
+ receiptContract: externalProviderReceiptContract(provider.id, receipts, liveRecord),
326
+ ...(latestReceipt ? { latestReceipt, receiptHistory: receipts.slice(0, 5) } : {}),
295
327
  requiredHostContracts: EXTERNAL_MEMORY_REQUIRED_CONTRACTS,
296
328
  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
329
  confirmationPolicy: 'External memory writes, sync, import, export, forget/delete, and prompt-eligibility changes require explicit user request, confirmation, and durable receipts.',
@@ -299,20 +331,33 @@ function externalProviderSetupGuide(provider: typeof EXTERNAL_MEMORY_PROVIDERS[n
299
331
  }
300
332
 
301
333
  function describeExternalProvider(
302
- provider: typeof EXTERNAL_MEMORY_PROVIDERS[number],
334
+ provider: ExternalMemoryProviderCatalogEntry,
303
335
  includeParameters: boolean,
336
+ receipts: readonly MemoryExternalProviderReceiptEvidence[] = [],
337
+ liveRecord: MemoryExternalProviderLiveRecord | null = null,
304
338
  ): MemoryPostureProvider {
305
- const status: MemoryExternalProviderStatus = 'not-published';
339
+ const latestReceipt = receipts[0] ?? null;
340
+ const status: MemoryExternalProviderStatus = liveRecord?.status ?? (latestReceipt ? 'receipt-evidence-found' : 'not-published');
341
+ const liveSummary = liveRecord
342
+ ? `Live external memory provider record from ${liveRecord.source} reports ${liveRecord.status}; configured ${liveRecord.configured ?? 'unknown'}, read ${liveRecord.readReady ?? 'unknown'}, write ${liveRecord.writeReady ?? 'unknown'}, sync ${liveRecord.syncReady ?? 'unknown'}.`
343
+ : '';
306
344
  return {
307
345
  id: provider.id,
308
346
  label: provider.label,
309
347
  kind: 'external-memory',
310
348
  status,
311
- summary: previewHarnessText('External memory backend records are not published by the current GoodVibes SDK/daemon contract.', includeParameters ? 180 : 96),
349
+ summary: previewHarnessText(liveRecord
350
+ ? liveSummary
351
+ : latestReceipt
352
+ ? `Durable external memory receipt ${latestReceipt.artifactId} reports ${latestReceipt.operation} ${latestReceipt.status}; live provider records are still not published.`
353
+ : 'External memory backend records are not published by the current GoodVibes SDK/daemon contract.', includeParameters ? 180 : 96),
312
354
  modelRoute: `memory action:"provider" providerId:"${provider.id}"`,
313
355
  setupRoute: 'host action:"capability" query:"memory provider"',
314
- configured: false,
315
- ...(includeParameters ? { setupGuide: externalProviderSetupGuide(provider) } : {}),
356
+ configured: liveRecord?.configured ?? (liveRecord ? externalProviderLiveReady(liveRecord) : latestReceipt ? latestReceipt.status === 'succeeded' : false),
357
+ ...(includeParameters && liveRecord ? { liveRecord } : {}),
358
+ ...(latestReceipt ? { latestReceipt } : {}),
359
+ ...(includeParameters && receipts.length > 0 ? { receiptEvidence: receipts.slice(0, 5) } : {}),
360
+ ...(includeParameters ? { setupGuide: externalProviderSetupGuide(provider, receipts, liveRecord) } : {}),
316
361
  };
317
362
  }
318
363
 
@@ -325,6 +370,41 @@ function providerSearchText(provider: MemoryPostureProvider): string {
325
370
  provider.summary,
326
371
  provider.modelRoute,
327
372
  provider.setupRoute ?? '',
373
+ provider.liveRecord ? [
374
+ provider.liveRecord.providerId,
375
+ provider.liveRecord.label ?? '',
376
+ provider.liveRecord.status,
377
+ provider.liveRecord.source,
378
+ provider.liveRecord.credentialState ?? '',
379
+ provider.liveRecord.readRoute ?? '',
380
+ provider.liveRecord.writeRoute ?? '',
381
+ provider.liveRecord.syncRoute ?? '',
382
+ provider.liveRecord.receiptIds.join('\n'),
383
+ provider.liveRecord.certification ? [
384
+ provider.liveRecord.certification.schemaStatus,
385
+ provider.liveRecord.certification.schemaVersion ?? '',
386
+ provider.liveRecord.certification.publicationGuarantee ?? '',
387
+ provider.liveRecord.certification.publisher ?? '',
388
+ provider.liveRecord.certification.provenance?.join('\n') ?? '',
389
+ provider.liveRecord.certification.receiptIds?.join('\n') ?? '',
390
+ provider.liveRecord.certification.missingSignals.join('\n'),
391
+ ].join('\n') : '',
392
+ ].join('\n') : '',
393
+ provider.latestReceipt ? [
394
+ provider.latestReceipt.artifactId,
395
+ provider.latestReceipt.operation,
396
+ provider.latestReceipt.status,
397
+ provider.latestReceipt.nextRoute,
398
+ provider.latestReceipt.certification ? [
399
+ provider.latestReceipt.certification.schemaStatus,
400
+ provider.latestReceipt.certification.schemaVersion ?? '',
401
+ provider.latestReceipt.certification.publicationGuarantee ?? '',
402
+ provider.latestReceipt.certification.publisher ?? '',
403
+ provider.latestReceipt.certification.provenance?.join('\n') ?? '',
404
+ provider.latestReceipt.certification.receiptIds?.join('\n') ?? '',
405
+ provider.latestReceipt.certification.missingSignals.join('\n'),
406
+ ].join('\n') : '',
407
+ ].join('\n') : '',
328
408
  provider.setupGuide ? [
329
409
  provider.setupGuide.status,
330
410
  provider.setupGuide.userOutcome,
@@ -336,6 +416,11 @@ function providerSearchText(provider: MemoryPostureProvider): string {
336
416
  provider.setupGuide.receiptContract.appliesTo.join('\n'),
337
417
  provider.setupGuide.receiptContract.requiredFields.join('\n'),
338
418
  provider.setupGuide.receiptContract.nextWhenPublished,
419
+ provider.setupGuide.latestReceipt ? [
420
+ provider.setupGuide.latestReceipt.artifactId,
421
+ provider.setupGuide.latestReceipt.operation,
422
+ provider.setupGuide.latestReceipt.status,
423
+ ].join('\n') : '',
339
424
  provider.setupGuide.requiredHostContracts.join('\n'),
340
425
  provider.setupGuide.credentialPolicy,
341
426
  provider.setupGuide.confirmationPolicy,
@@ -357,6 +442,9 @@ function compactProvider(provider: MemoryPostureProvider, includeParameters: boo
357
442
  ...(includeParameters && typeof provider.dimensions === 'number' ? { dimensions: provider.dimensions } : {}),
358
443
  ...(includeParameters && typeof provider.deterministic === 'boolean' ? { deterministic: provider.deterministic } : {}),
359
444
  ...(includeParameters && provider.metadata ? { metadata: provider.metadata } : {}),
445
+ ...(includeParameters && provider.liveRecord ? { liveRecord: provider.liveRecord } : {}),
446
+ ...(provider.latestReceipt ? { latestReceipt: provider.latestReceipt } : {}),
447
+ ...(includeParameters && provider.receiptEvidence ? { receiptEvidence: provider.receiptEvidence } : {}),
360
448
  ...(includeParameters && provider.setupGuide ? { setupGuide: provider.setupGuide } : {}),
361
449
  };
362
450
  }
@@ -368,18 +456,31 @@ async function buildProviderRecords(
368
456
  readonly doctor: MemoryDoctorReport | null;
369
457
  readonly vector: MemoryVectorStats | null;
370
458
  readonly providers: readonly MemoryPostureProvider[];
459
+ readonly receiptEvidence: readonly MemoryExternalProviderReceiptEvidence[];
460
+ readonly liveRecords: readonly MemoryExternalProviderLiveRecord[];
371
461
  }> {
372
462
  const includeParameters = args.includeParameters === true;
373
463
  const doctor = await readMemoryDoctor(context);
374
464
  const vector = readVectorStats(context, doctor);
465
+ const receiptEvidence = externalMemoryReceiptEvidence(context);
466
+ const liveRecords = await externalMemoryLiveProviderRecords(context);
375
467
  const embeddingProviders = (doctor?.embeddings.providers ?? []).map((provider) => (
376
468
  describeEmbeddingProvider(provider, doctor?.embeddings.activeProviderId, includeParameters)
377
469
  ));
378
- const externalProviders = EXTERNAL_MEMORY_PROVIDERS.map((provider) => describeExternalProvider(provider, includeParameters));
470
+ const externalProviders = externalMemoryProviderCatalog(liveRecords, receiptEvidence).map((provider) => (
471
+ describeExternalProvider(
472
+ provider,
473
+ includeParameters,
474
+ receiptEvidenceForProvider(receiptEvidence, provider.id),
475
+ liveRecordForProvider(liveRecords, provider.id),
476
+ )
477
+ ));
379
478
  return {
380
479
  doctor,
381
480
  vector,
382
481
  providers: [...embeddingProviders, ...externalProviders],
482
+ receiptEvidence,
483
+ liveRecords,
383
484
  };
384
485
  }
385
486
 
@@ -427,6 +528,8 @@ export async function memoryPostureCatalogStatus(context: CommandContext): Promi
427
528
  const snapshot = buildAgentWorkspaceRuntimeSnapshot(context);
428
529
  const doctor = await readMemoryDoctor(context);
429
530
  const vector = readVectorStats(context, doctor);
531
+ const receiptEvidence = externalMemoryReceiptEvidence(context);
532
+ const liveRecords = await externalMemoryLiveProviderRecords(context);
430
533
  const status = memoryStatus(snapshot, Boolean(memoryApi(context)));
431
534
  const vectorState = vectorStatus(vector);
432
535
  return {
@@ -438,9 +541,12 @@ export async function memoryPostureCatalogStatus(context: CommandContext): Promi
438
541
  promptActive: snapshot.localMemoryPromptActiveCount,
439
542
  vector: vectorState,
440
543
  embeddingProviders: doctor?.embeddings.providers.length ?? 0,
441
- externalProviders: EXTERNAL_MEMORY_PROVIDERS.length,
442
- externalProviderRecordsPublished: false,
443
- externalProviderSetupGuideStatus: 'contract-needed',
544
+ externalProviders: externalMemoryProviderCatalog(liveRecords, receiptEvidence).length,
545
+ externalProviderRecordsPublished: liveRecords.length > 0,
546
+ externalProviderLiveRecordCount: liveRecords.length,
547
+ externalProviderReceiptEvidenceFound: receiptEvidence.length > 0,
548
+ externalProviderReceiptEvidenceCount: receiptEvidence.length,
549
+ externalProviderSetupGuideStatus: aggregateExternalProviderSetupStatus(liveRecords, receiptEvidence),
444
550
  };
445
551
  }
446
552
 
@@ -449,9 +555,10 @@ export async function memoryPostureSummary(context: CommandContext, args: AgentH
449
555
  const limit = readLimit(args.limit, 100);
450
556
  const query = readString(args.query).toLowerCase();
451
557
  const snapshot = buildAgentWorkspaceRuntimeSnapshot(context);
452
- const { doctor, vector, providers } = await buildProviderRecords(context, args);
558
+ const { doctor, vector, providers, receiptEvidence, liveRecords } = await buildProviderRecords(context, args);
453
559
  const status = memoryStatus(snapshot, Boolean(memoryApi(context)));
454
560
  const vectorState = vectorStatus(vector);
561
+ const aggregateLiveRecord = aggregateExternalProviderLiveRecord(liveRecords);
455
562
  const filteredProviders = providers
456
563
  .filter((provider) => !query || providerSearchText(provider).includes(query))
457
564
  .slice(0, limit)
@@ -483,13 +590,18 @@ export async function memoryPostureSummary(context: CommandContext, args: AgentH
483
590
  returned: filteredProviders.length,
484
591
  totalProviders: providers.length,
485
592
  externalMemory: {
486
- status: 'not-published',
487
- providerRecordsPublished: false,
488
- setupGuideStatus: 'contract-needed',
489
- checkedProviders: EXTERNAL_MEMORY_PROVIDERS.map((provider) => provider.id),
593
+ status: aggregateLiveRecord?.status ?? (receiptEvidence.length > 0 ? 'receipt-evidence-found' : 'not-published'),
594
+ providerRecordsPublished: liveRecords.length > 0,
595
+ liveProviderRecordCount: liveRecords.length,
596
+ latestLiveProviderRecords: liveRecords.slice(0, 5),
597
+ receiptEvidenceFound: receiptEvidence.length > 0,
598
+ receiptEvidenceCount: receiptEvidence.length,
599
+ latestReceipts: receiptEvidence.slice(0, 5),
600
+ setupGuideStatus: aggregateExternalProviderSetupStatus(liveRecords, receiptEvidence),
601
+ checkedProviders: externalMemoryProviderCatalog(liveRecords, receiptEvidence).map((provider) => provider.id),
490
602
  requiredHostContracts: EXTERNAL_MEMORY_REQUIRED_CONTRACTS,
491
- contractChecklist: externalProviderContractChecklist({ id: '<provider-id>', label: 'External memory provider' }),
492
- receiptContract: externalProviderReceiptContract(),
603
+ contractChecklist: externalProviderContractChecklist({ id: '<provider-id>', label: 'External memory provider' }, receiptEvidence, aggregateLiveRecord),
604
+ receiptContract: externalProviderReceiptContract('<provider-id>', receiptEvidence, aggregateLiveRecord),
493
605
  nextRoutes: [
494
606
  {
495
607
  id: 'inspect-one-provider',
@@ -506,7 +618,11 @@ export async function memoryPostureSummary(context: CommandContext, args: AgentH
506
618
  why: 'Checks whether the connected host exposes a provider-backed memory capability.',
507
619
  },
508
620
  ],
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.',
621
+ next: liveRecords.length > 0
622
+ ? 'Inspect the matching live provider record before any provider read; keep write, sync, import/export, forget/delete, and prompt-eligibility changes on confirmed routes with durable receipts.'
623
+ : receiptEvidence.length > 0
624
+ ? 'Review the latest external-memory receipt artifact, then keep Agent-local memory as the active prompt path until live provider status/read/write records are published.'
625
+ : '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
626
  inspectRoute: 'host action:"capability" query:"memory provider"',
511
627
  providerLookup: 'memory action:"provider" providerId:"<id>" includeParameters:true',
512
628
  },