@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
|
@@ -0,0 +1,1246 @@
|
|
|
1
|
+
{
|
|
2
|
+
"workflows": [
|
|
3
|
+
{
|
|
4
|
+
"id": "recover-uncertain-change",
|
|
5
|
+
"title": "Inspect an uncertain change without repeating it",
|
|
6
|
+
"description": "Use the original error's recovery.target and recovery.reads. These are read-only examples, not a retry script or a proof of success.",
|
|
7
|
+
"requires": [
|
|
8
|
+
"The original environment, profile, app and actor; confirm the profile has not changed environment",
|
|
9
|
+
"Original request values retained privately for comparison; do not paste secrets into diagnostics"
|
|
10
|
+
],
|
|
11
|
+
"steps": [
|
|
12
|
+
{
|
|
13
|
+
"id": "context",
|
|
14
|
+
"argv": [
|
|
15
|
+
"sendbird",
|
|
16
|
+
"--profile",
|
|
17
|
+
"staging",
|
|
18
|
+
"profile",
|
|
19
|
+
"list"
|
|
20
|
+
],
|
|
21
|
+
"effect": "local-read",
|
|
22
|
+
"verify": "Compare the original recovery.target environment/profile with the current configuration before reading."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "exact-resource",
|
|
26
|
+
"argv": [
|
|
27
|
+
"sendbird",
|
|
28
|
+
"--profile",
|
|
29
|
+
"staging",
|
|
30
|
+
"--app-id",
|
|
31
|
+
"APP_ID",
|
|
32
|
+
"chat",
|
|
33
|
+
"user",
|
|
34
|
+
"get",
|
|
35
|
+
"--id",
|
|
36
|
+
"USER_ID",
|
|
37
|
+
"--json"
|
|
38
|
+
],
|
|
39
|
+
"effect": "read",
|
|
40
|
+
"verify": "Use the exact command from recovery.reads when supplied. Compare requested fields privately, including false/empty values. A current match does not establish causality."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "message-without-id",
|
|
44
|
+
"argv": [
|
|
45
|
+
"sendbird",
|
|
46
|
+
"--profile",
|
|
47
|
+
"staging",
|
|
48
|
+
"--app-id",
|
|
49
|
+
"APP_ID",
|
|
50
|
+
"chat",
|
|
51
|
+
"message",
|
|
52
|
+
"list",
|
|
53
|
+
"--type",
|
|
54
|
+
"group",
|
|
55
|
+
"--id",
|
|
56
|
+
"CHANNEL_URL",
|
|
57
|
+
"--as-user",
|
|
58
|
+
"USER_ID",
|
|
59
|
+
"--limit",
|
|
60
|
+
"100",
|
|
61
|
+
"--json"
|
|
62
|
+
],
|
|
63
|
+
"effect": "sdk-read",
|
|
64
|
+
"verify": "Only for a lost send acknowledgement. Check sender/time/content and history cursors. Absence or identical content does not justify sending again."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "calls-readback",
|
|
68
|
+
"argv": [
|
|
69
|
+
"sendbird",
|
|
70
|
+
"--profile",
|
|
71
|
+
"staging",
|
|
72
|
+
"--app-id",
|
|
73
|
+
"APP_ID",
|
|
74
|
+
"calls",
|
|
75
|
+
"settings",
|
|
76
|
+
"general",
|
|
77
|
+
"get",
|
|
78
|
+
"--json"
|
|
79
|
+
],
|
|
80
|
+
"effect": "read",
|
|
81
|
+
"verify": "Only for Calls General. Acknowledged writes with unavailable readback remain accepted; use readback.next rather than repeating the update."
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "chat-plan-change",
|
|
87
|
+
"title": "Prepare a Chat plan change and verify Dashboard results",
|
|
88
|
+
"description": "CLI reads policy and prepares handoff; the person confirms the final price and effective date in Dashboard. No billing mutation is sent by the CLI.",
|
|
89
|
+
"requires": [
|
|
90
|
+
"The intended organization and organization.general.all for check/handoff",
|
|
91
|
+
"Explicit customer approval before any paid change in Dashboard"
|
|
92
|
+
],
|
|
93
|
+
"steps": [
|
|
94
|
+
{
|
|
95
|
+
"id": "check",
|
|
96
|
+
"argv": [
|
|
97
|
+
"sendbird",
|
|
98
|
+
"--org-id",
|
|
99
|
+
"ORG_UID",
|
|
100
|
+
"billing",
|
|
101
|
+
"plan",
|
|
102
|
+
"check",
|
|
103
|
+
"--plan",
|
|
104
|
+
"PLAN_NAME"
|
|
105
|
+
],
|
|
106
|
+
"effect": "read",
|
|
107
|
+
"verify": "Inspect current/scheduled plans and channel reasons. Candidate is not eligibility or a quote."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "handoff",
|
|
111
|
+
"argv": [
|
|
112
|
+
"sendbird",
|
|
113
|
+
"--org-id",
|
|
114
|
+
"ORG_UID",
|
|
115
|
+
"billing",
|
|
116
|
+
"plan",
|
|
117
|
+
"change",
|
|
118
|
+
"--plan",
|
|
119
|
+
"PLAN_NAME",
|
|
120
|
+
"--confirm-org-name",
|
|
121
|
+
"EXACT_ORG_NAME",
|
|
122
|
+
"--yes"
|
|
123
|
+
],
|
|
124
|
+
"effect": "read",
|
|
125
|
+
"verify": "No mutation is sent. The person opens the returned Dashboard URL, checks the organization, final price and effective date and confirms there."
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"id": "verify",
|
|
129
|
+
"argv": [
|
|
130
|
+
"sendbird",
|
|
131
|
+
"--org-id",
|
|
132
|
+
"ORG_UID",
|
|
133
|
+
"billing",
|
|
134
|
+
"plan",
|
|
135
|
+
"verify",
|
|
136
|
+
"--plan",
|
|
137
|
+
"PLAN_NAME"
|
|
138
|
+
],
|
|
139
|
+
"effect": "read",
|
|
140
|
+
"verify": "Current or scheduled is an observed server state; not_reflected means no matching subscription was found. Do not retry a payment without checking Dashboard."
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "new-account-chat",
|
|
146
|
+
"title": "Create an account, organization and Chat application",
|
|
147
|
+
"description": "The CLI runs the entire setup. The person must accept Sendbird terms and obtain the emailed verification link.",
|
|
148
|
+
"requires": [
|
|
149
|
+
"A browser where the person can complete Dashboard signup and OAuth approval",
|
|
150
|
+
"Access to the account's verification email"
|
|
151
|
+
],
|
|
152
|
+
"steps": [
|
|
153
|
+
{
|
|
154
|
+
"id": "signup",
|
|
155
|
+
"argv": [
|
|
156
|
+
"sendbird",
|
|
157
|
+
"--profile",
|
|
158
|
+
"staging",
|
|
159
|
+
"auth",
|
|
160
|
+
"signup"
|
|
161
|
+
],
|
|
162
|
+
"effect": "remote-mutation",
|
|
163
|
+
"verify": "The person completes signup and consent in Dashboard. Gate redirects through OAuth to the local CLI callback. Confirm authenticated=true and the expected user; do not retry uncertain signup without checking the account."
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "email",
|
|
167
|
+
"argv": [
|
|
168
|
+
"sendbird",
|
|
169
|
+
"--profile",
|
|
170
|
+
"PROFILE",
|
|
171
|
+
"auth",
|
|
172
|
+
"verify-email",
|
|
173
|
+
"--token-file",
|
|
174
|
+
"PRIVATE_EMAIL_LINK_FILE"
|
|
175
|
+
],
|
|
176
|
+
"effect": "remote-mutation",
|
|
177
|
+
"verify": "After the user receives the email, store its link in a private file. Confirm email_verified=true without printing the token."
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"id": "organization",
|
|
181
|
+
"argv": [
|
|
182
|
+
"sendbird",
|
|
183
|
+
"--profile",
|
|
184
|
+
"PROFILE",
|
|
185
|
+
"org",
|
|
186
|
+
"create",
|
|
187
|
+
"--organization-name",
|
|
188
|
+
"ORG_NAME"
|
|
189
|
+
],
|
|
190
|
+
"effect": "remote-mutation",
|
|
191
|
+
"verify": "Save result.organizations[0].uid; one account can create only one organization."
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"id": "select-org",
|
|
195
|
+
"argv": [
|
|
196
|
+
"sendbird",
|
|
197
|
+
"--profile",
|
|
198
|
+
"PROFILE",
|
|
199
|
+
"org",
|
|
200
|
+
"use",
|
|
201
|
+
"--id",
|
|
202
|
+
"ORG_UID"
|
|
203
|
+
],
|
|
204
|
+
"effect": "remote-read",
|
|
205
|
+
"verify": "The selected organization ID matches the new organization."
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "regions",
|
|
209
|
+
"argv": [
|
|
210
|
+
"sendbird",
|
|
211
|
+
"--profile",
|
|
212
|
+
"PROFILE",
|
|
213
|
+
"org",
|
|
214
|
+
"region",
|
|
215
|
+
"list"
|
|
216
|
+
],
|
|
217
|
+
"effect": "remote-read",
|
|
218
|
+
"verify": "Choose a region with available=true; this selects location, not an entitlement change."
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "select-region",
|
|
222
|
+
"argv": [
|
|
223
|
+
"sendbird",
|
|
224
|
+
"--profile",
|
|
225
|
+
"PROFILE",
|
|
226
|
+
"org",
|
|
227
|
+
"region",
|
|
228
|
+
"use",
|
|
229
|
+
"--id",
|
|
230
|
+
"REGION"
|
|
231
|
+
],
|
|
232
|
+
"effect": "remote-read",
|
|
233
|
+
"verify": "Read back the selected Chat region before creating the app."
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"id": "application",
|
|
237
|
+
"argv": [
|
|
238
|
+
"sendbird",
|
|
239
|
+
"--profile",
|
|
240
|
+
"PROFILE",
|
|
241
|
+
"app",
|
|
242
|
+
"create",
|
|
243
|
+
"--app-name",
|
|
244
|
+
"APP_NAME"
|
|
245
|
+
],
|
|
246
|
+
"effect": "remote-mutation",
|
|
247
|
+
"verify": "Save result.application.app_id and re-read app detail."
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"id": "select-app",
|
|
251
|
+
"argv": [
|
|
252
|
+
"sendbird",
|
|
253
|
+
"--profile",
|
|
254
|
+
"PROFILE",
|
|
255
|
+
"app",
|
|
256
|
+
"use",
|
|
257
|
+
"--id",
|
|
258
|
+
"APP_ID"
|
|
259
|
+
],
|
|
260
|
+
"effect": "remote-read",
|
|
261
|
+
"verify": "Confirm the selected app belongs to the selected organization."
|
|
262
|
+
}
|
|
263
|
+
]
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"id": "staging-sdk",
|
|
267
|
+
"title": "Connect an existing Chat user in staging",
|
|
268
|
+
"description": "Connect with automatic standard/Delight region discovery without copying Dashboard credentials into the SDK.",
|
|
269
|
+
"requires": [
|
|
270
|
+
"A selected staging profile and app",
|
|
271
|
+
"A Chat user ID and CLI OAuth permission to manage users"
|
|
272
|
+
],
|
|
273
|
+
"steps": [
|
|
274
|
+
{
|
|
275
|
+
"id": "profile",
|
|
276
|
+
"argv": [
|
|
277
|
+
"sendbird",
|
|
278
|
+
"profile",
|
|
279
|
+
"list"
|
|
280
|
+
],
|
|
281
|
+
"effect": "local-read",
|
|
282
|
+
"verify": "Choose the intended profile; do not silently switch to production."
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"id": "connect",
|
|
286
|
+
"argv": [
|
|
287
|
+
"sendbird",
|
|
288
|
+
"--profile",
|
|
289
|
+
"PROFILE",
|
|
290
|
+
"--app-id",
|
|
291
|
+
"APP_ID",
|
|
292
|
+
"chat",
|
|
293
|
+
"sdk",
|
|
294
|
+
"status",
|
|
295
|
+
"--as-user",
|
|
296
|
+
"USER_ID"
|
|
297
|
+
],
|
|
298
|
+
"effect": "sdk-connect",
|
|
299
|
+
"verify": "The CLI discovers the selected app's region route. Confirm connected=true and matching user.user_id; this does not prove channel access or delivery."
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"id": "config",
|
|
303
|
+
"argv": [
|
|
304
|
+
"sendbird",
|
|
305
|
+
"--profile",
|
|
306
|
+
"PROFILE",
|
|
307
|
+
"--app-id",
|
|
308
|
+
"APP_ID",
|
|
309
|
+
"app",
|
|
310
|
+
"sdk-config",
|
|
311
|
+
"--raw"
|
|
312
|
+
],
|
|
313
|
+
"effect": "remote-read",
|
|
314
|
+
"when": "Only if an explicit reusable endpoint file is wanted",
|
|
315
|
+
"save_stdout_to": "SDK_CONFIG_FILE",
|
|
316
|
+
"verify": "app_id and environment must match the target. Region family is derived from is_delight_region."
|
|
317
|
+
}
|
|
318
|
+
]
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"id": "first-message",
|
|
322
|
+
"title": "Send and verify a channel message",
|
|
323
|
+
"description": "Use an existing authorized channel. Watch readiness, acknowledgement and receipt are separate checkpoints.",
|
|
324
|
+
"requires": [
|
|
325
|
+
"Target profile/app/channel type/channel URL",
|
|
326
|
+
"Sender Chat user ID with an existing access token readable through CLI OAuth for the selected environment, or an explicit private token file",
|
|
327
|
+
"Receiver Chat user identity and SDK authentication only when verifying recipient delivery",
|
|
328
|
+
"CLI OAuth for automatic region discovery in the selected environment, or an explicit SDK endpoint override"
|
|
329
|
+
],
|
|
330
|
+
"sdk_context": {
|
|
331
|
+
"when_profile_environment": "staging; production when using CLI OAuth",
|
|
332
|
+
"automatic": "Discover the selected app's SDK hosts on actual execution",
|
|
333
|
+
"optional_overrides": [
|
|
334
|
+
"--sdk-config-file SDK_CONFIG_FILE",
|
|
335
|
+
"--sdk-api-host HTTPS_ORIGIN --sdk-ws-host WSS_ORIGIN"
|
|
336
|
+
],
|
|
337
|
+
"production": "CLI OAuth discovers app hosts automatically. Explicit token-file/guest keeps ordinary SDK routing unless an endpoint override is provided."
|
|
338
|
+
},
|
|
339
|
+
"steps": [
|
|
340
|
+
{
|
|
341
|
+
"id": "inspect",
|
|
342
|
+
"argv": [
|
|
343
|
+
"sendbird",
|
|
344
|
+
"describe",
|
|
345
|
+
"chat",
|
|
346
|
+
"message",
|
|
347
|
+
"send"
|
|
348
|
+
],
|
|
349
|
+
"effect": "offline",
|
|
350
|
+
"verify": "Check required flags and channel-specific constraints."
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"id": "watch",
|
|
354
|
+
"argv": [
|
|
355
|
+
"sendbird",
|
|
356
|
+
"--profile",
|
|
357
|
+
"PROFILE",
|
|
358
|
+
"--app-id",
|
|
359
|
+
"APP_ID",
|
|
360
|
+
"chat",
|
|
361
|
+
"channel",
|
|
362
|
+
"watch",
|
|
363
|
+
"--type",
|
|
364
|
+
"CHANNEL_TYPE",
|
|
365
|
+
"--id",
|
|
366
|
+
"CHANNEL_URL",
|
|
367
|
+
"--as-user",
|
|
368
|
+
"RECEIVER_ID",
|
|
369
|
+
"--seconds",
|
|
370
|
+
"60"
|
|
371
|
+
],
|
|
372
|
+
"effect": "sdk-connect/stream",
|
|
373
|
+
"when": "Only when recipient delivery is requested and receiver identity is provided",
|
|
374
|
+
"terminal": "B",
|
|
375
|
+
"verify": "Keep this process running; wait for event=ready before sending."
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"id": "preview",
|
|
379
|
+
"argv": [
|
|
380
|
+
"sendbird",
|
|
381
|
+
"--profile",
|
|
382
|
+
"PROFILE",
|
|
383
|
+
"--app-id",
|
|
384
|
+
"APP_ID",
|
|
385
|
+
"chat",
|
|
386
|
+
"message",
|
|
387
|
+
"send",
|
|
388
|
+
"--type",
|
|
389
|
+
"CHANNEL_TYPE",
|
|
390
|
+
"--id",
|
|
391
|
+
"CHANNEL_URL",
|
|
392
|
+
"--as-user",
|
|
393
|
+
"SENDER_ID",
|
|
394
|
+
"--message",
|
|
395
|
+
"MESSAGE",
|
|
396
|
+
"--dry-run"
|
|
397
|
+
],
|
|
398
|
+
"effect": "offline",
|
|
399
|
+
"terminal": "A",
|
|
400
|
+
"verify": "Confirm the resolved channel/user/body is within the requested task."
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"id": "send",
|
|
404
|
+
"argv": [
|
|
405
|
+
"sendbird",
|
|
406
|
+
"--profile",
|
|
407
|
+
"PROFILE",
|
|
408
|
+
"--app-id",
|
|
409
|
+
"APP_ID",
|
|
410
|
+
"chat",
|
|
411
|
+
"message",
|
|
412
|
+
"send",
|
|
413
|
+
"--type",
|
|
414
|
+
"CHANNEL_TYPE",
|
|
415
|
+
"--id",
|
|
416
|
+
"CHANNEL_URL",
|
|
417
|
+
"--as-user",
|
|
418
|
+
"SENDER_ID",
|
|
419
|
+
"--message",
|
|
420
|
+
"MESSAGE"
|
|
421
|
+
],
|
|
422
|
+
"effect": "mutation",
|
|
423
|
+
"terminal": "A",
|
|
424
|
+
"capture": {
|
|
425
|
+
"MESSAGE_ID": "result.message_id"
|
|
426
|
+
},
|
|
427
|
+
"verify": "Success callback means acknowledged. For delivery, match MESSAGE_ID with receiver message_received.data.message_id."
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
"id": "readback",
|
|
431
|
+
"argv": [
|
|
432
|
+
"sendbird",
|
|
433
|
+
"--profile",
|
|
434
|
+
"PROFILE",
|
|
435
|
+
"--app-id",
|
|
436
|
+
"APP_ID",
|
|
437
|
+
"chat",
|
|
438
|
+
"message",
|
|
439
|
+
"get",
|
|
440
|
+
"--type",
|
|
441
|
+
"CHANNEL_TYPE",
|
|
442
|
+
"--id",
|
|
443
|
+
"CHANNEL_URL",
|
|
444
|
+
"--message-id",
|
|
445
|
+
"MESSAGE_ID",
|
|
446
|
+
"--as-user",
|
|
447
|
+
"SENDER_ID"
|
|
448
|
+
],
|
|
449
|
+
"effect": "sdk-read",
|
|
450
|
+
"verify": "Compare ID and message text. Stop after an uncertain send; never resend blindly."
|
|
451
|
+
}
|
|
452
|
+
]
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"id": "prepare-chat",
|
|
456
|
+
"title": "Prepare Dashboard resources for a two-user chat",
|
|
457
|
+
"description": "Reuse existing resources when available; create only those the user requested.",
|
|
458
|
+
"requires": [
|
|
459
|
+
"Intended profile/environment",
|
|
460
|
+
"An authorized organization/app or permission to create them"
|
|
461
|
+
],
|
|
462
|
+
"steps": [
|
|
463
|
+
{
|
|
464
|
+
"id": "profiles",
|
|
465
|
+
"argv": [
|
|
466
|
+
"sendbird",
|
|
467
|
+
"profile",
|
|
468
|
+
"list"
|
|
469
|
+
],
|
|
470
|
+
"effect": "local-read",
|
|
471
|
+
"verify": "Select a profile rather than guessing the environment."
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
"id": "auth",
|
|
475
|
+
"argv": [
|
|
476
|
+
"sendbird",
|
|
477
|
+
"--profile",
|
|
478
|
+
"PROFILE",
|
|
479
|
+
"auth",
|
|
480
|
+
"status",
|
|
481
|
+
"--summary"
|
|
482
|
+
],
|
|
483
|
+
"effect": "remote-read",
|
|
484
|
+
"verify": "Verify the Dashboard account, organization and role. On E_AUTH, use auth login in a human terminal."
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"id": "orgs",
|
|
488
|
+
"argv": [
|
|
489
|
+
"sendbird",
|
|
490
|
+
"--profile",
|
|
491
|
+
"PROFILE",
|
|
492
|
+
"org",
|
|
493
|
+
"list"
|
|
494
|
+
],
|
|
495
|
+
"effect": "remote-read",
|
|
496
|
+
"verify": "Resolve the intended organization; ask only if multiple targets remain plausible."
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"id": "create-org",
|
|
500
|
+
"argv": [
|
|
501
|
+
"sendbird",
|
|
502
|
+
"--profile",
|
|
503
|
+
"PROFILE",
|
|
504
|
+
"org",
|
|
505
|
+
"create",
|
|
506
|
+
"--organization-name",
|
|
507
|
+
"ORG_NAME"
|
|
508
|
+
],
|
|
509
|
+
"effect": "mutation",
|
|
510
|
+
"when": "Only when no suitable organization exists and creation is requested",
|
|
511
|
+
"capture": {
|
|
512
|
+
"ORG_UID": "result.organizations[0].uid"
|
|
513
|
+
},
|
|
514
|
+
"verify": "Use the actual returned organization UID, not its display name."
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
"id": "apps",
|
|
518
|
+
"argv": [
|
|
519
|
+
"sendbird",
|
|
520
|
+
"--profile",
|
|
521
|
+
"PROFILE",
|
|
522
|
+
"app",
|
|
523
|
+
"list",
|
|
524
|
+
"--limit",
|
|
525
|
+
"20"
|
|
526
|
+
],
|
|
527
|
+
"effect": "remote-read",
|
|
528
|
+
"verify": "Choose the target app and retain its app_id; follow pagination if necessary."
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
"id": "create-app",
|
|
532
|
+
"argv": [
|
|
533
|
+
"sendbird",
|
|
534
|
+
"--profile",
|
|
535
|
+
"PROFILE",
|
|
536
|
+
"--org-id",
|
|
537
|
+
"ORG_UID",
|
|
538
|
+
"app",
|
|
539
|
+
"create",
|
|
540
|
+
"--app-name",
|
|
541
|
+
"APP_NAME",
|
|
542
|
+
"--region",
|
|
543
|
+
"REGION"
|
|
544
|
+
],
|
|
545
|
+
"effect": "mutation",
|
|
546
|
+
"when": "Only when no suitable app exists and creation is requested; use a region available to that organization",
|
|
547
|
+
"capture": {
|
|
548
|
+
"APP_ID": "result.application.app_id"
|
|
549
|
+
},
|
|
550
|
+
"verify": "Retain the returned app ID for all later commands."
|
|
551
|
+
},
|
|
552
|
+
{
|
|
553
|
+
"id": "alice",
|
|
554
|
+
"argv": [
|
|
555
|
+
"sendbird",
|
|
556
|
+
"--profile",
|
|
557
|
+
"PROFILE",
|
|
558
|
+
"--app-id",
|
|
559
|
+
"APP_ID",
|
|
560
|
+
"chat",
|
|
561
|
+
"user",
|
|
562
|
+
"create",
|
|
563
|
+
"--user-id",
|
|
564
|
+
"ALICE_ID",
|
|
565
|
+
"--nickname",
|
|
566
|
+
"Alice",
|
|
567
|
+
"--issue-access-token",
|
|
568
|
+
"true",
|
|
569
|
+
"--secret-output",
|
|
570
|
+
"ALICE_TOKEN_FILE"
|
|
571
|
+
],
|
|
572
|
+
"effect": "mutation",
|
|
573
|
+
"when": "Only when this new test user is needed and authorized",
|
|
574
|
+
"verify": "New private token file outside Git or ignored and untracked; never read its contents into the conversation."
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"id": "bob",
|
|
578
|
+
"argv": [
|
|
579
|
+
"sendbird",
|
|
580
|
+
"--profile",
|
|
581
|
+
"PROFILE",
|
|
582
|
+
"--app-id",
|
|
583
|
+
"APP_ID",
|
|
584
|
+
"chat",
|
|
585
|
+
"user",
|
|
586
|
+
"create",
|
|
587
|
+
"--user-id",
|
|
588
|
+
"BOB_ID",
|
|
589
|
+
"--nickname",
|
|
590
|
+
"Bob",
|
|
591
|
+
"--issue-access-token",
|
|
592
|
+
"true",
|
|
593
|
+
"--secret-output",
|
|
594
|
+
"BOB_TOKEN_FILE"
|
|
595
|
+
],
|
|
596
|
+
"effect": "mutation",
|
|
597
|
+
"when": "Only when this new test user is needed and authorized",
|
|
598
|
+
"verify": "User ID matches the second test user; token file is outside Git or ignored and untracked."
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
"id": "channel",
|
|
602
|
+
"argv": [
|
|
603
|
+
"sendbird",
|
|
604
|
+
"--profile",
|
|
605
|
+
"PROFILE",
|
|
606
|
+
"--app-id",
|
|
607
|
+
"APP_ID",
|
|
608
|
+
"chat",
|
|
609
|
+
"channel",
|
|
610
|
+
"create",
|
|
611
|
+
"--type",
|
|
612
|
+
"group",
|
|
613
|
+
"--user-ids",
|
|
614
|
+
"[\"ALICE_ID\",\"BOB_ID\"]",
|
|
615
|
+
"--name",
|
|
616
|
+
"Demo",
|
|
617
|
+
"--is-distinct",
|
|
618
|
+
"true"
|
|
619
|
+
],
|
|
620
|
+
"effect": "mutation",
|
|
621
|
+
"when": "Only when a new/reused distinct channel is requested",
|
|
622
|
+
"capture": {
|
|
623
|
+
"CHANNEL_URL": "result.channel_url"
|
|
624
|
+
},
|
|
625
|
+
"verify": "Use the actual returned URL. If a member is invited rather than joined, accept only that pending invitation."
|
|
626
|
+
}
|
|
627
|
+
]
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
"id": "pro-chat",
|
|
631
|
+
"title": "Search, mention, translate and run a Poll in an existing Pro group",
|
|
632
|
+
"description": "Use authorized existing Chat users and a joined group. Read feature evidence, verify exact results, and keep app/device evidence separate.",
|
|
633
|
+
"requires": [
|
|
634
|
+
"An authenticated staging profile and a verified Pro-capable org/app; activation snapshots alone do not prove runtime support",
|
|
635
|
+
"Two authorized Chat users alice/bob who are already joined to GROUP_URL",
|
|
636
|
+
"Authorization for the specific test messages/Poll; no organization creation, billing, guest fallback or policy change"
|
|
637
|
+
],
|
|
638
|
+
"steps": [
|
|
639
|
+
{
|
|
640
|
+
"id": "diagnose",
|
|
641
|
+
"argv": [
|
|
642
|
+
"sendbird",
|
|
643
|
+
"--profile",
|
|
644
|
+
"staging",
|
|
645
|
+
"--org-id",
|
|
646
|
+
"ORG_UID",
|
|
647
|
+
"--app-id",
|
|
648
|
+
"APP_ID",
|
|
649
|
+
"doctor",
|
|
650
|
+
"--command",
|
|
651
|
+
"chat message search",
|
|
652
|
+
"--as-user",
|
|
653
|
+
"alice"
|
|
654
|
+
],
|
|
655
|
+
"effect": "read",
|
|
656
|
+
"verify": "Read entitlement/activation/role evidence separately. Unknown is not denied or success."
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
"id": "mention",
|
|
660
|
+
"argv": [
|
|
661
|
+
"sendbird",
|
|
662
|
+
"--profile",
|
|
663
|
+
"staging",
|
|
664
|
+
"--org-id",
|
|
665
|
+
"ORG_UID",
|
|
666
|
+
"--app-id",
|
|
667
|
+
"APP_ID",
|
|
668
|
+
"chat",
|
|
669
|
+
"message",
|
|
670
|
+
"send",
|
|
671
|
+
"--type",
|
|
672
|
+
"group",
|
|
673
|
+
"--id",
|
|
674
|
+
"GROUP_URL",
|
|
675
|
+
"--as-user",
|
|
676
|
+
"alice",
|
|
677
|
+
"--message",
|
|
678
|
+
"Bob, weekend plans?",
|
|
679
|
+
"--mention-type",
|
|
680
|
+
"users",
|
|
681
|
+
"--mentioned-user-ids",
|
|
682
|
+
"bob",
|
|
683
|
+
"--translation-target-languages",
|
|
684
|
+
"fr,en"
|
|
685
|
+
],
|
|
686
|
+
"effect": "mutation",
|
|
687
|
+
"verify": "Read back this message ID and actual mentioned_user_ids; inspect translations without discarding the original.",
|
|
688
|
+
"when": "Only when this single test message is authorized",
|
|
689
|
+
"capture": {
|
|
690
|
+
"MESSAGE_ID": "result.message_id"
|
|
691
|
+
}
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
"id": "search",
|
|
695
|
+
"argv": [
|
|
696
|
+
"sendbird",
|
|
697
|
+
"--profile",
|
|
698
|
+
"staging",
|
|
699
|
+
"--org-id",
|
|
700
|
+
"ORG_UID",
|
|
701
|
+
"--app-id",
|
|
702
|
+
"APP_ID",
|
|
703
|
+
"chat",
|
|
704
|
+
"message",
|
|
705
|
+
"search",
|
|
706
|
+
"--as-user",
|
|
707
|
+
"alice",
|
|
708
|
+
"--channel-url",
|
|
709
|
+
"GROUP_URL",
|
|
710
|
+
"--keyword",
|
|
711
|
+
"weekend",
|
|
712
|
+
"--limit",
|
|
713
|
+
"20"
|
|
714
|
+
],
|
|
715
|
+
"effect": "sdk-read",
|
|
716
|
+
"verify": "Match MESSAGE_ID. Index delay can omit it; follow bounded pages without sending another message."
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"id": "prepare-poll",
|
|
720
|
+
"argv": [
|
|
721
|
+
"sendbird",
|
|
722
|
+
"--profile",
|
|
723
|
+
"staging",
|
|
724
|
+
"--org-id",
|
|
725
|
+
"ORG_UID",
|
|
726
|
+
"--app-id",
|
|
727
|
+
"APP_ID",
|
|
728
|
+
"chat",
|
|
729
|
+
"sdk",
|
|
730
|
+
"poll",
|
|
731
|
+
"create",
|
|
732
|
+
"--as-user",
|
|
733
|
+
"alice",
|
|
734
|
+
"--title",
|
|
735
|
+
"Weekend activity",
|
|
736
|
+
"--options",
|
|
737
|
+
"Hiking,Cinema",
|
|
738
|
+
"--allow-multiple-votes",
|
|
739
|
+
"false"
|
|
740
|
+
],
|
|
741
|
+
"effect": "mutation",
|
|
742
|
+
"verify": "Retain the actual poll_id. message_id=0 means unattached; a lost response must not trigger another create.",
|
|
743
|
+
"when": "Only when one new test Poll is requested",
|
|
744
|
+
"capture": {
|
|
745
|
+
"POLL_ID": "result.poll_id"
|
|
746
|
+
}
|
|
747
|
+
},
|
|
748
|
+
{
|
|
749
|
+
"id": "attach-poll",
|
|
750
|
+
"argv": [
|
|
751
|
+
"sendbird",
|
|
752
|
+
"--profile",
|
|
753
|
+
"staging",
|
|
754
|
+
"--org-id",
|
|
755
|
+
"ORG_UID",
|
|
756
|
+
"--app-id",
|
|
757
|
+
"APP_ID",
|
|
758
|
+
"chat",
|
|
759
|
+
"message",
|
|
760
|
+
"send",
|
|
761
|
+
"--type",
|
|
762
|
+
"group",
|
|
763
|
+
"--id",
|
|
764
|
+
"GROUP_URL",
|
|
765
|
+
"--as-user",
|
|
766
|
+
"alice",
|
|
767
|
+
"--message",
|
|
768
|
+
"Choose one activity",
|
|
769
|
+
"--poll-id",
|
|
770
|
+
"POLL_ID"
|
|
771
|
+
],
|
|
772
|
+
"effect": "mutation",
|
|
773
|
+
"verify": "Compare the returned Poll/message association and retain the acknowledged message ID.",
|
|
774
|
+
"when": "Only for the Poll created in the previous step",
|
|
775
|
+
"capture": {
|
|
776
|
+
"POLL_MESSAGE_ID": "result.message_id"
|
|
777
|
+
}
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
"id": "read-poll",
|
|
781
|
+
"argv": [
|
|
782
|
+
"sendbird",
|
|
783
|
+
"--profile",
|
|
784
|
+
"staging",
|
|
785
|
+
"--org-id",
|
|
786
|
+
"ORG_UID",
|
|
787
|
+
"--app-id",
|
|
788
|
+
"APP_ID",
|
|
789
|
+
"chat",
|
|
790
|
+
"sdk",
|
|
791
|
+
"poll",
|
|
792
|
+
"get",
|
|
793
|
+
"--type",
|
|
794
|
+
"group",
|
|
795
|
+
"--id",
|
|
796
|
+
"GROUP_URL",
|
|
797
|
+
"--as-user",
|
|
798
|
+
"bob",
|
|
799
|
+
"--poll-id",
|
|
800
|
+
"POLL_ID"
|
|
801
|
+
],
|
|
802
|
+
"effect": "sdk-read",
|
|
803
|
+
"verify": "Verify poll_id, message_id and returned option IDs; never guess OPTION_ID.",
|
|
804
|
+
"capture": {
|
|
805
|
+
"OPTION_ID": "result.options.0.option_id"
|
|
806
|
+
}
|
|
807
|
+
},
|
|
808
|
+
{
|
|
809
|
+
"id": "vote",
|
|
810
|
+
"argv": [
|
|
811
|
+
"sendbird",
|
|
812
|
+
"--profile",
|
|
813
|
+
"staging",
|
|
814
|
+
"--org-id",
|
|
815
|
+
"ORG_UID",
|
|
816
|
+
"--app-id",
|
|
817
|
+
"APP_ID",
|
|
818
|
+
"chat",
|
|
819
|
+
"sdk",
|
|
820
|
+
"poll",
|
|
821
|
+
"vote",
|
|
822
|
+
"--type",
|
|
823
|
+
"group",
|
|
824
|
+
"--id",
|
|
825
|
+
"GROUP_URL",
|
|
826
|
+
"--as-user",
|
|
827
|
+
"bob",
|
|
828
|
+
"--poll-id",
|
|
829
|
+
"POLL_ID",
|
|
830
|
+
"--option-ids",
|
|
831
|
+
"OPTION_ID"
|
|
832
|
+
],
|
|
833
|
+
"effect": "mutation",
|
|
834
|
+
"verify": "Re-read the Poll as the same voter and inspect actual option/voter state.",
|
|
835
|
+
"when": "Only when this vote by bob is authorized"
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
"id": "read-vote",
|
|
839
|
+
"argv": [
|
|
840
|
+
"sendbird",
|
|
841
|
+
"--profile",
|
|
842
|
+
"staging",
|
|
843
|
+
"--org-id",
|
|
844
|
+
"ORG_UID",
|
|
845
|
+
"--app-id",
|
|
846
|
+
"APP_ID",
|
|
847
|
+
"chat",
|
|
848
|
+
"sdk",
|
|
849
|
+
"poll",
|
|
850
|
+
"get",
|
|
851
|
+
"--type",
|
|
852
|
+
"group",
|
|
853
|
+
"--id",
|
|
854
|
+
"GROUP_URL",
|
|
855
|
+
"--as-user",
|
|
856
|
+
"bob",
|
|
857
|
+
"--poll-id",
|
|
858
|
+
"POLL_ID"
|
|
859
|
+
],
|
|
860
|
+
"effect": "sdk-read",
|
|
861
|
+
"verify": "Compare voted_option_ids and counts. This is not a customer-app rendering or notification test."
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
"id": "close",
|
|
865
|
+
"argv": [
|
|
866
|
+
"sendbird",
|
|
867
|
+
"--profile",
|
|
868
|
+
"staging",
|
|
869
|
+
"--org-id",
|
|
870
|
+
"ORG_UID",
|
|
871
|
+
"--app-id",
|
|
872
|
+
"APP_ID",
|
|
873
|
+
"chat",
|
|
874
|
+
"sdk",
|
|
875
|
+
"poll",
|
|
876
|
+
"close",
|
|
877
|
+
"--type",
|
|
878
|
+
"group",
|
|
879
|
+
"--id",
|
|
880
|
+
"GROUP_URL",
|
|
881
|
+
"--as-user",
|
|
882
|
+
"alice",
|
|
883
|
+
"--poll-id",
|
|
884
|
+
"POLL_ID",
|
|
885
|
+
"--yes"
|
|
886
|
+
],
|
|
887
|
+
"effect": "mutation",
|
|
888
|
+
"verify": "Re-read status=closed; never repeat on timeout.",
|
|
889
|
+
"when": "Only when closure of this test Poll is requested"
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"id": "clean-poll",
|
|
893
|
+
"argv": [
|
|
894
|
+
"sendbird",
|
|
895
|
+
"--profile",
|
|
896
|
+
"staging",
|
|
897
|
+
"--org-id",
|
|
898
|
+
"ORG_UID",
|
|
899
|
+
"--app-id",
|
|
900
|
+
"APP_ID",
|
|
901
|
+
"chat",
|
|
902
|
+
"sdk",
|
|
903
|
+
"poll",
|
|
904
|
+
"delete",
|
|
905
|
+
"--type",
|
|
906
|
+
"group",
|
|
907
|
+
"--id",
|
|
908
|
+
"GROUP_URL",
|
|
909
|
+
"--as-user",
|
|
910
|
+
"alice",
|
|
911
|
+
"--poll-id",
|
|
912
|
+
"POLL_ID",
|
|
913
|
+
"--yes"
|
|
914
|
+
],
|
|
915
|
+
"effect": "mutation",
|
|
916
|
+
"verify": "Clean only the captured Poll after UI verification and explicit cleanup authorization.",
|
|
917
|
+
"when": "Only for this created Poll when cleanup is authorized"
|
|
918
|
+
},
|
|
919
|
+
{
|
|
920
|
+
"id": "clean-message",
|
|
921
|
+
"argv": [
|
|
922
|
+
"sendbird",
|
|
923
|
+
"--profile",
|
|
924
|
+
"staging",
|
|
925
|
+
"--org-id",
|
|
926
|
+
"ORG_UID",
|
|
927
|
+
"--app-id",
|
|
928
|
+
"APP_ID",
|
|
929
|
+
"chat",
|
|
930
|
+
"message",
|
|
931
|
+
"delete",
|
|
932
|
+
"--type",
|
|
933
|
+
"group",
|
|
934
|
+
"--id",
|
|
935
|
+
"GROUP_URL",
|
|
936
|
+
"--as-user",
|
|
937
|
+
"alice",
|
|
938
|
+
"--message-id",
|
|
939
|
+
"POLL_MESSAGE_ID",
|
|
940
|
+
"--yes"
|
|
941
|
+
],
|
|
942
|
+
"effect": "mutation",
|
|
943
|
+
"verify": "Clean only the captured test message. Do not remove existing group/users or unrelated messages.",
|
|
944
|
+
"when": "Only for this created message when cleanup is authorized"
|
|
945
|
+
}
|
|
946
|
+
]
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
"id": "temporary-mute-check",
|
|
950
|
+
"title": "Temporarily mute a member (or freeze a channel), confirm the restriction, restore, and confirm sending works again",
|
|
951
|
+
"description": "Six separate steps with readback after every change. A restored flag alone does not prove that sending works again; the final member send is part of the check. For a channel freeze use chat moderation channel freeze/unfreeze with the same sequence.",
|
|
952
|
+
"requires": [
|
|
953
|
+
"Authorized target channel, operator, ordinary member and a disposable probe message; agreed cleanup scope",
|
|
954
|
+
"Capture the original mute/freeze state first and never silently keep a restriction that already existed"
|
|
955
|
+
],
|
|
956
|
+
"steps": [
|
|
957
|
+
{
|
|
958
|
+
"id": "baseline",
|
|
959
|
+
"argv": [
|
|
960
|
+
"sendbird",
|
|
961
|
+
"--profile",
|
|
962
|
+
"staging",
|
|
963
|
+
"--app-id",
|
|
964
|
+
"APP_ID",
|
|
965
|
+
"chat",
|
|
966
|
+
"moderation",
|
|
967
|
+
"channel",
|
|
968
|
+
"muted",
|
|
969
|
+
"get",
|
|
970
|
+
"--type",
|
|
971
|
+
"group",
|
|
972
|
+
"--id",
|
|
973
|
+
"CHANNEL_URL",
|
|
974
|
+
"--user-id",
|
|
975
|
+
"MEMBER_ID",
|
|
976
|
+
"--json"
|
|
977
|
+
],
|
|
978
|
+
"effect": "read",
|
|
979
|
+
"verify": "Record is_muted and remaining_duration before changing anything. Stop if the member is already muted and the task did not authorize touching that state."
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
"id": "restrict",
|
|
983
|
+
"argv": [
|
|
984
|
+
"sendbird",
|
|
985
|
+
"--profile",
|
|
986
|
+
"staging",
|
|
987
|
+
"--app-id",
|
|
988
|
+
"APP_ID",
|
|
989
|
+
"chat",
|
|
990
|
+
"moderation",
|
|
991
|
+
"channel",
|
|
992
|
+
"mute",
|
|
993
|
+
"--type",
|
|
994
|
+
"group",
|
|
995
|
+
"--id",
|
|
996
|
+
"CHANNEL_URL",
|
|
997
|
+
"--user-id",
|
|
998
|
+
"MEMBER_ID",
|
|
999
|
+
"--seconds",
|
|
1000
|
+
"600",
|
|
1001
|
+
"--yes",
|
|
1002
|
+
"--json"
|
|
1003
|
+
],
|
|
1004
|
+
"effect": "mutation",
|
|
1005
|
+
"verify": "Read back with chat moderation channel muted get: is_muted must be true. Keep the restriction short-lived."
|
|
1006
|
+
},
|
|
1007
|
+
{
|
|
1008
|
+
"id": "blocked-send",
|
|
1009
|
+
"argv": [
|
|
1010
|
+
"sendbird",
|
|
1011
|
+
"--profile",
|
|
1012
|
+
"staging",
|
|
1013
|
+
"--app-id",
|
|
1014
|
+
"APP_ID",
|
|
1015
|
+
"chat",
|
|
1016
|
+
"message",
|
|
1017
|
+
"send",
|
|
1018
|
+
"--type",
|
|
1019
|
+
"group",
|
|
1020
|
+
"--id",
|
|
1021
|
+
"CHANNEL_URL",
|
|
1022
|
+
"--as-user",
|
|
1023
|
+
"MEMBER_ID",
|
|
1024
|
+
"--message",
|
|
1025
|
+
"mute probe",
|
|
1026
|
+
"--json"
|
|
1027
|
+
],
|
|
1028
|
+
"effect": "mutation",
|
|
1029
|
+
"verify": "Expect a server rejection (E_PERMISSION or a moderation error) and distinguish it from a timeout. Confirm absence with chat message list as another member."
|
|
1030
|
+
},
|
|
1031
|
+
{
|
|
1032
|
+
"id": "restore",
|
|
1033
|
+
"argv": [
|
|
1034
|
+
"sendbird",
|
|
1035
|
+
"--profile",
|
|
1036
|
+
"staging",
|
|
1037
|
+
"--app-id",
|
|
1038
|
+
"APP_ID",
|
|
1039
|
+
"chat",
|
|
1040
|
+
"moderation",
|
|
1041
|
+
"channel",
|
|
1042
|
+
"unmute",
|
|
1043
|
+
"--type",
|
|
1044
|
+
"group",
|
|
1045
|
+
"--id",
|
|
1046
|
+
"CHANNEL_URL",
|
|
1047
|
+
"--user-id",
|
|
1048
|
+
"MEMBER_ID",
|
|
1049
|
+
"--yes",
|
|
1050
|
+
"--json"
|
|
1051
|
+
],
|
|
1052
|
+
"effect": "mutation",
|
|
1053
|
+
"verify": "Read back with chat moderation channel muted get: is_muted must match the captured baseline. Restore even if the probe failed."
|
|
1054
|
+
},
|
|
1055
|
+
{
|
|
1056
|
+
"id": "recovery-send",
|
|
1057
|
+
"argv": [
|
|
1058
|
+
"sendbird",
|
|
1059
|
+
"--profile",
|
|
1060
|
+
"staging",
|
|
1061
|
+
"--app-id",
|
|
1062
|
+
"APP_ID",
|
|
1063
|
+
"chat",
|
|
1064
|
+
"message",
|
|
1065
|
+
"send",
|
|
1066
|
+
"--type",
|
|
1067
|
+
"group",
|
|
1068
|
+
"--id",
|
|
1069
|
+
"CHANNEL_URL",
|
|
1070
|
+
"--as-user",
|
|
1071
|
+
"MEMBER_ID",
|
|
1072
|
+
"--message",
|
|
1073
|
+
"mute recovery probe",
|
|
1074
|
+
"--json"
|
|
1075
|
+
],
|
|
1076
|
+
"effect": "mutation",
|
|
1077
|
+
"verify": "A message_id must be returned and the message must appear in chat message list as another member. Without this step the restoration is unverified."
|
|
1078
|
+
},
|
|
1079
|
+
{
|
|
1080
|
+
"id": "report",
|
|
1081
|
+
"argv": [
|
|
1082
|
+
"sendbird",
|
|
1083
|
+
"--profile",
|
|
1084
|
+
"staging",
|
|
1085
|
+
"auth",
|
|
1086
|
+
"status",
|
|
1087
|
+
"--summary"
|
|
1088
|
+
],
|
|
1089
|
+
"effect": "read",
|
|
1090
|
+
"verify": "Report restriction enforcement, setting restoration, normal-send recovery and probe cleanup as four separate results."
|
|
1091
|
+
}
|
|
1092
|
+
]
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
"id": "reply-and-verify-thread",
|
|
1096
|
+
"title": "Post a reply as a user and confirm it belongs to the intended thread",
|
|
1097
|
+
"description": "The request names the actor, the parent message and the reply text: create the reply now, then prove its parent. Do not search for an existing reply or ask for an ID the person already gave.",
|
|
1098
|
+
"requires": [
|
|
1099
|
+
"Target app, channel URL, parent message ID, acting user and the reply text"
|
|
1100
|
+
],
|
|
1101
|
+
"steps": [
|
|
1102
|
+
{
|
|
1103
|
+
"id": "parent",
|
|
1104
|
+
"argv": [
|
|
1105
|
+
"sendbird",
|
|
1106
|
+
"--profile",
|
|
1107
|
+
"staging",
|
|
1108
|
+
"--app-id",
|
|
1109
|
+
"APP_ID",
|
|
1110
|
+
"chat",
|
|
1111
|
+
"message",
|
|
1112
|
+
"get",
|
|
1113
|
+
"--type",
|
|
1114
|
+
"group",
|
|
1115
|
+
"--id",
|
|
1116
|
+
"CHANNEL_URL",
|
|
1117
|
+
"--message-id",
|
|
1118
|
+
"PARENT_MESSAGE_ID",
|
|
1119
|
+
"--as-user",
|
|
1120
|
+
"USER_ID",
|
|
1121
|
+
"--json"
|
|
1122
|
+
],
|
|
1123
|
+
"effect": "sdk-read",
|
|
1124
|
+
"verify": "The parent exists in this channel before replying."
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
"id": "reply",
|
|
1128
|
+
"argv": [
|
|
1129
|
+
"sendbird",
|
|
1130
|
+
"--profile",
|
|
1131
|
+
"staging",
|
|
1132
|
+
"--app-id",
|
|
1133
|
+
"APP_ID",
|
|
1134
|
+
"chat",
|
|
1135
|
+
"message",
|
|
1136
|
+
"reply",
|
|
1137
|
+
"--type",
|
|
1138
|
+
"group",
|
|
1139
|
+
"--id",
|
|
1140
|
+
"CHANNEL_URL",
|
|
1141
|
+
"--message-id",
|
|
1142
|
+
"PARENT_MESSAGE_ID",
|
|
1143
|
+
"--as-user",
|
|
1144
|
+
"USER_ID",
|
|
1145
|
+
"--message",
|
|
1146
|
+
"REPLY_TEXT",
|
|
1147
|
+
"--json"
|
|
1148
|
+
],
|
|
1149
|
+
"effect": "mutation",
|
|
1150
|
+
"verify": "Record the returned message_id and parent_message_id; parent_message_id must equal PARENT_MESSAGE_ID."
|
|
1151
|
+
},
|
|
1152
|
+
{
|
|
1153
|
+
"id": "thread",
|
|
1154
|
+
"argv": [
|
|
1155
|
+
"sendbird",
|
|
1156
|
+
"--profile",
|
|
1157
|
+
"staging",
|
|
1158
|
+
"--app-id",
|
|
1159
|
+
"APP_ID",
|
|
1160
|
+
"chat",
|
|
1161
|
+
"message",
|
|
1162
|
+
"thread",
|
|
1163
|
+
"--type",
|
|
1164
|
+
"group",
|
|
1165
|
+
"--id",
|
|
1166
|
+
"CHANNEL_URL",
|
|
1167
|
+
"--message-id",
|
|
1168
|
+
"PARENT_MESSAGE_ID",
|
|
1169
|
+
"--as-user",
|
|
1170
|
+
"USER_ID",
|
|
1171
|
+
"--json"
|
|
1172
|
+
],
|
|
1173
|
+
"effect": "sdk-read",
|
|
1174
|
+
"verify": "The new reply is listed under the parent with the acting user as sender. Report the reply ID and its parent together."
|
|
1175
|
+
}
|
|
1176
|
+
]
|
|
1177
|
+
},
|
|
1178
|
+
{
|
|
1179
|
+
"id": "staging-client-hosts",
|
|
1180
|
+
"title": "Wire a customer app to a staging app with the discovered SDK hosts and verify delivery from the server side",
|
|
1181
|
+
"description": "Staging apps are not reachable through default SDK hosts. Read the app's api_host/ws_host, pass them to SendbirdChat.init as customApiHost/customWebSocketHost, then prove delivery with a CLI readback. A local sent state or a successful build is not delivery.",
|
|
1182
|
+
"requires": [
|
|
1183
|
+
"Selected staging app and an authorized test user; no management token in client code"
|
|
1184
|
+
],
|
|
1185
|
+
"steps": [
|
|
1186
|
+
{
|
|
1187
|
+
"id": "hosts",
|
|
1188
|
+
"argv": [
|
|
1189
|
+
"sendbird",
|
|
1190
|
+
"--profile",
|
|
1191
|
+
"staging",
|
|
1192
|
+
"--app-id",
|
|
1193
|
+
"APP_ID",
|
|
1194
|
+
"app",
|
|
1195
|
+
"sdk-config",
|
|
1196
|
+
"--raw"
|
|
1197
|
+
],
|
|
1198
|
+
"effect": "read",
|
|
1199
|
+
"verify": "Use api_host and ws_host exactly as returned (customApiHost, customWebSocketHost) together with the same app_id in the client init."
|
|
1200
|
+
},
|
|
1201
|
+
{
|
|
1202
|
+
"id": "route",
|
|
1203
|
+
"argv": [
|
|
1204
|
+
"sendbird",
|
|
1205
|
+
"--profile",
|
|
1206
|
+
"staging",
|
|
1207
|
+
"--app-id",
|
|
1208
|
+
"APP_ID",
|
|
1209
|
+
"chat",
|
|
1210
|
+
"sdk",
|
|
1211
|
+
"status",
|
|
1212
|
+
"--as-user",
|
|
1213
|
+
"TEST_USER_ID",
|
|
1214
|
+
"--json"
|
|
1215
|
+
],
|
|
1216
|
+
"effect": "sdk-connect",
|
|
1217
|
+
"verify": "The CLI connects through the same hosts; a failure here is an app, token or policy problem, not a client-code problem."
|
|
1218
|
+
},
|
|
1219
|
+
{
|
|
1220
|
+
"id": "readback",
|
|
1221
|
+
"argv": [
|
|
1222
|
+
"sendbird",
|
|
1223
|
+
"--profile",
|
|
1224
|
+
"staging",
|
|
1225
|
+
"--app-id",
|
|
1226
|
+
"APP_ID",
|
|
1227
|
+
"chat",
|
|
1228
|
+
"message",
|
|
1229
|
+
"list",
|
|
1230
|
+
"--type",
|
|
1231
|
+
"group",
|
|
1232
|
+
"--id",
|
|
1233
|
+
"CHANNEL_URL",
|
|
1234
|
+
"--as-user",
|
|
1235
|
+
"PEER_USER_ID",
|
|
1236
|
+
"--limit",
|
|
1237
|
+
"20",
|
|
1238
|
+
"--json"
|
|
1239
|
+
],
|
|
1240
|
+
"effect": "sdk-read",
|
|
1241
|
+
"verify": "After sending from the customer UI, the message must appear here with a message_id. Report UI acknowledgement and server readback separately."
|
|
1242
|
+
}
|
|
1243
|
+
]
|
|
1244
|
+
}
|
|
1245
|
+
]
|
|
1246
|
+
}
|