@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
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import type { CommandContext } from '../input/command-registry.ts';
|
|
2
2
|
import { resolveRuntimeEndpointBinding } from '../cli/endpoints.ts';
|
|
3
3
|
import { AGENT_WORKSPACE_CATEGORIES } from '../input/agent-workspace-categories.ts';
|
|
4
|
+
import type { AgentSetupWizardDurableReceipt } from '../agent/setup-wizard.ts';
|
|
5
|
+
import { buildSetupWizardDurableReceipts } from '../agent/setup-wizard-artifact-receipts.ts';
|
|
6
|
+
import { mergeSetupWizardDurableReceipts, setupWizardLiveDurableReceipts } from '../input/setup-wizard-live-receipts.ts';
|
|
4
7
|
import { readOnboardingCompletionMarker } from '../runtime/onboarding/index.ts';
|
|
8
|
+
import {
|
|
9
|
+
browserPwaReadModelSnapshot,
|
|
10
|
+
certifiedBrowserPwaCategoryRouteForCategory,
|
|
11
|
+
certifiedBrowserPwaFirstRunReceipts,
|
|
12
|
+
isCertifiedBrowserPwaCategoryRoute,
|
|
13
|
+
type BrowserPwaCategoryRouteRecord,
|
|
14
|
+
type BrowserPwaReadModelSnapshot,
|
|
15
|
+
} from './agent-harness-browser-pwa-read-models.ts';
|
|
5
16
|
|
|
6
17
|
function browserConnectHost(host: string): string {
|
|
7
18
|
if (host === '0.0.0.0' || host === '::') return '127.0.0.1';
|
|
@@ -58,27 +69,97 @@ function confirmedCategoryRoute(categoryId: string, label: string): string {
|
|
|
58
69
|
return `agent_harness mode:"open_ui_surface" surfaceId:"agent-workspace" categoryId:"${categoryId}" confirm:true explicitUserRequest:"Open the ${label} workspace."`;
|
|
59
70
|
}
|
|
60
71
|
|
|
61
|
-
function
|
|
62
|
-
const
|
|
72
|
+
function browserPwaSetupReceipts(context: CommandContext): readonly AgentSetupWizardDurableReceipt[] {
|
|
73
|
+
const artifactReceipts = (() => {
|
|
74
|
+
try {
|
|
75
|
+
const artifacts = context.platform?.artifactStore?.list?.(100) ?? [];
|
|
76
|
+
return buildSetupWizardDurableReceipts(artifacts);
|
|
77
|
+
} catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
})();
|
|
81
|
+
return mergeSetupWizardDurableReceipts(artifactReceipts, setupWizardLiveDurableReceipts(context))
|
|
82
|
+
.filter((receipt) => receipt.stepId === 'browser-pwa');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function readyBrowserPwaSetupReceipt(receipts: readonly AgentSetupWizardDurableReceipt[]): AgentSetupWizardDurableReceipt | null {
|
|
86
|
+
return receipts.find((receipt) => receipt.status === 'ready') ?? null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function routeCertificationSummary(route: BrowserPwaCategoryRouteRecord): Record<string, unknown> {
|
|
90
|
+
return {
|
|
91
|
+
id: route.id,
|
|
92
|
+
categoryIds: route.categoryIds,
|
|
93
|
+
route: route.route,
|
|
94
|
+
mobileReady: route.mobileReady,
|
|
95
|
+
pwaReady: route.pwaReady,
|
|
96
|
+
modelRoute: route.modelRoute,
|
|
97
|
+
sourcePath: route.sourcePath,
|
|
98
|
+
certification: route.certification,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function browserCockpitWorkspaceCoverage(
|
|
103
|
+
enabled: boolean,
|
|
104
|
+
includeDetails: boolean,
|
|
105
|
+
browserPwa: BrowserPwaReadModelSnapshot,
|
|
106
|
+
): Record<string, unknown> {
|
|
63
107
|
const categories = AGENT_WORKSPACE_CATEGORIES.map((category) => ({
|
|
64
108
|
id: category.id,
|
|
65
109
|
label: category.label,
|
|
66
110
|
group: category.group,
|
|
67
111
|
actions: category.actions.length,
|
|
68
|
-
|
|
69
|
-
browserRoute: null,
|
|
112
|
+
certifiedRoute: enabled ? certifiedBrowserPwaCategoryRouteForCategory(browserPwa, category.id) : null,
|
|
70
113
|
agentRoute: confirmedCategoryRoute(category.id, category.label),
|
|
71
|
-
neededContract: 'connected-host browser-native Agent workspace category route',
|
|
72
114
|
}));
|
|
73
115
|
const categoryById = new Map(categories.map((category) => [category.id, category]));
|
|
116
|
+
const coveredCategoryCount = categories.filter((category) => category.certifiedRoute).length;
|
|
117
|
+
const nativeCategoryRoutesPublished = enabled && coveredCategoryCount === categories.length;
|
|
118
|
+
const status = !enabled
|
|
119
|
+
? 'web-setup-needed'
|
|
120
|
+
: nativeCategoryRoutesPublished
|
|
121
|
+
? 'browser-native-ready'
|
|
122
|
+
: coveredCategoryCount > 0
|
|
123
|
+
? 'partial-browser-native-category-contracts'
|
|
124
|
+
: 'needs-browser-native-category-contracts';
|
|
125
|
+
const certifiedRoutes = browserPwa.categoryRoutes.filter(isCertifiedBrowserPwaCategoryRoute);
|
|
126
|
+
const categoryRows = categories.map((category) => {
|
|
127
|
+
const route = category.certifiedRoute;
|
|
128
|
+
return {
|
|
129
|
+
id: category.id,
|
|
130
|
+
label: category.label,
|
|
131
|
+
group: category.group,
|
|
132
|
+
actions: category.actions,
|
|
133
|
+
browserStatus: !enabled ? 'blocked-by-web-setup' : route ? 'browser-native-ready' : 'terminal-first',
|
|
134
|
+
browserRoute: route?.route ?? null,
|
|
135
|
+
...(route ? {
|
|
136
|
+
browserRouteId: route.id,
|
|
137
|
+
browserRouteSource: route.sourcePath,
|
|
138
|
+
browserRouteReceiptId: route.certification.receiptId ?? null,
|
|
139
|
+
mobileReady: route.mobileReady,
|
|
140
|
+
pwaReady: route.pwaReady,
|
|
141
|
+
} : {
|
|
142
|
+
neededContract: 'connected-host browser-native Agent workspace category route',
|
|
143
|
+
}),
|
|
144
|
+
agentRoute: category.agentRoute,
|
|
145
|
+
};
|
|
146
|
+
});
|
|
74
147
|
return {
|
|
75
|
-
status
|
|
76
|
-
summary: enabled
|
|
77
|
-
? 'The connected-host web
|
|
78
|
-
:
|
|
148
|
+
status,
|
|
149
|
+
summary: !enabled
|
|
150
|
+
? 'The connected-host web endpoint is disabled, so browser-native workspace categories cannot be reached yet.'
|
|
151
|
+
: nativeCategoryRoutesPublished
|
|
152
|
+
? 'The connected host has published certified browser-native routes for every Agent workspace category.'
|
|
153
|
+
: coveredCategoryCount > 0
|
|
154
|
+
? `${coveredCategoryCount}/${categories.length} Agent workspace categories have certified browser-native routes; terminal workspace fallback remains available for the rest.`
|
|
155
|
+
: 'The connected-host web URL is openable, but Agent has not received a published browser-native route contract for workspace categories yet.',
|
|
79
156
|
categoryCount: categories.length,
|
|
80
|
-
|
|
81
|
-
|
|
157
|
+
coveredCategoryCount,
|
|
158
|
+
certifiedCategoryRouteCount: certifiedRoutes.length,
|
|
159
|
+
nativeCategoryRoutesPublished,
|
|
160
|
+
terminalFallback: nativeCategoryRoutesPublished
|
|
161
|
+
? 'The TUI Agent Workspace remains available as an equivalent local fallback.'
|
|
162
|
+
: 'Every Agent workspace category remains reachable through the TUI Agent Workspace while browser-native category routes are being published.',
|
|
82
163
|
laneCount: BROWSER_COCKPIT_EXPECTED_LANES.length,
|
|
83
164
|
...(includeDetails ? {
|
|
84
165
|
lanes: BROWSER_COCKPIT_EXPECTED_LANES.map((lane) => ({
|
|
@@ -86,19 +167,40 @@ function browserCockpitWorkspaceCoverage(enabled: boolean, includeDetails: boole
|
|
|
86
167
|
label: lane.label,
|
|
87
168
|
categoryIds: lane.categoryIds,
|
|
88
169
|
userOutcome: lane.userOutcome,
|
|
89
|
-
|
|
170
|
+
coveredCategoryCount: lane.categoryIds.filter((categoryId) => categoryById.get(categoryId)?.certifiedRoute).length,
|
|
171
|
+
browserStatus: !enabled
|
|
172
|
+
? 'blocked-by-web-setup'
|
|
173
|
+
: lane.categoryIds.every((categoryId) => categoryById.get(categoryId)?.certifiedRoute)
|
|
174
|
+
? 'browser-native-ready'
|
|
175
|
+
: lane.categoryIds.some((categoryId) => categoryById.get(categoryId)?.certifiedRoute)
|
|
176
|
+
? 'partial-browser-native-contract'
|
|
177
|
+
: 'needs-browser-native-contract',
|
|
178
|
+
browserRoutes: lane.categoryIds
|
|
179
|
+
.map((categoryId) => categoryById.get(categoryId)?.certifiedRoute)
|
|
180
|
+
.filter((route): route is BrowserPwaCategoryRouteRecord => Boolean(route))
|
|
181
|
+
.map(routeCertificationSummary),
|
|
90
182
|
agentRoutes: lane.categoryIds
|
|
91
183
|
.map((categoryId) => categoryById.get(categoryId))
|
|
92
184
|
.filter((category): category is NonNullable<typeof category> => Boolean(category))
|
|
93
185
|
.map((category) => category.agentRoute),
|
|
94
186
|
})),
|
|
95
|
-
categories,
|
|
187
|
+
categories: categoryRows,
|
|
188
|
+
publishedCategoryRoutes: certifiedRoutes.slice(0, 20).map(routeCertificationSummary),
|
|
189
|
+
sourceCounts: browserPwa.sourceCounts,
|
|
96
190
|
} : {}),
|
|
97
|
-
policy:
|
|
191
|
+
policy: nativeCategoryRoutesPublished
|
|
192
|
+
? 'Workspace coverage is counted ready only from certified SDK/daemon browser-native category route records with exact routes, mobile/touch evidence, publication, provenance, and freshness cursor metadata.'
|
|
193
|
+
: 'Workspace coverage is a route contract map, not a claim that the connected-host browser already renders these Agent category controls.',
|
|
98
194
|
};
|
|
99
195
|
}
|
|
100
196
|
|
|
101
|
-
function browserCockpitMobileAffordances(
|
|
197
|
+
function browserCockpitMobileAffordances(
|
|
198
|
+
enabled: boolean,
|
|
199
|
+
includeDetails: boolean,
|
|
200
|
+
browserPwa: BrowserPwaReadModelSnapshot,
|
|
201
|
+
nativeCategoryRoutesPublished: boolean,
|
|
202
|
+
): Record<string, unknown> {
|
|
203
|
+
const certifiedFirstRun = certifiedBrowserPwaFirstRunReceipts(browserPwa);
|
|
102
204
|
const controls = [
|
|
103
205
|
{
|
|
104
206
|
id: 'open-browser-cockpit',
|
|
@@ -125,22 +227,38 @@ function browserCockpitMobileAffordances(enabled: boolean, includeDetails: boole
|
|
|
125
227
|
modelRoute: 'settings action:"list" query:"web" includeHidden:true',
|
|
126
228
|
},
|
|
127
229
|
];
|
|
230
|
+
const laneControls = BROWSER_COCKPIT_EXPECTED_LANES.map((lane) => ({
|
|
231
|
+
id: lane.id,
|
|
232
|
+
label: lane.label,
|
|
233
|
+
status: nativeCategoryRoutesPublished ? 'ready' : enabled ? 'needs-browser-native-category-contracts' : 'blocked-by-web-setup',
|
|
234
|
+
categoryIds: lane.categoryIds,
|
|
235
|
+
}));
|
|
128
236
|
return {
|
|
129
|
-
status: enabled ? 'openable' : 'setup-needed',
|
|
237
|
+
status: enabled ? nativeCategoryRoutesPublished ? 'browser-native-ready' : 'openable' : 'setup-needed',
|
|
130
238
|
controlCount: controls.length,
|
|
131
|
-
|
|
239
|
+
nativeControlCount: laneControls.length,
|
|
240
|
+
...(includeDetails ? { controls, nativeControls: laneControls } : {}),
|
|
132
241
|
pwaInstall: {
|
|
133
|
-
status: enabled ? 'browser-owned' : 'blocked-by-web-setup',
|
|
134
|
-
note:
|
|
242
|
+
status: certifiedFirstRun.length > 0 ? 'certified-live-receipt' : enabled ? 'browser-owned' : 'blocked-by-web-setup',
|
|
243
|
+
note: certifiedFirstRun.length > 0
|
|
244
|
+
? 'The connected host published certified browser/PWA first-run evidence for the browser runtime.'
|
|
245
|
+
: 'Agent can open the configured URL; installing the PWA remains a browser/connected-host UI action until a certified first-run receipt is published.',
|
|
135
246
|
},
|
|
136
247
|
touchControls: {
|
|
137
|
-
status: 'needs-browser-native-category-contracts',
|
|
138
|
-
note:
|
|
248
|
+
status: nativeCategoryRoutesPublished ? 'ready' : 'needs-browser-native-category-contracts',
|
|
249
|
+
note: nativeCategoryRoutesPublished
|
|
250
|
+
? 'Certified browser-native route contracts cover chat, setup, approvals, memory, channels, automation, research, and safety lanes with mobile/touch evidence.'
|
|
251
|
+
: 'Agent has not received a connected-host contract proving mobile-native controls for chat, setup, approvals, memory, channels, or automation.',
|
|
139
252
|
},
|
|
140
253
|
};
|
|
141
254
|
}
|
|
142
255
|
|
|
143
|
-
function browserCockpitReceipts(
|
|
256
|
+
function browserCockpitReceipts(
|
|
257
|
+
context: CommandContext,
|
|
258
|
+
enabled: boolean,
|
|
259
|
+
includeDetails: boolean,
|
|
260
|
+
browserPwa: BrowserPwaReadModelSnapshot,
|
|
261
|
+
): Record<string, unknown> {
|
|
144
262
|
const marker = (() => {
|
|
145
263
|
try {
|
|
146
264
|
const shellPaths = context.workspace?.shellPaths;
|
|
@@ -162,18 +280,49 @@ function browserCockpitReceipts(context: CommandContext, enabled: boolean, inclu
|
|
|
162
280
|
};
|
|
163
281
|
}
|
|
164
282
|
})();
|
|
283
|
+
const certifiedFirstRun = certifiedBrowserPwaFirstRunReceipts(browserPwa);
|
|
284
|
+
const setupReceipts = browserPwaSetupReceipts(context);
|
|
285
|
+
const readySetupReceipt = readyBrowserPwaSetupReceipt(setupReceipts);
|
|
286
|
+
const browserFirstRunStatus = certifiedFirstRun.length > 0
|
|
287
|
+
? 'certified-live-receipt'
|
|
288
|
+
: readySetupReceipt
|
|
289
|
+
? 'published'
|
|
290
|
+
: 'not-published';
|
|
165
291
|
return {
|
|
166
|
-
status: marker.exists === true
|
|
292
|
+
status: browserFirstRunStatus !== 'not-published' && marker.exists === true
|
|
293
|
+
? 'ready'
|
|
294
|
+
: browserFirstRunStatus !== 'not-published'
|
|
295
|
+
? 'browser-ready-agent-onboarding-missing'
|
|
296
|
+
: marker.exists === true ? 'agent-complete-browser-receipt-missing' : 'needs-agent-closeout-and-browser-receipt',
|
|
167
297
|
agentOnboardingStatus: marker.status,
|
|
168
|
-
browserFirstRunStatus
|
|
298
|
+
browserFirstRunStatus,
|
|
169
299
|
...(includeDetails ? {
|
|
170
300
|
agentOnboardingCompletion: marker,
|
|
171
|
-
browserFirstRunCompletion:
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
301
|
+
browserFirstRunCompletion: certifiedFirstRun.length > 0
|
|
302
|
+
? {
|
|
303
|
+
status: 'certified-live-receipt',
|
|
304
|
+
webEnabled: enabled,
|
|
305
|
+
certifiedReadModelCount: certifiedFirstRun.length,
|
|
306
|
+
evidence: certifiedFirstRun[0],
|
|
307
|
+
setupReceiptEvidence: readySetupReceipt ?? null,
|
|
308
|
+
nextStep: 'Keep browser/PWA first-run receipts fresh with each connected-host browser runtime release.',
|
|
309
|
+
}
|
|
310
|
+
: readySetupReceipt
|
|
311
|
+
? {
|
|
312
|
+
status: 'published',
|
|
313
|
+
webEnabled: enabled,
|
|
314
|
+
evidence: readySetupReceipt,
|
|
315
|
+
certifiedReadModelCount: 0,
|
|
316
|
+
nextStep: 'Publish certified browser/PWA runtime read-model receipts to make cockpit readiness independently verifiable.',
|
|
317
|
+
}
|
|
318
|
+
: {
|
|
319
|
+
status: 'not-published',
|
|
320
|
+
webEnabled: enabled,
|
|
321
|
+
evidence: null,
|
|
322
|
+
certifiedReadModelCount: 0,
|
|
323
|
+
nextStep: 'Publish a connected-host browser/PWA completion receipt before using browser readiness as first-run closeout evidence.',
|
|
324
|
+
},
|
|
325
|
+
browserPwaSetupReceipts: setupReceipts.slice(0, 8),
|
|
177
326
|
} : {}),
|
|
178
327
|
setupCloseoutRoute: 'setup action:"status" includeParameters:true',
|
|
179
328
|
policy: 'Agent reports its own user onboarding marker separately from the connected-host browser/PWA receipt contract so setup closeout does not overclaim browser readiness.',
|
|
@@ -195,9 +344,14 @@ export function connectedBrowserCockpitRoute(context: CommandContext, options: {
|
|
|
195
344
|
}
|
|
196
345
|
}
|
|
197
346
|
const url = publicBaseUrl || `http://${browserConnectHost(binding.host)}:${binding.port}`;
|
|
347
|
+
const browserPwa = browserPwaReadModelSnapshot(context);
|
|
348
|
+
const nativeCategoryRoutesPublished = enabled && AGENT_WORKSPACE_CATEGORIES.every((category) =>
|
|
349
|
+
Boolean(certifiedBrowserPwaCategoryRouteForCategory(browserPwa, category.id))
|
|
350
|
+
);
|
|
351
|
+
const browserFirstRunCertified = certifiedBrowserPwaFirstRunReceipts(browserPwa).length > 0;
|
|
198
352
|
return {
|
|
199
353
|
enabled,
|
|
200
|
-
readiness: enabled ? 'ready' : 'setup-needed',
|
|
354
|
+
readiness: enabled ? nativeCategoryRoutesPublished && browserFirstRunCertified ? 'browser-native-ready' : 'ready' : 'setup-needed',
|
|
201
355
|
url,
|
|
202
356
|
source: publicBaseUrl ? 'web.publicBaseUrl' : 'web endpoint binding',
|
|
203
357
|
endpoint: {
|
|
@@ -205,9 +359,9 @@ export function connectedBrowserCockpitRoute(context: CommandContext, options: {
|
|
|
205
359
|
binding,
|
|
206
360
|
settings: ['web.enabled', 'web.hostMode', 'web.host', 'web.port', 'web.publicBaseUrl'],
|
|
207
361
|
},
|
|
208
|
-
workspaceCoverage: browserCockpitWorkspaceCoverage(enabled, options.includeWorkspaceCoverage === true),
|
|
209
|
-
mobile: browserCockpitMobileAffordances(enabled, options.includeWorkspaceCoverage === true),
|
|
210
|
-
receipts: browserCockpitReceipts(context, enabled, options.includeWorkspaceCoverage === true),
|
|
362
|
+
workspaceCoverage: browserCockpitWorkspaceCoverage(enabled, options.includeWorkspaceCoverage === true, browserPwa),
|
|
363
|
+
mobile: browserCockpitMobileAffordances(enabled, options.includeWorkspaceCoverage === true, browserPwa, nativeCategoryRoutesPublished),
|
|
364
|
+
receipts: browserCockpitReceipts(context, enabled, options.includeWorkspaceCoverage === true, browserPwa),
|
|
211
365
|
setupRoutes: {
|
|
212
366
|
inspectEndpoint: 'host action:"service" endpointId:"web" includeParameters:true',
|
|
213
367
|
servicePosture: 'host action:"services" includeParameters:true',
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
|
|
2
2
|
import type { CommandContext } from '../input/command-registry.ts';
|
|
3
|
+
import { interactiveRuntimeCapabilitySummary, interactiveRuntimeParityStatus } from './agent-harness-interactive-runtime-records.ts';
|
|
4
|
+
import type { AgentHarnessInteractiveRuntimeRecord } from './agent-harness-interactive-runtime-records.ts';
|
|
3
5
|
|
|
4
6
|
type BrowserControlStatus = 'ready' | 'attention' | 'setup-needed';
|
|
5
7
|
type BrowserControlDecisionStatus = 'ready-to-inspect-tool' | 'review-connector-first' | 'setup-needed';
|
|
@@ -47,6 +49,8 @@ export interface BrowserControlPosture {
|
|
|
47
49
|
readonly needsReview: boolean;
|
|
48
50
|
readonly toolMatches: readonly string[];
|
|
49
51
|
readonly mcpServers: readonly BrowserControlMcpServer[];
|
|
52
|
+
readonly certifiedRuntimeRecords: readonly AgentHarnessInteractiveRuntimeRecord[];
|
|
53
|
+
readonly runtime: Record<string, unknown>;
|
|
50
54
|
readonly workflows: readonly BrowserControlWorkflow[];
|
|
51
55
|
readonly setupChecklist: readonly string[];
|
|
52
56
|
readonly fallbackRoutes: readonly string[];
|
|
@@ -172,9 +176,11 @@ export function browserControlPosture(context: CommandContext, toolRegistry?: To
|
|
|
172
176
|
|
|
173
177
|
const readyBrowserMcp = mcpServers.some((server) => server.readiness === 'ready');
|
|
174
178
|
const needsReview = mcpServers.some((server) => server.readiness === 'attention');
|
|
175
|
-
const
|
|
179
|
+
const runtime = interactiveRuntimeCapabilitySummary(context);
|
|
180
|
+
const runtimeParity = interactiveRuntimeParityStatus(context);
|
|
181
|
+
const configured = runtimeParity.browserDesktopControlContract || toolMatches.length > 0 || readyBrowserMcp;
|
|
176
182
|
const recommendedRoute = configured
|
|
177
|
-
? 'execution action:"route" id:"browser-or-desktop-control"'
|
|
183
|
+
? runtimeParity.browserDesktopRoute ?? 'execution action:"route" id:"browser-or-desktop-control"'
|
|
178
184
|
: needsReview
|
|
179
185
|
? 'agent_harness mode:"mcp_servers" query:"browser desktop"'
|
|
180
186
|
: 'agent_harness mode:"mcp_servers" query:"browser desktop"';
|
|
@@ -185,6 +191,8 @@ export function browserControlPosture(context: CommandContext, toolRegistry?: To
|
|
|
185
191
|
needsReview,
|
|
186
192
|
toolMatches,
|
|
187
193
|
mcpServers,
|
|
194
|
+
certifiedRuntimeRecords: runtimeParity.browserDesktopRecords.slice(0, 5),
|
|
195
|
+
runtime,
|
|
188
196
|
workflows: browserControlWorkflows(configured, needsReview, recommendedRoute, setupRoute),
|
|
189
197
|
setupChecklist: [
|
|
190
198
|
'Inspect browser/desktop MCP servers and first-class tools before attempting live UI control.',
|
|
@@ -199,7 +207,7 @@ export function browserControlPosture(context: CommandContext, toolRegistry?: To
|
|
|
199
207
|
executionRoute: 'execution action:"route" id:"browser-or-desktop-control"',
|
|
200
208
|
setupRoute,
|
|
201
209
|
recommendedRoute,
|
|
202
|
-
policy: 'Browser and desktop control stays explicit: no live UI control is assumed unless a trusted tool
|
|
210
|
+
policy: 'Browser and desktop control stays explicit: no live UI control is assumed unless a trusted tool, fresh constrained MCP server, or certified daemon browser/desktop command receipt is configured.',
|
|
203
211
|
};
|
|
204
212
|
}
|
|
205
213
|
|
|
@@ -270,7 +278,7 @@ function browserControlDecision(
|
|
|
270
278
|
return {
|
|
271
279
|
id: 'inspect-configured-browser-control',
|
|
272
280
|
status: 'ready-to-inspect-tool',
|
|
273
|
-
modelRoute: firstToolRoute || firstReadyMcpRoute || posture.executionRoute,
|
|
281
|
+
modelRoute: firstToolRoute || firstReadyMcpRoute || posture.recommendedRoute || posture.executionRoute,
|
|
274
282
|
userRoute: 'Agent Workspace -> Work & Approvals or Tools & MCP',
|
|
275
283
|
nextStep: `Inspect the configured ${workflow.label.toLowerCase()} tool/server, then invoke the narrowest live-control tool only if the user request still needs it.`,
|
|
276
284
|
reason: 'A browser/desktop control tool or fresh trusted MCP server is configured.',
|