@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
@@ -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 browserCockpitWorkspaceCoverage(enabled: boolean, includeDetails: boolean): Record<string, unknown> {
62
- const browserStatus = enabled ? 'terminal-first' : 'blocked-by-web-setup';
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
- browserStatus,
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: enabled ? 'needs-browser-native-category-contracts' : 'web-setup-needed',
76
- summary: enabled
77
- ? 'The connected-host web URL is openable, but Agent has not received a published browser-native route contract for workspace categories yet.'
78
- : 'The connected-host web endpoint is disabled, so browser-native workspace categories cannot be reached yet.',
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
- nativeCategoryRoutesPublished: false,
81
- terminalFallback: 'Every Agent workspace category remains reachable through the TUI Agent Workspace while browser-native category routes are being published.',
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
- browserStatus: enabled ? 'needs-browser-native-contract' : 'blocked-by-web-setup',
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: 'Workspace coverage is a route contract map, not a claim that the connected-host browser already renders these Agent category controls.',
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(enabled: boolean, includeDetails: boolean): Record<string, unknown> {
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
- ...(includeDetails ? { controls } : {}),
239
+ nativeControlCount: laneControls.length,
240
+ ...(includeDetails ? { controls, nativeControls: laneControls } : {}),
132
241
  pwaInstall: {
133
- status: enabled ? 'browser-owned' : 'blocked-by-web-setup',
134
- note: 'Agent can open the configured URL; installing the PWA remains a browser/connected-host UI action.',
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: 'Agent has not received a connected-host contract proving mobile-native controls for chat, setup, approvals, memory, channels, or automation.',
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(context: CommandContext, enabled: boolean, includeDetails: boolean): Record<string, unknown> {
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 ? 'agent-complete-browser-receipt-missing' : 'needs-agent-closeout-and-browser-receipt',
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: 'not-published',
298
+ browserFirstRunStatus,
169
299
  ...(includeDetails ? {
170
300
  agentOnboardingCompletion: marker,
171
- browserFirstRunCompletion: {
172
- status: 'not-published',
173
- webEnabled: enabled,
174
- evidence: null,
175
- nextStep: 'Publish a connected-host browser/PWA completion receipt before using browser readiness as first-run closeout evidence.',
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 configured = toolMatches.length > 0 || readyBrowserMcp;
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 or fresh constrained MCP server is configured.',
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.',