exponential-sdk 1.27.0 → 1.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,819 @@
1
1
  import { TRPCClientError } from '@trpc/client';
2
2
  export { TRPCClientError } from '@trpc/client';
3
3
 
4
+ type CeremonyKind = 'STANDUP' | 'PLANNING' | 'REVIEW' | 'RETROSPECTIVE' | 'PRIORITISATION' | 'ALL_HANDS' | 'ONE_ON_ONE' | 'CUSTOM';
5
+ /**
6
+ * Where an occurrence is in its lifecycle. `SKIPPED` is only ever set by the
7
+ * owner (with a reason) — an empty agenda offers a skip, it never takes one.
8
+ */
9
+ type CeremonyOccurrenceStatus = 'PLANNED' | 'AGENDA_CIRCULATED' | 'IN_PROGRESS' | 'CAPTURED' | 'FOLLOWED_THROUGH' | 'SKIPPED';
10
+ interface CeremonyUserRef {
11
+ id: string;
12
+ name: string | null;
13
+ email: string | null;
14
+ image?: string | null;
15
+ }
16
+ interface CeremonyNamedRef {
17
+ id: string;
18
+ name: string;
19
+ slug: string;
20
+ }
21
+ /** One section of a ceremony's agenda template, in running order. */
22
+ interface CeremonyAgendaTemplateSection {
23
+ key: string;
24
+ /** A section type the agenda generator binds a query to (`blockers`, `carried_over`, `okr_review`, …). */
25
+ type: string;
26
+ title: string;
27
+ minutes?: number;
28
+ config?: Record<string, unknown>;
29
+ }
30
+ /** A row of `ceremonies.list` — the Settings → Ceremonies table. */
31
+ interface CeremonySummary {
32
+ id: string;
33
+ workspaceId: string;
34
+ name: string;
35
+ slug: string;
36
+ /** Title patterns used to auto-attach recorded meetings and calendar events. */
37
+ aliases: string[];
38
+ kind: CeremonyKind;
39
+ /** Icon key; null shows the kind's default. */
40
+ icon: string | null;
41
+ /** RRULE body, e.g. `FREQ=WEEKLY;BYDAY=MO;BYHOUR=10;BYMINUTE=0`. Null only on a one-off. */
42
+ cadenceRule: string | null;
43
+ /** IANA zone the cadence is evaluated in. */
44
+ timezone: string;
45
+ startsOn: Date;
46
+ durationMinutes: number;
47
+ /** Hours before the start at which the agenda is generated and circulated. */
48
+ leadTimeHours: number;
49
+ isActive: boolean;
50
+ ownerId: string;
51
+ productId: string | null;
52
+ teamId: string | null;
53
+ includeProjects: boolean;
54
+ /** Run "Extract outputs" on every recording that attaches to an occurrence. */
55
+ autoExtractOutputs: boolean;
56
+ projects: Array<{
57
+ projectId: string;
58
+ }>;
59
+ owner: CeremonyUserRef;
60
+ _count: {
61
+ occurrences: number;
62
+ participants: number;
63
+ };
64
+ /**
65
+ * Only on `ceremonies.list`: whether the caller may add, move or skip
66
+ * occurrences (the owner, or a workspace owner/admin).
67
+ */
68
+ canManage?: boolean;
69
+ }
70
+ /** A `ceremonies.listForProject` row: the summary plus the next planned occurrence. */
71
+ interface ProjectCeremony extends CeremonySummary {
72
+ /** Zero or one entry — the next non-skipped occurrence from now. */
73
+ occurrences: Array<{
74
+ id: string;
75
+ scheduledStart: Date;
76
+ status: CeremonyOccurrenceStatus;
77
+ }>;
78
+ }
79
+ /**
80
+ * A recorded meeting that captured an occurrence. Meetings the caller cannot
81
+ * view (ADR-0014) come back as existence-only stubs: `visible: false` with
82
+ * everything else null.
83
+ */
84
+ interface CeremonyRecordedMeeting {
85
+ id: string;
86
+ visible: boolean;
87
+ title: string | null;
88
+ meetingDate: Date | null;
89
+ processedAt?: Date | null;
90
+ }
91
+ /** An occurrence row as listed inside `ceremonies.get`. */
92
+ interface CeremonyOccurrenceRow {
93
+ id: string;
94
+ scheduledStart: Date;
95
+ scheduledEnd: Date;
96
+ /** The cadence tick this occurrence accounts for; differs from `scheduledStart` once moved, null when added off-cadence. */
97
+ cadenceStart: Date | null;
98
+ status: CeremonyOccurrenceStatus;
99
+ skipReason: string | null;
100
+ agendaGeneratedAt: Date | null;
101
+ agendaCirculatedAt: Date | null;
102
+ /** The calendar booking for this occurrence, when the scheduling flow made one. */
103
+ scheduledMeetingId: string | null;
104
+ recordedMeetings: CeremonyRecordedMeeting[];
105
+ }
106
+ /** Full ceremony definition from `ceremonies.get`. */
107
+ interface Ceremony {
108
+ id: string;
109
+ workspaceId: string;
110
+ productId: string | null;
111
+ teamId: string | null;
112
+ name: string;
113
+ slug: string;
114
+ aliases: string[];
115
+ kind: CeremonyKind;
116
+ icon: string | null;
117
+ /** Markdown. */
118
+ purpose: string | null;
119
+ /** Markdown — what this ceremony is explicitly not for. */
120
+ notFor: string | null;
121
+ /** Markdown — required inputs. */
122
+ inputs: string | null;
123
+ /** Markdown — expected outputs. */
124
+ outputs: string | null;
125
+ /** Null only on a one-off. */
126
+ cadenceRule: string | null;
127
+ timezone: string;
128
+ startsOn: Date;
129
+ durationMinutes: number;
130
+ leadTimeHours: number;
131
+ ownerId: string;
132
+ agendaTemplate: CeremonyAgendaTemplateSection[];
133
+ includeProjects: boolean;
134
+ autoExtractOutputs: boolean;
135
+ matrixRoomId: string | null;
136
+ /** The video room the ceremony meets in; recordings from it file themselves here. */
137
+ meetingUrl: string | null;
138
+ isActive: boolean;
139
+ /** A single meeting booked from a project, not part of the operating rhythm. */
140
+ isOneOff: boolean;
141
+ createdById: string;
142
+ createdAt: Date;
143
+ updatedAt: Date;
144
+ owner: CeremonyUserRef;
145
+ product: CeremonyNamedRef | null;
146
+ team: CeremonyNamedRef | null;
147
+ projects: Array<{
148
+ projectId: string;
149
+ project: CeremonyNamedRef;
150
+ }>;
151
+ participants: Array<{
152
+ id: string;
153
+ ceremonyId: string;
154
+ userId: string;
155
+ user: CeremonyUserRef;
156
+ }>;
157
+ /**
158
+ * Up to 30 upcoming (furthest first) then up to 50 past (most recent first)
159
+ * — newest first overall.
160
+ */
161
+ occurrences: CeremonyOccurrenceRow[];
162
+ /** Whether the caller may edit the definition. */
163
+ canEdit: boolean;
164
+ /** Whether the caller may add, move or skip occurrences. */
165
+ canManage: boolean;
166
+ }
167
+ /** The bare ceremony row returned by `create` / `update`. */
168
+ type CeremonyRecord = Omit<Ceremony, 'owner' | 'product' | 'team' | 'projects' | 'participants' | 'occurrences' | 'canEdit' | 'canManage'>;
169
+ interface CeremonyWriteResult {
170
+ ceremony: CeremonyRecord;
171
+ /** Occurrences created for the rolling window by this write. */
172
+ occurrencesCreated: number;
173
+ }
174
+ /** A row of `ceremonies.listOccurrences` (ordered by start ascending, max 200). */
175
+ interface CeremonyOccurrenceListRow {
176
+ id: string;
177
+ ceremonyId: string;
178
+ scheduledStart: Date;
179
+ scheduledEnd: Date;
180
+ cadenceStart: Date | null;
181
+ status: CeremonyOccurrenceStatus;
182
+ ceremony: {
183
+ id: string;
184
+ name: string;
185
+ kind: CeremonyKind;
186
+ };
187
+ }
188
+ type CeremonyAgendaRefType = 'action' | 'decision' | 'key_result' | 'goal' | 'ticket' | 'cycle' | 'meeting' | 'project' | 'text';
189
+ interface CeremonyAgendaItem {
190
+ /** Stable per occurrence: `<sectionKey>:<refType>:<refId>` for query items. */
191
+ id: string;
192
+ sectionKey: string;
193
+ title: string;
194
+ refType: CeremonyAgendaRefType;
195
+ /** The underlying record's id; for `text` items, the item id itself. */
196
+ refId: string;
197
+ goalId?: number | null;
198
+ keyResultId?: string | null;
199
+ goalTitle?: string | null;
200
+ keyResultTitle?: string | null;
201
+ /** Set when carried from a previous occurrence's unresolved list. */
202
+ carriedFromOccurrenceId?: string | null;
203
+ carryCount?: number | null;
204
+ /** Set when a person added the item by hand; those survive regeneration. */
205
+ addedByUserId?: string | null;
206
+ /** ISO timestamp; null/absent while unresolved. */
207
+ resolvedAt?: string | null;
208
+ order: number;
209
+ /** Who the item belongs to (a project's DRI). */
210
+ owner?: string | null;
211
+ detail?: string | null;
212
+ /** `detail` split into lines for the Matrix post; older snapshots hold plain strings. */
213
+ lines?: Array<unknown[] | string> | null;
214
+ /** App-relative link to the record. */
215
+ href?: string | null;
216
+ }
217
+ interface CeremonyAgendaSection {
218
+ key: string;
219
+ type: string;
220
+ title: string;
221
+ minutes?: number | null;
222
+ items: CeremonyAgendaItem[];
223
+ /** Why the section is empty, when its query ran and found nothing. */
224
+ emptyReason?: string | null;
225
+ }
226
+ interface CeremonyAgendaMatrixPost {
227
+ roomId: string;
228
+ serverId: string;
229
+ eventId: string;
230
+ postedAt: string;
231
+ postedById: string | null;
232
+ /** Set when the post was taken back out of the room. */
233
+ removedAt?: string | null;
234
+ removedById?: string | null;
235
+ }
236
+ /** The agenda snapshot stored on an occurrence (ISO strings, not Dates). */
237
+ interface CeremonyAgenda {
238
+ version: 1;
239
+ generatedAt: string;
240
+ sections: CeremonyAgendaSection[];
241
+ /** Markdown narrative rendered from the sections. */
242
+ narrative?: string | null;
243
+ narratedAt?: string | null;
244
+ matrixPosts?: CeremonyAgendaMatrixPost[];
245
+ }
246
+ /** Why an empty-agenda skip is (not) being offered to the owner. */
247
+ interface CeremonySkipProposal {
248
+ proposed: boolean;
249
+ reason: 'agenda-has-items' | 'blocker-flagged' | 'no-agenda-yet' | 'not-async' | 'already-resolved' | null;
250
+ }
251
+ /** One occurrence — the ceremony meeting page — from `ceremonies.getOccurrence`. */
252
+ interface CeremonyOccurrence {
253
+ id: string;
254
+ ceremonyId: string;
255
+ workspaceId: string;
256
+ scheduledStart: Date;
257
+ scheduledEnd: Date;
258
+ cadenceStart: Date | null;
259
+ status: CeremonyOccurrenceStatus;
260
+ skipReason: string | null;
261
+ /** True when this is a one-off meeting booked from a project. */
262
+ isOneOff: boolean;
263
+ /** The ceremony's purpose (for a one-off, what this meeting is about). */
264
+ purpose: string | null;
265
+ /** The calendar booking, when one exists. Attendee names only, no addresses. */
266
+ scheduledMeeting: {
267
+ id: string;
268
+ status: string;
269
+ organizerId: string | null;
270
+ attendees: Array<{
271
+ userId: string | null;
272
+ name: string | null;
273
+ }>;
274
+ } | null;
275
+ /** The ceremony definition as it was when this occurrence was created. */
276
+ definitionSnapshot: unknown;
277
+ /** Null until an agenda has been generated. */
278
+ agenda: CeremonyAgenda | null;
279
+ agendaGeneratedAt: Date | null;
280
+ agendaCirculatedAt: Date | null;
281
+ scheduledMeetingId: string | null;
282
+ previousOccurrenceId: string | null;
283
+ /** The occurrence's notes canvas — a Knowledge Page, created with the agenda. */
284
+ notesPageId: string | null;
285
+ createdAt: Date;
286
+ updatedAt: Date;
287
+ ceremony: {
288
+ id: string;
289
+ name: string;
290
+ kind: CeremonyKind;
291
+ timezone: string;
292
+ durationMinutes: number;
293
+ leadTimeHours: number;
294
+ ownerId: string;
295
+ matrixRoomId: string | null;
296
+ agendaTemplate: CeremonyAgendaTemplateSection[];
297
+ isOneOff: boolean;
298
+ purpose: string | null;
299
+ owner: CeremonyUserRef;
300
+ };
301
+ recordedMeetings: CeremonyRecordedMeeting[];
302
+ /** Whether the caller may generate, skip or post this occurrence's agenda. */
303
+ canGenerate: boolean;
304
+ skipProposal: CeremonySkipProposal;
305
+ }
306
+ /** A per-person async question (only STANDUP has them today). */
307
+ interface CeremonyUpdateQuestion {
308
+ key: string;
309
+ prompt: string;
310
+ placeholder: string;
311
+ draftFrom: string[];
312
+ }
313
+ /** The caller's own async update for an occurrence. Answers are Markdown keyed by question key. */
314
+ interface CeremonyMyUpdate {
315
+ questions: CeremonyUpdateQuestion[];
316
+ draftAnswers: Record<string, string>;
317
+ answers: Record<string, string>;
318
+ draftedAt: Date | null;
319
+ submittedAt: Date | null;
320
+ flaggedBlocker: boolean;
321
+ /** Only on `myOccurrenceUpdate`. */
322
+ isParticipant?: boolean;
323
+ }
324
+ interface CeremonyParticipantUpdate {
325
+ userId: string;
326
+ name: string | null;
327
+ email: string | null;
328
+ image: string | null;
329
+ answers: Record<string, string>;
330
+ /** Null for participants who haven't submitted. */
331
+ submittedAt: Date | null;
332
+ flaggedBlocker: boolean;
333
+ }
334
+ /** Every participant's submitted update — the meeting, held in writing. */
335
+ interface CeremonyUpdateSummary {
336
+ questions: CeremonyUpdateQuestion[];
337
+ participants: CeremonyParticipantUpdate[];
338
+ submittedCount: number;
339
+ blockedCount: number;
340
+ }
341
+ interface CeremonyAgendaResult {
342
+ occurrenceId: string;
343
+ agenda: CeremonyAgenda;
344
+ }
345
+ interface CeremonyGenerateAgendaResult extends CeremonyAgendaResult {
346
+ itemCount: number;
347
+ /** True when `circulate` was requested and participants were notified. */
348
+ circulated: boolean;
349
+ }
350
+ interface CeremonySkipResult {
351
+ id: string;
352
+ status: CeremonyOccurrenceStatus;
353
+ skipReason: string | null;
354
+ }
355
+ type CeremonyMatrixPostResult = {
356
+ kind: 'posted';
357
+ roomId: string;
358
+ eventId: string;
359
+ } | {
360
+ kind: 'no-room';
361
+ } | {
362
+ kind: 'no-agenda';
363
+ } | {
364
+ kind: 'already-posted';
365
+ roomId: string;
366
+ postedAt: string;
367
+ } | {
368
+ kind: 'no-server';
369
+ reason: string;
370
+ } | {
371
+ kind: 'failed';
372
+ reason: string;
373
+ };
374
+ type CeremonyMatrixRemoveResult = {
375
+ kind: 'removed';
376
+ roomId: string;
377
+ eventId: string;
378
+ } | {
379
+ kind: 'already-removed';
380
+ roomId: string;
381
+ removedAt: string;
382
+ } | {
383
+ kind: 'not-found';
384
+ } | {
385
+ kind: 'failed';
386
+ reason: string;
387
+ };
388
+ /** A built-in template for one ceremony kind ("Add from template"). */
389
+ interface CeremonyTemplate {
390
+ kind: CeremonyKind;
391
+ name: string;
392
+ slug: string;
393
+ aliases: string[];
394
+ purpose: string;
395
+ notFor: string;
396
+ inputs: string;
397
+ outputs: string;
398
+ cadenceRule: string;
399
+ durationMinutes: number;
400
+ leadTimeHours: number;
401
+ agendaTemplate: CeremonyAgendaTemplateSection[];
402
+ }
403
+ interface CeremonyImportResult {
404
+ slug: string;
405
+ action: 'created' | 'updated';
406
+ occurrencesCreated: number;
407
+ /** Owner / participant names that matched no workspace member. */
408
+ unresolved: string[];
409
+ }
410
+ interface CeremonyBackfillRow {
411
+ meetingId: string;
412
+ title: string | null;
413
+ anchorDate: Date;
414
+ occurrenceId: string | null;
415
+ ceremonyName: string | null;
416
+ scheduledStart: Date | null;
417
+ reason: string;
418
+ }
419
+ interface CeremonyBackfillResult {
420
+ dryRun: boolean;
421
+ occurrencesCreated: number;
422
+ scanned: number;
423
+ matched: number;
424
+ rows: CeremonyBackfillRow[];
425
+ }
426
+ interface CeremonyMeetingAttachment {
427
+ meetingId: string;
428
+ occurrenceId: string | null;
429
+ }
430
+ /** One row of a project's Meetings timeline (`listOccurrencesForProject`), newest first. */
431
+ interface ProjectOccurrenceRow {
432
+ occurrenceId: string;
433
+ ceremonyId: string;
434
+ ceremonyName: string;
435
+ isOneOff: boolean;
436
+ /** A one-off's purpose; null for recurring ceremonies. */
437
+ purpose: string | null;
438
+ scheduledStart: Date;
439
+ scheduledEnd: Date;
440
+ status: CeremonyOccurrenceStatus;
441
+ attendeeCount: number;
442
+ /** App-relative occurrence page; null for project-only guests who can't open it. */
443
+ href: string | null;
444
+ }
445
+ /** The ceremony that meets in a video room, and the occurrence on at the time asked. */
446
+ interface CeremonyMeetingUrlMatch {
447
+ workspace: {
448
+ id: string;
449
+ name: string;
450
+ };
451
+ ceremony: {
452
+ id: string;
453
+ name: string;
454
+ };
455
+ /** Set when the ceremony reviews exactly one project. */
456
+ project: {
457
+ id: string;
458
+ name: string;
459
+ } | null;
460
+ occurrence: {
461
+ id: string;
462
+ scheduledStart: Date;
463
+ scheduledEnd: Date;
464
+ } | null;
465
+ }
466
+ interface CeremonyAddedOccurrence {
467
+ id: string;
468
+ scheduledStart: Date;
469
+ scheduledEnd: Date;
470
+ cadenceStart: Date | null;
471
+ status: CeremonyOccurrenceStatus;
472
+ }
473
+ interface CeremonyRescheduledOccurrence {
474
+ id: string;
475
+ scheduledStart: Date;
476
+ scheduledEnd: Date;
477
+ /** The old start; null when the new time equals the old one (no-op). */
478
+ movedFrom: Date | null;
479
+ }
480
+
481
+ /** Definition fields shared by create and update. */
482
+ interface CeremonyFields {
483
+ /** Max 120 characters. */
484
+ name: string;
485
+ /** Unique per workspace; derived from `name` when omitted on create. */
486
+ slug?: string;
487
+ /** Title patterns that auto-attach recorded meetings (max 20). */
488
+ aliases?: string[];
489
+ /** Defaults to `CUSTOM`. Drives the default agenda and the async questions. */
490
+ kind?: CeremonyKind;
491
+ /** Icon key; null resets to the kind's default. */
492
+ icon?: string | null;
493
+ purpose?: string | null;
494
+ notFor?: string | null;
495
+ inputs?: string | null;
496
+ outputs?: string | null;
497
+ /** RRULE body, e.g. `FREQ=WEEKLY;BYDAY=MO;BYHOUR=10;BYMINUTE=0`. Validated server-side. */
498
+ cadenceRule: string;
499
+ /** IANA zone, e.g. `Europe/Madrid`. */
500
+ timezone: string;
501
+ /** Anchor date the cadence expands from. */
502
+ startsOn: Date;
503
+ /** 5-1440; defaults to 30. */
504
+ durationMinutes?: number;
505
+ /** 0-336; defaults to 24. */
506
+ leadTimeHours?: number;
507
+ /** Defaults to the caller on create. */
508
+ ownerId?: string;
509
+ productId?: string | null;
510
+ teamId?: string | null;
511
+ /** Projects in the same workspace. Replaces the whole set on update. */
512
+ projectIds?: string[];
513
+ /** Replaces the whole set on update. */
514
+ participantUserIds?: string[];
515
+ agendaTemplate?: CeremonyAgendaTemplateSection[];
516
+ /** Append the linked-projects section to every agenda (default true). */
517
+ includeProjects?: boolean;
518
+ matrixRoomId?: string | null;
519
+ /** Video room link; recordings from it file themselves here. Empty string clears it. */
520
+ meetingUrl?: string | null;
521
+ /** Run "Extract outputs" on every attached recording (default false). */
522
+ autoExtractOutputs?: boolean;
523
+ }
524
+ interface CeremonyCreateInput extends CeremonyFields {
525
+ workspaceId: string;
526
+ }
527
+ /**
528
+ * Partial edit. Changing the cadence, zone, anchor or duration deletes future
529
+ * PLANNED occurrences with no booking or recording, along with any agenda, notes
530
+ * link and async updates on them, and recreates them with new ids. Occurrences
531
+ * moved or added by hand stay.
532
+ */
533
+ interface CeremonyUpdateInput extends Partial<CeremonyFields> {
534
+ workspaceId: string;
535
+ id: string;
536
+ /** false retires the ceremony; true re-activates it and refills its window. */
537
+ isActive?: boolean;
538
+ }
539
+ interface CeremonyListOccurrencesInput {
540
+ workspaceId: string;
541
+ from: Date;
542
+ to: Date;
543
+ ceremonyId?: string;
544
+ }
545
+ /** An import-file definition: the template shape keyed by slug, people by name or email. */
546
+ interface CeremonyImportDefinition extends Partial<Omit<CeremonyFields, 'ownerId' | 'participantUserIds' | 'productId' | 'teamId' | 'projectIds' | 'slug'>> {
547
+ slug: string;
548
+ ownerName?: string;
549
+ participantNames?: string[];
550
+ }
551
+ interface CeremonyImportInput {
552
+ workspaceId: string;
553
+ /** 1-50 definitions. */
554
+ definitions: CeremonyImportDefinition[];
555
+ /** Default zone for definitions that carry none. */
556
+ timezone?: string;
557
+ /** Default anchor for definitions that carry none. */
558
+ startsOn?: Date;
559
+ }
560
+ interface CeremonySaveMyUpdateInput {
561
+ workspaceId: string;
562
+ occurrenceId: string;
563
+ /** Markdown answers keyed by question key (`done`, `today`, `blockers` for a standup). */
564
+ answers: Record<string, string>;
565
+ flaggedBlocker?: boolean;
566
+ /** true submits; false reopens a submitted update; omitted leaves it as is. */
567
+ submit?: boolean;
568
+ }
569
+ interface CeremonyAddAgendaItemInput {
570
+ workspaceId: string;
571
+ occurrenceId: string;
572
+ /** The agenda section's `key`. */
573
+ sectionKey: string;
574
+ /** Max 300 characters. */
575
+ title: string;
576
+ /** Max 500 characters. */
577
+ detail?: string | null;
578
+ }
579
+ /**
580
+ * Ceremonies — recurring meeting definitions and their occurrences (ADR-0059).
581
+ *
582
+ * A ceremony is the definition listed at Settings → Ceremonies; an occurrence
583
+ * is one scheduled instance of it, the page at
584
+ * `/w/<slug>/ceremonies/<ceremonyId>/<occurrenceId>`. Decisions logged in an
585
+ * occurrence live in {@link DecisionsApi} (`occurrenceId` on the decision).
586
+ *
587
+ * Reads need workspace `view`; writes need `edit`. Generating, skipping or
588
+ * posting an agenda additionally needs to be the ceremony owner (or a
589
+ * workspace owner/admin); import and backfill need `manage_members`.
590
+ */
591
+ declare class CeremoniesApi {
592
+ private client;
593
+ constructor(client: TrpcClient);
594
+ /** Built-in templates, one per kind — the "Add from template" list. */
595
+ templates(): Promise<CeremonyTemplate[]>;
596
+ /** Ceremonies of a workspace, active first then by name. Inactive ones only on request. */
597
+ list(workspaceId: string, options?: {
598
+ includeInactive?: boolean;
599
+ }): Promise<CeremonySummary[]>;
600
+ /** Active ceremonies linked to a project, each with its next planned occurrence. */
601
+ listForProject(projectId: string): Promise<ProjectCeremony[]>;
602
+ /**
603
+ * A project's Meetings timeline: occurrences of the ceremonies reviewing it
604
+ * (one-offs included), two weeks back to one week ahead by default, newest
605
+ * first, at most `perCeremony` (default 5) per recurring ceremony.
606
+ */
607
+ listOccurrencesForProject(input: {
608
+ projectId: string;
609
+ from?: Date;
610
+ to?: Date;
611
+ perCeremony?: number;
612
+ }): Promise<ProjectOccurrenceRow[]>;
613
+ /**
614
+ * The ceremony that meets in a video room, with the occurrence on at `at`
615
+ * (default now). Searches all your workspaces unless `workspaceId` narrows
616
+ * it; null when nothing (or nothing unambiguous) matches.
617
+ */
618
+ matchMeetingUrl(input: {
619
+ url: string;
620
+ at?: Date;
621
+ workspaceId?: string;
622
+ }): Promise<CeremonyMeetingUrlMatch | null>;
623
+ /** One ceremony with participants, projects and its recent + upcoming occurrences. */
624
+ get(workspaceId: string, id: string): Promise<Ceremony>;
625
+ /** Occurrences starting inside a window, across ceremonies or for one (max 200). */
626
+ listOccurrences(input: CeremonyListOccurrencesInput): Promise<CeremonyOccurrenceListRow[]>;
627
+ /** One occurrence — the meeting page — with its agenda, ceremony and recordings. */
628
+ getOccurrence(workspaceId: string, occurrenceId: string): Promise<CeremonyOccurrence>;
629
+ /** The caller's own async update for an occurrence. */
630
+ myUpdate(workspaceId: string, occurrenceId: string): Promise<CeremonyMyUpdate>;
631
+ /** Every participant's submitted update, and who hasn't answered. */
632
+ updateSummary(workspaceId: string, occurrenceId: string): Promise<CeremonyUpdateSummary>;
633
+ /** Draft the caller's answers from their activity since the previous occurrence. */
634
+ draftMyUpdate(workspaceId: string, occurrenceId: string): Promise<CeremonyMyUpdate>;
635
+ /** Save, submit or reopen the caller's own answers. */
636
+ saveMyUpdate(input: CeremonySaveMyUpdateInput): Promise<CeremonyMyUpdate>;
637
+ /**
638
+ * Generate or regenerate an occurrence's agenda. `circulate` also notifies
639
+ * participants and posts to the ceremony's Matrix room, and it re-sends both
640
+ * if they already went out, so don't retry it blindly.
641
+ */
642
+ generateAgenda(workspaceId: string, occurrenceId: string, options?: {
643
+ circulate?: boolean;
644
+ }): Promise<CeremonyGenerateAgendaResult>;
645
+ /**
646
+ * Skip an occurrence with a reason (1-500 characters). Participants are
647
+ * told. Skipping a booked one-off cancels the meeting: every attendee with an
648
+ * address gets a calendar cancellation, the ceremony is retired, and it can't
649
+ * be unskipped.
650
+ */
651
+ skipOccurrence(workspaceId: string, occurrenceId: string, reason: string): Promise<CeremonySkipResult>;
652
+ unskipOccurrence(workspaceId: string, occurrenceId: string): Promise<CeremonySkipResult>;
653
+ /** Add one occurrence at any time — a meeting off the cadence (owner, or workspace owner/admin). */
654
+ addOccurrence(workspaceId: string, ceremonyId: string, scheduledStart: Date): Promise<CeremonyAddedOccurrence>;
655
+ /**
656
+ * Move an occurrence that hasn't happened to another time (owner, or
657
+ * workspace owner/admin). It keeps its agenda, notes, updates and recordings.
658
+ */
659
+ rescheduleOccurrence(workspaceId: string, occurrenceId: string, scheduledStart: Date): Promise<CeremonyRescheduledOccurrence>;
660
+ /** Mark an agenda item resolved, or reopen it. Survives regeneration. */
661
+ resolveAgendaItem(workspaceId: string, occurrenceId: string, itemId: string, resolved?: boolean): Promise<CeremonyAgendaResult>;
662
+ /** Add an item by hand to an agenda section; kept across regeneration. */
663
+ addAgendaItem(input: CeremonyAddAgendaItemInput): Promise<CeremonyAgendaResult>;
664
+ /** Reorder one section's items; the order is kept across regeneration. */
665
+ reorderAgendaItems(workspaceId: string, occurrenceId: string, sectionKey: string, itemIds: string[]): Promise<CeremonyAgendaResult>;
666
+ /** Post the agenda to the ceremony's Matrix room. A repost needs `confirmRepost`. */
667
+ postAgendaToMatrix(workspaceId: string, occurrenceId: string, options?: {
668
+ confirmRepost?: boolean;
669
+ }): Promise<CeremonyMatrixPostResult>;
670
+ /** Take one of the bot's agenda posts back out of its Matrix room. `eventId` comes from `agenda.matrixPosts`. */
671
+ removeAgendaFromMatrix(workspaceId: string, occurrenceId: string, eventId: string): Promise<CeremonyMatrixRemoveResult>;
672
+ /** Create a ceremony and its first occurrences for the rolling window. */
673
+ create(input: CeremonyCreateInput): Promise<CeremonyWriteResult>;
674
+ update(input: CeremonyUpdateInput): Promise<CeremonyWriteResult>;
675
+ /** Upsert definitions by slug. Keys a definition omits are left untouched. */
676
+ importDefinitions(input: CeremonyImportInput): Promise<CeremonyImportResult[]>;
677
+ /**
678
+ * Attach unattached recordings to occurrences by alias. Defaults to a dry
679
+ * run — the report is the review step; pass `dryRun: false` to write. Even a
680
+ * dry run writes one thing: it schedules any missing occurrences of active
681
+ * ceremonies, so that historical ones exist to attach to.
682
+ */
683
+ backfillAttachments(workspaceId: string, options?: {
684
+ dryRun?: boolean;
685
+ }): Promise<CeremonyBackfillResult>;
686
+ /** Link a recorded meeting to the occurrence it captured (same workspace). */
687
+ attachMeeting(meetingId: string, occurrenceId: string): Promise<CeremonyMeetingAttachment>;
688
+ detachMeeting(meetingId: string): Promise<CeremonyMeetingAttachment>;
689
+ }
690
+
691
+ /**
692
+ * Positions (ADR-0068): the roles & responsibilities of a workspace — "who
693
+ * does what", for humans and agents alike. Shown on the workspace settings
694
+ * page. Routing data only: a Position never grants or restricts access;
695
+ * the member's workspace role does that.
696
+ */
697
+ /** Someone who holds a Position. Always a member of the workspace. */
698
+ interface PositionHolder {
699
+ userId: string;
700
+ name: string | null;
701
+ image: string | null;
702
+ isAgent: boolean;
703
+ }
704
+ interface Position {
705
+ id: string;
706
+ /** 1–80 characters, unique per workspace (case-sensitive). */
707
+ title: string;
708
+ /** Markdown, 1–2000 characters: the kinds of work its holders take on. */
709
+ remit: string;
710
+ /** Markdown, up to 2000 characters. */
711
+ notAccountableFor: string | null;
712
+ holders: PositionHolder[];
713
+ }
714
+ /** One row per workspace member, from `positions.list()`. */
715
+ interface PositionMemberCoverage {
716
+ userId: string;
717
+ /** Ids of the Positions this member holds. */
718
+ positionIds: string[];
719
+ /** True when the member has no stated remit (no Position, and no agent description). */
720
+ remitGap: boolean;
721
+ }
722
+ interface PositionList {
723
+ positions: Position[];
724
+ members: PositionMemberCoverage[];
725
+ }
726
+ interface PositionCoverage {
727
+ /** Whether the chat would offer "Import roles & responsibilities". */
728
+ offerImport: boolean;
729
+ memberCount: number;
730
+ eligibleCount: number;
731
+ coveredCount: number;
732
+ }
733
+ /** One row of an import result, in input order. */
734
+ interface PositionImportResult {
735
+ title: string;
736
+ outcome: 'create' | 'update';
737
+ /** The value after the import. */
738
+ notAccountableFor: string | null;
739
+ /** Every holder after the import. */
740
+ holderUserIds: string[];
741
+ }
742
+ interface PositionImportOutput {
743
+ /** False for a dry run. */
744
+ written: boolean;
745
+ results: PositionImportResult[];
746
+ }
747
+
748
+ interface PositionCreateInput {
749
+ workspaceId: string;
750
+ /** 1–80 characters, unique per workspace. */
751
+ title: string;
752
+ /** Markdown, 1–2000 characters. */
753
+ remit: string;
754
+ /** Markdown, up to 2000 characters. */
755
+ notAccountableFor?: string;
756
+ /** Member userIds (max 50). Every one must belong to the workspace. */
757
+ holderUserIds?: string[];
758
+ }
759
+ /** At least one field besides the ids must be present. */
760
+ interface PositionUpdateInput {
761
+ workspaceId: string;
762
+ positionId: string;
763
+ title?: string;
764
+ remit?: string;
765
+ /** `null` or `""` clears it. */
766
+ notAccountableFor?: string | null;
767
+ /** Replaces the whole holder set (owner/admin only). */
768
+ holderUserIds?: string[];
769
+ }
770
+ interface PositionImportRow {
771
+ title: string;
772
+ remit: string;
773
+ /** Omit to keep the stored value on an update; `""` clears it. */
774
+ notAccountableFor?: string;
775
+ holderUserIds: string[];
776
+ }
777
+ interface PositionImportInput {
778
+ workspaceId: string;
779
+ /** Validate and return the plan without writing. */
780
+ dryRun: boolean;
781
+ /** 1–50 rows, titles unique (case-insensitive), at most 200 distinct holders. */
782
+ positions: PositionImportRow[];
783
+ }
784
+ /**
785
+ * Positions — a workspace's roles & responsibilities (ADR-0068).
786
+ *
787
+ * Every write is human-only: it needs a person's own API token (`exponential
788
+ * auth login`), and an agent key is refused with FORBIDDEN. Owners and admins
789
+ * create, rename, delete, set holders and import; a member may edit the
790
+ * remit of a Position they hold.
791
+ */
792
+ declare class PositionsApi {
793
+ private client;
794
+ constructor(client: TrpcClient);
795
+ /** Every Position with its holders, plus each member's coverage. */
796
+ list(workspaceId: string): Promise<PositionList>;
797
+ /** One Position by id, from `list` (the router has no single-row read). */
798
+ get(workspaceId: string, positionId: string): Promise<Position | null>;
799
+ /** How many members have a stated remit, and whether to offer an import. */
800
+ coverage(workspaceId: string): Promise<PositionCoverage>;
801
+ create(input: PositionCreateInput): Promise<Position>;
802
+ update(input: PositionUpdateInput): Promise<Position>;
803
+ /** Holders cascade. */
804
+ delete(workspaceId: string, positionId: string): Promise<{
805
+ id: string;
806
+ }>;
807
+ /** Replace the holder set; `[]` removes everyone. */
808
+ setHolders(workspaceId: string, positionId: string, userIds: string[]): Promise<Position>;
809
+ /**
810
+ * Upsert many Positions by title (matched case-insensitively, never renamed).
811
+ * An update replaces the remit and only ADDS holders. Run with
812
+ * `dryRun: true` first to see the plan.
813
+ */
814
+ importMany(input: PositionImportInput): Promise<PositionImportOutput>;
815
+ }
816
+
4
817
  type ActionInput = {
5
818
  assigneeId?: string;
6
819
  };
@@ -382,6 +1195,40 @@ interface TrpcClient {
382
1195
  }) => Promise<unknown[]>;
383
1196
  };
384
1197
  };
1198
+ position: {
1199
+ list: {
1200
+ query: (input: {
1201
+ workspaceId: string;
1202
+ }) => Promise<unknown>;
1203
+ };
1204
+ coverage: {
1205
+ query: (input: {
1206
+ workspaceId: string;
1207
+ }) => Promise<unknown>;
1208
+ };
1209
+ create: {
1210
+ mutate: (input: PositionCreateInput) => Promise<unknown>;
1211
+ };
1212
+ update: {
1213
+ mutate: (input: PositionUpdateInput) => Promise<unknown>;
1214
+ };
1215
+ delete: {
1216
+ mutate: (input: {
1217
+ workspaceId: string;
1218
+ positionId: string;
1219
+ }) => Promise<unknown>;
1220
+ };
1221
+ setHolders: {
1222
+ mutate: (input: {
1223
+ workspaceId: string;
1224
+ positionId: string;
1225
+ userIds: string[];
1226
+ }) => Promise<unknown>;
1227
+ };
1228
+ importMany: {
1229
+ mutate: (input: PositionImportInput) => Promise<unknown>;
1230
+ };
1231
+ };
385
1232
  goal: {
386
1233
  getById: {
387
1234
  query: (input: {
@@ -551,17 +1398,6 @@ interface TrpcClient {
551
1398
  mutate: (input: {
552
1399
  pageId: string;
553
1400
  body: string;
554
- quotedText?: string;
555
- quoteContext?: {
556
- prefix?: string;
557
- suffix?: string;
558
- };
559
- }) => Promise<unknown>;
560
- };
561
- reply: {
562
- mutate: (input: {
563
- parentId: string;
564
- body: string;
565
1401
  }) => Promise<unknown>;
566
1402
  };
567
1403
  update: {
@@ -575,18 +1411,6 @@ interface TrpcClient {
575
1411
  commentId: string;
576
1412
  }) => Promise<unknown>;
577
1413
  };
578
- resolve: {
579
- mutate: (input: {
580
- pageId: string;
581
- threadId: string;
582
- }) => Promise<unknown>;
583
- };
584
- unresolve: {
585
- mutate: (input: {
586
- pageId: string;
587
- threadId: string;
588
- }) => Promise<unknown>;
589
- };
590
1414
  };
591
1415
  /** Local-runner side of Agent runs (ADR-0067); agent-key principals only. */
592
1416
  agentRun: {
@@ -751,6 +1575,166 @@ interface TrpcClient {
751
1575
  }) => Promise<unknown>;
752
1576
  };
753
1577
  };
1578
+ ceremony: {
1579
+ templates: {
1580
+ query: () => Promise<unknown[]>;
1581
+ };
1582
+ list: {
1583
+ query: (input: {
1584
+ workspaceId: string;
1585
+ includeInactive?: boolean;
1586
+ }) => Promise<unknown[]>;
1587
+ };
1588
+ listForProject: {
1589
+ query: (input: {
1590
+ projectId: string;
1591
+ }) => Promise<unknown[]>;
1592
+ };
1593
+ listOccurrencesForProject: {
1594
+ query: (input: {
1595
+ projectId: string;
1596
+ from?: Date;
1597
+ to?: Date;
1598
+ perCeremony?: number;
1599
+ }) => Promise<unknown[]>;
1600
+ };
1601
+ matchMeetingUrl: {
1602
+ query: (input: {
1603
+ url: string;
1604
+ at?: Date;
1605
+ workspaceId?: string;
1606
+ }) => Promise<unknown>;
1607
+ };
1608
+ get: {
1609
+ query: (input: {
1610
+ workspaceId: string;
1611
+ id: string;
1612
+ }) => Promise<unknown>;
1613
+ };
1614
+ listOccurrences: {
1615
+ query: (input: CeremonyListOccurrencesInput) => Promise<unknown[]>;
1616
+ };
1617
+ getOccurrence: {
1618
+ query: (input: {
1619
+ workspaceId: string;
1620
+ occurrenceId: string;
1621
+ }) => Promise<unknown>;
1622
+ };
1623
+ myOccurrenceUpdate: {
1624
+ query: (input: {
1625
+ workspaceId: string;
1626
+ occurrenceId: string;
1627
+ }) => Promise<unknown>;
1628
+ };
1629
+ occurrenceUpdateSummary: {
1630
+ query: (input: {
1631
+ workspaceId: string;
1632
+ occurrenceId: string;
1633
+ }) => Promise<unknown>;
1634
+ };
1635
+ draftMyOccurrenceUpdate: {
1636
+ mutate: (input: {
1637
+ workspaceId: string;
1638
+ occurrenceId: string;
1639
+ }) => Promise<unknown>;
1640
+ };
1641
+ saveMyOccurrenceUpdate: {
1642
+ mutate: (input: CeremonySaveMyUpdateInput) => Promise<unknown>;
1643
+ };
1644
+ generateAgenda: {
1645
+ mutate: (input: {
1646
+ workspaceId: string;
1647
+ occurrenceId: string;
1648
+ circulate?: boolean;
1649
+ }) => Promise<unknown>;
1650
+ };
1651
+ skipOccurrence: {
1652
+ mutate: (input: {
1653
+ workspaceId: string;
1654
+ occurrenceId: string;
1655
+ reason: string;
1656
+ }) => Promise<unknown>;
1657
+ };
1658
+ unskipOccurrence: {
1659
+ mutate: (input: {
1660
+ workspaceId: string;
1661
+ occurrenceId: string;
1662
+ }) => Promise<unknown>;
1663
+ };
1664
+ addOccurrence: {
1665
+ mutate: (input: {
1666
+ workspaceId: string;
1667
+ ceremonyId: string;
1668
+ scheduledStart: Date;
1669
+ }) => Promise<unknown>;
1670
+ };
1671
+ rescheduleOccurrence: {
1672
+ mutate: (input: {
1673
+ workspaceId: string;
1674
+ occurrenceId: string;
1675
+ scheduledStart: Date;
1676
+ }) => Promise<unknown>;
1677
+ };
1678
+ resolveAgendaItem: {
1679
+ mutate: (input: {
1680
+ workspaceId: string;
1681
+ occurrenceId: string;
1682
+ itemId: string;
1683
+ resolved: boolean;
1684
+ }) => Promise<unknown>;
1685
+ };
1686
+ addAgendaItem: {
1687
+ mutate: (input: CeremonyAddAgendaItemInput) => Promise<unknown>;
1688
+ };
1689
+ reorderAgendaItems: {
1690
+ mutate: (input: {
1691
+ workspaceId: string;
1692
+ occurrenceId: string;
1693
+ sectionKey: string;
1694
+ itemIds: string[];
1695
+ }) => Promise<unknown>;
1696
+ };
1697
+ postAgendaToMatrix: {
1698
+ mutate: (input: {
1699
+ workspaceId: string;
1700
+ occurrenceId: string;
1701
+ confirmRepost?: boolean;
1702
+ }) => Promise<unknown>;
1703
+ };
1704
+ removeAgendaFromMatrix: {
1705
+ mutate: (input: {
1706
+ workspaceId: string;
1707
+ occurrenceId: string;
1708
+ eventId: string;
1709
+ }) => Promise<unknown>;
1710
+ };
1711
+ create: {
1712
+ mutate: (input: CeremonyCreateInput) => Promise<unknown>;
1713
+ };
1714
+ update: {
1715
+ mutate: (input: CeremonyUpdateInput) => Promise<unknown>;
1716
+ };
1717
+ importDefinitions: {
1718
+ mutate: (input: CeremonyImportInput) => Promise<unknown[]>;
1719
+ };
1720
+ backfillAttachments: {
1721
+ mutate: (input: {
1722
+ workspaceId: string;
1723
+ dryRun: boolean;
1724
+ }) => Promise<unknown>;
1725
+ };
1726
+ attachMeeting: {
1727
+ mutate: (input: {
1728
+ meetingId: string;
1729
+ occurrenceId: string;
1730
+ }) => Promise<unknown>;
1731
+ };
1732
+ detachMeeting: {
1733
+ mutate: (input: {
1734
+ meetingId: string;
1735
+ }) => Promise<unknown>;
1736
+ };
1737
+ };
754
1738
  crmApi: {
755
1739
  contactList: {
756
1740
  query: (input: {
@@ -1894,37 +2878,16 @@ interface FeatureComment {
1894
2878
  updatedAt: Date;
1895
2879
  createdBy: CommentAuthor;
1896
2880
  }
1897
- /**
1898
- * Comments on a Knowledge Page. `body` is Markdown. A comment is doc-level
1899
- * (`threadId` null) or part of a thread anchored to a span of the page body
1900
- * (`threadId` matches a comment mark; `quotedText` snapshots the span so the
1901
- * thread still reads if the text is later edited away). `parentId` marks a
1902
- * reply; threads are one level deep.
1903
- */
2881
+ /** Comments on a Knowledge Page — a flat, doc-level feed. `body` is Markdown. */
1904
2882
  interface PageComment {
1905
2883
  id: string;
1906
2884
  pageId: string;
1907
- threadId: string | null;
1908
- parentId: string | null;
1909
2885
  body: string;
1910
- quotedText: string | null;
1911
- resolvedAt: Date | null;
1912
2886
  createdById: string;
1913
2887
  createdAt: Date;
1914
2888
  updatedAt: Date;
1915
2889
  createdBy: CommentAuthor;
1916
2890
  }
1917
- /** What `pageComments.create` returns: the comment plus how its anchoring went. */
1918
- interface PageCommentCreated extends PageComment {
1919
- anchor: {
1920
- /** The page body now highlights the thread's span. False for doc-level
1921
- * comments and for a viewer's thread (viewers can't edit the body). */
1922
- anchored: boolean;
1923
- /** The page's `docVersion` after the highlight was written. */
1924
- docVersion?: number;
1925
- fastForward: boolean;
1926
- };
1927
- }
1928
2891
  /** Comments on a Goal/Objective. `content` is Markdown. */
1929
2892
  interface GoalComment {
1930
2893
  id: string;
@@ -2008,60 +2971,25 @@ interface PageCommentCreateInput {
2008
2971
  pageId: string;
2009
2972
  /** Markdown. Mention members with `@[Name](userId)` — see `workspaces.listMembers()`. */
2010
2973
  body: string;
2011
- /**
2012
- * Anchor the comment to this span of the page body, as it reads on the page
2013
- * (no Markdown syntax). The server mints the thread's `threadId`, finds the
2014
- * span and highlights it, and refuses the comment when the text matches no
2015
- * span, or several with nothing to choose between them. Omit for a doc-level
2016
- * comment.
2017
- */
2018
- quotedText?: string;
2019
- /**
2020
- * The text just before and/or after `quotedText`, to pick one occurrence
2021
- * when it appears more than once. Only with `quotedText`.
2022
- */
2023
- quoteContext?: {
2024
- prefix?: string;
2025
- suffix?: string;
2026
- };
2027
- }
2028
- interface PageCommentReplyInput {
2029
- parentId: string;
2030
- body: string;
2031
2974
  }
2032
2975
  interface PageCommentUpdateInput {
2033
2976
  commentId: string;
2034
2977
  body: string;
2035
2978
  }
2036
- interface PageCommentThreadInput {
2037
- pageId: string;
2038
- threadId: string;
2039
- }
2040
2979
  /**
2041
- * Discussion on a Knowledge Page: a doc-level feed under the page body, plus
2042
- * threads anchored to a span of it (`quotedText` on create). View access is
2043
- * the commenting gate: anyone the page is shared with can join the thread,
2044
- * but only an editor's anchored thread highlights the body. Editing and
2045
- * deleting are author-only.
2980
+ * Discussion on a Knowledge Page — a flat, doc-level feed under the page body.
2981
+ * View access is the commenting gate: anyone the page is shared with can join
2982
+ * the thread. Editing and deleting are author-only.
2046
2983
  */
2047
2984
  declare class PageCommentsApi {
2048
2985
  private client;
2049
2986
  constructor(client: TrpcClient);
2050
2987
  list(pageId: string): Promise<PageComment[]>;
2051
- create(input: PageCommentCreateInput): Promise<PageCommentCreated>;
2052
- /** Reply to an existing comment. Replies to replies still hang off the root. */
2053
- reply(input: PageCommentReplyInput): Promise<PageComment>;
2988
+ create(input: PageCommentCreateInput): Promise<PageComment>;
2054
2989
  update(input: PageCommentUpdateInput): Promise<PageComment>;
2055
2990
  delete(commentId: string): Promise<{
2056
2991
  success: boolean;
2057
2992
  }>;
2058
- /** Mark an anchored thread resolved. Only anchored threads have a threadId. */
2059
- resolve(input: PageCommentThreadInput): Promise<{
2060
- success: boolean;
2061
- }>;
2062
- unresolve(input: PageCommentThreadInput): Promise<{
2063
- success: boolean;
2064
- }>;
2065
2993
  }
2066
2994
 
2067
2995
  interface GoalCommentAddInput {
@@ -5564,6 +6492,10 @@ declare class ExponentialClient {
5564
6492
  keyResults: KeyResultsApi;
5565
6493
  projects: ProjectsApi;
5566
6494
  workspaces: WorkspacesApi;
6495
+ /** Positions — a workspace's roles & responsibilities (ADR-0068). */
6496
+ positions: PositionsApi;
6497
+ /** Ceremonies and their occurrences (ADR-0059). */
6498
+ ceremonies: CeremoniesApi;
5567
6499
  contacts: ContactsApi;
5568
6500
  decisions: DecisionsApi;
5569
6501
  organizations: OrganizationsApi;
@@ -5593,4 +6525,4 @@ declare class ExponentialClient {
5593
6525
  });
5594
6526
  }
5595
6527
 
5596
- export { type Action, type ActionComment, type ActionCommentAddInput, type ActionCommentUpdateInput, type ActionCreateInput, type ActionOutput, type ActionStatus, type ActionUpdateInput, type ActionUpsertBySourceInput, type ActionUpsertBySourceResult, type ActionsListOutput, type AddInteractionInput, type AddablePropertyType, type AgentRunStatus, AgentRunsApi, type AppendEventsResult, type Area, type AreaCreateInput, type AreaListOptions, type ClaimedRun, type CommentAuthor, type Contact, type ContactCreateInput, type ContactInteraction, type ContactListOutput, type ContactUpdateInput, type ContactsListOptions, type ConversationMessage, type CsvCellError, type CsvColumnTarget, type CsvCommitResult, type CsvMapping, type CsvPreview, type CsvPreviewColumn, type CsvPreviewRow, DEFAULT_GAP_MINUTES, type Database, type DatabaseCreateInput, type DatabaseFilter, type DatabasePropertyResult, type DatabaseRow, type DatabaseRowsPage, type DatabaseUpdateInput, type DatabaseView, type DayReport, type DayReportActionRow, type DayReportEntry, type DayReportProductRow, type Deal, type DealActivity, type DealCreateInput, type DealMoveInput, type DealUpdateInput, type Decision, type DecisionAdrRef, type DecisionChainRef, type DecisionCreateInput, type DecisionDecider, type DecisionDeciderInput, type DecisionEvidenceTurn, type DecisionFeatureRef, type DecisionLink, type DecisionListOptions, type DecisionListRow, type DecisionMeetingRef, type DecisionOccurrenceRef, type DecisionProductRef, type DecisionProjectRef, type DecisionReviewState, type DecisionSetStatusInput, type DecisionSource, type DecisionStatus, type DecisionTicketRef, type DecisionUpdateInput, type DecisionUserRef, type DeletedDatabase, type DraftDecisionsResult, type EnrichContactResult, type Epic, type EpicCreateInput, type EpicListOptions, type EpicPriority, type EpicStatus, type EpicUpdateInput, ExponentialClient, type ExponentialConfig, type Feature, type FeatureComment, type FeatureCommentCreateInput, type FeatureCommentReplyInput, type FeatureCommentThreadInput, type FeatureCommentUpdateInput, type FeatureCreateInput, type FeatureKeyResultLink, type FeatureLinkPageInput, type FeatureListOptions, type FeatureScope, type FeatureScopeStatus, type FeatureStatus, type FeatureUpdateInput, type FilterOp, type FinishInput, type FinishResult, type GlobalSearchOptions, type GlobalSearchOutput, type Goal, type GoalChildSummary, type GoalComment, type GoalCommentAddInput, type GoalCommentUpdateInput, type GoalCreateInput, type GoalHealth, type GoalKeyResultSummary, type GoalLifeDomain, type GoalListOptions, type GoalPeriod, type GoalProjectSummary, type GoalSetParentInput, type GoalSetStatusInput, type GoalStats, type GoalStatsOptions, type GoalStatus, type GoalTreeNode, type GoalTreeOptions, type GoalUpdateInput, type GoalUserSummary, type GoalWritableStatus, type HeartbeatResult, type InteractionDirection, type InteractionType, type KanbanStatus, type KeyResult, type KeyResultByObjectiveOptions, type KeyResultCheckIn, type KeyResultCheckInInput, type KeyResultCreateInput, type KeyResultFeatureLink, type KeyResultListOptions, type KeyResultProjectLink, type KeyResultStatus, type KeyResultUnit, type KeyResultUpdateInput, type KnowledgePage, type KnowledgeSearchOptions, type KnowledgeSearchOutput, type KnowledgeSearchResult, type KnowledgeSourceType, type LabelCreateInput, type LabelListOptions, type ListForEntityInput, type Meeting, type MeetingActionSummary, type MeetingCreateInput, type MeetingDecisions, type MeetingListOptions, type MeetingParticipant, type MeetingParticipantInput, type MeetingProjectRef, type MeetingSourceIntegration, type MeetingTypeFilter, type MeetingUpdateInput, type MeetingWorkspaceRef, type ObjectiveWithKeyResults, type Organization, type OrganizationCreateInput, type OrganizationListOutput, type OrganizationSize, type OrganizationsListOptions, type OverdueCohort, type OverdueTriage, type OverdueTriageRow, type PageComment, type PageCommentCreateInput, type PageCommentCreated, type PageCommentReplyInput, type PageCommentThreadInput, type PageCommentUpdateInput, type PageCreateInput, type PageDiff, type PageDiffOptions, type PageDiffSide, type PageGetFormat, type PageGetOptions, type PageHistory, type PageHistoryOptions, type PageListOptions, type PageOutlineEntry, type PageRestoreOptions, type PageRevision, type PageRevisionAuthor, type PageRevisionDetail, type PageRevisionKind, type PageSearchOptions, type PageSearchOutput, type PageSearchResult, type PageUpdateInput, type PillColor, type Pipeline, type PipelineStage, type Priority, type Product, type ProductCreateInput, type ProductUpdateInput, type Project, type ProjectDetail, type ProjectKeyResultLink, type ProjectOutput, type ProjectPriority, type ProjectStatus, type ProjectUpdateInput, type ProjectsListOptions, type ProjectsListOutput, type PropertyAddInput, type PropertyDef, type PropertyRejection, type PropertyType, type PropertyUpdateInput, type PropertyValue, ROUND_MINUTES, type ReadStatus, type RelationConfig, type RelationTargetKind, type Requirement, type RequirementCreateInput, type RequirementKind, type RequirementListOptions, type Resource, type ResourceContentType, type ResourceCreateInput, type ResourceListOptions, type ResourceListResult, type ResourceReadState, type ResourceUpdateInput, type RowListOptions, type RowValuesInput, type RowWriteOptions, type RunMessage, type RunnerEvent, type RunnerEventKind, type ScopeCreateInput, type ScopeListOptions, type ScopeUpdateInput, type SearchResult, type SearchResultType, type SearchResultWorkspace, type SelectOption, type SelectOptionInput, type SetEntityTagsInput, type SetEntityTagsResult, type Tag, type TagEntityType, type TagListResult, type Ticket, type TicketAssignee, type TicketComment, type TicketCommentAddInput, type TicketCommentUpdateInput, type TicketCreateInput, type TicketDependencyEdge, type TicketDetail, type TicketListOptions, type TicketSearchOptions, type TicketStatus, type TicketType, type TicketUpdateInput, TimeApi, type TimeConfirmDayResult, type TimeEntry, type TimeEntrySource, type TimeEntryStatus, type TimeLogBatchResult, type TimeLogInput, type TimeLogOutcome, type TimeLogResult, type TodaysActionRow, type TodaysActions, type TodaysActionsGroup, type UserStory, type UserStoryCreateInput, type UserStoryListOptions, type UserStoryUpdateInput, type WorklogSegment, type Workspace, type WorkspaceMember, type WorkspaceOutput, type WorkspacesListOutput, clearConfig, createConfigStore, getConfigPath, isAuthenticated, isTRPCError, loadConfig, saveConfig, segmentConversation };
6528
+ export { type Action, type ActionComment, type ActionCommentAddInput, type ActionCommentUpdateInput, type ActionCreateInput, type ActionOutput, type ActionStatus, type ActionUpdateInput, type ActionUpsertBySourceInput, type ActionUpsertBySourceResult, type ActionsListOutput, type AddInteractionInput, type AddablePropertyType, type AgentRunStatus, AgentRunsApi, type AppendEventsResult, type Area, type AreaCreateInput, type AreaListOptions, CeremoniesApi, type Ceremony, type CeremonyAddAgendaItemInput, type CeremonyAddedOccurrence, type CeremonyAgenda, type CeremonyAgendaItem, type CeremonyAgendaMatrixPost, type CeremonyAgendaRefType, type CeremonyAgendaResult, type CeremonyAgendaSection, type CeremonyAgendaTemplateSection, type CeremonyBackfillResult, type CeremonyBackfillRow, type CeremonyCreateInput, type CeremonyGenerateAgendaResult, type CeremonyImportDefinition, type CeremonyImportInput, type CeremonyImportResult, type CeremonyKind, type CeremonyListOccurrencesInput, type CeremonyMatrixPostResult, type CeremonyMatrixRemoveResult, type CeremonyMeetingAttachment, type CeremonyMeetingUrlMatch, type CeremonyMyUpdate, type CeremonyNamedRef, type CeremonyOccurrence, type CeremonyOccurrenceListRow, type CeremonyOccurrenceRow, type CeremonyOccurrenceStatus, type CeremonyParticipantUpdate, type CeremonyRecord, type CeremonyRecordedMeeting, type CeremonyRescheduledOccurrence, type CeremonySaveMyUpdateInput, type CeremonySkipProposal, type CeremonySkipResult, type CeremonySummary, type CeremonyTemplate, type CeremonyUpdateInput, type CeremonyUpdateQuestion, type CeremonyUpdateSummary, type CeremonyUserRef, type CeremonyWriteResult, type ClaimedRun, type CommentAuthor, type Contact, type ContactCreateInput, type ContactInteraction, type ContactListOutput, type ContactUpdateInput, type ContactsListOptions, type ConversationMessage, type CsvCellError, type CsvColumnTarget, type CsvCommitResult, type CsvMapping, type CsvPreview, type CsvPreviewColumn, type CsvPreviewRow, DEFAULT_GAP_MINUTES, type Database, type DatabaseCreateInput, type DatabaseFilter, type DatabasePropertyResult, type DatabaseRow, type DatabaseRowsPage, type DatabaseUpdateInput, type DatabaseView, type DayReport, type DayReportActionRow, type DayReportEntry, type DayReportProductRow, type Deal, type DealActivity, type DealCreateInput, type DealMoveInput, type DealUpdateInput, type Decision, type DecisionAdrRef, type DecisionChainRef, type DecisionCreateInput, type DecisionDecider, type DecisionDeciderInput, type DecisionEvidenceTurn, type DecisionFeatureRef, type DecisionLink, type DecisionListOptions, type DecisionListRow, type DecisionMeetingRef, type DecisionOccurrenceRef, type DecisionProductRef, type DecisionProjectRef, type DecisionReviewState, type DecisionSetStatusInput, type DecisionSource, type DecisionStatus, type DecisionTicketRef, type DecisionUpdateInput, type DecisionUserRef, type DeletedDatabase, type DraftDecisionsResult, type EnrichContactResult, type Epic, type EpicCreateInput, type EpicListOptions, type EpicPriority, type EpicStatus, type EpicUpdateInput, ExponentialClient, type ExponentialConfig, type Feature, type FeatureComment, type FeatureCommentCreateInput, type FeatureCommentReplyInput, type FeatureCommentThreadInput, type FeatureCommentUpdateInput, type FeatureCreateInput, type FeatureKeyResultLink, type FeatureLinkPageInput, type FeatureListOptions, type FeatureScope, type FeatureScopeStatus, type FeatureStatus, type FeatureUpdateInput, type FilterOp, type FinishInput, type FinishResult, type GlobalSearchOptions, type GlobalSearchOutput, type Goal, type GoalChildSummary, type GoalComment, type GoalCommentAddInput, type GoalCommentUpdateInput, type GoalCreateInput, type GoalHealth, type GoalKeyResultSummary, type GoalLifeDomain, type GoalListOptions, type GoalPeriod, type GoalProjectSummary, type GoalSetParentInput, type GoalSetStatusInput, type GoalStats, type GoalStatsOptions, type GoalStatus, type GoalTreeNode, type GoalTreeOptions, type GoalUpdateInput, type GoalUserSummary, type GoalWritableStatus, type HeartbeatResult, type InteractionDirection, type InteractionType, type KanbanStatus, type KeyResult, type KeyResultByObjectiveOptions, type KeyResultCheckIn, type KeyResultCheckInInput, type KeyResultCreateInput, type KeyResultFeatureLink, type KeyResultListOptions, type KeyResultProjectLink, type KeyResultStatus, type KeyResultUnit, type KeyResultUpdateInput, type KnowledgePage, type KnowledgeSearchOptions, type KnowledgeSearchOutput, type KnowledgeSearchResult, type KnowledgeSourceType, type LabelCreateInput, type LabelListOptions, type ListForEntityInput, type Meeting, type MeetingActionSummary, type MeetingCreateInput, type MeetingDecisions, type MeetingListOptions, type MeetingParticipant, type MeetingParticipantInput, type MeetingProjectRef, type MeetingSourceIntegration, type MeetingTypeFilter, type MeetingUpdateInput, type MeetingWorkspaceRef, type ObjectiveWithKeyResults, type Organization, type OrganizationCreateInput, type OrganizationListOutput, type OrganizationSize, type OrganizationsListOptions, type OverdueCohort, type OverdueTriage, type OverdueTriageRow, type PageComment, type PageCommentCreateInput, type PageCommentUpdateInput, type PageCreateInput, type PageDiff, type PageDiffOptions, type PageDiffSide, type PageGetFormat, type PageGetOptions, type PageHistory, type PageHistoryOptions, type PageListOptions, type PageOutlineEntry, type PageRestoreOptions, type PageRevision, type PageRevisionAuthor, type PageRevisionDetail, type PageRevisionKind, type PageSearchOptions, type PageSearchOutput, type PageSearchResult, type PageUpdateInput, type PillColor, type Pipeline, type PipelineStage, type Position, type PositionCoverage, type PositionCreateInput, type PositionHolder, type PositionImportInput, type PositionImportOutput, type PositionImportResult, type PositionImportRow, type PositionList, type PositionMemberCoverage, type PositionUpdateInput, PositionsApi, type Priority, type Product, type ProductCreateInput, type ProductUpdateInput, type Project, type ProjectCeremony, type ProjectDetail, type ProjectKeyResultLink, type ProjectOccurrenceRow, type ProjectOutput, type ProjectPriority, type ProjectStatus, type ProjectUpdateInput, type ProjectsListOptions, type ProjectsListOutput, type PropertyAddInput, type PropertyDef, type PropertyRejection, type PropertyType, type PropertyUpdateInput, type PropertyValue, ROUND_MINUTES, type ReadStatus, type RelationConfig, type RelationTargetKind, type Requirement, type RequirementCreateInput, type RequirementKind, type RequirementListOptions, type Resource, type ResourceContentType, type ResourceCreateInput, type ResourceListOptions, type ResourceListResult, type ResourceReadState, type ResourceUpdateInput, type RowListOptions, type RowValuesInput, type RowWriteOptions, type RunMessage, type RunnerEvent, type RunnerEventKind, type ScopeCreateInput, type ScopeListOptions, type ScopeUpdateInput, type SearchResult, type SearchResultType, type SearchResultWorkspace, type SelectOption, type SelectOptionInput, type SetEntityTagsInput, type SetEntityTagsResult, type Tag, type TagEntityType, type TagListResult, type Ticket, type TicketAssignee, type TicketComment, type TicketCommentAddInput, type TicketCommentUpdateInput, type TicketCreateInput, type TicketDependencyEdge, type TicketDetail, type TicketListOptions, type TicketSearchOptions, type TicketStatus, type TicketType, type TicketUpdateInput, TimeApi, type TimeConfirmDayResult, type TimeEntry, type TimeEntrySource, type TimeEntryStatus, type TimeLogBatchResult, type TimeLogInput, type TimeLogOutcome, type TimeLogResult, type TodaysActionRow, type TodaysActions, type TodaysActionsGroup, type UserStory, type UserStoryCreateInput, type UserStoryListOptions, type UserStoryUpdateInput, type WorklogSegment, type Workspace, type WorkspaceMember, type WorkspaceOutput, type WorkspacesListOutput, clearConfig, createConfigStore, getConfigPath, isAuthenticated, isTRPCError, loadConfig, saveConfig, segmentConversation };