@vercel/board 0.0.0 → 0.15.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 (126) hide show
  1. package/README.md +180 -0
  2. package/dist/a2-5EG8FkZ8.d.mts +3359 -0
  3. package/dist/a2-DYGYankn.mjs +3045 -0
  4. package/dist/access-CJU2-vaa.mjs +226 -0
  5. package/dist/access-CV96SYgr.d.mts +32 -0
  6. package/dist/access.d.mts +29 -0
  7. package/dist/access.mjs +4 -0
  8. package/dist/actors-rdN4dDTU.mjs +223 -0
  9. package/dist/attempts-BQUp9MKO.mjs +919 -0
  10. package/dist/auth-COzc09sn.mjs +276 -0
  11. package/dist/auth-wHFcAte3.d.mts +203 -0
  12. package/dist/backend-a2/blob-vercel.d.mts +8 -0
  13. package/dist/backend-a2/blob-vercel.mjs +81 -0
  14. package/dist/backend-a2/contract.d.mts +18 -0
  15. package/dist/backend-a2/contract.mjs +5 -0
  16. package/dist/backend-a2/scheduler-local.d.mts +11 -0
  17. package/dist/backend-a2/scheduler-local.mjs +2 -0
  18. package/dist/backend-a2/scheduler-qstash.d.mts +2 -0
  19. package/dist/backend-a2/scheduler-qstash.mjs +2 -0
  20. package/dist/backend-a2/scheduler-vercel.d.mts +2 -0
  21. package/dist/backend-a2/scheduler-vercel.mjs +2 -0
  22. package/dist/backend-a2/store-memory.d.mts +11 -0
  23. package/dist/backend-a2/store-memory.mjs +19 -0
  24. package/dist/backend-a2/store-postgres.d.mts +38 -0
  25. package/dist/backend-a2/store-postgres.mjs +110 -0
  26. package/dist/backend-a2/store-redis-http.d.mts +17 -0
  27. package/dist/backend-a2/store-redis-http.mjs +32 -0
  28. package/dist/backend-a2/store-redis.d.mts +23 -0
  29. package/dist/backend-a2/store-redis.mjs +39 -0
  30. package/dist/backend-a2/store-sqlite.d.mts +12 -0
  31. package/dist/backend-a2/store-sqlite.mjs +31 -0
  32. package/dist/backend-a2.d.mts +4 -0
  33. package/dist/backend-a2.mjs +2 -0
  34. package/dist/backend-http-8ex5g7Wv.d.mts +630 -0
  35. package/dist/backend-http-BsDSgmeo.mjs +613 -0
  36. package/dist/backend-http-Cv6xbEy9.mjs +469 -0
  37. package/dist/backend-http.d.mts +10 -0
  38. package/dist/backend-http.mjs +2 -0
  39. package/dist/backend-http.node.d.mts +10 -0
  40. package/dist/backend-http.node.mjs +2 -0
  41. package/dist/blob-C0J3wbGv.d.mts +39 -0
  42. package/dist/bots-CGkO76qH.mjs +67 -0
  43. package/dist/chat-provider-XCnQlxq6.d.mts +140 -0
  44. package/dist/chat-provider-jFSeyNmB.mjs +389 -0
  45. package/dist/cli.d.mts +1 -0
  46. package/dist/cli.mjs +2252 -0
  47. package/dist/client-DGDPaN7U.mjs +380 -0
  48. package/dist/conformance-DRR23YNy.mjs +512 -0
  49. package/dist/conformance.d.mts +30 -0
  50. package/dist/conformance.mjs +2 -0
  51. package/dist/contract-CuJmlrhw.mjs +566 -0
  52. package/dist/emoji-CTLpvH-A.mjs +445 -0
  53. package/dist/engine-3EvQ8idk.mjs +1449 -0
  54. package/dist/errors-DX3hpwWt.mjs +64 -0
  55. package/dist/exports-BpgyEdh6.d.mts +4 -0
  56. package/dist/exports-CyY3_FjZ.mjs +1285 -0
  57. package/dist/files-SniSmeEr.mjs +47 -0
  58. package/dist/index.d.mts +13 -0
  59. package/dist/index.default-BZ3lItjH.mjs +12 -0
  60. package/dist/index.mjs +19 -0
  61. package/dist/index.node.d.mts +14 -0
  62. package/dist/index.node.mjs +5 -0
  63. package/dist/inspect/app.js +416 -0
  64. package/dist/inspect/engine.js +5 -0
  65. package/dist/local-Cr_dSjvs.mjs +44 -0
  66. package/dist/own-OwgPWdmh.mjs +15 -0
  67. package/dist/project-CFiArraX.mjs +124 -0
  68. package/dist/provider-BGjz-mDa.d.mts +2473 -0
  69. package/dist/provider-CuewcDNZ.mjs +205 -0
  70. package/dist/redis-tables-B35vv4CZ.mjs +842 -0
  71. package/dist/reducers-B_vUGQRp.d.mts +1172 -0
  72. package/dist/reducers-mUPFuFJV.mjs +293 -0
  73. package/dist/schemas-Be08nyfW.mjs +74 -0
  74. package/dist/schemas-CWxs3ECJ.d.mts +50 -0
  75. package/dist/serve-Ccbb2LSb.mjs +170 -0
  76. package/dist/server-Cxey38B-.mjs +17 -0
  77. package/dist/serving-BNbzc96L.mjs +2 -0
  78. package/dist/sql-DbiEnqM0.mjs +571 -0
  79. package/dist/sqlite-db-Cbj03vmp.mjs +70 -0
  80. package/dist/sync-github.d.mts +473 -0
  81. package/dist/sync-github.mjs +603 -0
  82. package/dist/sync-kapso.d.mts +175 -0
  83. package/dist/sync-kapso.mjs +86 -0
  84. package/dist/sync-slack.d.mts +364 -0
  85. package/dist/sync-slack.mjs +728 -0
  86. package/dist/sync.chat.d.mts +2 -0
  87. package/dist/sync.chat.mjs +2 -0
  88. package/dist/sync.d.mts +3 -0
  89. package/dist/sync.mjs +4 -0
  90. package/dist/targets-ojFEXEyN.mjs +94 -0
  91. package/dist/tokens-DKLn5P9B.mjs +256 -0
  92. package/dist/types-BHCjTZdB.d.mts +104 -0
  93. package/dist/users-Dls7_ANV.mjs +42 -0
  94. package/dist/watch-spec-W0c7ypHJ.mjs +787 -0
  95. package/dist/watchers-hash-D9hbHLKB.mjs +225 -0
  96. package/docs/01-board/01-mounting.md +506 -0
  97. package/docs/01-board/02-database.md +258 -0
  98. package/docs/01-board/03-identity.md +262 -0
  99. package/docs/01-board/04-messages.md +192 -0
  100. package/docs/01-board/05-reading.md +177 -0
  101. package/docs/01-board/06-watchers.md +249 -0
  102. package/docs/01-board/07-schedules.md +133 -0
  103. package/docs/01-board/08-middleware.md +139 -0
  104. package/docs/01-board/09-access.md +499 -0
  105. package/docs/01-quickstart.md +196 -0
  106. package/docs/02-sync/01-overview.md +290 -0
  107. package/docs/02-sync/02-callbacks.md +265 -0
  108. package/docs/02-sync/03-slack.md +248 -0
  109. package/docs/02-sync/04-github.md +201 -0
  110. package/docs/02-sync/05-whatsapp.md +148 -0
  111. package/docs/02-sync/06-providers.md +228 -0
  112. package/docs/03-guides/01-coding-agents.md +226 -0
  113. package/docs/03-guides/02-inspector.md +104 -0
  114. package/docs/03-guides/03-ci.md +251 -0
  115. package/docs/03-guides/04-triage.md +233 -0
  116. package/docs/03-guides/05-agent-factory.md +142 -0
  117. package/docs/04-reference/01-cli.md +606 -0
  118. package/docs/04-reference/02-board.md +579 -0
  119. package/docs/04-reference/03-http.md +489 -0
  120. package/docs/04-reference/04-log.md +250 -0
  121. package/docs/04-reference/05-conformance.md +97 -0
  122. package/docs/index.md +186 -0
  123. package/package.json +168 -1
  124. package/sql/postgres/board.sql +145 -0
  125. package/sql/postgres/notifications.sql +24 -0
  126. package/sql/postgres/schema.sql +451 -0
@@ -0,0 +1,1172 @@
1
+ import { i as Attachment, o as Author, p as Labels, r as ActorKind } from "./schemas-CWxs3ECJ.mjs";
2
+ import { z } from "zod";
3
+ import { ContractEvent } from "experimental-a2";
4
+ //#region src/contract/contract.d.ts
5
+ /** Where a message came from on a platform. `thread` is grouped (GitHub review threads fold into their PR). */
6
+ declare const Origin: z.ZodObject<{
7
+ channel: z.ZodOptional<z.ZodString>;
8
+ thread: z.ZodString;
9
+ subthread: z.ZodNullable<z.ZodString>;
10
+ message: z.ZodString;
11
+ context: z.ZodNullable<z.ZodString>;
12
+ }, z.core.$strip>;
13
+ /**
14
+ * A platform message linked from a message (a Slack permalink): the board message
15
+ * it was synced to, if any, and a snapshot of it, or why the board couldn't read it.
16
+ */
17
+ declare const Link: z.ZodObject<{
18
+ url: z.ZodString;
19
+ message: z.ZodNullable<z.ZodNumber>;
20
+ snapshot: z.ZodNullable<z.ZodObject<{
21
+ author: z.ZodString;
22
+ text: z.ZodString;
23
+ createdAt: z.ZodNullable<z.ZodString>;
24
+ files: z.ZodArray<z.ZodObject<{
25
+ name: z.ZodString;
26
+ url: z.ZodNullable<z.ZodString>;
27
+ }, z.core.$strip>>;
28
+ }, z.core.$strip>>;
29
+ unavailable: z.ZodNullable<z.ZodString>;
30
+ }, z.core.$strip>;
31
+ type Link = z.infer<typeof Link>;
32
+ /** The board's one log. Every board fact is an event in session `board`. */
33
+ declare const boardContract: import("experimental-a2").Contract<{
34
+ 'message.posted': z.ZodObject<{
35
+ channel: z.ZodString;
36
+ text: z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"">]>;
37
+ re: z.ZodNullable<z.ZodNumber>;
38
+ replyTo: z.ZodNullable<z.ZodNumber>;
39
+ thread: z.ZodString;
40
+ labels: z.ZodRecord<z.ZodString, z.ZodString>;
41
+ noSync: z.ZodBoolean;
42
+ mentions: z.ZodArray<z.ZodString>;
43
+ by: z.ZodObject<{
44
+ actor: z.ZodString;
45
+ principal: z.ZodString;
46
+ profile: z.ZodNullable<z.ZodString>;
47
+ session: z.ZodNullable<z.ZodString>;
48
+ }, z.core.$strip>;
49
+ origin: z.ZodNullable<z.ZodObject<{
50
+ channel: z.ZodOptional<z.ZodString>;
51
+ thread: z.ZodString;
52
+ subthread: z.ZodNullable<z.ZodString>;
53
+ message: z.ZodString;
54
+ context: z.ZodNullable<z.ZodString>;
55
+ }, z.core.$strip>>;
56
+ from: z.ZodNullable<z.ZodString>;
57
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
58
+ id: z.ZodString;
59
+ name: z.ZodString;
60
+ type: z.ZodString;
61
+ size: z.ZodNumber;
62
+ }, z.core.$strip>>>;
63
+ links: z.ZodOptional<z.ZodArray<z.ZodObject<{
64
+ url: z.ZodString;
65
+ message: z.ZodNullable<z.ZodNumber>;
66
+ snapshot: z.ZodNullable<z.ZodObject<{
67
+ author: z.ZodString;
68
+ text: z.ZodString;
69
+ createdAt: z.ZodNullable<z.ZodString>;
70
+ files: z.ZodArray<z.ZodObject<{
71
+ name: z.ZodString;
72
+ url: z.ZodNullable<z.ZodString>;
73
+ }, z.core.$strip>>;
74
+ }, z.core.$strip>>;
75
+ unavailable: z.ZodNullable<z.ZodString>;
76
+ }, z.core.$strip>>>;
77
+ schedule: z.ZodOptional<z.ZodObject<{
78
+ id: z.ZodNumber;
79
+ n: z.ZodNumber;
80
+ }, z.core.$strip>>;
81
+ blind: z.ZodOptional<z.ZodLiteral<true>>;
82
+ importedBy: z.ZodOptional<z.ZodString>;
83
+ }, z.core.$strip>;
84
+ /** A message's links changed: an edit linked something new, or the platform sent what a link says. */
85
+ 'message.linked': z.ZodObject<{
86
+ id: z.ZodNumber;
87
+ thread: z.ZodString;
88
+ links: z.ZodArray<z.ZodObject<{
89
+ url: z.ZodString;
90
+ message: z.ZodNullable<z.ZodNumber>;
91
+ snapshot: z.ZodNullable<z.ZodObject<{
92
+ author: z.ZodString;
93
+ text: z.ZodString;
94
+ createdAt: z.ZodNullable<z.ZodString>;
95
+ files: z.ZodArray<z.ZodObject<{
96
+ name: z.ZodString;
97
+ url: z.ZodNullable<z.ZodString>;
98
+ }, z.core.$strip>>;
99
+ }, z.core.$strip>>;
100
+ unavailable: z.ZodNullable<z.ZodString>;
101
+ }, z.core.$strip>>;
102
+ by: z.ZodObject<{
103
+ actor: z.ZodString;
104
+ principal: z.ZodString;
105
+ profile: z.ZodNullable<z.ZodString>;
106
+ session: z.ZodNullable<z.ZodString>;
107
+ }, z.core.$strip>;
108
+ from: z.ZodNullable<z.ZodString>;
109
+ }, z.core.$strip>;
110
+ 'message.edited': z.ZodObject<{
111
+ id: z.ZodNumber;
112
+ thread: z.ZodString;
113
+ text: z.ZodString;
114
+ mentions: z.ZodArray<z.ZodString>;
115
+ by: z.ZodObject<{
116
+ actor: z.ZodString;
117
+ principal: z.ZodString;
118
+ profile: z.ZodNullable<z.ZodString>;
119
+ session: z.ZodNullable<z.ZodString>;
120
+ }, z.core.$strip>;
121
+ from: z.ZodNullable<z.ZodString>;
122
+ }, z.core.$strip>;
123
+ 'message.deleted': z.ZodObject<{
124
+ id: z.ZodNumber;
125
+ thread: z.ZodString;
126
+ by: z.ZodObject<{
127
+ actor: z.ZodString;
128
+ principal: z.ZodString;
129
+ profile: z.ZodNullable<z.ZodString>;
130
+ session: z.ZodNullable<z.ZodString>;
131
+ }, z.core.$strip>;
132
+ from: z.ZodNullable<z.ZodString>;
133
+ }, z.core.$strip>;
134
+ 'reaction.added': z.ZodObject<{
135
+ id: z.ZodNumber;
136
+ thread: z.ZodString;
137
+ emoji: z.ZodString;
138
+ by: z.ZodObject<{
139
+ actor: z.ZodString;
140
+ principal: z.ZodString;
141
+ profile: z.ZodNullable<z.ZodString>;
142
+ session: z.ZodNullable<z.ZodString>;
143
+ }, z.core.$strip>;
144
+ from: z.ZodNullable<z.ZodString>;
145
+ }, z.core.$strip>;
146
+ 'reaction.removed': z.ZodObject<{
147
+ id: z.ZodNumber;
148
+ thread: z.ZodString;
149
+ emoji: z.ZodString;
150
+ by: z.ZodObject<{
151
+ actor: z.ZodString;
152
+ principal: z.ZodString;
153
+ profile: z.ZodNullable<z.ZodString>;
154
+ session: z.ZodNullable<z.ZodString>;
155
+ }, z.core.$strip>;
156
+ from: z.ZodNullable<z.ZodString>;
157
+ }, z.core.$strip>;
158
+ 'labels.changed': z.ZodObject<{
159
+ id: z.ZodNumber;
160
+ thread: z.ZodString;
161
+ set: z.ZodRecord<z.ZodString, z.ZodString>;
162
+ unset: z.ZodArray<z.ZodString>;
163
+ by: z.ZodObject<{
164
+ actor: z.ZodString;
165
+ principal: z.ZodString;
166
+ profile: z.ZodNullable<z.ZodString>;
167
+ session: z.ZodNullable<z.ZodString>;
168
+ }, z.core.$strip>;
169
+ }, z.core.$strip>;
170
+ /** A thread is synced with an external channel (start a thread there) or thread (join it). */
171
+ 'thread.synced': z.ZodObject<{
172
+ thread: z.ZodString;
173
+ target: z.ZodString;
174
+ cause: z.ZodEnum<{
175
+ config: "config";
176
+ request: "request";
177
+ }>;
178
+ kind: z.ZodOptional<z.ZodEnum<{
179
+ channel: "channel";
180
+ thread: "thread";
181
+ }>>;
182
+ by: z.ZodObject<{
183
+ actor: z.ZodString;
184
+ principal: z.ZodString;
185
+ profile: z.ZodNullable<z.ZodString>;
186
+ session: z.ZodNullable<z.ZodString>;
187
+ }, z.core.$strip>;
188
+ }, z.core.$strip>;
189
+ /** An outbound delivery receipt: board message `id` exists on the platform as `external`. */
190
+ 'message.synced': z.ZodObject<{
191
+ id: z.ZodNumber;
192
+ thread: z.ZodString;
193
+ target: z.ZodString;
194
+ external: z.ZodObject<{
195
+ thread: z.ZodString;
196
+ message: z.ZodString;
197
+ asUser: z.ZodOptional<z.ZodLiteral<true>>;
198
+ }, z.core.$strip>;
199
+ syncedBy: z.ZodOptional<z.ZodString>;
200
+ }, z.core.$strip>;
201
+ /**
202
+ * Board message `id`'s files reached `target` after its text: `files` are the
203
+ * platform's IDs for them, or null when the platform refused files and the
204
+ * text got a line for each instead.
205
+ */
206
+ 'message.files_synced': z.ZodObject<{
207
+ id: z.ZodNumber;
208
+ thread: z.ZodString;
209
+ target: z.ZodString;
210
+ files: z.ZodNullable<z.ZodArray<z.ZodString>>;
211
+ syncedBy: z.ZodOptional<z.ZodString>;
212
+ }, z.core.$strip>;
213
+ /** A delivery that gave up: board message `id` didn't reach `target`, and `error` says why. */
214
+ 'message.sync_failed': z.ZodObject<{
215
+ id: z.ZodNumber;
216
+ thread: z.ZodString;
217
+ target: z.ZodString;
218
+ error: z.ZodString;
219
+ }, z.core.$strip>;
220
+ 'actor.seen': z.ZodObject<{
221
+ actor: z.ZodString;
222
+ kind: z.ZodUnion<readonly [z.ZodEnum<{
223
+ agent: "agent";
224
+ deployment: "deployment";
225
+ external: "external";
226
+ person: "person";
227
+ workflow: "workflow";
228
+ }>, z.ZodLiteral<"profile">]>;
229
+ handle: z.ZodString;
230
+ name: z.ZodString;
231
+ avatar: z.ZodNullable<z.ZodString>;
232
+ host: z.ZodOptional<z.ZodLiteral<true>>;
233
+ }, z.core.$strip>;
234
+ /**
235
+ * A platform actor (`slack:user:U0456`) is the same person as a principal
236
+ * (`vercel:user:…`): for display, `--by`, and mentions, never for permissions.
237
+ * `method` says how it was proved: a one-time code posted from that account,
238
+ * or the account's own sign-in (`consent`).
239
+ */
240
+ 'actor.linked': z.ZodObject<{
241
+ actor: z.ZodString;
242
+ to: z.ZodString;
243
+ method: z.ZodEnum<{
244
+ code: "code";
245
+ consent: "consent";
246
+ }>;
247
+ by: z.ZodObject<{
248
+ actor: z.ZodString;
249
+ principal: z.ZodString;
250
+ profile: z.ZodNullable<z.ZodString>;
251
+ session: z.ZodNullable<z.ZodString>;
252
+ }, z.core.$strip>;
253
+ }, z.core.$strip>;
254
+ 'actor.unlinked': z.ZodObject<{
255
+ actor: z.ZodString;
256
+ by: z.ZodObject<{
257
+ actor: z.ZodString;
258
+ principal: z.ZodString;
259
+ profile: z.ZodNullable<z.ZodString>;
260
+ session: z.ZodNullable<z.ZodString>;
261
+ }, z.core.$strip>;
262
+ }, z.core.$strip>;
263
+ }, Record<never, never>, undefined>;
264
+ declare const BOARD_SESSION = "board";
265
+ type BoardEvents = typeof boardContract.events;
266
+ type BoardEvent = ContractEvent<BoardEvents>;
267
+ type Origin = z.infer<typeof Origin>;
268
+ declare const ExternalAuthor: z.ZodObject<{
269
+ id: z.ZodString;
270
+ handle: z.ZodString;
271
+ name: z.ZodString;
272
+ avatar: z.ZodNullable<z.ZodString>;
273
+ isBot: z.ZodBoolean;
274
+ }, z.core.$strip>;
275
+ /**
276
+ * A file on a platform message, as Chat SDK describes it: enough for the
277
+ * platform's adapter to fetch it later (`rehydrateAttachment`), never the bytes.
278
+ */
279
+ declare const ExternalFile: z.ZodObject<{
280
+ type: z.ZodEnum<{
281
+ audio: "audio";
282
+ file: "file";
283
+ image: "image";
284
+ video: "video";
285
+ }>;
286
+ name: z.ZodOptional<z.ZodString>;
287
+ mimeType: z.ZodOptional<z.ZodString>;
288
+ size: z.ZodOptional<z.ZodNumber>;
289
+ url: z.ZodOptional<z.ZodString>;
290
+ fetchMetadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
291
+ }, z.core.$strip>;
292
+ type ExternalFile = z.infer<typeof ExternalFile>;
293
+ /**
294
+ * A platform message a platform message links to, at intake: where it lives
295
+ * (`thread`, with the sync key prefix, and `message`), and what it said when the
296
+ * platform sent that along (Slack's unfurl).
297
+ */
298
+ declare const ExternalLink: z.ZodObject<{
299
+ url: z.ZodString;
300
+ thread: z.ZodString;
301
+ message: z.ZodString;
302
+ snapshot: z.ZodNullable<z.ZodObject<{
303
+ author: z.ZodString;
304
+ text: z.ZodString;
305
+ createdAt: z.ZodNullable<z.ZodString>;
306
+ files: z.ZodArray<z.ZodObject<{
307
+ name: z.ZodString;
308
+ url: z.ZodNullable<z.ZodString>;
309
+ }, z.core.$strip>>;
310
+ }, z.core.$strip>>;
311
+ }, z.core.$strip>;
312
+ type ExternalLink = z.infer<typeof ExternalLink>;
313
+ /** A platform event, normalized at intake. Thread IDs are external IDs with the sync key prefix. */
314
+ declare const ExternalEvent: z.ZodDiscriminatedUnion<[z.ZodObject<{
315
+ channel: z.ZodString;
316
+ thread: z.ZodString;
317
+ subthread: z.ZodNullable<z.ZodString>;
318
+ kind: z.ZodLiteral<"message">;
319
+ message: z.ZodString;
320
+ isRoot: z.ZodBoolean;
321
+ text: z.ZodString;
322
+ context: z.ZodNullable<z.ZodString>;
323
+ author: z.ZodObject<{
324
+ id: z.ZodString;
325
+ handle: z.ZodString;
326
+ name: z.ZodString;
327
+ avatar: z.ZodNullable<z.ZodString>;
328
+ isBot: z.ZodBoolean;
329
+ }, z.core.$strip>;
330
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
331
+ type: z.ZodEnum<{
332
+ audio: "audio";
333
+ file: "file";
334
+ image: "image";
335
+ video: "video";
336
+ }>;
337
+ name: z.ZodOptional<z.ZodString>;
338
+ mimeType: z.ZodOptional<z.ZodString>;
339
+ size: z.ZodOptional<z.ZodNumber>;
340
+ url: z.ZodOptional<z.ZodString>;
341
+ fetchMetadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
342
+ }, z.core.$strip>>>;
343
+ links: z.ZodOptional<z.ZodArray<z.ZodObject<{
344
+ url: z.ZodString;
345
+ thread: z.ZodString;
346
+ message: z.ZodString;
347
+ snapshot: z.ZodNullable<z.ZodObject<{
348
+ author: z.ZodString;
349
+ text: z.ZodString;
350
+ createdAt: z.ZodNullable<z.ZodString>;
351
+ files: z.ZodArray<z.ZodObject<{
352
+ name: z.ZodString;
353
+ url: z.ZodNullable<z.ZodString>;
354
+ }, z.core.$strip>>;
355
+ }, z.core.$strip>>;
356
+ }, z.core.$strip>>>;
357
+ }, z.core.$strip>, z.ZodObject<{
358
+ channel: z.ZodString;
359
+ thread: z.ZodString;
360
+ subthread: z.ZodNullable<z.ZodString>;
361
+ kind: z.ZodLiteral<"edited">;
362
+ message: z.ZodString;
363
+ text: z.ZodString;
364
+ author: z.ZodObject<{
365
+ id: z.ZodString;
366
+ handle: z.ZodString;
367
+ name: z.ZodString;
368
+ avatar: z.ZodNullable<z.ZodString>;
369
+ isBot: z.ZodBoolean;
370
+ }, z.core.$strip>;
371
+ links: z.ZodOptional<z.ZodArray<z.ZodObject<{
372
+ url: z.ZodString;
373
+ thread: z.ZodString;
374
+ message: z.ZodString;
375
+ snapshot: z.ZodNullable<z.ZodObject<{
376
+ author: z.ZodString;
377
+ text: z.ZodString;
378
+ createdAt: z.ZodNullable<z.ZodString>;
379
+ files: z.ZodArray<z.ZodObject<{
380
+ name: z.ZodString;
381
+ url: z.ZodNullable<z.ZodString>;
382
+ }, z.core.$strip>>;
383
+ }, z.core.$strip>>;
384
+ }, z.core.$strip>>>;
385
+ linksOnly: z.ZodOptional<z.ZodBoolean>;
386
+ }, z.core.$strip>, z.ZodObject<{
387
+ channel: z.ZodString;
388
+ thread: z.ZodString;
389
+ subthread: z.ZodNullable<z.ZodString>;
390
+ kind: z.ZodLiteral<"deleted">;
391
+ message: z.ZodString;
392
+ }, z.core.$strip>, z.ZodObject<{
393
+ channel: z.ZodString;
394
+ thread: z.ZodString;
395
+ subthread: z.ZodNullable<z.ZodString>;
396
+ kind: z.ZodLiteral<"reaction">;
397
+ message: z.ZodString;
398
+ emoji: z.ZodString;
399
+ added: z.ZodBoolean;
400
+ author: z.ZodObject<{
401
+ id: z.ZodString;
402
+ handle: z.ZodString;
403
+ name: z.ZodString;
404
+ avatar: z.ZodNullable<z.ZodString>;
405
+ isBot: z.ZodBoolean;
406
+ }, z.core.$strip>;
407
+ }, z.core.$strip>, z.ZodObject<{
408
+ channel: z.ZodString;
409
+ thread: z.ZodString;
410
+ kind: z.ZodLiteral<"lifecycle">;
411
+ type: z.ZodString;
412
+ title: z.ZodString;
413
+ url: z.ZodNullable<z.ZodString>;
414
+ labels: z.ZodRecord<z.ZodString, z.ZodString>;
415
+ unset: z.ZodArray<z.ZodString>;
416
+ owns: z.ZodOptional<z.ZodArray<z.ZodString>>;
417
+ reply: z.ZodNullable<z.ZodString>;
418
+ createRoot: z.ZodBoolean;
419
+ author: z.ZodObject<{
420
+ id: z.ZodString;
421
+ handle: z.ZodString;
422
+ name: z.ZodString;
423
+ avatar: z.ZodNullable<z.ZodString>;
424
+ isBot: z.ZodBoolean;
425
+ }, z.core.$strip>;
426
+ }, z.core.$strip>], "kind">;
427
+ type ExternalEvent = z.infer<typeof ExternalEvent>;
428
+ type ExternalAuthor = z.infer<typeof ExternalAuthor>;
429
+ //#endregion
430
+ //#region src/contract/reducers.d.ts
431
+ type Message = {
432
+ id: number;
433
+ channel: string;
434
+ text: string;
435
+ re: number | null;
436
+ replyTo: number | null;
437
+ /** The thread key: the root's event ID. */
438
+ thread: string;
439
+ labels: Labels;
440
+ reactions: Record<string, string[]>;
441
+ mentions: string[];
442
+ by: Author;
443
+ noSync: boolean;
444
+ /** Where it came from on a platform, if it did. */
445
+ origin: Origin | null;
446
+ /** The sync key it came from, or null when written on the board. */
447
+ from: string | null;
448
+ createdAt: string;
449
+ editedAt: string | null;
450
+ deleted: boolean;
451
+ /** Sync targets this message didn't reach, with why. A later delivery clears its entry. */
452
+ undelivered: Record<string, string>;
453
+ attachments: Attachment[];
454
+ /** Platform messages it links to (Slack permalinks), each with what it said. */
455
+ links: Link[];
456
+ /** Set when a schedule posted it: the schedule's ID and which send this was, from 0. */
457
+ schedule?: {
458
+ id: number;
459
+ n: number;
460
+ };
461
+ /**
462
+ * Set when its author couldn't read its channel, as `authorizeOwn` checks: where they can't read,
463
+ * it's theirs to edit and delete only then. Its event's payload says so too.
464
+ */
465
+ blind?: true;
466
+ /** The index of the last event that changed it. Folds from before it existed leave it out. */
467
+ version?: number;
468
+ };
469
+ type MessagesState = {
470
+ byId: Record<string, Message>;
471
+ /** Thread root → reply IDs, in log order. */
472
+ replies: Record<string, number[]>;
473
+ };
474
+ declare const messagesReducer: import("experimental-a2").Reducer<{
475
+ 'message.posted': import("zod").ZodObject<{
476
+ channel: import("zod").ZodString;
477
+ text: import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodLiteral<"">]>;
478
+ re: import("zod").ZodNullable<import("zod").ZodNumber>;
479
+ replyTo: import("zod").ZodNullable<import("zod").ZodNumber>;
480
+ thread: import("zod").ZodString;
481
+ labels: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
482
+ noSync: import("zod").ZodBoolean;
483
+ mentions: import("zod").ZodArray<import("zod").ZodString>;
484
+ by: import("zod").ZodObject<{
485
+ actor: import("zod").ZodString;
486
+ principal: import("zod").ZodString;
487
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
488
+ session: import("zod").ZodNullable<import("zod").ZodString>;
489
+ }, import("zod/v4/core").$strip>;
490
+ origin: import("zod").ZodNullable<import("zod").ZodObject<{
491
+ channel: import("zod").ZodOptional<import("zod").ZodString>;
492
+ thread: import("zod").ZodString;
493
+ subthread: import("zod").ZodNullable<import("zod").ZodString>;
494
+ message: import("zod").ZodString;
495
+ context: import("zod").ZodNullable<import("zod").ZodString>;
496
+ }, import("zod/v4/core").$strip>>;
497
+ from: import("zod").ZodNullable<import("zod").ZodString>;
498
+ attachments: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
499
+ id: import("zod").ZodString;
500
+ name: import("zod").ZodString;
501
+ type: import("zod").ZodString;
502
+ size: import("zod").ZodNumber;
503
+ }, import("zod/v4/core").$strip>>>;
504
+ links: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
505
+ url: import("zod").ZodString;
506
+ message: import("zod").ZodNullable<import("zod").ZodNumber>;
507
+ snapshot: import("zod").ZodNullable<import("zod").ZodObject<{
508
+ author: import("zod").ZodString;
509
+ text: import("zod").ZodString;
510
+ createdAt: import("zod").ZodNullable<import("zod").ZodString>;
511
+ files: import("zod").ZodArray<import("zod").ZodObject<{
512
+ name: import("zod").ZodString;
513
+ url: import("zod").ZodNullable<import("zod").ZodString>;
514
+ }, import("zod/v4/core").$strip>>;
515
+ }, import("zod/v4/core").$strip>>;
516
+ unavailable: import("zod").ZodNullable<import("zod").ZodString>;
517
+ }, import("zod/v4/core").$strip>>>;
518
+ schedule: import("zod").ZodOptional<import("zod").ZodObject<{
519
+ id: import("zod").ZodNumber;
520
+ n: import("zod").ZodNumber;
521
+ }, import("zod/v4/core").$strip>>;
522
+ blind: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
523
+ importedBy: import("zod").ZodOptional<import("zod").ZodString>;
524
+ }, import("zod/v4/core").$strip>;
525
+ 'message.linked': import("zod").ZodObject<{
526
+ id: import("zod").ZodNumber;
527
+ thread: import("zod").ZodString;
528
+ links: import("zod").ZodArray<import("zod").ZodObject<{
529
+ url: import("zod").ZodString;
530
+ message: import("zod").ZodNullable<import("zod").ZodNumber>;
531
+ snapshot: import("zod").ZodNullable<import("zod").ZodObject<{
532
+ author: import("zod").ZodString;
533
+ text: import("zod").ZodString;
534
+ createdAt: import("zod").ZodNullable<import("zod").ZodString>;
535
+ files: import("zod").ZodArray<import("zod").ZodObject<{
536
+ name: import("zod").ZodString;
537
+ url: import("zod").ZodNullable<import("zod").ZodString>;
538
+ }, import("zod/v4/core").$strip>>;
539
+ }, import("zod/v4/core").$strip>>;
540
+ unavailable: import("zod").ZodNullable<import("zod").ZodString>;
541
+ }, import("zod/v4/core").$strip>>;
542
+ by: import("zod").ZodObject<{
543
+ actor: import("zod").ZodString;
544
+ principal: import("zod").ZodString;
545
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
546
+ session: import("zod").ZodNullable<import("zod").ZodString>;
547
+ }, import("zod/v4/core").$strip>;
548
+ from: import("zod").ZodNullable<import("zod").ZodString>;
549
+ }, import("zod/v4/core").$strip>;
550
+ 'message.edited': import("zod").ZodObject<{
551
+ id: import("zod").ZodNumber;
552
+ thread: import("zod").ZodString;
553
+ text: import("zod").ZodString;
554
+ mentions: import("zod").ZodArray<import("zod").ZodString>;
555
+ by: import("zod").ZodObject<{
556
+ actor: import("zod").ZodString;
557
+ principal: import("zod").ZodString;
558
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
559
+ session: import("zod").ZodNullable<import("zod").ZodString>;
560
+ }, import("zod/v4/core").$strip>;
561
+ from: import("zod").ZodNullable<import("zod").ZodString>;
562
+ }, import("zod/v4/core").$strip>;
563
+ 'message.deleted': import("zod").ZodObject<{
564
+ id: import("zod").ZodNumber;
565
+ thread: import("zod").ZodString;
566
+ by: import("zod").ZodObject<{
567
+ actor: import("zod").ZodString;
568
+ principal: import("zod").ZodString;
569
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
570
+ session: import("zod").ZodNullable<import("zod").ZodString>;
571
+ }, import("zod/v4/core").$strip>;
572
+ from: import("zod").ZodNullable<import("zod").ZodString>;
573
+ }, import("zod/v4/core").$strip>;
574
+ 'reaction.added': import("zod").ZodObject<{
575
+ id: import("zod").ZodNumber;
576
+ thread: import("zod").ZodString;
577
+ emoji: import("zod").ZodString;
578
+ by: import("zod").ZodObject<{
579
+ actor: import("zod").ZodString;
580
+ principal: import("zod").ZodString;
581
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
582
+ session: import("zod").ZodNullable<import("zod").ZodString>;
583
+ }, import("zod/v4/core").$strip>;
584
+ from: import("zod").ZodNullable<import("zod").ZodString>;
585
+ }, import("zod/v4/core").$strip>;
586
+ 'reaction.removed': import("zod").ZodObject<{
587
+ id: import("zod").ZodNumber;
588
+ thread: import("zod").ZodString;
589
+ emoji: import("zod").ZodString;
590
+ by: import("zod").ZodObject<{
591
+ actor: import("zod").ZodString;
592
+ principal: import("zod").ZodString;
593
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
594
+ session: import("zod").ZodNullable<import("zod").ZodString>;
595
+ }, import("zod/v4/core").$strip>;
596
+ from: import("zod").ZodNullable<import("zod").ZodString>;
597
+ }, import("zod/v4/core").$strip>;
598
+ 'labels.changed': import("zod").ZodObject<{
599
+ id: import("zod").ZodNumber;
600
+ thread: import("zod").ZodString;
601
+ set: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
602
+ unset: import("zod").ZodArray<import("zod").ZodString>;
603
+ by: import("zod").ZodObject<{
604
+ actor: import("zod").ZodString;
605
+ principal: import("zod").ZodString;
606
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
607
+ session: import("zod").ZodNullable<import("zod").ZodString>;
608
+ }, import("zod/v4/core").$strip>;
609
+ }, import("zod/v4/core").$strip>;
610
+ 'thread.synced': import("zod").ZodObject<{
611
+ thread: import("zod").ZodString;
612
+ target: import("zod").ZodString;
613
+ cause: import("zod").ZodEnum<{
614
+ config: "config";
615
+ request: "request";
616
+ }>;
617
+ kind: import("zod").ZodOptional<import("zod").ZodEnum<{
618
+ channel: "channel";
619
+ thread: "thread";
620
+ }>>;
621
+ by: import("zod").ZodObject<{
622
+ actor: import("zod").ZodString;
623
+ principal: import("zod").ZodString;
624
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
625
+ session: import("zod").ZodNullable<import("zod").ZodString>;
626
+ }, import("zod/v4/core").$strip>;
627
+ }, import("zod/v4/core").$strip>;
628
+ 'message.synced': import("zod").ZodObject<{
629
+ id: import("zod").ZodNumber;
630
+ thread: import("zod").ZodString;
631
+ target: import("zod").ZodString;
632
+ external: import("zod").ZodObject<{
633
+ thread: import("zod").ZodString;
634
+ message: import("zod").ZodString;
635
+ asUser: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
636
+ }, import("zod/v4/core").$strip>;
637
+ syncedBy: import("zod").ZodOptional<import("zod").ZodString>;
638
+ }, import("zod/v4/core").$strip>;
639
+ 'message.files_synced': import("zod").ZodObject<{
640
+ id: import("zod").ZodNumber;
641
+ thread: import("zod").ZodString;
642
+ target: import("zod").ZodString;
643
+ files: import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodString>>;
644
+ syncedBy: import("zod").ZodOptional<import("zod").ZodString>;
645
+ }, import("zod/v4/core").$strip>;
646
+ 'message.sync_failed': import("zod").ZodObject<{
647
+ id: import("zod").ZodNumber;
648
+ thread: import("zod").ZodString;
649
+ target: import("zod").ZodString;
650
+ error: import("zod").ZodString;
651
+ }, import("zod/v4/core").$strip>;
652
+ 'actor.seen': import("zod").ZodObject<{
653
+ actor: import("zod").ZodString;
654
+ kind: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
655
+ agent: "agent";
656
+ deployment: "deployment";
657
+ external: "external";
658
+ person: "person";
659
+ workflow: "workflow";
660
+ }>, import("zod").ZodLiteral<"profile">]>;
661
+ handle: import("zod").ZodString;
662
+ name: import("zod").ZodString;
663
+ avatar: import("zod").ZodNullable<import("zod").ZodString>;
664
+ host: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
665
+ }, import("zod/v4/core").$strip>;
666
+ 'actor.linked': import("zod").ZodObject<{
667
+ actor: import("zod").ZodString;
668
+ to: import("zod").ZodString;
669
+ method: import("zod").ZodEnum<{
670
+ code: "code";
671
+ consent: "consent";
672
+ }>;
673
+ by: import("zod").ZodObject<{
674
+ actor: import("zod").ZodString;
675
+ principal: import("zod").ZodString;
676
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
677
+ session: import("zod").ZodNullable<import("zod").ZodString>;
678
+ }, import("zod/v4/core").$strip>;
679
+ }, import("zod/v4/core").$strip>;
680
+ 'actor.unlinked': import("zod").ZodObject<{
681
+ actor: import("zod").ZodString;
682
+ by: import("zod").ZodObject<{
683
+ actor: import("zod").ZodString;
684
+ principal: import("zod").ZodString;
685
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
686
+ session: import("zod").ZodNullable<import("zod").ZodString>;
687
+ }, import("zod/v4/core").$strip>;
688
+ }, import("zod/v4/core").$strip>;
689
+ }, MessagesState, Record<never, never>>;
690
+ type Channel = {
691
+ path: string;
692
+ lastIndex: number;
693
+ messages: number;
694
+ threads: number;
695
+ };
696
+ type ChannelsState = Record<string, Channel>;
697
+ declare const channelsReducer: import("experimental-a2").Reducer<{
698
+ 'message.posted': import("zod").ZodObject<{
699
+ channel: import("zod").ZodString;
700
+ text: import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodLiteral<"">]>;
701
+ re: import("zod").ZodNullable<import("zod").ZodNumber>;
702
+ replyTo: import("zod").ZodNullable<import("zod").ZodNumber>;
703
+ thread: import("zod").ZodString;
704
+ labels: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
705
+ noSync: import("zod").ZodBoolean;
706
+ mentions: import("zod").ZodArray<import("zod").ZodString>;
707
+ by: import("zod").ZodObject<{
708
+ actor: import("zod").ZodString;
709
+ principal: import("zod").ZodString;
710
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
711
+ session: import("zod").ZodNullable<import("zod").ZodString>;
712
+ }, import("zod/v4/core").$strip>;
713
+ origin: import("zod").ZodNullable<import("zod").ZodObject<{
714
+ channel: import("zod").ZodOptional<import("zod").ZodString>;
715
+ thread: import("zod").ZodString;
716
+ subthread: import("zod").ZodNullable<import("zod").ZodString>;
717
+ message: import("zod").ZodString;
718
+ context: import("zod").ZodNullable<import("zod").ZodString>;
719
+ }, import("zod/v4/core").$strip>>;
720
+ from: import("zod").ZodNullable<import("zod").ZodString>;
721
+ attachments: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
722
+ id: import("zod").ZodString;
723
+ name: import("zod").ZodString;
724
+ type: import("zod").ZodString;
725
+ size: import("zod").ZodNumber;
726
+ }, import("zod/v4/core").$strip>>>;
727
+ links: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
728
+ url: import("zod").ZodString;
729
+ message: import("zod").ZodNullable<import("zod").ZodNumber>;
730
+ snapshot: import("zod").ZodNullable<import("zod").ZodObject<{
731
+ author: import("zod").ZodString;
732
+ text: import("zod").ZodString;
733
+ createdAt: import("zod").ZodNullable<import("zod").ZodString>;
734
+ files: import("zod").ZodArray<import("zod").ZodObject<{
735
+ name: import("zod").ZodString;
736
+ url: import("zod").ZodNullable<import("zod").ZodString>;
737
+ }, import("zod/v4/core").$strip>>;
738
+ }, import("zod/v4/core").$strip>>;
739
+ unavailable: import("zod").ZodNullable<import("zod").ZodString>;
740
+ }, import("zod/v4/core").$strip>>>;
741
+ schedule: import("zod").ZodOptional<import("zod").ZodObject<{
742
+ id: import("zod").ZodNumber;
743
+ n: import("zod").ZodNumber;
744
+ }, import("zod/v4/core").$strip>>;
745
+ blind: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
746
+ importedBy: import("zod").ZodOptional<import("zod").ZodString>;
747
+ }, import("zod/v4/core").$strip>;
748
+ 'message.linked': import("zod").ZodObject<{
749
+ id: import("zod").ZodNumber;
750
+ thread: import("zod").ZodString;
751
+ links: import("zod").ZodArray<import("zod").ZodObject<{
752
+ url: import("zod").ZodString;
753
+ message: import("zod").ZodNullable<import("zod").ZodNumber>;
754
+ snapshot: import("zod").ZodNullable<import("zod").ZodObject<{
755
+ author: import("zod").ZodString;
756
+ text: import("zod").ZodString;
757
+ createdAt: import("zod").ZodNullable<import("zod").ZodString>;
758
+ files: import("zod").ZodArray<import("zod").ZodObject<{
759
+ name: import("zod").ZodString;
760
+ url: import("zod").ZodNullable<import("zod").ZodString>;
761
+ }, import("zod/v4/core").$strip>>;
762
+ }, import("zod/v4/core").$strip>>;
763
+ unavailable: import("zod").ZodNullable<import("zod").ZodString>;
764
+ }, import("zod/v4/core").$strip>>;
765
+ by: import("zod").ZodObject<{
766
+ actor: import("zod").ZodString;
767
+ principal: import("zod").ZodString;
768
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
769
+ session: import("zod").ZodNullable<import("zod").ZodString>;
770
+ }, import("zod/v4/core").$strip>;
771
+ from: import("zod").ZodNullable<import("zod").ZodString>;
772
+ }, import("zod/v4/core").$strip>;
773
+ 'message.edited': import("zod").ZodObject<{
774
+ id: import("zod").ZodNumber;
775
+ thread: import("zod").ZodString;
776
+ text: import("zod").ZodString;
777
+ mentions: import("zod").ZodArray<import("zod").ZodString>;
778
+ by: import("zod").ZodObject<{
779
+ actor: import("zod").ZodString;
780
+ principal: import("zod").ZodString;
781
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
782
+ session: import("zod").ZodNullable<import("zod").ZodString>;
783
+ }, import("zod/v4/core").$strip>;
784
+ from: import("zod").ZodNullable<import("zod").ZodString>;
785
+ }, import("zod/v4/core").$strip>;
786
+ 'message.deleted': import("zod").ZodObject<{
787
+ id: import("zod").ZodNumber;
788
+ thread: import("zod").ZodString;
789
+ by: import("zod").ZodObject<{
790
+ actor: import("zod").ZodString;
791
+ principal: import("zod").ZodString;
792
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
793
+ session: import("zod").ZodNullable<import("zod").ZodString>;
794
+ }, import("zod/v4/core").$strip>;
795
+ from: import("zod").ZodNullable<import("zod").ZodString>;
796
+ }, import("zod/v4/core").$strip>;
797
+ 'reaction.added': import("zod").ZodObject<{
798
+ id: import("zod").ZodNumber;
799
+ thread: import("zod").ZodString;
800
+ emoji: import("zod").ZodString;
801
+ by: import("zod").ZodObject<{
802
+ actor: import("zod").ZodString;
803
+ principal: import("zod").ZodString;
804
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
805
+ session: import("zod").ZodNullable<import("zod").ZodString>;
806
+ }, import("zod/v4/core").$strip>;
807
+ from: import("zod").ZodNullable<import("zod").ZodString>;
808
+ }, import("zod/v4/core").$strip>;
809
+ 'reaction.removed': import("zod").ZodObject<{
810
+ id: import("zod").ZodNumber;
811
+ thread: import("zod").ZodString;
812
+ emoji: import("zod").ZodString;
813
+ by: import("zod").ZodObject<{
814
+ actor: import("zod").ZodString;
815
+ principal: import("zod").ZodString;
816
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
817
+ session: import("zod").ZodNullable<import("zod").ZodString>;
818
+ }, import("zod/v4/core").$strip>;
819
+ from: import("zod").ZodNullable<import("zod").ZodString>;
820
+ }, import("zod/v4/core").$strip>;
821
+ 'labels.changed': import("zod").ZodObject<{
822
+ id: import("zod").ZodNumber;
823
+ thread: import("zod").ZodString;
824
+ set: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
825
+ unset: import("zod").ZodArray<import("zod").ZodString>;
826
+ by: import("zod").ZodObject<{
827
+ actor: import("zod").ZodString;
828
+ principal: import("zod").ZodString;
829
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
830
+ session: import("zod").ZodNullable<import("zod").ZodString>;
831
+ }, import("zod/v4/core").$strip>;
832
+ }, import("zod/v4/core").$strip>;
833
+ 'thread.synced': import("zod").ZodObject<{
834
+ thread: import("zod").ZodString;
835
+ target: import("zod").ZodString;
836
+ cause: import("zod").ZodEnum<{
837
+ config: "config";
838
+ request: "request";
839
+ }>;
840
+ kind: import("zod").ZodOptional<import("zod").ZodEnum<{
841
+ channel: "channel";
842
+ thread: "thread";
843
+ }>>;
844
+ by: import("zod").ZodObject<{
845
+ actor: import("zod").ZodString;
846
+ principal: import("zod").ZodString;
847
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
848
+ session: import("zod").ZodNullable<import("zod").ZodString>;
849
+ }, import("zod/v4/core").$strip>;
850
+ }, import("zod/v4/core").$strip>;
851
+ 'message.synced': import("zod").ZodObject<{
852
+ id: import("zod").ZodNumber;
853
+ thread: import("zod").ZodString;
854
+ target: import("zod").ZodString;
855
+ external: import("zod").ZodObject<{
856
+ thread: import("zod").ZodString;
857
+ message: import("zod").ZodString;
858
+ asUser: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
859
+ }, import("zod/v4/core").$strip>;
860
+ syncedBy: import("zod").ZodOptional<import("zod").ZodString>;
861
+ }, import("zod/v4/core").$strip>;
862
+ 'message.files_synced': import("zod").ZodObject<{
863
+ id: import("zod").ZodNumber;
864
+ thread: import("zod").ZodString;
865
+ target: import("zod").ZodString;
866
+ files: import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodString>>;
867
+ syncedBy: import("zod").ZodOptional<import("zod").ZodString>;
868
+ }, import("zod/v4/core").$strip>;
869
+ 'message.sync_failed': import("zod").ZodObject<{
870
+ id: import("zod").ZodNumber;
871
+ thread: import("zod").ZodString;
872
+ target: import("zod").ZodString;
873
+ error: import("zod").ZodString;
874
+ }, import("zod/v4/core").$strip>;
875
+ 'actor.seen': import("zod").ZodObject<{
876
+ actor: import("zod").ZodString;
877
+ kind: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
878
+ agent: "agent";
879
+ deployment: "deployment";
880
+ external: "external";
881
+ person: "person";
882
+ workflow: "workflow";
883
+ }>, import("zod").ZodLiteral<"profile">]>;
884
+ handle: import("zod").ZodString;
885
+ name: import("zod").ZodString;
886
+ avatar: import("zod").ZodNullable<import("zod").ZodString>;
887
+ host: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
888
+ }, import("zod/v4/core").$strip>;
889
+ 'actor.linked': import("zod").ZodObject<{
890
+ actor: import("zod").ZodString;
891
+ to: import("zod").ZodString;
892
+ method: import("zod").ZodEnum<{
893
+ code: "code";
894
+ consent: "consent";
895
+ }>;
896
+ by: import("zod").ZodObject<{
897
+ actor: import("zod").ZodString;
898
+ principal: import("zod").ZodString;
899
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
900
+ session: import("zod").ZodNullable<import("zod").ZodString>;
901
+ }, import("zod/v4/core").$strip>;
902
+ }, import("zod/v4/core").$strip>;
903
+ 'actor.unlinked': import("zod").ZodObject<{
904
+ actor: import("zod").ZodString;
905
+ by: import("zod").ZodObject<{
906
+ actor: import("zod").ZodString;
907
+ principal: import("zod").ZodString;
908
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
909
+ session: import("zod").ZodNullable<import("zod").ZodString>;
910
+ }, import("zod/v4/core").$strip>;
911
+ }, import("zod/v4/core").$strip>;
912
+ }, ChannelsState, Record<never, never>>;
913
+ type Actor = {
914
+ id: string;
915
+ kind: ActorKind;
916
+ handle: string;
917
+ name: string;
918
+ avatar: string | null;
919
+ /** A host's principal, or one of its profiles: once it's seen as one, it stays one. Views leave it out. */
920
+ host?: true;
921
+ };
922
+ /** A platform actor proved to be a principal (`actor.linked`). */
923
+ type ActorLink = {
924
+ to: string;
925
+ method: 'code' | 'consent';
926
+ at: string;
927
+ };
928
+ type ActorsState = {
929
+ byId: Record<string, Actor>;
930
+ /** Lowercased handle → actor IDs. Handles aren't reserved, so several can share one. */
931
+ byHandle: Record<string, string[]>;
932
+ /** Platform actor → the principal it's linked to. Display and filtering only, never permissions. */
933
+ links: Record<string, ActorLink>;
934
+ };
935
+ declare const actorsReducer: import("experimental-a2").Reducer<{
936
+ 'message.posted': import("zod").ZodObject<{
937
+ channel: import("zod").ZodString;
938
+ text: import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodLiteral<"">]>;
939
+ re: import("zod").ZodNullable<import("zod").ZodNumber>;
940
+ replyTo: import("zod").ZodNullable<import("zod").ZodNumber>;
941
+ thread: import("zod").ZodString;
942
+ labels: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
943
+ noSync: import("zod").ZodBoolean;
944
+ mentions: import("zod").ZodArray<import("zod").ZodString>;
945
+ by: import("zod").ZodObject<{
946
+ actor: import("zod").ZodString;
947
+ principal: import("zod").ZodString;
948
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
949
+ session: import("zod").ZodNullable<import("zod").ZodString>;
950
+ }, import("zod/v4/core").$strip>;
951
+ origin: import("zod").ZodNullable<import("zod").ZodObject<{
952
+ channel: import("zod").ZodOptional<import("zod").ZodString>;
953
+ thread: import("zod").ZodString;
954
+ subthread: import("zod").ZodNullable<import("zod").ZodString>;
955
+ message: import("zod").ZodString;
956
+ context: import("zod").ZodNullable<import("zod").ZodString>;
957
+ }, import("zod/v4/core").$strip>>;
958
+ from: import("zod").ZodNullable<import("zod").ZodString>;
959
+ attachments: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
960
+ id: import("zod").ZodString;
961
+ name: import("zod").ZodString;
962
+ type: import("zod").ZodString;
963
+ size: import("zod").ZodNumber;
964
+ }, import("zod/v4/core").$strip>>>;
965
+ links: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
966
+ url: import("zod").ZodString;
967
+ message: import("zod").ZodNullable<import("zod").ZodNumber>;
968
+ snapshot: import("zod").ZodNullable<import("zod").ZodObject<{
969
+ author: import("zod").ZodString;
970
+ text: import("zod").ZodString;
971
+ createdAt: import("zod").ZodNullable<import("zod").ZodString>;
972
+ files: import("zod").ZodArray<import("zod").ZodObject<{
973
+ name: import("zod").ZodString;
974
+ url: import("zod").ZodNullable<import("zod").ZodString>;
975
+ }, import("zod/v4/core").$strip>>;
976
+ }, import("zod/v4/core").$strip>>;
977
+ unavailable: import("zod").ZodNullable<import("zod").ZodString>;
978
+ }, import("zod/v4/core").$strip>>>;
979
+ schedule: import("zod").ZodOptional<import("zod").ZodObject<{
980
+ id: import("zod").ZodNumber;
981
+ n: import("zod").ZodNumber;
982
+ }, import("zod/v4/core").$strip>>;
983
+ blind: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
984
+ importedBy: import("zod").ZodOptional<import("zod").ZodString>;
985
+ }, import("zod/v4/core").$strip>;
986
+ 'message.linked': import("zod").ZodObject<{
987
+ id: import("zod").ZodNumber;
988
+ thread: import("zod").ZodString;
989
+ links: import("zod").ZodArray<import("zod").ZodObject<{
990
+ url: import("zod").ZodString;
991
+ message: import("zod").ZodNullable<import("zod").ZodNumber>;
992
+ snapshot: import("zod").ZodNullable<import("zod").ZodObject<{
993
+ author: import("zod").ZodString;
994
+ text: import("zod").ZodString;
995
+ createdAt: import("zod").ZodNullable<import("zod").ZodString>;
996
+ files: import("zod").ZodArray<import("zod").ZodObject<{
997
+ name: import("zod").ZodString;
998
+ url: import("zod").ZodNullable<import("zod").ZodString>;
999
+ }, import("zod/v4/core").$strip>>;
1000
+ }, import("zod/v4/core").$strip>>;
1001
+ unavailable: import("zod").ZodNullable<import("zod").ZodString>;
1002
+ }, import("zod/v4/core").$strip>>;
1003
+ by: import("zod").ZodObject<{
1004
+ actor: import("zod").ZodString;
1005
+ principal: import("zod").ZodString;
1006
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1007
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1008
+ }, import("zod/v4/core").$strip>;
1009
+ from: import("zod").ZodNullable<import("zod").ZodString>;
1010
+ }, import("zod/v4/core").$strip>;
1011
+ 'message.edited': import("zod").ZodObject<{
1012
+ id: import("zod").ZodNumber;
1013
+ thread: import("zod").ZodString;
1014
+ text: import("zod").ZodString;
1015
+ mentions: import("zod").ZodArray<import("zod").ZodString>;
1016
+ by: import("zod").ZodObject<{
1017
+ actor: import("zod").ZodString;
1018
+ principal: import("zod").ZodString;
1019
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1020
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1021
+ }, import("zod/v4/core").$strip>;
1022
+ from: import("zod").ZodNullable<import("zod").ZodString>;
1023
+ }, import("zod/v4/core").$strip>;
1024
+ 'message.deleted': import("zod").ZodObject<{
1025
+ id: import("zod").ZodNumber;
1026
+ thread: import("zod").ZodString;
1027
+ by: import("zod").ZodObject<{
1028
+ actor: import("zod").ZodString;
1029
+ principal: import("zod").ZodString;
1030
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1031
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1032
+ }, import("zod/v4/core").$strip>;
1033
+ from: import("zod").ZodNullable<import("zod").ZodString>;
1034
+ }, import("zod/v4/core").$strip>;
1035
+ 'reaction.added': import("zod").ZodObject<{
1036
+ id: import("zod").ZodNumber;
1037
+ thread: import("zod").ZodString;
1038
+ emoji: import("zod").ZodString;
1039
+ by: import("zod").ZodObject<{
1040
+ actor: import("zod").ZodString;
1041
+ principal: import("zod").ZodString;
1042
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1043
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1044
+ }, import("zod/v4/core").$strip>;
1045
+ from: import("zod").ZodNullable<import("zod").ZodString>;
1046
+ }, import("zod/v4/core").$strip>;
1047
+ 'reaction.removed': import("zod").ZodObject<{
1048
+ id: import("zod").ZodNumber;
1049
+ thread: import("zod").ZodString;
1050
+ emoji: import("zod").ZodString;
1051
+ by: import("zod").ZodObject<{
1052
+ actor: import("zod").ZodString;
1053
+ principal: import("zod").ZodString;
1054
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1055
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1056
+ }, import("zod/v4/core").$strip>;
1057
+ from: import("zod").ZodNullable<import("zod").ZodString>;
1058
+ }, import("zod/v4/core").$strip>;
1059
+ 'labels.changed': import("zod").ZodObject<{
1060
+ id: import("zod").ZodNumber;
1061
+ thread: import("zod").ZodString;
1062
+ set: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>;
1063
+ unset: import("zod").ZodArray<import("zod").ZodString>;
1064
+ by: import("zod").ZodObject<{
1065
+ actor: import("zod").ZodString;
1066
+ principal: import("zod").ZodString;
1067
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1068
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1069
+ }, import("zod/v4/core").$strip>;
1070
+ }, import("zod/v4/core").$strip>;
1071
+ 'thread.synced': import("zod").ZodObject<{
1072
+ thread: import("zod").ZodString;
1073
+ target: import("zod").ZodString;
1074
+ cause: import("zod").ZodEnum<{
1075
+ config: "config";
1076
+ request: "request";
1077
+ }>;
1078
+ kind: import("zod").ZodOptional<import("zod").ZodEnum<{
1079
+ channel: "channel";
1080
+ thread: "thread";
1081
+ }>>;
1082
+ by: import("zod").ZodObject<{
1083
+ actor: import("zod").ZodString;
1084
+ principal: import("zod").ZodString;
1085
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1086
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1087
+ }, import("zod/v4/core").$strip>;
1088
+ }, import("zod/v4/core").$strip>;
1089
+ 'message.synced': import("zod").ZodObject<{
1090
+ id: import("zod").ZodNumber;
1091
+ thread: import("zod").ZodString;
1092
+ target: import("zod").ZodString;
1093
+ external: import("zod").ZodObject<{
1094
+ thread: import("zod").ZodString;
1095
+ message: import("zod").ZodString;
1096
+ asUser: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
1097
+ }, import("zod/v4/core").$strip>;
1098
+ syncedBy: import("zod").ZodOptional<import("zod").ZodString>;
1099
+ }, import("zod/v4/core").$strip>;
1100
+ 'message.files_synced': import("zod").ZodObject<{
1101
+ id: import("zod").ZodNumber;
1102
+ thread: import("zod").ZodString;
1103
+ target: import("zod").ZodString;
1104
+ files: import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodString>>;
1105
+ syncedBy: import("zod").ZodOptional<import("zod").ZodString>;
1106
+ }, import("zod/v4/core").$strip>;
1107
+ 'message.sync_failed': import("zod").ZodObject<{
1108
+ id: import("zod").ZodNumber;
1109
+ thread: import("zod").ZodString;
1110
+ target: import("zod").ZodString;
1111
+ error: import("zod").ZodString;
1112
+ }, import("zod/v4/core").$strip>;
1113
+ 'actor.seen': import("zod").ZodObject<{
1114
+ actor: import("zod").ZodString;
1115
+ kind: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
1116
+ agent: "agent";
1117
+ deployment: "deployment";
1118
+ external: "external";
1119
+ person: "person";
1120
+ workflow: "workflow";
1121
+ }>, import("zod").ZodLiteral<"profile">]>;
1122
+ handle: import("zod").ZodString;
1123
+ name: import("zod").ZodString;
1124
+ avatar: import("zod").ZodNullable<import("zod").ZodString>;
1125
+ host: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
1126
+ }, import("zod/v4/core").$strip>;
1127
+ 'actor.linked': import("zod").ZodObject<{
1128
+ actor: import("zod").ZodString;
1129
+ to: import("zod").ZodString;
1130
+ method: import("zod").ZodEnum<{
1131
+ code: "code";
1132
+ consent: "consent";
1133
+ }>;
1134
+ by: import("zod").ZodObject<{
1135
+ actor: import("zod").ZodString;
1136
+ principal: import("zod").ZodString;
1137
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1138
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1139
+ }, import("zod/v4/core").$strip>;
1140
+ }, import("zod/v4/core").$strip>;
1141
+ 'actor.unlinked': import("zod").ZodObject<{
1142
+ actor: import("zod").ZodString;
1143
+ by: import("zod").ZodObject<{
1144
+ actor: import("zod").ZodString;
1145
+ principal: import("zod").ZodString;
1146
+ profile: import("zod").ZodNullable<import("zod").ZodString>;
1147
+ session: import("zod").ZodNullable<import("zod").ZodString>;
1148
+ }, import("zod/v4/core").$strip>;
1149
+ }, import("zod/v4/core").$strip>;
1150
+ }, ActorsState, Record<never, never>>;
1151
+ /** A copy of a board message on a platform. */
1152
+ /** `files`: the platform's IDs for the message's files, or null when it refused them; unset until they're sent. */
1153
+ /** `asUser`: posted with its author's own token, so editing or deleting it needs that token too. */
1154
+ /** `by`: the principal of the sync elsewhere that recorded it, whose copy it is to change; none for the board's own sync's. */
1155
+ type ExternalCopy = {
1156
+ thread: string;
1157
+ message: string;
1158
+ files?: string[] | null;
1159
+ asUser?: true;
1160
+ by?: string;
1161
+ };
1162
+ type SyncedThread = {
1163
+ root: number;
1164
+ channel: string;
1165
+ kinds?: Record<string, 'channel' | 'thread'>;
1166
+ /** External channels (start a thread there) and threads (joined), in sync order. */
1167
+ targets: string[];
1168
+ /** Target → the external thread it resolved to. A thread target resolves to itself. */
1169
+ external: Record<string, string>;
1170
+ };
1171
+ //#endregion
1172
+ export { ExternalFile as _, ExternalCopy as a, Origin as b, SyncedThread as c, messagesReducer as d, BOARD_SESSION as f, ExternalEvent as g, ExternalAuthor as h, ChannelsState as i, actorsReducer as l, BoardEvents as m, ActorsState as n, Message as o, BoardEvent as p, Channel as r, MessagesState as s, Actor as t, channelsReducer as u, ExternalLink as v, boardContract as x, Link as y };