@pidgeon-ai/cli 1.44.0 → 2.1.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/CHANGELOG.md +24 -0
- package/LICENSE +55 -21
- package/README.md +31 -90
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +12 -0
- package/dist/cli.d.ts +11 -2
- package/dist/cli.js +615 -24
- package/package.json +22 -45
- package/dist/chunk-FZA3INVW.js +0 -5172
- package/dist/chunk-FZA3INVW.js.map +0 -1
- package/dist/chunk-M4R74E7X.js +0 -3339
- package/dist/chunk-M4R74E7X.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands.gen.d.ts +0 -24
- package/dist/commands.gen.js +0 -8
- package/dist/commands.gen.js.map +0 -1
- package/dist/index.d.ts +0 -39
- package/dist/index.js +0 -19
- package/dist/index.js.map +0 -1
package/dist/chunk-M4R74E7X.js
DELETED
|
@@ -1,3339 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
COMMANDS,
|
|
4
|
-
__export
|
|
5
|
-
} from "./chunk-FZA3INVW.js";
|
|
6
|
-
|
|
7
|
-
// ../sdk/dist/index.js
|
|
8
|
-
var dist_exports = {};
|
|
9
|
-
__export(dist_exports, {
|
|
10
|
-
SIGNATURE_HEADER: () => SIGNATURE_HEADER,
|
|
11
|
-
TIMESTAMP_HEADER: () => TIMESTAMP_HEADER,
|
|
12
|
-
agentAttachHuman: () => agentAttachHuman,
|
|
13
|
-
agentConnect: () => agentConnect,
|
|
14
|
-
agentSetup: () => agentSetup,
|
|
15
|
-
agentSignUp: () => agentSignUp,
|
|
16
|
-
agentVerify: () => agentVerify,
|
|
17
|
-
appPasswordsCreate: () => appPasswordsCreate,
|
|
18
|
-
appPasswordsList: () => appPasswordsList,
|
|
19
|
-
appPasswordsRevoke: () => appPasswordsRevoke,
|
|
20
|
-
attachmentsCompleteUpload: () => attachmentsCompleteUpload,
|
|
21
|
-
attachmentsCreateUpload: () => attachmentsCreateUpload,
|
|
22
|
-
attachmentsDownloadUrl: () => attachmentsDownloadUrl,
|
|
23
|
-
attachmentsText: () => attachmentsText,
|
|
24
|
-
attachmentsUpload: () => attachmentsUpload,
|
|
25
|
-
calendarCreateEvent: () => calendarCreateEvent,
|
|
26
|
-
calendarDeleteEvent: () => calendarDeleteEvent,
|
|
27
|
-
calendarFreeTime: () => calendarFreeTime,
|
|
28
|
-
calendarGet: () => calendarGet,
|
|
29
|
-
calendarGetAgenda: () => calendarGetAgenda,
|
|
30
|
-
calendarGetEvent: () => calendarGetEvent,
|
|
31
|
-
calendarListEventInstances: () => calendarListEventInstances,
|
|
32
|
-
calendarListEvents: () => calendarListEvents,
|
|
33
|
-
calendarRespondToEvent: () => calendarRespondToEvent,
|
|
34
|
-
calendarUpdate: () => calendarUpdate,
|
|
35
|
-
calendarUpdateEvent: () => calendarUpdateEvent,
|
|
36
|
-
cardsGet: () => cardsGet,
|
|
37
|
-
client: () => client,
|
|
38
|
-
contactsBlock: () => contactsBlock,
|
|
39
|
-
contactsCreate: () => contactsCreate,
|
|
40
|
-
contactsDelete: () => contactsDelete,
|
|
41
|
-
contactsGet: () => contactsGet,
|
|
42
|
-
contactsList: () => contactsList,
|
|
43
|
-
contactsUnblock: () => contactsUnblock,
|
|
44
|
-
contactsUpdate: () => contactsUpdate,
|
|
45
|
-
createClient: () => createClient,
|
|
46
|
-
createConfig: () => createConfig,
|
|
47
|
-
domainsCreate: () => domainsCreate,
|
|
48
|
-
domainsDelete: () => domainsDelete,
|
|
49
|
-
domainsGet: () => domainsGet,
|
|
50
|
-
domainsGetSetupLink: () => domainsGetSetupLink,
|
|
51
|
-
domainsList: () => domainsList,
|
|
52
|
-
domainsUpdate: () => domainsUpdate,
|
|
53
|
-
domainsVerify: () => domainsVerify,
|
|
54
|
-
domainsZoneFile: () => domainsZoneFile,
|
|
55
|
-
draftsApproval: () => draftsApproval,
|
|
56
|
-
draftsCancelSchedule: () => draftsCancelSchedule,
|
|
57
|
-
draftsCreate: () => draftsCreate,
|
|
58
|
-
draftsDelete: () => draftsDelete,
|
|
59
|
-
draftsGet: () => draftsGet,
|
|
60
|
-
draftsList: () => draftsList,
|
|
61
|
-
draftsRemoveAttachment: () => draftsRemoveAttachment,
|
|
62
|
-
draftsSchedule: () => draftsSchedule,
|
|
63
|
-
draftsSend: () => draftsSend,
|
|
64
|
-
draftsUpdate: () => draftsUpdate,
|
|
65
|
-
eventsGet: () => eventsGet,
|
|
66
|
-
eventsList: () => eventsList,
|
|
67
|
-
eventsSocket: () => eventsSocket,
|
|
68
|
-
eventsStream: () => eventsStream,
|
|
69
|
-
exportMail: () => exportMail,
|
|
70
|
-
grantsCreate: () => grantsCreate,
|
|
71
|
-
grantsGet: () => grantsGet,
|
|
72
|
-
grantsList: () => grantsList,
|
|
73
|
-
grantsRevoke: () => grantsRevoke,
|
|
74
|
-
grantsStatus: () => grantsStatus,
|
|
75
|
-
grantsTemplatesCreate: () => grantsTemplatesCreate,
|
|
76
|
-
grantsTemplatesDelete: () => grantsTemplatesDelete,
|
|
77
|
-
grantsTemplatesList: () => grantsTemplatesList,
|
|
78
|
-
identitiesAccessCreate: () => identitiesAccessCreate,
|
|
79
|
-
identitiesAccessDelete: () => identitiesAccessDelete,
|
|
80
|
-
identitiesAccessGet: () => identitiesAccessGet,
|
|
81
|
-
identitiesCard: () => identitiesCard,
|
|
82
|
-
identitiesCreate: () => identitiesCreate,
|
|
83
|
-
identitiesDelete: () => identitiesDelete,
|
|
84
|
-
identitiesGet: () => identitiesGet,
|
|
85
|
-
identitiesList: () => identitiesList,
|
|
86
|
-
identitiesReceiveRulesCreate: () => identitiesReceiveRulesCreate,
|
|
87
|
-
identitiesReceiveRulesDelete: () => identitiesReceiveRulesDelete,
|
|
88
|
-
identitiesReceiveRulesGet: () => identitiesReceiveRulesGet,
|
|
89
|
-
identitiesSendRulesCreate: () => identitiesSendRulesCreate,
|
|
90
|
-
identitiesSendRulesDelete: () => identitiesSendRulesDelete,
|
|
91
|
-
identitiesSendRulesGet: () => identitiesSendRulesGet,
|
|
92
|
-
identitiesSuspendTenant: () => identitiesSuspendTenant,
|
|
93
|
-
identitiesUpdate: () => identitiesUpdate,
|
|
94
|
-
keysCreate: () => keysCreate,
|
|
95
|
-
keysGet: () => keysGet,
|
|
96
|
-
keysList: () => keysList,
|
|
97
|
-
keysRevoke: () => keysRevoke,
|
|
98
|
-
keysRotate: () => keysRotate,
|
|
99
|
-
keysUpdate: () => keysUpdate,
|
|
100
|
-
labelsCreate: () => labelsCreate,
|
|
101
|
-
labelsDelete: () => labelsDelete,
|
|
102
|
-
labelsList: () => labelsList,
|
|
103
|
-
labelsUpdate: () => labelsUpdate,
|
|
104
|
-
logCheckpoint: () => logCheckpoint,
|
|
105
|
-
logConsistency: () => logConsistency,
|
|
106
|
-
logEntries: () => logEntries,
|
|
107
|
-
logHead: () => logHead,
|
|
108
|
-
logMonitorsCreate: () => logMonitorsCreate,
|
|
109
|
-
logMonitorsDelete: () => logMonitorsDelete,
|
|
110
|
-
logMonitorsList: () => logMonitorsList,
|
|
111
|
-
logProof: () => logProof,
|
|
112
|
-
mailboxesChanges: () => mailboxesChanges,
|
|
113
|
-
mailboxesEmptyTrash: () => mailboxesEmptyTrash,
|
|
114
|
-
mailboxesList: () => mailboxesList,
|
|
115
|
-
mailboxesListFolder: () => mailboxesListFolder,
|
|
116
|
-
meGet: () => meGet,
|
|
117
|
-
messagesAct: () => messagesAct,
|
|
118
|
-
messagesAwait: () => messagesAwait,
|
|
119
|
-
messagesCheck: () => messagesCheck,
|
|
120
|
-
messagesForward: () => messagesForward,
|
|
121
|
-
messagesGet: () => messagesGet,
|
|
122
|
-
messagesListInThread: () => messagesListInThread,
|
|
123
|
-
messagesRaw: () => messagesRaw,
|
|
124
|
-
messagesReply: () => messagesReply,
|
|
125
|
-
messagesReplyAll: () => messagesReplyAll,
|
|
126
|
-
messagesRespondToInvitation: () => messagesRespondToInvitation,
|
|
127
|
-
messagesSearch: () => messagesSearch,
|
|
128
|
-
messagesSend: () => messagesSend,
|
|
129
|
-
messagesUndo: () => messagesUndo,
|
|
130
|
-
messagesUpdate: () => messagesUpdate,
|
|
131
|
-
metricsQuery: () => metricsQuery,
|
|
132
|
-
podsCreate: () => podsCreate,
|
|
133
|
-
podsDelete: () => podsDelete,
|
|
134
|
-
podsGet: () => podsGet,
|
|
135
|
-
podsList: () => podsList,
|
|
136
|
-
podsUpdate: () => podsUpdate,
|
|
137
|
-
routingCreate: () => routingCreate,
|
|
138
|
-
routingDelete: () => routingDelete,
|
|
139
|
-
routingList: () => routingList,
|
|
140
|
-
routingUpdate: () => routingUpdate,
|
|
141
|
-
signInsApprove: () => signInsApprove,
|
|
142
|
-
streamEvents: () => streamEvents,
|
|
143
|
-
testInbound: () => testInbound,
|
|
144
|
-
threadsGet: () => threadsGet,
|
|
145
|
-
threadsLabelsCreate: () => threadsLabelsCreate,
|
|
146
|
-
threadsLabelsDelete: () => threadsLabelsDelete,
|
|
147
|
-
threadsLabelsGet: () => threadsLabelsGet,
|
|
148
|
-
threadsList: () => threadsList,
|
|
149
|
-
threadsUpdate: () => threadsUpdate,
|
|
150
|
-
verifySender: () => verifySender,
|
|
151
|
-
verifyWebhook: () => verifyWebhook,
|
|
152
|
-
webhooksCreate: () => webhooksCreate,
|
|
153
|
-
webhooksDelete: () => webhooksDelete,
|
|
154
|
-
webhooksDeliveries: () => webhooksDeliveries,
|
|
155
|
-
webhooksGet: () => webhooksGet,
|
|
156
|
-
webhooksGetHeaders: () => webhooksGetHeaders,
|
|
157
|
-
webhooksList: () => webhooksList,
|
|
158
|
-
webhooksReplay: () => webhooksReplay,
|
|
159
|
-
webhooksUpdate: () => webhooksUpdate,
|
|
160
|
-
webhooksUpdateHeaders: () => webhooksUpdateHeaders,
|
|
161
|
-
workspaceGet: () => workspaceGet,
|
|
162
|
-
workspaceMembers: () => workspaceMembers
|
|
163
|
-
});
|
|
164
|
-
var serializeFormDataPair = (data, key, value) => {
|
|
165
|
-
if (typeof value === "string" || value instanceof Blob) {
|
|
166
|
-
data.append(key, value);
|
|
167
|
-
} else if (value instanceof Date) {
|
|
168
|
-
data.append(key, value.toISOString());
|
|
169
|
-
} else {
|
|
170
|
-
data.append(key, JSON.stringify(value));
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
var formDataBodySerializer = {
|
|
174
|
-
bodySerializer: (body) => {
|
|
175
|
-
const data = new FormData();
|
|
176
|
-
Object.entries(body).forEach(([key, value]) => {
|
|
177
|
-
if (value === void 0 || value === null) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
if (Array.isArray(value)) {
|
|
181
|
-
value.forEach((v) => serializeFormDataPair(data, key, v));
|
|
182
|
-
} else {
|
|
183
|
-
serializeFormDataPair(data, key, value);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
return data;
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
var jsonBodySerializer = {
|
|
190
|
-
bodySerializer: (body) => JSON.stringify(body, (_key, value) => typeof value === "bigint" ? value.toString() : value)
|
|
191
|
-
};
|
|
192
|
-
function createSseClient({
|
|
193
|
-
onRequest,
|
|
194
|
-
onSseError,
|
|
195
|
-
onSseEvent,
|
|
196
|
-
responseTransformer,
|
|
197
|
-
responseValidator,
|
|
198
|
-
sseDefaultRetryDelay,
|
|
199
|
-
sseMaxRetryAttempts,
|
|
200
|
-
sseMaxRetryDelay,
|
|
201
|
-
sseSleepFn,
|
|
202
|
-
url,
|
|
203
|
-
...options
|
|
204
|
-
}) {
|
|
205
|
-
let lastEventId;
|
|
206
|
-
const sleep2 = sseSleepFn ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
207
|
-
const createStream = async function* () {
|
|
208
|
-
let retryDelay = sseDefaultRetryDelay ?? 3e3;
|
|
209
|
-
let attempt = 0;
|
|
210
|
-
const signal = options.signal ?? new AbortController().signal;
|
|
211
|
-
while (true) {
|
|
212
|
-
if (signal.aborted) break;
|
|
213
|
-
attempt++;
|
|
214
|
-
const headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers);
|
|
215
|
-
if (lastEventId !== void 0) {
|
|
216
|
-
headers.set("Last-Event-ID", lastEventId);
|
|
217
|
-
}
|
|
218
|
-
try {
|
|
219
|
-
const requestInit = {
|
|
220
|
-
redirect: "follow",
|
|
221
|
-
...options,
|
|
222
|
-
body: options.serializedBody,
|
|
223
|
-
headers,
|
|
224
|
-
signal
|
|
225
|
-
};
|
|
226
|
-
let request = new Request(url, requestInit);
|
|
227
|
-
if (onRequest) {
|
|
228
|
-
request = await onRequest(url, requestInit);
|
|
229
|
-
}
|
|
230
|
-
const _fetch = options.fetch ?? globalThis.fetch;
|
|
231
|
-
const response = await _fetch(request);
|
|
232
|
-
if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`);
|
|
233
|
-
if (!response.body) throw new Error("No body in SSE response");
|
|
234
|
-
const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
|
|
235
|
-
let buffer = "";
|
|
236
|
-
const abortHandler = () => {
|
|
237
|
-
try {
|
|
238
|
-
reader.cancel();
|
|
239
|
-
} catch {
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
signal.addEventListener("abort", abortHandler);
|
|
243
|
-
try {
|
|
244
|
-
while (true) {
|
|
245
|
-
const { done, value } = await reader.read();
|
|
246
|
-
if (done) break;
|
|
247
|
-
buffer += value;
|
|
248
|
-
buffer = buffer.replace(/\r\n?/g, "\n");
|
|
249
|
-
const chunks = buffer.split("\n\n");
|
|
250
|
-
buffer = chunks.pop() ?? "";
|
|
251
|
-
for (const chunk of chunks) {
|
|
252
|
-
const lines = chunk.split("\n");
|
|
253
|
-
const dataLines = [];
|
|
254
|
-
let eventName;
|
|
255
|
-
for (const line of lines) {
|
|
256
|
-
if (line.startsWith("data:")) {
|
|
257
|
-
dataLines.push(line.replace(/^data:\s*/, ""));
|
|
258
|
-
} else if (line.startsWith("event:")) {
|
|
259
|
-
eventName = line.replace(/^event:\s*/, "");
|
|
260
|
-
} else if (line.startsWith("id:")) {
|
|
261
|
-
lastEventId = line.replace(/^id:\s*/, "");
|
|
262
|
-
} else if (line.startsWith("retry:")) {
|
|
263
|
-
const parsed = Number.parseInt(line.replace(/^retry:\s*/, ""), 10);
|
|
264
|
-
if (!Number.isNaN(parsed)) {
|
|
265
|
-
retryDelay = parsed;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
let data;
|
|
270
|
-
let parsedJson = false;
|
|
271
|
-
if (dataLines.length) {
|
|
272
|
-
const rawData = dataLines.join("\n");
|
|
273
|
-
try {
|
|
274
|
-
data = JSON.parse(rawData);
|
|
275
|
-
parsedJson = true;
|
|
276
|
-
} catch {
|
|
277
|
-
data = rawData;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
if (parsedJson) {
|
|
281
|
-
if (responseValidator) {
|
|
282
|
-
await responseValidator(data);
|
|
283
|
-
}
|
|
284
|
-
if (responseTransformer) {
|
|
285
|
-
data = await responseTransformer(data);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
onSseEvent?.({
|
|
289
|
-
data,
|
|
290
|
-
event: eventName,
|
|
291
|
-
id: lastEventId,
|
|
292
|
-
retry: retryDelay
|
|
293
|
-
});
|
|
294
|
-
if (dataLines.length) {
|
|
295
|
-
yield data;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
} finally {
|
|
300
|
-
signal.removeEventListener("abort", abortHandler);
|
|
301
|
-
reader.releaseLock();
|
|
302
|
-
}
|
|
303
|
-
break;
|
|
304
|
-
} catch (error) {
|
|
305
|
-
onSseError?.(error);
|
|
306
|
-
if (sseMaxRetryAttempts !== void 0 && attempt >= sseMaxRetryAttempts) {
|
|
307
|
-
break;
|
|
308
|
-
}
|
|
309
|
-
const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 3e4);
|
|
310
|
-
await sleep2(backoff);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
};
|
|
314
|
-
const stream = createStream();
|
|
315
|
-
return { stream };
|
|
316
|
-
}
|
|
317
|
-
var separatorArrayExplode = (style) => {
|
|
318
|
-
switch (style) {
|
|
319
|
-
case "label":
|
|
320
|
-
return ".";
|
|
321
|
-
case "matrix":
|
|
322
|
-
return ";";
|
|
323
|
-
case "simple":
|
|
324
|
-
return ",";
|
|
325
|
-
default:
|
|
326
|
-
return "&";
|
|
327
|
-
}
|
|
328
|
-
};
|
|
329
|
-
var separatorArrayNoExplode = (style) => {
|
|
330
|
-
switch (style) {
|
|
331
|
-
case "form":
|
|
332
|
-
return ",";
|
|
333
|
-
case "pipeDelimited":
|
|
334
|
-
return "|";
|
|
335
|
-
case "spaceDelimited":
|
|
336
|
-
return "%20";
|
|
337
|
-
default:
|
|
338
|
-
return ",";
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
var separatorObjectExplode = (style) => {
|
|
342
|
-
switch (style) {
|
|
343
|
-
case "label":
|
|
344
|
-
return ".";
|
|
345
|
-
case "matrix":
|
|
346
|
-
return ";";
|
|
347
|
-
case "simple":
|
|
348
|
-
return ",";
|
|
349
|
-
default:
|
|
350
|
-
return "&";
|
|
351
|
-
}
|
|
352
|
-
};
|
|
353
|
-
var serializeArrayParam = ({
|
|
354
|
-
allowReserved,
|
|
355
|
-
explode,
|
|
356
|
-
name,
|
|
357
|
-
style,
|
|
358
|
-
value
|
|
359
|
-
}) => {
|
|
360
|
-
if (!explode) {
|
|
361
|
-
const joinedValues2 = (allowReserved ? value : value.map((v) => encodeURIComponent(v))).join(separatorArrayNoExplode(style));
|
|
362
|
-
switch (style) {
|
|
363
|
-
case "label":
|
|
364
|
-
return `.${joinedValues2}`;
|
|
365
|
-
case "matrix":
|
|
366
|
-
return `;${name}=${joinedValues2}`;
|
|
367
|
-
case "simple":
|
|
368
|
-
return joinedValues2;
|
|
369
|
-
default:
|
|
370
|
-
return `${name}=${joinedValues2}`;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
const separator = separatorArrayExplode(style);
|
|
374
|
-
const joinedValues = value.map((v) => {
|
|
375
|
-
if (style === "label" || style === "simple") {
|
|
376
|
-
return allowReserved ? v : encodeURIComponent(v);
|
|
377
|
-
}
|
|
378
|
-
return serializePrimitiveParam({
|
|
379
|
-
allowReserved,
|
|
380
|
-
name,
|
|
381
|
-
value: v
|
|
382
|
-
});
|
|
383
|
-
}).join(separator);
|
|
384
|
-
return style === "label" || style === "matrix" ? separator + joinedValues : joinedValues;
|
|
385
|
-
};
|
|
386
|
-
var serializePrimitiveParam = ({
|
|
387
|
-
allowReserved,
|
|
388
|
-
name,
|
|
389
|
-
value
|
|
390
|
-
}) => {
|
|
391
|
-
if (value === void 0 || value === null) {
|
|
392
|
-
return "";
|
|
393
|
-
}
|
|
394
|
-
if (typeof value === "object") {
|
|
395
|
-
throw new Error(
|
|
396
|
-
"Deeply-nested arrays/objects aren\u2019t supported. Provide your own `querySerializer()` to handle these."
|
|
397
|
-
);
|
|
398
|
-
}
|
|
399
|
-
return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;
|
|
400
|
-
};
|
|
401
|
-
var serializeObjectParam = ({
|
|
402
|
-
allowReserved,
|
|
403
|
-
explode,
|
|
404
|
-
name,
|
|
405
|
-
style,
|
|
406
|
-
value,
|
|
407
|
-
valueOnly
|
|
408
|
-
}) => {
|
|
409
|
-
if (value instanceof Date) {
|
|
410
|
-
return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;
|
|
411
|
-
}
|
|
412
|
-
if (style !== "deepObject" && !explode) {
|
|
413
|
-
let values = [];
|
|
414
|
-
Object.entries(value).forEach(([key, v]) => {
|
|
415
|
-
values = [...values, key, allowReserved ? v : encodeURIComponent(v)];
|
|
416
|
-
});
|
|
417
|
-
const joinedValues2 = values.join(",");
|
|
418
|
-
switch (style) {
|
|
419
|
-
case "form":
|
|
420
|
-
return `${name}=${joinedValues2}`;
|
|
421
|
-
case "label":
|
|
422
|
-
return `.${joinedValues2}`;
|
|
423
|
-
case "matrix":
|
|
424
|
-
return `;${name}=${joinedValues2}`;
|
|
425
|
-
default:
|
|
426
|
-
return joinedValues2;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
const separator = separatorObjectExplode(style);
|
|
430
|
-
const joinedValues = Object.entries(value).map(
|
|
431
|
-
([key, v]) => serializePrimitiveParam({
|
|
432
|
-
allowReserved,
|
|
433
|
-
name: style === "deepObject" ? `${name}[${key}]` : key,
|
|
434
|
-
value: v
|
|
435
|
-
})
|
|
436
|
-
).join(separator);
|
|
437
|
-
return style === "label" || style === "matrix" ? separator + joinedValues : joinedValues;
|
|
438
|
-
};
|
|
439
|
-
var PATH_PARAM_RE = /\{[^{}]+\}/g;
|
|
440
|
-
var defaultPathSerializer = ({ path, url: _url }) => {
|
|
441
|
-
let url = _url;
|
|
442
|
-
const matches = _url.match(PATH_PARAM_RE);
|
|
443
|
-
if (matches) {
|
|
444
|
-
for (const match of matches) {
|
|
445
|
-
let explode = false;
|
|
446
|
-
let name = match.substring(1, match.length - 1);
|
|
447
|
-
let style = "simple";
|
|
448
|
-
if (name.endsWith("*")) {
|
|
449
|
-
explode = true;
|
|
450
|
-
name = name.substring(0, name.length - 1);
|
|
451
|
-
}
|
|
452
|
-
if (name.startsWith(".")) {
|
|
453
|
-
name = name.substring(1);
|
|
454
|
-
style = "label";
|
|
455
|
-
} else if (name.startsWith(";")) {
|
|
456
|
-
name = name.substring(1);
|
|
457
|
-
style = "matrix";
|
|
458
|
-
}
|
|
459
|
-
const value = path[name];
|
|
460
|
-
if (value === void 0 || value === null) {
|
|
461
|
-
continue;
|
|
462
|
-
}
|
|
463
|
-
if (Array.isArray(value)) {
|
|
464
|
-
url = url.replace(match, serializeArrayParam({ explode, name, style, value }));
|
|
465
|
-
continue;
|
|
466
|
-
}
|
|
467
|
-
if (typeof value === "object") {
|
|
468
|
-
url = url.replace(
|
|
469
|
-
match,
|
|
470
|
-
serializeObjectParam({
|
|
471
|
-
explode,
|
|
472
|
-
name,
|
|
473
|
-
style,
|
|
474
|
-
value,
|
|
475
|
-
valueOnly: true
|
|
476
|
-
})
|
|
477
|
-
);
|
|
478
|
-
continue;
|
|
479
|
-
}
|
|
480
|
-
if (style === "matrix") {
|
|
481
|
-
url = url.replace(
|
|
482
|
-
match,
|
|
483
|
-
`;${serializePrimitiveParam({
|
|
484
|
-
name,
|
|
485
|
-
value
|
|
486
|
-
})}`
|
|
487
|
-
);
|
|
488
|
-
continue;
|
|
489
|
-
}
|
|
490
|
-
const replaceValue = encodeURIComponent(
|
|
491
|
-
style === "label" ? `.${value}` : value
|
|
492
|
-
);
|
|
493
|
-
url = url.replace(match, replaceValue);
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
return url;
|
|
497
|
-
};
|
|
498
|
-
var getUrl = ({
|
|
499
|
-
baseUrl: baseUrl2,
|
|
500
|
-
path,
|
|
501
|
-
query,
|
|
502
|
-
querySerializer,
|
|
503
|
-
url: _url
|
|
504
|
-
}) => {
|
|
505
|
-
const pathUrl = _url.startsWith("/") ? _url : `/${_url}`;
|
|
506
|
-
let url = (baseUrl2 ?? "") + pathUrl;
|
|
507
|
-
if (path) {
|
|
508
|
-
url = defaultPathSerializer({ path, url });
|
|
509
|
-
}
|
|
510
|
-
let search = query ? querySerializer(query) : "";
|
|
511
|
-
if (search.startsWith("?")) {
|
|
512
|
-
search = search.substring(1);
|
|
513
|
-
}
|
|
514
|
-
if (search) {
|
|
515
|
-
url += `?${search}`;
|
|
516
|
-
}
|
|
517
|
-
return url;
|
|
518
|
-
};
|
|
519
|
-
function getValidRequestBody(options) {
|
|
520
|
-
const hasBody = options.body !== void 0;
|
|
521
|
-
const isSerializedBody = hasBody && options.bodySerializer;
|
|
522
|
-
if (isSerializedBody) {
|
|
523
|
-
if ("serializedBody" in options) {
|
|
524
|
-
const hasSerializedBody = options.serializedBody !== void 0 && options.serializedBody !== "";
|
|
525
|
-
return hasSerializedBody ? options.serializedBody : null;
|
|
526
|
-
}
|
|
527
|
-
return options.body !== "" ? options.body : null;
|
|
528
|
-
}
|
|
529
|
-
if (hasBody) {
|
|
530
|
-
return options.body;
|
|
531
|
-
}
|
|
532
|
-
return void 0;
|
|
533
|
-
}
|
|
534
|
-
var getAuthToken = async (auth, callback) => {
|
|
535
|
-
const token = typeof callback === "function" ? await callback(auth) : callback;
|
|
536
|
-
if (!token) {
|
|
537
|
-
return;
|
|
538
|
-
}
|
|
539
|
-
if (auth.scheme === "bearer") {
|
|
540
|
-
return `Bearer ${token}`;
|
|
541
|
-
}
|
|
542
|
-
if (auth.scheme === "basic") {
|
|
543
|
-
return `Basic ${btoa(token)}`;
|
|
544
|
-
}
|
|
545
|
-
return token;
|
|
546
|
-
};
|
|
547
|
-
var createQuerySerializer = ({
|
|
548
|
-
parameters = {},
|
|
549
|
-
...args
|
|
550
|
-
} = {}) => {
|
|
551
|
-
const querySerializer = (queryParams) => {
|
|
552
|
-
const search = [];
|
|
553
|
-
if (queryParams && typeof queryParams === "object") {
|
|
554
|
-
for (const name in queryParams) {
|
|
555
|
-
const value = queryParams[name];
|
|
556
|
-
if (value === void 0 || value === null) {
|
|
557
|
-
continue;
|
|
558
|
-
}
|
|
559
|
-
const options = parameters[name] || args;
|
|
560
|
-
if (Array.isArray(value)) {
|
|
561
|
-
const serializedArray = serializeArrayParam({
|
|
562
|
-
allowReserved: options.allowReserved,
|
|
563
|
-
explode: true,
|
|
564
|
-
name,
|
|
565
|
-
style: "form",
|
|
566
|
-
value,
|
|
567
|
-
...options.array
|
|
568
|
-
});
|
|
569
|
-
if (serializedArray) search.push(serializedArray);
|
|
570
|
-
} else if (typeof value === "object") {
|
|
571
|
-
const serializedObject = serializeObjectParam({
|
|
572
|
-
allowReserved: options.allowReserved,
|
|
573
|
-
explode: true,
|
|
574
|
-
name,
|
|
575
|
-
style: "deepObject",
|
|
576
|
-
value,
|
|
577
|
-
...options.object
|
|
578
|
-
});
|
|
579
|
-
if (serializedObject) search.push(serializedObject);
|
|
580
|
-
} else {
|
|
581
|
-
const serializedPrimitive = serializePrimitiveParam({
|
|
582
|
-
allowReserved: options.allowReserved,
|
|
583
|
-
name,
|
|
584
|
-
value
|
|
585
|
-
});
|
|
586
|
-
if (serializedPrimitive) search.push(serializedPrimitive);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
return search.join("&");
|
|
591
|
-
};
|
|
592
|
-
return querySerializer;
|
|
593
|
-
};
|
|
594
|
-
var getParseAs = (contentType) => {
|
|
595
|
-
if (!contentType) {
|
|
596
|
-
return "stream";
|
|
597
|
-
}
|
|
598
|
-
const cleanContent = contentType.split(";")[0]?.trim();
|
|
599
|
-
if (!cleanContent) {
|
|
600
|
-
return;
|
|
601
|
-
}
|
|
602
|
-
if (cleanContent.startsWith("application/json") || cleanContent.endsWith("+json")) {
|
|
603
|
-
return "json";
|
|
604
|
-
}
|
|
605
|
-
if (cleanContent === "multipart/form-data") {
|
|
606
|
-
return "formData";
|
|
607
|
-
}
|
|
608
|
-
if (["application/", "audio/", "image/", "video/"].some((type) => cleanContent.startsWith(type))) {
|
|
609
|
-
return "blob";
|
|
610
|
-
}
|
|
611
|
-
if (cleanContent.startsWith("text/")) {
|
|
612
|
-
return "text";
|
|
613
|
-
}
|
|
614
|
-
return;
|
|
615
|
-
};
|
|
616
|
-
var checkForExistence = (options, name) => {
|
|
617
|
-
if (!name) {
|
|
618
|
-
return false;
|
|
619
|
-
}
|
|
620
|
-
if (options.headers.has(name) || options.query?.[name] || options.headers.get("Cookie")?.includes(`${name}=`)) {
|
|
621
|
-
return true;
|
|
622
|
-
}
|
|
623
|
-
return false;
|
|
624
|
-
};
|
|
625
|
-
async function setAuthParams(options) {
|
|
626
|
-
for (const auth of options.security ?? []) {
|
|
627
|
-
if (checkForExistence(options, auth.name)) {
|
|
628
|
-
continue;
|
|
629
|
-
}
|
|
630
|
-
const token = await getAuthToken(auth, options.auth);
|
|
631
|
-
if (!token) {
|
|
632
|
-
continue;
|
|
633
|
-
}
|
|
634
|
-
const name = auth.name ?? "Authorization";
|
|
635
|
-
switch (auth.in) {
|
|
636
|
-
case "query":
|
|
637
|
-
if (!options.query) {
|
|
638
|
-
options.query = {};
|
|
639
|
-
}
|
|
640
|
-
options.query[name] = token;
|
|
641
|
-
break;
|
|
642
|
-
case "cookie":
|
|
643
|
-
options.headers.append("Cookie", `${name}=${token}`);
|
|
644
|
-
break;
|
|
645
|
-
case "header":
|
|
646
|
-
default:
|
|
647
|
-
options.headers.set(name, token);
|
|
648
|
-
break;
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
var buildUrl = (options) => getUrl({
|
|
653
|
-
baseUrl: options.baseUrl,
|
|
654
|
-
path: options.path,
|
|
655
|
-
query: options.query,
|
|
656
|
-
querySerializer: typeof options.querySerializer === "function" ? options.querySerializer : createQuerySerializer(options.querySerializer),
|
|
657
|
-
url: options.url
|
|
658
|
-
});
|
|
659
|
-
var mergeConfigs = (a, b) => {
|
|
660
|
-
const config = { ...a, ...b };
|
|
661
|
-
if (config.baseUrl?.endsWith("/")) {
|
|
662
|
-
config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);
|
|
663
|
-
}
|
|
664
|
-
config.headers = mergeHeaders(a.headers, b.headers);
|
|
665
|
-
return config;
|
|
666
|
-
};
|
|
667
|
-
var headersEntries = (headers) => {
|
|
668
|
-
const entries = [];
|
|
669
|
-
headers.forEach((value, key) => {
|
|
670
|
-
entries.push([key, value]);
|
|
671
|
-
});
|
|
672
|
-
return entries;
|
|
673
|
-
};
|
|
674
|
-
var mergeHeaders = (...headers) => {
|
|
675
|
-
const mergedHeaders = new Headers();
|
|
676
|
-
for (const header of headers) {
|
|
677
|
-
if (!header) {
|
|
678
|
-
continue;
|
|
679
|
-
}
|
|
680
|
-
const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header);
|
|
681
|
-
for (const [key, value] of iterator) {
|
|
682
|
-
if (value === null) {
|
|
683
|
-
mergedHeaders.delete(key);
|
|
684
|
-
} else if (Array.isArray(value)) {
|
|
685
|
-
for (const v of value) {
|
|
686
|
-
mergedHeaders.append(key, v);
|
|
687
|
-
}
|
|
688
|
-
} else if (value !== void 0) {
|
|
689
|
-
mergedHeaders.set(
|
|
690
|
-
key,
|
|
691
|
-
typeof value === "object" ? JSON.stringify(value) : value
|
|
692
|
-
);
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
return mergedHeaders;
|
|
697
|
-
};
|
|
698
|
-
var Interceptors = class {
|
|
699
|
-
fns = [];
|
|
700
|
-
clear() {
|
|
701
|
-
this.fns = [];
|
|
702
|
-
}
|
|
703
|
-
eject(id) {
|
|
704
|
-
const index = this.getInterceptorIndex(id);
|
|
705
|
-
if (this.fns[index]) {
|
|
706
|
-
this.fns[index] = null;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
exists(id) {
|
|
710
|
-
const index = this.getInterceptorIndex(id);
|
|
711
|
-
return Boolean(this.fns[index]);
|
|
712
|
-
}
|
|
713
|
-
getInterceptorIndex(id) {
|
|
714
|
-
if (typeof id === "number") {
|
|
715
|
-
return this.fns[id] ? id : -1;
|
|
716
|
-
}
|
|
717
|
-
return this.fns.indexOf(id);
|
|
718
|
-
}
|
|
719
|
-
update(id, fn) {
|
|
720
|
-
const index = this.getInterceptorIndex(id);
|
|
721
|
-
if (this.fns[index]) {
|
|
722
|
-
this.fns[index] = fn;
|
|
723
|
-
return id;
|
|
724
|
-
}
|
|
725
|
-
return false;
|
|
726
|
-
}
|
|
727
|
-
use(fn) {
|
|
728
|
-
this.fns.push(fn);
|
|
729
|
-
return this.fns.length - 1;
|
|
730
|
-
}
|
|
731
|
-
};
|
|
732
|
-
var createInterceptors = () => ({
|
|
733
|
-
error: new Interceptors(),
|
|
734
|
-
request: new Interceptors(),
|
|
735
|
-
response: new Interceptors()
|
|
736
|
-
});
|
|
737
|
-
var defaultQuerySerializer = createQuerySerializer({
|
|
738
|
-
allowReserved: false,
|
|
739
|
-
array: {
|
|
740
|
-
explode: true,
|
|
741
|
-
style: "form"
|
|
742
|
-
},
|
|
743
|
-
object: {
|
|
744
|
-
explode: true,
|
|
745
|
-
style: "deepObject"
|
|
746
|
-
}
|
|
747
|
-
});
|
|
748
|
-
var defaultHeaders = {
|
|
749
|
-
"Content-Type": "application/json"
|
|
750
|
-
};
|
|
751
|
-
var createConfig = (override = {}) => ({
|
|
752
|
-
...jsonBodySerializer,
|
|
753
|
-
headers: defaultHeaders,
|
|
754
|
-
parseAs: "auto",
|
|
755
|
-
querySerializer: defaultQuerySerializer,
|
|
756
|
-
...override
|
|
757
|
-
});
|
|
758
|
-
var createClient = (config = {}) => {
|
|
759
|
-
let _config = mergeConfigs(createConfig(), config);
|
|
760
|
-
const getConfig = () => ({ ..._config });
|
|
761
|
-
const setConfig = (config2) => {
|
|
762
|
-
_config = mergeConfigs(_config, config2);
|
|
763
|
-
return getConfig();
|
|
764
|
-
};
|
|
765
|
-
const interceptors = createInterceptors();
|
|
766
|
-
const beforeRequest = async (options) => {
|
|
767
|
-
const opts = {
|
|
768
|
-
..._config,
|
|
769
|
-
...options,
|
|
770
|
-
fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,
|
|
771
|
-
headers: mergeHeaders(_config.headers, options.headers),
|
|
772
|
-
serializedBody: void 0
|
|
773
|
-
};
|
|
774
|
-
if (opts.security) {
|
|
775
|
-
await setAuthParams(opts);
|
|
776
|
-
}
|
|
777
|
-
if (opts.requestValidator) {
|
|
778
|
-
await opts.requestValidator(opts);
|
|
779
|
-
}
|
|
780
|
-
if (opts.body !== void 0 && opts.bodySerializer) {
|
|
781
|
-
opts.serializedBody = opts.bodySerializer(opts.body);
|
|
782
|
-
}
|
|
783
|
-
if (opts.body === void 0 || opts.serializedBody === "") {
|
|
784
|
-
opts.headers.delete("Content-Type");
|
|
785
|
-
}
|
|
786
|
-
const resolvedOpts = opts;
|
|
787
|
-
const url = buildUrl(resolvedOpts);
|
|
788
|
-
return { opts: resolvedOpts, url };
|
|
789
|
-
};
|
|
790
|
-
const request = async (options) => {
|
|
791
|
-
const throwOnError = options.throwOnError ?? _config.throwOnError;
|
|
792
|
-
const responseStyle = options.responseStyle ?? _config.responseStyle;
|
|
793
|
-
let request2;
|
|
794
|
-
let response;
|
|
795
|
-
try {
|
|
796
|
-
const { opts, url } = await beforeRequest(options);
|
|
797
|
-
const requestInit = {
|
|
798
|
-
redirect: "follow",
|
|
799
|
-
...opts,
|
|
800
|
-
body: getValidRequestBody(opts)
|
|
801
|
-
};
|
|
802
|
-
request2 = new Request(url, requestInit);
|
|
803
|
-
for (const fn of interceptors.request.fns) {
|
|
804
|
-
if (fn) {
|
|
805
|
-
request2 = await fn(request2, opts);
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
const _fetch = opts.fetch;
|
|
809
|
-
response = await _fetch(request2);
|
|
810
|
-
for (const fn of interceptors.response.fns) {
|
|
811
|
-
if (fn) {
|
|
812
|
-
response = await fn(response, request2, opts);
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
const result = {
|
|
816
|
-
request: request2,
|
|
817
|
-
response
|
|
818
|
-
};
|
|
819
|
-
if (response.ok) {
|
|
820
|
-
const parseAs = (opts.parseAs === "auto" ? getParseAs(response.headers.get("Content-Type")) : opts.parseAs) ?? "json";
|
|
821
|
-
if (response.status === 204 || response.headers.get("Content-Length") === "0") {
|
|
822
|
-
let emptyData;
|
|
823
|
-
switch (parseAs) {
|
|
824
|
-
case "arrayBuffer":
|
|
825
|
-
case "blob":
|
|
826
|
-
case "text":
|
|
827
|
-
emptyData = await response[parseAs]();
|
|
828
|
-
break;
|
|
829
|
-
case "formData":
|
|
830
|
-
emptyData = new FormData();
|
|
831
|
-
break;
|
|
832
|
-
case "stream":
|
|
833
|
-
emptyData = response.body;
|
|
834
|
-
break;
|
|
835
|
-
case "json":
|
|
836
|
-
default:
|
|
837
|
-
emptyData = {};
|
|
838
|
-
break;
|
|
839
|
-
}
|
|
840
|
-
return opts.responseStyle === "data" ? emptyData : {
|
|
841
|
-
data: emptyData,
|
|
842
|
-
...result
|
|
843
|
-
};
|
|
844
|
-
}
|
|
845
|
-
let data;
|
|
846
|
-
switch (parseAs) {
|
|
847
|
-
case "arrayBuffer":
|
|
848
|
-
case "blob":
|
|
849
|
-
case "formData":
|
|
850
|
-
case "text":
|
|
851
|
-
data = await response[parseAs]();
|
|
852
|
-
break;
|
|
853
|
-
case "json": {
|
|
854
|
-
const text = await response.text();
|
|
855
|
-
data = text ? JSON.parse(text) : {};
|
|
856
|
-
break;
|
|
857
|
-
}
|
|
858
|
-
case "stream":
|
|
859
|
-
return opts.responseStyle === "data" ? response.body : {
|
|
860
|
-
data: response.body,
|
|
861
|
-
...result
|
|
862
|
-
};
|
|
863
|
-
}
|
|
864
|
-
if (parseAs === "json") {
|
|
865
|
-
if (opts.responseValidator) {
|
|
866
|
-
await opts.responseValidator(data);
|
|
867
|
-
}
|
|
868
|
-
if (opts.responseTransformer) {
|
|
869
|
-
data = await opts.responseTransformer(data);
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
return opts.responseStyle === "data" ? data : {
|
|
873
|
-
data,
|
|
874
|
-
...result
|
|
875
|
-
};
|
|
876
|
-
}
|
|
877
|
-
const textError = await response.text();
|
|
878
|
-
let jsonError;
|
|
879
|
-
try {
|
|
880
|
-
jsonError = JSON.parse(textError);
|
|
881
|
-
} catch {
|
|
882
|
-
}
|
|
883
|
-
throw jsonError ?? textError;
|
|
884
|
-
} catch (error) {
|
|
885
|
-
let finalError = error;
|
|
886
|
-
for (const fn of interceptors.error.fns) {
|
|
887
|
-
if (fn) {
|
|
888
|
-
finalError = await fn(finalError, response, request2, options);
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
finalError = finalError || {};
|
|
892
|
-
if (throwOnError) {
|
|
893
|
-
throw finalError;
|
|
894
|
-
}
|
|
895
|
-
return responseStyle === "data" ? void 0 : {
|
|
896
|
-
error: finalError,
|
|
897
|
-
request: request2,
|
|
898
|
-
response
|
|
899
|
-
};
|
|
900
|
-
}
|
|
901
|
-
};
|
|
902
|
-
const makeMethodFn = (method) => (options) => request({ ...options, method });
|
|
903
|
-
const makeSseFn = (method) => async (options) => {
|
|
904
|
-
const { opts, url } = await beforeRequest(options);
|
|
905
|
-
return createSseClient({
|
|
906
|
-
...opts,
|
|
907
|
-
body: opts.body,
|
|
908
|
-
method,
|
|
909
|
-
onRequest: async (url2, init) => {
|
|
910
|
-
let request2 = new Request(url2, init);
|
|
911
|
-
for (const fn of interceptors.request.fns) {
|
|
912
|
-
if (fn) {
|
|
913
|
-
request2 = await fn(request2, opts);
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
return request2;
|
|
917
|
-
},
|
|
918
|
-
serializedBody: getValidRequestBody(opts),
|
|
919
|
-
url
|
|
920
|
-
});
|
|
921
|
-
};
|
|
922
|
-
const _buildUrl = (options) => buildUrl({ ..._config, ...options });
|
|
923
|
-
return {
|
|
924
|
-
buildUrl: _buildUrl,
|
|
925
|
-
connect: makeMethodFn("CONNECT"),
|
|
926
|
-
delete: makeMethodFn("DELETE"),
|
|
927
|
-
get: makeMethodFn("GET"),
|
|
928
|
-
getConfig,
|
|
929
|
-
head: makeMethodFn("HEAD"),
|
|
930
|
-
interceptors,
|
|
931
|
-
options: makeMethodFn("OPTIONS"),
|
|
932
|
-
patch: makeMethodFn("PATCH"),
|
|
933
|
-
post: makeMethodFn("POST"),
|
|
934
|
-
put: makeMethodFn("PUT"),
|
|
935
|
-
request,
|
|
936
|
-
setConfig,
|
|
937
|
-
sse: {
|
|
938
|
-
connect: makeSseFn("CONNECT"),
|
|
939
|
-
delete: makeSseFn("DELETE"),
|
|
940
|
-
get: makeSseFn("GET"),
|
|
941
|
-
head: makeSseFn("HEAD"),
|
|
942
|
-
options: makeSseFn("OPTIONS"),
|
|
943
|
-
patch: makeSseFn("PATCH"),
|
|
944
|
-
post: makeSseFn("POST"),
|
|
945
|
-
put: makeSseFn("PUT"),
|
|
946
|
-
trace: makeSseFn("TRACE")
|
|
947
|
-
},
|
|
948
|
-
trace: makeMethodFn("TRACE")
|
|
949
|
-
};
|
|
950
|
-
};
|
|
951
|
-
var USER_AGENT = "@pidgeon-ai/sdk";
|
|
952
|
-
var createClientConfig = (config) => ({
|
|
953
|
-
...config,
|
|
954
|
-
...typeof window === "undefined" ? { headers: { "User-Agent": USER_AGENT, ...plain(config?.headers) } } : {}
|
|
955
|
-
});
|
|
956
|
-
function plain(headers) {
|
|
957
|
-
return headers && typeof headers === "object" && !(headers instanceof Headers) ? headers : {};
|
|
958
|
-
}
|
|
959
|
-
var client = createClient(
|
|
960
|
-
createClientConfig(createConfig({ baseUrl: "https://pidgeon.ai/api/v1" }))
|
|
961
|
-
);
|
|
962
|
-
var agentSignUp = (options) => (options.client ?? client).post({
|
|
963
|
-
url: "/agent/signup",
|
|
964
|
-
...options,
|
|
965
|
-
headers: {
|
|
966
|
-
"Content-Type": "application/json",
|
|
967
|
-
...options.headers
|
|
968
|
-
}
|
|
969
|
-
});
|
|
970
|
-
var agentAttachHuman = (options) => (options.client ?? client).post({
|
|
971
|
-
url: "/agent/human",
|
|
972
|
-
...options,
|
|
973
|
-
headers: {
|
|
974
|
-
"Content-Type": "application/json",
|
|
975
|
-
...options.headers
|
|
976
|
-
}
|
|
977
|
-
});
|
|
978
|
-
var agentVerify = (options) => (options.client ?? client).post({
|
|
979
|
-
url: "/agent/verify",
|
|
980
|
-
...options,
|
|
981
|
-
headers: {
|
|
982
|
-
"Content-Type": "application/json",
|
|
983
|
-
...options.headers
|
|
984
|
-
}
|
|
985
|
-
});
|
|
986
|
-
var cardsGet = (options) => (options.client ?? client).get({
|
|
987
|
-
url: "/cards/{id}",
|
|
988
|
-
...options
|
|
989
|
-
});
|
|
990
|
-
var verifySender = (options) => (options.client ?? client).post({
|
|
991
|
-
url: "/verify",
|
|
992
|
-
...options,
|
|
993
|
-
headers: {
|
|
994
|
-
"Content-Type": "application/json",
|
|
995
|
-
...options.headers
|
|
996
|
-
}
|
|
997
|
-
});
|
|
998
|
-
var logHead = (options) => (options?.client ?? client).get({
|
|
999
|
-
url: "/log/head",
|
|
1000
|
-
...options
|
|
1001
|
-
});
|
|
1002
|
-
var logCheckpoint = (options) => (options?.client ?? client).get({
|
|
1003
|
-
url: "/log/checkpoint",
|
|
1004
|
-
...options
|
|
1005
|
-
});
|
|
1006
|
-
var logEntries = (options) => (options?.client ?? client).get({
|
|
1007
|
-
url: "/log/entries",
|
|
1008
|
-
...options
|
|
1009
|
-
});
|
|
1010
|
-
var logProof = (options) => (options?.client ?? client).get({
|
|
1011
|
-
url: "/log/proof",
|
|
1012
|
-
...options
|
|
1013
|
-
});
|
|
1014
|
-
var logConsistency = (options) => (options.client ?? client).get({
|
|
1015
|
-
url: "/log/consistency",
|
|
1016
|
-
...options
|
|
1017
|
-
});
|
|
1018
|
-
var logMonitorsList = (options) => (options?.client ?? client).get({
|
|
1019
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1020
|
-
url: "/log/monitors",
|
|
1021
|
-
...options
|
|
1022
|
-
});
|
|
1023
|
-
var logMonitorsCreate = (options) => (options.client ?? client).post({
|
|
1024
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1025
|
-
url: "/log/monitors",
|
|
1026
|
-
...options,
|
|
1027
|
-
headers: {
|
|
1028
|
-
"Content-Type": "application/json",
|
|
1029
|
-
...options.headers
|
|
1030
|
-
}
|
|
1031
|
-
});
|
|
1032
|
-
var logMonitorsDelete = (options) => (options.client ?? client).delete({
|
|
1033
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1034
|
-
url: "/log/monitors/{id}",
|
|
1035
|
-
...options
|
|
1036
|
-
});
|
|
1037
|
-
var grantsStatus = (options) => (options.client ?? client).get({
|
|
1038
|
-
url: "/grants/{id}/status",
|
|
1039
|
-
...options
|
|
1040
|
-
});
|
|
1041
|
-
var agentConnect = (options) => (options.client ?? client).post({
|
|
1042
|
-
url: "/agent/connect",
|
|
1043
|
-
...options,
|
|
1044
|
-
headers: {
|
|
1045
|
-
"Content-Type": "application/json",
|
|
1046
|
-
...options.headers
|
|
1047
|
-
}
|
|
1048
|
-
});
|
|
1049
|
-
var agentSetup = (options) => (options?.client ?? client).get({
|
|
1050
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1051
|
-
url: "/agent/setup",
|
|
1052
|
-
...options
|
|
1053
|
-
});
|
|
1054
|
-
var identitiesList = (options) => (options?.client ?? client).get({
|
|
1055
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1056
|
-
url: "/identities",
|
|
1057
|
-
...options
|
|
1058
|
-
});
|
|
1059
|
-
var identitiesCreate = (options) => (options.client ?? client).post({
|
|
1060
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1061
|
-
url: "/identities",
|
|
1062
|
-
...options,
|
|
1063
|
-
headers: {
|
|
1064
|
-
"Content-Type": "application/json",
|
|
1065
|
-
...options.headers
|
|
1066
|
-
}
|
|
1067
|
-
});
|
|
1068
|
-
var identitiesDelete = (options) => (options.client ?? client).delete({
|
|
1069
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1070
|
-
url: "/identities/{id}",
|
|
1071
|
-
...options
|
|
1072
|
-
});
|
|
1073
|
-
var identitiesGet = (options) => (options.client ?? client).get({
|
|
1074
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1075
|
-
url: "/identities/{id}",
|
|
1076
|
-
...options
|
|
1077
|
-
});
|
|
1078
|
-
var identitiesUpdate = (options) => (options.client ?? client).patch(
|
|
1079
|
-
{
|
|
1080
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1081
|
-
url: "/identities/{id}",
|
|
1082
|
-
...options,
|
|
1083
|
-
headers: {
|
|
1084
|
-
"Content-Type": "application/json",
|
|
1085
|
-
...options.headers
|
|
1086
|
-
}
|
|
1087
|
-
}
|
|
1088
|
-
);
|
|
1089
|
-
var identitiesCard = (options) => (options.client ?? client).get({
|
|
1090
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1091
|
-
url: "/identities/{id}/card",
|
|
1092
|
-
...options
|
|
1093
|
-
});
|
|
1094
|
-
var identitiesAccessDelete = (options) => (options.client ?? client).delete({
|
|
1095
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1096
|
-
url: "/identities/{id}/access",
|
|
1097
|
-
...options
|
|
1098
|
-
});
|
|
1099
|
-
var identitiesAccessGet = (options) => (options.client ?? client).get({
|
|
1100
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1101
|
-
url: "/identities/{id}/access",
|
|
1102
|
-
...options
|
|
1103
|
-
});
|
|
1104
|
-
var identitiesAccessCreate = (options) => (options.client ?? client).post({
|
|
1105
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1106
|
-
url: "/identities/{id}/access",
|
|
1107
|
-
...options,
|
|
1108
|
-
headers: {
|
|
1109
|
-
"Content-Type": "application/json",
|
|
1110
|
-
...options.headers
|
|
1111
|
-
}
|
|
1112
|
-
});
|
|
1113
|
-
var identitiesSendRulesDelete = (options) => (options.client ?? client).delete({
|
|
1114
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1115
|
-
url: "/identities/{id}/send-rules",
|
|
1116
|
-
...options
|
|
1117
|
-
});
|
|
1118
|
-
var identitiesSendRulesGet = (options) => (options.client ?? client).get({
|
|
1119
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1120
|
-
url: "/identities/{id}/send-rules",
|
|
1121
|
-
...options
|
|
1122
|
-
});
|
|
1123
|
-
var identitiesSendRulesCreate = (options) => (options.client ?? client).post({
|
|
1124
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1125
|
-
url: "/identities/{id}/send-rules",
|
|
1126
|
-
...options,
|
|
1127
|
-
headers: {
|
|
1128
|
-
"Content-Type": "application/json",
|
|
1129
|
-
...options.headers
|
|
1130
|
-
}
|
|
1131
|
-
});
|
|
1132
|
-
var identitiesReceiveRulesDelete = (options) => (options.client ?? client).delete({
|
|
1133
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1134
|
-
url: "/identities/{id}/receive-rules",
|
|
1135
|
-
...options
|
|
1136
|
-
});
|
|
1137
|
-
var identitiesReceiveRulesGet = (options) => (options.client ?? client).get({
|
|
1138
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1139
|
-
url: "/identities/{id}/receive-rules",
|
|
1140
|
-
...options
|
|
1141
|
-
});
|
|
1142
|
-
var identitiesReceiveRulesCreate = (options) => (options.client ?? client).post({
|
|
1143
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1144
|
-
url: "/identities/{id}/receive-rules",
|
|
1145
|
-
...options,
|
|
1146
|
-
headers: {
|
|
1147
|
-
"Content-Type": "application/json",
|
|
1148
|
-
...options.headers
|
|
1149
|
-
}
|
|
1150
|
-
});
|
|
1151
|
-
var identitiesSuspendTenant = (options) => (options.client ?? client).post({
|
|
1152
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1153
|
-
url: "/tenants/{id}/suspend",
|
|
1154
|
-
...options
|
|
1155
|
-
});
|
|
1156
|
-
var podsList = (options) => (options?.client ?? client).get({
|
|
1157
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1158
|
-
url: "/pods",
|
|
1159
|
-
...options
|
|
1160
|
-
});
|
|
1161
|
-
var podsCreate = (options) => (options.client ?? client).post({
|
|
1162
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1163
|
-
url: "/pods",
|
|
1164
|
-
...options,
|
|
1165
|
-
headers: {
|
|
1166
|
-
"Content-Type": "application/json",
|
|
1167
|
-
...options.headers
|
|
1168
|
-
}
|
|
1169
|
-
});
|
|
1170
|
-
var podsDelete = (options) => (options.client ?? client).delete({
|
|
1171
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1172
|
-
url: "/pods/{id}",
|
|
1173
|
-
...options
|
|
1174
|
-
});
|
|
1175
|
-
var podsGet = (options) => (options.client ?? client).get({
|
|
1176
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1177
|
-
url: "/pods/{id}",
|
|
1178
|
-
...options
|
|
1179
|
-
});
|
|
1180
|
-
var podsUpdate = (options) => (options.client ?? client).patch({
|
|
1181
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1182
|
-
url: "/pods/{id}",
|
|
1183
|
-
...options,
|
|
1184
|
-
headers: {
|
|
1185
|
-
"Content-Type": "application/json",
|
|
1186
|
-
...options.headers
|
|
1187
|
-
}
|
|
1188
|
-
});
|
|
1189
|
-
var labelsList = (options) => (options.client ?? client).get({
|
|
1190
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1191
|
-
url: "/labels",
|
|
1192
|
-
...options
|
|
1193
|
-
});
|
|
1194
|
-
var labelsCreate = (options) => (options.client ?? client).post({
|
|
1195
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1196
|
-
url: "/labels",
|
|
1197
|
-
...options,
|
|
1198
|
-
headers: {
|
|
1199
|
-
"Content-Type": "application/json",
|
|
1200
|
-
...options.headers
|
|
1201
|
-
}
|
|
1202
|
-
});
|
|
1203
|
-
var labelsDelete = (options) => (options.client ?? client).delete({
|
|
1204
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1205
|
-
url: "/labels/{id}",
|
|
1206
|
-
...options
|
|
1207
|
-
});
|
|
1208
|
-
var labelsUpdate = (options) => (options.client ?? client).patch({
|
|
1209
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1210
|
-
url: "/labels/{id}",
|
|
1211
|
-
...options,
|
|
1212
|
-
headers: {
|
|
1213
|
-
"Content-Type": "application/json",
|
|
1214
|
-
...options.headers
|
|
1215
|
-
}
|
|
1216
|
-
});
|
|
1217
|
-
var grantsTemplatesList = (options) => (options?.client ?? client).get({
|
|
1218
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1219
|
-
url: "/grant-templates",
|
|
1220
|
-
...options
|
|
1221
|
-
});
|
|
1222
|
-
var grantsTemplatesCreate = (options) => (options.client ?? client).post({
|
|
1223
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1224
|
-
url: "/grant-templates",
|
|
1225
|
-
...options,
|
|
1226
|
-
headers: {
|
|
1227
|
-
"Content-Type": "application/json",
|
|
1228
|
-
...options.headers
|
|
1229
|
-
}
|
|
1230
|
-
});
|
|
1231
|
-
var grantsTemplatesDelete = (options) => (options.client ?? client).delete({
|
|
1232
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1233
|
-
url: "/grant-templates/{id}",
|
|
1234
|
-
...options
|
|
1235
|
-
});
|
|
1236
|
-
var grantsList = (options) => (options.client ?? client).get({
|
|
1237
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1238
|
-
url: "/grants",
|
|
1239
|
-
...options
|
|
1240
|
-
});
|
|
1241
|
-
var grantsCreate = (options) => (options.client ?? client).post({
|
|
1242
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1243
|
-
url: "/grants",
|
|
1244
|
-
...options,
|
|
1245
|
-
headers: {
|
|
1246
|
-
"Content-Type": "application/json",
|
|
1247
|
-
...options.headers
|
|
1248
|
-
}
|
|
1249
|
-
});
|
|
1250
|
-
var grantsRevoke = (options) => (options.client ?? client).delete({
|
|
1251
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1252
|
-
url: "/grants/{id}",
|
|
1253
|
-
...options
|
|
1254
|
-
});
|
|
1255
|
-
var grantsGet = (options) => (options.client ?? client).get({
|
|
1256
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1257
|
-
url: "/grants/{id}",
|
|
1258
|
-
...options
|
|
1259
|
-
});
|
|
1260
|
-
var contactsList = (options) => (options?.client ?? client).get({
|
|
1261
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1262
|
-
url: "/contacts",
|
|
1263
|
-
...options
|
|
1264
|
-
});
|
|
1265
|
-
var contactsCreate = (options) => (options.client ?? client).post({
|
|
1266
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1267
|
-
url: "/contacts",
|
|
1268
|
-
...options,
|
|
1269
|
-
headers: {
|
|
1270
|
-
"Content-Type": "application/json",
|
|
1271
|
-
...options.headers
|
|
1272
|
-
}
|
|
1273
|
-
});
|
|
1274
|
-
var contactsDelete = (options) => (options.client ?? client).delete({
|
|
1275
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1276
|
-
url: "/contacts/{id}",
|
|
1277
|
-
...options
|
|
1278
|
-
});
|
|
1279
|
-
var contactsGet = (options) => (options.client ?? client).get({
|
|
1280
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1281
|
-
url: "/contacts/{id}",
|
|
1282
|
-
...options
|
|
1283
|
-
});
|
|
1284
|
-
var contactsUpdate = (options) => (options.client ?? client).patch({
|
|
1285
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1286
|
-
url: "/contacts/{id}",
|
|
1287
|
-
...options,
|
|
1288
|
-
headers: {
|
|
1289
|
-
"Content-Type": "application/json",
|
|
1290
|
-
...options.headers
|
|
1291
|
-
}
|
|
1292
|
-
});
|
|
1293
|
-
var contactsUnblock = (options) => (options.client ?? client).delete({
|
|
1294
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1295
|
-
url: "/contacts/{id}/block",
|
|
1296
|
-
...options
|
|
1297
|
-
});
|
|
1298
|
-
var contactsBlock = (options) => (options.client ?? client).post({
|
|
1299
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1300
|
-
url: "/contacts/{id}/block",
|
|
1301
|
-
...options
|
|
1302
|
-
});
|
|
1303
|
-
var threadsLabelsDelete = (options) => (options.client ?? client).delete({
|
|
1304
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1305
|
-
url: "/threads/{id}/labels",
|
|
1306
|
-
...options
|
|
1307
|
-
});
|
|
1308
|
-
var threadsLabelsGet = (options) => (options.client ?? client).get({
|
|
1309
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1310
|
-
url: "/threads/{id}/labels",
|
|
1311
|
-
...options
|
|
1312
|
-
});
|
|
1313
|
-
var threadsLabelsCreate = (options) => (options.client ?? client).post({
|
|
1314
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1315
|
-
url: "/threads/{id}/labels",
|
|
1316
|
-
...options,
|
|
1317
|
-
headers: {
|
|
1318
|
-
"Content-Type": "application/json",
|
|
1319
|
-
...options.headers
|
|
1320
|
-
}
|
|
1321
|
-
});
|
|
1322
|
-
var messagesListInThread = (options) => (options.client ?? client).get({
|
|
1323
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1324
|
-
url: "/messages",
|
|
1325
|
-
...options
|
|
1326
|
-
});
|
|
1327
|
-
var messagesSend = (options) => (options.client ?? client).post({
|
|
1328
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1329
|
-
url: "/messages",
|
|
1330
|
-
...options,
|
|
1331
|
-
headers: {
|
|
1332
|
-
"Content-Type": "application/json",
|
|
1333
|
-
...options.headers
|
|
1334
|
-
}
|
|
1335
|
-
});
|
|
1336
|
-
var messagesCheck = (options) => (options.client ?? client).post({
|
|
1337
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1338
|
-
url: "/messages/check",
|
|
1339
|
-
...options,
|
|
1340
|
-
headers: {
|
|
1341
|
-
"Content-Type": "application/json",
|
|
1342
|
-
...options.headers
|
|
1343
|
-
}
|
|
1344
|
-
});
|
|
1345
|
-
var signInsApprove = (options) => (options.client ?? client).post({
|
|
1346
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1347
|
-
url: "/sign-ins",
|
|
1348
|
-
...options,
|
|
1349
|
-
headers: {
|
|
1350
|
-
"Content-Type": "application/json",
|
|
1351
|
-
...options.headers
|
|
1352
|
-
}
|
|
1353
|
-
});
|
|
1354
|
-
var messagesSearch = (options) => (options?.client ?? client).get({
|
|
1355
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1356
|
-
url: "/messages/search",
|
|
1357
|
-
...options
|
|
1358
|
-
});
|
|
1359
|
-
var messagesAct = (options) => (options.client ?? client).post({
|
|
1360
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1361
|
-
url: "/messages/actions",
|
|
1362
|
-
...options,
|
|
1363
|
-
headers: {
|
|
1364
|
-
"Content-Type": "application/json",
|
|
1365
|
-
...options.headers
|
|
1366
|
-
}
|
|
1367
|
-
});
|
|
1368
|
-
var messagesUndo = (options) => (options.client ?? client).post({
|
|
1369
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1370
|
-
url: "/messages/undo",
|
|
1371
|
-
...options,
|
|
1372
|
-
headers: {
|
|
1373
|
-
"Content-Type": "application/json",
|
|
1374
|
-
...options.headers
|
|
1375
|
-
}
|
|
1376
|
-
});
|
|
1377
|
-
var messagesAwait = (options) => (options.client ?? client).get({
|
|
1378
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1379
|
-
url: "/messages/await",
|
|
1380
|
-
...options
|
|
1381
|
-
});
|
|
1382
|
-
var messagesGet = (options) => (options.client ?? client).get({
|
|
1383
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1384
|
-
url: "/messages/{id}",
|
|
1385
|
-
...options
|
|
1386
|
-
});
|
|
1387
|
-
var messagesUpdate = (options) => (options.client ?? client).patch({
|
|
1388
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1389
|
-
url: "/messages/{id}",
|
|
1390
|
-
...options,
|
|
1391
|
-
headers: {
|
|
1392
|
-
"Content-Type": "application/json",
|
|
1393
|
-
...options.headers
|
|
1394
|
-
}
|
|
1395
|
-
});
|
|
1396
|
-
var messagesReply = (options) => (options.client ?? client).post({
|
|
1397
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1398
|
-
url: "/messages/{id}/reply",
|
|
1399
|
-
...options,
|
|
1400
|
-
headers: {
|
|
1401
|
-
"Content-Type": "application/json",
|
|
1402
|
-
...options.headers
|
|
1403
|
-
}
|
|
1404
|
-
});
|
|
1405
|
-
var messagesReplyAll = (options) => (options.client ?? client).post({
|
|
1406
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1407
|
-
url: "/messages/{id}/reply-all",
|
|
1408
|
-
...options,
|
|
1409
|
-
headers: {
|
|
1410
|
-
"Content-Type": "application/json",
|
|
1411
|
-
...options.headers
|
|
1412
|
-
}
|
|
1413
|
-
});
|
|
1414
|
-
var messagesForward = (options) => (options.client ?? client).post({
|
|
1415
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1416
|
-
url: "/messages/{id}/forward",
|
|
1417
|
-
...options,
|
|
1418
|
-
headers: {
|
|
1419
|
-
"Content-Type": "application/json",
|
|
1420
|
-
...options.headers
|
|
1421
|
-
}
|
|
1422
|
-
});
|
|
1423
|
-
var messagesRaw = (options) => (options.client ?? client).get({
|
|
1424
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1425
|
-
url: "/messages/{id}/raw",
|
|
1426
|
-
...options
|
|
1427
|
-
});
|
|
1428
|
-
var exportMail = (options) => (options?.client ?? client).get({
|
|
1429
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1430
|
-
url: "/export",
|
|
1431
|
-
...options
|
|
1432
|
-
});
|
|
1433
|
-
var threadsList = (options) => (options?.client ?? client).get({
|
|
1434
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1435
|
-
url: "/threads",
|
|
1436
|
-
...options
|
|
1437
|
-
});
|
|
1438
|
-
var threadsGet = (options) => (options.client ?? client).get({
|
|
1439
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1440
|
-
url: "/threads/{id}",
|
|
1441
|
-
...options
|
|
1442
|
-
});
|
|
1443
|
-
var threadsUpdate = (options) => (options.client ?? client).patch({
|
|
1444
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1445
|
-
url: "/threads/{id}",
|
|
1446
|
-
...options,
|
|
1447
|
-
headers: {
|
|
1448
|
-
"Content-Type": "application/json",
|
|
1449
|
-
...options.headers
|
|
1450
|
-
}
|
|
1451
|
-
});
|
|
1452
|
-
var domainsList = (options) => (options?.client ?? client).get({
|
|
1453
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1454
|
-
url: "/domains",
|
|
1455
|
-
...options
|
|
1456
|
-
});
|
|
1457
|
-
var domainsCreate = (options) => (options.client ?? client).post({
|
|
1458
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1459
|
-
url: "/domains",
|
|
1460
|
-
...options,
|
|
1461
|
-
headers: {
|
|
1462
|
-
"Content-Type": "application/json",
|
|
1463
|
-
...options.headers
|
|
1464
|
-
}
|
|
1465
|
-
});
|
|
1466
|
-
var domainsZoneFile = (options) => (options.client ?? client).get({
|
|
1467
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1468
|
-
url: "/domains/{id}/zone-file",
|
|
1469
|
-
...options
|
|
1470
|
-
});
|
|
1471
|
-
var domainsGetSetupLink = (options) => (options.client ?? client).get({
|
|
1472
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1473
|
-
url: "/domains/{id}/setup-link",
|
|
1474
|
-
...options
|
|
1475
|
-
});
|
|
1476
|
-
var domainsVerify = (options) => (options.client ?? client).post({
|
|
1477
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1478
|
-
url: "/domains/{id}/verify",
|
|
1479
|
-
...options
|
|
1480
|
-
});
|
|
1481
|
-
var domainsDelete = (options) => (options.client ?? client).delete({
|
|
1482
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1483
|
-
url: "/domains/{id}",
|
|
1484
|
-
...options
|
|
1485
|
-
});
|
|
1486
|
-
var domainsGet = (options) => (options.client ?? client).get({
|
|
1487
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1488
|
-
url: "/domains/{id}",
|
|
1489
|
-
...options
|
|
1490
|
-
});
|
|
1491
|
-
var domainsUpdate = (options) => (options.client ?? client).patch({
|
|
1492
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1493
|
-
url: "/domains/{id}",
|
|
1494
|
-
...options,
|
|
1495
|
-
headers: {
|
|
1496
|
-
"Content-Type": "application/json",
|
|
1497
|
-
...options.headers
|
|
1498
|
-
}
|
|
1499
|
-
});
|
|
1500
|
-
var routingList = (options) => (options?.client ?? client).get({
|
|
1501
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1502
|
-
url: "/routing-rules",
|
|
1503
|
-
...options
|
|
1504
|
-
});
|
|
1505
|
-
var routingCreate = (options) => (options.client ?? client).post({
|
|
1506
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1507
|
-
url: "/routing-rules",
|
|
1508
|
-
...options,
|
|
1509
|
-
headers: {
|
|
1510
|
-
"Content-Type": "application/json",
|
|
1511
|
-
...options.headers
|
|
1512
|
-
}
|
|
1513
|
-
});
|
|
1514
|
-
var routingDelete = (options) => (options.client ?? client).delete({
|
|
1515
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1516
|
-
url: "/routing-rules/{id}",
|
|
1517
|
-
...options
|
|
1518
|
-
});
|
|
1519
|
-
var routingUpdate = (options) => (options.client ?? client).patch({
|
|
1520
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1521
|
-
url: "/routing-rules/{id}",
|
|
1522
|
-
...options,
|
|
1523
|
-
headers: {
|
|
1524
|
-
"Content-Type": "application/json",
|
|
1525
|
-
...options.headers
|
|
1526
|
-
}
|
|
1527
|
-
});
|
|
1528
|
-
var mailboxesList = (options) => (options.client ?? client).get({
|
|
1529
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1530
|
-
url: "/mailboxes",
|
|
1531
|
-
...options
|
|
1532
|
-
});
|
|
1533
|
-
var mailboxesChanges = (options) => (options.client ?? client).get({
|
|
1534
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1535
|
-
url: "/mailboxes/changes",
|
|
1536
|
-
...options
|
|
1537
|
-
});
|
|
1538
|
-
var mailboxesEmptyTrash = (options) => (options.client ?? client).delete({
|
|
1539
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1540
|
-
url: "/mailboxes/{folder}",
|
|
1541
|
-
...options
|
|
1542
|
-
});
|
|
1543
|
-
var mailboxesListFolder = (options) => (options.client ?? client).get({
|
|
1544
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1545
|
-
url: "/mailboxes/{folder}",
|
|
1546
|
-
...options
|
|
1547
|
-
});
|
|
1548
|
-
var keysList = (options) => (options?.client ?? client).get({
|
|
1549
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1550
|
-
url: "/api-keys",
|
|
1551
|
-
...options
|
|
1552
|
-
});
|
|
1553
|
-
var keysCreate = (options) => (options.client ?? client).post({
|
|
1554
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1555
|
-
url: "/api-keys",
|
|
1556
|
-
...options,
|
|
1557
|
-
headers: {
|
|
1558
|
-
"Content-Type": "application/json",
|
|
1559
|
-
...options.headers
|
|
1560
|
-
}
|
|
1561
|
-
});
|
|
1562
|
-
var keysRevoke = (options) => (options.client ?? client).delete({
|
|
1563
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1564
|
-
url: "/api-keys/{id}",
|
|
1565
|
-
...options
|
|
1566
|
-
});
|
|
1567
|
-
var keysGet = (options) => (options.client ?? client).get({
|
|
1568
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1569
|
-
url: "/api-keys/{id}",
|
|
1570
|
-
...options
|
|
1571
|
-
});
|
|
1572
|
-
var keysUpdate = (options) => (options.client ?? client).patch({
|
|
1573
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1574
|
-
url: "/api-keys/{id}",
|
|
1575
|
-
...options,
|
|
1576
|
-
headers: {
|
|
1577
|
-
"Content-Type": "application/json",
|
|
1578
|
-
...options.headers
|
|
1579
|
-
}
|
|
1580
|
-
});
|
|
1581
|
-
var keysRotate = (options) => (options.client ?? client).post({
|
|
1582
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1583
|
-
url: "/api-keys/{id}/rotate",
|
|
1584
|
-
...options,
|
|
1585
|
-
headers: {
|
|
1586
|
-
"Content-Type": "application/json",
|
|
1587
|
-
...options.headers
|
|
1588
|
-
}
|
|
1589
|
-
});
|
|
1590
|
-
var testInbound = (options) => (options.client ?? client).post({
|
|
1591
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1592
|
-
url: "/test/inbound",
|
|
1593
|
-
...options,
|
|
1594
|
-
headers: {
|
|
1595
|
-
"Content-Type": "application/json",
|
|
1596
|
-
...options.headers
|
|
1597
|
-
}
|
|
1598
|
-
});
|
|
1599
|
-
var appPasswordsList = (options) => (options.client ?? client).get({
|
|
1600
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1601
|
-
url: "/app-passwords",
|
|
1602
|
-
...options
|
|
1603
|
-
});
|
|
1604
|
-
var appPasswordsCreate = (options) => (options.client ?? client).post({
|
|
1605
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1606
|
-
url: "/app-passwords",
|
|
1607
|
-
...options,
|
|
1608
|
-
headers: {
|
|
1609
|
-
"Content-Type": "application/json",
|
|
1610
|
-
...options.headers
|
|
1611
|
-
}
|
|
1612
|
-
});
|
|
1613
|
-
var appPasswordsRevoke = (options) => (options.client ?? client).delete({
|
|
1614
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1615
|
-
url: "/app-passwords/{id}",
|
|
1616
|
-
...options
|
|
1617
|
-
});
|
|
1618
|
-
var meGet = (options) => (options?.client ?? client).get({
|
|
1619
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1620
|
-
url: "/me",
|
|
1621
|
-
...options
|
|
1622
|
-
});
|
|
1623
|
-
var workspaceGet = (options) => (options?.client ?? client).get({
|
|
1624
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1625
|
-
url: "/workspace",
|
|
1626
|
-
...options
|
|
1627
|
-
});
|
|
1628
|
-
var workspaceMembers = (options) => (options?.client ?? client).get({
|
|
1629
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1630
|
-
url: "/workspace/members",
|
|
1631
|
-
...options
|
|
1632
|
-
});
|
|
1633
|
-
var eventsList = (options) => (options?.client ?? client).get({
|
|
1634
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1635
|
-
url: "/events",
|
|
1636
|
-
...options
|
|
1637
|
-
});
|
|
1638
|
-
var eventsSocket = (options) => (options?.client ?? client).get({
|
|
1639
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1640
|
-
url: "/events/socket",
|
|
1641
|
-
...options
|
|
1642
|
-
});
|
|
1643
|
-
var eventsStream = (options) => (options?.client ?? client).sse.get({
|
|
1644
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1645
|
-
url: "/events/stream",
|
|
1646
|
-
...options
|
|
1647
|
-
});
|
|
1648
|
-
var eventsGet = (options) => (options.client ?? client).get({
|
|
1649
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1650
|
-
url: "/events/{id}",
|
|
1651
|
-
...options
|
|
1652
|
-
});
|
|
1653
|
-
var webhooksList = (options) => (options?.client ?? client).get({
|
|
1654
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1655
|
-
url: "/webhooks",
|
|
1656
|
-
...options
|
|
1657
|
-
});
|
|
1658
|
-
var webhooksCreate = (options) => (options.client ?? client).post({
|
|
1659
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1660
|
-
url: "/webhooks",
|
|
1661
|
-
...options,
|
|
1662
|
-
headers: {
|
|
1663
|
-
"Content-Type": "application/json",
|
|
1664
|
-
...options.headers
|
|
1665
|
-
}
|
|
1666
|
-
});
|
|
1667
|
-
var webhooksDelete = (options) => (options.client ?? client).delete({
|
|
1668
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1669
|
-
url: "/webhooks/{id}",
|
|
1670
|
-
...options
|
|
1671
|
-
});
|
|
1672
|
-
var webhooksGet = (options) => (options.client ?? client).get({
|
|
1673
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1674
|
-
url: "/webhooks/{id}",
|
|
1675
|
-
...options
|
|
1676
|
-
});
|
|
1677
|
-
var webhooksUpdate = (options) => (options.client ?? client).patch({
|
|
1678
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1679
|
-
url: "/webhooks/{id}",
|
|
1680
|
-
...options,
|
|
1681
|
-
headers: {
|
|
1682
|
-
"Content-Type": "application/json",
|
|
1683
|
-
...options.headers
|
|
1684
|
-
}
|
|
1685
|
-
});
|
|
1686
|
-
var webhooksGetHeaders = (options) => (options.client ?? client).get({
|
|
1687
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1688
|
-
url: "/webhooks/{id}/headers",
|
|
1689
|
-
...options
|
|
1690
|
-
});
|
|
1691
|
-
var webhooksUpdateHeaders = (options) => (options.client ?? client).put({
|
|
1692
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1693
|
-
url: "/webhooks/{id}/headers",
|
|
1694
|
-
...options,
|
|
1695
|
-
headers: {
|
|
1696
|
-
"Content-Type": "application/json",
|
|
1697
|
-
...options.headers
|
|
1698
|
-
}
|
|
1699
|
-
});
|
|
1700
|
-
var webhooksDeliveries = (options) => (options.client ?? client).get({
|
|
1701
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1702
|
-
url: "/deliveries",
|
|
1703
|
-
...options
|
|
1704
|
-
});
|
|
1705
|
-
var webhooksReplay = (options) => (options.client ?? client).post({
|
|
1706
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1707
|
-
url: "/deliveries/{id}/replay",
|
|
1708
|
-
...options
|
|
1709
|
-
});
|
|
1710
|
-
var messagesRespondToInvitation = (options) => (options.client ?? client).post({
|
|
1711
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1712
|
-
url: "/messages/{id}/invitation/respond",
|
|
1713
|
-
...options,
|
|
1714
|
-
headers: {
|
|
1715
|
-
"Content-Type": "application/json",
|
|
1716
|
-
...options.headers
|
|
1717
|
-
}
|
|
1718
|
-
});
|
|
1719
|
-
var calendarGet = (options) => (options.client ?? client).get({
|
|
1720
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1721
|
-
url: "/identities/{id}/calendar",
|
|
1722
|
-
...options
|
|
1723
|
-
});
|
|
1724
|
-
var calendarUpdate = (options) => (options.client ?? client).patch({
|
|
1725
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1726
|
-
url: "/identities/{id}/calendar",
|
|
1727
|
-
...options,
|
|
1728
|
-
headers: {
|
|
1729
|
-
"Content-Type": "application/json",
|
|
1730
|
-
...options.headers
|
|
1731
|
-
}
|
|
1732
|
-
});
|
|
1733
|
-
var calendarListEvents = (options) => (options.client ?? client).get({
|
|
1734
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1735
|
-
url: "/identities/{id}/calendar/events",
|
|
1736
|
-
...options
|
|
1737
|
-
});
|
|
1738
|
-
var calendarCreateEvent = (options) => (options.client ?? client).post({
|
|
1739
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1740
|
-
url: "/identities/{id}/calendar/events",
|
|
1741
|
-
...options,
|
|
1742
|
-
headers: {
|
|
1743
|
-
"Content-Type": "application/json",
|
|
1744
|
-
...options.headers
|
|
1745
|
-
}
|
|
1746
|
-
});
|
|
1747
|
-
var calendarRespondToEvent = (options) => (options.client ?? client).post({
|
|
1748
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1749
|
-
url: "/identities/{id}/calendar/events/{eventId}/respond",
|
|
1750
|
-
...options,
|
|
1751
|
-
headers: {
|
|
1752
|
-
"Content-Type": "application/json",
|
|
1753
|
-
...options.headers
|
|
1754
|
-
}
|
|
1755
|
-
});
|
|
1756
|
-
var calendarListEventInstances = (options) => (options.client ?? client).get({
|
|
1757
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1758
|
-
url: "/identities/{id}/calendar/events/{eventId}/instances",
|
|
1759
|
-
...options
|
|
1760
|
-
});
|
|
1761
|
-
var calendarGetAgenda = (options) => (options.client ?? client).get(
|
|
1762
|
-
{
|
|
1763
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1764
|
-
url: "/identities/{id}/calendar/agenda",
|
|
1765
|
-
...options
|
|
1766
|
-
}
|
|
1767
|
-
);
|
|
1768
|
-
var calendarFreeTime = (options) => (options.client ?? client).get({
|
|
1769
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1770
|
-
url: "/calendar/free-time",
|
|
1771
|
-
...options
|
|
1772
|
-
});
|
|
1773
|
-
var calendarDeleteEvent = (options) => (options.client ?? client).delete({
|
|
1774
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1775
|
-
url: "/identities/{id}/calendar/events/{eventId}",
|
|
1776
|
-
...options
|
|
1777
|
-
});
|
|
1778
|
-
var calendarGetEvent = (options) => (options.client ?? client).get({
|
|
1779
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1780
|
-
url: "/identities/{id}/calendar/events/{eventId}",
|
|
1781
|
-
...options
|
|
1782
|
-
});
|
|
1783
|
-
var calendarUpdateEvent = (options) => (options.client ?? client).patch({
|
|
1784
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1785
|
-
url: "/identities/{id}/calendar/events/{eventId}",
|
|
1786
|
-
...options,
|
|
1787
|
-
headers: {
|
|
1788
|
-
"Content-Type": "application/json",
|
|
1789
|
-
...options.headers
|
|
1790
|
-
}
|
|
1791
|
-
});
|
|
1792
|
-
var draftsList = (options) => (options.client ?? client).get({
|
|
1793
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1794
|
-
url: "/drafts",
|
|
1795
|
-
...options
|
|
1796
|
-
});
|
|
1797
|
-
var draftsCreate = (options) => (options.client ?? client).post({
|
|
1798
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1799
|
-
url: "/drafts",
|
|
1800
|
-
...options,
|
|
1801
|
-
headers: {
|
|
1802
|
-
"Content-Type": "application/json",
|
|
1803
|
-
...options.headers
|
|
1804
|
-
}
|
|
1805
|
-
});
|
|
1806
|
-
var draftsDelete = (options) => (options.client ?? client).delete({
|
|
1807
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1808
|
-
url: "/drafts/{id}",
|
|
1809
|
-
...options
|
|
1810
|
-
});
|
|
1811
|
-
var draftsGet = (options) => (options.client ?? client).get({
|
|
1812
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1813
|
-
url: "/drafts/{id}",
|
|
1814
|
-
...options
|
|
1815
|
-
});
|
|
1816
|
-
var draftsUpdate = (options) => (options.client ?? client).patch({
|
|
1817
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1818
|
-
url: "/drafts/{id}",
|
|
1819
|
-
...options,
|
|
1820
|
-
headers: {
|
|
1821
|
-
"Content-Type": "application/json",
|
|
1822
|
-
...options.headers
|
|
1823
|
-
}
|
|
1824
|
-
});
|
|
1825
|
-
var draftsSend = (options) => (options.client ?? client).post({
|
|
1826
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1827
|
-
url: "/drafts/{id}/send",
|
|
1828
|
-
...options
|
|
1829
|
-
});
|
|
1830
|
-
var draftsApproval = (options) => (options.client ?? client).get({
|
|
1831
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1832
|
-
url: "/drafts/{id}/approval",
|
|
1833
|
-
...options
|
|
1834
|
-
});
|
|
1835
|
-
var draftsCancelSchedule = (options) => (options.client ?? client).delete({
|
|
1836
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1837
|
-
url: "/drafts/{id}/schedule",
|
|
1838
|
-
...options
|
|
1839
|
-
});
|
|
1840
|
-
var draftsSchedule = (options) => (options.client ?? client).post({
|
|
1841
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1842
|
-
url: "/drafts/{id}/schedule",
|
|
1843
|
-
...options,
|
|
1844
|
-
headers: {
|
|
1845
|
-
"Content-Type": "application/json",
|
|
1846
|
-
...options.headers
|
|
1847
|
-
}
|
|
1848
|
-
});
|
|
1849
|
-
var draftsRemoveAttachment = (options) => (options.client ?? client).delete({
|
|
1850
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1851
|
-
url: "/drafts/{id}/attachments/{attachmentId}",
|
|
1852
|
-
...options
|
|
1853
|
-
});
|
|
1854
|
-
var metricsQuery = (options) => (options?.client ?? client).get({
|
|
1855
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1856
|
-
url: "/metrics",
|
|
1857
|
-
...options
|
|
1858
|
-
});
|
|
1859
|
-
var attachmentsUpload = (options) => (options.client ?? client).post({
|
|
1860
|
-
...formDataBodySerializer,
|
|
1861
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1862
|
-
url: "/attachments",
|
|
1863
|
-
...options,
|
|
1864
|
-
headers: {
|
|
1865
|
-
"Content-Type": null,
|
|
1866
|
-
...options.headers
|
|
1867
|
-
}
|
|
1868
|
-
});
|
|
1869
|
-
var attachmentsCreateUpload = (options) => (options.client ?? client).post({
|
|
1870
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1871
|
-
url: "/attachments/uploads",
|
|
1872
|
-
...options,
|
|
1873
|
-
headers: {
|
|
1874
|
-
"Content-Type": "application/json",
|
|
1875
|
-
...options.headers
|
|
1876
|
-
}
|
|
1877
|
-
});
|
|
1878
|
-
var attachmentsCompleteUpload = (options) => (options.client ?? client).post({
|
|
1879
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1880
|
-
url: "/attachments/{id}/complete",
|
|
1881
|
-
...options
|
|
1882
|
-
});
|
|
1883
|
-
var attachmentsDownloadUrl = (options) => (options.client ?? client).get({
|
|
1884
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1885
|
-
url: "/attachments/{id}",
|
|
1886
|
-
...options
|
|
1887
|
-
});
|
|
1888
|
-
var attachmentsText = (options) => (options.client ?? client).get({
|
|
1889
|
-
security: [{ scheme: "bearer", type: "http" }],
|
|
1890
|
-
url: "/attachments/{id}/text",
|
|
1891
|
-
...options
|
|
1892
|
-
});
|
|
1893
|
-
var SIGNATURE_HEADER = "x-pidgeon-signature";
|
|
1894
|
-
var TIMESTAMP_HEADER = "x-pidgeon-timestamp";
|
|
1895
|
-
async function verifyWebhook(input) {
|
|
1896
|
-
const get = (name) => {
|
|
1897
|
-
if (input.headers instanceof Headers) return input.headers.get(name) ?? void 0;
|
|
1898
|
-
const direct = input.headers[name];
|
|
1899
|
-
if (direct !== void 0) return direct;
|
|
1900
|
-
const wanted = name.toLowerCase();
|
|
1901
|
-
for (const [key2, value] of Object.entries(input.headers)) {
|
|
1902
|
-
if (key2.toLowerCase() === wanted) return value;
|
|
1903
|
-
}
|
|
1904
|
-
return void 0;
|
|
1905
|
-
};
|
|
1906
|
-
const timestamp = get(TIMESTAMP_HEADER);
|
|
1907
|
-
const signature = get(SIGNATURE_HEADER);
|
|
1908
|
-
if (!timestamp || !signature) throw new Error("This request is not signed.");
|
|
1909
|
-
const seconds = Number(timestamp);
|
|
1910
|
-
if (!Number.isFinite(seconds)) throw new Error("The signature timestamp is not a number.");
|
|
1911
|
-
const now = Math.floor((input.now ?? /* @__PURE__ */ new Date()).getTime() / 1e3);
|
|
1912
|
-
const tolerance = input.toleranceSeconds ?? 300;
|
|
1913
|
-
if (Math.abs(now - seconds) > tolerance) {
|
|
1914
|
-
throw new Error("This request is too old to trust. It may be a replay.");
|
|
1915
|
-
}
|
|
1916
|
-
const key = await crypto.subtle.importKey(
|
|
1917
|
-
"raw",
|
|
1918
|
-
new TextEncoder().encode(input.secret),
|
|
1919
|
-
{ name: "HMAC", hash: "SHA-256" },
|
|
1920
|
-
false,
|
|
1921
|
-
["sign"]
|
|
1922
|
-
);
|
|
1923
|
-
const mac = await crypto.subtle.sign(
|
|
1924
|
-
"HMAC",
|
|
1925
|
-
key,
|
|
1926
|
-
new TextEncoder().encode(`${seconds}.${input.rawBody}`)
|
|
1927
|
-
);
|
|
1928
|
-
const expected = `v1=${[...new Uint8Array(mac)].map((byte) => byte.toString(16).padStart(2, "0")).join("")}`;
|
|
1929
|
-
if (!constantTimeEqual(expected, signature)) {
|
|
1930
|
-
throw new Error("The signature does not match.");
|
|
1931
|
-
}
|
|
1932
|
-
return JSON.parse(input.rawBody);
|
|
1933
|
-
}
|
|
1934
|
-
function constantTimeEqual(a, b) {
|
|
1935
|
-
if (a.length !== b.length) return false;
|
|
1936
|
-
let difference = 0;
|
|
1937
|
-
for (let index = 0; index < a.length; index += 1) {
|
|
1938
|
-
difference |= a.charCodeAt(index) ^ b.charCodeAt(index);
|
|
1939
|
-
}
|
|
1940
|
-
return difference === 0;
|
|
1941
|
-
}
|
|
1942
|
-
async function* streamEvents(options) {
|
|
1943
|
-
const base = (options.baseUrl ?? "https://pidgeon.ai/api/v1").replace(/\/$/, "");
|
|
1944
|
-
let lastEventId;
|
|
1945
|
-
let backoffMs = 1e3;
|
|
1946
|
-
while (!options.signal?.aborted) {
|
|
1947
|
-
const url = new URL(`${base}/events/stream`);
|
|
1948
|
-
if (options.identityId) url.searchParams.set("identity_id", options.identityId);
|
|
1949
|
-
if (options.type) url.searchParams.set("type", options.type);
|
|
1950
|
-
if (options.after && !lastEventId) url.searchParams.set("after", options.after);
|
|
1951
|
-
let response;
|
|
1952
|
-
try {
|
|
1953
|
-
response = await fetch(url, {
|
|
1954
|
-
headers: {
|
|
1955
|
-
authorization: `Bearer ${options.apiKey}`,
|
|
1956
|
-
accept: "text/event-stream",
|
|
1957
|
-
...lastEventId ? { "last-event-id": lastEventId } : {}
|
|
1958
|
-
},
|
|
1959
|
-
signal: options.signal
|
|
1960
|
-
});
|
|
1961
|
-
} catch {
|
|
1962
|
-
if (options.signal?.aborted) return;
|
|
1963
|
-
await sleep(backoffMs, options.signal);
|
|
1964
|
-
backoffMs = Math.min(backoffMs * 2, 3e4);
|
|
1965
|
-
continue;
|
|
1966
|
-
}
|
|
1967
|
-
if (response.status === 401 || response.status === 403 || response.status === 404) {
|
|
1968
|
-
throw new Error(
|
|
1969
|
-
`Pidgeon refused the stream: ${response.status} ${await response.text().catch(() => "")}`.trim()
|
|
1970
|
-
);
|
|
1971
|
-
}
|
|
1972
|
-
if (!response.ok || !response.body) {
|
|
1973
|
-
await sleep(backoffMs, options.signal);
|
|
1974
|
-
backoffMs = Math.min(backoffMs * 2, 3e4);
|
|
1975
|
-
continue;
|
|
1976
|
-
}
|
|
1977
|
-
backoffMs = 1e3;
|
|
1978
|
-
try {
|
|
1979
|
-
for await (const frame of frames(response.body, options.signal)) {
|
|
1980
|
-
if (frame.id) lastEventId = frame.id;
|
|
1981
|
-
if (!frame.data) continue;
|
|
1982
|
-
if (frame.event === "error") continue;
|
|
1983
|
-
let parsed;
|
|
1984
|
-
try {
|
|
1985
|
-
parsed = JSON.parse(frame.data);
|
|
1986
|
-
} catch {
|
|
1987
|
-
continue;
|
|
1988
|
-
}
|
|
1989
|
-
yield parsed;
|
|
1990
|
-
}
|
|
1991
|
-
} catch {
|
|
1992
|
-
if (options.signal?.aborted) return;
|
|
1993
|
-
await sleep(backoffMs, options.signal);
|
|
1994
|
-
backoffMs = Math.min(backoffMs * 2, 3e4);
|
|
1995
|
-
}
|
|
1996
|
-
}
|
|
1997
|
-
}
|
|
1998
|
-
async function* frames(body, signal) {
|
|
1999
|
-
const reader = body.getReader();
|
|
2000
|
-
const decoder = new TextDecoder();
|
|
2001
|
-
let buffer = "";
|
|
2002
|
-
try {
|
|
2003
|
-
while (!signal?.aborted) {
|
|
2004
|
-
const { done, value } = await reader.read();
|
|
2005
|
-
if (done) return;
|
|
2006
|
-
buffer += decoder.decode(value, { stream: true });
|
|
2007
|
-
let boundary = buffer.indexOf("\n\n");
|
|
2008
|
-
while (boundary !== -1) {
|
|
2009
|
-
const block = buffer.slice(0, boundary);
|
|
2010
|
-
buffer = buffer.slice(boundary + 2);
|
|
2011
|
-
boundary = buffer.indexOf("\n\n");
|
|
2012
|
-
const frame = {};
|
|
2013
|
-
const data = [];
|
|
2014
|
-
for (const line of block.split("\n")) {
|
|
2015
|
-
if (line.startsWith(":")) continue;
|
|
2016
|
-
const colon = line.indexOf(":");
|
|
2017
|
-
if (colon === -1) continue;
|
|
2018
|
-
const field = line.slice(0, colon);
|
|
2019
|
-
const value2 = line.slice(colon + 1).replace(/^ /, "");
|
|
2020
|
-
if (field === "id") frame.id = value2;
|
|
2021
|
-
else if (field === "event") frame.event = value2;
|
|
2022
|
-
else if (field === "data") data.push(value2);
|
|
2023
|
-
}
|
|
2024
|
-
if (data.length > 0) frame.data = data.join("\n");
|
|
2025
|
-
if (frame.id || frame.data) yield frame;
|
|
2026
|
-
}
|
|
2027
|
-
}
|
|
2028
|
-
} finally {
|
|
2029
|
-
await reader.cancel().catch(() => void 0);
|
|
2030
|
-
}
|
|
2031
|
-
}
|
|
2032
|
-
function sleep(ms, signal) {
|
|
2033
|
-
return new Promise((resolve) => {
|
|
2034
|
-
const timer = setTimeout(resolve, ms);
|
|
2035
|
-
signal?.addEventListener(
|
|
2036
|
-
"abort",
|
|
2037
|
-
() => {
|
|
2038
|
-
clearTimeout(timer);
|
|
2039
|
-
resolve();
|
|
2040
|
-
},
|
|
2041
|
-
{ once: true }
|
|
2042
|
-
);
|
|
2043
|
-
});
|
|
2044
|
-
}
|
|
2045
|
-
|
|
2046
|
-
// ../id/dist/chunk-QDQDZSU7.js
|
|
2047
|
-
import { createHash } from "crypto";
|
|
2048
|
-
import { chmod, mkdir, readFile, readdir, writeFile } from "fs/promises";
|
|
2049
|
-
import { homedir } from "os";
|
|
2050
|
-
import { join } from "path";
|
|
2051
|
-
import { createHash as createHash2, randomBytes } from "crypto";
|
|
2052
|
-
var __defProp = Object.defineProperty;
|
|
2053
|
-
var __export2 = (target, all) => {
|
|
2054
|
-
for (var name in all)
|
|
2055
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
2056
|
-
};
|
|
2057
|
-
var wasmBase64 = "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akEYaiAFQZgEaikAADcDACAFQfAFakEIaiAFQdEIaikAADcDACAFQfAFakEQaiAFQdkIaikAADcDACAFQYcGaiAFQcgIakEYaikAADcAACAFIAUpAIAENwPQBSAFIAUpAMkINwPwBSAFLQDICCEDQQAhAgNAIAVBkAZqIAJqQQA6AAAgAkEBaiICQSBHDQALQSAhAgNAIAVBkAZqIAJqQQA6AAAgAkEBaiICQcAARw0ACyAFQbAKakEIaiAFQfAFakEIaikDADcDACAFQbAKakEQaiAFQfAFakEQaikDADcDACAFQbAKakEXaiAFQfAFakEXaikAADcAACAFQdcKaiAFQdAFakEIaikDADcAACAFQd8KaiAFQdAFakEQaikDADcAACAFQecKaiAFQegFaikDADcAACAFIAUpA/AFNwOwCiAFIAUpA9AFNwDPCkHAASECA0AgBUEcaiACakEAOgAAIAJBAWoiAkHgAUcNAAsCQEHAABAEIgINAEEBQcAAEE8ACyACIAM6AAACQEE/RQ0AIAJBAWogBUGwCmpBP/wKAAALQcAAIQMLAkAgBEUNACAHIARBARA6CwJAIAFFDQAgBiABQQEQOgsCQAJAIAhFDQBBASEEQQAhAUEAIQMMAQsgBUHAADYC6AMgBSACNgLkAyAFIAM2AuADIAUgBUHgA2oQOEEAIQIgBSgCACEBIAUoAgQhA0EAIQQLIAAgBDYCDCAAIAI2AgggACADNgIEIAAgATYCACAFQfAKaiQAC84LAgp/JH4jAEEwayIDJAAgAyACKAIAIgStIg0gASgCACIFrSIOfiIPQpv80ZIBfkL/////AYMiEELSscwEfiABKAIEIgatIhEgDX4gAigCBCIHrSISIA5+fCITfCAQQu2n1+cBfiAPfEIdiHwiFEKb/NGSAX5C/////wGDIhVCFIYgASgCFCIIIAVqrSIWIAI1AhAiF358IAIoAhQiBSAEaq0iGCABNQIQIhl+fCACKAIMIgStIhogEX4gASgCCCIJrSIbIAIoAggiCq0iHH58IAEoAgwiC60iHSASfnwgFyAOfnwgGSANfnwiHn0gASgCHCIMIAlqrSIfIAIoAhwiCSAKaq0iIH58IAIoAiAiCiAEaq0iISABKAIYIgQgBmqtIiJ+fCABKAIgIgEgC2qtIiMgAigCGCICIAdqrSIkfnwg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AUEXdnJB/////wFxNgKQAiACIAIoApQBIgFBDHQgA0EUdnJB/////wFxNgKUAiACIAIoApgBIgNBD3QgAUERdnJB/////wFxNgKYAiACIAIoApwBIgFBEnQgA0EOdnJB/////wFxNgKcAiACIAIoAqABIgNBFXQgAUELdnJB/////wFxNgKgAiACIAIoAqQBIgVBGHQgA0EIdnJB/////wFxNgKkAiACIAIoAsABIgNBDXY2AsgCIAIgAigCqAEiAUECdkH/////AXE2AqwCIAIgAUEbdCAFQQV2ckH/////AXE2AqgCIAIgAigCrAEiBUEBdCABQR92ckH/////AXE2ArACIAIgAigCsAEiAUEEdCAFQRx2ckH/////AXE2ArQCIAIgAigCtAEiBUEHdCABQRl2ckH/////AXE2ArgCIAIgAigCuAEiAUEKdCAFQRZ2ckH/////AXE2ArwCIAIgAigCvAEiBUENdCABQRN2ckH/////AXE2AsACIAIgA0EQdCAFQRB2ckH/////AXE2AsQCIAJBzAJqIAJBhAJqQcyIwAAQCAJAQSRFIgENACACQYQCaiACQcwCakEk/AoAAAsgAkHMAmogAkGoAmpBkMXAABAIAkAgAQ0AIAJBqAJqIAJBzAJqQST8CgAACyACQcwCaiACQagCaiACQYQCahAwIAAgAkHMAmoQHSACQfACaiQAC4wKAQV/IwBBsAVrIgIkACACIAE1AAA3A1AgAiABMQAFQg6GIAExAARCBoaEIAExAAZCFoaENwNYIAIgATEACEINhiABMQAHQgWGhCABMQAJQhWGhDcDYCACIAExAAtCC4YgATEACkIDhoQgATEADEIThoQ3A2ggAiABMQAOQgqGIAExAA1CAoaEIAExAA9CEoaENwNwIAIgATUAEDcDeCACIAExABVCD4YgATEAFEIHhoQgATEAFkIXhoQ3A4ABIAIgATEAGEINhiABMQAXQgWGhCABMQAZQhWGhDcDiAEgAiABMQAbQgyGIAExABpCBIaEIAExABxCFIaENwOQASACIAExAB5CCoYgATEAHUIChoQgAS0AHyIDQRJ0rUKAgPAPg4Q3A5gBIAJB9AFqIAJB0ABqECYgAkHQAGogAkH0AWoQEiACQZwCaiACQdAAahAmAkBBKEUNACACQfACaiACQZwCakEo/AoAAAsg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DQALIANByAFqIAFBCGopAAA3AgAgA0HQAWogAUEQaikAADcCACADQdgBaiABQRhqKQAANwIAIAMgASkAADcCwAECQEHgAUUNACAAQQRqIANB4AH8CgAAC0EAIQILIAAgAjoAACADQYAEaiQAC+gEAQR/IwBBgARrIgIkAEEAIQMCQEHAAEUNACACQQhqQQBBwAD8CwALA0AgAkEIaiADaiIEQQFqIAEtAAAiBUEEdjoAACAEIAVBD3E6AAAgAUEBaiEBIANBAmoiA0HAAEcNAAtBACEBA0AgAkEIaiABaiIDIAMtAAAiBCAEQQhqIgRB8AFxazoAACADQQFqIgMgAy0AACAEwEEEdmo6AAAgAUEBaiIBQT9HDQALQQAhAQJAQShFIgMNACACQcgAakEAQSj8CwALAkAgAw0AIAJByABqQShqQcSHwABBKPwKAAALAkAgAw0AIAJBmAFqQcSHwABBKPwKAAALAkAgAw0AIAJBwAFqQQBBKPwLAAsDQAJAAkACQCABQcAARg0AIAFBAXENAQwCCyACQegBaiACQcgAakEEEC4CQEGgAUUNACACQcgAaiACQegBakGgAfwKAAALQQAhAQNAAkACQAJAIAFBwABGDQAgAUEBcQ0CIAFBAXYhAyABQcAATw0BIAJBiANqIANBwAdsQdjFwABqIAJBCGogAWotAAAQIiACQegBaiACQcgAaiACQYgDahAWIAJByABqIAJB6AFqED4MAgsCQEGgAUUNACAAIAJByABqQaAB/AoAAAsgAkGABGokAA8LIANBIEHsh8AAEDsACyABQQFqIQEMAAsLIAFBAXYhAwJAIAFBwABPDQAgAkGIA2ogA0HAB2xB2MXAAGogAkEIaiABai0AABAiIAJB6AFqIAJByABqIAJBiANqEBYgAkHIAGogAkHoAWoQPgwBCyADQSBB7IfAABA7AAsgAUEBaiEBDAALC6wEAQR/IwBB8AJrIgMkACABQShqIQQCQEEoRQ0AIANBqAFqIARBKPwKAAALQQAhBQNAIANBqAFqIAVqIgYgBigCACABIAVqKAIAajYCACAFQQRqIgVBKEcNAAsCQEEoRSIFDQAgA0HQAWogBEEo/AoAAAsgA0HQAWogARAhIANBCGogA0GoAWogAhAMIANBMGogA0HQAWogAkEoahAMIANB2ABqIAFB+ABqIAJB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AkEfRht0IQMDQCAEIANBHXZBBHFqIgUoAhAiAkUNAiADQQF0IQMgAiEEIAIoAgRBeHEgAUcNAAsLIAIoAggiAyAANgIMIAIgADYCCCAAQQA2AhggACACNgIMIAAgAzYCCA8LIAVBEGogADYCACAAIAQ2AhggACAANgIMIAAgADYCCAuUAgIFfwR+IwBBMGshA0EAIQQCQEGAAkUNACAAQQBBgAL8CwALAkBBKEUNACADQQhqQQBBKPwLAAsDQCADQQhqIARqIAEgBGopAAA3AwAgBEEIaiIEQSBHDQALQcAAIAJrIQVCASACrYYiCEIBiCEJIAhCf3whCiAIpyEGQgAhC0EAIQQDQCADQQhqIARBA3ZB+P///wFxaiIHKQMAIARBP3EiAa2IIQgCQCABIAVJDQAgBykDCEHAACABa62GIAiEIQgLAkACQCAIIAqDIAt8IginIgFBAXENACAEQQFqIgRBgAJHDQIMAQsgACAEaiABIAZBACAIIAlaIgcbazoAACAHrSELIAQgAmoiBEGAAkkNAQsLC5QCAQN/IwBB0AFrIgIkACACQYABaiABQdAAahAbAkBBKEUiAw0AIAJBMGogAkGAAWpBKPwKAAALIAJBgAFqQShqIQQCQCADDQAgAkHYAGogBEEo/AoAAAsgAkGAAWogAkEwakEFEDIgAkEIaiACQYABaiACQdgAahAMIAJBgAFqIAEgAkEIahAMIAQgAUEoaiACQQhqEAwgAkEwaiAEEBAgAkHYAGogAkGAAWoQECACLQBYQQFxEEghASAAIAIpADA3AAAgAEEIaiACQTBqQQhqKQAANwAAIABBEGogAkEwakEQaikAADcAACACIAItAE8gAUEHdHM6AE8gAEEYaiACQTBqQRhqKQAANwAAIAJB0AFqJAALmwIBBn4gACABKQMwIAEpAyggASkDICICQhqIfCIDQhmIfCIEp0H///8fcTYCGCAAIAEpAxAgASkDCCABKQMAIgVCGoh8IgZCGYh8IgenQf///x9xNgIIIAAgASkDOCAEQhqIfCIEp0H///8PcTYCHCAAIAEpAxggB0IaiHwiB6dB////D3E2AgwgACABKQNAIARCGYh8IgSnQf///x9xNgIgIAAgA0L///8PgyACQv///x+DIAdCGYh8IgJCGoh8PgIUIAAgAqdB////H3E2AhAgACABKQNIIARCGoh8IgKnQf///w9xNgIkIAAgAkIZiEITfiAFQv///x+DfCICQhqIIAZC////D4N8PgIEIAAgAqdB////H3E2AgAL/QEBAX8gACABKAIAIAAoAgAiA3NBACACQf8BcWsiAnEgA3M2AgAgACABKAIEIAAoAgQiA3MgAnEgA3M2AgQgACABKAIIIAAoAggiA3MgAnEgA3M2AgggACABKAIMIAAoAgwiA3MgAnEgA3M2AgwgACABKAIQIAAoAhAiA3MgAnEgA3M2AhAgACABKAIUIAAoAhQiA3MgAnEgA3M2AhQgACABKAIYIAAoAhgiA3MgAnEgA3M2AhggACABKAIcIAAoAhwiA3MgAnEgA3M2AhwgACABKAIgIAAoAiAiA3MgAnEgA3M2AiAgACABKAIkIAAoAiQiAXMgAnEgAXM2AiQLgQICA38BfiMAQRBrIgYkAEEBIQdBBCEIAkACQCAEIAVqQX9qQQAgBGtxrSADrX4iCUIgiKcNACAJpyIDQYCAgIB4IARrSw0AAkACQCABDQBBACEIIAZBDGohBQwBCyAGIAQ2AgwgASAFbCEIIAZBCGohBQsgBSAINgIAAkACQAJAAkACQCAGKAIMRQ0AAkAgBigCCCIIDQAgAw0CIAQhCAwDCyACIAggBCADEA4hCAwCCyADDQAgBCEIDAILIAMQBCEICyAIDQAgACAENgIEDAELIAAgCDYCBEEAIQcLQQghCAwBC0EAIQMLIAAgCGogAzYCACAAIAc2AgAgBkEQaiQAC/MBAQR/IwBB4ANrIgEkACABIABBAxAuAkBBKEUiAA0AIAFBoAFqQQBBKPwLAAsgAUGgAWpBKGohAgJAIAANACACQcSHwABBKPwKAAALIAFBoAFqQdAAaiEDAkAgAA0AIANBxIfAAEEo/AoAAAsCQCAADQAgAUGYAmpBAEEo/AsACyABQcACaiABIAMQDCABQegCaiABQaABaiABQdAAaiIAEAwgAUHAAmogAUHoAmoQMSEEIAFBkANqIAFBKGogAxAMIAFBuANqIAIgABAMIAQgAUGQA2ogAUG4A2oQMXEQSCEAIAFB4ANqJAAgAEH/AXFBAEcL2QEBBH8jAEEwayICJABBACEDAkBBJEUNACACQQxqQQBBJPwLAAtBACEEA0AgAkEMaiADaiABIANqKAIAIARBH3VqIANBtMXAAGooAgBrIgRB/////wFxNgIAIANBBGoiA0EkRw0AC0EAIQNBACAEQR92EEhB/wFxayEFQQAhBANAIAJBDGogA2oiASABKAIAIARBHXZqIANBtMXAAGooAgAgBXFqIgRB/////wFxNgIAIANBBGoiA0EkRw0ACwJAQSRFDQAgACACQQxqQST8CgAACyACQTBqJAAL7QEBAX8jAEGAAWsiASQAIAFB8P///wEgACgCJGutNwNQIAFB8P///wMgACgCIGutNwNIIAFB8P///wEgACgCHGutNwNAIAFB8P///wMgACgCGGutNwM4IAFB8P///wEgACgCFGutNwMwIAFB8P///wMgACgCEGutNwMoIAFB8P///wEgACgCDGutNwMgIAFB8P///wMgACgCCGutNwMYIAFB8P///wEgACgCBGutNwMQIAFB0P3//wMgACgCAGutNwMIIAFB2ABqIAFBCGoQJgJAQShFDQAgACABQdgAakEo/AoAAAsgAUGAAWokAAvOAQEEfyMAQdAAayICJAAgAUEoaiEDAkBBKEUNACACIANBKPwKAAALQQAhBANAIAIgBGoiBSAFKAIAIAEgBGooAgBqNgIAIARBBGoiBEEoRw0ACwJAQShFIgQNACACQShqIANBKPwKAAALIAJBKGogARAhAkAgBA0AIABB0ABqIAFB0ABqQSj8CgAACyAAQfgAaiABQfgAakHYtcIAEAwCQCAEDQAgACACQSj8CgAACwJAIAQNACAAQShqIAJBKGpBKPwKAAALIAJB0ABqJAALsQEBAn8jAEEgayICJAAgAS0AACEDIAJBF2ogAUEXaikAADcAACACQRFqIAFBEWopAAA3AAAgAkEJaiABQQlqKQAANwAAIAIgA0H4AXE6AAAgAiABKQABNwABIAIgAS0AH0E/cUHAAHI6AB8gACACEAkgAEE4aiABQThqKQAANwAAIABBMGogAUEwaikAADcAACAAQShqIAFBKGopAAA3AAAgACABKQAgNwAgIAJBIGokAAurAQECfyMAQcADayIDJAACQEEoRSIEDQAgA0GoAWpBKGogAUEoakEo/AoAAAsCQCAEDQAgA0GoAWpB0ABqIAFB0ABqQSj8CgAACwJAIAQNACADQagBaiABQSj8CgAACyACQX9qIQQDQCADQQhqIANBqAFqEBwgA0GoAWogA0EIahBBIARBf2oiBA0ACyADQaACaiADQagBahAcIAAgA0GgAmoQPiADQcADaiQAC5UBAQF/IwBBEGsiAyQAAkACQAJAIAIgAWoiASACTw0AQQAhAwwBCyADQQRqIAAoAgAiAiAAKAIEIAEgAkEBdCICIAEgAksbIgJBCCACQQhLGyICQQFBARAoIAMoAgRBAUcNASADKAIMIQAgAygCCCEDCyADIAAQRgALIAMoAgghASAAIAI2AgAgACABNgIEIANBEGokAAtzAQN/IwBBMGsiAyQAQQAhBAJAQSRFDQAgA0EMakEAQST8CwALQQAhBQNAIANBDGogBGogASAEaigCACAFQR12aiACIARqKAIAaiIFQf////8BcTYCACAEQQRqIgRBJEcNAAsgACADQQxqECogA0EwaiQAC2sBAn8jAEHAAGsiAiQAIAIgABAQIAJBIGogARAQQQEhAUEAIQADQCACQSBqIABqLQAAIAIgAGotAABzIgNBACADa3LAQX9KEEggAXEhASAAQQFqIgBBIEcNAAsgARBIIQAgAkHAAGokACAAC2sBAX8jAEGAAWsiAyQAIANBMGogARASIAJBf2ohASADQQhqIANBMGoQJgNAIANBMGogA0EIahASIANBCGogA0EwahAmIAFBf2oiAQ0ACwJAQShFDQAgACADQQhqQSj8CgAACyADQYABaiQAC3gBA38jAEEQayIBJAACQCAAKAIAIgIoAgQiA0EBcUUNACACKAIAIQIgASADQQF2NgIEIAEgAjYCACABQQQgACgCCCIALQAIIAAtAAkQNAALIAFBgICAgHg2AgAgASAANgIMIAFBBSAAKAIIIgAtAAggAC0ACRA0AAt3AQJ/IwBBEGsiBCQAQQBBACgCmMFCIgVBAWo2ApjBQgJAIAVBAEgNAAJAAkBBAC0AlMFCDQBBAEEAKAKQwUJBAWo2ApDBQkEAKAKcwUJBf0oNAQwCCyAEQQhqIAAgAREDAAALQQBBADoAlMFCIAJFDQAQVgALAAuLAQICfgF8IAH8ByICQjwgAkI8VhsiAkKA9SQgAkKA9SRUG7oiBCAERAAAAAAAGPVAIAQgAb0iAkIAUxtEAAAAAAAY9UAgAkL///////////8AgyIDQoCAgICAgIB4fEKAgICAgICA8P8AVBsgAkJ/fEL/////////B1QbIANQ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";
|
|
2058
|
-
var post_core_wasm_exports = {};
|
|
2059
|
-
__export2(post_core_wasm_exports, {
|
|
2060
|
-
default: () => __wbg_init,
|
|
2061
|
-
generateSeed: () => generateSeed,
|
|
2062
|
-
initSync: () => initSync,
|
|
2063
|
-
policyDecision: () => policyDecision,
|
|
2064
|
-
policyMaxAge: () => policyMaxAge,
|
|
2065
|
-
publicKey: () => publicKey,
|
|
2066
|
-
sign: () => sign,
|
|
2067
|
-
verify: () => verify
|
|
2068
|
-
});
|
|
2069
|
-
function generateSeed() {
|
|
2070
|
-
try {
|
|
2071
|
-
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
2072
|
-
wasm.generateSeed(retptr);
|
|
2073
|
-
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
2074
|
-
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
2075
|
-
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
|
|
2076
|
-
var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
|
|
2077
|
-
if (r3) {
|
|
2078
|
-
throw takeObject(r2);
|
|
2079
|
-
}
|
|
2080
|
-
var v1 = getArrayU8FromWasm0(r0, r1).slice();
|
|
2081
|
-
wasm.__wbindgen_export2(r0, r1 * 1, 1);
|
|
2082
|
-
return v1;
|
|
2083
|
-
} finally {
|
|
2084
|
-
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
2085
|
-
}
|
|
2086
|
-
}
|
|
2087
|
-
function policyDecision(now, fetched_at, max_age, cached_id, txt_id, kid_known) {
|
|
2088
|
-
let deferred3_0;
|
|
2089
|
-
let deferred3_1;
|
|
2090
|
-
try {
|
|
2091
|
-
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
2092
|
-
var ptr0 = isLikeNone(cached_id) ? 0 : passStringToWasm0(cached_id, wasm.__wbindgen_export3, wasm.__wbindgen_export4);
|
|
2093
|
-
var len0 = WASM_VECTOR_LEN;
|
|
2094
|
-
var ptr1 = isLikeNone(txt_id) ? 0 : passStringToWasm0(txt_id, wasm.__wbindgen_export3, wasm.__wbindgen_export4);
|
|
2095
|
-
var len1 = WASM_VECTOR_LEN;
|
|
2096
|
-
wasm.policyDecision(retptr, now, !isLikeNone(fetched_at), isLikeNone(fetched_at) ? 0 : fetched_at, max_age, ptr0, len0, ptr1, len1, kid_known);
|
|
2097
|
-
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
2098
|
-
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
2099
|
-
deferred3_0 = r0;
|
|
2100
|
-
deferred3_1 = r1;
|
|
2101
|
-
return getStringFromWasm0(r0, r1);
|
|
2102
|
-
} finally {
|
|
2103
|
-
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
2104
|
-
wasm.__wbindgen_export2(deferred3_0, deferred3_1, 1);
|
|
2105
|
-
}
|
|
2106
|
-
}
|
|
2107
|
-
function policyMaxAge(published) {
|
|
2108
|
-
const ret = wasm.policyMaxAge(!isLikeNone(published), isLikeNone(published) ? 0 : published);
|
|
2109
|
-
return ret;
|
|
2110
|
-
}
|
|
2111
|
-
function publicKey(seed) {
|
|
2112
|
-
try {
|
|
2113
|
-
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
2114
|
-
const ptr0 = passArray8ToWasm0(seed, wasm.__wbindgen_export3);
|
|
2115
|
-
const len0 = WASM_VECTOR_LEN;
|
|
2116
|
-
wasm.publicKey(retptr, ptr0, len0);
|
|
2117
|
-
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
2118
|
-
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
2119
|
-
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
|
|
2120
|
-
var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
|
|
2121
|
-
if (r3) {
|
|
2122
|
-
throw takeObject(r2);
|
|
2123
|
-
}
|
|
2124
|
-
var v2 = getArrayU8FromWasm0(r0, r1).slice();
|
|
2125
|
-
wasm.__wbindgen_export2(r0, r1 * 1, 1);
|
|
2126
|
-
return v2;
|
|
2127
|
-
} finally {
|
|
2128
|
-
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
2129
|
-
}
|
|
2130
|
-
}
|
|
2131
|
-
function sign(seed, message) {
|
|
2132
|
-
try {
|
|
2133
|
-
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
2134
|
-
const ptr0 = passArray8ToWasm0(seed, wasm.__wbindgen_export3);
|
|
2135
|
-
const len0 = WASM_VECTOR_LEN;
|
|
2136
|
-
const ptr1 = passArray8ToWasm0(message, wasm.__wbindgen_export3);
|
|
2137
|
-
const len1 = WASM_VECTOR_LEN;
|
|
2138
|
-
wasm.sign(retptr, ptr0, len0, ptr1, len1);
|
|
2139
|
-
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
2140
|
-
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
2141
|
-
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
|
|
2142
|
-
var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
|
|
2143
|
-
if (r3) {
|
|
2144
|
-
throw takeObject(r2);
|
|
2145
|
-
}
|
|
2146
|
-
var v3 = getArrayU8FromWasm0(r0, r1).slice();
|
|
2147
|
-
wasm.__wbindgen_export2(r0, r1 * 1, 1);
|
|
2148
|
-
return v3;
|
|
2149
|
-
} finally {
|
|
2150
|
-
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
2151
|
-
}
|
|
2152
|
-
}
|
|
2153
|
-
function verify(public_key, message, signature) {
|
|
2154
|
-
try {
|
|
2155
|
-
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
2156
|
-
const ptr0 = passArray8ToWasm0(public_key, wasm.__wbindgen_export3);
|
|
2157
|
-
const len0 = WASM_VECTOR_LEN;
|
|
2158
|
-
const ptr1 = passArray8ToWasm0(message, wasm.__wbindgen_export3);
|
|
2159
|
-
const len1 = WASM_VECTOR_LEN;
|
|
2160
|
-
const ptr2 = passArray8ToWasm0(signature, wasm.__wbindgen_export3);
|
|
2161
|
-
const len2 = WASM_VECTOR_LEN;
|
|
2162
|
-
wasm.verify(retptr, ptr0, len0, ptr1, len1, ptr2, len2);
|
|
2163
|
-
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
2164
|
-
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
|
2165
|
-
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
|
|
2166
|
-
if (r2) {
|
|
2167
|
-
throw takeObject(r1);
|
|
2168
|
-
}
|
|
2169
|
-
return r0 !== 0;
|
|
2170
|
-
} finally {
|
|
2171
|
-
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
2172
|
-
}
|
|
2173
|
-
}
|
|
2174
|
-
function __wbg_get_imports() {
|
|
2175
|
-
const import0 = {
|
|
2176
|
-
__proto__: null,
|
|
2177
|
-
__wbg_Error_30c8987f7c2ed4e2: function(arg0, arg1) {
|
|
2178
|
-
const ret = Error(getStringFromWasm0(arg0, arg1));
|
|
2179
|
-
return addHeapObject(ret);
|
|
2180
|
-
},
|
|
2181
|
-
__wbg_getRandomValues_436a51d0629d84e1: function() {
|
|
2182
|
-
return handleError(function(arg0, arg1) {
|
|
2183
|
-
globalThis.crypto.getRandomValues(getArrayU8FromWasm0(arg0, arg1));
|
|
2184
|
-
}, arguments);
|
|
2185
|
-
},
|
|
2186
|
-
__wbindgen_object_drop_ref: function(arg0) {
|
|
2187
|
-
takeObject(arg0);
|
|
2188
|
-
}
|
|
2189
|
-
};
|
|
2190
|
-
return {
|
|
2191
|
-
__proto__: null,
|
|
2192
|
-
"./post_core_wasm_bg.js": import0
|
|
2193
|
-
};
|
|
2194
|
-
}
|
|
2195
|
-
function addHeapObject(obj) {
|
|
2196
|
-
if (heap_next === heap.length) heap.push(heap.length + 1);
|
|
2197
|
-
const idx = heap_next;
|
|
2198
|
-
heap_next = heap[idx];
|
|
2199
|
-
heap[idx] = obj;
|
|
2200
|
-
return idx;
|
|
2201
|
-
}
|
|
2202
|
-
function dropObject(idx) {
|
|
2203
|
-
if (idx < 1028) return;
|
|
2204
|
-
heap[idx] = heap_next;
|
|
2205
|
-
heap_next = idx;
|
|
2206
|
-
}
|
|
2207
|
-
function getArrayU8FromWasm0(ptr, len) {
|
|
2208
|
-
ptr = ptr >>> 0;
|
|
2209
|
-
return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
|
|
2210
|
-
}
|
|
2211
|
-
var cachedDataViewMemory0 = null;
|
|
2212
|
-
function getDataViewMemory0() {
|
|
2213
|
-
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || cachedDataViewMemory0.buffer.detached === void 0 && cachedDataViewMemory0.buffer !== wasm.memory.buffer) {
|
|
2214
|
-
cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
|
|
2215
|
-
}
|
|
2216
|
-
return cachedDataViewMemory0;
|
|
2217
|
-
}
|
|
2218
|
-
function getStringFromWasm0(ptr, len) {
|
|
2219
|
-
return decodeText(ptr >>> 0, len);
|
|
2220
|
-
}
|
|
2221
|
-
var cachedUint8ArrayMemory0 = null;
|
|
2222
|
-
function getUint8ArrayMemory0() {
|
|
2223
|
-
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
|
|
2224
|
-
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
|
|
2225
|
-
}
|
|
2226
|
-
return cachedUint8ArrayMemory0;
|
|
2227
|
-
}
|
|
2228
|
-
function getObject(idx) {
|
|
2229
|
-
return heap[idx];
|
|
2230
|
-
}
|
|
2231
|
-
function handleError(f, args) {
|
|
2232
|
-
try {
|
|
2233
|
-
return f.apply(this, args);
|
|
2234
|
-
} catch (e) {
|
|
2235
|
-
wasm.__wbindgen_export(addHeapObject(e));
|
|
2236
|
-
}
|
|
2237
|
-
}
|
|
2238
|
-
var heap = new Array(1024).fill(void 0);
|
|
2239
|
-
heap.push(void 0, null, true, false);
|
|
2240
|
-
var heap_next = heap.length;
|
|
2241
|
-
function isLikeNone(x) {
|
|
2242
|
-
return x === void 0 || x === null;
|
|
2243
|
-
}
|
|
2244
|
-
function passArray8ToWasm0(arg, malloc) {
|
|
2245
|
-
const ptr = malloc(arg.length * 1, 1) >>> 0;
|
|
2246
|
-
getUint8ArrayMemory0().set(arg, ptr / 1);
|
|
2247
|
-
WASM_VECTOR_LEN = arg.length;
|
|
2248
|
-
return ptr;
|
|
2249
|
-
}
|
|
2250
|
-
function passStringToWasm0(arg, malloc, realloc) {
|
|
2251
|
-
if (realloc === void 0) {
|
|
2252
|
-
const buf = cachedTextEncoder.encode(arg);
|
|
2253
|
-
const ptr2 = malloc(buf.length, 1) >>> 0;
|
|
2254
|
-
getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf);
|
|
2255
|
-
WASM_VECTOR_LEN = buf.length;
|
|
2256
|
-
return ptr2;
|
|
2257
|
-
}
|
|
2258
|
-
let len = arg.length;
|
|
2259
|
-
let ptr = malloc(len, 1) >>> 0;
|
|
2260
|
-
const mem = getUint8ArrayMemory0();
|
|
2261
|
-
let offset = 0;
|
|
2262
|
-
for (; offset < len; offset++) {
|
|
2263
|
-
const code = arg.charCodeAt(offset);
|
|
2264
|
-
if (code > 127) break;
|
|
2265
|
-
mem[ptr + offset] = code;
|
|
2266
|
-
}
|
|
2267
|
-
if (offset !== len) {
|
|
2268
|
-
if (offset !== 0) {
|
|
2269
|
-
arg = arg.slice(offset);
|
|
2270
|
-
}
|
|
2271
|
-
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
|
|
2272
|
-
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
|
|
2273
|
-
const ret = cachedTextEncoder.encodeInto(arg, view);
|
|
2274
|
-
offset += ret.written;
|
|
2275
|
-
ptr = realloc(ptr, len, offset, 1) >>> 0;
|
|
2276
|
-
}
|
|
2277
|
-
WASM_VECTOR_LEN = offset;
|
|
2278
|
-
return ptr;
|
|
2279
|
-
}
|
|
2280
|
-
function takeObject(idx) {
|
|
2281
|
-
const ret = getObject(idx);
|
|
2282
|
-
dropObject(idx);
|
|
2283
|
-
return ret;
|
|
2284
|
-
}
|
|
2285
|
-
var cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
|
|
2286
|
-
cachedTextDecoder.decode();
|
|
2287
|
-
var MAX_SAFARI_DECODE_BYTES = 2146435072;
|
|
2288
|
-
var numBytesDecoded = 0;
|
|
2289
|
-
function decodeText(ptr, len) {
|
|
2290
|
-
numBytesDecoded += len;
|
|
2291
|
-
if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
|
|
2292
|
-
cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
|
|
2293
|
-
cachedTextDecoder.decode();
|
|
2294
|
-
numBytesDecoded = len;
|
|
2295
|
-
}
|
|
2296
|
-
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
|
|
2297
|
-
}
|
|
2298
|
-
var cachedTextEncoder = new TextEncoder();
|
|
2299
|
-
if (!("encodeInto" in cachedTextEncoder)) {
|
|
2300
|
-
cachedTextEncoder.encodeInto = function(arg, view) {
|
|
2301
|
-
const buf = cachedTextEncoder.encode(arg);
|
|
2302
|
-
view.set(buf);
|
|
2303
|
-
return {
|
|
2304
|
-
read: arg.length,
|
|
2305
|
-
written: buf.length
|
|
2306
|
-
};
|
|
2307
|
-
};
|
|
2308
|
-
}
|
|
2309
|
-
var WASM_VECTOR_LEN = 0;
|
|
2310
|
-
var wasmModule;
|
|
2311
|
-
var wasmInstance;
|
|
2312
|
-
var wasm;
|
|
2313
|
-
function __wbg_finalize_init(instance, module) {
|
|
2314
|
-
wasmInstance = instance;
|
|
2315
|
-
wasm = instance.exports;
|
|
2316
|
-
wasmModule = module;
|
|
2317
|
-
cachedDataViewMemory0 = null;
|
|
2318
|
-
cachedUint8ArrayMemory0 = null;
|
|
2319
|
-
return wasm;
|
|
2320
|
-
}
|
|
2321
|
-
async function __wbg_load(module, imports) {
|
|
2322
|
-
if (typeof Response === "function" && module instanceof Response) {
|
|
2323
|
-
if (!module.ok) {
|
|
2324
|
-
throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);
|
|
2325
|
-
}
|
|
2326
|
-
if (typeof WebAssembly.instantiateStreaming === "function") {
|
|
2327
|
-
try {
|
|
2328
|
-
return await WebAssembly.instantiateStreaming(module, imports);
|
|
2329
|
-
} catch (e) {
|
|
2330
|
-
const validResponse = expectedResponseType(module.type);
|
|
2331
|
-
if (validResponse && module.headers.get("Content-Type") !== "application/wasm") {
|
|
2332
|
-
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
|
|
2333
|
-
} else {
|
|
2334
|
-
throw e;
|
|
2335
|
-
}
|
|
2336
|
-
}
|
|
2337
|
-
}
|
|
2338
|
-
const bytes = await module.arrayBuffer();
|
|
2339
|
-
return await WebAssembly.instantiate(bytes, imports);
|
|
2340
|
-
} else {
|
|
2341
|
-
const instance = await WebAssembly.instantiate(module, imports);
|
|
2342
|
-
if (instance instanceof WebAssembly.Instance) {
|
|
2343
|
-
return { instance, module };
|
|
2344
|
-
} else {
|
|
2345
|
-
return instance;
|
|
2346
|
-
}
|
|
2347
|
-
}
|
|
2348
|
-
function expectedResponseType(type) {
|
|
2349
|
-
switch (type) {
|
|
2350
|
-
case "basic":
|
|
2351
|
-
case "cors":
|
|
2352
|
-
case "default":
|
|
2353
|
-
return true;
|
|
2354
|
-
}
|
|
2355
|
-
return false;
|
|
2356
|
-
}
|
|
2357
|
-
}
|
|
2358
|
-
function initSync(module) {
|
|
2359
|
-
if (wasm !== void 0) return wasm;
|
|
2360
|
-
if (module !== void 0) {
|
|
2361
|
-
if (Object.getPrototypeOf(module) === Object.prototype) {
|
|
2362
|
-
({ module } = module);
|
|
2363
|
-
} else {
|
|
2364
|
-
console.warn("using deprecated parameters for `initSync()`; pass a single object instead");
|
|
2365
|
-
}
|
|
2366
|
-
}
|
|
2367
|
-
const imports = __wbg_get_imports();
|
|
2368
|
-
if (!(module instanceof WebAssembly.Module)) {
|
|
2369
|
-
module = new WebAssembly.Module(module);
|
|
2370
|
-
}
|
|
2371
|
-
const instance = new WebAssembly.Instance(module, imports);
|
|
2372
|
-
return __wbg_finalize_init(instance, module);
|
|
2373
|
-
}
|
|
2374
|
-
async function __wbg_init(module_or_path) {
|
|
2375
|
-
if (wasm !== void 0) return wasm;
|
|
2376
|
-
if (module_or_path !== void 0) {
|
|
2377
|
-
if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
|
|
2378
|
-
({ module_or_path } = module_or_path);
|
|
2379
|
-
} else {
|
|
2380
|
-
console.warn("using deprecated parameters for the initialization function; pass a single object instead");
|
|
2381
|
-
}
|
|
2382
|
-
}
|
|
2383
|
-
const imports = __wbg_get_imports();
|
|
2384
|
-
if (typeof module_or_path === "string" || typeof Request === "function" && module_or_path instanceof Request || typeof URL === "function" && module_or_path instanceof URL) {
|
|
2385
|
-
module_or_path = fetch(module_or_path);
|
|
2386
|
-
}
|
|
2387
|
-
const { instance, module } = await __wbg_load(await module_or_path, imports);
|
|
2388
|
-
return __wbg_finalize_init(instance, module);
|
|
2389
|
-
}
|
|
2390
|
-
var ready = false;
|
|
2391
|
-
function wasm2() {
|
|
2392
|
-
if (!ready) {
|
|
2393
|
-
initSync({ module: Buffer.from(wasmBase64, "base64") });
|
|
2394
|
-
ready = true;
|
|
2395
|
-
}
|
|
2396
|
-
return post_core_wasm_exports;
|
|
2397
|
-
}
|
|
2398
|
-
var b64url = (bytes) => Buffer.from(bytes).toString("base64url");
|
|
2399
|
-
var fromB64url = (text) => new Uint8Array(Buffer.from(text, "base64url"));
|
|
2400
|
-
function jwkThumbprint(publicKey2) {
|
|
2401
|
-
return createHash("sha256").update(`{"crv":"Ed25519","kty":"OKP","x":"${b64url(publicKey2)}"}`).digest("base64url");
|
|
2402
|
-
}
|
|
2403
|
-
function identityFromSeed(input) {
|
|
2404
|
-
const seed = new Uint8Array(input.seed);
|
|
2405
|
-
const publicKey2 = wasm2().publicKey(seed);
|
|
2406
|
-
return {
|
|
2407
|
-
domain: input.domain.toLowerCase(),
|
|
2408
|
-
kid: jwkThumbprint(publicKey2),
|
|
2409
|
-
publicKey: publicKey2,
|
|
2410
|
-
seed,
|
|
2411
|
-
sign: (message) => wasm2().sign(seed, message)
|
|
2412
|
-
};
|
|
2413
|
-
}
|
|
2414
|
-
function generateIdentity(domain) {
|
|
2415
|
-
return identityFromSeed({ domain, seed: wasm2().generateSeed() });
|
|
2416
|
-
}
|
|
2417
|
-
function identityDir(env = process.env) {
|
|
2418
|
-
return env.PIDGEON_ID_DIR || join(env.XDG_CONFIG_HOME || join(homedir(), ".config"), "pidgeon", "id");
|
|
2419
|
-
}
|
|
2420
|
-
async function saveIdentity(identity, dir = identityDir()) {
|
|
2421
|
-
await mkdir(dir, { recursive: true, mode: 448 });
|
|
2422
|
-
const path = join(dir, `${identity.domain}.json`);
|
|
2423
|
-
const file = {
|
|
2424
|
-
v: 1,
|
|
2425
|
-
domain: identity.domain,
|
|
2426
|
-
kid: identity.kid,
|
|
2427
|
-
seed: b64url(identity.seed),
|
|
2428
|
-
previous: identity.previous ? { kid: identity.previous.kid, public_key: b64url(identity.previous.publicKey) } : null
|
|
2429
|
-
};
|
|
2430
|
-
await writeFile(path, `${JSON.stringify(file, null, 2)}
|
|
2431
|
-
`, { mode: 384 });
|
|
2432
|
-
await chmod(path, 384);
|
|
2433
|
-
return path;
|
|
2434
|
-
}
|
|
2435
|
-
async function loadIdentity(domain, options = {}) {
|
|
2436
|
-
const env = options.env ?? process.env;
|
|
2437
|
-
const name = domain.toLowerCase();
|
|
2438
|
-
const fromEnv = env.PIDGEON_ID_KEY?.split(":");
|
|
2439
|
-
if (fromEnv?.length === 2 && fromEnv[0].toLowerCase() === name) {
|
|
2440
|
-
return identityFromSeed({ domain: name, seed: fromB64url(fromEnv[1]) });
|
|
2441
|
-
}
|
|
2442
|
-
const path = join(options.dir ?? identityDir(env), `${name}.json`);
|
|
2443
|
-
let file;
|
|
2444
|
-
try {
|
|
2445
|
-
file = JSON.parse(await readFile(path, "utf8"));
|
|
2446
|
-
} catch {
|
|
2447
|
-
throw new Error(
|
|
2448
|
-
`No identity for ${name} on this machine. Run \`pidgeon id init ${name}\` first.`
|
|
2449
|
-
);
|
|
2450
|
-
}
|
|
2451
|
-
const identity = identityFromSeed({ domain: file.domain, seed: fromB64url(file.seed) });
|
|
2452
|
-
if (identity.kid !== file.kid)
|
|
2453
|
-
throw new Error(`${path} is damaged: its key does not match its kid.`);
|
|
2454
|
-
identity.previous = file.previous ? { kid: file.previous.kid, publicKey: fromB64url(file.previous.public_key) } : null;
|
|
2455
|
-
return identity;
|
|
2456
|
-
}
|
|
2457
|
-
async function listIdentities(dir = identityDir()) {
|
|
2458
|
-
try {
|
|
2459
|
-
return (await readdir(dir)).filter((name) => name.endsWith(".json")).map((name) => name.slice(0, -5));
|
|
2460
|
-
} catch {
|
|
2461
|
-
return [];
|
|
2462
|
-
}
|
|
2463
|
-
}
|
|
2464
|
-
var TAG = "web-bot-auth";
|
|
2465
|
-
var SIGNATURE_SECONDS = 300;
|
|
2466
|
-
var quote = (value) => `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
2467
|
-
function authority(url) {
|
|
2468
|
-
const defaultPort = url.protocol === "https:" && url.port === "443" || url.protocol === "http:" && url.port === "80";
|
|
2469
|
-
return `${url.hostname.toLowerCase()}${url.port && !defaultPort ? `:${url.port}` : ""}`;
|
|
2470
|
-
}
|
|
2471
|
-
function bytesOf(body) {
|
|
2472
|
-
return typeof body === "string" ? new TextEncoder().encode(body) : body;
|
|
2473
|
-
}
|
|
2474
|
-
function contentDigest(body) {
|
|
2475
|
-
return `sha-256=:${createHash2("sha256").update(bytesOf(body)).digest("base64")}:`;
|
|
2476
|
-
}
|
|
2477
|
-
async function signRequest(identity, input) {
|
|
2478
|
-
const url = new URL(input.url);
|
|
2479
|
-
const label = input.label ?? "sig1";
|
|
2480
|
-
const created = Math.floor((input.now ?? Date.now()) / 1e3);
|
|
2481
|
-
const expires = created + (input.seconds ?? SIGNATURE_SECONDS);
|
|
2482
|
-
const agent = input.agent?.trim().toLowerCase() ?? null;
|
|
2483
|
-
if (agent && !agent.endsWith(`@${identity.domain}`)) {
|
|
2484
|
-
throw new Error(`${agent} is not an address at ${identity.domain}, whose key this is.`);
|
|
2485
|
-
}
|
|
2486
|
-
const added = {
|
|
2487
|
-
"signature-agent": quote(`https://post.${identity.domain}`),
|
|
2488
|
-
...agent ? { from: agent } : {},
|
|
2489
|
-
...input.grants?.length ? { "post-grant": input.grants.map((jws) => jws.replace(/\s+/g, "")).join(", ") } : {}
|
|
2490
|
-
};
|
|
2491
|
-
const body = input.body === void 0 || input.body === null ? null : bytesOf(input.body);
|
|
2492
|
-
if (body && body.length > 0) added["content-digest"] = contentDigest(body);
|
|
2493
|
-
const values = [
|
|
2494
|
-
["@method", input.method.toUpperCase()],
|
|
2495
|
-
["@authority", authority(url)],
|
|
2496
|
-
["@path", url.pathname || "/"],
|
|
2497
|
-
...url.search ? [["@query", url.search]] : [],
|
|
2498
|
-
["signature-agent", added["signature-agent"]],
|
|
2499
|
-
...added.from ? [["from", added.from]] : [],
|
|
2500
|
-
...added["post-grant"] ? [["post-grant", added["post-grant"]]] : [],
|
|
2501
|
-
...added["content-digest"] ? [["content-digest", added["content-digest"]]] : []
|
|
2502
|
-
];
|
|
2503
|
-
const params = `(${values.map(([name]) => quote(name)).join(" ")});created=${created};expires=${expires};keyid=${quote(identity.kid)};alg="ed25519";nonce=${quote(randomBytes(32).toString("base64"))};tag=${quote(input.tag ?? TAG)}`;
|
|
2504
|
-
const base = [
|
|
2505
|
-
...values.map(([name, value]) => `${quote(name)}: ${value}`),
|
|
2506
|
-
`"@signature-params": ${params}`
|
|
2507
|
-
].join("\n");
|
|
2508
|
-
const signature = identity.sign(new TextEncoder().encode(base));
|
|
2509
|
-
return {
|
|
2510
|
-
...added,
|
|
2511
|
-
"signature-input": `${label}=${params}`,
|
|
2512
|
-
signature: `${label}=:${Buffer.from(signature).toString("base64")}:`
|
|
2513
|
-
};
|
|
2514
|
-
}
|
|
2515
|
-
function signedFetch(identity, options) {
|
|
2516
|
-
const base = options.fetch ?? globalThis.fetch;
|
|
2517
|
-
return async (resource, init) => {
|
|
2518
|
-
const request = new Request(resource, init);
|
|
2519
|
-
const body = request.body ? new Uint8Array(await request.arrayBuffer()) : null;
|
|
2520
|
-
const headers = {};
|
|
2521
|
-
request.headers.forEach((value, name) => {
|
|
2522
|
-
headers[name] = value;
|
|
2523
|
-
});
|
|
2524
|
-
const signature = await signRequest(identity, {
|
|
2525
|
-
method: request.method,
|
|
2526
|
-
url: request.url,
|
|
2527
|
-
headers,
|
|
2528
|
-
body,
|
|
2529
|
-
agent: options.agent,
|
|
2530
|
-
grants: options.grants
|
|
2531
|
-
});
|
|
2532
|
-
const signedHeaders = new Headers(request.headers);
|
|
2533
|
-
for (const [name, value] of Object.entries(signature)) signedHeaders.set(name, value);
|
|
2534
|
-
return base(request.url, {
|
|
2535
|
-
method: request.method,
|
|
2536
|
-
headers: signedHeaders,
|
|
2537
|
-
body: body && body.length > 0 ? body : void 0,
|
|
2538
|
-
redirect: request.redirect,
|
|
2539
|
-
signal: request.signal
|
|
2540
|
-
});
|
|
2541
|
-
};
|
|
2542
|
-
}
|
|
2543
|
-
var ISSUANCE_TAG = "pidgeon-id";
|
|
2544
|
-
var DEFAULT_ID_URL = "https://pidgeon.ai/api/id";
|
|
2545
|
-
var IdApiError = class extends Error {
|
|
2546
|
-
constructor(status, code, message) {
|
|
2547
|
-
super(message);
|
|
2548
|
-
this.status = status;
|
|
2549
|
-
this.code = code;
|
|
2550
|
-
}
|
|
2551
|
-
status;
|
|
2552
|
-
code;
|
|
2553
|
-
};
|
|
2554
|
-
var IdClient = class {
|
|
2555
|
-
constructor(identity, baseUrl2 = DEFAULT_ID_URL, fetcher = fetch) {
|
|
2556
|
-
this.identity = identity;
|
|
2557
|
-
this.baseUrl = baseUrl2;
|
|
2558
|
-
this.fetcher = fetcher;
|
|
2559
|
-
}
|
|
2560
|
-
identity;
|
|
2561
|
-
baseUrl;
|
|
2562
|
-
fetcher;
|
|
2563
|
-
async call(method, path, body) {
|
|
2564
|
-
const url = `${this.baseUrl.replace(/\/$/, "")}${path}`;
|
|
2565
|
-
const text = body === void 0 ? null : JSON.stringify(body);
|
|
2566
|
-
const headers = text ? { "content-type": "application/json" } : {};
|
|
2567
|
-
Object.assign(
|
|
2568
|
-
headers,
|
|
2569
|
-
await signRequest(this.identity, { method, url, headers, body: text, tag: ISSUANCE_TAG })
|
|
2570
|
-
);
|
|
2571
|
-
const response = await this.fetcher(url, { method, headers, body: text ?? void 0 });
|
|
2572
|
-
const json2 = await response.json().catch(() => null);
|
|
2573
|
-
if (!response.ok || !json2 || json2.data === void 0) {
|
|
2574
|
-
throw new IdApiError(
|
|
2575
|
-
response.status,
|
|
2576
|
-
json2?.error?.code,
|
|
2577
|
-
json2?.error?.message ?? `Pidgeon answered ${response.status}.`
|
|
2578
|
-
);
|
|
2579
|
-
}
|
|
2580
|
-
return json2.data;
|
|
2581
|
-
}
|
|
2582
|
-
/** Claim the domain with this key. Idempotent: a second call returns the same records. */
|
|
2583
|
-
claim() {
|
|
2584
|
-
return this.call("POST", "/domains", {
|
|
2585
|
-
domain: this.identity.domain,
|
|
2586
|
-
public_key: b64url(this.identity.publicKey)
|
|
2587
|
-
});
|
|
2588
|
-
}
|
|
2589
|
-
/** Look at DNS now; `verified` once `_post` says this key's id. */
|
|
2590
|
-
check() {
|
|
2591
|
-
return this.call("POST", "/domains/check", { domain: this.identity.domain });
|
|
2592
|
-
}
|
|
2593
|
-
issue(input) {
|
|
2594
|
-
return this.call("POST", "/agents", input);
|
|
2595
|
-
}
|
|
2596
|
-
list() {
|
|
2597
|
-
return this.call("GET", "/agents");
|
|
2598
|
-
}
|
|
2599
|
-
revoke(name) {
|
|
2600
|
-
return this.call("DELETE", `/agents/${encodeURIComponent(name)}`);
|
|
2601
|
-
}
|
|
2602
|
-
/**
|
|
2603
|
-
* The domain grants one of its own agents, at once: what it may do, for
|
|
2604
|
-
* which customer, account or order, where, until when (at most 90 days).
|
|
2605
|
-
*/
|
|
2606
|
-
grant(input) {
|
|
2607
|
-
return this.call("POST", "/grants", input);
|
|
2608
|
-
}
|
|
2609
|
-
/** Every token Sign in with Pidgeon issued `name`, taken back; its card and grants stand. */
|
|
2610
|
-
revokeSignIns(name) {
|
|
2611
|
-
return this.call("DELETE", `/agents/${encodeURIComponent(name)}/sign-ins`);
|
|
2612
|
-
}
|
|
2613
|
-
revokeGrant(id) {
|
|
2614
|
-
return this.call("DELETE", `/grants/${encodeURIComponent(id)}`);
|
|
2615
|
-
}
|
|
2616
|
-
/**
|
|
2617
|
-
* Publish `next` as the domain's key, signed by the current one. `proof`
|
|
2618
|
-
* is `next`'s own signature over the rotation, so nobody can rotate a
|
|
2619
|
-
* domain onto a key they do not hold.
|
|
2620
|
-
*/
|
|
2621
|
-
rotate(next) {
|
|
2622
|
-
const statement = rotationStatement(this.identity.domain, this.identity.kid, next.kid);
|
|
2623
|
-
return this.call("POST", "/keys", {
|
|
2624
|
-
public_key: b64url(next.publicKey),
|
|
2625
|
-
proof: b64url(next.sign(new TextEncoder().encode(statement)))
|
|
2626
|
-
});
|
|
2627
|
-
}
|
|
2628
|
-
};
|
|
2629
|
-
function rotationStatement(domain, from, to) {
|
|
2630
|
-
return `pidgeon id rotate
|
|
2631
|
-
${domain}
|
|
2632
|
-
${from}
|
|
2633
|
-
${to}`;
|
|
2634
|
-
}
|
|
2635
|
-
var TOKEN_EXCHANGE = "urn:ietf:params:oauth:grant-type:token-exchange";
|
|
2636
|
-
var JWT_BEARER = "urn:ietf:params:oauth:grant-type:jwt-bearer";
|
|
2637
|
-
var TOKEN_TYPE_JWT = "urn:ietf:params:oauth:token-type:jwt";
|
|
2638
|
-
var SignInError = class extends Error {
|
|
2639
|
-
constructor(step, status, code, message) {
|
|
2640
|
-
super(message);
|
|
2641
|
-
this.step = step;
|
|
2642
|
-
this.status = status;
|
|
2643
|
-
this.code = code;
|
|
2644
|
-
}
|
|
2645
|
-
step;
|
|
2646
|
-
status;
|
|
2647
|
-
code;
|
|
2648
|
-
};
|
|
2649
|
-
async function json(response) {
|
|
2650
|
-
return await response.json().catch(() => null) ?? {};
|
|
2651
|
-
}
|
|
2652
|
-
function form(values) {
|
|
2653
|
-
return new URLSearchParams(values).toString();
|
|
2654
|
-
}
|
|
2655
|
-
async function siteMetadata(site, fetcher = fetch) {
|
|
2656
|
-
const response = await fetcher(site, { headers: { accept: "application/json" } });
|
|
2657
|
-
const body = await json(response);
|
|
2658
|
-
if (!response.ok || typeof body.issuer !== "string" || typeof body.client_id !== "string") {
|
|
2659
|
-
throw new SignInError(
|
|
2660
|
-
"site",
|
|
2661
|
-
response.status,
|
|
2662
|
-
void 0,
|
|
2663
|
-
`${site} does not offer Sign in with Pidgeon.`
|
|
2664
|
-
);
|
|
2665
|
-
}
|
|
2666
|
-
const trim = (issuer) => issuer.replace(/\/$/, "");
|
|
2667
|
-
const listed = Array.isArray(body.issuers) ? body.issuers.filter((issuer) => typeof issuer === "string").map(trim) : [];
|
|
2668
|
-
return {
|
|
2669
|
-
issuer: body.issuer,
|
|
2670
|
-
issuers: [.../* @__PURE__ */ new Set([trim(body.issuer), ...listed])],
|
|
2671
|
-
client_id: body.client_id,
|
|
2672
|
-
token_endpoint: site
|
|
2673
|
-
};
|
|
2674
|
-
}
|
|
2675
|
-
function issuerFor(site, card) {
|
|
2676
|
-
try {
|
|
2677
|
-
const payload = JSON.parse(Buffer.from(card.split(".")[1] ?? "", "base64url").toString("utf8"));
|
|
2678
|
-
const iss = typeof payload?.iss === "string" ? payload.iss.replace(/\/$/, "") : null;
|
|
2679
|
-
if (iss && site.issuers.includes(iss)) return iss;
|
|
2680
|
-
} catch {
|
|
2681
|
-
}
|
|
2682
|
-
return site.issuer.replace(/\/$/, "");
|
|
2683
|
-
}
|
|
2684
|
-
async function fetchCard(agent, fetcher = fetch, postHost = (domain) => `https://post.${domain}`) {
|
|
2685
|
-
const domain = agent.split("@")[1] ?? "";
|
|
2686
|
-
const response = await fetcher(
|
|
2687
|
-
`${postHost(domain)}/.well-known/post/card?address=${encodeURIComponent(agent)}`
|
|
2688
|
-
);
|
|
2689
|
-
const body = await json(response);
|
|
2690
|
-
if (!response.ok || typeof body.jws !== "string") {
|
|
2691
|
-
throw new SignInError(
|
|
2692
|
-
"card",
|
|
2693
|
-
response.status,
|
|
2694
|
-
void 0,
|
|
2695
|
-
`${agent} has no card to sign in with.`
|
|
2696
|
-
);
|
|
2697
|
-
}
|
|
2698
|
-
return body.jws;
|
|
2699
|
-
}
|
|
2700
|
-
function signInWithPidgeon(identity, input) {
|
|
2701
|
-
return signIn(
|
|
2702
|
-
identity,
|
|
2703
|
-
input,
|
|
2704
|
-
async ({ tokenEndpoint, exchange, headers, agent }) => signRequest(identity, {
|
|
2705
|
-
method: "POST",
|
|
2706
|
-
url: tokenEndpoint,
|
|
2707
|
-
headers,
|
|
2708
|
-
body: exchange,
|
|
2709
|
-
agent,
|
|
2710
|
-
grants: input.grant ? [input.grant] : void 0
|
|
2711
|
-
})
|
|
2712
|
-
);
|
|
2713
|
-
}
|
|
2714
|
-
async function signIn(identity, input, authenticate, admit) {
|
|
2715
|
-
const fetcher = input.fetch ?? fetch;
|
|
2716
|
-
const agent = input.agent.trim().toLowerCase();
|
|
2717
|
-
const site = await siteMetadata(input.site, fetcher);
|
|
2718
|
-
admit?.(site);
|
|
2719
|
-
const card = input.card ?? await fetchCard(agent, fetcher, input.postHost);
|
|
2720
|
-
const issuer = admit ? site.issuer.replace(/\/$/, "") : issuerFor(site, card);
|
|
2721
|
-
const discovery = await json(await fetcher(`${issuer}/.well-known/openid-configuration`));
|
|
2722
|
-
const tokenEndpoint = discovery.token_endpoint;
|
|
2723
|
-
if (typeof tokenEndpoint !== "string") {
|
|
2724
|
-
throw new SignInError("pidgeon", 0, void 0, `${issuer} has no token endpoint.`);
|
|
2725
|
-
}
|
|
2726
|
-
const exchange = form({
|
|
2727
|
-
grant_type: TOKEN_EXCHANGE,
|
|
2728
|
-
subject_token: card,
|
|
2729
|
-
subject_token_type: TOKEN_TYPE_JWT,
|
|
2730
|
-
audience: site.client_id,
|
|
2731
|
-
...input.delegation ? { requested_token_type: TOKEN_TYPE_JWT } : {}
|
|
2732
|
-
});
|
|
2733
|
-
const headers = { "content-type": "application/x-www-form-urlencoded" };
|
|
2734
|
-
const issued = await fetcher(tokenEndpoint, {
|
|
2735
|
-
method: "POST",
|
|
2736
|
-
headers: {
|
|
2737
|
-
...headers,
|
|
2738
|
-
...await authenticate({ tokenEndpoint, exchange, headers, agent, site })
|
|
2739
|
-
},
|
|
2740
|
-
body: exchange
|
|
2741
|
-
});
|
|
2742
|
-
const tokens = await json(issued);
|
|
2743
|
-
if (!issued.ok || typeof tokens.id_token !== "string") {
|
|
2744
|
-
throw new SignInError(
|
|
2745
|
-
"pidgeon",
|
|
2746
|
-
issued.status,
|
|
2747
|
-
tokens.error,
|
|
2748
|
-
tokens.error_description ?? `Pidgeon answered ${issued.status}.`
|
|
2749
|
-
);
|
|
2750
|
-
}
|
|
2751
|
-
const bearer = form({ grant_type: JWT_BEARER, assertion: tokens.id_token });
|
|
2752
|
-
const answered = await fetcher(site.token_endpoint, {
|
|
2753
|
-
method: "POST",
|
|
2754
|
-
headers: {
|
|
2755
|
-
...headers,
|
|
2756
|
-
...await signRequest(identity, {
|
|
2757
|
-
method: "POST",
|
|
2758
|
-
url: site.token_endpoint,
|
|
2759
|
-
headers,
|
|
2760
|
-
body: bearer,
|
|
2761
|
-
agent
|
|
2762
|
-
})
|
|
2763
|
-
},
|
|
2764
|
-
body: bearer
|
|
2765
|
-
});
|
|
2766
|
-
const session = await json(answered);
|
|
2767
|
-
if (!answered.ok) {
|
|
2768
|
-
throw new SignInError(
|
|
2769
|
-
"site",
|
|
2770
|
-
answered.status,
|
|
2771
|
-
session.error,
|
|
2772
|
-
session.error_description ?? `The site answered ${answered.status}.`
|
|
2773
|
-
);
|
|
2774
|
-
}
|
|
2775
|
-
return {
|
|
2776
|
-
site: session,
|
|
2777
|
-
idToken: tokens.id_token,
|
|
2778
|
-
accessToken: tokens.access_token
|
|
2779
|
-
};
|
|
2780
|
-
}
|
|
2781
|
-
var UsageError = class extends Error {
|
|
2782
|
-
};
|
|
2783
|
-
var HELP = `pidgeon id \u2014 a signed identity for your agents, on your own domain. No account.
|
|
2784
|
-
|
|
2785
|
-
init <domain> Make a key on this machine and prove the domain over DNS
|
|
2786
|
-
check [<domain>] Look at DNS again
|
|
2787
|
-
issue <name> Give <name>@<domain> a card --kind agent|service --on-behalf-of <who>
|
|
2788
|
-
list Agents on the domain
|
|
2789
|
-
revoke <name> Withdraw an agent's card now
|
|
2790
|
-
rotate Replace the domain's key; the old one verifies for another day
|
|
2791
|
-
grant <name> Grant <name> what it may do, as the domain
|
|
2792
|
-
--scope bookings.change --label "manage bookings"
|
|
2793
|
-
--subject customer:42 --audience delta.com --days 30
|
|
2794
|
-
--grantor maria@example.com ask a person instead
|
|
2795
|
-
revoke-grant <id> Take a grant back now
|
|
2796
|
-
revoke-sign-ins <name> End every token <name> signed in with; its card and grants stand
|
|
2797
|
-
sign-in <site> Sign in to a site as an agent --as <name> --grant <jws>
|
|
2798
|
-
verify [<file>] Check a message's signatures (a file, or standard input). No key
|
|
2799
|
-
curl [-I] <url> Send a request signed as an agent --as <name>
|
|
2800
|
-
|
|
2801
|
-
--domain <domain> Which domain, when this machine holds more than one
|
|
2802
|
-
--json Print the API's answer as JSON
|
|
2803
|
-
--no-wait init: print the records and return
|
|
2804
|
-
|
|
2805
|
-
Keys live in ${"$"}PIDGEON_ID_DIR (default ~/.config/pidgeon/id). They never leave this machine.`;
|
|
2806
|
-
function parse(argv) {
|
|
2807
|
-
const positional = [];
|
|
2808
|
-
const flags = /* @__PURE__ */ new Map();
|
|
2809
|
-
for (let i = 0; i < argv.length; i++) {
|
|
2810
|
-
const token = argv[i];
|
|
2811
|
-
if (!token.startsWith("--")) {
|
|
2812
|
-
positional.push(token);
|
|
2813
|
-
continue;
|
|
2814
|
-
}
|
|
2815
|
-
const [name, inline] = token.slice(2).split("=", 2);
|
|
2816
|
-
if (["json", "no-wait", "help"].includes(name)) flags.set(name, true);
|
|
2817
|
-
else {
|
|
2818
|
-
const value = inline ?? argv[++i];
|
|
2819
|
-
if (value === void 0) throw new UsageError(`--${name} needs a value.`);
|
|
2820
|
-
flags.set(name, value);
|
|
2821
|
-
}
|
|
2822
|
-
}
|
|
2823
|
-
return { positional, flags };
|
|
2824
|
-
}
|
|
2825
|
-
var DOMAIN = /^(?=.{4,253}$)([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/;
|
|
2826
|
-
function baseUrl(env) {
|
|
2827
|
-
if (env.PIDGEON_ID_URL) return env.PIDGEON_ID_URL;
|
|
2828
|
-
if (env.PIDGEON_BASE_URL) return env.PIDGEON_BASE_URL.replace(/\/v1\/?$/, "/id");
|
|
2829
|
-
return DEFAULT_ID_URL;
|
|
2830
|
-
}
|
|
2831
|
-
function describeRecords(domain) {
|
|
2832
|
-
const lines = domain.records.map(
|
|
2833
|
-
(record) => ` ${record.found ? "\u2713" : "\xB7"} ${record.type.padEnd(5)} ${`${record.name}.${domain.domain}`.padEnd(28)} ${record.value}`
|
|
2834
|
-
);
|
|
2835
|
-
return lines;
|
|
2836
|
-
}
|
|
2837
|
-
async function runId(argv, env = process.env, options = {}) {
|
|
2838
|
-
const { positional, flags } = parse(argv);
|
|
2839
|
-
const [command, ...rest] = positional;
|
|
2840
|
-
if (!command || flags.has("help") || command === "help") return HELP;
|
|
2841
|
-
const dir = identityDir(env);
|
|
2842
|
-
const json2 = flags.has("json");
|
|
2843
|
-
const say = options.stderr ?? (() => {
|
|
2844
|
-
});
|
|
2845
|
-
const sleep2 = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
2846
|
-
const client2 = (identity) => new IdClient(identity, baseUrl(env), options.fetch);
|
|
2847
|
-
async function which() {
|
|
2848
|
-
const named = flags.get("domain");
|
|
2849
|
-
if (typeof named === "string") return loadIdentity(named, { dir, env });
|
|
2850
|
-
if (env.PIDGEON_ID_KEY) return loadIdentity(env.PIDGEON_ID_KEY.split(":")[0], { dir, env });
|
|
2851
|
-
const held = await listIdentities(dir);
|
|
2852
|
-
if (held.length === 1) return loadIdentity(held[0], { dir, env });
|
|
2853
|
-
if (held.length === 0)
|
|
2854
|
-
throw new UsageError("No domain here yet. Start with `pidgeon id init <domain>`.");
|
|
2855
|
-
throw new UsageError(`This machine holds ${held.join(", ")}. Say which with --domain.`);
|
|
2856
|
-
}
|
|
2857
|
-
try {
|
|
2858
|
-
switch (command) {
|
|
2859
|
-
case "init": {
|
|
2860
|
-
const domain = rest[0]?.trim().toLowerCase().replace(/\.$/, "");
|
|
2861
|
-
if (!domain || !DOMAIN.test(domain))
|
|
2862
|
-
throw new UsageError("Name the domain: `pidgeon id init acme.com`.");
|
|
2863
|
-
let identity;
|
|
2864
|
-
let made = false;
|
|
2865
|
-
try {
|
|
2866
|
-
identity = await loadIdentity(domain, { dir, env });
|
|
2867
|
-
} catch {
|
|
2868
|
-
identity = generateIdentity(domain);
|
|
2869
|
-
await saveIdentity(identity, dir);
|
|
2870
|
-
made = true;
|
|
2871
|
-
}
|
|
2872
|
-
let state = await client2(identity).claim();
|
|
2873
|
-
if (json2 && (state.status === "verified" || flags.has("no-wait")))
|
|
2874
|
-
return JSON.stringify(state, null, 2);
|
|
2875
|
-
const lines = [
|
|
2876
|
-
made ? `Made a signing key for ${domain} on this machine (${identity.kid}).` : `Using the key for ${domain} on this machine.`
|
|
2877
|
-
];
|
|
2878
|
-
if (state.status !== "verified") {
|
|
2879
|
-
lines.push(
|
|
2880
|
-
"",
|
|
2881
|
-
state.setup_url ? `Add the records in one click: ${state.setup_url}
|
|
2882
|
-
|
|
2883
|
-
Or add them by hand:` : "Add these records at your DNS provider:",
|
|
2884
|
-
...describeRecords(state),
|
|
2885
|
-
"",
|
|
2886
|
-
"The first proves the domain is yours. The second serves its keys and cards at",
|
|
2887
|
-
`post.${domain}; without it Pidgeon still verifies your agents, and nobody else can.`
|
|
2888
|
-
);
|
|
2889
|
-
if (flags.has("no-wait")) return [...lines, "", "Then: pidgeon id check"].join("\n");
|
|
2890
|
-
say(lines.join("\n"));
|
|
2891
|
-
say("\nWaiting for DNS\u2026");
|
|
2892
|
-
const deadline = Date.now() + Number(flags.get("timeout") ?? 600) * 1e3;
|
|
2893
|
-
while (state.status !== "verified" && Date.now() < deadline) {
|
|
2894
|
-
await sleep2(5e3);
|
|
2895
|
-
state = await client2(identity).check();
|
|
2896
|
-
}
|
|
2897
|
-
if (state.status !== "verified") {
|
|
2898
|
-
return "Not yet. DNS can take a while; run `pidgeon id check` once the record is in.";
|
|
2899
|
-
}
|
|
2900
|
-
lines.length = 0;
|
|
2901
|
-
}
|
|
2902
|
-
if (json2) return JSON.stringify(state, null, 2);
|
|
2903
|
-
return [...lines, `${domain} is proved. Next: pidgeon id issue support-agent`].join("\n").trim();
|
|
2904
|
-
}
|
|
2905
|
-
case "check": {
|
|
2906
|
-
const identity = rest[0] ? await loadIdentity(rest[0], { dir, env }) : await which();
|
|
2907
|
-
const state = await client2(identity).check();
|
|
2908
|
-
if (json2) return JSON.stringify(state, null, 2);
|
|
2909
|
-
return [
|
|
2910
|
-
`${state.domain}: ${state.status === "verified" ? "proved" : state.status}`,
|
|
2911
|
-
...describeRecords(state)
|
|
2912
|
-
].join("\n");
|
|
2913
|
-
}
|
|
2914
|
-
case "issue": {
|
|
2915
|
-
const name = rest[0]?.trim().toLowerCase();
|
|
2916
|
-
if (!name) throw new UsageError("Name the agent: `pidgeon id issue support-agent`.");
|
|
2917
|
-
const identity = await which();
|
|
2918
|
-
const kind = flags.get("kind");
|
|
2919
|
-
if (kind !== void 0 && kind !== "agent" && kind !== "service") {
|
|
2920
|
-
throw new UsageError("--kind is agent or service.");
|
|
2921
|
-
}
|
|
2922
|
-
const onBehalfOf = flags.get("on-behalf-of");
|
|
2923
|
-
const card = await client2(identity).issue({
|
|
2924
|
-
name,
|
|
2925
|
-
...kind ? { kind } : {},
|
|
2926
|
-
...typeof onBehalfOf === "string" ? { on_behalf_of: onBehalfOf } : {}
|
|
2927
|
-
});
|
|
2928
|
-
if (json2) return JSON.stringify(card, null, 2);
|
|
2929
|
-
return [
|
|
2930
|
-
`${card.card.address} has a card: ${card.url}`,
|
|
2931
|
-
`Found from the address at https://post.${identity.domain}/.well-known/post/card?address=${card.card.address}`,
|
|
2932
|
-
'It renews itself. Sign with it: import { loadIdentity, signEmail, signedFetch } from "@pidgeon-ai/id".'
|
|
2933
|
-
].join("\n");
|
|
2934
|
-
}
|
|
2935
|
-
case "verify": {
|
|
2936
|
-
const file = rest[0];
|
|
2937
|
-
const message = file ? await (await import("fs/promises")).readFile(file, "utf8") : await (options.stdin ?? readStdin)();
|
|
2938
|
-
if (!message.trim()) {
|
|
2939
|
-
throw new UsageError("Give it a message: `pidgeon id verify < message.eml`.");
|
|
2940
|
-
}
|
|
2941
|
-
const response = await (options.fetch ?? fetch)(
|
|
2942
|
-
`${new URL(baseUrl(env)).origin}/api/v1/verify`,
|
|
2943
|
-
{
|
|
2944
|
-
method: "POST",
|
|
2945
|
-
headers: { "content-type": "application/json" },
|
|
2946
|
-
body: JSON.stringify({ message })
|
|
2947
|
-
}
|
|
2948
|
-
);
|
|
2949
|
-
const answer = await response.json();
|
|
2950
|
-
if (!response.ok || !answer.data) {
|
|
2951
|
-
throw new UsageError(
|
|
2952
|
-
answer.error?.message ?? `The verifier answered ${response.status}.`
|
|
2953
|
-
);
|
|
2954
|
-
}
|
|
2955
|
-
if (json2) return JSON.stringify(answer.data, null, 2);
|
|
2956
|
-
return describeVerification(answer.data);
|
|
2957
|
-
}
|
|
2958
|
-
case "curl": {
|
|
2959
|
-
const head = rest[0] === "-I";
|
|
2960
|
-
const target = (head ? rest[1] : rest[0])?.trim();
|
|
2961
|
-
if (!target) throw new UsageError("Name a URL: `pidgeon id curl -I shop.example`.");
|
|
2962
|
-
const url = /^https?:\/\//.test(target) ? target : `https://${target}`;
|
|
2963
|
-
const identity = await which();
|
|
2964
|
-
const named = flags.get("as");
|
|
2965
|
-
let agent;
|
|
2966
|
-
if (typeof named === "string") {
|
|
2967
|
-
agent = named.includes("@") ? named : `${named}@${identity.domain}`;
|
|
2968
|
-
} else {
|
|
2969
|
-
const agents = await client2(identity).list();
|
|
2970
|
-
if (agents.length !== 1) {
|
|
2971
|
-
throw new UsageError("Say which agent signs, with --as <name>.");
|
|
2972
|
-
}
|
|
2973
|
-
agent = agents[0].address;
|
|
2974
|
-
}
|
|
2975
|
-
const sent = {};
|
|
2976
|
-
const signed = signedFetch(identity, {
|
|
2977
|
-
agent,
|
|
2978
|
-
fetch: async (resource, init) => {
|
|
2979
|
-
new Headers(init?.headers).forEach((value, name) => {
|
|
2980
|
-
if (/^(signature|signature-input|signature-agent|from|content-digest)$/.test(name)) {
|
|
2981
|
-
sent[name] = value;
|
|
2982
|
-
}
|
|
2983
|
-
});
|
|
2984
|
-
return (options.fetch ?? fetch)(resource, init);
|
|
2985
|
-
}
|
|
2986
|
-
});
|
|
2987
|
-
const response = await signed(url, { method: head ? "HEAD" : "GET" });
|
|
2988
|
-
const lines = Object.entries(sent).map(
|
|
2989
|
-
([name, value]) => `> ${capitalise(name)}: ${value}`
|
|
2990
|
-
);
|
|
2991
|
-
lines.push(`< ${response.status} ${response.statusText}`.trimEnd());
|
|
2992
|
-
if (head) {
|
|
2993
|
-
response.headers.forEach((value, name) => lines.push(`< ${capitalise(name)}: ${value}`));
|
|
2994
|
-
return lines.join("\n");
|
|
2995
|
-
}
|
|
2996
|
-
return [...lines, "", await response.text()].join("\n");
|
|
2997
|
-
}
|
|
2998
|
-
case "list": {
|
|
2999
|
-
const agents = await client2(await which()).list();
|
|
3000
|
-
if (json2) return JSON.stringify(agents, null, 2);
|
|
3001
|
-
if (agents.length === 0)
|
|
3002
|
-
return "No agents yet. `pidgeon id issue <name>` gives one a card.";
|
|
3003
|
-
return agents.map((agent) => `${agent.address} ${agent.kind} ${agent.card_url}`).join("\n");
|
|
3004
|
-
}
|
|
3005
|
-
case "revoke": {
|
|
3006
|
-
const name = rest[0]?.trim().toLowerCase();
|
|
3007
|
-
if (!name) throw new UsageError("Name the agent: `pidgeon id revoke support-agent`.");
|
|
3008
|
-
const revoked = await client2(await which()).revoke(name);
|
|
3009
|
-
if (json2) return JSON.stringify(revoked, null, 2);
|
|
3010
|
-
return `${revoked.address} has no card from now on. Copies already fetched lapse within a day.`;
|
|
3011
|
-
}
|
|
3012
|
-
case "rotate": {
|
|
3013
|
-
const current = await which();
|
|
3014
|
-
const next = generateIdentity(current.domain);
|
|
3015
|
-
const state = await client2(current).rotate(next);
|
|
3016
|
-
next.previous = { kid: current.kid, publicKey: current.publicKey };
|
|
3017
|
-
await saveIdentity(next, dir);
|
|
3018
|
-
if (json2) return JSON.stringify(state, null, 2);
|
|
3019
|
-
return `${current.domain} signs with ${next.kid} now. ${current.kid} still verifies for a day.`;
|
|
3020
|
-
}
|
|
3021
|
-
case "grant": {
|
|
3022
|
-
const name = rest[0]?.trim().toLowerCase();
|
|
3023
|
-
const scope = flags.get("scope");
|
|
3024
|
-
const label = flags.get("label");
|
|
3025
|
-
const subject = flags.get("subject");
|
|
3026
|
-
if (!name || typeof scope !== "string" || typeof label !== "string") {
|
|
3027
|
-
throw new UsageError(
|
|
3028
|
-
'Name the agent and the scope: `pidgeon id grant support-agent --scope bookings.change --label "manage bookings" --subject customer:42`.'
|
|
3029
|
-
);
|
|
3030
|
-
}
|
|
3031
|
-
const [type, ...idParts] = typeof subject === "string" ? subject.split(":") : [];
|
|
3032
|
-
if (!type || idParts.length === 0 || !["customer", "account", "order"].includes(type)) {
|
|
3033
|
-
throw new UsageError("--subject is customer:<id>, account:<id> or order:<id>.");
|
|
3034
|
-
}
|
|
3035
|
-
const days = flags.get("days");
|
|
3036
|
-
const audience = flags.get("audience");
|
|
3037
|
-
const grantor = flags.get("grantor");
|
|
3038
|
-
const grant = await client2(await which()).grant({
|
|
3039
|
-
agent: name,
|
|
3040
|
-
scope: { name: scope, label },
|
|
3041
|
-
subject: { type, id: idParts.join(":") },
|
|
3042
|
-
...typeof audience === "string" ? { audience } : {},
|
|
3043
|
-
...typeof grantor === "string" ? { grantor: { email: grantor } } : {},
|
|
3044
|
-
...typeof days === "string" ? { expires_at: new Date(Date.now() + Number(days) * 864e5).toISOString() } : {}
|
|
3045
|
-
});
|
|
3046
|
-
if (json2) return JSON.stringify(grant, null, 2);
|
|
3047
|
-
if (grant.consent_url) {
|
|
3048
|
-
return [
|
|
3049
|
-
`Asked ${typeof grantor === "string" ? grantor : "them"} to let ${grant.agent} ${grant.scope.label} for ${grant.subject.type} ${grant.subject.id}.`,
|
|
3050
|
-
`Send them this link; nothing is allowed until they answer it: ${grant.consent_url}`,
|
|
3051
|
-
`Grant ${grant.id}. \`pidgeon id revoke-grant ${grant.id}\` withdraws the request.`
|
|
3052
|
-
].join("\n");
|
|
3053
|
-
}
|
|
3054
|
-
return [
|
|
3055
|
-
`${grant.agent} may ${grant.scope.label} for ${grant.subject.type} ${grant.subject.id}${grant.audience ? ` at ${grant.audience}` : ""}, until ${grant.expires_at}.`,
|
|
3056
|
-
`Grant ${grant.id}. The agent carries it as Post-Grant; --json prints the JWS.`
|
|
3057
|
-
].join("\n");
|
|
3058
|
-
}
|
|
3059
|
-
case "revoke-grant": {
|
|
3060
|
-
const grantId = rest[0]?.trim();
|
|
3061
|
-
if (!grantId) throw new UsageError("Name the grant: `pidgeon id revoke-grant <id>`.");
|
|
3062
|
-
const revoked = await client2(await which()).revokeGrant(grantId);
|
|
3063
|
-
if (json2) return JSON.stringify(revoked, null, 2);
|
|
3064
|
-
return `Grant ${revoked.id} is revoked. The next check of it fails.`;
|
|
3065
|
-
}
|
|
3066
|
-
case "revoke-sign-ins": {
|
|
3067
|
-
const name = rest[0]?.trim().toLowerCase();
|
|
3068
|
-
if (!name)
|
|
3069
|
-
throw new UsageError("Name the agent: `pidgeon id revoke-sign-ins support-agent`.");
|
|
3070
|
-
const done = await client2(await which()).revokeSignIns(name);
|
|
3071
|
-
if (json2) return JSON.stringify(done, null, 2);
|
|
3072
|
-
return `${done.address}: ${done.revoked} token${done.revoked === 1 ? "" : "s"} taken back. Its card and grants stand.`;
|
|
3073
|
-
}
|
|
3074
|
-
case "sign-in": {
|
|
3075
|
-
const site = rest[0];
|
|
3076
|
-
const name = flags.get("as");
|
|
3077
|
-
if (!site || typeof name !== "string") {
|
|
3078
|
-
throw new UsageError(
|
|
3079
|
-
"Name the site and the agent: `pidgeon id sign-in https://site.example/api/auth/pidgeon/token --as support-agent`."
|
|
3080
|
-
);
|
|
3081
|
-
}
|
|
3082
|
-
const identity = await which();
|
|
3083
|
-
const card = await client2(identity).issue({ name: name.trim().toLowerCase() });
|
|
3084
|
-
const grant = flags.get("grant");
|
|
3085
|
-
try {
|
|
3086
|
-
const signedIn = await signInWithPidgeon(identity, {
|
|
3087
|
-
agent: card.card.address,
|
|
3088
|
-
site,
|
|
3089
|
-
card: card.jws,
|
|
3090
|
-
...typeof grant === "string" ? { grant } : {},
|
|
3091
|
-
...options.fetch ? { fetch: options.fetch } : {}
|
|
3092
|
-
});
|
|
3093
|
-
if (json2) return JSON.stringify(signedIn.site, null, 2);
|
|
3094
|
-
return `Signed in to ${new URL(site).host} as ${card.card.address}.
|
|
3095
|
-
${JSON.stringify(signedIn.site, null, 2)}`;
|
|
3096
|
-
} catch (error) {
|
|
3097
|
-
if (error instanceof SignInError) throw new Error(`${error.step}: ${error.message}`);
|
|
3098
|
-
throw error;
|
|
3099
|
-
}
|
|
3100
|
-
}
|
|
3101
|
-
default:
|
|
3102
|
-
throw new UsageError(`No such command "${command}".
|
|
3103
|
-
|
|
3104
|
-
${HELP}`);
|
|
3105
|
-
}
|
|
3106
|
-
} catch (error) {
|
|
3107
|
-
if (error instanceof IdApiError) {
|
|
3108
|
-
throw new Error(error.code ? `${error.code}: ${error.message}` : error.message);
|
|
3109
|
-
}
|
|
3110
|
-
throw error;
|
|
3111
|
-
}
|
|
3112
|
-
}
|
|
3113
|
-
function describeVerification(v) {
|
|
3114
|
-
const signer = v.signatures.envelope.domain ?? v.signatures.declaration.domain;
|
|
3115
|
-
const signed = v.signatures.envelope.result === "pass" || v.signatures.declaration.result === "pass";
|
|
3116
|
-
const broken = v.signatures.envelope.result === "fail" || v.signatures.declaration.result === "fail";
|
|
3117
|
-
const row = (ok, label, value) => `${ok === null ? "\xB7" : ok ? "\u2713" : "\u2717"} ${label.padEnd(10)} ${value}`;
|
|
3118
|
-
return [
|
|
3119
|
-
row(
|
|
3120
|
-
signed && !broken,
|
|
3121
|
-
"signature",
|
|
3122
|
-
signed && !broken ? `valid, ${signer}` : broken ? `broken${signer ? `, ${signer}` : ""}` : "none"
|
|
3123
|
-
),
|
|
3124
|
-
row(v.is_agent, "agent", v.sender?.address ?? "not declared"),
|
|
3125
|
-
row(v.sender?.on_behalf_of ? true : null, "acts for", v.sender?.on_behalf_of ?? "not said"),
|
|
3126
|
-
row(
|
|
3127
|
-
v.body === "not_checked" ? null : v.body === "intact",
|
|
3128
|
-
"body",
|
|
3129
|
-
v.body === "intact" ? "as it was sent" : v.body === "changed" ? "changed since" : "not checked"
|
|
3130
|
-
),
|
|
3131
|
-
"",
|
|
3132
|
-
v.advice
|
|
3133
|
-
].join("\n");
|
|
3134
|
-
}
|
|
3135
|
-
function capitalise(name) {
|
|
3136
|
-
return name.replace(
|
|
3137
|
-
/(^|-)([a-z])/g,
|
|
3138
|
-
(_, dash, letter) => dash + letter.toUpperCase()
|
|
3139
|
-
);
|
|
3140
|
-
}
|
|
3141
|
-
async function readStdin() {
|
|
3142
|
-
const chunks = [];
|
|
3143
|
-
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
3144
|
-
return Buffer.concat(chunks).toString("utf8");
|
|
3145
|
-
}
|
|
3146
|
-
|
|
3147
|
-
// src/index.ts
|
|
3148
|
-
var DEFAULT_BASE_URL = "https://pidgeon.ai/api/v1";
|
|
3149
|
-
var UsageError2 = class extends Error {
|
|
3150
|
-
};
|
|
3151
|
-
var ApiError = class extends Error {
|
|
3152
|
-
constructor(status, code, message) {
|
|
3153
|
-
super(code ? `${status} ${code}: ${message}` : `${status}: ${message}`);
|
|
3154
|
-
this.status = status;
|
|
3155
|
-
this.code = code;
|
|
3156
|
-
}
|
|
3157
|
-
status;
|
|
3158
|
-
code;
|
|
3159
|
-
};
|
|
3160
|
-
function coerce(flag, raw) {
|
|
3161
|
-
if (flag.kind === "number") {
|
|
3162
|
-
const value = Number(raw);
|
|
3163
|
-
if (Number.isNaN(value)) throw new UsageError2(`--${flag.name} takes a number, not "${raw}".`);
|
|
3164
|
-
return value;
|
|
3165
|
-
}
|
|
3166
|
-
if (flag.kind === "json") {
|
|
3167
|
-
try {
|
|
3168
|
-
return JSON.parse(raw);
|
|
3169
|
-
} catch {
|
|
3170
|
-
throw new UsageError2(`--${flag.name} takes JSON, and that did not parse.`);
|
|
3171
|
-
}
|
|
3172
|
-
}
|
|
3173
|
-
return raw;
|
|
3174
|
-
}
|
|
3175
|
-
function parse2(command, argv) {
|
|
3176
|
-
const byName = new Map(command.flags.map((flag) => [flag.name, flag]));
|
|
3177
|
-
const out = { path: {}, query: {}, body: {}, header: {} };
|
|
3178
|
-
for (let i = 0; i < argv.length; i++) {
|
|
3179
|
-
const token = argv[i];
|
|
3180
|
-
if (!token.startsWith("--")) throw new UsageError2(`Unexpected argument "${token}".`);
|
|
3181
|
-
const [name, inline] = token.slice(2).split(/=([\s\S]*)/, 2);
|
|
3182
|
-
const flag = byName.get(name);
|
|
3183
|
-
if (!flag) {
|
|
3184
|
-
throw new UsageError2(
|
|
3185
|
-
`\`${command.group} ${command.name}\` has no --${name}. Try \`pidgeon ${command.group} ${command.name} --help\`.`
|
|
3186
|
-
);
|
|
3187
|
-
}
|
|
3188
|
-
if (flag.kind === "boolean") {
|
|
3189
|
-
out[flag.where][name] = inline === void 0 ? true : inline === "true";
|
|
3190
|
-
continue;
|
|
3191
|
-
}
|
|
3192
|
-
const raw = inline ?? argv[++i];
|
|
3193
|
-
if (raw === void 0) throw new UsageError2(`--${name} needs a value.`);
|
|
3194
|
-
if (flag.kind === "list") {
|
|
3195
|
-
const existing = out[flag.where][name] ?? [];
|
|
3196
|
-
out[flag.where][name] = [...existing, raw];
|
|
3197
|
-
continue;
|
|
3198
|
-
}
|
|
3199
|
-
out[flag.where][name] = coerce(flag, raw);
|
|
3200
|
-
}
|
|
3201
|
-
const missing = command.flags.filter((flag) => flag.required).filter((flag) => out[flag.where][flag.name] === void 0).map((flag) => `--${flag.name}`);
|
|
3202
|
-
if (missing.length > 0) {
|
|
3203
|
-
throw new UsageError2(`\`${command.group} ${command.name}\` needs ${missing.join(", ")}.`);
|
|
3204
|
-
}
|
|
3205
|
-
return out;
|
|
3206
|
-
}
|
|
3207
|
-
function help(command) {
|
|
3208
|
-
if (!command) {
|
|
3209
|
-
const groups = [...new Set(COMMANDS.map((c) => c.group))].sort();
|
|
3210
|
-
return [
|
|
3211
|
-
"pidgeon <group> <command> [--flags]",
|
|
3212
|
-
"",
|
|
3213
|
-
"Groups:",
|
|
3214
|
-
...groups.map((group) => {
|
|
3215
|
-
const names = COMMANDS.filter((c) => c.group === group).map((c) => c.name);
|
|
3216
|
-
return ` ${group.padEnd(14)}${names.join(", ")}`;
|
|
3217
|
-
}),
|
|
3218
|
-
"",
|
|
3219
|
-
"An API key goes in PIDGEON_API_KEY. `pidgeon <group> <command> --help`",
|
|
3220
|
-
"describes one command; --verbose prints what was sent, on stderr.",
|
|
3221
|
-
"",
|
|
3222
|
-
"`pidgeon id` gives agents on your own domain a signed identity, with no",
|
|
3223
|
-
"account and no key: `pidgeon id help`."
|
|
3224
|
-
].join("\n");
|
|
3225
|
-
}
|
|
3226
|
-
const flags = command.flags.map((flag) => {
|
|
3227
|
-
const takes = flag.choices?.length ? flag.choices.join("|") : flag.kind;
|
|
3228
|
-
const label = ` --${flag.name}${flag.kind === "boolean" ? "" : ` <${takes}>`}`;
|
|
3229
|
-
const note = [flag.required ? "required" : null, flag.describe].filter(Boolean).join(" \u2014 ");
|
|
3230
|
-
if (!note) return label;
|
|
3231
|
-
return `${label.padEnd(34)}${label.length >= 34 ? " " : ""}${note}`;
|
|
3232
|
-
});
|
|
3233
|
-
return [
|
|
3234
|
-
`pidgeon ${command.group} ${command.name} [--flags]`,
|
|
3235
|
-
"",
|
|
3236
|
-
` ${command.summary}`,
|
|
3237
|
-
` ${command.method} ${command.path}`,
|
|
3238
|
-
"",
|
|
3239
|
-
...flags.length > 0 ? ["Flags:", ...flags] : ["Takes no flags."]
|
|
3240
|
-
].join("\n");
|
|
3241
|
-
}
|
|
3242
|
-
function headersFor(command, parsed) {
|
|
3243
|
-
const headers = {};
|
|
3244
|
-
for (const flag of command.flags) {
|
|
3245
|
-
if (flag.where !== "header" || !flag.header) continue;
|
|
3246
|
-
const given = parsed.header[flag.name];
|
|
3247
|
-
if (typeof given === "string") headers[flag.header] = given;
|
|
3248
|
-
else if (flag.header === "Idempotency-Key") headers[flag.header] = crypto.randomUUID();
|
|
3249
|
-
}
|
|
3250
|
-
return headers;
|
|
3251
|
-
}
|
|
3252
|
-
function find(group, name) {
|
|
3253
|
-
return COMMANDS.find((c) => c.group === group && c.name === name);
|
|
3254
|
-
}
|
|
3255
|
-
async function run(argv, env, options = {}) {
|
|
3256
|
-
const verbose = argv.includes("--verbose");
|
|
3257
|
-
const [group, name, ...rest] = argv.filter((token) => token !== "--verbose");
|
|
3258
|
-
if (!group || group === "--help" || group === "help") return help();
|
|
3259
|
-
if (group === "id") {
|
|
3260
|
-
try {
|
|
3261
|
-
return await runId(argv.slice(1), env, { stderr: options.stderr });
|
|
3262
|
-
} catch (error2) {
|
|
3263
|
-
if (error2 instanceof UsageError) throw new UsageError2(error2.message);
|
|
3264
|
-
throw error2;
|
|
3265
|
-
}
|
|
3266
|
-
}
|
|
3267
|
-
const command = find(group, name);
|
|
3268
|
-
if (!command) {
|
|
3269
|
-
const known = COMMANDS.filter((c) => c.group === group);
|
|
3270
|
-
if (known.length === 0) throw new UsageError2(`No such group "${group}".
|
|
3271
|
-
|
|
3272
|
-
${help()}`);
|
|
3273
|
-
throw new UsageError2(
|
|
3274
|
-
`\`${group}\` has no "${name ?? ""}" command. It has: ${known.map((c) => c.name).join(", ")}.`
|
|
3275
|
-
);
|
|
3276
|
-
}
|
|
3277
|
-
if (rest.includes("--help")) return help(command);
|
|
3278
|
-
const apiKey = env.PIDGEON_API_KEY;
|
|
3279
|
-
if (!apiKey) {
|
|
3280
|
-
throw new UsageError2(
|
|
3281
|
-
"PIDGEON_API_KEY is not set. Create a key at https://pidgeon.ai/app/developers/keys."
|
|
3282
|
-
);
|
|
3283
|
-
}
|
|
3284
|
-
const parsed = parse2(command, rest);
|
|
3285
|
-
const headers = headersFor(command, parsed);
|
|
3286
|
-
const idempotencyKey = headers["Idempotency-Key"];
|
|
3287
|
-
if (verbose && idempotencyKey) options.stderr?.(`Idempotency-Key: ${idempotencyKey}`);
|
|
3288
|
-
client.setConfig(
|
|
3289
|
-
createConfig({
|
|
3290
|
-
baseUrl: env.PIDGEON_BASE_URL ?? DEFAULT_BASE_URL,
|
|
3291
|
-
auth: () => apiKey,
|
|
3292
|
-
// Ours by name, so an account made from a terminal reads as the CLI
|
|
3293
|
-
// rather than as the SDK it bundles (`src/lib/analytics/client.ts`).
|
|
3294
|
-
headers: { "User-Agent": "@pidgeon-ai/cli" }
|
|
3295
|
-
})
|
|
3296
|
-
);
|
|
3297
|
-
const call = dist_exports[command.operationId];
|
|
3298
|
-
if (typeof call !== "function") {
|
|
3299
|
-
throw new Error(`The SDK does not export \`${command.operationId}\`. Run \`pnpm sdk\`.`);
|
|
3300
|
-
}
|
|
3301
|
-
const retry = idempotencyKey ? ` It may have been sent: retry with --idempotency-key ${idempotencyKey} and it goes out at most once.` : "";
|
|
3302
|
-
let answer;
|
|
3303
|
-
try {
|
|
3304
|
-
answer = await call({
|
|
3305
|
-
...Object.keys(parsed.path).length > 0 ? { path: parsed.path } : {},
|
|
3306
|
-
...Object.keys(parsed.query).length > 0 ? { query: parsed.query } : {},
|
|
3307
|
-
...Object.keys(parsed.body).length > 0 ? { body: parsed.body } : {},
|
|
3308
|
-
...Object.keys(headers).length > 0 ? { headers } : {}
|
|
3309
|
-
});
|
|
3310
|
-
} catch (thrown) {
|
|
3311
|
-
const reason = thrown instanceof Error ? thrown.message : "The request failed.";
|
|
3312
|
-
throw new Error(`${reason}${retry ? `
|
|
3313
|
-
${retry.trim()}` : ""}`);
|
|
3314
|
-
}
|
|
3315
|
-
const { data, error, response } = answer;
|
|
3316
|
-
if (verbose && response.headers.get("Idempotent-Replay") === "true") {
|
|
3317
|
-
options.stderr?.("Idempotent-Replay: true \u2014 answered from the first send; nothing sent again.");
|
|
3318
|
-
}
|
|
3319
|
-
if (error !== void 0) {
|
|
3320
|
-
const detail = error?.error;
|
|
3321
|
-
const message = detail?.message ?? (typeof error === "string" && error ? error.slice(0, 500) : "The request failed.");
|
|
3322
|
-
throw new ApiError(
|
|
3323
|
-
response.status,
|
|
3324
|
-
detail?.code,
|
|
3325
|
-
response.status >= 500 ? message + retry : message
|
|
3326
|
-
);
|
|
3327
|
-
}
|
|
3328
|
-
return JSON.stringify(data, null, 2);
|
|
3329
|
-
}
|
|
3330
|
-
|
|
3331
|
-
export {
|
|
3332
|
-
UsageError2 as UsageError,
|
|
3333
|
-
ApiError,
|
|
3334
|
-
parse2 as parse,
|
|
3335
|
-
help,
|
|
3336
|
-
find,
|
|
3337
|
-
run
|
|
3338
|
-
};
|
|
3339
|
-
//# sourceMappingURL=chunk-M4R74E7X.js.map
|