@pingroom/sdk 0.7.1 → 0.9.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 +288 -44
- package/dist/client.d.ts +27 -312
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +33 -1154
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +40 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +56 -4
- package/dist/errors.js.map +1 -1
- package/dist/http.d.ts +12 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +47 -18
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/async.d.ts +2 -0
- package/dist/internal/async.d.ts.map +1 -1
- package/dist/internal/async.js +6 -0
- package/dist/internal/async.js.map +1 -1
- package/dist/internal/guards.d.ts +16 -0
- package/dist/internal/guards.d.ts.map +1 -1
- package/dist/internal/guards.js +22 -1
- package/dist/internal/guards.js.map +1 -1
- package/dist/internal/request.d.ts +41 -0
- package/dist/internal/request.d.ts.map +1 -0
- package/dist/internal/request.js +78 -0
- package/dist/internal/request.js.map +1 -0
- package/dist/internal/retry.d.ts +65 -0
- package/dist/internal/retry.d.ts.map +1 -0
- package/dist/internal/retry.js +126 -0
- package/dist/internal/retry.js.map +1 -0
- package/dist/internal/url.d.ts +9 -0
- package/dist/internal/url.d.ts.map +1 -1
- package/dist/internal/url.js +25 -0
- package/dist/internal/url.js.map +1 -1
- package/dist/internal/validate.d.ts +13 -0
- package/dist/internal/validate.d.ts.map +1 -0
- package/dist/internal/validate.js +36 -0
- package/dist/internal/validate.js.map +1 -0
- package/dist/linkPing.d.ts.map +1 -1
- package/dist/linkPing.js +6 -2
- package/dist/linkPing.js.map +1 -1
- package/dist/liveStatus.d.ts +106 -11
- package/dist/liveStatus.d.ts.map +1 -1
- package/dist/liveStatus.js +20 -3
- package/dist/liveStatus.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +40 -10
- package/dist/mcp.js.map +1 -1
- package/dist/namespaces/actions.d.ts +50 -0
- package/dist/namespaces/actions.d.ts.map +1 -0
- package/dist/namespaces/actions.js +219 -0
- package/dist/namespaces/actions.js.map +1 -0
- package/dist/namespaces/approvals.d.ts +23 -0
- package/dist/namespaces/approvals.d.ts.map +1 -0
- package/dist/namespaces/approvals.js +78 -0
- package/dist/namespaces/approvals.js.map +1 -0
- package/dist/namespaces/attachments.d.ts +37 -0
- package/dist/namespaces/attachments.d.ts.map +1 -0
- package/dist/namespaces/attachments.js +91 -0
- package/dist/namespaces/attachments.js.map +1 -0
- package/dist/namespaces/auth.d.ts +58 -0
- package/dist/namespaces/auth.d.ts.map +1 -0
- package/dist/namespaces/auth.js +242 -0
- package/dist/namespaces/auth.js.map +1 -0
- package/dist/namespaces/directory.d.ts +10 -0
- package/dist/namespaces/directory.d.ts.map +1 -0
- package/dist/namespaces/directory.js +19 -0
- package/dist/namespaces/directory.js.map +1 -0
- package/dist/namespaces/handoffs.d.ts +47 -0
- package/dist/namespaces/handoffs.d.ts.map +1 -0
- package/dist/namespaces/handoffs.js +126 -0
- package/dist/namespaces/handoffs.js.map +1 -0
- package/dist/namespaces/inbox.d.ts +17 -0
- package/dist/namespaces/inbox.d.ts.map +1 -0
- package/dist/namespaces/inbox.js +192 -0
- package/dist/namespaces/inbox.js.map +1 -0
- package/dist/namespaces/live.d.ts +57 -0
- package/dist/namespaces/live.d.ts.map +1 -0
- package/dist/namespaces/live.js +116 -0
- package/dist/namespaces/live.js.map +1 -0
- package/dist/namespaces/notifications.d.ts +25 -0
- package/dist/namespaces/notifications.d.ts.map +1 -0
- package/dist/namespaces/notifications.js +128 -0
- package/dist/namespaces/notifications.js.map +1 -0
- package/dist/namespaces/profile.d.ts +19 -0
- package/dist/namespaces/profile.d.ts.map +1 -0
- package/dist/namespaces/profile.js +22 -0
- package/dist/namespaces/profile.js.map +1 -0
- package/dist/namespaces/questions.d.ts +41 -0
- package/dist/namespaces/questions.d.ts.map +1 -0
- package/dist/namespaces/questions.js +107 -0
- package/dist/namespaces/questions.js.map +1 -0
- package/dist/namespaces/rooms.d.ts +13 -0
- package/dist/namespaces/rooms.d.ts.map +1 -0
- package/dist/namespaces/rooms.js +41 -0
- package/dist/namespaces/rooms.js.map +1 -0
- package/dist/namespaces/webhooks.d.ts +11 -0
- package/dist/namespaces/webhooks.d.ts.map +1 -0
- package/dist/namespaces/webhooks.js +32 -0
- package/dist/namespaces/webhooks.js.map +1 -0
- package/dist/types/approvals.d.ts +62 -0
- package/dist/types/approvals.d.ts.map +1 -0
- package/dist/types/approvals.js +2 -0
- package/dist/types/approvals.js.map +1 -0
- package/dist/types/auth.d.ts +185 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/common.d.ts +43 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +2 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/handoffs.d.ts +121 -0
- package/dist/types/handoffs.d.ts.map +1 -0
- package/dist/types/handoffs.js +2 -0
- package/dist/types/handoffs.js.map +1 -0
- package/dist/types/inbox.d.ts +51 -0
- package/dist/types/inbox.d.ts.map +1 -0
- package/dist/types/inbox.js +2 -0
- package/dist/types/inbox.js.map +1 -0
- package/dist/types/notifications.d.ts +376 -0
- package/dist/types/notifications.d.ts.map +1 -0
- package/dist/types/notifications.js +2 -0
- package/dist/types/notifications.js.map +1 -0
- package/dist/types/profile.d.ts +30 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +3 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/questions.d.ts +210 -0
- package/dist/types/questions.d.ts.map +1 -0
- package/dist/types/questions.js +2 -0
- package/dist/types/questions.js.map +1 -0
- package/dist/types/rooms.d.ts +163 -0
- package/dist/types/rooms.d.ts.map +1 -0
- package/dist/types/rooms.js +3 -0
- package/dist/types/rooms.js.map +1 -0
- package/dist/types.d.ts +9 -1035
- 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 +32 -5
- package/dist/webhooks.d.ts.map +1 -1
- package/dist/webhooks.js +44 -14
- package/dist/webhooks.js.map +1 -1
- package/package.json +4 -2
- package/src/client.ts +115 -0
- package/src/errors.ts +291 -0
- package/src/http.ts +225 -0
- package/src/index.ts +97 -0
- package/src/internal/async.ts +54 -0
- package/src/internal/guards.ts +129 -0
- package/src/internal/request.ts +97 -0
- package/src/internal/retry.ts +157 -0
- package/src/internal/url.ts +78 -0
- package/src/internal/validate.ts +42 -0
- package/src/linkPing.ts +56 -0
- package/src/liveStatus.ts +337 -0
- package/src/locationPing.ts +101 -0
- package/src/mcp.ts +161 -0
- package/src/namespaces/actions.ts +234 -0
- package/src/namespaces/approvals.ts +104 -0
- package/src/namespaces/attachments.ts +106 -0
- package/src/namespaces/auth.ts +284 -0
- package/src/namespaces/directory.ts +21 -0
- package/src/namespaces/handoffs.ts +160 -0
- package/src/namespaces/inbox.ts +253 -0
- package/src/namespaces/live.ts +134 -0
- package/src/namespaces/notifications.ts +152 -0
- package/src/namespaces/profile.ts +24 -0
- package/src/namespaces/questions.ts +133 -0
- package/src/namespaces/rooms.ts +53 -0
- package/src/namespaces/webhooks.ts +38 -0
- package/src/types/approvals.ts +67 -0
- package/src/types/auth.ts +202 -0
- package/src/types/common.ts +74 -0
- package/src/types/handoffs.ts +148 -0
- package/src/types/inbox.ts +64 -0
- package/src/types/notifications.ts +393 -0
- package/src/types/profile.ts +37 -0
- package/src/types/questions.ts +226 -0
- package/src/types/rooms.ts +169 -0
- package/src/types.ts +17 -0
- package/src/version.ts +2 -0
- package/src/webhooks.ts +373 -0
- package/dist/liveActivity.d.ts +0 -101
- package/dist/liveActivity.d.ts.map +0 -1
- package/dist/liveActivity.js +0 -83
- package/dist/liveActivity.js.map +0 -1
package/dist/liveStatus.d.ts
CHANGED
|
@@ -16,11 +16,12 @@
|
|
|
16
16
|
* builders describe it too — but it is not an agent route and has no client
|
|
17
17
|
* here.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* A **claim request** ("Who's on it?", template `claim`) is a stream one member
|
|
20
|
+
* takes on. It starts like any stream, but it then moves only through
|
|
21
|
+
* `pr.live.claim()` (claim, release, done, cancel), not through further
|
|
22
|
+
* `live_status` legs. See https://pingroom.io/liveactivities.md.
|
|
22
23
|
*/
|
|
23
|
-
|
|
24
|
+
export type LiveActivityTemplate = 'status' | 'steps' | 'progress' | 'metrics' | 'countdown' | 'question' | 'matchup' | 'claim';
|
|
24
25
|
export type LiveStatusState = 'running' | 'done' | 'failed';
|
|
25
26
|
/** Legacy rendering category. Prefer `template`; `alert` selects urgent styling. */
|
|
26
27
|
export type LiveStatusCategory = 'status' | 'steps' | 'alert';
|
|
@@ -42,7 +43,9 @@ export interface LiveStatusSide {
|
|
|
42
43
|
* by the template you selected.
|
|
43
44
|
*
|
|
44
45
|
* `template` and `steps` are fixed at stream creation — a later ping cannot
|
|
45
|
-
* re-template a running card
|
|
46
|
+
* re-template a running card, and a `running` ping whose `steps` list differs
|
|
47
|
+
* from the stored one is rejected with 422 `steps_immutable` (an identical list,
|
|
48
|
+
* or none, is fine; a `done`/`failed` ping ignores it and still ends). Content set at creation is sticky, so a sparse
|
|
46
49
|
* update carrying just `progress` keeps rendering the full template. The
|
|
47
50
|
* terminal leg is sticky too: `{ state: 'done' }` alone keeps the scoreboard,
|
|
48
51
|
* metrics grid, deadline and accent on the final frame.
|
|
@@ -54,18 +57,28 @@ export interface LiveStatus {
|
|
|
54
57
|
message?: string;
|
|
55
58
|
/** 0..1 — the progress bar / Dynamic Island gauge. */
|
|
56
59
|
progress?: number;
|
|
57
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* 2–8 labels. Required on the first ping of a `steps` stream; immutable after.
|
|
62
|
+
* Later pings may resend the identical list or omit it; a different list on a
|
|
63
|
+
* `running` ping is rejected with 422 `steps_immutable`, and a `done`/`failed`
|
|
64
|
+
* ping ignores it. Use `current_step` to advance.
|
|
65
|
+
*/
|
|
58
66
|
steps?: string[];
|
|
59
67
|
/** Index into `steps`; the only mutable steps field. */
|
|
60
68
|
current_step?: number;
|
|
61
69
|
/** Up to 3 counters, for the `metrics` template. */
|
|
62
70
|
metrics?: LiveStatusMetric[];
|
|
63
|
-
/**
|
|
71
|
+
/**
|
|
72
|
+
* Epoch seconds the `countdown` template counts down to. A later ping may move
|
|
73
|
+
* it: send the new absolute value, and the stored `duration_seconds` moves by
|
|
74
|
+
* the same amount (a retried ping moves nothing twice).
|
|
75
|
+
*/
|
|
64
76
|
deadline_at?: number;
|
|
65
77
|
/**
|
|
66
|
-
* `countdown` only: the timer's
|
|
67
|
-
*
|
|
68
|
-
*
|
|
78
|
+
* `countdown` only: the timer's length in seconds. Read from the first ping
|
|
79
|
+
* only (the server derives `deadline_at - now` when omitted); a later ping's
|
|
80
|
+
* own value is ignored. It follows `deadline_at`: moving the deadline on a
|
|
81
|
+
* later ping moves the stored duration by the same amount.
|
|
69
82
|
*/
|
|
70
83
|
duration_seconds?: number;
|
|
71
84
|
/** Epoch seconds; renders a live ETA on `status`/`progress`. */
|
|
@@ -81,6 +94,70 @@ export interface LiveStatus {
|
|
|
81
94
|
accent_override?: string;
|
|
82
95
|
agent_id?: string;
|
|
83
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Where a "Who's on it?" request stands. `open` and `claimed` are live; the rest
|
|
99
|
+
* are final. A request ends as `expired` when nobody took it by its deadline, or
|
|
100
|
+
* when its claimer let go of it after that deadline.
|
|
101
|
+
*/
|
|
102
|
+
export type LiveClaimStatus = 'open' | 'claimed' | 'done' | 'cancelled' | 'expired' | 'unfinished';
|
|
103
|
+
/** What a member can do to a claim request. */
|
|
104
|
+
export type LiveClaimAction = 'claim' | 'release' | 'done' | 'cancel';
|
|
105
|
+
/** The stream `state` a claim status maps to: open and claimed are `running`, done is `done`, the rest are `failed`. */
|
|
106
|
+
export type LiveClaimStreamState = 'running' | 'done' | 'failed';
|
|
107
|
+
/** The person who holds a claim request, or who finished it. */
|
|
108
|
+
export interface LiveClaimParty {
|
|
109
|
+
/** The user id (a UUID). */
|
|
110
|
+
id: string;
|
|
111
|
+
name: string;
|
|
112
|
+
color?: string;
|
|
113
|
+
emoji?: string;
|
|
114
|
+
image_url?: string | null;
|
|
115
|
+
}
|
|
116
|
+
/** The server-owned `claim` block of a claim request. */
|
|
117
|
+
export interface LiveClaim {
|
|
118
|
+
status: LiveClaimStatus;
|
|
119
|
+
/** Who holds the request (or finished it); `null` while nobody does. */
|
|
120
|
+
by: LiveClaimParty | null;
|
|
121
|
+
/** Epoch seconds the holder took it; `null` while nobody holds it. */
|
|
122
|
+
at: number | null;
|
|
123
|
+
/** A claimed request is past its deadline. It stays live. */
|
|
124
|
+
late: boolean;
|
|
125
|
+
late_nudged_at?: number;
|
|
126
|
+
realerted_at?: number;
|
|
127
|
+
ended_by?: string;
|
|
128
|
+
released_by?: string;
|
|
129
|
+
/** The last claimer the asker was alerted about: a take alerts the asker once per claimer. */
|
|
130
|
+
claimer_alerted_id?: string;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The 200 body of `pr.live.claim()`. `idempotent` is true when the same person
|
|
134
|
+
* repeated the action that already produced the current status, so nothing
|
|
135
|
+
* changed and nothing was sent.
|
|
136
|
+
*
|
|
137
|
+
* Each action resolves with one `claim.status` / `state` pair: `claim` is
|
|
138
|
+
* `claimed` / `running`, `done` is `done` / `done` and `cancel` is `cancelled` /
|
|
139
|
+
* `failed`. `release` is `open` / `running`, or `expired` / `failed` when the
|
|
140
|
+
* request was already past its deadline, so letting go ended it instead of
|
|
141
|
+
* reopening it.
|
|
142
|
+
*/
|
|
143
|
+
export interface LiveClaimResult {
|
|
144
|
+
notification_id: string;
|
|
145
|
+
correlation_id: string;
|
|
146
|
+
claim: LiveClaim;
|
|
147
|
+
state: LiveClaimStreamState;
|
|
148
|
+
idempotent: boolean;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The body of a refused transition, on `PingRoomError.body`. `claim` and
|
|
152
|
+
* `state` are the request as it now stands (on 409 and 422), so a client can
|
|
153
|
+
* show who got it first. A 403 or 404 carries only `code` and `message`.
|
|
154
|
+
*/
|
|
155
|
+
export interface LiveClaimRefusal {
|
|
156
|
+
code: string;
|
|
157
|
+
message: string;
|
|
158
|
+
claim?: LiveClaim;
|
|
159
|
+
state?: LiveClaimStreamState;
|
|
160
|
+
}
|
|
84
161
|
/** The full body of a live-status ping. */
|
|
85
162
|
export interface LiveStatusPing {
|
|
86
163
|
correlation_id: string;
|
|
@@ -124,7 +201,7 @@ export interface LiveStatusSnapshot {
|
|
|
124
201
|
accent_override: string | null;
|
|
125
202
|
eta_at: number | null;
|
|
126
203
|
deadline_at: number | null;
|
|
127
|
-
/**
|
|
204
|
+
/** Countdown length in seconds, following any `deadline_at` move; `null` on every other template. */
|
|
128
205
|
duration_seconds: number | null;
|
|
129
206
|
metrics: LiveStatusMetric[] | null;
|
|
130
207
|
prompt: string | null;
|
|
@@ -136,6 +213,10 @@ export interface LiveStatusSnapshot {
|
|
|
136
213
|
current_step: number | null;
|
|
137
214
|
action_state?: unknown;
|
|
138
215
|
updated_at: string | null;
|
|
216
|
+
/** `claim` template only: the request text. Absent on every other template. */
|
|
217
|
+
title?: string;
|
|
218
|
+
/** `claim` template only: where the request stands. Absent on every other template. */
|
|
219
|
+
claim?: LiveClaim;
|
|
139
220
|
}
|
|
140
221
|
type Rest = Omit<LiveStatusPing, 'correlation_id' | 'live_status'>;
|
|
141
222
|
/**
|
|
@@ -157,6 +238,20 @@ export declare const liveStatus: {
|
|
|
157
238
|
question(correlationId: string, live: Omit<LiveStatus, "template">, rest?: Rest): LiveStatusPing;
|
|
158
239
|
/** Two sides plus a center score/clock. */
|
|
159
240
|
matchup(correlationId: string, live: Omit<LiveStatus, "template">, rest?: Rest): LiveStatusPing;
|
|
241
|
+
/**
|
|
242
|
+
* "Who's on it?": a request one room member takes on. Private standard rooms
|
|
243
|
+
* only (`422 claim_private_rooms_only` elsewhere).
|
|
244
|
+
*
|
|
245
|
+
* Pass the request text as `rest.title` (1 to 120 characters; `live.message`
|
|
246
|
+
* is used when there is no title). Send `state: 'running'` on the first ping.
|
|
247
|
+
* `live.deadline_at` is optional, in the future and at most 8 hours away.
|
|
248
|
+
* Anything else in `live` is ignored, including a `claim` block.
|
|
249
|
+
*
|
|
250
|
+
* After creation the request moves with `pr.live.claim()`. A producer
|
|
251
|
+
* without a member identity (an incoming webhook) ends its own request with
|
|
252
|
+
* `liveStatus.done()` (done) or `liveStatus.failed()` (cancelled).
|
|
253
|
+
*/
|
|
254
|
+
claim(correlationId: string, live: Omit<LiveStatus, "template">, rest?: Rest): LiveStatusPing;
|
|
160
255
|
/**
|
|
161
256
|
* An urgent stream, delivered time-sensitive from the start so it breaks
|
|
162
257
|
* through Focus.
|
package/dist/liveStatus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveStatus.d.ts","sourceRoot":"","sources":["../src/liveStatus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"liveStatus.d.ts","sourceRoot":"","sources":["../src/liveStatus.ts"],"names":[],"mappings":"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"}
|
package/dist/liveStatus.js
CHANGED
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
* builders describe it too — but it is not an agent route and has no client
|
|
17
17
|
* here.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* A **claim request** ("Who's on it?", template `claim`) is a stream one member
|
|
20
|
+
* takes on. It starts like any stream, but it then moves only through
|
|
21
|
+
* `pr.live.claim()` (claim, release, done, cancel), not through further
|
|
22
|
+
* `live_status` legs. See https://pingroom.io/liveactivities.md.
|
|
22
23
|
*/
|
|
23
24
|
const ping = (correlationId, live, rest = {}) => ({
|
|
24
25
|
correlation_id: correlationId,
|
|
@@ -58,6 +59,22 @@ export const liveStatus = {
|
|
|
58
59
|
matchup(correlationId, live, rest) {
|
|
59
60
|
return ping(correlationId, { template: 'matchup', ...live }, rest);
|
|
60
61
|
},
|
|
62
|
+
/**
|
|
63
|
+
* "Who's on it?": a request one room member takes on. Private standard rooms
|
|
64
|
+
* only (`422 claim_private_rooms_only` elsewhere).
|
|
65
|
+
*
|
|
66
|
+
* Pass the request text as `rest.title` (1 to 120 characters; `live.message`
|
|
67
|
+
* is used when there is no title). Send `state: 'running'` on the first ping.
|
|
68
|
+
* `live.deadline_at` is optional, in the future and at most 8 hours away.
|
|
69
|
+
* Anything else in `live` is ignored, including a `claim` block.
|
|
70
|
+
*
|
|
71
|
+
* After creation the request moves with `pr.live.claim()`. A producer
|
|
72
|
+
* without a member identity (an incoming webhook) ends its own request with
|
|
73
|
+
* `liveStatus.done()` (done) or `liveStatus.failed()` (cancelled).
|
|
74
|
+
*/
|
|
75
|
+
claim(correlationId, live, rest) {
|
|
76
|
+
return ping(correlationId, { template: 'claim', ...live }, rest);
|
|
77
|
+
},
|
|
61
78
|
/**
|
|
62
79
|
* An urgent stream, delivered time-sensitive from the start so it breaks
|
|
63
80
|
* through Focus.
|
package/dist/liveStatus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveStatus.js","sourceRoot":"","sources":["../src/liveStatus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"liveStatus.js","sourceRoot":"","sources":["../src/liveStatus.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACtE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,SAAS;IAOlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,eAAe,CAAuB;gBAG3B,IAAI,EAAE,UAAU,EAChB,IAAI,SAAmB;IAG1C,4FAA4F;IACtF,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACtE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,SAAS;IAOlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,eAAe,CAAuB;gBAG3B,IAAI,EAAE,UAAU,EAChB,IAAI,SAAmB;IAG1C,4FAA4F;IACtF,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqCrF;;;OAGG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAc1E,gFAAgF;IAChF,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIjE,SAAS,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAK1C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAK1E,iBAAiB;YAsBjB,MAAM;IAepB,OAAO,CAAC,OAAO;CAMhB"}
|
package/dist/mcp.js
CHANGED
|
@@ -20,17 +20,39 @@ export class McpClient {
|
|
|
20
20
|
async call(method, params) {
|
|
21
21
|
const id = this.nextId++;
|
|
22
22
|
const envelope = { jsonrpc: '2.0', id, method, ...(params ? { params } : {}) };
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
let res;
|
|
24
|
+
try {
|
|
25
|
+
res = await this.http.request('POST', this.path, {
|
|
26
|
+
body: envelope,
|
|
27
|
+
headers: this.headers(),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
// The HTTP layer refuses a non-JSON 2xx as `invalid_response`; MCP callers
|
|
32
|
+
// branch on its own code for a reply that is not a JSON-RPC response.
|
|
33
|
+
if (error instanceof PingRoomError && error.status === 0 && error.code === 'invalid_response') {
|
|
34
|
+
throw new PingRoomError('MCP endpoint returned a response with neither `result` nor `error`.', {
|
|
35
|
+
code: 'mcp_invalid_response',
|
|
36
|
+
body: error.body,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
const isObject = res !== null && typeof res === 'object' && !Array.isArray(res);
|
|
42
|
+
if (isObject && res.error) {
|
|
28
43
|
throw new PingRoomError(`MCP error ${res.error.code}: ${res.error.message}`, {
|
|
29
44
|
code: `mcp_${res.error.code}`,
|
|
30
45
|
body: res.error,
|
|
31
46
|
});
|
|
32
47
|
}
|
|
33
|
-
|
|
48
|
+
// A 2xx that is not a JSON-RPC response (no body, an HTML page, an object
|
|
49
|
+
// with neither member) must fail here, not as a TypeError in the caller.
|
|
50
|
+
if (!isObject || !Object.prototype.hasOwnProperty.call(res, 'result')) {
|
|
51
|
+
throw new PingRoomError('MCP endpoint returned a response with neither `result` nor `error`.', {
|
|
52
|
+
code: 'mcp_invalid_response',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return res.result;
|
|
34
56
|
}
|
|
35
57
|
/**
|
|
36
58
|
* Perform the MCP initialize handshake once, including the required
|
|
@@ -79,10 +101,18 @@ export class McpClient {
|
|
|
79
101
|
}
|
|
80
102
|
async notify(method, params) {
|
|
81
103
|
const envelope = { jsonrpc: '2.0', method, ...(params ? { params } : {}) };
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
104
|
+
try {
|
|
105
|
+
await this.http.request('POST', this.path, {
|
|
106
|
+
body: envelope,
|
|
107
|
+
headers: this.headers(),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
// A notification has no reply: any 2xx acknowledges it, whatever its body.
|
|
112
|
+
if (!(error instanceof PingRoomError && error.status === 0 && error.code === 'invalid_response')) {
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
86
116
|
}
|
|
87
117
|
headers() {
|
|
88
118
|
return {
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA4BvC;;;;GAIG;AACH,MAAM,OAAO,SAAS;IAOD;IACA;IAPX,MAAM,GAAG,CAAC,CAAC;IACX,cAAc,GAAwC,IAAI,CAAC;IAC3D,gBAAgB,GAA+B,IAAI,CAAC;IACpD,eAAe,GAAkB,IAAI,CAAC;IAE9C,YACmB,IAAgB,EAChB,OAAO,gBAAgB;QADvB,SAAI,GAAJ,IAAI,CAAY;QAChB,SAAI,GAAJ,IAAI,CAAmB;IACvC,CAAC;IAEJ,4FAA4F;IAC5F,KAAK,CAAC,IAAI,CAAc,MAAc,EAAE,MAAgC;QACtE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/E,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { HttpClient } from '../http.js';
|
|
2
|
+
import type { PingResult, QuickAction, TriggerInput, QuickActionInput, UpdateQuickActionInput, UpdateQuickActionLayoutInput } from '../types.js';
|
|
3
|
+
export declare class ActionsApi {
|
|
4
|
+
private readonly http;
|
|
5
|
+
constructor(http: HttpClient);
|
|
6
|
+
list(inviteCode: string): Promise<QuickAction[]>;
|
|
7
|
+
update(inviteCode: string, actionNumber: number, input: UpdateQuickActionInput): Promise<QuickAction>;
|
|
8
|
+
/**
|
|
9
|
+
* Write up to 16 action slots in one request. The server enforces the room owner's plan.
|
|
10
|
+
* Add new pages in complete groups of four; existing slots may be edited individually.
|
|
11
|
+
*
|
|
12
|
+
* Prefer this over looping `update()`. Each single-slot write enqueues its
|
|
13
|
+
* own silent rooms-refresh push, so configuring a room's four Pings one at a
|
|
14
|
+
* time wakes room members' devices four times inside a few seconds — four of a
|
|
15
|
+
* finite daily background-push budget spent on one logical operation.
|
|
16
|
+
*
|
|
17
|
+
* Partial and additive: slots absent from `actions` keep their current
|
|
18
|
+
* configuration, so this is also the right call for editing a single Ping.
|
|
19
|
+
* Nothing here deletes an action, and an empty array is rejected locally
|
|
20
|
+
* rather than being sent as a clear. Resolves to the room's full ordered
|
|
21
|
+
* action set, not just the slots written.
|
|
22
|
+
*/
|
|
23
|
+
updateMany(inviteCode: string, actions: QuickActionInput[]): Promise<QuickAction[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Press a slot. When the action has an `input_type`, pass the matching
|
|
26
|
+
* detail (`data.location`, `data.url`, or `attachment_ids`) or the server
|
|
27
|
+
* refuses the press with `422 quick_action_input_required` and sends nothing.
|
|
28
|
+
* Read `input_type` from `list()` first; pass the action's `id` as
|
|
29
|
+
* `quick_action_id` to be refused rather than fire the wrong Ping if the
|
|
30
|
+
* owner moved pages meanwhile.
|
|
31
|
+
*/
|
|
32
|
+
trigger(inviteCode: string, actionNumber: number, input?: TriggerInput): Promise<PingResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Replace the room's page layout atomically (room owner on Pro only). See
|
|
35
|
+
* `UpdateQuickActionLayoutInput` for the snapshot contract; a stale
|
|
36
|
+
* `base_action_ids` is `409 quick_action_layout_changed`, a page still used
|
|
37
|
+
* by a time trigger, webhook, agent binding or running live update is
|
|
38
|
+
* `409 quick_action_page_in_use`. Prefer `deletePage()`, which builds the
|
|
39
|
+
* body from a fresh read.
|
|
40
|
+
*/
|
|
41
|
+
updateLayout(inviteCode: string, input: UpdateQuickActionLayoutInput): Promise<QuickAction[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Delete one page (1–4) and shift the later pages left, keeping every other
|
|
44
|
+
* slot's configuration. Reads the current action set first so the layout
|
|
45
|
+
* snapshot is real, then calls `updateLayout()`. Page 1 can be deleted only
|
|
46
|
+
* when another page remains.
|
|
47
|
+
*/
|
|
48
|
+
deletePage(inviteCode: string, page: number): Promise<QuickAction[]>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/namespaces/actions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAuErB,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIhD,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IAWrG;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAenF;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,GAAE,YAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAUhG;;;;;;;OAOG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA8B7F;;;;;OAKG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAsC3E"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// `pr.actions`: a room's quick-action slots, pages and presses.
|
|
2
|
+
import { PingRoomError } from '../errors.js';
|
|
3
|
+
import { assertActionNumber, requireNonEmpty, requirePresentString } from '../internal/guards.js';
|
|
4
|
+
import { linkPing } from '../linkPing.js';
|
|
5
|
+
import { locationPing } from '../locationPing.js';
|
|
6
|
+
import { enc, splitIdempotencyKey, dropUndefined } from '../internal/request.js';
|
|
7
|
+
const MAX_TRIGGER_ATTACHMENTS = 4;
|
|
8
|
+
const QUICK_ACTION_PAGE_SIZE = 4;
|
|
9
|
+
const MAX_QUICK_ACTION_PAGES = 4;
|
|
10
|
+
/**
|
|
11
|
+
* The per-slot checks shared by `updateMany()` and `updateLayout()`: a valid,
|
|
12
|
+
* present, unique action_number and an icon whenever the slot has a label.
|
|
13
|
+
* Two entries for one slot would let the last silently win, and the caller
|
|
14
|
+
* would never learn which of its definitions was stored.
|
|
15
|
+
*/
|
|
16
|
+
function assertActionSlots(actions) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
for (const action of actions) {
|
|
19
|
+
assertActionNumber(action.action_number);
|
|
20
|
+
if (action.action_number === undefined || action.action_number === null) {
|
|
21
|
+
throw new PingRoomError('`action_number` is required for each action.', { code: 'invalid_request' });
|
|
22
|
+
}
|
|
23
|
+
if (seen.has(action.action_number)) {
|
|
24
|
+
throw new PingRoomError(`Duplicate action_number ${action.action_number}.`, { code: 'invalid_request' });
|
|
25
|
+
}
|
|
26
|
+
seen.add(action.action_number);
|
|
27
|
+
assertQuickActionIcon(action);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Mirrors the server's `icon` rule (`present`, `required_with:label`): the emoji
|
|
32
|
+
* is the half that must be there unless BOTH are empty, which reserves the
|
|
33
|
+
* slot as disabled.
|
|
34
|
+
*/
|
|
35
|
+
function assertQuickActionIcon(action) {
|
|
36
|
+
requirePresentString(action.label, 'label');
|
|
37
|
+
requirePresentString(action.icon, 'icon');
|
|
38
|
+
if (action.icon.trim() === '' && action.label.trim() !== '') {
|
|
39
|
+
throw new PingRoomError('`icon` is required when `label` is set; send both empty to disable the slot.', {
|
|
40
|
+
code: 'invalid_request',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function assertTriggerInput(input) {
|
|
45
|
+
const data = input.data;
|
|
46
|
+
if (data !== undefined) {
|
|
47
|
+
if (data === null || typeof data !== 'object' || Array.isArray(data)) {
|
|
48
|
+
throw new PingRoomError('`data` must be an object with `location` and/or `url`.', { code: 'invalid_request' });
|
|
49
|
+
}
|
|
50
|
+
for (const key of Object.keys(data)) {
|
|
51
|
+
if (key !== 'location' && key !== 'url') {
|
|
52
|
+
throw new PingRoomError(`\`data.${key}\` is not accepted on a quick-action press; only location and url are.`, {
|
|
53
|
+
code: 'invalid_request',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
if (data.location !== undefined)
|
|
59
|
+
locationPing(data.location);
|
|
60
|
+
if (data.url !== undefined)
|
|
61
|
+
linkPing({ url: data.url });
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new PingRoomError(error.message, { code: 'invalid_request' });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (input.attachment_ids !== undefined) {
|
|
68
|
+
if (!Array.isArray(input.attachment_ids) || input.attachment_ids.length > MAX_TRIGGER_ATTACHMENTS) {
|
|
69
|
+
throw new PingRoomError(`\`attachment_ids\` accepts at most ${MAX_TRIGGER_ATTACHMENTS} ids.`, { code: 'invalid_request' });
|
|
70
|
+
}
|
|
71
|
+
for (const id of input.attachment_ids)
|
|
72
|
+
requireNonEmpty(id, 'attachment_ids[]');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export class ActionsApi {
|
|
76
|
+
http;
|
|
77
|
+
constructor(http) {
|
|
78
|
+
this.http = http;
|
|
79
|
+
}
|
|
80
|
+
list(inviteCode) {
|
|
81
|
+
return this.http.request('GET', `/api/agent/rooms/${enc(inviteCode)}/actions`);
|
|
82
|
+
}
|
|
83
|
+
update(inviteCode, actionNumber, input) {
|
|
84
|
+
assertActionNumber(actionNumber);
|
|
85
|
+
// A Ping's title is optional — its emoji can be the whole name — so an
|
|
86
|
+
// empty `label` is a valid update. `icon` is the half that must be there,
|
|
87
|
+
// unless both are empty: that reserves the slot as disabled.
|
|
88
|
+
assertQuickActionIcon(input);
|
|
89
|
+
return this.http.request('PUT', `/api/agent/rooms/${enc(inviteCode)}/actions/${actionNumber}`, {
|
|
90
|
+
body: dropUndefined({ ...input }),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Write up to 16 action slots in one request. The server enforces the room owner's plan.
|
|
95
|
+
* Add new pages in complete groups of four; existing slots may be edited individually.
|
|
96
|
+
*
|
|
97
|
+
* Prefer this over looping `update()`. Each single-slot write enqueues its
|
|
98
|
+
* own silent rooms-refresh push, so configuring a room's four Pings one at a
|
|
99
|
+
* time wakes room members' devices four times inside a few seconds — four of a
|
|
100
|
+
* finite daily background-push budget spent on one logical operation.
|
|
101
|
+
*
|
|
102
|
+
* Partial and additive: slots absent from `actions` keep their current
|
|
103
|
+
* configuration, so this is also the right call for editing a single Ping.
|
|
104
|
+
* Nothing here deletes an action, and an empty array is rejected locally
|
|
105
|
+
* rather than being sent as a clear. Resolves to the room's full ordered
|
|
106
|
+
* action set, not just the slots written.
|
|
107
|
+
*/
|
|
108
|
+
updateMany(inviteCode, actions) {
|
|
109
|
+
if (!Array.isArray(actions) || actions.length === 0) {
|
|
110
|
+
throw new PingRoomError('`actions` must contain at least one action.', { code: 'invalid_request' });
|
|
111
|
+
}
|
|
112
|
+
if (actions.length > 16) {
|
|
113
|
+
throw new PingRoomError('A batch may contain at most 16 action slots.', { code: 'invalid_request' });
|
|
114
|
+
}
|
|
115
|
+
assertActionSlots(actions);
|
|
116
|
+
return this.http.request('PUT', `/api/agent/rooms/${enc(inviteCode)}/actions`, {
|
|
117
|
+
body: { actions: actions.map((action) => dropUndefined({ ...action })) },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Press a slot. When the action has an `input_type`, pass the matching
|
|
122
|
+
* detail (`data.location`, `data.url`, or `attachment_ids`) or the server
|
|
123
|
+
* refuses the press with `422 quick_action_input_required` and sends nothing.
|
|
124
|
+
* Read `input_type` from `list()` first; pass the action's `id` as
|
|
125
|
+
* `quick_action_id` to be refused rather than fire the wrong Ping if the
|
|
126
|
+
* owner moved pages meanwhile.
|
|
127
|
+
*/
|
|
128
|
+
trigger(inviteCode, actionNumber, input = {}) {
|
|
129
|
+
assertActionNumber(actionNumber);
|
|
130
|
+
assertTriggerInput(input);
|
|
131
|
+
const { body, headers } = splitIdempotencyKey(input);
|
|
132
|
+
return this.http.request('POST', `/api/agent/rooms/${enc(inviteCode)}/actions/${actionNumber}/trigger`, {
|
|
133
|
+
body: dropUndefined({ ...body }),
|
|
134
|
+
...(headers ? { headers } : {}),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Replace the room's page layout atomically (room owner on Pro only). See
|
|
139
|
+
* `UpdateQuickActionLayoutInput` for the snapshot contract; a stale
|
|
140
|
+
* `base_action_ids` is `409 quick_action_layout_changed`, a page still used
|
|
141
|
+
* by a time trigger, webhook, agent binding or running live update is
|
|
142
|
+
* `409 quick_action_page_in_use`. Prefer `deletePage()`, which builds the
|
|
143
|
+
* body from a fresh read.
|
|
144
|
+
*/
|
|
145
|
+
updateLayout(inviteCode, input) {
|
|
146
|
+
if (!Array.isArray(input.base_action_ids)) {
|
|
147
|
+
throw new PingRoomError('`base_action_ids` must be an array of action ids (may be empty).', { code: 'invalid_request' });
|
|
148
|
+
}
|
|
149
|
+
if (!Array.isArray(input.page_order) || input.page_order.length < 1 || input.page_order.length > MAX_QUICK_ACTION_PAGES) {
|
|
150
|
+
throw new PingRoomError(`\`page_order\` must list 1–${MAX_QUICK_ACTION_PAGES} pages.`, { code: 'invalid_request' });
|
|
151
|
+
}
|
|
152
|
+
for (const page of input.page_order) {
|
|
153
|
+
if (page !== null && (!Number.isInteger(page) || page < 1 || page > MAX_QUICK_ACTION_PAGES)) {
|
|
154
|
+
throw new PingRoomError('`page_order` entries must be an original page number 1–4 or null for a blank page.', {
|
|
155
|
+
code: 'invalid_request',
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const expected = input.page_order.length * QUICK_ACTION_PAGE_SIZE;
|
|
160
|
+
if (!Array.isArray(input.actions) || input.actions.length !== expected) {
|
|
161
|
+
throw new PingRoomError(`\`actions\` must hold exactly ${expected} slots for ${input.page_order.length} page(s).`, {
|
|
162
|
+
code: 'invalid_request',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
assertActionSlots(input.actions);
|
|
166
|
+
return this.http.request('PUT', `/api/agent/rooms/${enc(inviteCode)}/actions/layout`, {
|
|
167
|
+
body: {
|
|
168
|
+
base_action_ids: input.base_action_ids,
|
|
169
|
+
page_order: input.page_order,
|
|
170
|
+
actions: input.actions.map((action) => dropUndefined({ ...action })),
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Delete one page (1–4) and shift the later pages left, keeping every other
|
|
176
|
+
* slot's configuration. Reads the current action set first so the layout
|
|
177
|
+
* snapshot is real, then calls `updateLayout()`. Page 1 can be deleted only
|
|
178
|
+
* when another page remains.
|
|
179
|
+
*/
|
|
180
|
+
async deletePage(inviteCode, page) {
|
|
181
|
+
if (!Number.isInteger(page) || page < 1 || page > MAX_QUICK_ACTION_PAGES) {
|
|
182
|
+
throw new PingRoomError('`page` must be an integer 1–4.', { code: 'invalid_request' });
|
|
183
|
+
}
|
|
184
|
+
const current = await this.list(inviteCode);
|
|
185
|
+
const stored = [...current].sort((a, b) => a.action_number - b.action_number);
|
|
186
|
+
const pageCount = Math.max(1, Math.ceil((stored.at(-1)?.action_number ?? 0) / QUICK_ACTION_PAGE_SIZE));
|
|
187
|
+
if (page > pageCount) {
|
|
188
|
+
throw new PingRoomError(`The room has ${pageCount} page(s); page ${page} does not exist.`, { code: 'invalid_request' });
|
|
189
|
+
}
|
|
190
|
+
if (pageCount === 1) {
|
|
191
|
+
throw new PingRoomError('A room keeps at least one page; configure its slots instead of deleting it.', {
|
|
192
|
+
code: 'invalid_request',
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
const keep = Array.from({ length: pageCount }, (_, i) => i + 1).filter((p) => p !== page);
|
|
196
|
+
const byNumber = new Map(stored.map((a) => [a.action_number, a]));
|
|
197
|
+
const actions = [];
|
|
198
|
+
keep.forEach((originalPage, index) => {
|
|
199
|
+
for (let offset = 1; offset <= QUICK_ACTION_PAGE_SIZE; offset++) {
|
|
200
|
+
const source = byNumber.get((originalPage - 1) * QUICK_ACTION_PAGE_SIZE + offset);
|
|
201
|
+
actions.push({
|
|
202
|
+
action_number: index * QUICK_ACTION_PAGE_SIZE + offset,
|
|
203
|
+
label: source?.label ?? '',
|
|
204
|
+
icon: source?.icon ?? '',
|
|
205
|
+
...(source?.sound !== undefined ? { sound: source.sound } : {}),
|
|
206
|
+
...(source?.haptic_style !== undefined ? { haptic_style: source.haptic_style } : {}),
|
|
207
|
+
...(source?.requires_ack !== undefined ? { requires_ack: source.requires_ack } : {}),
|
|
208
|
+
...(source?.input_type !== undefined ? { input_type: source.input_type } : {}),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
return this.updateLayout(inviteCode, {
|
|
213
|
+
base_action_ids: stored.map((a) => a.id).filter((id) => typeof id === 'string'),
|
|
214
|
+
page_order: keep,
|
|
215
|
+
actions,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/namespaces/actions.ts"],"names":[],"mappings":"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"}
|