@pellux/goodvibes-agent 1.2.0 → 1.4.1
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.
- package/CHANGELOG.md +194 -0
- package/dist/package/{ast-grep-napi.linux-x64-gnu-swtppvy9.node → ast-grep-napi.linux-x64-gnu-mkk8xwww.node} +0 -0
- package/dist/package/{ast-grep-napi.linux-x64-musl-ttfcdtap.node → ast-grep-napi.linux-x64-musl-ryqtgdv6.node} +0 -0
- package/dist/package/main.js +65740 -57156
- package/docs/README.md +3 -3
- package/docs/connected-host.md +2 -2
- package/docs/getting-started.md +11 -9
- package/docs/tools-and-commands.md +12 -10
- package/docs/voice-and-live-tts.md +2 -2
- package/package.json +1 -1
- package/release/release-notes.md +15 -144
- package/release/release-readiness.json +36 -36
- package/src/agent/competitive-feature-inventory.ts +42 -44
- package/src/agent/setup-wizard-artifact-receipts.ts +366 -0
- package/src/agent/setup-wizard.ts +267 -24
- package/src/cli/tui-startup.ts +2 -2
- package/src/input/agent-workspace-activation.ts +2 -2
- package/src/input/agent-workspace-categories.ts +2 -2
- package/src/input/agent-workspace-onboarding-categories.ts +4 -4
- package/src/input/agent-workspace-onboarding-finish.ts +21 -0
- package/src/input/agent-workspace-settings.ts +47 -1
- package/src/input/agent-workspace-setup-snapshot.ts +17 -6
- package/src/input/agent-workspace-setup.ts +20 -26
- package/src/input/agent-workspace-snapshot.ts +16 -3
- package/src/input/agent-workspace-types.ts +5 -2
- package/src/input/agent-workspace.ts +21 -6
- package/src/input/handler.ts +67 -5
- package/src/input/setup-wizard-live-receipts.ts +76 -0
- package/src/renderer/agent-workspace-context-lines.ts +17 -33
- package/src/renderer/agent-workspace.ts +434 -21
- package/src/runtime/tool-permission-safety.ts +1 -1
- package/src/tools/agent-harness-agent-orchestration-policy.ts +75 -0
- package/src/tools/agent-harness-agent-orchestration.ts +216 -128
- package/src/tools/agent-harness-autonomy-live-records.ts +154 -0
- package/src/tools/agent-harness-autonomy-queue-types.ts +1 -1
- package/src/tools/agent-harness-autonomy-queue.ts +19 -8
- package/src/tools/agent-harness-autonomy-watcher-read-models.ts +509 -0
- package/src/tools/agent-harness-background-processes.ts +8 -4
- package/src/tools/agent-harness-browser-cockpit-route.ts +188 -34
- package/src/tools/agent-harness-browser-control.ts +12 -4
- package/src/tools/agent-harness-browser-pwa-read-models.ts +622 -0
- package/src/tools/agent-harness-device-live-read-models.ts +366 -0
- package/src/tools/agent-harness-execution-posture.ts +3 -0
- package/src/tools/agent-harness-interactive-runtime-records.ts +421 -0
- package/src/tools/agent-harness-local-model-benchmarks.ts +71 -1
- package/src/tools/agent-harness-local-model-endpoints.ts +469 -354
- package/src/tools/agent-harness-local-model-smoke.ts +277 -0
- package/src/tools/agent-harness-local-model-url.ts +78 -0
- package/src/tools/agent-harness-media-posture.ts +27 -12
- package/src/tools/agent-harness-memory-external-providers.ts +796 -0
- package/src/tools/agent-harness-memory-posture.ts +253 -137
- package/src/tools/agent-harness-memory-provider-certification.ts +219 -0
- package/src/tools/agent-harness-memory-refinement.ts +340 -0
- package/src/tools/agent-harness-mode-catalog.ts +4 -2
- package/src/tools/agent-harness-model-provider-health.ts +139 -42
- package/src/tools/agent-harness-model-readiness.ts +31 -5
- package/src/tools/agent-harness-model-routing-types.ts +61 -0
- package/src/tools/agent-harness-model-routing.ts +31 -6
- package/src/tools/agent-harness-pairing-posture.ts +30 -9
- package/src/tools/agent-harness-personal-ops-certification.ts +116 -0
- package/src/tools/agent-harness-personal-ops-lanes.ts +81 -15
- package/src/tools/agent-harness-personal-ops-operations.ts +225 -0
- package/src/tools/agent-harness-personal-ops-provider-records.ts +358 -0
- package/src/tools/agent-harness-personal-ops-provider-task-records.ts +321 -0
- package/src/tools/agent-harness-personal-ops-records.ts +176 -224
- package/src/tools/agent-harness-personal-ops-types.ts +19 -1
- package/src/tools/agent-harness-personal-ops.ts +18 -11
- package/src/tools/agent-harness-remote-read-models.ts +541 -0
- package/src/tools/agent-harness-research-briefing.ts +26 -7
- package/src/tools/agent-harness-research-live-read-models.ts +500 -0
- package/src/tools/agent-harness-research-runs.ts +15 -3
- package/src/tools/agent-harness-research-workflow.ts +92 -19
- package/src/tools/agent-harness-setup-model-helpers.ts +1 -0
- package/src/tools/agent-harness-setup-posture.ts +7 -7
- package/src/tools/agent-harness-setup-smoke.ts +26 -1
- package/src/tools/agent-harness-tool-schema.ts +23 -1
- package/src/tools/agent-harness-tool-types.ts +5 -0
- package/src/tools/agent-harness-tool.ts +9 -1
- package/src/tools/agent-harness-workspace-actions.ts +1 -1
- package/src/tools/agent-memory-tool.ts +40 -1
- package/src/tools/agent-model-compare-run.ts +13 -0
- package/src/tools/agent-research-runner.ts +367 -0
- package/src/tools/agent-research-tool.ts +7 -179
- package/src/tools/agent-route-planner-candidates-surfaces.ts +1 -1
- 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(
|
|
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(
|
|
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:
|
|
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:
|
|
201
|
+
inspectRoute: liveInspectRoute,
|
|
227
202
|
},
|
|
228
203
|
{
|
|
229
204
|
id: 'credential-reference',
|
|
230
205
|
label: 'Credential reference without raw secret values',
|
|
231
|
-
status:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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(
|
|
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:
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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:
|
|
334
|
+
provider: ExternalMemoryProviderCatalogEntry,
|
|
303
335
|
includeParameters: boolean,
|
|
336
|
+
receipts: readonly MemoryExternalProviderReceiptEvidence[] = [],
|
|
337
|
+
liveRecord: MemoryExternalProviderLiveRecord | null = null,
|
|
304
338
|
): MemoryPostureProvider {
|
|
305
|
-
const
|
|
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(
|
|
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 ? {
|
|
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 =
|
|
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:
|
|
442
|
-
externalProviderRecordsPublished:
|
|
443
|
-
|
|
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:
|
|
488
|
-
|
|
489
|
-
|
|
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:
|
|
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
|
},
|