@firedrill-tools/slack 0.1.1

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.
Files changed (58) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +369 -0
  3. package/firedrill/agent.target.json +17 -0
  4. package/firedrill/baseline.scenario.json +5 -0
  5. package/firedrill/bounds.scenario.json +112 -0
  6. package/firedrill/conformance.suite.json +21 -0
  7. package/firedrill/history-unavailable.scenario.json +11 -0
  8. package/firedrill/open-long-handles.scenario.json +263 -0
  9. package/firedrill/open-member-bound.scenario.json +24 -0
  10. package/firedrill/post-rate-limited.scenario.json +11 -0
  11. package/firedrill/response-budget.scenario.json +24 -0
  12. package/firedrill/slack-bounds.drill.json +428 -0
  13. package/firedrill/slack-denied.drill.json +74 -0
  14. package/firedrill/slack-fresh-install.drill.json +132 -0
  15. package/firedrill/slack-history-unavailable.drill.json +83 -0
  16. package/firedrill/slack-invalid-auth.drill.json +408 -0
  17. package/firedrill/slack-mcp-aliases.drill.json +219 -0
  18. package/firedrill/slack-open-long-handles.drill.json +82 -0
  19. package/firedrill/slack-open-member-bound.drill.json +135 -0
  20. package/firedrill/slack-post-rate-limited.drill.json +96 -0
  21. package/firedrill/slack-response-budget.drill.json +118 -0
  22. package/firedrill/slack-thread-many-repliers.drill.json +100 -0
  23. package/firedrill/slack-ts-sequence-full.drill.json +165 -0
  24. package/firedrill/slack-visibility.drill.json +110 -0
  25. package/firedrill/slack-web-api-flow.drill.json +896 -0
  26. package/firedrill/thread-many-repliers.scenario.json +79 -0
  27. package/firedrill/tools/slack/app/assets/ATTRIBUTION.md +40 -0
  28. package/firedrill/tools/slack/app/assets/fonts/OFL.txt +93 -0
  29. package/firedrill/tools/slack/app/assets/fonts/lato-latin-400.woff2 +0 -0
  30. package/firedrill/tools/slack/app/assets/fonts/lato-latin-700.woff2 +0 -0
  31. package/firedrill/tools/slack/app/assets/fonts/lato-latin-900.woff2 +0 -0
  32. package/firedrill/tools/slack/app/assets/slack-wordmark.svg +1 -0
  33. package/firedrill/tools/slack/app/assets/slack.svg +1 -0
  34. package/firedrill/tools/slack/app/site/app.js +2202 -0
  35. package/firedrill/tools/slack/app/site/assets/fonts/lato-latin-400.woff2 +0 -0
  36. package/firedrill/tools/slack/app/site/assets/fonts/lato-latin-700.woff2 +0 -0
  37. package/firedrill/tools/slack/app/site/assets/fonts/lato-latin-900.woff2 +0 -0
  38. package/firedrill/tools/slack/app/site/assets/slack-wordmark.svg +1 -0
  39. package/firedrill/tools/slack/app/site/assets/slack.svg +1 -0
  40. package/firedrill/tools/slack/app/site/chrome.css +73 -0
  41. package/firedrill/tools/slack/app/site/chrome.js +96 -0
  42. package/firedrill/tools/slack/app/site/icons.js +96 -0
  43. package/firedrill/tools/slack/app/site/index.html +253 -0
  44. package/firedrill/tools/slack/app/site/styles.css +2719 -0
  45. package/firedrill/tools/slack/app/site/ui.js +491 -0
  46. package/firedrill/tools/slack/behavior.mjs +1171 -0
  47. package/firedrill/tools/slack/lib/access.mjs +138 -0
  48. package/firedrill/tools/slack/lib/budget.mjs +67 -0
  49. package/firedrill/tools/slack/lib/ids.mjs +146 -0
  50. package/firedrill/tools/slack/lib/search.mjs +172 -0
  51. package/firedrill/tools/slack/lib/wire.mjs +144 -0
  52. package/firedrill/tools/slack/slack.tool.json +6114 -0
  53. package/firedrill/ts-sequence-full.scenario.json +38 -0
  54. package/firedrill/world.json +2008 -0
  55. package/firedrill.json +5 -0
  56. package/package.json +62 -0
  57. package/starter.json +1562 -0
  58. package/test/conformance.mjs +1166 -0
@@ -0,0 +1,112 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "bounds",
4
+ "title": "Bounds below the authored data, an extra pin and a full-reply_users thread in #general: bounded reads, pins.add and full-thread replies fail with too_many_rows; by-id calls work",
5
+ "state": [
6
+ {
7
+ "action": "upsert",
8
+ "packageId": "slack",
9
+ "namespace": "workspace",
10
+ "rowId": "team",
11
+ "value": {
12
+ "id": "T01EXAMPLE0",
13
+ "name": "Example Team",
14
+ "domain": "example-team",
15
+ "url": "https://example-team.slack.com/",
16
+ "id_sequence": 50,
17
+ "message_sequence": 300,
18
+ "limits": {
19
+ "users": 5,
20
+ "conversations": 8,
21
+ "members": 1,
22
+ "messages": 2,
23
+ "pins": 1
24
+ }
25
+ }
26
+ },
27
+ {
28
+ "action": "upsert",
29
+ "packageId": "slack",
30
+ "namespace": "pins",
31
+ "rowId": "C01GENERAL1:1788249600.000102",
32
+ "value": {
33
+ "channel": "C01GENERAL1",
34
+ "message_ts": "1788249600.000102",
35
+ "created": 1788249700,
36
+ "created_by": "U01SAM00002"
37
+ }
38
+ },
39
+ {
40
+ "action": "upsert",
41
+ "packageId": "slack",
42
+ "namespace": "messages",
43
+ "rowId": "C01GENERAL1:1789290000.000199",
44
+ "value": {
45
+ "channel": "C01GENERAL1",
46
+ "ts": "1789290000.000199",
47
+ "type": "message",
48
+ "user": "U01MIRA0006",
49
+ "text": "Retro thread: one reply per person, please.",
50
+ "reactions": [],
51
+ "permalink": "https://example-team.slack.com/archives/C01GENERAL1/p1789290000000199",
52
+ "team": "T01EXAMPLE0",
53
+ "thread_ts": "1789290000.000199",
54
+ "reply_count": 50,
55
+ "reply_users": [
56
+ "U0REPLY0001",
57
+ "U0REPLY0002",
58
+ "U0REPLY0003",
59
+ "U0REPLY0004",
60
+ "U0REPLY0005",
61
+ "U0REPLY0006",
62
+ "U0REPLY0007",
63
+ "U0REPLY0008",
64
+ "U0REPLY0009",
65
+ "U0REPLY0010",
66
+ "U0REPLY0011",
67
+ "U0REPLY0012",
68
+ "U0REPLY0013",
69
+ "U0REPLY0014",
70
+ "U0REPLY0015",
71
+ "U0REPLY0016",
72
+ "U0REPLY0017",
73
+ "U0REPLY0018",
74
+ "U0REPLY0019",
75
+ "U0REPLY0020",
76
+ "U0REPLY0021",
77
+ "U0REPLY0022",
78
+ "U0REPLY0023",
79
+ "U0REPLY0024",
80
+ "U0REPLY0025",
81
+ "U0REPLY0026",
82
+ "U0REPLY0027",
83
+ "U0REPLY0028",
84
+ "U0REPLY0029",
85
+ "U0REPLY0030",
86
+ "U0REPLY0031",
87
+ "U0REPLY0032",
88
+ "U0REPLY0033",
89
+ "U0REPLY0034",
90
+ "U0REPLY0035",
91
+ "U0REPLY0036",
92
+ "U0REPLY0037",
93
+ "U0REPLY0038",
94
+ "U0REPLY0039",
95
+ "U0REPLY0040",
96
+ "U0REPLY0041",
97
+ "U0REPLY0042",
98
+ "U0REPLY0043",
99
+ "U0REPLY0044",
100
+ "U0REPLY0045",
101
+ "U0REPLY0046",
102
+ "U0REPLY0047",
103
+ "U0REPLY0048",
104
+ "U0REPLY0049",
105
+ "U0REPLY0050"
106
+ ],
107
+ "reply_users_count": 50,
108
+ "latest_reply": "1789290000.000199"
109
+ }
110
+ }
111
+ ]
112
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "conformance",
4
+ "title": "Slack Tool conformance",
5
+ "drills": [
6
+ "slack-web-api-flow",
7
+ "slack-mcp-aliases",
8
+ "slack-visibility",
9
+ "slack-denied",
10
+ "slack-invalid-auth",
11
+ "slack-post-rate-limited",
12
+ "slack-history-unavailable",
13
+ "slack-fresh-install",
14
+ "slack-bounds",
15
+ "slack-open-member-bound",
16
+ "slack-open-long-handles",
17
+ "slack-thread-many-repliers",
18
+ "slack-response-budget",
19
+ "slack-ts-sequence-full"
20
+ ]
21
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "history-unavailable",
4
+ "title": "conversations.history and search.messages return HTTP 503 while other reads work",
5
+ "faults": [
6
+ {
7
+ "packageId": "slack",
8
+ "faultId": "history-unavailable"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,263 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "open-long-handles",
4
+ "title": "Eight extra members with 21-character handles: group DMs whose plain mpdm name would exceed 80 characters get a bounded, distinct name",
5
+ "state": [
6
+ {
7
+ "action": "upsert",
8
+ "packageId": "slack",
9
+ "namespace": "users",
10
+ "rowId": "U01LONG0001",
11
+ "value": {
12
+ "id": "U01LONG0001",
13
+ "team_id": "T01EXAMPLE0",
14
+ "name": "longhandle1xxxxxxxxxx",
15
+ "real_name": "Long Handle 1",
16
+ "deleted": false,
17
+ "is_bot": false,
18
+ "is_admin": false,
19
+ "is_owner": false,
20
+ "tz": "America/New_York",
21
+ "tz_label": "Eastern Daylight Time",
22
+ "tz_offset": -14400,
23
+ "updated": 1787126400,
24
+ "profile": {
25
+ "real_name": "Long Handle 1",
26
+ "display_name": "longhandle1xxxxxxxxxx",
27
+ "first_name": "Long",
28
+ "last_name": "Handle 1",
29
+ "title": "Engineer",
30
+ "status_text": "",
31
+ "status_emoji": "",
32
+ "image_24": "",
33
+ "image_72": "",
34
+ "email": "long.handle1@example.test"
35
+ }
36
+ }
37
+ },
38
+ {
39
+ "action": "upsert",
40
+ "packageId": "slack",
41
+ "namespace": "users",
42
+ "rowId": "U01LONG0002",
43
+ "value": {
44
+ "id": "U01LONG0002",
45
+ "team_id": "T01EXAMPLE0",
46
+ "name": "longhandle2xxxxxxxxxx",
47
+ "real_name": "Long Handle 2",
48
+ "deleted": false,
49
+ "is_bot": false,
50
+ "is_admin": false,
51
+ "is_owner": false,
52
+ "tz": "America/New_York",
53
+ "tz_label": "Eastern Daylight Time",
54
+ "tz_offset": -14400,
55
+ "updated": 1787126400,
56
+ "profile": {
57
+ "real_name": "Long Handle 2",
58
+ "display_name": "longhandle2xxxxxxxxxx",
59
+ "first_name": "Long",
60
+ "last_name": "Handle 2",
61
+ "title": "Engineer",
62
+ "status_text": "",
63
+ "status_emoji": "",
64
+ "image_24": "",
65
+ "image_72": "",
66
+ "email": "long.handle2@example.test"
67
+ }
68
+ }
69
+ },
70
+ {
71
+ "action": "upsert",
72
+ "packageId": "slack",
73
+ "namespace": "users",
74
+ "rowId": "U01LONG0003",
75
+ "value": {
76
+ "id": "U01LONG0003",
77
+ "team_id": "T01EXAMPLE0",
78
+ "name": "longhandle3xxxxxxxxxx",
79
+ "real_name": "Long Handle 3",
80
+ "deleted": false,
81
+ "is_bot": false,
82
+ "is_admin": false,
83
+ "is_owner": false,
84
+ "tz": "America/New_York",
85
+ "tz_label": "Eastern Daylight Time",
86
+ "tz_offset": -14400,
87
+ "updated": 1787126400,
88
+ "profile": {
89
+ "real_name": "Long Handle 3",
90
+ "display_name": "longhandle3xxxxxxxxxx",
91
+ "first_name": "Long",
92
+ "last_name": "Handle 3",
93
+ "title": "Engineer",
94
+ "status_text": "",
95
+ "status_emoji": "",
96
+ "image_24": "",
97
+ "image_72": "",
98
+ "email": "long.handle3@example.test"
99
+ }
100
+ }
101
+ },
102
+ {
103
+ "action": "upsert",
104
+ "packageId": "slack",
105
+ "namespace": "users",
106
+ "rowId": "U01LONG0004",
107
+ "value": {
108
+ "id": "U01LONG0004",
109
+ "team_id": "T01EXAMPLE0",
110
+ "name": "longhandle4xxxxxxxxxx",
111
+ "real_name": "Long Handle 4",
112
+ "deleted": false,
113
+ "is_bot": false,
114
+ "is_admin": false,
115
+ "is_owner": false,
116
+ "tz": "America/New_York",
117
+ "tz_label": "Eastern Daylight Time",
118
+ "tz_offset": -14400,
119
+ "updated": 1787126400,
120
+ "profile": {
121
+ "real_name": "Long Handle 4",
122
+ "display_name": "longhandle4xxxxxxxxxx",
123
+ "first_name": "Long",
124
+ "last_name": "Handle 4",
125
+ "title": "Engineer",
126
+ "status_text": "",
127
+ "status_emoji": "",
128
+ "image_24": "",
129
+ "image_72": "",
130
+ "email": "long.handle4@example.test"
131
+ }
132
+ }
133
+ },
134
+ {
135
+ "action": "upsert",
136
+ "packageId": "slack",
137
+ "namespace": "users",
138
+ "rowId": "U01LONG0005",
139
+ "value": {
140
+ "id": "U01LONG0005",
141
+ "team_id": "T01EXAMPLE0",
142
+ "name": "longhandle5xxxxxxxxxx",
143
+ "real_name": "Long Handle 5",
144
+ "deleted": false,
145
+ "is_bot": false,
146
+ "is_admin": false,
147
+ "is_owner": false,
148
+ "tz": "America/New_York",
149
+ "tz_label": "Eastern Daylight Time",
150
+ "tz_offset": -14400,
151
+ "updated": 1787126400,
152
+ "profile": {
153
+ "real_name": "Long Handle 5",
154
+ "display_name": "longhandle5xxxxxxxxxx",
155
+ "first_name": "Long",
156
+ "last_name": "Handle 5",
157
+ "title": "Engineer",
158
+ "status_text": "",
159
+ "status_emoji": "",
160
+ "image_24": "",
161
+ "image_72": "",
162
+ "email": "long.handle5@example.test"
163
+ }
164
+ }
165
+ },
166
+ {
167
+ "action": "upsert",
168
+ "packageId": "slack",
169
+ "namespace": "users",
170
+ "rowId": "U01LONG0006",
171
+ "value": {
172
+ "id": "U01LONG0006",
173
+ "team_id": "T01EXAMPLE0",
174
+ "name": "longhandle6xxxxxxxxxx",
175
+ "real_name": "Long Handle 6",
176
+ "deleted": false,
177
+ "is_bot": false,
178
+ "is_admin": false,
179
+ "is_owner": false,
180
+ "tz": "America/New_York",
181
+ "tz_label": "Eastern Daylight Time",
182
+ "tz_offset": -14400,
183
+ "updated": 1787126400,
184
+ "profile": {
185
+ "real_name": "Long Handle 6",
186
+ "display_name": "longhandle6xxxxxxxxxx",
187
+ "first_name": "Long",
188
+ "last_name": "Handle 6",
189
+ "title": "Engineer",
190
+ "status_text": "",
191
+ "status_emoji": "",
192
+ "image_24": "",
193
+ "image_72": "",
194
+ "email": "long.handle6@example.test"
195
+ }
196
+ }
197
+ },
198
+ {
199
+ "action": "upsert",
200
+ "packageId": "slack",
201
+ "namespace": "users",
202
+ "rowId": "U01LONG0007",
203
+ "value": {
204
+ "id": "U01LONG0007",
205
+ "team_id": "T01EXAMPLE0",
206
+ "name": "longhandle7xxxxxxxxxx",
207
+ "real_name": "Long Handle 7",
208
+ "deleted": false,
209
+ "is_bot": false,
210
+ "is_admin": false,
211
+ "is_owner": false,
212
+ "tz": "America/New_York",
213
+ "tz_label": "Eastern Daylight Time",
214
+ "tz_offset": -14400,
215
+ "updated": 1787126400,
216
+ "profile": {
217
+ "real_name": "Long Handle 7",
218
+ "display_name": "longhandle7xxxxxxxxxx",
219
+ "first_name": "Long",
220
+ "last_name": "Handle 7",
221
+ "title": "Engineer",
222
+ "status_text": "",
223
+ "status_emoji": "",
224
+ "image_24": "",
225
+ "image_72": "",
226
+ "email": "long.handle7@example.test"
227
+ }
228
+ }
229
+ },
230
+ {
231
+ "action": "upsert",
232
+ "packageId": "slack",
233
+ "namespace": "users",
234
+ "rowId": "U01LONG0008",
235
+ "value": {
236
+ "id": "U01LONG0008",
237
+ "team_id": "T01EXAMPLE0",
238
+ "name": "longhandle8xxxxxxxxxx",
239
+ "real_name": "Long Handle 8",
240
+ "deleted": false,
241
+ "is_bot": false,
242
+ "is_admin": false,
243
+ "is_owner": false,
244
+ "tz": "America/New_York",
245
+ "tz_label": "Eastern Daylight Time",
246
+ "tz_offset": -14400,
247
+ "updated": 1787126400,
248
+ "profile": {
249
+ "real_name": "Long Handle 8",
250
+ "display_name": "longhandle8xxxxxxxxxx",
251
+ "first_name": "Long",
252
+ "last_name": "Handle 8",
253
+ "title": "Engineer",
254
+ "status_text": "",
255
+ "status_emoji": "",
256
+ "image_24": "",
257
+ "image_72": "",
258
+ "email": "long.handle8@example.test"
259
+ }
260
+ }
261
+ }
262
+ ]
263
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "open-member-bound",
4
+ "title": "The workspace row limits every conversation to 2 members: conversations.open refuses a three-person group DM before allocating an id, then a two-person IM and a new channel get the next ids",
5
+ "state": [
6
+ {
7
+ "action": "upsert",
8
+ "packageId": "slack",
9
+ "namespace": "workspace",
10
+ "rowId": "team",
11
+ "value": {
12
+ "id": "T01EXAMPLE0",
13
+ "name": "Example Team",
14
+ "domain": "example-team",
15
+ "url": "https://example-team.slack.com/",
16
+ "id_sequence": 50,
17
+ "message_sequence": 300,
18
+ "limits": {
19
+ "members": 2
20
+ }
21
+ }
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "post-rate-limited",
4
+ "title": "Posting, replying and editing are rate limited (HTTP 429 + Retry-After) while reads and reactions work",
5
+ "faults": [
6
+ {
7
+ "packageId": "slack",
8
+ "faultId": "post-rate-limited"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "response-budget",
4
+ "title": "A 4,000-byte response budget (workspace.limits.response_bytes): lists and reads page by encoded bytes, one oversized message answers response_too_large",
5
+ "state": [
6
+ {
7
+ "action": "upsert",
8
+ "packageId": "slack",
9
+ "namespace": "workspace",
10
+ "rowId": "team",
11
+ "value": {
12
+ "id": "T01EXAMPLE0",
13
+ "name": "Example Team",
14
+ "domain": "example-team",
15
+ "url": "https://example-team.slack.com/",
16
+ "id_sequence": 50,
17
+ "message_sequence": 300,
18
+ "limits": {
19
+ "response_bytes": 4000
20
+ }
21
+ }
22
+ }
23
+ ]
24
+ }