@unbrowse/sdk 11.1.1 → 11.1.5

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
@@ -1,227 +1,75 @@
1
1
  # @unbrowse/sdk
2
2
 
3
- TypeScript SDK for Unbrowse — the local agent browser that spawns the `unbrowse` binary and talks to it over a local Unix socket.
3
+ TypeScript client for the Unbrowse 11.1.5 local runtime. It can connect to an
4
+ existing runtime or start the `unbrowse` binary for the lifetime of your process.
4
5
 
5
- > **Sibling package:** [`@unbrowse/client`](../sdk-v2/) is a thin HTTP-first SDK that hits `beta-api.unbrowse.ai` directly, runs in browsers + edge runtimes, has zero runtime deps, and never spawns a binary. Reach for it when you want the HTTP path; reach for this package when you want the **local-binary** path (passive HAR capture against new domains the marketplace hasn't covered yet, fully local execution). Both are supported.
6
+ New applications that do not need process control should use the SDK bundled in
7
+ `unbrowse`:
6
8
 
7
- The SDK auto-spawns the `unbrowse` binary if it isn't already running, so a single `await Unbrowse.local()` is all you need to go from `npm install` to your first resolve.
8
-
9
- > The SDK (this package) is MIT-licensed. The `unbrowse` runtime binary it talks to is distributed via npm. See [`OPEN-SOURCE-NOTICE.md`](../../docs/OPEN-SOURCE-NOTICE.md).
10
-
11
- Current version: **9.13.0**.
9
+ ```ts
10
+ import { Unbrowse } from "unbrowse/sdk";
11
+ ```
12
12
 
13
13
  ## Install
14
14
 
15
15
  ```bash
16
- npm install @unbrowse/sdk
16
+ npm install @unbrowse/sdk unbrowse
17
17
  ```
18
18
 
19
- The SDK ships the spawn path lazily — `Unbrowse.connect()` callers never pull `child_process`, so it stays tree-shakeable in serverless and edge bundles.
20
-
21
- ## Quick start
19
+ ## Start locally
22
20
 
23
21
  ```ts
24
22
  import { Unbrowse } from "@unbrowse/sdk";
25
23
 
26
- const u = await Unbrowse.local();
27
- const r = await u.resolve({ intent: "list tomorrow's events", url: "https://calendar.google.com" });
28
- console.log(r.result);
29
- ```
30
-
31
- That's it — `Unbrowse.local()` probes `127.0.0.1:6969`, connects if a daemon is alive, and spawns the `unbrowse` CLI as a child process if not. The spawned daemon's lifecycle is owned by your process; it shuts down cleanly on exit.
32
-
33
- ## Three factories, three lifecycles
34
-
35
- ```ts
36
- // 1. Common case — probe then spawn. The right answer 95% of the time.
37
- const u = await Unbrowse.local();
38
-
39
- // 2. External daemon already running (Docker, sidecar, dev server).
40
- const u = await Unbrowse.connect("http://localhost:6969");
41
-
42
- // 3. Always spawn fresh — owned lifecycle, useful for tests and isolated workers.
43
- const u = await Unbrowse.spawn({ port: 7969 });
44
- ```
45
-
46
- All three return the same `Unbrowse` client interface. Pass `{ apiKey }` to any factory to override the auto-generated marketplace key.
47
-
48
- ## Resolve and execute
49
-
50
- ```ts
51
- const resolved = await u.resolve({
52
- intent: "get feed posts",
53
- url: "https://news.ycombinator.com",
24
+ const unbrowse = await Unbrowse.local({
25
+ apiKey: process.env.UNBROWSE_API_KEY,
54
26
  });
55
27
 
56
- // Re-run later with explicit projection
57
- const rerun = await u.execute(resolved, { projection: { raw: true } });
58
-
59
- // Or by skill id, with params
60
- const quote = await u.execute("skill_123", { params: { symbol: "NVDA" } });
61
- ```
62
-
63
- ## Payments
64
-
65
- Unbrowse routes monetize on use via [x402](https://www.x402.org). Every paid execute (priced skills, `search`, `resolve` over a priced shortlist) is gated by a `402 Payment Required` flow. The SDK turns that into a typed error you can catch and retry. v6.16 settles on [Faremeter Flex](https://docs.faremeter.xyz/flex/overview) — your wallet signs an off-chain authorization with a session key, the facilitator settles on-chain in batches, and splits to contributors land atomically.
66
-
67
- ```ts
68
- import { Unbrowse, PaymentRequiredError, payAndRetryFlex } from "@unbrowse/sdk";
69
-
70
28
  try {
71
- await u.execute("skill_premium_123", { params: { ticker: "NVDA" } });
72
- } catch (err) {
73
- if (err instanceof PaymentRequiredError) {
74
- await payAndRetryFlex(err, wallet, (header) =>
75
- u.execute(
76
- "skill_premium_123",
77
- { params: { ticker: "NVDA" } },
78
- { headers: { "X-PAYMENT": header } },
79
- ),
80
- ); // signs the Flex authorization, retries with proof attached
81
- }
29
+ const resolved = await unbrowse.resolve({
30
+ intent: "list tomorrow's events",
31
+ url: "https://calendar.google.com",
32
+ });
33
+ console.log(resolved.result);
34
+ } finally {
35
+ await unbrowse.close();
82
36
  }
83
37
  ```
84
38
 
85
- `PaymentRequiredError` is thrown at the HTTP-parser layer and carries `accepts[]` — the canonical x402 terms array. `payAndRetryFlex(error, wallet, retry)` is a free function exported from `@unbrowse/sdk`; it picks `accepts[0]`, has your session key sign it, and calls your `retry(paymentHeader)` to replay the original request with `X-PAYMENT` attached.
39
+ `Unbrowse.local()` reuses a healthy runtime on `127.0.0.1:6969` or starts one
40
+ when necessary. Use `connect(url)` when another process owns the runtime and
41
+ `spawn()` when you always want an isolated child.
86
42
 
87
- For metered routes there's a higher-level helper that handles the catch + retry for you:
43
+ ## Health and public stats
88
44
 
89
45
  ```ts
90
- const result = await u.executeMetered<{ data: string; usage_units: number }>(
91
- "skill_id",
92
- input,
93
- { wallet, onUsage: (units) => console.log("consumed", units, "units") },
94
- );
46
+ const live = await unbrowse.liveness();
47
+ const ready = await unbrowse.readiness();
48
+ const summary = await unbrowse.statsSummary();
49
+ const flywheel = await unbrowse.flywheel();
95
50
  ```
96
51
 
97
- ### Sponsor mode — first calls covered by the platform
98
-
99
- Brand-new agents get a daily allowance of platform-sponsored execute calls before they need to fund a wallet, so creators start earning USDC the moment their captured routes are reused. Sponsored responses include `X-Sponsored: <ledger_id>`.
52
+ `liveness()` answers whether the process is up. `readiness()` includes storage
53
+ dependency state and returns a typed `degraded` response when Cloudflare KV is
54
+ serving as the fallback, rather than throwing on the readiness HTTP 503.
100
55
 
101
- When the daily allowance is exhausted you get `SponsorExhaustedError` — pair a wallet and switch to `payAndRetryFlex`. Opt out per-request by passing `{ headers: { "X-No-Sponsor": "1" } }` if you'd rather pay yourself from the first call.
56
+ ## Credits
102
57
 
103
- Full payment docs and worked examples: [`docs/payments/`](./docs/payments/). Wallet + escrow + session-key setup: [`../../docs/wallets.md`](../../docs/wallets.md).
104
- ### Choosing a payment provider
105
-
106
- The SDK persists your wallet provider so subsequent settles route through it without per-call configuration. Four providers ship as of v6.16:
58
+ Metered work is charged to account credits through the normal account API.
107
59
 
108
60
  ```ts
109
- import type { PaymentProvider } from "@unbrowse/sdk";
110
-
111
- // One-time per account; persists via POST /v1/account/payment-provider
112
- await u.paymentProvider("pay_sh"); // TouchID + USDC via x402 MPP
113
- await u.paymentProvider("lobster_cash"); // Crossmint credit card -> Solana
114
- await u.paymentProvider("privy"); // Embedded wallet bound to Privy session
115
- await u.paymentProvider("external"); // Bring your own Solana signer
61
+ const credits = await unbrowse.credits();
62
+ console.log(credits.balance_uc / 1_000_000);
116
63
  ```
117
64
 
118
- The on-chain split math is identical across providers; the choice only gates the dispatch path. See [`docs/HOW_UNBROWSE_PAYS.md`](../../docs/HOW_UNBROWSE_PAYS.md#payment-provider-choice-paysh--lobstercash--privy--external).
119
-
120
- ## Publishing skills, setting markup, reading earnings
121
-
122
- Captured routes monetize when re-used by other agents. The SDK exposes the full publish-then-earn surface:
65
+ An HTTP 402 becomes `InsufficientCreditsError`. Add credits, then retry the same
66
+ request. Executes retain their normal idempotency behavior.
123
67
 
124
- ```ts
125
- // Publish a captured skill so other agents can resolve + execute it.
126
- // markup_bps is clamped server-side to [500, 8000] (5 to 80 percent platform cut).
127
- const pub = await u.publish({
128
- skill: capturedSkill,
129
- markup_bps: 1500, // optional; defaults to PLATFORM_BPS = 5000 (50%)
130
- });
68
+ ## Authentication
131
69
 
132
- // Annotate an endpoint with extra semantic metadata. Improves the
133
- // ranker's shortlist quality for downstream callers.
134
- await u.annotate({ endpoint_id: "ep_123", description: "Search trending repos by language" });
135
-
136
- // Earnings transparency.
137
- const earnings = await u.dashboard();
138
- const tx = await u.creatorTransactions(agentId);
139
- const attribution = await u.indexerAttribution(indexerId);
140
- ```
70
+ Pass `apiKey` to the constructor/factory or set `UNBROWSE_API_KEY`. Create a key
71
+ with:
141
72
 
142
- The SDK + CLI + MCP surfaces are kept in sync by `tests/cli-mcp-sdk-parity.test.ts`, so any verb available on the CLI is also a method on `Unbrowse` and a tool in the MCP server. See [`docs/HOW_UNBROWSE_PAYS.md#per-skill-markup-5-to-80-percent`](../../docs/HOW_UNBROWSE_PAYS.md) for the markup_bps split math.
143
-
144
- ## Verify the deployed manifest
145
-
146
- The backend serves `GET /v1/version` with a HMAC-signed manifest (`signed_manifest_hash = hex(hmac-sha256(version|build_sha|deployed_at, RELEASE_MANIFEST_SIGNING_SECRET))`). Use `scripts/verify-release-manifest.sh <base-url>` from the unbrowse repo, or recompute via node:crypto / openssl, to confirm the SDK is hitting the artifact CI built and not a tampered intermediary.
147
-
148
-
149
- ## Auth
150
-
151
- ```ts
152
- // Interactive login — opens a real browser window for first-time auth.
153
- await u.login({ url: "https://calendar.google.com" });
154
-
155
- // Or import cookies from your local browser storage.
156
- await u.importAuth({ url: "https://x.com/home", browser: "auto" });
157
- ```
158
-
159
- ## Search
160
-
161
- Three search shapes ship as of v6.16, each tuned for a different agent need:
162
-
163
- ```ts
164
- // 1. Skill-grouped global search — returns SearchHit[] (one row per skill).
165
- // Use when you want the marketplace skill that covers the intent.
166
- const global = await u.search({ intent: "get stock prices", k: 5 });
167
-
168
- // 2. Domain-scoped skill search — same shape, scoped to one host.
169
- const domain = await u.searchDomain({
170
- intent: "find trending repositories",
171
- domain: "github.com",
172
- k: 3,
173
- });
174
-
175
- // 3. Flat endpoint search — returns EndpointSearchHit[] (one row per endpoint
176
- // across the WHOLE marketplace). Use when you want to pick endpoints
177
- // across many skills without an explicit URL. Each hit carries
178
- // endpoint_id + skill_id so you can chain into execute() directly.
179
- const { endpoints } = await u.searchEndpoints({
180
- intent: "search trending repositories",
181
- k: 10,
182
- // domain: "github.com", // optional: scope to one host
183
- });
184
- for (const ep of endpoints) {
185
- console.log(ep.score, ep.skill_id, ep.endpoint_id, ep.description);
186
- }
187
- ```
188
-
189
- `searchEndpoints()` hits `/v1/search/endpoints` and unwraps the canonical
190
- graph-index `metadata.content` server-side so the SDK consumer never has to
191
- `JSON.parse` to reach `skill_id` / `endpoint_id`. Anonymous callers get free
192
- rate-limited public discovery; authenticated agents pay the standard search
193
- fee per the x402 economics in [`HOW_UNBROWSE_PAYS.md`](../../docs/HOW_UNBROWSE_PAYS.md).
194
-
195
-
196
- ## Error handling
197
-
198
- ```ts
199
- import { Unbrowse, UnbrowseApiError } from "@unbrowse/sdk";
200
-
201
- try {
202
- await u.resolve({ intent: "get inbox", url: "https://mail.google.com" });
203
- } catch (err) {
204
- if (err instanceof UnbrowseApiError) {
205
- console.error(err.status, err.path, err.data);
206
- }
207
- throw err;
208
- }
73
+ ```bash
74
+ unbrowse register --email you@example.com
209
75
  ```
210
-
211
- `UnbrowseApiError` is the generic wrapper. `PaymentRequiredError` and `SponsorExhaustedError` are payment-specific subclasses; both expose `accepts[]` so you can introspect what the gate wants.
212
-
213
- ## Notes
214
-
215
- - Default `baseUrl` is `http://localhost:6969`. `Unbrowse.local()` picks this up automatically.
216
- - Default `apiKey` reads from `UNBROWSE_API_KEY` when present.
217
- - `resolve({ url })` maps the URL into both `params.url` and `context.url`, matching the CLI path.
218
- - Response types are strongest on inputs and core trace/skill metadata, lighter on payload bodies, because endpoint payload shape varies by site.
219
-
220
- ## More
221
-
222
- - Complete docs: [`docs/`](./docs/)
223
- - Use case recipes: [`docs/examples/`](./docs/examples/)
224
- - API reference: [`docs/api-reference/`](./docs/api-reference/)
225
- - Payment surface: [`docs/payments/`](./docs/payments/)
226
-
227
- _Audited for public docs + SDK staleness: 2026-05-25_
@@ -0,0 +1,117 @@
1
+ import type { AttributionLedger, AvailableEndpoint, CreatorTransactionsResponse, Dashboard, ExecuteInput, ExecuteResponse, FeedbackInput, FeedbackResponse, HealthResponse, LivenessResponse, StatsSummaryResponse, FlywheelPulse, LoginInput, LoginResponse, RequestOptions, ResolveInput, ResolveResponse, SearchDomainInput, SearchInput, SearchResponse, SearchEndpointsInput, SearchEndpointsResponse, SkillManifest, StatsResponse, StealAuthInput, StealAuthResponse, UnbrowseClientOptions, PublishSkillInput, PublishResponse, AnnotateInput, AnnotateResponse, CreditsBalance } from "./contracts.js";
2
+ import { type SpawnRuntimeOptions } from "./runtime.js";
3
+ export declare class Unbrowse {
4
+ readonly baseUrl: string;
5
+ readonly apiKey?: string;
6
+ readonly clientId?: string;
7
+ private readonly defaultHeaders?;
8
+ private readonly fetchImpl;
9
+ private readonly timeoutMs?;
10
+ private _runtimeHandle;
11
+ constructor(options?: UnbrowseClientOptions);
12
+ /**
13
+ * Build a `params` object from an `AvailableEndpoint.input_params` spec, using
14
+ * the `example_value` of each declared key. Skips keys without an example.
15
+ */
16
+ static paramsFromInputSpec(spec: AvailableEndpoint["input_params"] | undefined): Record<string, unknown>;
17
+ /**
18
+ * Point at an already-running Unbrowse runtime. No probe, no spawn.
19
+ * `.close()` is a no-op for the runtime (the caller owns it).
20
+ */
21
+ static connect(baseUrl: string, opts?: Omit<UnbrowseClientOptions, "baseUrl">): Promise<Unbrowse>;
22
+ /**
23
+ * Spawn a co-located Unbrowse runtime and return a client pointed at it.
24
+ * The client takes ownership of the child process: `.close()` will tear
25
+ * it down.
26
+ */
27
+ static spawn(opts?: SpawnRuntimeOptions & Omit<UnbrowseClientOptions, "baseUrl">): Promise<Unbrowse>;
28
+ /**
29
+ * Probe 127.0.0.1 on the requested port (default 6969). Adopts a live
30
+ * runtime via `connect`; spawns a new one via `spawn` if dead. The
31
+ * resulting client only owns the runtime if it had to spawn.
32
+ */
33
+ static local(opts?: SpawnRuntimeOptions & Omit<UnbrowseClientOptions, "baseUrl">): Promise<Unbrowse>;
34
+ /**
35
+ * Release any resources owned by this client. If the client spawned its
36
+ * own runtime, this kills the child process. Otherwise no-op.
37
+ */
38
+ close(): Promise<void>;
39
+ request<T>(method: string, path: string, body?: unknown, options?: RequestOptions): Promise<T>;
40
+ resolve(input: ResolveInput, options?: RequestOptions): Promise<ResolveResponse>;
41
+ execute(skill: string | ExecuteInput | ResolveResponse, input?: Omit<ExecuteInput, "skillId">, options?: RequestOptions): Promise<ExecuteResponse>;
42
+ getSkill(skillId: string, options?: RequestOptions): Promise<SkillManifest>;
43
+ login(input: LoginInput, options?: RequestOptions): Promise<LoginResponse>;
44
+ importAuth(input: StealAuthInput, options?: RequestOptions): Promise<StealAuthResponse>;
45
+ stealAuth(input: StealAuthInput, options?: RequestOptions): Promise<StealAuthResponse>;
46
+ search(input: SearchInput, options?: RequestOptions): Promise<SearchResponse>;
47
+ searchDomain(input: SearchDomainInput, options?: RequestOptions): Promise<SearchResponse>;
48
+ /**
49
+ * Semantic search across ALL indexed endpoints (flat shape).
50
+ *
51
+ * Returns one row per endpoint, ranked by semantic match against the
52
+ * intent string. Use this when you want to pick endpoints across many
53
+ * skills (vs `search()` which groups by skill).
54
+ *
55
+ * Optional `domain` scopes the search to one host's endpoints; omit for
56
+ * cross-marketplace search. Authenticated agents are charged the
57
+ * standard credit cost; anonymous
58
+ * callers get free rate-limited public discovery.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * const { endpoints } = await u.searchEndpoints({ intent: "trending repositories", k: 5 });
63
+ * for (const ep of endpoints) {
64
+ * console.log(ep.score, ep.skill_id, ep.endpoint_id, ep.description);
65
+ * }
66
+ * ```
67
+ */
68
+ searchEndpoints(input: SearchEndpointsInput, options?: RequestOptions): Promise<SearchEndpointsResponse>;
69
+ feedback(input: FeedbackInput, options?: RequestOptions): Promise<FeedbackResponse>;
70
+ stats(options?: RequestOptions): Promise<StatsResponse>;
71
+ health(options?: RequestOptions): Promise<HealthResponse>;
72
+ /** Process liveness only. Use this for uptime checks. */
73
+ liveness(options?: RequestOptions): Promise<LivenessResponse>;
74
+ /**
75
+ * Dependency-aware readiness. A 503 degraded response is returned as typed
76
+ * data instead of thrown, so callers can inspect the active fallback.
77
+ */
78
+ readiness(options?: RequestOptions): Promise<HealthResponse>;
79
+ /** Public marketplace and performance counters. */
80
+ statsSummary(options?: RequestOptions): Promise<StatsSummaryResponse>;
81
+ /** Cached marketplace flywheel pulse. */
82
+ flywheel(options?: RequestOptions): Promise<FlywheelPulse>;
83
+ /**
84
+ * Earnings/spending dashboard for the authenticated agent.
85
+ * Requires `apiKey` set on the client. Backend: `GET /v1/dashboard/me`.
86
+ */
87
+ dashboard(options?: RequestOptions): Promise<Dashboard>;
88
+ /** Current account credit balance and usage ledger. */
89
+ credits(options?: RequestOptions): Promise<CreditsBalance>;
90
+ /**
91
+ * Per-transaction earnings ledger for a creator agent.
92
+ * Backend: `GET /v1/transactions/creator/:agentId`.
93
+ */
94
+ creatorTransactions(agentId: string, options?: RequestOptions): Promise<CreatorTransactionsResponse>;
95
+ /**
96
+ * Indexer earnings via delta-based attribution.
97
+ * Backend: `GET /v1/attribution/indexer/:indexerId`.
98
+ */
99
+ indexerAttribution(indexerId: string, options?: RequestOptions): Promise<AttributionLedger>;
100
+ /**
101
+ * Publish a captured skill to the marketplace.
102
+ * Backend: `POST /v1/skills`.
103
+ *
104
+ * SDK gap-fill (Wave 2 of rebuild-the-unbrowse-sdk-as-a-thin-http-first-ty
105
+ * + the parity gate from tests/cli-mcp-sdk-parity.test.ts). Mirrors the
106
+ * CLI `unbrowse publish` and the MCP `unbrowse_publish` tool.
107
+ */
108
+ publish(skill: PublishSkillInput, options?: RequestOptions): Promise<PublishResponse>;
109
+ /**
110
+ * Annotate an endpoint with a tip, constraint, or gotcha.
111
+ * Backend: `POST /v1/skills/:id/endpoints/:eid/annotate`.
112
+ *
113
+ * SDK gap-fill. Mirrors CLI `unbrowse annotate` + MCP `unbrowse_annotate`.
114
+ */
115
+ annotate(input: AnnotateInput, options?: RequestOptions): Promise<AnnotateResponse>;
116
+ }
117
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}