Research @full-self-browsing

Concierge.

The safe action layer for agent-ready web applications.

Typed, consent-gated actions so an AI can operate your web app; without taking over the browser.

▽0.2.1TypeScript-firstESM only · Node >=22.12MIT
Install

Three packages, one release set

Install the core runtime for a framework-neutral integration, then add the matching adapter. Install and upgrade them together so every adapter resolves the same physical core.

Core runtime
$ pnpm add @full-self-browsing/concierge zod
With an adapter
$ pnpm add @full-self-browsing/concierge@^0.2 \ @full-self-browsing/concierge-react@^0.2 zod

Version 0.2.1 is a supported public preview on runtime contract v2. React and Svelte package roots are server-safe; their runtime bindings live in /client and /client.svelte. Edge deployment is not part of the 0.2 support matrix.

Why Concierge

Publish verbs, not a page surface

Generic browser automation reconstructs intent from page structure, selectors, or coordinates. Concierge lets a cooperating application publish the exact verbs an AI may use at the current moment.

Generic browser automation
Concierge
Click selectors or coordinates
Call application-defined verbs
Reconstruct intent from the visible interface
Receive typed schemas and live availability
Inherit broad page authority
See only the current action catalog
Treat confirmation as a boolean
Bind consent to the reviewed payload and state snapshot
Trust a model callback to actuate the browser
Verify a signed, replay-protected batch before dispatch

FSB operates sites that do not cooperate. Concierge is the action layer for applications that do cooperate. The projects address different parts of the agent browsing stack.

How it works

From declaration to structured result

01

The application defines named actions with descriptions, input schemas, availability rules, effect metadata, redaction policy, and handlers.

02

Concierge resolves the active stage and its available actions into one immutable catalog snapshot with an instance-local revision.

03

The model receives only the tools admitted by that snapshot.

04

Concierge validates every requested action again before execution, applies consent and scheduling rules, and rejects stale or conflicting calls.

05

The application bridge performs the approved interface operation and returns a structured result.

Application

Action definitions, live state, interface operations, authentication, and server authorization.

Concierge

Catalog admission, validation, consent, scheduling, deduplication, dispatch, and workflows.

Model integration

Tool presentation, model calls, tool correlation, and result delivery.

Quick start

Declare an action. Resolve one catalog.

Define each action as a named constant, attach it to a stage, and resolve one atomic catalog snapshot for the current application state.

  • Stage, availability, tools, and revision resolve together
  • Only the literal value true admits an action; anything else fails closed
  • The resolved catalog is deeply frozen and never cross-runtime authority
actions/open-project.ts
import { createBridge, createConcierge, defineAction, offPageResult } from "@full-self-browsing/concierge";
import { z } from "zod";

const projectBridge = createBridge<{
  actions: { openProject(id: string): void };
  snapshot: { activeProject(): string | null };
}>("project-ui");

const openProject = defineAction({
  name: "openProject",
  description: "Open one project in the application preview.",
  schema: z.object({ projectId: z.string().min(1).max(64) }).strict(),
  jsonSchema: {
    type: "object",
    properties: { projectId: { type: "string", minLength: 1, maxLength: 64 } },
    required: ["projectId"],
    additionalProperties: false,
  },
  redact: ({ projectId }) => ({ projectId }),
  effects: { readOnly: false, destructive: false, idempotent: true },
  handler: ({ args, bridge }) => {
    if (bridge === null) {
      return offPageResult("Project opening", "project interface");
    }
    bridge.actions.openProject(args.projectId);
    return { ok: true, message: `Opened project ${args.projectId}.` };
  },
});

const concierge = createConcierge({
  stages: [
    {
      id: "projects",
      match: (context) => context.pathname === "/projects",
      actions: [openProject],
      bridge: projectBridge,
    },
  ],
});

const catalog = concierge.resolveCatalog({ pathname: "/projects" });

// → catalog.stage · catalog.revision · catalog.tools   one snapshot
Packages

Core runtime plus framework bindings

The public packages form one fixed release set and share runtime contract v2.

Core@full-self-browsing/concierge

Framework-neutral catalog, dispatch, consent, workflow, telemetry, and transport runtime.

React@full-self-browsing/concierge-react

React context, bridge lifecycle, and optional activity visuals including ConciergeActivityOverlay.

Svelte@full-self-browsing/concierge-svelte

Svelte context, bridge lifecycle, and reactive snapshot normalization.

Node.js>=22.12.0
Module formatESM only
React · React DOM^18.2.0 || ^19.0.0
Svelte^5.0.0
AI SDK core^6.0.0 || ^7.0.0
Runtime contractv2 throughout 0.2.x
Integrations

One instance, several entry points

Mount the same Concierge instance and bridge registry through the appropriate adapter. Getter-based state stays live until Concierge captures a snapshot for validation or consent.

Integration
Runtime entry point
Guidance
Framework-neutral
@full-self-browsing/concierge
Use the core runtime and register the application bridge directly.
React
/concierge-react/client
Provide the core instance, register bridges, and optionally render the activity overlay.
Svelte
/concierge-svelte/client.svelte
Provide the core instance with the Svelte snapshot normalizer and register bridges during initialization.
AI SDK 6 & 7
/concierge/ai-sdk
Convert a resolved catalog into model tools and correlate completed calls.
Signed server bridge
/ai-sdk/server · /ai-sdk/browser
Issue, verify, and dispatch short-lived browser batches bound to the catalog digest.

Raw onToolCall values are display data only. They never actuate the application. The signed bridge verifies the envelope, consumes its replay key, compares it with the live browser catalog, and only then enters core dispatch.

Runtime guarantees

What the runtime holds to

Dispatch outcome

completed
nameopenProject
callIdcall_7f2c · index 0
catalogRevisionstage projects · fresh
consentbound · consumed once
dedupesession · response · callId
onDispatchredacted lifecycle
Action inputs are validated again immediately before execution, and actions with side effects pass through a cancellable commit window.
Exact retries share one Promise and cannot execute twice inside the deduplication window; a changed action, input, turn, or revision returns identity_conflict.
Batches execute in outputIndex order and return explicit completed or terminal outcomes.
Compound actions use core-owned child dispatch, cleanup, delay, and bounded lineage — 16 nested levels and 256 steps per root workflow.
Mixed 0.1 and 0.2 installations fail before bridge registration or dispatch.
Security & privacy

A least-authority boundary, not an authentication system

Security model

Concierge does not authenticate users, and a client consent record is not server authorization. A server that performs a protected effect must independently authenticate the current principal, authorize the exact action and payload under current policy, reject replay, and make the effect idempotent or transactional.

The signed AI bridge authenticates a short-lived server decision to admit one specific browser batch. It does not make model output trustworthy, repair an XSS vulnerability, or turn client state into server authority.

Read SECURITY.md before shipping a consequential integration.

Telemetry

Mounted React and Svelte runtimes send default-on anonymous usage estimates to FSB's aggregate statistics pipeline. Vanilla integrations mount telemetry explicitly through the browser-only /telemetry entry, which also provides status and opt-out APIs.

Telemetry never sends action names, arguments, results, schemas, stages, page URLs, DOM content, application names, or account identifiers. If browser storage is unavailable, telemetry stops without affecting dispatch.

Read the telemetry privacy contract for payload, retention, and erasure.

Let an AI act without handing over the browser

TypeScript-first, ESM-only, MIT-licensed. Published under the @full-self-browsingnpm scope.