@rtrvr-ai/rover 4.0.1 → 4.1.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.
- package/README.md +25 -29
- package/dist/agentDiscovery.d.ts +13 -14
- package/dist/agentDiscovery.js +36 -37
- package/dist/embed.js +166 -59
- package/dist/index.d.ts +2 -6
- package/dist/ownerInstall.d.ts +0 -4
- package/dist/ownerInstall.js +7 -5
- package/dist/previewBootstrap.d.ts +0 -1
- package/dist/previewBootstrap.js +2 -10
- package/dist/rover.js +177 -70
- package/dist/worker/rover-worker.js +11 -11
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ Before you test Rover on arbitrary websites, get your site config from Workspace
|
|
|
20
20
|
Add this snippet before `</body>` on any page:
|
|
21
21
|
|
|
22
22
|
```html
|
|
23
|
-
<script type="application/agent+json">{"
|
|
23
|
+
<script type="application/agent+json">{"a2w":"https://agent.rtrvr.ai/v1/a2w/runs","run":"https://agent.rtrvr.ai/v1/a2w/runs"}</script>
|
|
24
24
|
<script>
|
|
25
25
|
(function(){
|
|
26
26
|
var r = window.rover = window.rover || function(){
|
|
@@ -102,7 +102,7 @@ Use `createRoverConsoleSnippet(...)` and `createRoverBookmarklet(...)` to genera
|
|
|
102
102
|
Before you use any of these helpers on another website:
|
|
103
103
|
|
|
104
104
|
1. Open Rover Workspace.
|
|
105
|
-
2. Create
|
|
105
|
+
2. Create a site key. Workspace keeps the full owner-readable `pk_site_*` install material available whenever you reopen Install or Scripts by fetching the canonical owner install material from the backend control plane.
|
|
106
106
|
3. Copy the **test config JSON** from Workspace.
|
|
107
107
|
4. Either paste that JSON into the Rover website's "Try on Other Sites" tool, or pass the same values into the SDK helpers below.
|
|
108
108
|
|
|
@@ -422,8 +422,6 @@ const RoverWidget = dynamic(() => import('./RoverWidget'), { ssr: false });
|
|
|
422
422
|
| `apiBase` | `string` | `https://agent.rtrvr.ai` | Optional API base override. Rover uses `/v2/rover/*` under this base. |
|
|
423
423
|
| `allowedDomains` | `string[]` | `[]` | Hostnames or patterns where Rover may operate. In `registrable_domain`, plain `example.com` covers the apex host and subdomains. |
|
|
424
424
|
| `domainScopeMode` | `'registrable_domain' \| 'host_only'` | `'registrable_domain'` | How Rover interprets plain `allowedDomains` entries: `registrable_domain` = apex + subdomains, `host_only` = exact host only unless you explicitly allow more hosts. |
|
|
425
|
-
| `externalNavigationPolicy` | `'open_new_tab_notice' \| 'block' \| 'allow'` | `'open_new_tab_notice'` | Advanced / legacy external navigation override. Standard owner-facing installs rely on Rover's default new-tab-with-notice behavior outside allowed scope. |
|
|
426
|
-
| `navigation.crossHostPolicy` | `'same_tab' \| 'open_new_tab'` | `'same_tab'` | Advanced / legacy in-scope cross-host override. Standard owner-facing installs let Rover choose the right tab automatically. |
|
|
427
425
|
| `mode` | `'full' \| 'safe'` | `'full'` | Runtime mode |
|
|
428
426
|
| `allowActions` | `boolean` | `true` | Enable or disable action tools |
|
|
429
427
|
| `openOnInit` | `boolean` | `false` | Open panel immediately on boot |
|
|
@@ -559,7 +557,7 @@ https://example.com?rover_shortcut=checkout_flow
|
|
|
559
557
|
|
|
560
558
|
For AI or CLI-triggered entrypoints, prefer exact shortcut IDs for repeatable flows.
|
|
561
559
|
|
|
562
|
-
When a site key or session token is used, Rover fetches cloud site config via `/v2/rover/session/open` (shortcuts + `businessType` + sparse `experience` overrides +
|
|
560
|
+
When a site key or session token is used, Rover fetches cloud site config via `/v2/rover/session/open` (shortcuts + `businessType` + sparse `experience` overrides + voice compatibility + `aiAccess` + `pageConfig`).
|
|
563
561
|
If the same field exists in both cloud config and boot config, boot config wins.
|
|
564
562
|
`siteConfig.aiAccess.enabled` is the canonical owner-facing launch switch persisted from Workspace/Webflow. `deepLink` stays boot/runtime only for advanced manual overrides such as custom param names, explicit enable/disable, or disabling URL param consumption.
|
|
565
563
|
|
|
@@ -567,25 +565,25 @@ For owner-facing installs, prefer `cloudSandboxEnabled: true` instead of hand-wi
|
|
|
567
565
|
|
|
568
566
|
See [full configuration reference](https://github.com/rtrvr-ai/rover/blob/main/docs/INTEGRATION.md#configuration-reference).
|
|
569
567
|
|
|
570
|
-
##
|
|
568
|
+
## Agent-to-Web Protocol (A2W)
|
|
571
569
|
|
|
572
570
|
Rover-enabled sites expose two public entrypoints:
|
|
573
571
|
|
|
574
572
|
- browser-first convenience via `?rover=` and `?rover_shortcut=`
|
|
575
|
-
- machine-first
|
|
573
|
+
- machine-first A2W runs via `POST https://agent.rtrvr.ai/v1/a2w/runs`
|
|
576
574
|
|
|
577
|
-
Use `/v1/
|
|
575
|
+
Use `/v1/a2w/runs` when you need structured progress, continuation, or the final result back.
|
|
578
576
|
|
|
579
577
|
The source-visible marker is optional but recommended:
|
|
580
578
|
|
|
581
579
|
```html
|
|
582
|
-
<script type="application/agent+json">{"
|
|
580
|
+
<script type="application/agent+json">{"a2w":"https://agent.rtrvr.ai/v1/a2w/runs","run":"https://agent.rtrvr.ai/v1/a2w/runs"}</script>
|
|
583
581
|
```
|
|
584
582
|
|
|
585
583
|
For stronger pre-task discovery, publish `/.well-known/rover-site.json` as Rover's authoritative rich profile, publish `/.well-known/agent-card.json` as the interop card, add a `Link: </.well-known/agent-card.json>; rel="service-desc"` header, and include inline discovery tags generated by `createRoverAgentDiscoveryTags(...)`.
|
|
586
584
|
|
|
587
585
|
```http
|
|
588
|
-
POST https://agent.rtrvr.ai/v1/
|
|
586
|
+
POST https://agent.rtrvr.ai/v1/a2w/runs
|
|
589
587
|
Content-Type: application/json
|
|
590
588
|
|
|
591
589
|
{
|
|
@@ -596,12 +594,12 @@ Content-Type: application/json
|
|
|
596
594
|
}
|
|
597
595
|
```
|
|
598
596
|
|
|
599
|
-
|
|
597
|
+
Use the explicit A2W run envelope with `goal` for natural-language instructions and `shortcut` for saved journeys.
|
|
600
598
|
|
|
601
599
|
Callers may also provide structured visiting-agent metadata:
|
|
602
600
|
|
|
603
601
|
```http
|
|
604
|
-
POST https://agent.rtrvr.ai/v1/
|
|
602
|
+
POST https://agent.rtrvr.ai/v1/a2w/runs
|
|
605
603
|
Content-Type: application/json
|
|
606
604
|
|
|
607
605
|
{
|
|
@@ -620,34 +618,34 @@ Content-Type: application/json
|
|
|
620
618
|
|
|
621
619
|
Anonymous AI callers do **not** need `siteId`, `publicKey`, or `siteKeyId`.
|
|
622
620
|
|
|
623
|
-
The returned
|
|
621
|
+
The returned run URL is the canonical resource:
|
|
624
622
|
|
|
625
623
|
- `GET` + `Accept: application/json` for polling or final result
|
|
626
624
|
- `GET` + `Accept: text/event-stream` for SSE
|
|
627
625
|
- `GET` + `Accept: application/x-ndjson` for CLI-friendly streaming
|
|
628
626
|
- `POST { "input": "..." }` for continuation when the task asks for more input
|
|
629
627
|
- `DELETE` to cancel
|
|
630
|
-
- a `workflow` URL when the
|
|
628
|
+
- a `workflow` URL when the run belongs to an aggregated multi-site workflow
|
|
631
629
|
|
|
632
|
-
|
|
630
|
+
Run creation may also return browser handoff URLs:
|
|
633
631
|
|
|
634
632
|
- `open`: clean receipt URL for browser attach
|
|
635
633
|
- `browserLink`: optional readable alias with visible `?rover=` or `?rover_shortcut=` when it fits the URL budget
|
|
636
634
|
|
|
637
|
-
The
|
|
635
|
+
The run URL remains canonical; receipt links are only a browser handoff layer over that same run.
|
|
638
636
|
|
|
639
637
|
- `Prefer: execution=browser` keeps execution browser-first
|
|
640
638
|
- `Prefer: execution=cloud` is the explicit browserless path today
|
|
641
639
|
- `Prefer: execution=auto` prefers browser attach first; delayed cloud auto-promotion is a follow-up robustness phase
|
|
642
640
|
|
|
643
|
-
Rover deep links like `?rover=` and `?rover_shortcut=` remain the simple browser-first entrypoints; `/v1/
|
|
641
|
+
Rover deep links like `?rover=` and `?rover_shortcut=` remain the simple browser-first entrypoints; `/v1/a2w/runs` is the machine-oriented protocol. Cross-site workflows and handoffs extend that same public contract rather than replacing it.
|
|
644
642
|
|
|
645
643
|
### Agent identity attribution
|
|
646
644
|
|
|
647
645
|
Rover normalizes visiting-agent attribution in this order:
|
|
648
646
|
|
|
649
647
|
1. verified signed signal
|
|
650
|
-
2. explicit `agent` object on
|
|
648
|
+
2. explicit `agent` object on A2W run creation or handoffs
|
|
651
649
|
3. heuristic headers such as `User-Agent`, `Signature-Agent`, `Signature`, `Signature-Input`, and `X-RTRVR-Client-Id`
|
|
652
650
|
4. advanced local fallbacks such as RoverBook `identityResolver`
|
|
653
651
|
5. anonymous fallback
|
|
@@ -656,13 +654,13 @@ Trust tiers are `verified_signed`, `signed_directory_only`, `self_reported`, `he
|
|
|
656
654
|
|
|
657
655
|
### Cross-site workflows and handoffs
|
|
658
656
|
|
|
659
|
-
|
|
657
|
+
A2W runs can delegate to Rover on another Rover-enabled site without leaving the same protocol surface.
|
|
660
658
|
|
|
661
|
-
- `POST /v1/
|
|
662
|
-
- `GET /v1/workflows/{id}` returns aggregated workflow state or stream
|
|
663
|
-
- child
|
|
659
|
+
- `POST /v1/a2w/runs/{id}/handoffs` creates a child run on another site
|
|
660
|
+
- `GET /v1/a2w/workflows/{id}` returns aggregated workflow state or stream
|
|
661
|
+
- child runs inherit the same workflow lineage as the parent
|
|
664
662
|
|
|
665
|
-
Handoff creation also accepts the optional `agent` object so a child
|
|
663
|
+
Handoff creation also accepts the optional `agent` object so a child run can inherit or explicitly override visiting-agent attribution.
|
|
666
664
|
|
|
667
665
|
Receiving sites must explicitly opt in through Workspace/site config:
|
|
668
666
|
|
|
@@ -690,7 +688,7 @@ Runtime contract notes:
|
|
|
690
688
|
- `plannerOnActError` applies only in `auto` mode and only when ACT has no usable outcome.
|
|
691
689
|
- Typed conflicts: `stale_seq`, `stale_epoch`, `active_run_exists`.
|
|
692
690
|
- `POST /command` stale/missing run is non-fatal for tab navigation decisions (`decision='stale_run'`).
|
|
693
|
-
- Cross-registrable navigation preflight is resilient: if decision checks are unavailable, Rover falls back to local runtime behavior. Standard installs open outside-domain pages in a new tab with notice and choose the right tab automatically for allowed-host hops
|
|
691
|
+
- Cross-registrable navigation preflight is resilient: if decision checks are unavailable, Rover falls back to local runtime behavior. Standard installs open outside-domain pages in a new tab with notice and choose the right tab automatically for allowed-host hops.
|
|
694
692
|
- External intent routing: `/context/external` uses `read_context` (read/navigation-context prompts) or `act` (mutation prompts). Navigation-only external opens are represented by `POST /command` with `type='TAB_EVENT'` plus external placeholder tab handling.
|
|
695
693
|
- Any normal user send starts a fresh task boundary (fresh `prevSteps`, fresh run-scoped tab order/scope).
|
|
696
694
|
- `ask_user` answer submissions are the only continuation path and keep the same task boundary.
|
|
@@ -753,11 +751,9 @@ rover.on('error', (err) => console.error(err));
|
|
|
753
751
|
| `close` | — | Panel closed |
|
|
754
752
|
| `mode_change` | `{ mode }` | Execution mode changed |
|
|
755
753
|
| `navigation_guardrail` | `{ url, policy }` | Out-of-scope navigation intercepted |
|
|
756
|
-
| `
|
|
757
|
-
| `
|
|
758
|
-
| `
|
|
759
|
-
| `run_state_transition` | `{ taskId, runId, taskBoundaryId, state, taskComplete, needsUserInput, summary?, error? }` | Public run lifecycle transition |
|
|
760
|
-
| `run_completed` | `{ taskId, runId, taskBoundaryId, state, taskComplete, needsUserInput, summary?, error? }` | Terminal public run lifecycle event |
|
|
754
|
+
| `run_started` | `{ runId, executionId, runBoundaryId, state, runComplete, needsUserInput, summary? }` | Public run lifecycle start event |
|
|
755
|
+
| `run_state_transition` | `{ runId, executionId, runBoundaryId, state, runComplete, needsUserInput, summary?, error? }` | Public run lifecycle transition |
|
|
756
|
+
| `run_completed` | `{ runId, executionId, runBoundaryId, state, runComplete, needsUserInput, summary?, error? }` | Terminal public run lifecycle event |
|
|
761
757
|
| `checkpoint_state` | `{ state, reason?, action?, code?, message? }` | Checkpoint sync state updates |
|
|
762
758
|
| `checkpoint_error` | `{ action, code?, message, ... }` | Checkpoint request failure details |
|
|
763
759
|
| `tab_event_conflict_retry` | `{ runId, conflict?, ... }` | One stale seq/epoch tab-event conflict was recovered by silent retry |
|
package/dist/agentDiscovery.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export declare const DEFAULT_ROVER_SITE_PATH = "/.well-known/rover-site.json";
|
|
|
6
6
|
export declare const DEFAULT_LLMS_PATH = "/llms.txt";
|
|
7
7
|
export declare const ROVER_WEBMCP_DISCOVERY_GLOBAL = "__ROVER_WEBMCP_TOOL_DEFS__";
|
|
8
8
|
export declare const ROVER_DISCOVERY_ACTION_SHEET_MAX_ACTIONS = 3;
|
|
9
|
+
export declare const A2W_RUNS_PATH = "/v1/a2w/runs";
|
|
10
|
+
export declare const A2W_WORKFLOWS_PATH = "/v1/a2w/workflows";
|
|
9
11
|
type JsonSchema = Record<string, any>;
|
|
10
12
|
export type RoverDiscoveryExecutionPreference = 'auto' | 'browser' | 'cloud';
|
|
11
13
|
export type RoverDiscoverySurfaceMode = 'silent' | 'beacon' | 'integrated' | 'debug';
|
|
@@ -14,7 +16,7 @@ export type RoverDiscoveryHostSurface = 'auto' | 'existing-assistant' | 'floatin
|
|
|
14
16
|
export type RoverDiscoveryActionReveal = 'click' | 'focus' | 'keyboard' | 'agent-handshake';
|
|
15
17
|
export type RoverCapabilityResultMode = 'text' | 'markdown' | 'json' | 'observation' | 'artifacts';
|
|
16
18
|
export type RoverSkillSideEffect = 'none' | 'read' | 'write' | 'transactional';
|
|
17
|
-
export type RoverSkillInterface = '
|
|
19
|
+
export type RoverSkillInterface = 'run' | 'shortcut' | 'client_tool' | 'webmcp';
|
|
18
20
|
export type RoverDiscoverySurfacePolicy = {
|
|
19
21
|
mode?: RoverDiscoverySurfaceMode;
|
|
20
22
|
branding?: RoverDiscoverySurfaceBranding;
|
|
@@ -62,7 +64,7 @@ export type RoverPublicSkillDefinition = {
|
|
|
62
64
|
prompt?: string;
|
|
63
65
|
routing?: 'auto' | 'act' | 'planner';
|
|
64
66
|
toolName?: string;
|
|
65
|
-
|
|
67
|
+
run?: {
|
|
66
68
|
endpoint: string;
|
|
67
69
|
payload: Record<string, unknown>;
|
|
68
70
|
preferExecution: RoverDiscoveryExecutionPreference;
|
|
@@ -114,20 +116,19 @@ export type RoverSiteProfile = {
|
|
|
114
116
|
pages: RoverPageDefinition[];
|
|
115
117
|
policies: {
|
|
116
118
|
preferredExecution: RoverDiscoveryExecutionPreference;
|
|
117
|
-
|
|
118
|
-
shortcutLaunchEnabled: boolean;
|
|
119
|
+
a2wRunsEnabled: boolean;
|
|
119
120
|
cloudBrowserAllowed: boolean;
|
|
120
121
|
delegatedHandoffs: boolean;
|
|
121
122
|
};
|
|
122
123
|
auth: {
|
|
123
|
-
|
|
124
|
+
runEndpoint: string;
|
|
124
125
|
workflowEndpoint: string;
|
|
125
126
|
acceptsHttpMessageSignatures: boolean;
|
|
126
127
|
supportsUnsignedSelfReportedIdentity: boolean;
|
|
127
128
|
};
|
|
128
129
|
analytics: {
|
|
129
130
|
layer: 'roverbook';
|
|
130
|
-
|
|
131
|
+
runIdField: 'runId';
|
|
131
132
|
workflowIdField: 'workflowId';
|
|
132
133
|
capabilityIdField: 'capabilityId';
|
|
133
134
|
pageIdField: 'pageId';
|
|
@@ -159,14 +160,14 @@ export type RoverAgentCard = {
|
|
|
159
160
|
defaultOutputModes: string[];
|
|
160
161
|
capabilities: {
|
|
161
162
|
streaming: boolean;
|
|
162
|
-
|
|
163
|
+
a2wRuns: boolean;
|
|
163
164
|
stateTransitions: boolean;
|
|
164
165
|
delegatedHandoffs: boolean;
|
|
165
166
|
webmcp: boolean;
|
|
166
167
|
};
|
|
167
168
|
skills: RoverPublicSkillDefinition[];
|
|
168
169
|
interfaces?: Array<{
|
|
169
|
-
type: '
|
|
170
|
+
type: 'run' | 'workflow' | 'site' | 'deep_link' | 'webmcp';
|
|
170
171
|
url: string;
|
|
171
172
|
description?: string;
|
|
172
173
|
available?: boolean;
|
|
@@ -175,14 +176,13 @@ export type RoverAgentCard = {
|
|
|
175
176
|
rover: {
|
|
176
177
|
siteId?: string;
|
|
177
178
|
siteUrl: string;
|
|
178
|
-
|
|
179
|
+
runEndpoint: string;
|
|
179
180
|
workflowEndpoint: string;
|
|
180
181
|
serviceDescUrl: string;
|
|
181
182
|
roverSiteUrl: string;
|
|
182
183
|
llmsUrl?: string;
|
|
183
184
|
preferredExecution: RoverDiscoveryExecutionPreference;
|
|
184
|
-
|
|
185
|
-
shortcutLaunchEnabled: boolean;
|
|
185
|
+
a2wRunsEnabled: boolean;
|
|
186
186
|
cloudBrowserAllowed: boolean;
|
|
187
187
|
delegatedHandoffs: boolean;
|
|
188
188
|
instructions: string[];
|
|
@@ -238,8 +238,6 @@ export type RoverAgentDiscoveryConfig = {
|
|
|
238
238
|
};
|
|
239
239
|
aiAccess?: {
|
|
240
240
|
enabled?: boolean;
|
|
241
|
-
allowPromptLaunch?: boolean;
|
|
242
|
-
allowShortcutLaunch?: boolean;
|
|
243
241
|
allowCloudBrowser?: boolean;
|
|
244
242
|
allowDelegatedHandoffs?: boolean;
|
|
245
243
|
};
|
|
@@ -261,7 +259,8 @@ export declare function buildRoverAgentDiscoveryPayloads(config: RoverAgentDisco
|
|
|
261
259
|
pageManifestJson: string;
|
|
262
260
|
llmsUrl?: string;
|
|
263
261
|
marker: {
|
|
264
|
-
|
|
262
|
+
a2w?: string;
|
|
263
|
+
run?: string;
|
|
265
264
|
card: string;
|
|
266
265
|
roverSite: string;
|
|
267
266
|
site?: string;
|
package/dist/agentDiscovery.js
CHANGED
|
@@ -6,25 +6,27 @@ export const DEFAULT_ROVER_SITE_PATH = '/.well-known/rover-site.json';
|
|
|
6
6
|
export const DEFAULT_LLMS_PATH = '/llms.txt';
|
|
7
7
|
export const ROVER_WEBMCP_DISCOVERY_GLOBAL = '__ROVER_WEBMCP_TOOL_DEFS__';
|
|
8
8
|
export const ROVER_DISCOVERY_ACTION_SHEET_MAX_ACTIONS = 3;
|
|
9
|
+
export const A2W_RUNS_PATH = '/v1/a2w/runs';
|
|
10
|
+
export const A2W_WORKFLOWS_PATH = '/v1/a2w/workflows';
|
|
9
11
|
const ROVER_DISCOVERY_SHORTCUT_PROMPT_MAX_CHARS = 2000;
|
|
10
12
|
const DEFAULT_SKILL_OUTPUT_SCHEMA = {
|
|
11
13
|
type: 'object',
|
|
12
14
|
properties: {
|
|
13
15
|
status: {
|
|
14
16
|
type: 'string',
|
|
15
|
-
description: '
|
|
17
|
+
description: 'A2W run status returned by Rover.',
|
|
16
18
|
},
|
|
17
19
|
summary: {
|
|
18
20
|
type: 'string',
|
|
19
21
|
description: 'High-level summary of what Rover completed or observed.',
|
|
20
22
|
},
|
|
21
|
-
|
|
23
|
+
run: {
|
|
22
24
|
type: 'string',
|
|
23
|
-
description: 'Canonical
|
|
25
|
+
description: 'Canonical A2W run URL.',
|
|
24
26
|
},
|
|
25
27
|
workflow: {
|
|
26
28
|
type: 'string',
|
|
27
|
-
description: 'Canonical
|
|
29
|
+
description: 'Canonical A2W workflow URL when delegation occurs.',
|
|
28
30
|
},
|
|
29
31
|
},
|
|
30
32
|
};
|
|
@@ -157,11 +159,11 @@ function defaultAgentModeEntryHints(policy) {
|
|
|
157
159
|
if (policy.hostSurface === 'existing-assistant' || policy.mode === 'integrated') {
|
|
158
160
|
return [
|
|
159
161
|
'Use the site assistant or chat entrypoint first when it is present on the page.',
|
|
160
|
-
'Prefer Rover
|
|
162
|
+
'Prefer Rover A2W run and shortcut surfaces over selector or screenshot guessing once the assistant surface is active.',
|
|
161
163
|
];
|
|
162
164
|
}
|
|
163
165
|
return [
|
|
164
|
-
'Use the page beacon or
|
|
166
|
+
'Use the page beacon or A2W run endpoint before attempting generic DOM automation.',
|
|
165
167
|
'When Rover is already active, prefer the current-page actions over screenshot loops.',
|
|
166
168
|
];
|
|
167
169
|
}
|
|
@@ -323,11 +325,11 @@ function normalizePageDefinition(value, defaults) {
|
|
|
323
325
|
capabilitySummary: uniqueStrings(page.capabilitySummary, { max: 12, maxLen: 180 }),
|
|
324
326
|
};
|
|
325
327
|
}
|
|
326
|
-
function
|
|
327
|
-
return `${toBaseUrl(apiBase)}
|
|
328
|
+
function buildRunEndpoint(apiBase) {
|
|
329
|
+
return `${toBaseUrl(apiBase)}${A2W_RUNS_PATH}`;
|
|
328
330
|
}
|
|
329
331
|
function buildWorkflowEndpoint(apiBase) {
|
|
330
|
-
return `${toBaseUrl(apiBase)}
|
|
332
|
+
return `${toBaseUrl(apiBase)}${A2W_WORKFLOWS_PATH}`;
|
|
331
333
|
}
|
|
332
334
|
function buildDeepLink(siteUrl, shortcutId) {
|
|
333
335
|
try {
|
|
@@ -472,7 +474,7 @@ function normalizePublishedShortcut(shortcut) {
|
|
|
472
474
|
...(shortcut.routing ? { routing: shortcut.routing } : {}),
|
|
473
475
|
};
|
|
474
476
|
}
|
|
475
|
-
function buildShortcutSkill(shortcut, config,
|
|
477
|
+
function buildShortcutSkill(shortcut, config, runEndpoint) {
|
|
476
478
|
const publishedShortcut = normalizePublishedShortcut(shortcut);
|
|
477
479
|
if (!publishedShortcut)
|
|
478
480
|
return null;
|
|
@@ -498,7 +500,7 @@ function buildShortcutSkill(shortcut, config, taskEndpoint) {
|
|
|
498
500
|
whenToUse: annotations.whenToUse
|
|
499
501
|
|| 'Use this when the user wants this exact site outcome and you want a stable path that avoids brittle DOM guessing.',
|
|
500
502
|
whyUse: annotations.whyUse
|
|
501
|
-
|| 'Rover shortcuts are explicit site-owned entrypoints with structured
|
|
503
|
+
|| 'Rover shortcuts are explicit site-owned entrypoints with structured A2W run progress and cleaner recovery than generic DOM automation.',
|
|
502
504
|
}, preferredInterface),
|
|
503
505
|
tags,
|
|
504
506
|
examples,
|
|
@@ -517,8 +519,8 @@ function buildShortcutSkill(shortcut, config, taskEndpoint) {
|
|
|
517
519
|
prompt,
|
|
518
520
|
routing: shortcut.routing,
|
|
519
521
|
deepLink: buildDeepLink(config.siteUrl, id),
|
|
520
|
-
|
|
521
|
-
endpoint:
|
|
522
|
+
run: {
|
|
523
|
+
endpoint: runEndpoint,
|
|
522
524
|
payload: {
|
|
523
525
|
url: normalizeSiteUrl(config.siteUrl),
|
|
524
526
|
shortcut: id,
|
|
@@ -764,19 +766,17 @@ function buildInlineDataUrl(json) {
|
|
|
764
766
|
}
|
|
765
767
|
export function createRoverAgentCard(config) {
|
|
766
768
|
const siteUrl = normalizeSiteUrl(config.siteUrl);
|
|
767
|
-
const
|
|
769
|
+
const runEndpoint = buildRunEndpoint(config.apiBase);
|
|
768
770
|
const workflowEndpoint = buildWorkflowEndpoint(config.apiBase);
|
|
769
771
|
const serviceDescUrl = text(config.agentCardUrl) || DEFAULT_AGENT_CARD_PATH;
|
|
770
772
|
const roverSiteUrl = text(config.roverSiteUrl) || DEFAULT_ROVER_SITE_PATH;
|
|
771
773
|
const llmsUrl = text(config.llmsUrl);
|
|
772
774
|
const launchAccess = resolveAiLaunchAccess(config.aiAccess);
|
|
773
|
-
const
|
|
774
|
-
const shortcutLaunchEnabled = launchAccess.shortcutLaunchEnabled;
|
|
775
|
-
const publicTaskEnabled = promptLaunchEnabled || shortcutLaunchEnabled;
|
|
775
|
+
const publicRunEnabled = launchAccess.enabled;
|
|
776
776
|
const cloudBrowserAllowed = config.aiAccess?.allowCloudBrowser !== false;
|
|
777
777
|
const delegatedHandoffs = config.aiAccess?.allowDelegatedHandoffs === true;
|
|
778
778
|
const shortcutSkills = (config.shortcuts || [])
|
|
779
|
-
.map(shortcut => buildShortcutSkill(shortcut, config,
|
|
779
|
+
.map(shortcut => buildShortcutSkill(shortcut, config, runEndpoint))
|
|
780
780
|
.filter((skill) => !!skill);
|
|
781
781
|
const toolSkills = (config.tools || [])
|
|
782
782
|
.map(tool => buildToolSkill(tool, 'client_tool'))
|
|
@@ -819,29 +819,29 @@ export function createRoverAgentCard(config) {
|
|
|
819
819
|
return {
|
|
820
820
|
name: siteName,
|
|
821
821
|
description,
|
|
822
|
-
url:
|
|
822
|
+
url: runEndpoint,
|
|
823
823
|
version: text(config.version, 80) || '1.0.0',
|
|
824
824
|
defaultInputModes: ['text/plain', 'application/json'],
|
|
825
825
|
defaultOutputModes: ['text/plain', 'application/json'],
|
|
826
826
|
capabilities: {
|
|
827
|
-
streaming:
|
|
828
|
-
|
|
829
|
-
stateTransitions:
|
|
827
|
+
streaming: publicRunEnabled,
|
|
828
|
+
a2wRuns: publicRunEnabled,
|
|
829
|
+
stateTransitions: publicRunEnabled,
|
|
830
830
|
delegatedHandoffs,
|
|
831
831
|
webmcp: webmcpSkills.length > 0,
|
|
832
832
|
},
|
|
833
833
|
skills,
|
|
834
834
|
interfaces: [
|
|
835
835
|
{
|
|
836
|
-
type: '
|
|
837
|
-
url:
|
|
838
|
-
description: 'Canonical
|
|
839
|
-
available:
|
|
836
|
+
type: 'run',
|
|
837
|
+
url: runEndpoint,
|
|
838
|
+
description: 'Canonical Agent-to-Web Protocol (A2W) run creation endpoint.',
|
|
839
|
+
available: publicRunEnabled,
|
|
840
840
|
},
|
|
841
841
|
{
|
|
842
842
|
type: 'workflow',
|
|
843
843
|
url: workflowEndpoint,
|
|
844
|
-
description: 'Aggregated Rover workflow resource for delegated
|
|
844
|
+
description: 'Aggregated Rover workflow resource for delegated runs.',
|
|
845
845
|
available: true,
|
|
846
846
|
},
|
|
847
847
|
{
|
|
@@ -854,7 +854,7 @@ export function createRoverAgentCard(config) {
|
|
|
854
854
|
type: 'deep_link',
|
|
855
855
|
url: siteUrl,
|
|
856
856
|
description: 'Browser-first Rover deep link surface using rover= or rover_shortcut= query params.',
|
|
857
|
-
available:
|
|
857
|
+
available: publicRunEnabled,
|
|
858
858
|
},
|
|
859
859
|
{
|
|
860
860
|
type: 'webmcp',
|
|
@@ -867,19 +867,18 @@ export function createRoverAgentCard(config) {
|
|
|
867
867
|
rover: {
|
|
868
868
|
siteId: text(config.siteId, 120) || undefined,
|
|
869
869
|
siteUrl,
|
|
870
|
-
|
|
870
|
+
runEndpoint,
|
|
871
871
|
workflowEndpoint,
|
|
872
872
|
serviceDescUrl,
|
|
873
873
|
roverSiteUrl,
|
|
874
874
|
...(llmsUrl ? { llmsUrl } : {}),
|
|
875
875
|
preferredExecution: config.preferExecution || 'auto',
|
|
876
|
-
|
|
877
|
-
shortcutLaunchEnabled,
|
|
876
|
+
a2wRunsEnabled: publicRunEnabled,
|
|
878
877
|
cloudBrowserAllowed,
|
|
879
878
|
delegatedHandoffs,
|
|
880
879
|
instructions: [
|
|
881
880
|
'Prefer exact Rover shortcuts and explicit site tools over raw DOM automation when the user goal matches a published skill.',
|
|
882
|
-
'Use POST /v1/
|
|
881
|
+
'Use POST /v1/a2w/runs when you need structured A2W progress, continuation input, or a stable final result channel.',
|
|
883
882
|
'Fall back to generic DOM automation only when no matching Rover shortcut or explicit tool exists for the requested outcome.',
|
|
884
883
|
],
|
|
885
884
|
capabilitiesGraph: capabilityGraph.capabilities,
|
|
@@ -912,20 +911,19 @@ export function createRoverSiteProfile(config) {
|
|
|
912
911
|
pages: rover?.pages || [],
|
|
913
912
|
policies: {
|
|
914
913
|
preferredExecution: rover?.preferredExecution || 'auto',
|
|
915
|
-
|
|
916
|
-
shortcutLaunchEnabled: rover?.shortcutLaunchEnabled !== false,
|
|
914
|
+
a2wRunsEnabled: rover?.a2wRunsEnabled !== false,
|
|
917
915
|
cloudBrowserAllowed: rover?.cloudBrowserAllowed !== false,
|
|
918
916
|
delegatedHandoffs: rover?.delegatedHandoffs === true,
|
|
919
917
|
},
|
|
920
918
|
auth: {
|
|
921
|
-
|
|
919
|
+
runEndpoint: rover?.runEndpoint || buildRunEndpoint(config.apiBase),
|
|
922
920
|
workflowEndpoint: rover?.workflowEndpoint || buildWorkflowEndpoint(config.apiBase),
|
|
923
921
|
acceptsHttpMessageSignatures: true,
|
|
924
922
|
supportsUnsignedSelfReportedIdentity: true,
|
|
925
923
|
},
|
|
926
924
|
analytics: {
|
|
927
925
|
layer: 'roverbook',
|
|
928
|
-
|
|
926
|
+
runIdField: 'runId',
|
|
929
927
|
workflowIdField: 'workflowId',
|
|
930
928
|
capabilityIdField: 'capabilityId',
|
|
931
929
|
pageIdField: 'pageId',
|
|
@@ -964,7 +962,8 @@ export function buildRoverAgentDiscoveryPayloads(config) {
|
|
|
964
962
|
};
|
|
965
963
|
const pageManifestJson = JSON.stringify(pageManifest, null, 2);
|
|
966
964
|
const marker = {
|
|
967
|
-
|
|
965
|
+
a2w: card.extensions?.rover.runEndpoint,
|
|
966
|
+
run: card.extensions?.rover.runEndpoint,
|
|
968
967
|
card: serviceDescHref,
|
|
969
968
|
roverSite: roverSiteHref,
|
|
970
969
|
site: card.extensions?.rover.siteUrl,
|