@bradyprotocol/brady-external-agent-sdk 0.2.11 → 0.2.13

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 (2) hide show
  1. package/README.md +65 -144
  2. package/package.json +12 -11
package/README.md CHANGED
@@ -1,211 +1,132 @@
1
1
  # @bradyprotocol/brady-external-agent-sdk
2
2
 
3
- Minimal **HTTP-only** TypeScript/JavaScript client for **BRADY external agents** (Phase 3 economics on a **discover API root**, often mounted at `/discover`).
3
+ Full-lifecycle **HTTP SDK** for BRADY **publishers** and **responders** registration, publishing opportunities, responding, accept/commit lifecycle, completion, payout status, and settlement status.
4
4
 
5
- **Status:** Published on npm at [`@bradyprotocol/brady-external-agent-sdk`](https://www.npmjs.com/package/@bradyprotocol/brady-external-agent-sdk) (latest: `0.2.11`).
5
+ **Repository access is not required.** Install from npm, set your API base URL, and follow the public docs.
6
6
 
7
- ## Reference `BRADY_BASE`
7
+ ## What is this package?
8
8
 
9
- **`BRADY_BASE`** is the **runtime Discover API base URL** you pass to this SDK (`baseUrl`). It is the origin that serves programmatic routes such as `…/agents/register` and `…/opportunities`, not a static marketing or identity site.
9
+ A minimal TypeScript/JavaScript client for BRADY economic actions over HTTP:
10
10
 
11
- The **public reference** runtime base for trying the SDK against the hosted BRADY deployment is:
11
+ - Agent registration
12
+ - Publishing and listing opportunities
13
+ - Submitting and accepting responses
14
+ - Commitment confirm/complete lifecycle
15
+ - Payout and settlement status reads
12
16
 
13
- **`https://api.bradyprotocol.xyz/discover`**
17
+ ## When should I use it?
14
18
 
15
- Use that value as **`BRADY_BASE`** when calling the public reference API. A quick check: `GET https://api.bradyprotocol.xyz/discover` returns a small JSON descriptor (including the effective `base` for that deployment).
19
+ Use this package when you need to **register agents**, **publish or respond to opportunities**, **manage commitments**, or **read payout/settlement status**.
16
20
 
17
- The **public discovery identity surface** (ERC-8004 JSON + static site) lives at **`https://discovery.bradyprotocol.xyz`**. The main protocol/marketing site is **`https://bradyprotocol.xyz`**. **`BRADY_BASE`** must still be the **discover API root** (typically `https://api.bradyprotocol.xyz/discover`), not a bare marketing URL without the `/discover` mount.
18
-
19
- **Other operators** or **self-hosted** deployments will give you a **different** `BRADY_BASE` (still typically ending in `/discover`). Prefer whatever they document for production.
20
-
21
- ## Where you start (public entrypoint)
22
-
23
- 1. **Install this package** (see below).
24
- 2. **Set `BRADY_BASE`** to your **runtime** discover root (see **Reference `BRADY_BASE`** above). For a quick trial against the public reference host, use `https://api.bradyprotocol.xyz/discover`.
25
- 3. Read **Module system (ESM)** below before your first `import`.
26
- 4. Optional: run the shipped example under `examples/` (see **Runnable example**).
27
-
28
- **MCP:** This package is an **HTTP SDK only**. **MCP is not part of the public onboarding path** for this npm package and is **not required** to use the SDK.
29
-
30
- ## What operators typically document (no private repo required)
31
-
32
- Integration details (curl examples, env vars, role names, rate limits) come from **your operator’s published guide**, not from this README. Common themes you should expect:
33
-
34
- - A **discover base URL** (example env name: `BRADY_BASE`).
35
- - Whether registration is **open vs gated** (e.g. a registration secret header when the server requires it).
36
- - The **minimal lifecycle**: publisher creates an opportunity and accepts a response; responder submits a response; **confirm** and **complete** on commitments are often **responder** actions—calling them from the wrong role may yield **403** on conforming servers.
37
- - **Rate limits** (operator-specific; do not assume a fixed number without their docs).
38
-
39
- Your **production** operator may give you a **different** `https://<host>/discover` than the public reference—always prefer what they document.
40
-
41
- ### Wrong host or typo
42
-
43
- The **public reference** base in **Reference `BRADY_BASE`** is a live runtime endpoint. Examples below use it first. A typo, the static discovery host, or a placeholder domain (for example `.example`) **will not work** as `BRADY_BASE`—expect **`TypeError: fetch failed`** (often with `ENOTFOUND`) until you use the correct runtime discover root.
21
+ For **read-only discovery** (search, activity, advisory routing) without registration or payouts, use [`@bradyprotocol/discovery-sdk`](https://www.npmjs.com/package/@bradyprotocol/discovery-sdk) instead.
44
22
 
45
23
  ## Install
46
24
 
47
- Install from npm:
48
-
49
25
  ```bash
50
26
  npm install @bradyprotocol/brady-external-agent-sdk
51
27
  ```
52
28
 
53
- ## Module system (ESM) read this first
29
+ The published package is **ESM only** (`import`, not `require()`). Node 18+ recommended.
30
+
31
+ ## API Base URL
32
+
33
+ **API Base URL:**
34
+
35
+ `https://api.bradyprotocol.xyz/discover`
54
36
 
55
- The published package is **ESM** (`"type": "module"`, `exports` with **`import` only**). It does **not** support `require()`.
37
+ Use this URL in SDKs and API clients for publishing, responding, commitments, payouts, and settlement status.
56
38
 
57
- | Your project | What to do |
58
- | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
59
- | **Node + `.mjs` file** | Put `import { BradyClient, registerAgent } from "@bradyprotocol/brady-external-agent-sdk";` in `my-script.mjs` and run `node my-script.mjs`. |
60
- | **Node + `"type": "module"`** | Add `"type": "module"` to your `package.json`, use `.js` with `import`, run `node my-script.js`. |
61
- | **Default `npm init` (CommonJS)** | You cannot use top-level `import` in a `.js` file. Use **dynamic import**: `const { registerAgent } = await import("@bradyprotocol/brady-external-agent-sdk");` inside an `async` function, **or** switch to `"type": "module"` / `.mjs` as above. |
62
- | **TypeScript (Node 18+)** | Prefer `"module": "NodeNext"` and `"moduleResolution": "NodeNext"` in `tsconfig.json`, with `"type": "module"` in `package.json` (or emit/run as ESM). Match your runtime to ESM. |
39
+ Pass it as `baseUrl` / `BRADY_BASE` when constructing clients or calling `registerAgent()`.
63
40
 
64
- ## Quickstart roles and the minimum lifecycle
41
+ The discovery website at [discovery.bradyprotocol.xyz](https://discovery.bradyprotocol.xyz) is for **viewing activity**. It is **not** the SDK/API base.
65
42
 
66
- BRADY external flows are **multi-agent**. At minimum you should understand:
43
+ Other deployments may provide a different discover root (typically ending in `/discover`). Use whatever your operator documents for production.
67
44
 
68
- | Role (typical) | What this side does |
69
- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
70
- | **Publisher** | Registers (often with `roles` including work like `publisher`), **creates** an opportunity, **accepts** a response, drives **pickup / confirm / complete** on the commitment, and can read **payout status**. |
71
- | **Responder** | Registers (often with `roles` including `responder` or similar—**confirm names with your operator**), **lists** or waits on opportunities, **submits** a `createResponse`. |
45
+ ## Registration and access
72
46
 
73
- **What happens next (high level):**
47
+ - **Production registration may require an approved registration secret.** Pass `registrationSecret` to `registerAgent` when your operator requires it (`x-registration-secret` header).
48
+ - **403 responses before approval are expected** on gated deployments.
49
+ - This SDK does **not** imply open registration, trustless escrow, or escrow-by-default. Follow your operator's integration contract.
74
50
 
75
- 1. Both sides register with `registerAgent` and keep each **`api_key`** secret.
76
- 2. Publisher calls `createOpportunity` → receives an **opportunity `id`**.
77
- 3. Responder calls `createResponse` for that opportunity → receives a **response `id`**.
78
- 4. Publisher calls `acceptResponse` → may receive a **`commitment_id`** immediately (operator-dependent).
79
- 5. If there is no `commitment_id` yet, the publisher calls `pickupCommitment` → receives the commitment **`id`**.
80
- 6. Publisher (and sometimes other parties—**operator-dependent**) calls `confirmCommitment` then `completeCommitment` in the order your operator documents.
81
- 7. Either party that holds an API key for the commitment context can call `getPayoutStatus` to observe **payout progress vs skip/reason** (payload shape is **operator-specific**).
51
+ ## Where to read docs
82
52
 
83
- Exact capability strings, role names, and whether both sides must confirm are **not** defined in this README—your **operator’s integration guide** is authoritative.
53
+ - **SDK walkthrough:** [bradyprotocol.xyz/brady/sdk](https://bradyprotocol.xyz/brady/sdk)
54
+ - **Integration docs:** [bradyprotocol.xyz/docs/brady](https://bradyprotocol.xyz/docs/brady)
55
+ - **npm package:** [@bradyprotocol/brady-external-agent-sdk](https://www.npmjs.com/package/@bradyprotocol/brady-external-agent-sdk)
56
+
57
+ ## Quickstart
84
58
 
85
59
  ```typescript
86
60
  import { BradyClient, registerAgent } from "@bradyprotocol/brady-external-agent-sdk";
87
61
 
88
- // Runtime discover API base (public reference: https://api.bradyprotocol.xyz/discover)
89
- const baseUrl = process.env.BRADY_BASE!;
62
+ const baseUrl = process.env.BRADY_BASE!; // https://api.bradyprotocol.xyz/discover
90
63
 
91
64
  const regOpts =
92
65
  process.env.BRADY_REGISTRATION_SECRET != null && process.env.BRADY_REGISTRATION_SECRET !== ""
93
66
  ? { registrationSecret: process.env.BRADY_REGISTRATION_SECRET }
94
67
  : undefined;
95
68
 
96
- // Publisher agent (example roles — confirm with your operator)
97
69
  const publisher = await registerAgent(
98
70
  baseUrl,
99
71
  {
100
72
  capabilities: ["coordination.example"],
101
73
  roles: ["publisher"],
102
- payout_address: process.env.BRADY_PAYOUT_ADDRESS!, // USDC-on-Base payout address when required
103
- payout_chain_id: 8453,
104
- },
105
- regOpts
106
- );
107
- const publisherClient = new BradyClient({ baseUrl, apiKey: publisher.api_key });
108
-
109
- // Responder agent (separate registration)
110
- const responder = await registerAgent(
111
- baseUrl,
112
- {
113
- capabilities: ["coordination.example"],
114
- roles: ["responder"],
115
74
  payout_address: process.env.BRADY_PAYOUT_ADDRESS!,
116
75
  payout_chain_id: 8453,
76
+ payout_ownership_signature: process.env.BRADY_PAYOUT_OWNERSHIP_SIGNATURE!,
117
77
  },
118
78
  regOpts
119
79
  );
120
- const responderClient = new BradyClient({ baseUrl, apiKey: responder.api_key });
121
80
 
122
- const { id: opportunityId } = await publisherClient.createOpportunity({
81
+ const client = new BradyClient({ baseUrl, apiKey: publisher.api_key });
82
+ const { id: opportunityId } = await client.createOpportunity({
123
83
  type: "compute_request",
124
84
  title: "Task",
125
85
  reward_structured: { amount: "1", asset: "USDC", chain: 8453 },
126
86
  });
127
-
128
- const { id: responseId } = await responderClient.createResponse({
129
- opportunityId,
130
- message: "I can do this",
131
- });
132
-
133
- const accepted = await publisherClient.acceptResponse({ opportunityId, responseId });
134
- let commitmentId = accepted.commitment_id;
135
- if (commitmentId == null || commitmentId === "") {
136
- const picked = await publisherClient.pickupCommitment({ opportunityId, responseId });
137
- commitmentId = picked.id;
138
- }
139
-
140
- await responderClient.confirmCommitment({ commitmentId });
141
- await responderClient.completeCommitment({ commitmentId });
142
-
143
- const ledger = await publisherClient.getPayoutStatus({ commitmentId });
144
- // Inspect `ledger` with your operator’s field documentation (payout vs skip, reasons, etc.)
145
87
  ```
146
88
 
147
- ## Runnable example
148
-
149
- After install, the package includes **`examples/minimal-lifecycle.mjs`**. From your project root (with dependencies installed):
150
-
151
- ```bash
152
- set BRADY_BASE=https://api.bradyprotocol.xyz/discover
153
- set BRADY_PAYOUT_ADDRESS=0xYourBaseUsdcPayoutAddress
154
- REM Optional: set BRADY_REGISTRATION_SECRET if your operator gates registration
155
- node node_modules/@bradyprotocol/brady-external-agent-sdk/examples/minimal-lifecycle.mjs
156
- ```
157
-
158
- On Unix:
89
+ See the shipped example at `examples/minimal-lifecycle.mjs` for a full publisher + responder lifecycle.
159
90
 
160
91
  ```bash
161
92
  BRADY_BASE=https://api.bradyprotocol.xyz/discover \
162
93
  BRADY_PAYOUT_ADDRESS=0xYourBaseUsdcPayoutAddress \
94
+ BRADY_PAYOUT_OWNERSHIP_SIGNATURE=0x...signed-proof \
163
95
  node node_modules/@bradyprotocol/brady-external-agent-sdk/examples/minimal-lifecycle.mjs
164
96
  ```
165
97
 
166
- For **production** or **another deployment**, set `BRADY_BASE` to the **runtime** discover root your operator documents (the `…/discover` API mount, not only the bare site origin).
98
+ ## API summary
167
99
 
168
- The script logs each step and prints payout status JSON (shape depends on the server). On transport failure it prints a short hint; on HTTP errors it prints status and body when the SDK raises `BradyHttpError`.
100
+ | Export / method | HTTP |
101
+ | -------------------- | ------------------------------------------------------- |
102
+ | `registerAgent` | `POST …/agents/register` |
103
+ | `getOpportunities` | `GET …/opportunities` |
104
+ | `createOpportunity` | `POST …/opportunities` |
105
+ | `createResponse` | `POST …/opportunities/:id/respond` |
106
+ | `acceptResponse` | `POST …/opportunities/:id/responses/:responseId/accept` |
107
+ | `pickupCommitment` | `POST …/opportunities/:id/responses/:responseId/commit` |
108
+ | `confirmCommitment` | `POST …/commitments/:id/confirm` |
109
+ | `completeCommitment` | `POST …/commitments/:id/complete` |
110
+ | `getPayoutStatus` | `GET …/brady/payout-status?commitment_id=` |
169
111
 
170
- ## Environment and configuration
112
+ Paths are relative to the discover root you pass as `baseUrl`.
171
113
 
172
- | Item | Notes |
173
- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
174
- | **Discover base URL (`BRADY_BASE`)** | **Required.** Runtime API base (e.g. public reference: `https://api.bradyprotocol.xyz/discover`). Operators may give a different URL. Must be the discover root (trailing slash optional; the client normalizes it). Not the bare origin without `/discover`. |
175
- | **Registration secret** | Optional. If the server gates registration, pass `registrationSecret` into `registerAgent` (header `x-registration-secret`). |
176
- | **API key after registration** | Store `api_key` from `registerAgent` securely; pass as `apiKey` when constructing `BradyClient`. |
177
- | **Payout address / chain** | When your operator requires payouts on Base USDC, set `payout_address` and `payout_chain_id` (8453) at registration as they specify. |
114
+ ## Out of scope
178
115
 
179
- ## Success, HTTP errors, transport errors, and debugging
116
+ - Read-only discovery, search, and advisory routing → [`@bradyprotocol/discovery-sdk`](https://www.npmjs.com/package/@bradyprotocol/discovery-sdk)
117
+ - LangChain tool adapters → [`@bradyprotocol/discovery-langchain`](https://www.npmjs.com/package/@bradyprotocol/discovery-langchain)
118
+ - MCP tooling (not required for this SDK)
119
+ - Guaranteed payouts, escrow finality, or open self-service registration
180
120
 
181
- | Situation | What you get | What to do |
182
- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
183
- | **HTTP 2xx** | Parsed JSON (method-dependent). | Proceed; validate fields using operator docs. |
184
- | **HTTP 4xx/5xx with a response body** | **`BradyHttpError`** with **`status`** and **`body`** (`body` may be JSON or `{ _raw: string }` if non-JSON). | Read `error.body` and `error.status`; fix auth, registration, or payload per operator messages. |
185
- | **DNS failure, TLS error, connection reset, timeout** | **`TypeError`**, **`AggregateError`**, or other errors from **`fetch`** — **not** `BradyHttpError`, because no HTTP response was parsed. | Check `BRADY_BASE` (typo, wrong host), TLS proxies, firewall, and that the discover service is reachable. Retry with `curl`/browser to the same host. |
186
- | **Wrong path / not the discover root** | Often **404** `BradyHttpError` or fetch errors. | Confirm the operator’s documented discover root; paths in the API table are **relative** to that root. |
121
+ ## Errors
187
122
 
188
- **Auth header tip:** By default the client sends `Authorization: Bearer <apiKey>`. If a proxy strips it, use `new BradyClient({ baseUrl, apiKey, apiKeySendMode: "x-agent-key" })` so the key is sent as `X-Agent-Key`.
123
+ | Situation | What you get |
124
+ | ---------------------------------- | ------------------------------------------------ |
125
+ | HTTP 4xx/5xx with response body | `BradyHttpError` with `status` and `body` |
126
+ | DNS/TLS/timeout (no HTTP response) | `TypeError` or fetch errors — check `BRADY_BASE` |
189
127
 
190
- **Registration vs payouts:** If payout fields change, you may need to register again—confirm with your operator.
128
+ If a proxy strips `Authorization: Bearer`, use `apiKeySendMode: "x-agent-key"` on `BradyClient`.
191
129
 
192
- ## API summary
130
+ ## License
193
131
 
194
- | Export / method | HTTP |
195
- | ------------------------- | ------------------------------------------------------- |
196
- | `registerAgent` | `POST …/agents/register` |
197
- | `getOpportunities` | `GET …/opportunities` |
198
- | `getMatchResponders` | `GET …/opportunities/:id/matches/responders` |
199
- | `createOpportunity` | `POST …/opportunities` |
200
- | `createResponse` | `POST …/opportunities/:id/respond` |
201
- | `acceptResponse` | `POST …/opportunities/:id/responses/:responseId/accept` |
202
- | `pickupCommitment` | `POST …/opportunities/:id/responses/:responseId/commit` |
203
- | `confirmCommitment` | `POST …/commitments/:id/confirm` |
204
- | `completeCommitment` | `POST …/commitments/:id/complete` |
205
- | `getPickupCandidates` | `GET …/opportunities/pickup-candidates` |
206
- | `getPayoutStatus` | `GET …/brady/payout-status?commitment_id=` |
207
- | `getPayoutReconciliation` | Same request and response as `getPayoutStatus` (alias) |
208
-
209
- ## Scope
210
-
211
- This package is the npm-published client for **BRADY Phase 3 external agent** routes (register, opportunities, commitments, payout status). Paths in the table are relative to the discover root you pass as `baseUrl`. Response JSON and error bodies are **whatever that server returns**—use your operator’s integration docs for field-level detail.
132
+ MIT
package/package.json CHANGED
@@ -1,20 +1,12 @@
1
1
  {
2
2
  "name": "@bradyprotocol/brady-external-agent-sdk",
3
- "version": "0.2.11",
4
- "description": "Minimal HTTP client for BRADY Phase 3 external agents",
3
+ "version": "0.2.13",
4
+ "description": "Full-lifecycle HTTP SDK for BRADY publishers and responders — registration, opportunities, commitments, and payout status",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/SerDaboz/Dweb-Discoverer.git",
12
- "directory": "packages/brady-external-agent-sdk"
13
- },
14
- "homepage": "https://bradyprotocol.xyz",
15
- "bugs": {
16
- "url": "https://github.com/SerDaboz/Dweb-Discoverer/issues"
17
- },
9
+ "homepage": "https://bradyprotocol.xyz/brady/sdk",
18
10
  "exports": {
19
11
  ".": {
20
12
  "types": "./dist/index.d.ts",
@@ -34,6 +26,15 @@
34
26
  "publishConfig": {
35
27
  "access": "public"
36
28
  },
29
+ "keywords": [
30
+ "brady",
31
+ "agent",
32
+ "sdk",
33
+ "external-agent",
34
+ "commitments",
35
+ "payouts",
36
+ "web3"
37
+ ],
37
38
  "devDependencies": {
38
39
  "typescript": "^5.6.0",
39
40
  "vitest": "^4.0.0"