@sendbird/cli 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +11 -0
- package/.codex-plugin/plugin.json +39 -0
- package/LICENSE +13 -0
- package/NOTICE.md +1105 -0
- package/PROVENANCE.md +15 -0
- package/README.md +44 -2
- package/dist/acl.d.ts +2 -0
- package/dist/acl.js +12 -0
- package/dist/acl.js.map +1 -0
- package/dist/billing-plan.d.ts +68 -0
- package/dist/billing-plan.js +235 -0
- package/dist/billing-plan.js.map +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +20 -0
- package/dist/browser.js.map +1 -0
- package/dist/calls-catalog.d.ts +79 -0
- package/dist/calls-catalog.js +322 -0
- package/dist/calls-catalog.js.map +1 -0
- package/dist/calls-credits.d.ts +31 -0
- package/dist/calls-credits.js +224 -0
- package/dist/calls-credits.js.map +1 -0
- package/dist/calls-trial.d.ts +45 -0
- package/dist/calls-trial.js +77 -0
- package/dist/calls-trial.js.map +1 -0
- package/dist/calls.d.ts +10 -0
- package/dist/calls.js +470 -0
- package/dist/calls.js.map +1 -0
- package/dist/catalog.d.ts +67 -0
- package/dist/catalog.js +784 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +502 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.d.ts +86 -0
- package/dist/core.js +531 -0
- package/dist/core.js.map +1 -0
- package/dist/diagnostics.d.ts +206 -0
- package/dist/diagnostics.js +664 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/discovery.d.ts +703 -0
- package/dist/discovery.js +846 -0
- package/dist/discovery.js.map +1 -0
- package/dist/docs.d.ts +31 -0
- package/dist/docs.js +139 -0
- package/dist/docs.js.map +1 -0
- package/dist/features.d.ts +131 -0
- package/dist/features.js +227 -0
- package/dist/features.js.map +1 -0
- package/dist/generated-api.d.ts +116 -0
- package/dist/generated-api.js +118 -0
- package/dist/generated-api.js.map +1 -0
- package/dist/human-format.d.ts +40 -0
- package/dist/human-format.js +205 -0
- package/dist/human-format.js.map +1 -0
- package/dist/human-list.d.ts +2 -0
- package/dist/human-list.js +368 -0
- package/dist/human-list.js.map +1 -0
- package/dist/human-output.d.ts +10 -0
- package/dist/human-output.js +1351 -0
- package/dist/human-output.js.map +1 -0
- package/dist/human-pro.d.ts +3 -0
- package/dist/human-pro.js +201 -0
- package/dist/human-pro.js.map +1 -0
- package/dist/human-progress.d.ts +5 -0
- package/dist/human-progress.js +49 -0
- package/dist/human-progress.js.map +1 -0
- package/dist/local.d.ts +42 -0
- package/dist/local.js +707 -0
- package/dist/local.js.map +1 -0
- package/dist/oauth-callback.d.ts +3 -0
- package/dist/oauth-callback.js +66 -0
- package/dist/oauth-callback.js.map +1 -0
- package/dist/oauth-lock.d.ts +6 -0
- package/dist/oauth-lock.js +212 -0
- package/dist/oauth-lock.js.map +1 -0
- package/dist/oauth.d.ts +32 -0
- package/dist/oauth.js +493 -0
- package/dist/oauth.js.map +1 -0
- package/dist/presentation.d.ts +208 -0
- package/dist/presentation.js +156 -0
- package/dist/presentation.js.map +1 -0
- package/dist/pro-api-catalog.d.ts +24 -0
- package/dist/pro-api-catalog.js +619 -0
- package/dist/pro-api-catalog.js.map +1 -0
- package/dist/pro-api.d.ts +10 -0
- package/dist/pro-api.js +338 -0
- package/dist/pro-api.js.map +1 -0
- package/dist/project.d.ts +34 -0
- package/dist/project.js +62 -0
- package/dist/project.js.map +1 -0
- package/dist/recovery.d.ts +41 -0
- package/dist/recovery.js +417 -0
- package/dist/recovery.js.map +1 -0
- package/dist/runner.d.ts +47 -0
- package/dist/runner.js +603 -0
- package/dist/runner.js.map +1 -0
- package/dist/sdk-catalog.d.ts +69 -0
- package/dist/sdk-catalog.js +527 -0
- package/dist/sdk-catalog.js.map +1 -0
- package/dist/sdk-config.d.ts +19 -0
- package/dist/sdk-config.js +85 -0
- package/dist/sdk-config.js.map +1 -0
- package/dist/sdk-dto.d.ts +244 -0
- package/dist/sdk-dto.js +98 -0
- package/dist/sdk-dto.js.map +1 -0
- package/dist/sdk-limits.d.ts +2 -0
- package/dist/sdk-limits.js +3 -0
- package/dist/sdk-limits.js.map +1 -0
- package/dist/sdk-node-file-reader.d.ts +6 -0
- package/dist/sdk-node-file-reader.js +38 -0
- package/dist/sdk-node-file-reader.js.map +1 -0
- package/dist/sdk-pro-catalog.d.ts +22 -0
- package/dist/sdk-pro-catalog.js +234 -0
- package/dist/sdk-pro-catalog.js.map +1 -0
- package/dist/sdk-pro-runtime.d.ts +31 -0
- package/dist/sdk-pro-runtime.js +293 -0
- package/dist/sdk-pro-runtime.js.map +1 -0
- package/dist/sdk-query.d.ts +10 -0
- package/dist/sdk-query.js +29 -0
- package/dist/sdk-query.js.map +1 -0
- package/dist/sdk-runtime.d.ts +15 -0
- package/dist/sdk-runtime.js +685 -0
- package/dist/sdk-runtime.js.map +1 -0
- package/dist/sdk-worker.d.ts +1 -0
- package/dist/sdk-worker.js +26 -0
- package/dist/sdk-worker.js.map +1 -0
- package/dist/sdk.d.ts +29 -0
- package/dist/sdk.js +346 -0
- package/dist/sdk.js.map +1 -0
- package/dist/search-engine.d.ts +17 -0
- package/dist/search-engine.js +54 -0
- package/dist/search-engine.js.map +1 -0
- package/dist/search-intents.d.ts +2 -0
- package/dist/search-intents.js +106 -0
- package/dist/search-intents.js.map +1 -0
- package/dist/search.d.ts +7 -0
- package/dist/search.js +58 -0
- package/dist/search.js.map +1 -0
- package/dist/secret-output.d.ts +2 -0
- package/dist/secret-output.js +108 -0
- package/dist/secret-output.js.map +1 -0
- package/dist/shell.d.ts +3 -0
- package/dist/shell.js +14 -0
- package/dist/shell.js.map +1 -0
- package/dist/skills.d.ts +210 -0
- package/dist/skills.js +374 -0
- package/dist/skills.js.map +1 -0
- package/dist/value-semantics.d.ts +70 -0
- package/dist/value-semantics.js +173 -0
- package/dist/value-semantics.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/windows.d.ts +4 -0
- package/dist/windows.js +136 -0
- package/dist/windows.js.map +1 -0
- package/dist/workflows.d.ts +228 -0
- package/dist/workflows.js +1207 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +90 -4
- package/plugin.json +25 -0
- package/references/agent-guide.json +199 -0
- package/references/commands.md +247 -0
- package/references/dashboard-inventory.json +14796 -0
- package/references/docs-index.json +5329 -0
- package/references/sdk-commands.json +15065 -0
- package/references/workflows.json +1246 -0
- package/skills/sendbird/SKILL.md +96 -0
- package/skills/sendbird/agents/openai.yaml +4 -0
- package/skills/sendbird/references/build-chat-app.md +50 -0
- package/skills/sendbird/references/client-guide.md +34 -0
- package/skills/sendbird/references/client-plugin-bridge.md +77 -0
- package/skills/sendbird/references/client-plugin-install.md +39 -0
- package/skills/sendbird/references/operational-checks.md +35 -0
- package/skills/sendbird/references/pro-capabilities.md +52 -0
- package/skills/sendbird/scripts/client-guide.mjs +283 -0
- package/skills/sendbird/scripts/client-plugin-bridge.mjs +703 -0
- package/skills/sendbird-setup/SKILL.md +18 -0
- package/skills/sendbird-setup/agents/openai.yaml +4 -0
- package/skills/sendbird-setup/references/onboarding.md +73 -0
- package/skills/sendbird-setup/scripts/install-cli.mjs +447 -0
- package/skills/sendbird-setup/scripts/npm-run.mjs +34 -0
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,784 @@
|
|
|
1
|
+
import { callsTrialFollowupSchema } from "./calls-credits.js";
|
|
2
|
+
import { proApiDefinitions } from "./pro-api-catalog.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { featureDefinitions } from "./features.js";
|
|
5
|
+
import { callsDefinitions } from "./calls-catalog.js";
|
|
6
|
+
import { billingHandoffSchema, billingVerificationSchema, } from "./billing-plan.js";
|
|
7
|
+
const text = z.string().min(1);
|
|
8
|
+
const optional = z.string().optional();
|
|
9
|
+
const bool = z.boolean().optional();
|
|
10
|
+
const metadata = z.record(z.string().min(1).max(128), z.string().max(190));
|
|
11
|
+
const page = {
|
|
12
|
+
limit: z.number().int().min(1).max(100).default(20),
|
|
13
|
+
token: optional,
|
|
14
|
+
};
|
|
15
|
+
const id = { id: text };
|
|
16
|
+
const type = z.enum(["open", "group", "supergroup"]);
|
|
17
|
+
const channel = { id: text, type };
|
|
18
|
+
const user = "app/core/api/users.ts";
|
|
19
|
+
const channels = "app/chat/api/channels.ts";
|
|
20
|
+
const application = "app/core/api/application.ts";
|
|
21
|
+
const settings = "app/core/api/settings.ts";
|
|
22
|
+
const auth = "app/common/api/authentication.ts";
|
|
23
|
+
const org = "app/common/api/organizations.ts";
|
|
24
|
+
const usage = "app/common/api/usage.ts";
|
|
25
|
+
const billing = "app/common/api/billing.ts";
|
|
26
|
+
const object = z.object({}).passthrough();
|
|
27
|
+
const userResponse = z.object({ user_id: z.string() }).passthrough();
|
|
28
|
+
const channelResponse = z.object({ channel_url: z.string() }).passthrough();
|
|
29
|
+
export const verifySchema = z
|
|
30
|
+
.object({
|
|
31
|
+
user: object.optional(),
|
|
32
|
+
organization: object.optional(),
|
|
33
|
+
organizations: z.array(object).optional(),
|
|
34
|
+
role: object.optional(),
|
|
35
|
+
})
|
|
36
|
+
.passthrough()
|
|
37
|
+
.refine((v) => v.user || v.organization || v.organizations, "Missing identity");
|
|
38
|
+
const defs = [...featureDefinitions, ...proApiDefinitions];
|
|
39
|
+
function add(d) {
|
|
40
|
+
defs.push(d);
|
|
41
|
+
}
|
|
42
|
+
add({
|
|
43
|
+
name: "org list",
|
|
44
|
+
description: "List organizations accessible to the current session",
|
|
45
|
+
method: "GET",
|
|
46
|
+
path: "/dashboard/auth/verify2/",
|
|
47
|
+
response: verifySchema,
|
|
48
|
+
source: [auth, "verifyAuth"],
|
|
49
|
+
});
|
|
50
|
+
add({
|
|
51
|
+
name: "org get",
|
|
52
|
+
description: "Get an organization",
|
|
53
|
+
method: "GET",
|
|
54
|
+
path: "/dashboard_api/organizations/{orgId}/",
|
|
55
|
+
scope: "org",
|
|
56
|
+
response: z.object({ uid: text }).passthrough(),
|
|
57
|
+
source: [org, "fetchOrganization"],
|
|
58
|
+
});
|
|
59
|
+
add({
|
|
60
|
+
name: "org create",
|
|
61
|
+
description: "Create an organization",
|
|
62
|
+
method: "POST",
|
|
63
|
+
path: "/dashboard_api/organizations/",
|
|
64
|
+
body: z
|
|
65
|
+
.object({ organization_name: z.string().trim().min(1), contact: optional })
|
|
66
|
+
.strict(),
|
|
67
|
+
response: z
|
|
68
|
+
.object({
|
|
69
|
+
organizations: z.array(z.object({ uid: text }).passthrough()).min(1),
|
|
70
|
+
})
|
|
71
|
+
.passthrough(),
|
|
72
|
+
source: [org, "createOrganization"],
|
|
73
|
+
example: { organization_name: "Chat demo" },
|
|
74
|
+
});
|
|
75
|
+
add({
|
|
76
|
+
name: "app list",
|
|
77
|
+
description: "List accessible applications (offset pagination)",
|
|
78
|
+
method: "GET",
|
|
79
|
+
path: "/dashboard/applications/",
|
|
80
|
+
query: z.object({
|
|
81
|
+
limit: page.limit,
|
|
82
|
+
offset: z.number().int().min(0).default(0),
|
|
83
|
+
app_name_or_app_id: optional,
|
|
84
|
+
}),
|
|
85
|
+
response: z
|
|
86
|
+
.object({
|
|
87
|
+
results: z.array(z.object({ app_id: text }).passthrough()),
|
|
88
|
+
next: z.string().nullable().optional(),
|
|
89
|
+
skipped_unavailable_applications: z
|
|
90
|
+
.number()
|
|
91
|
+
.int()
|
|
92
|
+
.nonnegative()
|
|
93
|
+
.optional(),
|
|
94
|
+
filter_note: z.string().optional(),
|
|
95
|
+
})
|
|
96
|
+
.passthrough(),
|
|
97
|
+
source: ["app/common/api/applications.ts", "fetchApplications"],
|
|
98
|
+
});
|
|
99
|
+
add({
|
|
100
|
+
name: "app get",
|
|
101
|
+
description: "Get application detail and authentication policy",
|
|
102
|
+
method: "GET",
|
|
103
|
+
path: "/dashboard/applications/{appId}/get_detail/",
|
|
104
|
+
scope: "app",
|
|
105
|
+
response: z
|
|
106
|
+
.object({
|
|
107
|
+
app_id: text,
|
|
108
|
+
guest_user_policy: z.number().optional(),
|
|
109
|
+
current_premium_features: z
|
|
110
|
+
.unknown()
|
|
111
|
+
.optional()
|
|
112
|
+
.describe("Dashboard plan snapshot. super_group_channel, reactions and poll are reported flags, not runtime authorization checks. False does not prove runtime denial, true does not prove runtime success, and missing values are unknown. Use doctor to inspect plan, activation and prerequisites separately."),
|
|
113
|
+
})
|
|
114
|
+
.passthrough(),
|
|
115
|
+
source: [application, "fetchApplicationGetDetail"],
|
|
116
|
+
});
|
|
117
|
+
add({
|
|
118
|
+
name: "app create",
|
|
119
|
+
description: "Create an application with optional Calls registration in an organization",
|
|
120
|
+
method: "POST",
|
|
121
|
+
path: "/dashboard/applications/",
|
|
122
|
+
scope: "org",
|
|
123
|
+
body: z
|
|
124
|
+
.object({
|
|
125
|
+
app_name: text,
|
|
126
|
+
region: text.optional(),
|
|
127
|
+
is_calls_enabled: z.boolean().default(false),
|
|
128
|
+
is_delight_region: z.boolean().default(false),
|
|
129
|
+
})
|
|
130
|
+
.strict(),
|
|
131
|
+
response: z.object({ application: object }).passthrough(),
|
|
132
|
+
resultSchema: z
|
|
133
|
+
.object({
|
|
134
|
+
application: object,
|
|
135
|
+
calls_trial: callsTrialFollowupSchema.optional(),
|
|
136
|
+
})
|
|
137
|
+
.passthrough(),
|
|
138
|
+
source: [application, "createApplication"],
|
|
139
|
+
defaults: {
|
|
140
|
+
is_desk_enabled: false,
|
|
141
|
+
},
|
|
142
|
+
example: { app_name: "Chat demo", region: "YOUR_REGION" },
|
|
143
|
+
});
|
|
144
|
+
add({
|
|
145
|
+
name: "app rename",
|
|
146
|
+
description: "Rename the selected application",
|
|
147
|
+
method: "PUT",
|
|
148
|
+
path: "/platform/dapi/settings/change_app_name/",
|
|
149
|
+
scope: "app",
|
|
150
|
+
body: z.object({ app_name: text }).strict(),
|
|
151
|
+
response: object,
|
|
152
|
+
source: [settings, "changeAppName"],
|
|
153
|
+
});
|
|
154
|
+
add({
|
|
155
|
+
name: "app auth-policy get",
|
|
156
|
+
description: "Read current guest/access-token policy from app detail",
|
|
157
|
+
method: "GET",
|
|
158
|
+
path: "/dashboard/applications/{appId}/get_detail/",
|
|
159
|
+
scope: "app",
|
|
160
|
+
response: z
|
|
161
|
+
.object({ app_id: text, guest_user_policy: z.number().optional() })
|
|
162
|
+
.passthrough(),
|
|
163
|
+
resultSchema: z
|
|
164
|
+
.object({
|
|
165
|
+
guest_user_policy: z.union([z.literal(0), z.literal(1), z.literal(2)]),
|
|
166
|
+
})
|
|
167
|
+
.strict(),
|
|
168
|
+
source: [application, "fetchApplicationGetDetail"],
|
|
169
|
+
});
|
|
170
|
+
add({
|
|
171
|
+
name: "app auth-policy set",
|
|
172
|
+
description: "Set the Dashboard guest_user_policy (0, 1 or 2)",
|
|
173
|
+
method: "PUT",
|
|
174
|
+
path: "/platform/dapi/settings/access_token_user_policy/",
|
|
175
|
+
scope: "app",
|
|
176
|
+
body: z
|
|
177
|
+
.object({
|
|
178
|
+
guest_user_policy: z.union([z.literal(0), z.literal(1), z.literal(2)]),
|
|
179
|
+
})
|
|
180
|
+
.strict(),
|
|
181
|
+
response: z
|
|
182
|
+
.object({
|
|
183
|
+
guest_user_policy: z.union([z.literal(0), z.literal(1), z.literal(2)]),
|
|
184
|
+
})
|
|
185
|
+
.passthrough(),
|
|
186
|
+
source: [settings, "updateAccessTokenUserPolicy"],
|
|
187
|
+
danger: true,
|
|
188
|
+
});
|
|
189
|
+
for (const name of ["list", "search"])
|
|
190
|
+
add({
|
|
191
|
+
name: `chat user ${name}`,
|
|
192
|
+
description: "List/search Chat users with bounded cursor pagination",
|
|
193
|
+
method: "GET",
|
|
194
|
+
path: "/platform/v3/users",
|
|
195
|
+
scope: "app",
|
|
196
|
+
query: z.object({
|
|
197
|
+
...page,
|
|
198
|
+
user_ids: optional,
|
|
199
|
+
nickname: optional,
|
|
200
|
+
nickname_startswith: optional,
|
|
201
|
+
active_mode: z.enum(["all", "activated", "deactivated"]).optional(),
|
|
202
|
+
}),
|
|
203
|
+
response: z
|
|
204
|
+
.object({ users: z.array(userResponse), next: z.string().optional() })
|
|
205
|
+
.passthrough(),
|
|
206
|
+
source: [user, name === "list" ? "fetchUsers" : "searchUsers"],
|
|
207
|
+
});
|
|
208
|
+
add({
|
|
209
|
+
name: "chat user get",
|
|
210
|
+
description: "Get a Chat user",
|
|
211
|
+
method: "GET",
|
|
212
|
+
path: "/platform/v3/users/{id}",
|
|
213
|
+
scope: "app",
|
|
214
|
+
params: z.object(id),
|
|
215
|
+
response: userResponse,
|
|
216
|
+
source: [user, "fetchUser"],
|
|
217
|
+
});
|
|
218
|
+
add({
|
|
219
|
+
name: "chat user create",
|
|
220
|
+
description: "Create a Chat user",
|
|
221
|
+
method: "POST",
|
|
222
|
+
path: "/platform/v3/users",
|
|
223
|
+
scope: "app",
|
|
224
|
+
multipart: true,
|
|
225
|
+
body: z
|
|
226
|
+
.object({
|
|
227
|
+
user_id: text,
|
|
228
|
+
nickname: text,
|
|
229
|
+
profile_url: z.string().default(""),
|
|
230
|
+
issue_access_token: bool,
|
|
231
|
+
})
|
|
232
|
+
.strict(),
|
|
233
|
+
response: userResponse,
|
|
234
|
+
source: [user, "createUser"],
|
|
235
|
+
example: { user_id: "alice", nickname: "Alice" },
|
|
236
|
+
});
|
|
237
|
+
add({
|
|
238
|
+
name: "chat user update",
|
|
239
|
+
description: "Update nickname or profile URL",
|
|
240
|
+
method: "PUT",
|
|
241
|
+
path: "/platform/v3/users/{id}",
|
|
242
|
+
scope: "app",
|
|
243
|
+
params: z.object(id),
|
|
244
|
+
multipart: true,
|
|
245
|
+
body: z.object({ nickname: optional, profile_url: optional }).strict(),
|
|
246
|
+
response: userResponse,
|
|
247
|
+
source: [user, "editUser"],
|
|
248
|
+
});
|
|
249
|
+
add({
|
|
250
|
+
name: "chat user delete",
|
|
251
|
+
description: "Delete a Chat user",
|
|
252
|
+
method: "DELETE",
|
|
253
|
+
path: "/platform/v3/users/{id}",
|
|
254
|
+
scope: "app",
|
|
255
|
+
params: z.object(id),
|
|
256
|
+
response: object.nullable(),
|
|
257
|
+
source: [user, "deleteUser"],
|
|
258
|
+
danger: true,
|
|
259
|
+
});
|
|
260
|
+
for (const action of ["activate", "deactivate"])
|
|
261
|
+
add({
|
|
262
|
+
name: `chat user ${action}`,
|
|
263
|
+
description: `${action} a Chat user`,
|
|
264
|
+
method: "PUT",
|
|
265
|
+
path: "/platform/dapi/users/{id}/moderations",
|
|
266
|
+
scope: "app",
|
|
267
|
+
params: z.object(id),
|
|
268
|
+
body: z
|
|
269
|
+
.object(action === "deactivate"
|
|
270
|
+
? { leave_all_when_deactivated: z.boolean().default(false) }
|
|
271
|
+
: {})
|
|
272
|
+
.strict(),
|
|
273
|
+
defaults: { is_active: action === "activate" },
|
|
274
|
+
response: object,
|
|
275
|
+
source: [user, action === "activate" ? "reactivateUser" : "deactivateUser"],
|
|
276
|
+
danger: action === "deactivate",
|
|
277
|
+
});
|
|
278
|
+
add({
|
|
279
|
+
name: "chat user token get",
|
|
280
|
+
description: "Read a user token into --secret-output",
|
|
281
|
+
method: "GET",
|
|
282
|
+
path: "/platform/v3/users/{id}",
|
|
283
|
+
scope: "app",
|
|
284
|
+
params: z.object(id),
|
|
285
|
+
query: z.object({ with_access_token: z.literal(true).default(true) }),
|
|
286
|
+
response: userResponse,
|
|
287
|
+
source: [user, "fetchUser"],
|
|
288
|
+
secret: true,
|
|
289
|
+
});
|
|
290
|
+
add({
|
|
291
|
+
name: "chat user token issue",
|
|
292
|
+
description: "Issue or replace a user access token",
|
|
293
|
+
method: "PUT",
|
|
294
|
+
path: "/platform/v3/users/{id}",
|
|
295
|
+
scope: "app",
|
|
296
|
+
params: z.object(id),
|
|
297
|
+
defaults: { issue_access_token: true },
|
|
298
|
+
multipart: true,
|
|
299
|
+
response: userResponse,
|
|
300
|
+
source: [user, "editUser"],
|
|
301
|
+
danger: true,
|
|
302
|
+
secret: true,
|
|
303
|
+
});
|
|
304
|
+
add({
|
|
305
|
+
name: "chat user metadata get",
|
|
306
|
+
description: "Get user metadata",
|
|
307
|
+
method: "GET",
|
|
308
|
+
path: "/platform/v3/users/{id}/metadata",
|
|
309
|
+
scope: "app",
|
|
310
|
+
params: z.object(id),
|
|
311
|
+
response: object,
|
|
312
|
+
source: [user, "fetchUserMetadata"],
|
|
313
|
+
});
|
|
314
|
+
add({
|
|
315
|
+
name: "chat user metadata set",
|
|
316
|
+
description: "Set user metadata",
|
|
317
|
+
method: "POST",
|
|
318
|
+
path: "/platform/v3/users/{id}/metadata",
|
|
319
|
+
scope: "app",
|
|
320
|
+
params: z.object(id),
|
|
321
|
+
body: z.object({ metadata }).strict(),
|
|
322
|
+
response: object,
|
|
323
|
+
source: [user, "postUserMetadata"],
|
|
324
|
+
});
|
|
325
|
+
add({
|
|
326
|
+
name: "chat user metadata delete",
|
|
327
|
+
description: "Delete all metadata of one user",
|
|
328
|
+
method: "DELETE",
|
|
329
|
+
path: "/platform/v3/users/{id}/metadata",
|
|
330
|
+
scope: "app",
|
|
331
|
+
params: z.object(id),
|
|
332
|
+
response: object.nullable(),
|
|
333
|
+
source: [user, "deleteUserMetadata"],
|
|
334
|
+
danger: true,
|
|
335
|
+
});
|
|
336
|
+
for (const action of ["list", "search"])
|
|
337
|
+
add({
|
|
338
|
+
name: `chat channel ${action}`,
|
|
339
|
+
description: "List/search Open, Group or Supergroup channels",
|
|
340
|
+
method: "GET",
|
|
341
|
+
path: "/platform/v3/{kind}",
|
|
342
|
+
scope: "app",
|
|
343
|
+
params: z.object({ type }),
|
|
344
|
+
query: z.object({
|
|
345
|
+
...page,
|
|
346
|
+
name_contains: optional,
|
|
347
|
+
url_contains: optional,
|
|
348
|
+
channel_urls: optional,
|
|
349
|
+
custom_types: optional,
|
|
350
|
+
show_empty: bool,
|
|
351
|
+
}),
|
|
352
|
+
response: z
|
|
353
|
+
.object({
|
|
354
|
+
channels: z.array(channelResponse),
|
|
355
|
+
next: z.string().optional(),
|
|
356
|
+
})
|
|
357
|
+
.passthrough(),
|
|
358
|
+
source: [channels, "fetchGroupChannels"],
|
|
359
|
+
});
|
|
360
|
+
add({
|
|
361
|
+
name: "chat channel get",
|
|
362
|
+
description: "Get a channel",
|
|
363
|
+
method: "GET",
|
|
364
|
+
path: "/platform/v3/{kind}/{id}",
|
|
365
|
+
scope: "app",
|
|
366
|
+
params: z.object(channel),
|
|
367
|
+
response: channelResponse,
|
|
368
|
+
source: [channels, "fetchGroupChannel"],
|
|
369
|
+
});
|
|
370
|
+
add({
|
|
371
|
+
name: "chat channel create",
|
|
372
|
+
description: "Create an Open, Group or Supergroup channel",
|
|
373
|
+
method: "POST",
|
|
374
|
+
path: "/platform/v3/{kind}",
|
|
375
|
+
scope: "app",
|
|
376
|
+
params: z.object({ type }),
|
|
377
|
+
// The CLI has no cover-file field here. Use typed JSON rather than the
|
|
378
|
+
// browser's FormData: the staging Platform proxy rejects fileless multipart.
|
|
379
|
+
multipart: false,
|
|
380
|
+
body: z
|
|
381
|
+
.object({
|
|
382
|
+
name: optional,
|
|
383
|
+
channel_url: optional,
|
|
384
|
+
cover_url: optional,
|
|
385
|
+
custom_type: optional,
|
|
386
|
+
user_ids: z.array(text).optional(),
|
|
387
|
+
is_distinct: bool,
|
|
388
|
+
is_public: bool,
|
|
389
|
+
data: optional,
|
|
390
|
+
})
|
|
391
|
+
.strict(),
|
|
392
|
+
response: channelResponse,
|
|
393
|
+
source: [channels, "createGroupChannel"],
|
|
394
|
+
example: { name: "Demo", user_ids: ["alice", "bob"] },
|
|
395
|
+
});
|
|
396
|
+
add({
|
|
397
|
+
name: "chat channel update",
|
|
398
|
+
description: "Update channel properties",
|
|
399
|
+
method: "PUT",
|
|
400
|
+
path: "/platform/v3/{kind}/{id}",
|
|
401
|
+
scope: "app",
|
|
402
|
+
params: z.object(channel),
|
|
403
|
+
// The CLI has no cover-file field here. Use typed JSON rather than the
|
|
404
|
+
// browser's FormData: the staging Platform proxy rejects fileless multipart.
|
|
405
|
+
multipart: false,
|
|
406
|
+
body: z
|
|
407
|
+
.object({ name: optional, custom_type: optional, data: optional })
|
|
408
|
+
.strict(),
|
|
409
|
+
response: channelResponse,
|
|
410
|
+
source: [channels, "editChannel"],
|
|
411
|
+
});
|
|
412
|
+
add({
|
|
413
|
+
name: "chat channel delete",
|
|
414
|
+
description: "Delete a channel",
|
|
415
|
+
method: "DELETE",
|
|
416
|
+
path: "/platform/v3/{kind}/{id}",
|
|
417
|
+
scope: "app",
|
|
418
|
+
params: z.object(channel),
|
|
419
|
+
response: object.nullable(),
|
|
420
|
+
source: [channels, "deleteChannel"],
|
|
421
|
+
danger: true,
|
|
422
|
+
});
|
|
423
|
+
add({
|
|
424
|
+
name: "chat channel metadata get",
|
|
425
|
+
description: "Read channel metadata",
|
|
426
|
+
method: "GET",
|
|
427
|
+
path: "/platform/v3/{kind}/{id}/metadata",
|
|
428
|
+
scope: "app",
|
|
429
|
+
params: z.object(channel),
|
|
430
|
+
response: object,
|
|
431
|
+
source: [channels, "fetchMetadata"],
|
|
432
|
+
});
|
|
433
|
+
add({
|
|
434
|
+
name: "chat channel metadata set",
|
|
435
|
+
description: "Upsert channel metadata",
|
|
436
|
+
method: "PUT",
|
|
437
|
+
path: "/platform/v3/{kind}/{id}/metadata",
|
|
438
|
+
scope: "app",
|
|
439
|
+
params: z.object(channel),
|
|
440
|
+
body: z.object({ metadata }).strict(),
|
|
441
|
+
response: object,
|
|
442
|
+
source: [channels, "setMetadata"],
|
|
443
|
+
defaults: { upsert: true },
|
|
444
|
+
});
|
|
445
|
+
add({
|
|
446
|
+
name: "chat channel metadata delete",
|
|
447
|
+
description: "Delete one channel metadata key",
|
|
448
|
+
method: "DELETE",
|
|
449
|
+
path: "/platform/v3/{kind}/{id}/metadata/{key}",
|
|
450
|
+
scope: "app",
|
|
451
|
+
params: z.object({ ...channel, key: text }),
|
|
452
|
+
response: object.nullable(),
|
|
453
|
+
source: [channels, "setMetadata"],
|
|
454
|
+
danger: true,
|
|
455
|
+
});
|
|
456
|
+
const groupChannel = z.object({
|
|
457
|
+
id: text,
|
|
458
|
+
type: z.enum(["group", "supergroup"]),
|
|
459
|
+
});
|
|
460
|
+
add({
|
|
461
|
+
name: "chat channel members list",
|
|
462
|
+
description: "List Group or Supergroup members",
|
|
463
|
+
method: "GET",
|
|
464
|
+
path: "/platform/v3/{kind}/{id}/members",
|
|
465
|
+
scope: "app",
|
|
466
|
+
params: groupChannel,
|
|
467
|
+
query: z.object(page),
|
|
468
|
+
response: z
|
|
469
|
+
.object({ members: z.array(object), next: z.string().optional() })
|
|
470
|
+
.passthrough(),
|
|
471
|
+
source: ["app/chat/api/channelModeration.ts", "fetchGroupChannelMembers"],
|
|
472
|
+
});
|
|
473
|
+
add({
|
|
474
|
+
name: "chat channel members invite",
|
|
475
|
+
description: "Invite users to a Group or Supergroup channel",
|
|
476
|
+
method: "POST",
|
|
477
|
+
path: "/platform/v3/{kind}/{id}/invite",
|
|
478
|
+
scope: "app",
|
|
479
|
+
params: groupChannel,
|
|
480
|
+
body: z.object({ user_ids: z.array(text).min(1) }).strict(),
|
|
481
|
+
response: channelResponse,
|
|
482
|
+
source: [channels, "inviteAsGroupChannelMember"],
|
|
483
|
+
});
|
|
484
|
+
add({
|
|
485
|
+
name: "support ticket submit",
|
|
486
|
+
description: "Submit a Chat technical support case",
|
|
487
|
+
method: "POST",
|
|
488
|
+
path: "/dashboard_api/sf_cases/",
|
|
489
|
+
scope: "app",
|
|
490
|
+
multipart: true,
|
|
491
|
+
body: z
|
|
492
|
+
.object({
|
|
493
|
+
Subject: text,
|
|
494
|
+
Description: text,
|
|
495
|
+
Development_Platform__c: z.enum([
|
|
496
|
+
"Platform API",
|
|
497
|
+
"JavaScript",
|
|
498
|
+
"Android",
|
|
499
|
+
"iOS",
|
|
500
|
+
".Net",
|
|
501
|
+
"Unity",
|
|
502
|
+
"Flutter",
|
|
503
|
+
"Unreal",
|
|
504
|
+
"Others",
|
|
505
|
+
]),
|
|
506
|
+
SDK_Version__c: optional,
|
|
507
|
+
Steps_to_Reproduce__c: optional,
|
|
508
|
+
Priority: z
|
|
509
|
+
.enum([
|
|
510
|
+
"P3: General Issue",
|
|
511
|
+
"P2: Moderate impact in Production with workarounds",
|
|
512
|
+
"P1: Key functionality impaired in Production: No workarounds",
|
|
513
|
+
])
|
|
514
|
+
.default("P3: General Issue"),
|
|
515
|
+
})
|
|
516
|
+
.strict(),
|
|
517
|
+
defaults: { Product__c: "Chat", Issue_Type__c: "Technical Issue" },
|
|
518
|
+
response: object.nullable(),
|
|
519
|
+
source: ["app/common/api/support.ts", "submitSupportForm"],
|
|
520
|
+
example: {
|
|
521
|
+
Subject: "Chat connection issue",
|
|
522
|
+
Description: "Describe the behavior",
|
|
523
|
+
Development_Platform__c: "JavaScript",
|
|
524
|
+
},
|
|
525
|
+
});
|
|
526
|
+
// Billing v2 subscriptions are scoped to the authenticated organization's
|
|
527
|
+
// session, not an org UID in the URL. runner.ts binds that session to --org-id.
|
|
528
|
+
add({
|
|
529
|
+
name: "billing plan current",
|
|
530
|
+
description: "Read current and scheduled Chat subscriptions for the selected organization",
|
|
531
|
+
method: "GET",
|
|
532
|
+
path: "/dashboard_api/billing/subscriptions/info/",
|
|
533
|
+
scope: "org",
|
|
534
|
+
query: z.object({ product: z.literal("CHAT").default("CHAT") }),
|
|
535
|
+
response: z
|
|
536
|
+
.object({
|
|
537
|
+
current_subscription: object.nullable(),
|
|
538
|
+
future_subscription: object.nullable(),
|
|
539
|
+
})
|
|
540
|
+
.passthrough(),
|
|
541
|
+
source: [billing, "fetchSubscriptionInfo"],
|
|
542
|
+
});
|
|
543
|
+
add({
|
|
544
|
+
name: "billing plan list",
|
|
545
|
+
description: "Read the organization's plan catalog (requires organization.general.all); entries are not eligibility or price quotes",
|
|
546
|
+
method: "GET",
|
|
547
|
+
path: "/dashboard_api/billing/plans/",
|
|
548
|
+
scope: "org",
|
|
549
|
+
query: z.object({}),
|
|
550
|
+
// Dashboard's type declaration says array, but its UI iterates keyed plan
|
|
551
|
+
// names via Object.entries(response.data). Validate the observed shape.
|
|
552
|
+
response: z.record(z.string(), z
|
|
553
|
+
.object({ plan: object, billing_cycle_months: z.number().optional() })
|
|
554
|
+
.passthrough()),
|
|
555
|
+
source: [billing, "fetchSubscriptionPlans"],
|
|
556
|
+
});
|
|
557
|
+
// BILL-02 composes GETs and prepares Dashboard handoff. No quote API means
|
|
558
|
+
// this alpha cannot safely present a subscription POST as a confirmed purchase.
|
|
559
|
+
for (const action of ["check", "change", "verify"]) {
|
|
560
|
+
add({
|
|
561
|
+
name: `billing plan ${action}`,
|
|
562
|
+
description: action === "check"
|
|
563
|
+
? "Check Chat plan selection, billing channel and payment readiness; not a quote"
|
|
564
|
+
: action === "change"
|
|
565
|
+
? "Prepare a confirmed Dashboard handoff for a Chat plan change; does not change billing"
|
|
566
|
+
: "Read whether the requested Chat plan is current, scheduled or not reflected",
|
|
567
|
+
method: "GET",
|
|
568
|
+
path: "/dashboard_api/billing/subscriptions/info/",
|
|
569
|
+
scope: "org",
|
|
570
|
+
danger: action === "change",
|
|
571
|
+
query: z
|
|
572
|
+
.object({
|
|
573
|
+
plan: z.string().regex(/^[a-z][a-z0-9_]{0,127}$/),
|
|
574
|
+
...(action === "change" ? { confirm_org_name: text } : {}),
|
|
575
|
+
})
|
|
576
|
+
.strict(),
|
|
577
|
+
response: action === "verify" ? billingVerificationSchema : billingHandoffSchema,
|
|
578
|
+
source: [billing, "fetchSubscriptionInfo"],
|
|
579
|
+
example: {
|
|
580
|
+
plan: "plan_a_5k",
|
|
581
|
+
...(action === "change"
|
|
582
|
+
? { confirm_org_name: "YOUR_ORGANIZATION_NAME" }
|
|
583
|
+
: {}),
|
|
584
|
+
},
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
add({
|
|
588
|
+
name: "usage chat org",
|
|
589
|
+
description: "Read monthly Chat feature usage for the selected organization",
|
|
590
|
+
method: "GET",
|
|
591
|
+
path: "/dashboard_api/organizations/{orgId}/monthly_usage/",
|
|
592
|
+
scope: "org",
|
|
593
|
+
query: z.object({
|
|
594
|
+
start_month: z.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/),
|
|
595
|
+
end_month: z.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/),
|
|
596
|
+
}),
|
|
597
|
+
response: z.object({ data: z.array(object) }).passthrough(),
|
|
598
|
+
source: [usage, "fetchOrganizationMonthlyUsage"],
|
|
599
|
+
});
|
|
600
|
+
add({
|
|
601
|
+
name: "usage chat app",
|
|
602
|
+
description: "Read one application's monthly Chat usage with organization context",
|
|
603
|
+
method: "GET",
|
|
604
|
+
path: "/dashboard_api/applications/{appId}/monthly_usage_with_org_usages/",
|
|
605
|
+
scope: "app",
|
|
606
|
+
query: z.object({
|
|
607
|
+
target_month: z.string().regex(/^\d{4}-(0[1-9]|1[0-2])$/),
|
|
608
|
+
}),
|
|
609
|
+
response: z.object({ data: object }).passthrough(),
|
|
610
|
+
source: [usage, "fetchApplicationMonthlyUsageWithOrgUsages"],
|
|
611
|
+
});
|
|
612
|
+
add({
|
|
613
|
+
name: "usage calls org",
|
|
614
|
+
description: "Read Calls and Live credit usage by application for the selected organization",
|
|
615
|
+
method: "GET",
|
|
616
|
+
path: "/dashboard_api/organizations/{orgId}/voice_video_usage",
|
|
617
|
+
scope: "org",
|
|
618
|
+
response: z
|
|
619
|
+
.object({
|
|
620
|
+
data: z.union([
|
|
621
|
+
z.array(z
|
|
622
|
+
.object({
|
|
623
|
+
app_id: z.string().min(1),
|
|
624
|
+
app_name: z.string(),
|
|
625
|
+
used_credit: z.number(),
|
|
626
|
+
usage: z.number(),
|
|
627
|
+
call_enabled: z.boolean(),
|
|
628
|
+
percentage: z.number(),
|
|
629
|
+
})
|
|
630
|
+
.passthrough()),
|
|
631
|
+
object,
|
|
632
|
+
]),
|
|
633
|
+
})
|
|
634
|
+
.passthrough(),
|
|
635
|
+
source: [billing, "fetchVoucherCreditUsageByAllApps"],
|
|
636
|
+
});
|
|
637
|
+
add({
|
|
638
|
+
name: "usage calls app",
|
|
639
|
+
description: "Read one application's Calls and Live credit usage and organization totals",
|
|
640
|
+
method: "GET",
|
|
641
|
+
path: "/dashboard_api/applications/{appId}/voice_video_usage_with_org_usages",
|
|
642
|
+
scope: "app",
|
|
643
|
+
response: z.object({ data: object }).passthrough(),
|
|
644
|
+
source: [billing, "fetchVoucherCreditUsageByApp"],
|
|
645
|
+
});
|
|
646
|
+
add({
|
|
647
|
+
name: "usage calls trend",
|
|
648
|
+
description: "Read daily or monthly Calls and Live credit usage trend for an organization",
|
|
649
|
+
method: "GET",
|
|
650
|
+
path: "/dashboard_api/organizations/{orgId}/voice_video_usage/{resolution}",
|
|
651
|
+
scope: "org",
|
|
652
|
+
params: z.object({ resolution: z.enum(["daily", "monthly"]) }),
|
|
653
|
+
query: z.object({ start: text, end: text }),
|
|
654
|
+
response: z
|
|
655
|
+
.object({
|
|
656
|
+
data: z
|
|
657
|
+
.object({
|
|
658
|
+
total: z.array(object),
|
|
659
|
+
calls: z.array(object),
|
|
660
|
+
live: z.array(object),
|
|
661
|
+
})
|
|
662
|
+
.passthrough(),
|
|
663
|
+
})
|
|
664
|
+
.passthrough(),
|
|
665
|
+
source: [billing, "fetchVoucherCreditUsageByRange"],
|
|
666
|
+
});
|
|
667
|
+
add({
|
|
668
|
+
name: "usage calls app-trend",
|
|
669
|
+
description: "Read an application's daily or monthly voice/video usage breakdown",
|
|
670
|
+
method: "GET",
|
|
671
|
+
path: "/dashboard_api/applications/{appId}/voice_video_usage/{resolution}",
|
|
672
|
+
scope: "app",
|
|
673
|
+
params: z.object({ resolution: z.enum(["daily", "monthly"]) }),
|
|
674
|
+
query: z.object({ start: text, end: text }),
|
|
675
|
+
response: z.object({ data: z.array(object) }).passthrough(),
|
|
676
|
+
source: [billing, "fetchVoucherCreditUsageByAppWithRange"],
|
|
677
|
+
});
|
|
678
|
+
export const definitions = [...defs, ...callsDefinitions];
|
|
679
|
+
export function jsonSchema(s) {
|
|
680
|
+
return s
|
|
681
|
+
? z.toJSONSchema(s, { unrepresentable: "any" })
|
|
682
|
+
: { type: "object", properties: {} };
|
|
683
|
+
}
|
|
684
|
+
export function describe(d) {
|
|
685
|
+
return {
|
|
686
|
+
command: `sendbird ${d.name}`,
|
|
687
|
+
description: d.description,
|
|
688
|
+
method: d.method,
|
|
689
|
+
path: d.path,
|
|
690
|
+
scope: d.scope,
|
|
691
|
+
...(d.requiresOrg ? { requires_org_context: true } : {}),
|
|
692
|
+
params: jsonSchema(d.params),
|
|
693
|
+
query: jsonSchema(d.query),
|
|
694
|
+
body: jsonSchema(d.body),
|
|
695
|
+
response: jsonSchema(d.resultSchema ?? d.response),
|
|
696
|
+
example: d.example ?? {},
|
|
697
|
+
dangerous: !!d.danger,
|
|
698
|
+
source: d.source,
|
|
699
|
+
...(d.privateFields?.length
|
|
700
|
+
? { private_input_fields: d.privateFields }
|
|
701
|
+
: {}),
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
function sample(schema) {
|
|
705
|
+
if ("default" in schema)
|
|
706
|
+
return schema.default;
|
|
707
|
+
if ("const" in schema)
|
|
708
|
+
return schema.const;
|
|
709
|
+
if (Array.isArray(schema.enum))
|
|
710
|
+
return schema.enum[0];
|
|
711
|
+
if (Array.isArray(schema.anyOf))
|
|
712
|
+
return sample(schema.anyOf[0]);
|
|
713
|
+
switch (schema.type) {
|
|
714
|
+
case "string":
|
|
715
|
+
return "example";
|
|
716
|
+
case "number":
|
|
717
|
+
case "integer":
|
|
718
|
+
return schema.minimum ?? 1;
|
|
719
|
+
case "boolean":
|
|
720
|
+
return false;
|
|
721
|
+
case "array":
|
|
722
|
+
return [sample(schema.items)];
|
|
723
|
+
case "object": {
|
|
724
|
+
const props = (schema.properties ?? {});
|
|
725
|
+
return Object.fromEntries(Object.entries(props)
|
|
726
|
+
.filter(([k, v]) => (schema.required ?? []).includes(k) ||
|
|
727
|
+
"default" in v)
|
|
728
|
+
.map(([k, v]) => [k, sample(v)]));
|
|
729
|
+
}
|
|
730
|
+
default:
|
|
731
|
+
return {};
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
export function exampleFor(d) {
|
|
735
|
+
const params = {
|
|
736
|
+
...sample(jsonSchema(d.params)),
|
|
737
|
+
...d.exampleParams,
|
|
738
|
+
};
|
|
739
|
+
if (d.name === "chat channel create")
|
|
740
|
+
params.type = "group";
|
|
741
|
+
const query = {
|
|
742
|
+
...sample(jsonSchema(d.query)),
|
|
743
|
+
...d.exampleQuery,
|
|
744
|
+
};
|
|
745
|
+
if (d.name === "usage chat org") {
|
|
746
|
+
query.start_month = "2026-10";
|
|
747
|
+
query.end_month = "2026-10";
|
|
748
|
+
}
|
|
749
|
+
if (d.name === "usage chat app")
|
|
750
|
+
query.target_month = "2026-10";
|
|
751
|
+
if (d.name === "usage calls trend" || d.name === "usage calls app-trend") {
|
|
752
|
+
query.start = "2026-10-01";
|
|
753
|
+
query.end = "2026-10-06";
|
|
754
|
+
}
|
|
755
|
+
const body = {
|
|
756
|
+
...sample(jsonSchema(d.body)),
|
|
757
|
+
...d.example,
|
|
758
|
+
};
|
|
759
|
+
if (d.name.endsWith(" update") && Object.keys(body).length === 0) {
|
|
760
|
+
const props = jsonSchema(d.body).properties;
|
|
761
|
+
const key = Object.keys(props)[0];
|
|
762
|
+
if (key)
|
|
763
|
+
body[key] = "Updated example";
|
|
764
|
+
}
|
|
765
|
+
if ("metadata" in body && Object.keys(body.metadata).length === 0)
|
|
766
|
+
body.metadata = { topic: "demo" };
|
|
767
|
+
return {
|
|
768
|
+
command: `sendbird ${d.name}`,
|
|
769
|
+
params,
|
|
770
|
+
query,
|
|
771
|
+
body,
|
|
772
|
+
context: d.scope === "app"
|
|
773
|
+
? {
|
|
774
|
+
"app-id": "APP_ID",
|
|
775
|
+
...(d.name === "app feature set" || d.requiresOrg
|
|
776
|
+
? { "org-id": "ORG_UID" }
|
|
777
|
+
: {}),
|
|
778
|
+
}
|
|
779
|
+
: d.scope === "org"
|
|
780
|
+
? { "org-id": "ORG_UID" }
|
|
781
|
+
: {},
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
//# sourceMappingURL=catalog.js.map
|