@tangle-network/hub-sdk 0.21.0-develop.20260812124314.b0147a8 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -6
- package/dist/index.d.ts +541 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +388 -218
- package/dist/index.js.map +1 -1
- package/package.json +8 -4
package/dist/index.js
CHANGED
|
@@ -1,7 +1,240 @@
|
|
|
1
1
|
import { SSEChunkParser } from "@tangle-network/sdk-telemetry";
|
|
2
|
+
//#region src/json-init.ts
|
|
3
|
+
/** The init of a request whose body is JSON. Every client builds its bodies
|
|
4
|
+
* here, so the content type cannot drift from the encoding. */
|
|
5
|
+
function jsonInit(method, body) {
|
|
6
|
+
return {
|
|
7
|
+
method,
|
|
8
|
+
body: JSON.stringify(body),
|
|
9
|
+
headers: { "Content-Type": "application/json" }
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/allowances.ts
|
|
14
|
+
var HubAllowancesClient = class {
|
|
15
|
+
constructor(request) {
|
|
16
|
+
this.request = request;
|
|
17
|
+
}
|
|
18
|
+
async plan(meter) {
|
|
19
|
+
return (await this.request(this.path(meter), { method: "GET" })).plan;
|
|
20
|
+
}
|
|
21
|
+
async setPlan(meter, plan) {
|
|
22
|
+
return (await this.request(this.path(meter), this.body("PUT", plan))).plan;
|
|
23
|
+
}
|
|
24
|
+
/** Admit one turn or refuse it. Retrying the same `turnId` never counts twice. */
|
|
25
|
+
async admit(meter, input) {
|
|
26
|
+
return (await this.request(`${this.path(meter)}/turns`, this.body("POST", input))).allowance;
|
|
27
|
+
}
|
|
28
|
+
/** What the member's next turn would get, without counting anything. */
|
|
29
|
+
async status(meter, subject) {
|
|
30
|
+
const query = new URLSearchParams();
|
|
31
|
+
if (subject.role) query.set("role", subject.role);
|
|
32
|
+
if (subject.payer) query.set("payer", subject.payer);
|
|
33
|
+
if (subject.payerRole) query.set("payerRole", subject.payerRole);
|
|
34
|
+
const suffix = query.size ? `?${query}` : "";
|
|
35
|
+
return (await this.request(`${this.memberPath(meter, subject.member)}${suffix}`, { method: "GET" })).allowance;
|
|
36
|
+
}
|
|
37
|
+
/** Move a member to the paid allowance until `expiresAt` (the paid period's end). */
|
|
38
|
+
async grant(meter, member, input) {
|
|
39
|
+
return (await this.request(`${this.memberPath(meter, member)}/grant`, this.body("PUT", {
|
|
40
|
+
tier: "paid",
|
|
41
|
+
...input
|
|
42
|
+
}))).grant;
|
|
43
|
+
}
|
|
44
|
+
/** Synchronize a paid grant by durable product revision. Null expiry writes
|
|
45
|
+
* a retained revocation. A delayed older update is refused, never reactivated.
|
|
46
|
+
* There is no fallback to the unversioned grant endpoint on older servers. */
|
|
47
|
+
async syncGrant(meter, member, input) {
|
|
48
|
+
const { grant } = await this.request(`${this.memberPath(meter, member)}/grant/sync`, this.body("PUT", input));
|
|
49
|
+
if (grant.member !== member || grant.source !== input.source || grant.revision !== input.revision || grant.reference !== input.reference || grant.expiresAt !== (input.expiresAt === null ? null : new Date(input.expiresAt).toISOString())) throw new Error("The Hub returned a mismatched grant synchronization receipt");
|
|
50
|
+
return grant;
|
|
51
|
+
}
|
|
52
|
+
async revoke(meter, member) {
|
|
53
|
+
await this.request(`${this.memberPath(meter, member)}/grant`, { method: "DELETE" });
|
|
54
|
+
}
|
|
55
|
+
/** Turns per member and per line on one UTC day (default today). */
|
|
56
|
+
async usage(meter, day) {
|
|
57
|
+
const suffix = day ? `?day=${encodeURIComponent(day)}` : "";
|
|
58
|
+
return (await this.request(`${this.path(meter)}/usage${suffix}`, { method: "GET" })).usage;
|
|
59
|
+
}
|
|
60
|
+
path(meter) {
|
|
61
|
+
return `/v1/hub/allowances/${encodeURIComponent(meter)}`;
|
|
62
|
+
}
|
|
63
|
+
memberPath(meter, member) {
|
|
64
|
+
return `${this.path(meter)}/members/${encodeURIComponent(member)}`;
|
|
65
|
+
}
|
|
66
|
+
body(method, body) {
|
|
67
|
+
return jsonInit(method, body);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/apps.ts
|
|
72
|
+
function encodedId(id) {
|
|
73
|
+
if (typeof id !== "string" || !id || id.length > 256 || id === "." || id === "..") throw new Error("A bounded app or grant id is required");
|
|
74
|
+
return encodeURIComponent(id);
|
|
75
|
+
}
|
|
76
|
+
var HubAppsClient = class {
|
|
77
|
+
grants;
|
|
78
|
+
constructor(request) {
|
|
79
|
+
this.request = request;
|
|
80
|
+
this.grants = {
|
|
81
|
+
list: () => this.request("/v1/me/app-grants", { method: "GET" }),
|
|
82
|
+
revoke: async (grantId) => this.request(`/v1/me/app-grants/${encodedId(grantId)}/revoke`, { method: "POST" })
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
list() {
|
|
86
|
+
return this.request("/v1/apps", { method: "GET" });
|
|
87
|
+
}
|
|
88
|
+
/** The secret is returned only by creation; keep it in your server vault. */
|
|
89
|
+
create(input) {
|
|
90
|
+
return this.request("/v1/apps", jsonInit("POST", input));
|
|
91
|
+
}
|
|
92
|
+
/** Immutable association of two existing records with the same owner. */
|
|
93
|
+
async linkOAuthClient(appId, clientId) {
|
|
94
|
+
return this.request(`/v1/apps/${encodedId(appId)}/oidc-client`, jsonInit("POST", { clientId }));
|
|
95
|
+
}
|
|
96
|
+
async revoke(appId) {
|
|
97
|
+
return this.request(`/v1/apps/${encodedId(appId)}/revoke`, { method: "POST" });
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
//#endregion
|
|
101
|
+
//#region src/inbound-webhooks.ts
|
|
102
|
+
var HubInboundWebhooksClient = class {
|
|
103
|
+
constructor(request) {
|
|
104
|
+
this.request = request;
|
|
105
|
+
}
|
|
106
|
+
async create(connectionId, options = {}) {
|
|
107
|
+
return this.request(this.path(connectionId), jsonInit("POST", options));
|
|
108
|
+
}
|
|
109
|
+
async get(connectionId) {
|
|
110
|
+
return this.request(this.path(connectionId), { method: "GET" });
|
|
111
|
+
}
|
|
112
|
+
/** Add one owned Linq WhatsApp number without rotating the webhook secret. */
|
|
113
|
+
async ensurePhoneNumber(connectionId, phoneNumberId) {
|
|
114
|
+
if (!phoneNumberId || phoneNumberId.length > 128 || !/^[\x21-\x7e]+$/.test(phoneNumberId)) throw new Error("A bounded phone-number id is required");
|
|
115
|
+
return this.request(`${this.path(connectionId)}/phone-numbers/ensure`, jsonInit("POST", { phoneNumberId }));
|
|
116
|
+
}
|
|
117
|
+
/** Remove event subscriptions first. This does not silently rotate a live URL. */
|
|
118
|
+
async delete(connectionId) {
|
|
119
|
+
return this.request(this.path(connectionId), { method: "DELETE" });
|
|
120
|
+
}
|
|
121
|
+
path(connectionId) {
|
|
122
|
+
if (!connectionId || connectionId.length > 256) throw new Error("A bounded connection id is required");
|
|
123
|
+
return `/v1/hub/connections/${encodeURIComponent(connectionId)}/inbound-webhook`;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
//#endregion
|
|
127
|
+
//#region src/lines.ts
|
|
128
|
+
/** Line calls share HubClient authentication and envelope handling. */
|
|
129
|
+
var HubLinesClient = class {
|
|
130
|
+
members;
|
|
131
|
+
checkins;
|
|
132
|
+
constructor(request, createWorkflow) {
|
|
133
|
+
this.request = request;
|
|
134
|
+
this.createWorkflow = createWorkflow;
|
|
135
|
+
this.members = { list: async (lineId) => (await this.request(`/v1/hub/lines/${encodeURIComponent(lineId)}/members`, { method: "GET" })).members };
|
|
136
|
+
this.checkins = { schedule: (cron, options) => {
|
|
137
|
+
const name = options.name ?? `line-checkin-${crypto.randomUUID().slice(0, 8)}`;
|
|
138
|
+
const yaml = [
|
|
139
|
+
`name: ${JSON.stringify(name)}`,
|
|
140
|
+
"on:",
|
|
141
|
+
` schedule: { cron: ${JSON.stringify(cron)}, timezone: ${JSON.stringify(options.timezone)} }`,
|
|
142
|
+
"do:",
|
|
143
|
+
" - agent.run:",
|
|
144
|
+
" line:",
|
|
145
|
+
` id: ${JSON.stringify(options.lineId)}`,
|
|
146
|
+
` member: ${JSON.stringify(options.member)}`,
|
|
147
|
+
` prompt: ${JSON.stringify(options.prompt)}`
|
|
148
|
+
].join("\n");
|
|
149
|
+
return this.createWorkflow(yaml);
|
|
150
|
+
} };
|
|
151
|
+
}
|
|
152
|
+
async scheduleSend(cron, options) {
|
|
153
|
+
const name = options.name ?? `line-send-${crypto.randomUUID().slice(0, 8)}`;
|
|
154
|
+
const yaml = [
|
|
155
|
+
`name: ${JSON.stringify(name)}`,
|
|
156
|
+
"on:",
|
|
157
|
+
` schedule: { cron: ${JSON.stringify(cron)}, timezone: ${JSON.stringify(options.timezone)} }`,
|
|
158
|
+
"do:",
|
|
159
|
+
" - line.send:",
|
|
160
|
+
` lineId: ${JSON.stringify(options.lineId)}`,
|
|
161
|
+
` memberId: ${JSON.stringify(options.memberId)}`,
|
|
162
|
+
` text: ${JSON.stringify(options.text)}`,
|
|
163
|
+
...options.notBefore ? [` notBefore: ${JSON.stringify(options.notBefore)}`] : []
|
|
164
|
+
].join("\n");
|
|
165
|
+
return this.createWorkflow(yaml);
|
|
166
|
+
}
|
|
167
|
+
async context() {
|
|
168
|
+
return this.request("/v1/hub/lines/context", { method: "GET" });
|
|
169
|
+
}
|
|
170
|
+
async send(lineId, input) {
|
|
171
|
+
return this.request(`/v1/hub/lines/${encodeURIComponent(lineId)}/send`, jsonInit("POST", input));
|
|
172
|
+
}
|
|
173
|
+
async remind(lineId, input) {
|
|
174
|
+
return this.request(`/v1/hub/lines/${encodeURIComponent(lineId)}/remind`, jsonInit("POST", input));
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
//#endregion
|
|
178
|
+
//#region src/managed-numbers.ts
|
|
179
|
+
/** Administrative number operations through Hub's authenticated transport.
|
|
180
|
+
* A mutation is one attempt; an uncertain create reuses its quote and reference. */
|
|
181
|
+
var HubManagedNumbersClient = class {
|
|
182
|
+
constructor(request) {
|
|
183
|
+
this.request = request;
|
|
184
|
+
}
|
|
185
|
+
readiness() {
|
|
186
|
+
return this.request("/v1/hub/numbers/readiness", { method: "GET" });
|
|
187
|
+
}
|
|
188
|
+
/** One page of orders. Scope by `clientReference` to ask about one binding,
|
|
189
|
+
* and follow `nextCursor` for the rest; a page is never ownership evidence. */
|
|
190
|
+
list(query = {}) {
|
|
191
|
+
const params = new URLSearchParams();
|
|
192
|
+
if (query.clientReference !== void 0) params.set("clientReference", query.clientReference);
|
|
193
|
+
if (query.cursor !== void 0) params.set("cursor", query.cursor);
|
|
194
|
+
if (query.limit !== void 0) params.set("limit", String(query.limit));
|
|
195
|
+
const search = params.toString();
|
|
196
|
+
return this.request(`/v1/hub/numbers${search ? `?${search}` : ""}`, { method: "GET" });
|
|
197
|
+
}
|
|
198
|
+
get(id) {
|
|
199
|
+
return this.request(this.path(id), { method: "GET" });
|
|
200
|
+
}
|
|
201
|
+
quote(input) {
|
|
202
|
+
return this.request("/v1/hub/numbers/quote", this.post(input));
|
|
203
|
+
}
|
|
204
|
+
/** `clientReference` and `transport`, when given, must match the signed
|
|
205
|
+
* quote or Hub refuses the purchase with a conflict. */
|
|
206
|
+
create(input) {
|
|
207
|
+
return this.request("/v1/hub/numbers", this.post(input));
|
|
208
|
+
}
|
|
209
|
+
/** Fences references so no order can take them again. Call it as the last
|
|
210
|
+
* step before retiring the resource they name: a purchase that races the
|
|
211
|
+
* retirement is then refused (`409 number_reference_fenced`) instead of
|
|
212
|
+
* binding a line to a resource that is gone. Refused with
|
|
213
|
+
* `409 number_reference_held` while a live order holds one of them; cancel
|
|
214
|
+
* it first. A cancelled order no longer holds its reference, so the fence
|
|
215
|
+
* succeeds as soon as `cancel` returns, whether or not its release is still
|
|
216
|
+
* pending. Repeating a fence is harmless. */
|
|
217
|
+
fence(input) {
|
|
218
|
+
return this.request("/v1/hub/numbers/fences", this.post(input));
|
|
219
|
+
}
|
|
220
|
+
advance(id) {
|
|
221
|
+
return this.request(`${this.path(id)}/advance`, this.post({}));
|
|
222
|
+
}
|
|
223
|
+
cancel(id) {
|
|
224
|
+
return this.request(`${this.path(id)}/cancel`, this.post({}));
|
|
225
|
+
}
|
|
226
|
+
path(id) {
|
|
227
|
+
if (!/^num_[a-f0-9]{36}$/.test(id)) throw new Error("Invalid managed number order id");
|
|
228
|
+
return `/v1/hub/numbers/${encodeURIComponent(id)}`;
|
|
229
|
+
}
|
|
230
|
+
post(body) {
|
|
231
|
+
return jsonInit("POST", body);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
//#endregion
|
|
2
235
|
//#region src/redaction.ts
|
|
3
236
|
const SECRET_KEY_PATTERN = /(api[_-]?key|authorization|capability[_-]?token|token|secret)/i;
|
|
4
|
-
const SECRET_VALUE_PATTERN = /\b(?:sk-tan[-_]|hubcap_|hct_|gh[pousr]_)[A-Za-z0-9_
|
|
237
|
+
const SECRET_VALUE_PATTERN = /\b(?:sk-tan[-_]|hubcap_|hct_|lrc_|gh[pousr]_)[A-Za-z0-9_.=-]+\b/g;
|
|
5
238
|
function redactHubValue(value) {
|
|
6
239
|
if (typeof value === "string") return value.replace(SECRET_VALUE_PATTERN, "[REDACTED]");
|
|
7
240
|
if (Array.isArray(value)) return value.map((item) => redactHubValue(item));
|
|
@@ -52,8 +285,10 @@ function isHubSuccessEnvelope(value) {
|
|
|
52
285
|
function isRecord$1(value) {
|
|
53
286
|
return typeof value === "object" && value !== null;
|
|
54
287
|
}
|
|
55
|
-
|
|
56
|
-
|
|
288
|
+
/** Read a wire field as a string, or "" when the server sent anything else.
|
|
289
|
+
* `raw` is that field straight off the parsed payload, before any check. */
|
|
290
|
+
function optString(raw) {
|
|
291
|
+
return typeof raw === "string" ? raw : "";
|
|
57
292
|
}
|
|
58
293
|
/** An agent iteration's terminal status (`iteration.ended`) — only ever
|
|
59
294
|
* succeeded/failed; an iteration is never guard-skipped. */
|
|
@@ -81,63 +316,63 @@ function isRunDoneStatus(value) {
|
|
|
81
316
|
* malformed `token` can never reach a consumer as `{ delta: undefined }`, and
|
|
82
317
|
* new server event kinds don't break older clients.
|
|
83
318
|
*/
|
|
84
|
-
function toRunStreamEvent(eventType,
|
|
319
|
+
function toRunStreamEvent(eventType, raw) {
|
|
85
320
|
if (eventType === "ping") return { type: "ping" };
|
|
86
|
-
if (!isRecord$1(
|
|
321
|
+
if (!isRecord$1(raw)) return null;
|
|
87
322
|
switch (eventType) {
|
|
88
|
-
case "snapshot": return typeof
|
|
323
|
+
case "snapshot": return typeof raw.id === "string" && typeof raw.workflowId === "string" && typeof raw.status === "string" && Array.isArray(raw.actionResults) ? {
|
|
89
324
|
type: "snapshot",
|
|
90
|
-
run:
|
|
325
|
+
run: raw
|
|
91
326
|
} : null;
|
|
92
|
-
case "token": return typeof
|
|
327
|
+
case "token": return typeof raw.delta === "string" && typeof raw.actionIndex === "number" ? {
|
|
93
328
|
type: "token",
|
|
94
|
-
actionIndex:
|
|
95
|
-
delta:
|
|
96
|
-
at: optString(
|
|
329
|
+
actionIndex: raw.actionIndex,
|
|
330
|
+
delta: raw.delta,
|
|
331
|
+
at: optString(raw.at)
|
|
97
332
|
} : null;
|
|
98
|
-
case "run.done": return isRunDoneStatus(
|
|
333
|
+
case "run.done": return isRunDoneStatus(raw.status) ? {
|
|
99
334
|
type: "run.done",
|
|
100
|
-
status:
|
|
101
|
-
error: typeof
|
|
102
|
-
...typeof
|
|
335
|
+
status: raw.status,
|
|
336
|
+
error: typeof raw.error === "string" ? raw.error : null,
|
|
337
|
+
...typeof raw.at === "string" ? { at: raw.at } : {}
|
|
103
338
|
} : null;
|
|
104
|
-
case "run.waiting": return typeof
|
|
339
|
+
case "run.waiting": return typeof raw.decisionId === "string" && raw.decisionId.length > 0 ? {
|
|
105
340
|
type: "run.waiting",
|
|
106
|
-
decisionId:
|
|
107
|
-
...typeof
|
|
341
|
+
decisionId: raw.decisionId,
|
|
342
|
+
...typeof raw.at === "string" ? { at: raw.at } : {}
|
|
108
343
|
} : null;
|
|
109
|
-
case "action.started": return typeof
|
|
344
|
+
case "action.started": return typeof raw.index === "number" && typeof raw.kind === "string" && typeof raw.at === "string" ? {
|
|
110
345
|
type: "action.started",
|
|
111
|
-
index:
|
|
112
|
-
kind:
|
|
113
|
-
at:
|
|
346
|
+
index: raw.index,
|
|
347
|
+
kind: raw.kind,
|
|
348
|
+
at: raw.at
|
|
114
349
|
} : null;
|
|
115
|
-
case "action.finished": return typeof
|
|
350
|
+
case "action.finished": return typeof raw.index === "number" && typeof raw.kind === "string" && isActionFinishedStatus(raw.status) && typeof raw.at === "string" ? {
|
|
116
351
|
type: "action.finished",
|
|
117
|
-
index:
|
|
118
|
-
kind:
|
|
119
|
-
status:
|
|
120
|
-
at:
|
|
121
|
-
...typeof
|
|
122
|
-
...typeof
|
|
352
|
+
index: raw.index,
|
|
353
|
+
kind: raw.kind,
|
|
354
|
+
status: raw.status,
|
|
355
|
+
at: raw.at,
|
|
356
|
+
...typeof raw.costUsd === "number" ? { costUsd: raw.costUsd } : {},
|
|
357
|
+
...typeof raw.error === "string" ? { error: raw.error } : {}
|
|
123
358
|
} : null;
|
|
124
|
-
case "iteration.started": return typeof
|
|
359
|
+
case "iteration.started": return typeof raw.actionIndex === "number" && typeof raw.iterationIndex === "number" && typeof raw.at === "string" ? {
|
|
125
360
|
type: "iteration.started",
|
|
126
|
-
actionIndex:
|
|
127
|
-
iterationIndex:
|
|
128
|
-
at:
|
|
129
|
-
...typeof
|
|
361
|
+
actionIndex: raw.actionIndex,
|
|
362
|
+
iterationIndex: raw.iterationIndex,
|
|
363
|
+
at: raw.at,
|
|
364
|
+
...typeof raw.model === "string" ? { model: raw.model } : {}
|
|
130
365
|
} : null;
|
|
131
|
-
case "iteration.ended": return typeof
|
|
366
|
+
case "iteration.ended": return typeof raw.actionIndex === "number" && typeof raw.iterationIndex === "number" && isIterationStatus(raw.status) && typeof raw.at === "string" ? {
|
|
132
367
|
type: "iteration.ended",
|
|
133
|
-
actionIndex:
|
|
134
|
-
iterationIndex:
|
|
135
|
-
status:
|
|
136
|
-
at:
|
|
137
|
-
...typeof
|
|
138
|
-
...typeof
|
|
139
|
-
...typeof
|
|
140
|
-
...typeof
|
|
368
|
+
actionIndex: raw.actionIndex,
|
|
369
|
+
iterationIndex: raw.iterationIndex,
|
|
370
|
+
status: raw.status,
|
|
371
|
+
at: raw.at,
|
|
372
|
+
...typeof raw.outputPreview === "string" ? { outputPreview: raw.outputPreview } : {},
|
|
373
|
+
...typeof raw.inputTokens === "number" ? { inputTokens: raw.inputTokens } : {},
|
|
374
|
+
...typeof raw.outputTokens === "number" ? { outputTokens: raw.outputTokens } : {},
|
|
375
|
+
...typeof raw.costUsd === "number" ? { costUsd: raw.costUsd } : {}
|
|
141
376
|
} : null;
|
|
142
377
|
default: return null;
|
|
143
378
|
}
|
|
@@ -145,8 +380,8 @@ function toRunStreamEvent(eventType, data) {
|
|
|
145
380
|
/** True for an aborted/timed-out fetch (or any abort). fetch rejects with the
|
|
146
381
|
* signal's reason — a DOMException named `AbortError` (caller) or `TimeoutError`
|
|
147
382
|
* (AbortSignal.timeout). */
|
|
148
|
-
function isAbortError(
|
|
149
|
-
return
|
|
383
|
+
function isAbortError(cause) {
|
|
384
|
+
return cause instanceof Error && (cause.name === "AbortError" || cause.name === "TimeoutError");
|
|
150
385
|
}
|
|
151
386
|
/** A signal that aborts when the caller's signal aborts OR `timeoutMs` elapses.
|
|
152
387
|
* Returns undefined when neither bound applies (no per-request abort needed). */
|
|
@@ -225,8 +460,11 @@ var HubClient = class HubClient {
|
|
|
225
460
|
fetch;
|
|
226
461
|
apiKey;
|
|
227
462
|
authHeaders;
|
|
463
|
+
allowances;
|
|
464
|
+
apps;
|
|
228
465
|
connections;
|
|
229
466
|
channels;
|
|
467
|
+
numbers;
|
|
230
468
|
eventSubscriptions;
|
|
231
469
|
permissions;
|
|
232
470
|
tokens;
|
|
@@ -235,11 +473,15 @@ var HubClient = class HubClient {
|
|
|
235
473
|
audit;
|
|
236
474
|
githubApp;
|
|
237
475
|
workflows;
|
|
476
|
+
lines;
|
|
238
477
|
constructor(options) {
|
|
239
478
|
this.baseUrl = options.baseUrl.replace(/\/+$/, "");
|
|
240
479
|
this.apiKey = options.apiKey;
|
|
241
480
|
this.authHeaders = options.authHeaders;
|
|
242
481
|
this.fetch = options.fetch ?? fetch.bind(globalThis);
|
|
482
|
+
this.allowances = new HubAllowancesClient((path, init) => this.request(path, init));
|
|
483
|
+
this.apps = new HubAppsClient((path, init) => this.request(path, init));
|
|
484
|
+
this.numbers = new HubManagedNumbersClient((path, init) => this.request(path, init));
|
|
243
485
|
this.connections = new HubConnectionsClient((path, init) => this.request(path, init));
|
|
244
486
|
this.channels = new HubChannelsClient((path, init) => this.request(path, init));
|
|
245
487
|
this.eventSubscriptions = new HubEventSubscriptionsClient((path, init) => this.request(path, init));
|
|
@@ -250,6 +492,7 @@ var HubClient = class HubClient {
|
|
|
250
492
|
this.audit = new HubAuditClient((path, init) => this.request(path, init));
|
|
251
493
|
this.githubApp = new HubGithubAppClient((path, init) => this.request(path, init));
|
|
252
494
|
this.workflows = new HubWorkflowsClient((path, init) => this.request(path, init), (path, init) => this.stream(path, init), (path, init) => this.requestBytes(path, init));
|
|
495
|
+
this.lines = new HubLinesClient((path, init) => this.request(path, init), (yaml) => this.workflows.create(yaml));
|
|
253
496
|
}
|
|
254
497
|
static fromEnv(options = {}) {
|
|
255
498
|
const env = options.env ?? readProcessEnv();
|
|
@@ -362,11 +605,7 @@ var HubTokensClient = class {
|
|
|
362
605
|
this.request = request;
|
|
363
606
|
}
|
|
364
607
|
async mint(options) {
|
|
365
|
-
return this.request("/v1/hub/tokens",
|
|
366
|
-
method: "POST",
|
|
367
|
-
body: JSON.stringify(options),
|
|
368
|
-
headers: { "Content-Type": "application/json" }
|
|
369
|
-
});
|
|
608
|
+
return this.request("/v1/hub/tokens", jsonInit("POST", options));
|
|
370
609
|
}
|
|
371
610
|
async list(options = {}) {
|
|
372
611
|
const searchParams = new URLSearchParams();
|
|
@@ -400,38 +639,22 @@ var HubPermissionsClient = class {
|
|
|
400
639
|
return this.request(`/v1/hub/policies?connectionId=${encodeURIComponent(connectionId)}`, { method: "GET" });
|
|
401
640
|
}
|
|
402
641
|
async set(input) {
|
|
403
|
-
return this.request("/v1/hub/policies",
|
|
404
|
-
method: "PUT",
|
|
405
|
-
body: JSON.stringify(input),
|
|
406
|
-
headers: { "Content-Type": "application/json" }
|
|
407
|
-
});
|
|
642
|
+
return this.request("/v1/hub/policies", jsonInit("PUT", input));
|
|
408
643
|
}
|
|
409
644
|
/** Reset an action to its default by deleting any stored override. */
|
|
410
645
|
async delete(input) {
|
|
411
|
-
return this.request("/v1/hub/policies",
|
|
412
|
-
method: "DELETE",
|
|
413
|
-
body: JSON.stringify(input),
|
|
414
|
-
headers: { "Content-Type": "application/json" }
|
|
415
|
-
});
|
|
646
|
+
return this.request("/v1/hub/policies", jsonInit("DELETE", input));
|
|
416
647
|
}
|
|
417
648
|
/** Bulk-allow every write action of a connection's provider. Reads are
|
|
418
649
|
* already allowed for sandbox agents; destructive actions stay `ask`.
|
|
419
650
|
* Idempotent: actions with an existing policy are left untouched. */
|
|
420
651
|
async allowWrites(connectionId) {
|
|
421
|
-
return this.request("/v1/hub/policies/allow-writes", {
|
|
422
|
-
method: "POST",
|
|
423
|
-
body: JSON.stringify({ connectionId }),
|
|
424
|
-
headers: { "Content-Type": "application/json" }
|
|
425
|
-
});
|
|
652
|
+
return this.request("/v1/hub/policies/allow-writes", jsonInit("POST", { connectionId }));
|
|
426
653
|
}
|
|
427
654
|
/** Inverse of `allowWrites`: delete only the rows it created for this
|
|
428
655
|
* connection. Manual per-action decisions are left intact. */
|
|
429
656
|
async revertWrites(connectionId) {
|
|
430
|
-
return this.request("/v1/hub/policies/revert-writes", {
|
|
431
|
-
method: "POST",
|
|
432
|
-
body: JSON.stringify({ connectionId }),
|
|
433
|
-
headers: { "Content-Type": "application/json" }
|
|
434
|
-
});
|
|
657
|
+
return this.request("/v1/hub/policies/revert-writes", jsonInit("POST", { connectionId }));
|
|
435
658
|
}
|
|
436
659
|
};
|
|
437
660
|
var HubToolsClient = class {
|
|
@@ -439,34 +662,32 @@ var HubToolsClient = class {
|
|
|
439
662
|
this.request = request;
|
|
440
663
|
}
|
|
441
664
|
async search(query, options = {}) {
|
|
442
|
-
return this.request("/v1/hub/tools/search", {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
limit: options.limit
|
|
448
|
-
}),
|
|
449
|
-
headers: { "Content-Type": "application/json" }
|
|
450
|
-
});
|
|
665
|
+
return this.request("/v1/hub/tools/search", jsonInit("POST", {
|
|
666
|
+
query,
|
|
667
|
+
provider: options.provider,
|
|
668
|
+
limit: options.limit
|
|
669
|
+
}));
|
|
451
670
|
}
|
|
452
671
|
async sources() {
|
|
453
672
|
return this.request("/v1/hub/tools/sources", { method: "GET" });
|
|
454
673
|
}
|
|
455
674
|
async describe(path) {
|
|
456
|
-
return this.request("/v1/hub/tools/describe", {
|
|
457
|
-
method: "POST",
|
|
458
|
-
body: JSON.stringify({ path }),
|
|
459
|
-
headers: { "Content-Type": "application/json" }
|
|
460
|
-
});
|
|
675
|
+
return this.request("/v1/hub/tools/describe", jsonInit("POST", { path }));
|
|
461
676
|
}
|
|
462
|
-
|
|
463
|
-
|
|
677
|
+
/**
|
|
678
|
+
* Run one hub tool. `raw` is the tool input: the SDK forwards it verbatim as
|
|
679
|
+
* the request body's `input`, and the server validates it against the tool's
|
|
680
|
+
* own schema, so the client never gives it a shape.
|
|
681
|
+
*/
|
|
682
|
+
async invoke(path, raw, options = {}) {
|
|
683
|
+
const execInit = this.buildExecInit(path, raw, options);
|
|
464
684
|
try {
|
|
465
685
|
return await this.request("/v1/hub/exec", execInit);
|
|
466
686
|
} catch (error) {
|
|
467
687
|
if (!(error instanceof HubSdkError) || !requiresCapabilityToken(error)) throw error;
|
|
688
|
+
const approvalId = getApprovalId(error);
|
|
689
|
+
if (approvalId && options.approve !== true) throw error;
|
|
468
690
|
if (options.approve) {
|
|
469
|
-
const approvalId = getApprovalId(error);
|
|
470
691
|
if (!approvalId) throw error;
|
|
471
692
|
const approved = await this.request(`/v1/hub/approvals/${encodeURIComponent(approvalId)}/approve`, { method: "POST" });
|
|
472
693
|
validateApprovedExecution(approved, path, options.connectionId);
|
|
@@ -484,15 +705,11 @@ var HubToolsClient = class {
|
|
|
484
705
|
});
|
|
485
706
|
}
|
|
486
707
|
}
|
|
487
|
-
const minted = await this.request("/v1/hub/tokens", {
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
provider: options.connectionId ? void 0 : path.split(".")[0]
|
|
493
|
-
}),
|
|
494
|
-
headers: { "Content-Type": "application/json" }
|
|
495
|
-
});
|
|
708
|
+
const minted = await this.request("/v1/hub/tokens", jsonInit("POST", {
|
|
709
|
+
actionPath: path,
|
|
710
|
+
connectionId: options.connectionId,
|
|
711
|
+
provider: options.connectionId ? void 0 : path.split(".")[0]
|
|
712
|
+
}));
|
|
496
713
|
return this.request("/v1/hub/exec", {
|
|
497
714
|
...execInit,
|
|
498
715
|
headers: {
|
|
@@ -501,16 +718,13 @@ var HubToolsClient = class {
|
|
|
501
718
|
}
|
|
502
719
|
});
|
|
503
720
|
}
|
|
504
|
-
buildExecInit(path,
|
|
505
|
-
return {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
}),
|
|
512
|
-
headers: { "Content-Type": "application/json" }
|
|
513
|
-
};
|
|
721
|
+
buildExecInit(path, raw, options) {
|
|
722
|
+
return jsonInit("POST", {
|
|
723
|
+
path,
|
|
724
|
+
input: raw,
|
|
725
|
+
connectionId: options.connectionId,
|
|
726
|
+
idempotencyKey: options.idempotencyKey
|
|
727
|
+
});
|
|
514
728
|
}
|
|
515
729
|
};
|
|
516
730
|
function requiresCapabilityToken(error) {
|
|
@@ -540,6 +754,17 @@ function validateApprovedExecution(approved, path, connectionId) {
|
|
|
540
754
|
}
|
|
541
755
|
});
|
|
542
756
|
}
|
|
757
|
+
const GITHUB_EXACT_CONNECT_SCOPES = [
|
|
758
|
+
"read:user",
|
|
759
|
+
"repo",
|
|
760
|
+
"read:org"
|
|
761
|
+
];
|
|
762
|
+
function sameOAuthScopeSet(left, right) {
|
|
763
|
+
if (!Array.isArray(left)) return false;
|
|
764
|
+
const leftSet = new Set(left);
|
|
765
|
+
const rightSet = new Set(right);
|
|
766
|
+
return leftSet.size === left.length && rightSet.size === right.length && leftSet.size === rightSet.size && [...leftSet].every((scope) => rightSet.has(scope));
|
|
767
|
+
}
|
|
543
768
|
var HubChannelsClient = class {
|
|
544
769
|
constructor(request) {
|
|
545
770
|
this.request = request;
|
|
@@ -548,11 +773,7 @@ var HubChannelsClient = class {
|
|
|
548
773
|
return this.request("/v1/hub/channels", { method: "GET" });
|
|
549
774
|
}
|
|
550
775
|
async createEmail(input = {}) {
|
|
551
|
-
return this.request("/v1/hub/channels/email",
|
|
552
|
-
method: "POST",
|
|
553
|
-
body: JSON.stringify(input),
|
|
554
|
-
headers: { "Content-Type": "application/json" }
|
|
555
|
-
});
|
|
776
|
+
return this.request("/v1/hub/channels/email", jsonInit("POST", input));
|
|
556
777
|
}
|
|
557
778
|
async delete(channelId) {
|
|
558
779
|
return this.request(`/v1/hub/channels/${encodeURIComponent(channelId)}`, { method: "DELETE" });
|
|
@@ -566,19 +787,17 @@ var HubEventSubscriptionsClient = class {
|
|
|
566
787
|
return this.request("/v1/hub/event-subscriptions", { method: "GET" });
|
|
567
788
|
}
|
|
568
789
|
async create(input) {
|
|
569
|
-
return this.request("/v1/hub/event-subscriptions",
|
|
570
|
-
method: "POST",
|
|
571
|
-
body: JSON.stringify(input),
|
|
572
|
-
headers: { "Content-Type": "application/json" }
|
|
573
|
-
});
|
|
790
|
+
return this.request("/v1/hub/event-subscriptions", jsonInit("POST", input));
|
|
574
791
|
}
|
|
575
792
|
async delete(subscriptionId) {
|
|
576
793
|
return this.request(`/v1/hub/event-subscriptions/${encodeURIComponent(subscriptionId)}`, { method: "DELETE" });
|
|
577
794
|
}
|
|
578
795
|
};
|
|
579
796
|
var HubConnectionsClient = class {
|
|
797
|
+
inboundWebhook;
|
|
580
798
|
constructor(request) {
|
|
581
799
|
this.request = request;
|
|
800
|
+
this.inboundWebhook = new HubInboundWebhooksClient(request);
|
|
582
801
|
}
|
|
583
802
|
async list() {
|
|
584
803
|
return this.request("/v1/hub/connections", { method: "GET" });
|
|
@@ -590,40 +809,38 @@ var HubConnectionsClient = class {
|
|
|
590
809
|
return this.request("/v1/hub/providers", { method: "GET" });
|
|
591
810
|
}
|
|
592
811
|
async start(provider, options = {}) {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
812
|
+
if (options.requestedScopes !== void 0 && (provider !== "github" || !sameOAuthScopeSet(options.requestedScopes, GITHUB_EXACT_CONNECT_SCOPES))) throw new HubSdkError({
|
|
813
|
+
code: "HUB_INVALID_INPUT",
|
|
814
|
+
message: "GitHub requestedScopes must be read:user, repo, and read:org"
|
|
815
|
+
});
|
|
816
|
+
const started = await this.request(`/v1/hub/connections/${encodeURIComponent(provider)}/start`, jsonInit("POST", {
|
|
817
|
+
returnUrl: options.returnUrl,
|
|
818
|
+
cli: options.cli,
|
|
819
|
+
connectionParameters: options.connectionParameters,
|
|
820
|
+
requestedScopes: options.requestedScopes
|
|
821
|
+
}));
|
|
822
|
+
if (options.requestedScopes !== void 0 && (started.provider !== provider || !sameOAuthScopeSet(started.scopes, options.requestedScopes))) throw new HubSdkError({
|
|
823
|
+
code: "HUB_CONFIG_MISSING",
|
|
824
|
+
message: "Hub did not preserve the requested OAuth scopes"
|
|
601
825
|
});
|
|
826
|
+
return started;
|
|
602
827
|
}
|
|
603
828
|
async startWhatsappEmbeddedSignup(options = {}) {
|
|
604
|
-
return this.request("/v1/hub/connections/whatsapp-business/embedded-signup/start", {
|
|
605
|
-
method: "POST",
|
|
606
|
-
body: JSON.stringify({ returnUrl: options.returnUrl }),
|
|
607
|
-
headers: { "Content-Type": "application/json" }
|
|
608
|
-
});
|
|
829
|
+
return this.request("/v1/hub/connections/whatsapp-business/embedded-signup/start", jsonInit("POST", { returnUrl: options.returnUrl }));
|
|
609
830
|
}
|
|
610
831
|
async completeWhatsappEmbeddedSignup(input) {
|
|
611
|
-
return this.request("/v1/hub/connections/whatsapp-business/embedded-signup/complete",
|
|
612
|
-
method: "POST",
|
|
613
|
-
body: JSON.stringify(input),
|
|
614
|
-
headers: { "Content-Type": "application/json" }
|
|
615
|
-
});
|
|
832
|
+
return this.request("/v1/hub/connections/whatsapp-business/embedded-signup/complete", jsonInit("POST", input));
|
|
616
833
|
}
|
|
617
834
|
/** Connect a non-OAuth (api-key) connector by submitting the user's key.
|
|
618
835
|
* The server validates the key with a live probe before persisting and
|
|
619
836
|
* returns the created (or reconnected) connection — there is no redirect,
|
|
620
|
-
* unlike `start`.
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
});
|
|
837
|
+
* unlike `start`. Cloudbeds requires propertyId metadata and PriceLabs
|
|
838
|
+
* requires listing ID/PMS pairs; other providers have no metadata. */
|
|
839
|
+
async connectApiKey(provider, apiKey, metadata) {
|
|
840
|
+
return this.request(`/v1/hub/connections/${encodeURIComponent(provider)}/connect-key`, jsonInit("POST", {
|
|
841
|
+
apiKey,
|
|
842
|
+
...metadata === void 0 ? {} : { metadata }
|
|
843
|
+
}));
|
|
627
844
|
}
|
|
628
845
|
async revoke(connectionId) {
|
|
629
846
|
return this.request(`/v1/hub/connections/${encodeURIComponent(connectionId)}`, { method: "DELETE" });
|
|
@@ -651,11 +868,7 @@ var HubGithubAppClient = class {
|
|
|
651
868
|
this.request = request;
|
|
652
869
|
}
|
|
653
870
|
async mintInstallationToken(input) {
|
|
654
|
-
return this.request("/v1/hub/github-app/mint-installation-token",
|
|
655
|
-
method: "POST",
|
|
656
|
-
body: JSON.stringify(input),
|
|
657
|
-
headers: { "Content-Type": "application/json" }
|
|
658
|
-
});
|
|
871
|
+
return this.request("/v1/hub/github-app/mint-installation-token", jsonInit("POST", input));
|
|
659
872
|
}
|
|
660
873
|
/** Every installation the caller may act through — their own and any org's
|
|
661
874
|
* they were verified against. The management surface's read. */
|
|
@@ -730,11 +943,7 @@ var HubWorkflowsClient = class {
|
|
|
730
943
|
return this.request(`/v1/workflows/${encodeURIComponent(id)}`, { method: "GET" });
|
|
731
944
|
}
|
|
732
945
|
async create(yaml) {
|
|
733
|
-
return this.request("/v1/workflows", {
|
|
734
|
-
method: "POST",
|
|
735
|
-
body: JSON.stringify({ yaml }),
|
|
736
|
-
headers: { "Content-Type": "application/json" }
|
|
737
|
-
});
|
|
946
|
+
return this.request("/v1/workflows", jsonInit("POST", { yaml }));
|
|
738
947
|
}
|
|
739
948
|
/**
|
|
740
949
|
* Replace the workflow's definition from YAML (recompiled server-side,
|
|
@@ -745,14 +954,10 @@ var HubWorkflowsClient = class {
|
|
|
745
954
|
* concurrent modification, `NOT_FOUND` for an unknown/foreign id.
|
|
746
955
|
*/
|
|
747
956
|
async update(id, yaml, opts = {}) {
|
|
748
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}`, {
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
...opts.note !== void 0 ? { note: opts.note } : {}
|
|
753
|
-
}),
|
|
754
|
-
headers: { "Content-Type": "application/json" }
|
|
755
|
-
});
|
|
957
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}`, jsonInit("PUT", {
|
|
958
|
+
yaml,
|
|
959
|
+
...opts.note !== void 0 ? { note: opts.note } : {}
|
|
960
|
+
}));
|
|
756
961
|
}
|
|
757
962
|
async delete(id) {
|
|
758
963
|
await this.request(`/v1/workflows/${encodeURIComponent(id)}`, { method: "DELETE" });
|
|
@@ -763,11 +968,7 @@ var HubWorkflowsClient = class {
|
|
|
763
968
|
* via `update`, but it can still be paused/resumed here).
|
|
764
969
|
*/
|
|
765
970
|
async setEnabled(id, enabled) {
|
|
766
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}`, {
|
|
767
|
-
method: "PATCH",
|
|
768
|
-
body: JSON.stringify({ enabled }),
|
|
769
|
-
headers: { "Content-Type": "application/json" }
|
|
770
|
-
});
|
|
971
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}`, jsonInit("PATCH", { enabled }));
|
|
771
972
|
}
|
|
772
973
|
/**
|
|
773
974
|
* One page of run history, newest first. Pass the previous page's
|
|
@@ -795,9 +996,7 @@ var HubWorkflowsClient = class {
|
|
|
795
996
|
async run(id, inputs, opts = {}) {
|
|
796
997
|
const hasInputs = inputs !== void 0 && Object.keys(inputs).length > 0;
|
|
797
998
|
return this.request(`/v1/workflows/${encodeURIComponent(id)}/run`, {
|
|
798
|
-
|
|
799
|
-
body: JSON.stringify(hasInputs ? { inputs } : {}),
|
|
800
|
-
headers: { "Content-Type": "application/json" },
|
|
999
|
+
...jsonInit("POST", hasInputs ? { inputs } : {}),
|
|
801
1000
|
...opts.signal ? { signal: opts.signal } : {}
|
|
802
1001
|
});
|
|
803
1002
|
}
|
|
@@ -976,11 +1175,7 @@ var HubWorkflowsClient = class {
|
|
|
976
1175
|
* YAML no longer compiles, `CONFLICT` on a concurrent modification.
|
|
977
1176
|
*/
|
|
978
1177
|
async rollback(id, rev) {
|
|
979
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}/rollback`, {
|
|
980
|
-
method: "POST",
|
|
981
|
-
body: JSON.stringify({ rev }),
|
|
982
|
-
headers: { "Content-Type": "application/json" }
|
|
983
|
-
});
|
|
1178
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}/rollback`, jsonInit("POST", { rev }));
|
|
984
1179
|
}
|
|
985
1180
|
/**
|
|
986
1181
|
* Deterministic health stats over the workflow's last N terminal runs
|
|
@@ -1001,11 +1196,7 @@ var HubWorkflowsClient = class {
|
|
|
1001
1196
|
* until an owner approves.
|
|
1002
1197
|
*/
|
|
1003
1198
|
async propose(id, input) {
|
|
1004
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}/proposals`,
|
|
1005
|
-
method: "POST",
|
|
1006
|
-
body: JSON.stringify(input),
|
|
1007
|
-
headers: { "Content-Type": "application/json" }
|
|
1008
|
-
});
|
|
1199
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}/proposals`, jsonInit("POST", input));
|
|
1009
1200
|
}
|
|
1010
1201
|
/**
|
|
1011
1202
|
* Pending (proposed) and declined (rejected) revisions, newest first, with
|
|
@@ -1032,11 +1223,7 @@ var HubWorkflowsClient = class {
|
|
|
1032
1223
|
* pending proposal.
|
|
1033
1224
|
*/
|
|
1034
1225
|
async rejectProposal(id, rev, opts = {}) {
|
|
1035
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}/proposals/${encodeURIComponent(String(rev))}/reject`, {
|
|
1036
|
-
method: "POST",
|
|
1037
|
-
body: JSON.stringify(opts.reason !== void 0 ? { reason: opts.reason } : {}),
|
|
1038
|
-
headers: { "Content-Type": "application/json" }
|
|
1039
|
-
});
|
|
1226
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}/proposals/${encodeURIComponent(String(rev))}/reject`, jsonInit("POST", opts.reason !== void 0 ? { reason: opts.reason } : {}));
|
|
1040
1227
|
}
|
|
1041
1228
|
/**
|
|
1042
1229
|
* Mint a fresh webhook hook token, retiring the current one immediately.
|
|
@@ -1112,29 +1299,24 @@ var HubWorkflowsClient = class {
|
|
|
1112
1299
|
/**
|
|
1113
1300
|
* Upsert a key; returns the entry with its NEW version (increments on every
|
|
1114
1301
|
* write). Throws `HubSdkError(KV_VALUE_TOO_LARGE)` past the 64KiB value cap
|
|
1115
|
-
* or `KV_KEY_LIMIT` past the per-workflow key cap.
|
|
1302
|
+
* or `KV_KEY_LIMIT` past the per-workflow key cap. `raw` is the caller's
|
|
1303
|
+
* value, stored and read back verbatim, so the client never gives it a shape.
|
|
1116
1304
|
*/
|
|
1117
|
-
async putKv(id, key,
|
|
1118
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}/kv/${encodeURIComponent(key)}`, {
|
|
1119
|
-
method: "PUT",
|
|
1120
|
-
body: JSON.stringify({ value }),
|
|
1121
|
-
headers: { "Content-Type": "application/json" }
|
|
1122
|
-
});
|
|
1305
|
+
async putKv(id, key, raw) {
|
|
1306
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}/kv/${encodeURIComponent(key)}`, jsonInit("PUT", { value: raw }));
|
|
1123
1307
|
}
|
|
1124
1308
|
/**
|
|
1125
1309
|
* Compare-and-swap: the write lands only when the stored version still
|
|
1126
1310
|
* equals `expectedVersion`; otherwise `HubSdkError(KV_VERSION_CONFLICT)`
|
|
1127
|
-
* (409) — re-read and retry. Creation is {@link putKv}'s job.
|
|
1311
|
+
* (409) — re-read and retry. Creation is {@link putKv}'s job. `raw` is the
|
|
1312
|
+
* caller's value, stored and read back verbatim, so the client never gives it
|
|
1313
|
+
* a shape.
|
|
1128
1314
|
*/
|
|
1129
|
-
async casKv(id, key, expectedVersion,
|
|
1130
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}/kv/${encodeURIComponent(key)}/cas`, {
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
value
|
|
1135
|
-
}),
|
|
1136
|
-
headers: { "Content-Type": "application/json" }
|
|
1137
|
-
});
|
|
1315
|
+
async casKv(id, key, expectedVersion, raw) {
|
|
1316
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}/kv/${encodeURIComponent(key)}/cas`, jsonInit("POST", {
|
|
1317
|
+
expectedVersion,
|
|
1318
|
+
value: raw
|
|
1319
|
+
}));
|
|
1138
1320
|
}
|
|
1139
1321
|
/** Delete a key; idempotent — `deleted` reports whether a row was removed. */
|
|
1140
1322
|
async deleteKv(id, key) {
|
|
@@ -1154,11 +1336,7 @@ var HubWorkflowsClient = class {
|
|
|
1154
1336
|
* (400); an unknown template id throws `NOT_FOUND`.
|
|
1155
1337
|
*/
|
|
1156
1338
|
async instantiateTemplate(templateId, parameters) {
|
|
1157
|
-
return this.request(`/v1/workflows/templates/${encodeURIComponent(templateId)}/instantiate`, {
|
|
1158
|
-
method: "POST",
|
|
1159
|
-
body: JSON.stringify(parameters ? { parameters } : {}),
|
|
1160
|
-
headers: { "Content-Type": "application/json" }
|
|
1161
|
-
});
|
|
1339
|
+
return this.request(`/v1/workflows/templates/${encodeURIComponent(templateId)}/instantiate`, jsonInit("POST", parameters ? { parameters } : {}));
|
|
1162
1340
|
}
|
|
1163
1341
|
/**
|
|
1164
1342
|
* The caller's open decisions across all workflows — the always-available
|
|
@@ -1185,11 +1363,7 @@ var HubWorkflowsClient = class {
|
|
|
1185
1363
|
* (409 — answered, timed out, or cancelled first).
|
|
1186
1364
|
*/
|
|
1187
1365
|
async resolveRunDecision(id, runId, input) {
|
|
1188
|
-
return this.request(`/v1/workflows/${encodeURIComponent(id)}/runs/${encodeURIComponent(runId)}/decision/resolve`,
|
|
1189
|
-
method: "POST",
|
|
1190
|
-
body: JSON.stringify(input),
|
|
1191
|
-
headers: { "Content-Type": "application/json" }
|
|
1192
|
-
});
|
|
1366
|
+
return this.request(`/v1/workflows/${encodeURIComponent(id)}/runs/${encodeURIComponent(runId)}/decision/resolve`, jsonInit("POST", input));
|
|
1193
1367
|
}
|
|
1194
1368
|
/**
|
|
1195
1369
|
* Dry-run a YAML definition against the platform compiler without saving it.
|
|
@@ -1202,14 +1376,10 @@ var HubWorkflowsClient = class {
|
|
|
1202
1376
|
* the unconnected providers is the point.
|
|
1203
1377
|
*/
|
|
1204
1378
|
async validate(yaml, opts = {}) {
|
|
1205
|
-
return this.request("/v1/workflows/validate", {
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
...opts.structural ? { structural: true } : {}
|
|
1210
|
-
}),
|
|
1211
|
-
headers: { "Content-Type": "application/json" }
|
|
1212
|
-
});
|
|
1379
|
+
return this.request("/v1/workflows/validate", jsonInit("POST", {
|
|
1380
|
+
yaml,
|
|
1381
|
+
...opts.structural ? { structural: true } : {}
|
|
1382
|
+
}));
|
|
1213
1383
|
}
|
|
1214
1384
|
async schema() {
|
|
1215
1385
|
return this.request("/v1/workflows/schema", { method: "GET" });
|
|
@@ -1473,6 +1643,6 @@ function requestFailure(code, status, error, headers) {
|
|
|
1473
1643
|
};
|
|
1474
1644
|
}
|
|
1475
1645
|
//#endregion
|
|
1476
|
-
export { HUB_API_KEY_ENV_VAR, HUB_CAPABILITY_TOKEN_ENV_VAR, HUB_URL_ENV_VAR, HubApprovalsClient, HubAuditClient, HubChannelsClient, HubClient, HubConnectionsClient, HubEventDeliveryError, HubEventSubscriptionsClient, HubGithubAppClient, HubPermissionsClient, HubSdkError, HubTokensClient, HubToolsClient, HubWorkflowsClient, authenticateHubEventRequest, deriveHubEventCallbackSecret, parseHubEventDelivery, redactHubValue, resolveHubAuth, resolveHubBaseUrl, verifyHubEventSignature };
|
|
1646
|
+
export { HUB_API_KEY_ENV_VAR, HUB_CAPABILITY_TOKEN_ENV_VAR, HUB_URL_ENV_VAR, HubAllowancesClient, HubApprovalsClient, HubAppsClient, HubAuditClient, HubChannelsClient, HubClient, HubConnectionsClient, HubEventDeliveryError, HubEventSubscriptionsClient, HubGithubAppClient, HubInboundWebhooksClient, HubLinesClient, HubManagedNumbersClient, HubPermissionsClient, HubSdkError, HubTokensClient, HubToolsClient, HubWorkflowsClient, authenticateHubEventRequest, deriveHubEventCallbackSecret, parseHubEventDelivery, redactHubValue, resolveHubAuth, resolveHubBaseUrl, verifyHubEventSignature };
|
|
1477
1647
|
|
|
1478
1648
|
//# sourceMappingURL=index.js.map
|