@fourier-labs/harbour-contracts 0.71.0 → 0.73.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.
Files changed (34) hide show
  1. package/contract-release.json +26 -24
  2. package/dist/gen-ts/app-integrations-declaration.d.ts +29 -20
  3. package/dist/gen-ts/contract-release.d.ts +6 -6
  4. package/dist/gen-ts/contract-release.js +6 -6
  5. package/dist/gen-ts/data-grant-v2.d.ts +2 -2
  6. package/dist/gen-ts/deployment-app-registration.d.ts +1 -1
  7. package/dist/gen-ts/deployment-preview-retirement.d.ts +1 -1
  8. package/dist/gen-ts/index.d.ts +1 -0
  9. package/dist/gen-ts/index.js +1 -0
  10. package/dist/gen-ts/integration-execute-input-rules.d.ts +35 -0
  11. package/dist/gen-ts/integration-execute-input-rules.js +15 -0
  12. package/dist/gen-ts/integration-execute-request.d.ts +16 -2
  13. package/dist/gen-ts/integration-execute-result.d.ts +5 -0
  14. package/dist/gen-ts/integration-operations.d.ts +94 -0
  15. package/dist/gen-ts/integration-operations.js +126 -0
  16. package/dist/gen-ts/saas-connection.d.ts +2 -2
  17. package/gen-ts/app-integrations-declaration.ts +29 -20
  18. package/gen-ts/contract-release.ts +6 -6
  19. package/gen-ts/data-grant-v2.ts +2 -1
  20. package/gen-ts/deployment-app-registration.ts +1 -1
  21. package/gen-ts/deployment-preview-retirement.ts +1 -1
  22. package/gen-ts/index.ts +1 -0
  23. package/gen-ts/integration-execute-input-rules.ts +15 -0
  24. package/gen-ts/integration-execute-request.ts +17 -2
  25. package/gen-ts/integration-execute-result.ts +5 -0
  26. package/gen-ts/integration-operations.ts +127 -0
  27. package/gen-ts/saas-connection.ts +2 -1
  28. package/package.json +1 -1
  29. package/schema/app-integrations-declaration.schema.json +478 -67
  30. package/schema/deployment-app-registration.schema.json +1 -1
  31. package/schema/deployment-preview-retirement.schema.json +1 -1
  32. package/schema/integration-execute-request.schema.json +884 -120
  33. package/schema/integration-execute-result.schema.json +505 -82
  34. package/schema/saas-connection.schema.json +1 -1
@@ -2,160 +2,583 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/integration-execute-result.schema.json",
4
4
  "title": "IntegrationExecuteResult",
5
- "description": "The `data` member of a successful execute response `{data, requestId}`; the SDK unwraps `data`. Exactly one of the operation results (twelve operations since 0.71.0, ADR 0018): slack.channel.history -> {messages, hasMore, nextCursor?} (plain text/IDs/time, plus the display name and emoji icon a per-app-named app post carries — authorName/authorIcon, 0.55.0 — never the provider payload; `nextCursor` when hasMore, to pass as the next read's `cursor`); slack.message.post, slack.message.update, slack.message.delete -> {messageId} (the Slack ts); slack.dm.send -> {messageId, channelId} (the ts and the DM channel it went to); slack.user.lookup -> {userId, displayName}; gmail.thread.list -> {threads, hasMore, nextPageToken?} (newest matching threads; each `messageId` is the thread's newest message, what gmail.message.read takes; `nextPageToken` when hasMore); gmail.thread.read -> {id, emails} (every message of the thread, oldest first, each shaped like a gmail.message.read result); gmail.message.read -> {id, threadId, subject, from, to, date, text, truncated, attachments?} (headers plus the plain text with html stripped, cut at 16 KiB with `truncated` set; `attachments` lists the files without their bytes, which gmail.attachment.read fetches by id); gmail.attachment.read -> {filename, mimeType, size, dataBase64}; gmail.message.send -> {messageId, threadId} (the Gmail ids of the sent message and its thread); warehouse.view.read -> {rows, truncated} (rows keyed by the selected columns, or for an aggregate read by the groupBy columns then the aggregate aliases; decimal/64-bit values as strings, dates as ISO strings; since 0.70.0 every server sends `truncated`, true when more rows matched than `limit` — the server reads limit+1 rows to know — so the rows are incomplete and must not be totalled or averaged; a server before 0.70.0 omitted it). An unknown send outcome is never a result; it is an error with details.code SEND_OUTCOME_UNKNOWN. A whole result over 1 MiB is rejected, never cut down to fit — except a gmail.attachment.read, whose single attachment is bounded by its own 2 MiB.",
5
+ "description": "The `data` member of a successful execute response `{data, requestId}`; the SDK unwraps `data`. Exactly one of the operation results (twelve operations since 0.71.0, ADR 0018): slack.channel.history -> {messages, hasMore, nextCursor?} (plain text/IDs/time, plus the display name and emoji icon a per-app-named app post carries \u2014 authorName/authorIcon, 0.55.0 \u2014 never the provider payload; `nextCursor` when hasMore, to pass as the next read's `cursor`); slack.message.post, slack.message.update, slack.message.delete -> {messageId} (the Slack ts); slack.dm.send -> {messageId, channelId} (the ts and the DM channel it went to); slack.user.lookup -> {userId, displayName}; gmail.thread.list -> {threads, hasMore, nextPageToken?} (newest matching threads; each `messageId` is the thread's newest message, what gmail.message.read takes; `nextPageToken` when hasMore); gmail.thread.read -> {id, emails} (every message of the thread, oldest first, each shaped like a gmail.message.read result); gmail.message.read -> {id, threadId, subject, from, to, date, text, truncated, attachments?} (headers plus the plain text with html stripped, cut at 16 KiB with `truncated` set; `attachments` lists the files without their bytes, which gmail.attachment.read fetches by id); gmail.attachment.read -> {filename, mimeType, size, dataBase64}; gmail.message.send -> {messageId, threadId} (the Gmail ids of the sent message and its thread); warehouse.view.read -> {rows, truncated} (rows keyed by the selected columns, or for an aggregate read by the groupBy columns then the aggregate aliases; decimal/64-bit values as strings, dates as ISO strings; since 0.70.0 every server sends `truncated`, true when more rows matched than `limit` \u2014 the server reads limit+1 rows to know \u2014 so the rows are incomplete and must not be totalled or averaged; a server before 0.70.0 omitted it). An unknown send outcome is never a result; it is an error with details.code SEND_OUTCOME_UNKNOWN. A whole result over 1 MiB is rejected, never cut down to fit \u2014 except a gmail.attachment.read, whose single attachment is bounded by its own 2 MiB.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "properties": {
9
9
  "messages": {
10
10
  "type": "array",
11
11
  "maxItems": 100,
12
- "items": { "$ref": "#/definitions/ChannelMessage" }
13
- },
14
- "hasMore": { "type": "boolean" },
15
- "nextCursor": { "type": "string", "minLength": 1, "maxLength": 256, "description": "slack.channel.history (0.71.0): the cursor of the next (older) page, present only when hasMore." },
16
- "messageId": { "type": "string", "minLength": 1, "maxLength": 128 },
17
- "channelId": { "type": "string", "pattern": "^[A-Z0-9]{5,20}$", "description": "slack.dm.send (0.71.0): the Slack DM channel id the message went to." },
18
- "userId": { "type": "string", "minLength": 1, "maxLength": 128, "description": "slack.user.lookup (0.71.0): the Slack user id of the member with that email." },
19
- "displayName": { "type": "string", "maxLength": 256, "description": "slack.user.lookup (0.71.0): the member's display name, or real name when they set no display name; may be empty." },
12
+ "items": {
13
+ "$ref": "#/definitions/ChannelMessage"
14
+ }
15
+ },
16
+ "hasMore": {
17
+ "type": "boolean"
18
+ },
19
+ "nextCursor": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "maxLength": 256,
23
+ "description": "slack.channel.history (0.71.0): the cursor of the next (older) page, present only when hasMore."
24
+ },
25
+ "messageId": {
26
+ "type": "string",
27
+ "minLength": 1,
28
+ "maxLength": 128
29
+ },
30
+ "channelId": {
31
+ "type": "string",
32
+ "pattern": "^[A-Z0-9]{5,20}$",
33
+ "description": "slack.dm.send (0.71.0): the Slack DM channel id the message went to."
34
+ },
35
+ "userId": {
36
+ "type": "string",
37
+ "minLength": 1,
38
+ "maxLength": 128,
39
+ "description": "slack.user.lookup (0.71.0): the Slack user id of the member with that email."
40
+ },
41
+ "displayName": {
42
+ "type": "string",
43
+ "maxLength": 256,
44
+ "description": "slack.user.lookup (0.71.0): the member's display name, or real name when they set no display name; may be empty."
45
+ },
20
46
  "threads": {
21
47
  "type": "array",
22
48
  "maxItems": 50,
23
- "items": { "$ref": "#/definitions/GmailThread" }
24
- },
25
- "nextPageToken": { "type": "string", "minLength": 1, "maxLength": 256, "description": "gmail.thread.list (0.71.0): the token of the next page, present only when hasMore." },
26
- "id": { "type": "string", "minLength": 1, "maxLength": 128 },
27
- "threadId": { "type": "string", "minLength": 1, "maxLength": 128 },
28
- "subject": { "type": "string", "maxLength": 2048 },
29
- "from": { "type": "string", "maxLength": 2048 },
30
- "to": { "type": "string", "maxLength": 8192 },
31
- "date": { "type": "string", "maxLength": 128 },
32
- "text": { "type": "string", "maxLength": 16384 },
33
- "truncated": { "type": "boolean", "description": "gmail.message.read: the text was cut at 16 KiB. warehouse.view.read (0.70.0): more rows matched than the read's limit, so `rows` is incomplete." },
49
+ "items": {
50
+ "$ref": "#/definitions/GmailThread"
51
+ }
52
+ },
53
+ "nextPageToken": {
54
+ "type": "string",
55
+ "minLength": 1,
56
+ "maxLength": 256,
57
+ "description": "gmail.thread.list (0.71.0): the token of the next page, present only when hasMore."
58
+ },
59
+ "id": {
60
+ "type": "string",
61
+ "minLength": 1,
62
+ "maxLength": 128
63
+ },
64
+ "threadId": {
65
+ "type": "string",
66
+ "minLength": 1,
67
+ "maxLength": 128
68
+ },
69
+ "subject": {
70
+ "type": "string",
71
+ "maxLength": 2048
72
+ },
73
+ "from": {
74
+ "type": "string",
75
+ "maxLength": 2048
76
+ },
77
+ "to": {
78
+ "type": "string",
79
+ "maxLength": 8192
80
+ },
81
+ "date": {
82
+ "type": "string",
83
+ "maxLength": 128
84
+ },
85
+ "text": {
86
+ "type": "string",
87
+ "maxLength": 16384
88
+ },
89
+ "truncated": {
90
+ "type": "boolean",
91
+ "description": "gmail.message.read: the text was cut at 16 KiB. warehouse.view.read (0.70.0): more rows matched than the read's limit, so `rows` is incomplete."
92
+ },
34
93
  "attachments": {
35
94
  "type": "array",
36
95
  "maxItems": 100,
37
- "items": { "$ref": "#/definitions/GmailAttachment" },
96
+ "items": {
97
+ "$ref": "#/definitions/GmailAttachment"
98
+ },
38
99
  "description": "gmail.message.read (0.71.0): the message's attachments, without their bytes."
39
100
  },
40
101
  "emails": {
41
102
  "type": "array",
42
103
  "maxItems": 100,
43
- "items": { "$ref": "#/definitions/GmailMessage" },
104
+ "items": {
105
+ "$ref": "#/definitions/GmailMessage"
106
+ },
44
107
  "description": "gmail.thread.read (0.71.0): every message of the thread, oldest first."
45
108
  },
46
- "filename": { "type": "string", "minLength": 1, "maxLength": 255 },
47
- "mimeType": { "type": "string", "minLength": 1, "maxLength": 128 },
48
- "size": { "type": "integer", "minimum": 0, "description": "gmail.attachment.read (0.71.0): the attachment's size in bytes." },
49
- "dataBase64": { "type": "string", "maxLength": 2796203, "description": "gmail.attachment.read (0.71.0): the attachment's bytes, standard base64, at most 2 MiB of bytes." },
109
+ "filename": {
110
+ "type": "string",
111
+ "minLength": 1,
112
+ "maxLength": 255
113
+ },
114
+ "mimeType": {
115
+ "type": "string",
116
+ "minLength": 1,
117
+ "maxLength": 128
118
+ },
119
+ "size": {
120
+ "type": "integer",
121
+ "minimum": 0,
122
+ "description": "gmail.attachment.read (0.71.0): the attachment's size in bytes."
123
+ },
124
+ "dataBase64": {
125
+ "type": "string",
126
+ "maxLength": 2796203,
127
+ "description": "gmail.attachment.read (0.71.0): the attachment's bytes, standard base64, at most 2 MiB of bytes."
128
+ },
50
129
  "rows": {
51
130
  "type": "array",
52
131
  "maxItems": 1000,
53
- "items": { "type": "object", "additionalProperties": {}, "description": "One row keyed by the selected column names, or by the groupBy columns then the aggregate aliases." }
54
- }
132
+ "items": {
133
+ "type": "object",
134
+ "additionalProperties": {},
135
+ "description": "One row keyed by the selected column names, or by the groupBy columns then the aggregate aliases."
136
+ }
137
+ },
138
+ "status": {
139
+ "type": "integer"
140
+ },
141
+ "headers": {
142
+ "type": "object",
143
+ "additionalProperties": {
144
+ "type": "string"
145
+ }
146
+ },
147
+ "body": {}
55
148
  },
56
149
  "oneOf": [
57
- { "required": ["messages", "hasMore"], "propertyNames": { "enum": ["messages", "hasMore", "nextCursor"] } },
58
- { "required": ["messageId"], "maxProperties": 1 },
59
- { "required": ["messageId", "threadId"], "maxProperties": 2 },
60
- { "required": ["messageId", "channelId"], "maxProperties": 2 },
61
- { "required": ["userId", "displayName"], "maxProperties": 2 },
62
- { "required": ["threads", "hasMore"], "propertyNames": { "enum": ["threads", "hasMore", "nextPageToken"] } },
63
- { "required": ["id", "emails"], "maxProperties": 2 },
64
- { "required": ["id", "threadId", "subject", "from", "to", "date", "text", "truncated"], "propertyNames": { "enum": ["id", "threadId", "subject", "from", "to", "date", "text", "truncated", "attachments"] } },
65
- { "required": ["filename", "mimeType", "size", "dataBase64"], "maxProperties": 4 },
66
- { "required": ["rows"], "propertyNames": { "enum": ["rows", "truncated"] } }
150
+ {
151
+ "required": [
152
+ "messages",
153
+ "hasMore"
154
+ ],
155
+ "propertyNames": {
156
+ "enum": [
157
+ "messages",
158
+ "hasMore",
159
+ "nextCursor"
160
+ ]
161
+ }
162
+ },
163
+ {
164
+ "required": [
165
+ "messageId"
166
+ ],
167
+ "maxProperties": 1
168
+ },
169
+ {
170
+ "required": [
171
+ "messageId",
172
+ "threadId"
173
+ ],
174
+ "maxProperties": 2
175
+ },
176
+ {
177
+ "required": [
178
+ "messageId",
179
+ "channelId"
180
+ ],
181
+ "maxProperties": 2
182
+ },
183
+ {
184
+ "required": [
185
+ "userId",
186
+ "displayName"
187
+ ],
188
+ "maxProperties": 2
189
+ },
190
+ {
191
+ "required": [
192
+ "threads",
193
+ "hasMore"
194
+ ],
195
+ "propertyNames": {
196
+ "enum": [
197
+ "threads",
198
+ "hasMore",
199
+ "nextPageToken"
200
+ ]
201
+ }
202
+ },
203
+ {
204
+ "required": [
205
+ "id",
206
+ "emails"
207
+ ],
208
+ "maxProperties": 2
209
+ },
210
+ {
211
+ "required": [
212
+ "id",
213
+ "threadId",
214
+ "subject",
215
+ "from",
216
+ "to",
217
+ "date",
218
+ "text",
219
+ "truncated"
220
+ ],
221
+ "propertyNames": {
222
+ "enum": [
223
+ "id",
224
+ "threadId",
225
+ "subject",
226
+ "from",
227
+ "to",
228
+ "date",
229
+ "text",
230
+ "truncated",
231
+ "attachments"
232
+ ]
233
+ }
234
+ },
235
+ {
236
+ "required": [
237
+ "filename",
238
+ "mimeType",
239
+ "size",
240
+ "dataBase64"
241
+ ],
242
+ "maxProperties": 4
243
+ },
244
+ {
245
+ "required": [
246
+ "rows"
247
+ ],
248
+ "propertyNames": {
249
+ "enum": [
250
+ "rows",
251
+ "truncated"
252
+ ]
253
+ }
254
+ }
67
255
  ],
68
256
  "definitions": {
69
257
  "GmailAttachment": {
70
258
  "type": "object",
71
259
  "additionalProperties": false,
72
- "required": ["id", "filename", "mimeType", "size"],
260
+ "required": [
261
+ "id",
262
+ "filename",
263
+ "mimeType",
264
+ "size"
265
+ ],
73
266
  "description": "One attachment of a Gmail message (0.71.0), named without its bytes; gmail.attachment.read fetches them by `id`.",
74
267
  "properties": {
75
- "id": { "type": "string", "minLength": 1, "maxLength": 512 },
76
- "filename": { "type": "string", "maxLength": 255 },
77
- "mimeType": { "type": "string", "maxLength": 128 },
78
- "size": { "type": "integer", "minimum": 0, "description": "Bytes." }
268
+ "id": {
269
+ "type": "string",
270
+ "minLength": 1,
271
+ "maxLength": 512
272
+ },
273
+ "filename": {
274
+ "type": "string",
275
+ "maxLength": 255
276
+ },
277
+ "mimeType": {
278
+ "type": "string",
279
+ "maxLength": 128
280
+ },
281
+ "size": {
282
+ "type": "integer",
283
+ "minimum": 0,
284
+ "description": "Bytes."
285
+ }
79
286
  }
80
287
  },
81
288
  "GmailMessage": {
82
289
  "type": "object",
83
290
  "additionalProperties": false,
84
- "required": ["id", "threadId", "subject", "from", "to", "date", "text", "truncated"],
291
+ "required": [
292
+ "id",
293
+ "threadId",
294
+ "subject",
295
+ "from",
296
+ "to",
297
+ "date",
298
+ "text",
299
+ "truncated"
300
+ ],
85
301
  "description": "One message of a gmail.thread.read result (0.71.0): the gmail.message.read shape.",
86
302
  "properties": {
87
- "id": { "type": "string", "minLength": 1, "maxLength": 128 },
88
- "threadId": { "type": "string", "minLength": 1, "maxLength": 128 },
89
- "subject": { "type": "string", "maxLength": 2048 },
90
- "from": { "type": "string", "maxLength": 2048 },
91
- "to": { "type": "string", "maxLength": 8192 },
92
- "date": { "type": "string", "maxLength": 128 },
93
- "text": { "type": "string", "maxLength": 16384 },
94
- "truncated": { "type": "boolean" },
95
- "attachments": { "type": "array", "maxItems": 100, "items": { "$ref": "#/definitions/GmailAttachment" } }
303
+ "id": {
304
+ "type": "string",
305
+ "minLength": 1,
306
+ "maxLength": 128
307
+ },
308
+ "threadId": {
309
+ "type": "string",
310
+ "minLength": 1,
311
+ "maxLength": 128
312
+ },
313
+ "subject": {
314
+ "type": "string",
315
+ "maxLength": 2048
316
+ },
317
+ "from": {
318
+ "type": "string",
319
+ "maxLength": 2048
320
+ },
321
+ "to": {
322
+ "type": "string",
323
+ "maxLength": 8192
324
+ },
325
+ "date": {
326
+ "type": "string",
327
+ "maxLength": 128
328
+ },
329
+ "text": {
330
+ "type": "string",
331
+ "maxLength": 16384
332
+ },
333
+ "truncated": {
334
+ "type": "boolean"
335
+ },
336
+ "attachments": {
337
+ "type": "array",
338
+ "maxItems": 100,
339
+ "items": {
340
+ "$ref": "#/definitions/GmailAttachment"
341
+ }
342
+ }
96
343
  }
97
344
  },
98
345
  "GmailThread": {
99
346
  "type": "object",
100
347
  "additionalProperties": false,
101
- "required": ["id", "messageId", "subject", "from", "date", "snippet"],
348
+ "required": [
349
+ "id",
350
+ "messageId",
351
+ "subject",
352
+ "from",
353
+ "date",
354
+ "snippet"
355
+ ],
102
356
  "properties": {
103
- "id": { "type": "string", "minLength": 1, "maxLength": 128 },
104
- "messageId": { "type": "string", "minLength": 1, "maxLength": 128 },
105
- "subject": { "type": "string", "maxLength": 2048 },
106
- "from": { "type": "string", "maxLength": 2048 },
107
- "date": { "type": "string", "maxLength": 128 },
108
- "snippet": { "type": "string", "maxLength": 4096 }
357
+ "id": {
358
+ "type": "string",
359
+ "minLength": 1,
360
+ "maxLength": 128
361
+ },
362
+ "messageId": {
363
+ "type": "string",
364
+ "minLength": 1,
365
+ "maxLength": 128
366
+ },
367
+ "subject": {
368
+ "type": "string",
369
+ "maxLength": 2048
370
+ },
371
+ "from": {
372
+ "type": "string",
373
+ "maxLength": 2048
374
+ },
375
+ "date": {
376
+ "type": "string",
377
+ "maxLength": 128
378
+ },
379
+ "snippet": {
380
+ "type": "string",
381
+ "maxLength": 4096
382
+ }
109
383
  }
110
384
  },
111
385
  "ChannelMessage": {
112
386
  "type": "object",
113
387
  "additionalProperties": false,
114
- "required": ["id", "text", "authorId", "createdAt"],
388
+ "required": [
389
+ "id",
390
+ "text",
391
+ "authorId",
392
+ "createdAt"
393
+ ],
115
394
  "properties": {
116
- "id": { "type": "string", "minLength": 1, "maxLength": 128 },
117
- "text": { "type": "string", "maxLength": 40000 },
118
- "authorId": { "type": "string", "minLength": 1, "maxLength": 128 },
119
- "createdAt": { "type": "string", "format": "date-time" },
120
- "authorName": { "type": "string", "minLength": 1, "maxLength": 128, "description": "The display name a per-app-named app post carries (0.55.0; Slack's `username` on a customised bot message), so an app can recognise its own posts in a channel; absent on a person's message and on a post under the bot's own name." },
121
- "authorIcon": { "type": "string", "pattern": "^:[a-z0-9_+-]{1,60}:$", "description": "The emoji shortcode such a post carries as its icon (0.55.0), when it has one; never an image URL." }
395
+ "id": {
396
+ "type": "string",
397
+ "minLength": 1,
398
+ "maxLength": 128
399
+ },
400
+ "text": {
401
+ "type": "string",
402
+ "maxLength": 40000
403
+ },
404
+ "authorId": {
405
+ "type": "string",
406
+ "minLength": 1,
407
+ "maxLength": 128
408
+ },
409
+ "createdAt": {
410
+ "type": "string",
411
+ "format": "date-time"
412
+ },
413
+ "authorName": {
414
+ "type": "string",
415
+ "minLength": 1,
416
+ "maxLength": 128,
417
+ "description": "The display name a per-app-named app post carries (0.55.0; Slack's `username` on a customised bot message), so an app can recognise its own posts in a channel; absent on a person's message and on a post under the bot's own name."
418
+ },
419
+ "authorIcon": {
420
+ "type": "string",
421
+ "pattern": "^:[a-z0-9_+-]{1,60}:$",
422
+ "description": "The emoji shortcode such a post carries as its icon (0.55.0), when it has one; never an image URL."
423
+ }
122
424
  }
123
425
  }
124
426
  },
125
427
  "examples": [
126
428
  {
127
- "messages": [{ "id": "1725840000.000100", "text": "Shipped the weekly report.", "authorId": "U0123456", "createdAt": "2026-09-09T08:00:00Z" }],
429
+ "messages": [
430
+ {
431
+ "id": "1725840000.000100",
432
+ "text": "Shipped the weekly report.",
433
+ "authorId": "U0123456",
434
+ "createdAt": "2026-09-09T08:00:00Z"
435
+ }
436
+ ],
128
437
  "hasMore": false
129
438
  },
130
- { "messageId": "1725840100.000200" },
131
- { "messageId": "18f2c3a4b5d6e7f9", "threadId": "18f2c3a4b5d6e7f0" },
132
439
  {
133
- "threads": [{ "id": "18f2c3a4b5d6e7f0", "messageId": "18f2c3a4b5d6e7f8", "subject": "Weekly report", "from": "Jane <jane@example.com>", "date": "2026-09-11T08:00:00Z", "snippet": "Shipped the weekly report." }],
440
+ "messageId": "1725840100.000200"
441
+ },
442
+ {
443
+ "messageId": "18f2c3a4b5d6e7f9",
444
+ "threadId": "18f2c3a4b5d6e7f0"
445
+ },
446
+ {
447
+ "threads": [
448
+ {
449
+ "id": "18f2c3a4b5d6e7f0",
450
+ "messageId": "18f2c3a4b5d6e7f8",
451
+ "subject": "Weekly report",
452
+ "from": "Jane <jane@example.com>",
453
+ "date": "2026-09-11T08:00:00Z",
454
+ "snippet": "Shipped the weekly report."
455
+ }
456
+ ],
134
457
  "hasMore": false
135
458
  },
136
- { "id": "18f2c3a4b5d6e7f8", "threadId": "18f2c3a4b5d6e7f0", "subject": "Weekly report", "from": "Jane <jane@example.com>", "to": "team@example.com", "date": "2026-09-11T08:00:00Z", "text": "Shipped the weekly report.", "truncated": false },
137
- { "rows": [{ "week": "2026-W36", "total": "1234.50" }] },
138
- { "rows": [{ "region_code": "EMEA", "total_minor": "1234550", "invoices": "42" }, { "region_code": "APAC", "total_minor": "998000", "invoices": "17" }], "truncated": true },
139
459
  {
140
- "messages": [{ "id": "1725840000.000100", "text": "Shipped the weekly report.", "authorId": "U0123456", "createdAt": "2026-09-09T08:00:00Z" }],
460
+ "id": "18f2c3a4b5d6e7f8",
461
+ "threadId": "18f2c3a4b5d6e7f0",
462
+ "subject": "Weekly report",
463
+ "from": "Jane <jane@example.com>",
464
+ "to": "team@example.com",
465
+ "date": "2026-09-11T08:00:00Z",
466
+ "text": "Shipped the weekly report.",
467
+ "truncated": false
468
+ },
469
+ {
470
+ "rows": [
471
+ {
472
+ "week": "2026-W36",
473
+ "total": "1234.50"
474
+ }
475
+ ]
476
+ },
477
+ {
478
+ "rows": [
479
+ {
480
+ "region_code": "EMEA",
481
+ "total_minor": "1234550",
482
+ "invoices": "42"
483
+ },
484
+ {
485
+ "region_code": "APAC",
486
+ "total_minor": "998000",
487
+ "invoices": "17"
488
+ }
489
+ ],
490
+ "truncated": true
491
+ },
492
+ {
493
+ "messages": [
494
+ {
495
+ "id": "1725840000.000100",
496
+ "text": "Shipped the weekly report.",
497
+ "authorId": "U0123456",
498
+ "createdAt": "2026-09-09T08:00:00Z"
499
+ }
500
+ ],
141
501
  "hasMore": true,
142
502
  "nextCursor": "bmV4dF90czoxNzI1ODQwMDAwMDAwMTAw"
143
503
  },
144
- { "messageId": "1725840200.000300", "channelId": "D0123456DM" },
145
- { "userId": "U0123456", "displayName": "Jane Doe" },
146
504
  {
147
- "threads": [{ "id": "18f2c3a4b5d6e7f0", "messageId": "18f2c3a4b5d6e7f8", "subject": "Weekly report", "from": "Jane <jane@example.com>", "date": "2026-09-11T08:00:00Z", "snippet": "Shipped the weekly report." }],
505
+ "messageId": "1725840200.000300",
506
+ "channelId": "D0123456DM"
507
+ },
508
+ {
509
+ "userId": "U0123456",
510
+ "displayName": "Jane Doe"
511
+ },
512
+ {
513
+ "threads": [
514
+ {
515
+ "id": "18f2c3a4b5d6e7f0",
516
+ "messageId": "18f2c3a4b5d6e7f8",
517
+ "subject": "Weekly report",
518
+ "from": "Jane <jane@example.com>",
519
+ "date": "2026-09-11T08:00:00Z",
520
+ "snippet": "Shipped the weekly report."
521
+ }
522
+ ],
148
523
  "hasMore": true,
149
524
  "nextPageToken": "CAUQ0ZSH0b2DiwMg"
150
525
  },
151
526
  {
152
527
  "id": "18f2c3a4b5d6e7f0",
153
528
  "emails": [
154
- { "id": "18f2c3a4b5d6e7f7", "threadId": "18f2c3a4b5d6e7f0", "subject": "Weekly report", "from": "Jane <jane@example.com>", "to": "team@example.com", "date": "2026-09-10T08:00:00Z", "text": "Draft attached.", "truncated": false, "attachments": [{ "id": "ANGjdJ8w9h1Q2k3L4m5N6o7P8q9R0s", "filename": "weekly-report.pdf", "mimeType": "application/pdf", "size": 48213 }] },
155
- { "id": "18f2c3a4b5d6e7f8", "threadId": "18f2c3a4b5d6e7f0", "subject": "Re: Weekly report", "from": "Sam <sam@example.com>", "to": "team@example.com", "date": "2026-09-11T08:00:00Z", "text": "Shipped the weekly report.", "truncated": false }
529
+ {
530
+ "id": "18f2c3a4b5d6e7f7",
531
+ "threadId": "18f2c3a4b5d6e7f0",
532
+ "subject": "Weekly report",
533
+ "from": "Jane <jane@example.com>",
534
+ "to": "team@example.com",
535
+ "date": "2026-09-10T08:00:00Z",
536
+ "text": "Draft attached.",
537
+ "truncated": false,
538
+ "attachments": [
539
+ {
540
+ "id": "ANGjdJ8w9h1Q2k3L4m5N6o7P8q9R0s",
541
+ "filename": "weekly-report.pdf",
542
+ "mimeType": "application/pdf",
543
+ "size": 48213
544
+ }
545
+ ]
546
+ },
547
+ {
548
+ "id": "18f2c3a4b5d6e7f8",
549
+ "threadId": "18f2c3a4b5d6e7f0",
550
+ "subject": "Re: Weekly report",
551
+ "from": "Sam <sam@example.com>",
552
+ "to": "team@example.com",
553
+ "date": "2026-09-11T08:00:00Z",
554
+ "text": "Shipped the weekly report.",
555
+ "truncated": false
556
+ }
156
557
  ]
157
558
  },
158
- { "id": "18f2c3a4b5d6e7f7", "threadId": "18f2c3a4b5d6e7f0", "subject": "Weekly report", "from": "Jane <jane@example.com>", "to": "team@example.com", "date": "2026-09-10T08:00:00Z", "text": "Draft attached.", "truncated": false, "attachments": [{ "id": "ANGjdJ8w9h1Q2k3L4m5N6o7P8q9R0s", "filename": "weekly-report.pdf", "mimeType": "application/pdf", "size": 48213 }] },
159
- { "filename": "weekly-report.pdf", "mimeType": "application/pdf", "size": 20, "dataBase64": "JVBERi0xLjQKJcOkw7zDtsOfCg==" }
559
+ {
560
+ "id": "18f2c3a4b5d6e7f7",
561
+ "threadId": "18f2c3a4b5d6e7f0",
562
+ "subject": "Weekly report",
563
+ "from": "Jane <jane@example.com>",
564
+ "to": "team@example.com",
565
+ "date": "2026-09-10T08:00:00Z",
566
+ "text": "Draft attached.",
567
+ "truncated": false,
568
+ "attachments": [
569
+ {
570
+ "id": "ANGjdJ8w9h1Q2k3L4m5N6o7P8q9R0s",
571
+ "filename": "weekly-report.pdf",
572
+ "mimeType": "application/pdf",
573
+ "size": 48213
574
+ }
575
+ ]
576
+ },
577
+ {
578
+ "filename": "weekly-report.pdf",
579
+ "mimeType": "application/pdf",
580
+ "size": 20,
581
+ "dataBase64": "JVBERi0xLjQKJcOkw7zDtsOfCg=="
582
+ }
160
583
  ]
161
584
  }