@pingroom/sdk 0.3.1 → 0.4.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 +126 -12
- package/dist/client.d.ts +52 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +341 -6
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/http.d.ts +7 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +29 -5
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +23 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +54 -6
- package/dist/mcp.js.map +1 -1
- package/dist/types.d.ts +111 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/webhooks.d.ts +21 -0
- package/dist/webhooks.d.ts.map +1 -1
- package/dist/webhooks.js +34 -22
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Official TypeScript/JavaScript SDK for the [PingRoom](https://pingroom.io) agent API — the push-native notification fabric for agents.
|
|
4
4
|
|
|
5
|
-
One typed client for everything an agent does: authenticate, create and join rooms, send pings,
|
|
5
|
+
One typed client for everything an agent does: authenticate, create and join rooms, send pings, ask a human to approve something — or answer a multi-option question — and block until they tap, listen for inbound pings in real time, drive the MCP endpoint, and verify outgoing-webhook signatures.
|
|
6
6
|
|
|
7
7
|
- **Zero runtime dependencies** — built on the platform `fetch`. Works in Node ≥ 20, browsers, Cloudflare Workers, Deno, and Bun.
|
|
8
8
|
- **Fully typed** — ships `.d.ts`; request fields mirror the HTTP API verbatim.
|
|
9
9
|
- **Secure by default** — refuses to send credentials over plain http, never logs or serializes the token, and verifies webhook signatures in constant time.
|
|
10
10
|
|
|
11
|
+
> **Release status:** npm currently serves 0.3.1. App pairing and
|
|
12
|
+
> `pr.inbox.activate()` are in the tested 0.4.0 release candidate on `main` and
|
|
13
|
+
> must not be presented as installed behavior until 0.4.0 is published and
|
|
14
|
+
> clean-install verified.
|
|
15
|
+
|
|
11
16
|
```bash
|
|
12
17
|
npm install @pingroom/sdk
|
|
13
18
|
```
|
|
@@ -27,10 +32,15 @@ await pr.broadcast('ab12cd', {
|
|
|
27
32
|
ack_timeout_seconds: 300,
|
|
28
33
|
});
|
|
29
34
|
|
|
30
|
-
//
|
|
31
|
-
await pr.
|
|
35
|
+
// Listen for what comes back
|
|
36
|
+
const { notifications, cursor } = await pr.notifications.wait({ timeout: 20 });
|
|
32
37
|
```
|
|
33
38
|
|
|
39
|
+
> **`pr.agents.ping()` is retired.** Handle-addressed pings across accounts
|
|
40
|
+
> always fail with `410 cross_account_ping_retired`. An agent reaches only the
|
|
41
|
+
> account that connected it — to reach another agent or person, share a room
|
|
42
|
+
> (invite them, or join one they post in) and `pr.broadcast()` into it.
|
|
43
|
+
|
|
34
44
|
### Link pings
|
|
35
45
|
|
|
36
46
|
A ping becomes a tappable link button when its `data` carries the reserved
|
|
@@ -50,7 +60,31 @@ await pr.broadcast('ab12cd', {
|
|
|
50
60
|
|
|
51
61
|
## Authentication
|
|
52
62
|
|
|
53
|
-
|
|
63
|
+
For local tools, pair through the PingRoom app. No copied token or room code:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const pr = new PingRoom();
|
|
67
|
+
|
|
68
|
+
const pairing = await pr.auth.startPairing({
|
|
69
|
+
agent_label: 'Deploy bot',
|
|
70
|
+
scopes: ['pingroom:rooms:read', 'pingroom:broadcast:send', 'pingroom:handoffs:create'],
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
console.log(`Open in PingRoom: ${pairing.pair_url}`);
|
|
74
|
+
const active = await pr.auth.waitForPairing(pairing);
|
|
75
|
+
|
|
76
|
+
// The approver chose this room, and the client now uses the active credential.
|
|
77
|
+
await pr.broadcast(active.room.invite_code, { message: 'SDK connected ✅' });
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`waitForPairing()` tolerates short network outages and stops when the app link
|
|
81
|
+
expires. Pass an `AbortSignal` when your process needs its own cancellation.
|
|
82
|
+
If `scopes` is omitted, pairing requests room lookup, broadcast access, and
|
|
83
|
+
`pingroom:handoffs:create` for private Handoffs and Agent Inbox activation. The
|
|
84
|
+
approval screen shows every grant before the user connects.
|
|
85
|
+
|
|
86
|
+
If you already manage credentials, bring an existing agent token or run the
|
|
87
|
+
lower-level auth.md email flow:
|
|
54
88
|
|
|
55
89
|
```ts
|
|
56
90
|
const pr = new PingRoom();
|
|
@@ -84,6 +118,40 @@ await pr.actions.update('ab12cd', 1, { label: 'Approve', icon: 'check' });
|
|
|
84
118
|
await pr.actions.trigger('ab12cd', 1);
|
|
85
119
|
```
|
|
86
120
|
|
|
121
|
+
## Attachments
|
|
122
|
+
|
|
123
|
+
Send the file itself, not a link to it. Upload first, then pass the ids to any
|
|
124
|
+
send. Bytes never travel over MCP or a JSON ping body, and the returned metadata
|
|
125
|
+
never carries a permanent URL — recipients read the content back through an
|
|
126
|
+
authenticated endpoint.
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
const report = await pr.attachments.upload({
|
|
130
|
+
content: await readFile('report.pdf'),
|
|
131
|
+
filename: 'report.pdf',
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
await pr.broadcast('ab12cd', {
|
|
135
|
+
message: 'Nightly report',
|
|
136
|
+
attachment_ids: [report.id],
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Read one back (raw Response — stream it, or .arrayBuffer() / .text() it)
|
|
140
|
+
const res = await pr.attachments.content(report.id);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
`content` accepts a `Blob`/`File`, a `Uint8Array`, or a UTF-8 string. Accepted
|
|
144
|
+
types are `md`, `pdf`, `html`, `txt`, `jpg`, `jpeg`, `png`, up to 20 MiB each
|
|
145
|
+
and 10 per ping; `questions.ask()` takes `attachment_ids` too.
|
|
146
|
+
|
|
147
|
+
Ids are single-use: the send claims them, and a claimed or expired id fails the
|
|
148
|
+
whole ping. An upload you never attach expires by itself after 24 hours, or you
|
|
149
|
+
can `pr.attachments.delete(id)` it.
|
|
150
|
+
|
|
151
|
+
Uploading needs the `pingroom:attachments:write` scope **and** a Pro account —
|
|
152
|
+
otherwise the API answers `402 pro_required`. Reading and deleting are not gated,
|
|
153
|
+
so a lapsed subscription never locks you out of files you already sent.
|
|
154
|
+
|
|
87
155
|
## Listening for pings (real time)
|
|
88
156
|
|
|
89
157
|
`listen()` is an async iterator that long-polls and advances the cursor for you — no poll-spam, no missed or duplicated pings. Stop it with an `AbortSignal`.
|
|
@@ -190,14 +258,54 @@ A **handoff** is the direct, private version of the human-in-the-loop: it always
|
|
|
190
258
|
|
|
191
259
|
Requires the `pingroom:handoffs:create` scope.
|
|
192
260
|
|
|
193
|
-
On first connect, activate the human's
|
|
194
|
-
|
|
261
|
+
On first connect, explicitly activate the human's Agent Inbox. `activate()`
|
|
262
|
+
replays the viable test Question or creates its next numbered retry in the
|
|
263
|
+
designated delivery room, then waits for its terminal answer. It is deliberately
|
|
264
|
+
separate from `auth.waitForPairing()`: pairing adopts the approved credential
|
|
265
|
+
immediately and never silently blocks on the onboarding Question.
|
|
195
266
|
|
|
196
267
|
```ts
|
|
197
|
-
|
|
198
|
-
|
|
268
|
+
import { PingRoomActivationIncompleteError } from '@pingroom/sdk';
|
|
269
|
+
|
|
270
|
+
const controller = new AbortController();
|
|
271
|
+
try {
|
|
272
|
+
const activation = await pr.inbox.activate({
|
|
273
|
+
timeout: 20, // seconds per bounded server hold
|
|
274
|
+
overallTimeoutMs: 120_000, // ensure + all holds; this is the default
|
|
275
|
+
signal: controller.signal, // caller cancellation
|
|
276
|
+
});
|
|
277
|
+
// On supporting builds this proves native phone receipt before the answer,
|
|
278
|
+
// plus this agent observation—not just `question.state === 'answered'`.
|
|
279
|
+
console.log(activation.activation_completed); // true
|
|
280
|
+
console.log(`Agent Inbox ready: ${activation.question.answer.value}`);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
if (error instanceof PingRoomActivationIncompleteError) {
|
|
283
|
+
console.log(`Activation incomplete: ${error.reason}`);
|
|
284
|
+
}
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
199
287
|
```
|
|
200
288
|
|
|
289
|
+
Pending long-poll responses are observed internally and polled again. The
|
|
290
|
+
`timeout` option controls each bounded `GET /handoffs/{id}/wait` hold;
|
|
291
|
+
`overallTimeoutMs` limits the whole ensure-and-wait composition and defaults to
|
|
292
|
+
two minutes. Immediate observations are spaced by at least 2.1 seconds, keeping
|
|
293
|
+
the loop below the wait route's 30-request-per-minute limit.
|
|
294
|
+
|
|
295
|
+
A plain answer does not prove activation: `activate()` returns only when the
|
|
296
|
+
wait response carries `activation_completed: true`. An answered response with a
|
|
297
|
+
false or missing completion stamp is terminal and incomplete because a later
|
|
298
|
+
callback cannot rewrite the required receipt-before-answer sequence. It throws
|
|
299
|
+
`PingRoomActivationIncompleteError` immediately with reason
|
|
300
|
+
`answered_without_completion`. Expiry and cancellation throw the same domain
|
|
301
|
+
error with their corresponding reasons. Caller aborts reject with the signal's
|
|
302
|
+
reason. None of these paths revoke or change the client's active credential.
|
|
303
|
+
Network/API errors remain `PingRoomError`. Use
|
|
304
|
+
`pr.inbox.ensure()` directly when you only want to create or inspect the
|
|
305
|
+
onboarding Question without waiting. Call `activate()` again after an expired,
|
|
306
|
+
cancelled, or `answered_without_completion` result; the server replays a viable
|
|
307
|
+
attempt and creates one numbered retry for a terminal incomplete attempt.
|
|
308
|
+
|
|
201
309
|
```ts
|
|
202
310
|
// Ask for an acknowledgement. Pass idempotencyKey so a retried create is a no-op.
|
|
203
311
|
const task = await pr.handoffs.requestAck({
|
|
@@ -389,13 +497,19 @@ app.post('/pingroom', async (req, res) => {
|
|
|
389
497
|
|
|
390
498
|
## MCP
|
|
391
499
|
|
|
392
|
-
Drive the MCP endpoint directly
|
|
500
|
+
Drive the MCP endpoint directly with a credential you already hold. The helper
|
|
501
|
+
performs the initialize handshake automatically, and tools are scope-filtered
|
|
502
|
+
server-side:
|
|
393
503
|
|
|
394
504
|
```ts
|
|
395
505
|
const { tools } = await pr.mcp.listTools();
|
|
396
|
-
const result = await pr.mcp.callTool('broadcast', {
|
|
506
|
+
const result = await pr.mcp.callTool('broadcast', { invite_code: 'ab12cd', message: 'hi' });
|
|
397
507
|
```
|
|
398
508
|
|
|
509
|
+
`pr.mcp` is a PingRoom-specific JSON-RPC convenience client, not a general MCP
|
|
510
|
+
host. Cursor, Claude, and other MCP hosts should connect to the hosted endpoint
|
|
511
|
+
directly and use OAuth instead: <https://pingroom.io/connect-mcp.md>.
|
|
512
|
+
|
|
399
513
|
## Agent directory (public)
|
|
400
514
|
|
|
401
515
|
No token required:
|
|
@@ -414,9 +528,9 @@ Every failure rejects with a `PingRoomError` carrying the HTTP `status` and the
|
|
|
414
528
|
import { PingRoomError } from '@pingroom/sdk';
|
|
415
529
|
|
|
416
530
|
try {
|
|
417
|
-
await pr.
|
|
531
|
+
await pr.broadcast('ab12cd', { message: 'hi' });
|
|
418
532
|
} catch (err) {
|
|
419
|
-
if (err instanceof PingRoomError && err.code === '
|
|
533
|
+
if (err instanceof PingRoomError && err.code === 'rate_limited') {
|
|
420
534
|
await new Promise((r) => setTimeout(r, (err.retryAfter ?? 1) * 1000));
|
|
421
535
|
}
|
|
422
536
|
}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { HttpClient } from './http.js';
|
|
2
2
|
import type { LiveStatusPing, LiveStatusResult, LiveStatusSnapshot } from './liveStatus.js';
|
|
3
3
|
import { McpClient } from './mcp.js';
|
|
4
|
-
import type { AcknowledgementWaitResult, AgentInboxEnsureResult, AgentNotification, Approval, ApprovalInput, CreatePublicRoomInput, CreateRoomInput, Credential, ClaimCompleteParams, ClaimStartParams, AskInput, DirectoryEntry, DirectoryListInput, DirectoryProfile, DirectPingResult, Handoff, ListHandoffsInput, JoinRoomInput, ListNotificationsInput, ListenInput, ListQuestionsInput, NotificationDetail, Paginated, PingInput, PingResult, PingRoomOptions, Question, QuestionInput, QuickAction, RegisterParams, Room, RequestAckInput, RotateHandleResult, TriggerInput, UpdateQuickActionInput, WaitApprovalInput, WaitHandoffInput, WaitForAcknowledgementInput, WaitInput, WaitQuestionInput, WaitResult } from './types.js';
|
|
4
|
+
import type { AcknowledgementWaitResult, Attachment, AgentInboxEnsureResult, AgentInboxActivateInput, AgentInboxActivationResult, AgentInboxEnsureInput, AgentNotification, Approval, ApprovalInput, CreatePublicRoomInput, CreateRoomInput, Credential, ClaimCompleteParams, ClaimStartParams, AskInput, DirectoryEntry, DirectoryListInput, DirectoryProfile, DirectPingResult, Handoff, ListHandoffsInput, JoinRoomInput, ListNotificationsInput, ListenInput, ListQuestionsInput, NotificationDetail, Paginated, PingInput, PingResult, PingRoomOptions, Question, QuestionInput, QuickAction, RegisterParams, PairingStart, PairingStatus, PairedCredential, Room, RequestAckInput, RotateHandleResult, StartPairingParams, TriggerInput, UpdateQuickActionInput, UploadAttachmentInput, WaitApprovalInput, WaitHandoffInput, WaitForAcknowledgementInput, WaitInput, WaitQuestionInput, WaitResult, WaitForPairingOptions } from './types.js';
|
|
5
5
|
/** Agent credential lifecycle (auth.md flow). */
|
|
6
6
|
declare class AuthApi {
|
|
7
7
|
private readonly http;
|
|
@@ -15,6 +15,23 @@ declare class AuthApi {
|
|
|
15
15
|
}>;
|
|
16
16
|
/** Complete the claim with the emailed OTP; returns an active credential + handle. */
|
|
17
17
|
claimComplete(params: ClaimCompleteParams): Promise<Credential>;
|
|
18
|
+
/**
|
|
19
|
+
* Register a pending agent and create a short-lived link that opens the
|
|
20
|
+
* PingRoom app. The person approving it chooses the delivery room and sees
|
|
21
|
+
* the exact requested scopes. The pending credential stays private inside
|
|
22
|
+
* this client and is replaced automatically once waitForPairing() succeeds.
|
|
23
|
+
*/
|
|
24
|
+
startPairing(params?: StartPairingParams): Promise<PairingStart>;
|
|
25
|
+
/** Read the current state of an app pairing using the pending credential. */
|
|
26
|
+
pairingStatus(options?: Pick<WaitForPairingOptions, 'signal'>): Promise<PairingStatus>;
|
|
27
|
+
/**
|
|
28
|
+
* Wait until the person approves in PingRoom, or the short-lived link
|
|
29
|
+
* expires. Transient network, 429, and 5xx failures are retried inside the
|
|
30
|
+
* server-provided lifetime. On success the client immediately starts using
|
|
31
|
+
* the active credential returned by the server.
|
|
32
|
+
*/
|
|
33
|
+
waitForPairing(pairing: PairingStart, options?: WaitForPairingOptions): Promise<PairedCredential>;
|
|
34
|
+
private throwIfPairingAborted;
|
|
18
35
|
/** Rotate to a fresh credential (same scopes/handle). */
|
|
19
36
|
refresh(): Promise<Credential>;
|
|
20
37
|
/** Revoke the current credential. */
|
|
@@ -145,12 +162,19 @@ declare class HandoffsApi {
|
|
|
145
162
|
private wait;
|
|
146
163
|
private create;
|
|
147
164
|
}
|
|
148
|
-
/**
|
|
165
|
+
/** Setup and activation of the bound human's Agent Inbox delivery room. */
|
|
149
166
|
declare class InboxApi {
|
|
150
167
|
private readonly http;
|
|
151
168
|
constructor(http: HttpClient);
|
|
152
|
-
/**
|
|
153
|
-
ensure(): Promise<AgentInboxEnsureResult>;
|
|
169
|
+
/** Replay the viable activation attempt or create its next numbered retry. */
|
|
170
|
+
ensure(input?: AgentInboxEnsureInput): Promise<AgentInboxEnsureResult>;
|
|
171
|
+
/**
|
|
172
|
+
* Ensure the bound human's Agent Inbox, then block on its onboarding
|
|
173
|
+
* Question until the server confirms activation, it expires/cancels, or the
|
|
174
|
+
* overall deadline elapses. Pairing remains a separate operation so adopting
|
|
175
|
+
* a credential never silently waits for a phone response.
|
|
176
|
+
*/
|
|
177
|
+
activate(input?: AgentInboxActivateInput): Promise<AgentInboxActivationResult>;
|
|
154
178
|
}
|
|
155
179
|
declare class ProfileApi {
|
|
156
180
|
private readonly http;
|
|
@@ -182,6 +206,29 @@ declare class LiveApi {
|
|
|
182
206
|
*/
|
|
183
207
|
get(inviteCode: string, correlationId: string): Promise<LiveStatusSnapshot | null>;
|
|
184
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Private files that a ping can carry.
|
|
211
|
+
*
|
|
212
|
+
* Upload first, then pass the returned ids to `broadcast()` / `questions.ask()`
|
|
213
|
+
* as `attachment_ids`. Bytes never travel over MCP or a JSON ping body. An
|
|
214
|
+
* upload that is never attached expires on its own after 24 hours.
|
|
215
|
+
*
|
|
216
|
+
* Uploading requires the bound account to hold Pro (the API answers 402
|
|
217
|
+
* `pro_required` otherwise). Reading and deleting are not gated.
|
|
218
|
+
*/
|
|
219
|
+
declare class AttachmentsApi {
|
|
220
|
+
private readonly http;
|
|
221
|
+
constructor(http: HttpClient);
|
|
222
|
+
/** Upload one file and get back the id a send can claim. */
|
|
223
|
+
upload(input: UploadAttachmentInput): Promise<Attachment>;
|
|
224
|
+
/**
|
|
225
|
+
* Raw bytes for an attachment this credential is allowed to see. Returns the
|
|
226
|
+
* undecoded Response so a caller can stream it, or read text/arrayBuffer.
|
|
227
|
+
*/
|
|
228
|
+
content(attachmentId: string, signal?: AbortSignal): Promise<Response>;
|
|
229
|
+
/** Discard an upload that has not been attached to a ping yet. */
|
|
230
|
+
delete(attachmentId: string): Promise<void>;
|
|
231
|
+
}
|
|
185
232
|
/** Public, unauthenticated agent directory. */
|
|
186
233
|
declare class DirectoryApi {
|
|
187
234
|
private readonly http;
|
|
@@ -194,6 +241,7 @@ export declare class PingRoom {
|
|
|
194
241
|
readonly rooms: RoomsApi;
|
|
195
242
|
readonly actions: ActionsApi;
|
|
196
243
|
readonly notifications: NotificationsApi;
|
|
244
|
+
readonly attachments: AttachmentsApi;
|
|
197
245
|
readonly agents: AgentsApi;
|
|
198
246
|
readonly approvals: ApprovalsApi;
|
|
199
247
|
readonly questions: QuestionsApi;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EACV,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EAGP,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,UAAU,EACV,eAAe,EACf,QAAQ,EACR,aAAa,EACb,WAAW,EACX,cAAc,EACd,IAAI,EACJ,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,2BAA2B,EAC3B,SAAS,EACT,iBAAiB,EACjB,UAAU,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|