@rtrvr-ai/rover 4.1.0 → 4.2.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/README.md CHANGED
@@ -514,10 +514,17 @@ const RoverWidget = dynamic(() => import('./RoverWidget'), { ssr: false });
514
514
  | `ui.thoughtStyle` | `'concise_cards' \| 'minimal'` | `'concise_cards'` | Thought rendering style |
515
515
  | `ui.panel.resizable` | `boolean` | `true` | Enables desktop freeform resizing plus phone/tablet snap-height resizing with per-device memory |
516
516
  | `ui.showTaskControls` | `boolean` | `true` | Show new/end task controls |
517
- | `ui.shortcuts` | `RoverShortcut[]` | `[]` | Suggested journeys (max 100 stored, max 12 rendered by default; lower site-key policy caps are enforced). Shortcuts can also publish agent-facing metadata such as `tags`, `examples`, `inputSchema`, `outputSchema`, `sideEffect`, and `requiresConfirmation`. |
517
+ | `ui.shortcuts` | `RoverShortcut[]` | `[]` | Suggested journeys (max 100 stored, max 12 rendered by default; lower site-key policy caps are enforced). Set `runKind: 'guide'` for onboarding/demo journeys that should narrate under the guided default. Shortcuts can also publish agent-facing metadata such as `tags`, `examples`, `inputSchema`, `outputSchema`, `sideEffect`, and `requiresConfirmation`. |
518
518
  | `cloudSandboxEnabled` | `boolean` | `false` | Owner-facing shorthand for cloud execution plus approved third-party browsing. When `true`, Rover materializes `tools.web.enableExternalWebContext=true` and `tools.web.scrapeMode='on_demand'`. |
519
519
  | `ui.greeting` | `{ text?, delay?, duration?, disabled? }` | — | Greeting bubble config (`{name}` token supported) |
520
520
  | `ui.voice` | `{ enabled?: boolean; language?: string; autoStopMs?: number }` | — | Browser dictation for supported Chromium browsers. Rover fills the draft live, waits for post-speech silence before stopping, and the user still sends manually. |
521
+ | `ui.experience.audio.narration.enabled` | `boolean` | `true` | Owner gate for Web Speech step narration. Visitors get a site-scoped speaker toggle when supported. |
522
+ | `ui.experience.audio.narration.defaultMode` | `'guided' \| 'always' \| 'off'` | `'guided'` | Speak guided/demo runs by default, every run, or stay off unless the visitor enables it. |
523
+ | `ui.experience.audio.narration.rate` | `number` | `1` | Web Speech playback rate, clamped to `0.85`-`1.15`. |
524
+ | `ui.experience.audio.narration.language` | `string` | `'en-US'` | Preferred narration language for voice matching. |
525
+ | `ui.experience.audio.narration.voicePreference` | `'auto' \| 'system' \| 'natural'` | `'auto'` | Voice matching preference; `natural` prefers higher-quality browser voices when available. |
526
+ | `ui.experience.motion.actionSpotlight` | `boolean` | `true` | Highlights the element Rover is clicking, typing into, selecting, or scrolling to. |
527
+ | `ui.experience.motion.actionSpotlightColor` | `"#RRGGBB"` | `"#FF4C00"` | Ring and glow color for Action Spotlight. |
521
528
 
522
529
  ### Web Tools
523
530
 
@@ -530,7 +537,7 @@ const RoverWidget = dynamic(() => import('./RoverWidget'), { ssr: false });
530
537
  | `tools.web.denyDomains` | `string[]` | `[]` | External context denylist |
531
538
  | `tools.client` | `ClientToolDefinition[]` | `[]` | Runtime-registered client tools. Tool definitions can include `title`, `outputSchema`, and `annotations` (`whenToUse`, `whyUse`, `examples`, `sideEffect`, `requiresConfirmation`) to improve model tool selection and discovery-card quality. |
532
539
  | `agentDiscovery` | `{ enabled?, siteName?, description?, version?, siteUrl?, agentCardUrl?, roverSiteUrl?, llmsUrl?, hostSurfaceSelector?, preferExecution?, discoverySurface?, additionalSkills? }` | — | Optional overrides for Rover's generated discovery surfaces. `rover-site.json` is the authoritative rich profile, `agent-card.json` is the interop card, and `discoverySurface.beaconLabel` now feeds the visible seed/presence CTA text in production. Legacy `visibleCue` / `visibleCueLabel` remain compatibility inputs only. |
533
- | `pageConfig` | `RoverPageCaptureConfig` | | Optional per-site page-capture overrides such as `disableAutoScroll`, settle timing, and sparse-tree retry settings |
540
+ | `pageConfig` | `RoverPageCaptureConfig` | `{ disableAutoScroll: true }` for generated installs | Optional per-site page-capture overrides such as `disableAutoScroll`, settle timing, and sparse-tree retry settings. Set `disableAutoScroll: false` only when automatic page-capture scrolling is desired. |
534
541
 
535
542
  ### AI-Callable URLs (Deep Links)
536
543
 
@@ -588,13 +595,13 @@ Content-Type: application/json
588
595
 
589
596
  {
590
597
  "url": "https://www.rtrvr.ai",
591
- "goal": "Get me the latest blog post",
598
+ "prompt": "Get me the latest blog post",
592
599
  "capabilityId": "latest_blog_post",
593
600
  "accept": { "modes": ["text", "json"] }
594
601
  }
595
602
  ```
596
603
 
597
- Use the explicit A2W run envelope with `goal` for natural-language instructions and `shortcut` for saved journeys.
604
+ Use the explicit A2W run envelope with `prompt` for natural-language instructions and `shortcutId` for saved journeys. `goal` is still accepted as a compatibility alias.
598
605
 
599
606
  Callers may also provide structured visiting-agent metadata:
600
607
 
@@ -604,7 +611,7 @@ Content-Type: application/json
604
611
 
605
612
  {
606
613
  "url": "https://www.rtrvr.ai",
607
- "goal": "Get me the latest blog post",
614
+ "prompt": "Get me the latest blog post",
608
615
  "agent": {
609
616
  "key": "gpt-5.4-demo-agent",
610
617
  "name": "GPT-5.4 Demo Agent",
@@ -627,6 +634,8 @@ The returned run URL is the canonical resource:
627
634
  - `DELETE` to cancel
628
635
  - a `workflow` URL when the run belongs to an aggregated multi-site workflow
629
636
 
637
+ Run creation may return `202 Accepted` before work is complete. The payload includes `links.poll`, `links.stream`, `links.ndjson`, `terminalStatuses`, `interactiveStatuses`, and `retryAfterMs` so outside agents can keep following the run without guessing.
638
+
630
639
  Run creation may also return browser handoff URLs:
631
640
 
632
641
  - `open`: clean receipt URL for browser attach
@@ -635,7 +644,7 @@ Run creation may also return browser handoff URLs:
635
644
  The run URL remains canonical; receipt links are only a browser handoff layer over that same run.
636
645
 
637
646
  - `Prefer: execution=browser` keeps execution browser-first
638
- - `Prefer: execution=cloud` is the explicit browserless path today
647
+ - `Prefer: execution=cloud, wait=10` is the explicit browserless path for callers that want a short initial wait before following the returned links
639
648
  - `Prefer: execution=auto` prefers browser attach first; delayed cloud auto-promotion is a follow-up robustness phase
640
649
 
641
650
  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.
@@ -645,12 +654,13 @@ Rover deep links like `?rover=` and `?rover_shortcut=` remain the simple browser
645
654
  Rover normalizes visiting-agent attribution in this order:
646
655
 
647
656
  1. verified signed signal
648
- 2. explicit `agent` object on A2W run creation or handoffs
649
- 3. heuristic headers such as `User-Agent`, `Signature-Agent`, `Signature`, `Signature-Input`, and `X-RTRVR-Client-Id`
650
- 4. advanced local fallbacks such as RoverBook `identityResolver`
651
- 5. anonymous fallback
657
+ 2. Signature-Agent directory/signature-envelope evidence without full request verification
658
+ 3. explicit `agent` object on A2W run creation or handoffs
659
+ 4. heuristic headers such as `User-Agent`, `Signature-Agent`, `Signature`, `Signature-Input`, and `X-RTRVR-Client-Id`
660
+ 5. advanced local fallbacks such as RoverBook `identityResolver`
661
+ 6. anonymous fallback
652
662
 
653
- Trust tiers are `verified_signed`, `signed_directory_only`, `self_reported`, `heuristic`, and `anonymous`. Unsigned headers never escalate above `heuristic`.
663
+ Trust tiers are `verified_signed`, `signed_directory_only`, `self_reported`, `heuristic`, and `anonymous`. The stored `agentKey` is chosen from explicit agent key fields first, then `clientId`, then `Signature-Agent`, then previous attribution. `signed_directory_only` means the chosen identity had Signature-Agent directory/signature-envelope evidence, but no completed HTTP Message Signature verification. Loose headers without that evidence remain `heuristic`.
654
664
 
655
665
  ### Cross-site workflows and handoffs
656
666
 
@@ -63,6 +63,7 @@ export type RoverPublicSkillDefinition = {
63
63
  shortcutId?: string;
64
64
  prompt?: string;
65
65
  routing?: 'auto' | 'act' | 'planner';
66
+ runKind?: 'guide' | 'task';
66
67
  toolName?: string;
67
68
  run?: {
68
69
  endpoint: string;
@@ -414,7 +414,7 @@ function normalizeAnnotations(value) {
414
414
  requiresConfirmation: typeof annotations.requiresConfirmation === 'boolean'
415
415
  ? annotations.requiresConfirmation
416
416
  : undefined,
417
- preferredInterface: annotations.preferredInterface === 'task'
417
+ preferredInterface: annotations.preferredInterface === 'run'
418
418
  || annotations.preferredInterface === 'shortcut'
419
419
  || annotations.preferredInterface === 'client_tool'
420
420
  || annotations.preferredInterface === 'webmcp'
@@ -472,6 +472,7 @@ function normalizePublishedShortcut(shortcut) {
472
472
  prompt,
473
473
  ...(description ? { description } : {}),
474
474
  ...(shortcut.routing ? { routing: shortcut.routing } : {}),
475
+ ...(shortcut.runKind === 'guide' || shortcut.runKind === 'task' ? { runKind: shortcut.runKind } : {}),
475
476
  };
476
477
  }
477
478
  function buildShortcutSkill(shortcut, config, runEndpoint) {
@@ -518,12 +519,13 @@ function buildShortcutSkill(shortcut, config, runEndpoint) {
518
519
  shortcutId: id,
519
520
  prompt,
520
521
  routing: shortcut.routing,
522
+ runKind: shortcut.runKind,
521
523
  deepLink: buildDeepLink(config.siteUrl, id),
522
524
  run: {
523
525
  endpoint: runEndpoint,
524
526
  payload: {
525
527
  url: normalizeSiteUrl(config.siteUrl),
526
- shortcut: id,
528
+ shortcutId: id,
527
529
  },
528
530
  preferExecution: config.preferExecution || 'auto',
529
531
  },
@@ -879,6 +881,7 @@ export function createRoverAgentCard(config) {
879
881
  instructions: [
880
882
  'Prefer exact Rover shortcuts and explicit site tools over raw DOM automation when the user goal matches a published skill.',
881
883
  'Use POST /v1/a2w/runs when you need structured A2W progress, continuation input, or a stable final result channel.',
884
+ 'For browserless calls, send Prefer: execution=cloud, wait=10 and follow links.stream, links.ndjson, or links.poll until terminal or input_required.',
882
885
  'Fall back to generic DOM automation only when no matching Rover shortcut or explicit tool exists for the requested outcome.',
883
886
  ],
884
887
  capabilitiesGraph: capabilityGraph.capabilities,
@@ -1025,15 +1028,15 @@ export function createRoverAgentDiscoveryTags(config) {
1025
1028
  const escapedRoverSiteJson = escapeScriptJson(roverSiteJson);
1026
1029
  const escapedPageManifestJson = escapeScriptJson(pageManifestJson);
1027
1030
  const lines = [
1028
- `<script type="application/agent+json">${markerJson}</script>`,
1029
- `<link rel="service-desc" href="${escapeHtmlAttr(serviceDescHref)}" type="application/json" />`,
1031
+ `<script type="application/agent+json" data-rover-agent-discovery="marker">${markerJson}</script>`,
1032
+ `<link rel="service-desc" href="${escapeHtmlAttr(serviceDescHref)}" type="application/json" data-rover-agent-discovery="service-desc" />`,
1030
1033
  ];
1031
1034
  if (llmsUrl) {
1032
- lines.push(`<link rel="service-doc" href="${escapeHtmlAttr(llmsUrl)}" type="text/markdown" />`);
1035
+ lines.push(`<link rel="service-doc" href="${escapeHtmlAttr(llmsUrl)}" type="text/markdown" data-rover-agent-discovery="service-doc" />`);
1033
1036
  }
1034
- lines.push(`<script type="application/rover-site+json">${escapedRoverSiteJson}</script>`);
1035
- lines.push(`<script type="application/rover-page+json">${escapedPageManifestJson}</script>`);
1036
- lines.push(`<script type="application/agent-card+json">${escapedCardJson}</script>`);
1037
+ lines.push(`<script type="application/rover-site+json" data-rover-agent-discovery="rover-site">${escapedRoverSiteJson}</script>`);
1038
+ lines.push(`<script type="application/rover-page+json" data-rover-agent-discovery="page">${escapedPageManifestJson}</script>`);
1039
+ lines.push(`<script type="application/agent-card+json" data-rover-agent-discovery="agent-card">${escapedCardJson}</script>`);
1037
1040
  return lines.join('\n');
1038
1041
  }
1039
1042
  export { createRoverAgentDiscoverySnapshot };