@playaos/api-client 0.54.0 → 0.56.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
@@ -57,6 +57,7 @@ interface Member {
57
57
  yearJoined?: number | null;
58
58
  adminRoles?: string[] | null;
59
59
  isDeveloper?: boolean | null;
60
+ burningManBefore?: boolean | null;
60
61
  referredByUserId?: string | null;
61
62
  birthday?: string | null;
62
63
  dietaryRestrictions?: string[] | null;
@@ -144,6 +145,7 @@ interface ApplicationAdmin extends Application {
144
145
  reviewedAt: string | null;
145
146
  }
146
147
  interface AdminNotificationPrefs {
148
+ shiftCoverageAlerts: boolean;
147
149
  applications: boolean;
148
150
  payments: boolean;
149
151
  shifts: boolean;
@@ -163,6 +165,7 @@ interface MemberDevice {
163
165
  updatedAt: string | null;
164
166
  }
165
167
  interface ImportantDate {
168
+ slug?: string | null;
166
169
  id: string;
167
170
  title: string;
168
171
  description: string | null;
@@ -171,6 +174,62 @@ interface ImportantDate {
171
174
  category: string | null;
172
175
  year: number;
173
176
  }
177
+ interface SummerCampAttendee {
178
+ profileId: string;
179
+ nightsAttending: string[];
180
+ isDayTripOnly: boolean;
181
+ profile: {
182
+ name: string | null;
183
+ playaName: string | null;
184
+ profilePhotoPath: string | null;
185
+ };
186
+ }
187
+ interface SheetsSyncResult {
188
+ year: number;
189
+ tabs: {
190
+ name: string;
191
+ rows: number;
192
+ }[];
193
+ }
194
+ interface AdminWebhooksPage {
195
+ logs: {
196
+ id: string;
197
+ provider: string;
198
+ eventType: string;
199
+ processingStatus: string | null;
200
+ errorMessage: string | null;
201
+ createdAt: string | null;
202
+ processedAt: string | null;
203
+ payload: unknown;
204
+ }[];
205
+ queueStatus: {
206
+ queueName: string;
207
+ queueDepth: number;
208
+ maxReadCount: number;
209
+ oldestEnqueuedAt: string | null;
210
+ archivedCount: number;
211
+ latestArchivedAt: string | null;
212
+ }[];
213
+ }
214
+ interface WebhookCandidate {
215
+ id: string;
216
+ name: string;
217
+ email: string;
218
+ phone: string | null;
219
+ status: string;
220
+ signals: {
221
+ name: "exact" | "partial" | "none";
222
+ phone: "exact" | "none";
223
+ };
224
+ score: number;
225
+ }
226
+ type WebhookMatchSelection = {
227
+ kind: "candidate";
228
+ profileId: string;
229
+ } | {
230
+ kind: "email";
231
+ email: string;
232
+ };
174
233
  interface SummerCampEvent {
175
234
  id: string;
176
235
  name: string;
@@ -184,9 +243,20 @@ interface SummerCampEvent {
184
243
  registrationDeadline: string | null;
185
244
  availableNights: string[];
186
245
  costPerNight: string | null;
246
+ heroImageUrl: string | null;
247
+ detailsMarkdown: string | null;
248
+ itinerary: unknown;
249
+ packingList: unknown;
250
+ directionsUrl: string | null;
251
+ directionsNotes: string | null;
252
+ groupChatUrl: string | null;
253
+ airbnbCostPerPerson: string | null;
254
+ foodCostPerPerson: string | null;
187
255
  }
188
256
  type SummerCampRsvpStatus = "pending" | "confirmed" | "cancelled";
189
257
  interface SummerCampRsvp {
258
+ owesFood: boolean;
259
+ amountPaid: string;
190
260
  id: string;
191
261
  eventId: string;
192
262
  status: SummerCampRsvpStatus;
@@ -204,6 +274,7 @@ interface SummerCampRsvpInput {
204
274
  type PhotoExportJobStatus = "queued" | "processing" | "completed" | "failed";
205
275
  /** Admin member-photo ZIP export job (PLA-1217). */
206
276
  interface PhotoExportJob {
277
+ startedAt?: string | null;
207
278
  id: string;
208
279
  status: PhotoExportJobStatus;
209
280
  fileName: string;
@@ -217,6 +288,8 @@ interface PhotoExportJob {
217
288
  completedAt: string | null;
218
289
  }
219
290
  interface CreatePhotoExportInput {
291
+ attending?: "true" | "all";
292
+ year?: number;
220
293
  role?: string;
221
294
  status?: string;
222
295
  search?: string;
@@ -516,6 +589,7 @@ interface AdminShelter {
516
589
  }>;
517
590
  }
518
591
  interface OrgConfig {
592
+ activeCampYear: number;
519
593
  id: string;
520
594
  name: string;
521
595
  slug: string;
@@ -583,6 +657,7 @@ interface Account {
583
657
  [key: string]: unknown;
584
658
  }
585
659
  interface CampDocument {
660
+ externalUrl?: string | null;
586
661
  id: string;
587
662
  orgId: string;
588
663
  name: string;
@@ -809,6 +884,7 @@ interface MemberDeactivateResponse {
809
884
  status: "inactive";
810
885
  }
811
886
  interface WaiverSection {
887
+ format?: "html" | "text";
812
888
  id: string;
813
889
  heading: string;
814
890
  body: string;
@@ -924,7 +1000,7 @@ interface ApplicationEvent {
924
1000
  * Widening the server list without widening this union lets a value escape
925
1001
  * the declared type through the cast in `client.ts` — see PLA-1199.
926
1002
  */
927
- type: "status_change" | "note_added" | "tags_updated" | "score_set" | "message_sent" | "message_received" | "approved" | "rejected" | "waitlisted" | "interview_invite_sent" | "interview_scheduled_manually" | "interview_completed" | "interviewer_assigned" | "red_flag_added";
1003
+ type: "status_change" | "note_added" | "tags_updated" | "score_set" | "message_sent" | "message_received" | "approved" | "rejected" | "waitlisted" | "interview_invite_sent" | "interview_scheduled_manually" | "interview_completed" | "interviewer_assigned" | "red_flag_added" | "referrer_updated";
928
1004
  timestamp: string;
929
1005
  fromStatus?: string | null;
930
1006
  toStatus?: string;
@@ -1087,6 +1163,7 @@ interface SapAllocation {
1087
1163
  totalAssigned: number;
1088
1164
  }
1089
1165
  interface UpdateSapAllocationInput {
1166
+ year?: number;
1090
1167
  totalAllocated: number;
1091
1168
  notes?: string | null;
1092
1169
  }
@@ -1098,6 +1175,7 @@ interface SapDayAllocation {
1098
1175
  notes: string | null;
1099
1176
  }
1100
1177
  interface UpsertSapDayAllocationInput {
1178
+ year?: number;
1101
1179
  accessDate: string;
1102
1180
  slotsAvailable: number;
1103
1181
  notes?: string | null;
@@ -1113,6 +1191,7 @@ interface SapAssignment {
1113
1191
  notes: string | null;
1114
1192
  }
1115
1193
  interface CreateSapAssignmentInput {
1194
+ year?: number;
1116
1195
  userId: string;
1117
1196
  sapNumber?: string | null;
1118
1197
  vehicleDescription?: string | null;
@@ -1282,6 +1361,7 @@ interface Meeting {
1282
1361
  dateOptions: MeetingDateOption[];
1283
1362
  }
1284
1363
  interface CreateMeetingInput {
1364
+ notifyMembers?: boolean;
1285
1365
  title: string;
1286
1366
  description?: string | null;
1287
1367
  isMandatory: boolean;
@@ -1310,6 +1390,7 @@ interface Scholarship {
1310
1390
  discountCodeId: string | null;
1311
1391
  }
1312
1392
  interface CreateScholarshipInput {
1393
+ providerManaged?: boolean;
1313
1394
  userId: string;
1314
1395
  promoCode: string;
1315
1396
  discountAmount: number;
@@ -1353,101 +1434,1553 @@ interface VehiclePassUpdateInput {
1353
1434
  vehiclePassStatus?: VehiclePassStatus | null;
1354
1435
  vehiclePassConfirmation?: string | null;
1355
1436
  }
1356
- //#endregion
1357
- //#region src/client.d.ts
1358
- interface ClientOptions {
1359
- /** Base URL for authenticated /api/v1 routes, e.g. https://api.playaos.app */
1360
- baseUrl: string;
1361
- /** Optional base URL for /api/embed/v1 routes when they live on a different host. */
1362
- embedBaseUrl?: string;
1363
- /** API key in the format pk_live_* */
1364
- apiKey: string;
1365
- /**
1366
- * Supabase session JWT of the acting member, sent as `X-PlayaOS-Member-Token`
1367
- * on every /api/v1 call (PLA-1195). Member-scoped endpoints (a member's own
1368
- * dues, payments, application, shelter, shifts signup, …) require it and
1369
- * return 401 without it. Org-level endpoints do not require it, but a token
1370
- * that is sent must still verify — an expired or invalid one is a 401 on any
1371
- * /api/v1 route that installs the member middleware. Prefer
1372
- * `client.withMember(token)` to derive a per-request client from a shared
1373
- * server-side one rather than constructing a client per user.
1374
- */
1375
- memberToken?: string;
1437
+ /** Self-only fields needed to enter the member portal; never includes auth/provider tokens. */
1438
+ interface MemberSelfProfile {
1439
+ id: string;
1440
+ name: string | null;
1441
+ email: string | null;
1442
+ role: string | null;
1443
+ isDeveloper: boolean | null;
1444
+ firstName: string;
1445
+ lastName: string;
1446
+ phone: string | null;
1447
+ emergencyContactName: string | null;
1448
+ emergencyContactPhone: string | null;
1449
+ dietaryRestrictions: string[] | null;
1450
+ tshirtSize: string | null;
1451
+ profilePhotoPath: string | null;
1452
+ onboardingPasswordDone: boolean | null;
1453
+ playaName: string | null;
1454
+ homeCity: string | null;
1455
+ bio: string | null;
1456
+ referralCode: string | null;
1457
+ otherAllergies: string | null;
1458
+ hasEpipen: boolean | null;
1459
+ }
1460
+ interface MemberBootstrap {
1461
+ year: number;
1462
+ profile: MemberSelfProfile;
1463
+ campYear: {
1464
+ transportMode: string | null;
1465
+ attendanceResponse: string | null;
1466
+ shelterWizardDone: boolean | null;
1467
+ } | null;
1468
+ confirmedShelterAssignment: {
1469
+ id: string;
1470
+ } | null;
1471
+ unsignedDocuments: Array<{
1472
+ id: string;
1473
+ name: string;
1474
+ description: string | null;
1475
+ content: string | WaiverContent | null;
1476
+ filePath: string | null;
1477
+ }>;
1376
1478
  }
1377
- export declare class PlayaOSClient {
1378
- private readonly baseUrl;
1379
- private readonly embedBaseUrl;
1380
- private readonly apiKey;
1381
- private readonly memberToken;
1382
- constructor(opts: ClientOptions);
1383
- /** Credentials for /api/v1 calls; the embed surface uses `apiKey` alone as the camp key. */
1384
- private get auth();
1385
- /**
1386
- * Derive a client that acts as one member (PLA-1195): same host and org key,
1387
- * plus the member's Supabase session JWT on every /api/v1 call. Use this in a
1388
- * server that holds one org key and serves many signed-in members.
1389
- */
1390
- withMember(memberToken: string): PlayaOSClient;
1391
- /**
1392
- * Admin dual-path (PLA-1203): when the client has a memberToken, call `/api/v1`
1393
- * (org key + X-PlayaOS-Member-Token). Otherwise keep the legacy embed-admin
1394
- * Bearer-JWT path so published consumers without withMember() still work.
1395
- */
1396
- private adminV1OrEmbed;
1397
- /** Resolve admin credential: memberToken clients skip accessToken; embed path requires it. */
1398
- private adminAccess;
1399
- readonly members: {
1400
- /** Presigned profile-photo upload (PLA-1263). PUT the bytes, then setPhoto. */
1401
- createPhotoUploadUrl: (payload: {
1402
- contentType: "image/jpeg" | "image/png" | "image/webp";
1403
- }, opts?: {
1404
- signal?: AbortSignal;
1405
- }) => Promise<{
1406
- uploadUrl: string;
1407
- path: string;
1408
- token: string;
1409
- key: string;
1410
- }>;
1411
- setPhoto: (payload: {
1412
- key: string;
1413
- }, opts?: {
1414
- signal?: AbortSignal;
1415
- }) => Promise<{
1416
- avatarUrl: string;
1417
- }>;
1418
- deletePhoto: (opts?: {
1419
- signal?: AbortSignal;
1420
- }) => Promise<{
1421
- success: boolean;
1422
- }>;
1423
- /** Active push device tokens for the acting member (PLA-1261). */
1424
- listDevices: (opts?: {
1425
- signal?: AbortSignal;
1426
- }) => Promise<MemberDevice[]>;
1427
- registerDevice: (payload: {
1428
- token: string;
1429
- platform: "ios" | "android";
1430
- environment?: "sandbox" | "production";
1431
- }, opts?: {
1432
- signal?: AbortSignal;
1433
- }) => Promise<{
1479
+ interface MemberDashboard {
1480
+ year: number;
1481
+ profile: MemberSelfProfile;
1482
+ gateInput: {
1483
+ hasPaidBaseDues: boolean;
1484
+ hasPaidRvDues: boolean;
1485
+ ownsRvShelter: boolean;
1486
+ hasSignedWaiver: boolean;
1487
+ arrivalDate: string | null;
1488
+ departureDate: string | null;
1489
+ rvLengthFt: number | null;
1490
+ rvAmperage: number | null;
1491
+ name: string | null;
1492
+ phone: string | null;
1493
+ emergencyContactName: string | null;
1494
+ emergencyContactPhone: string | null;
1495
+ dietaryRestrictions: string[] | null;
1496
+ tshirtSize: string | null;
1497
+ transportMode: string | null;
1498
+ isAdmin: boolean;
1499
+ hasInterviewerSetup: boolean;
1500
+ hasProfilePhoto: boolean;
1501
+ };
1502
+ pendingDocuments: Array<{
1503
+ id: string;
1504
+ name: string;
1505
+ }>;
1506
+ hasShelterAssignment: boolean;
1507
+ upcomingShiftCount: number;
1508
+ importantDates: Array<{
1509
+ id: string;
1510
+ title: string;
1511
+ date: string;
1512
+ }>;
1513
+ upcomingMeetings: Array<{
1514
+ id: string;
1515
+ title: string;
1516
+ isMandatory: boolean;
1517
+ earliestDate: string;
1518
+ hasRsvped: boolean;
1519
+ }>;
1520
+ campSettings: Record<string, string>;
1521
+ yearsAttended: number[];
1522
+ }
1523
+ interface MemberOnboardingUpdate {
1524
+ firstName?: string;
1525
+ lastName?: string;
1526
+ phone?: string | null;
1527
+ emergencyContactName?: string | null;
1528
+ emergencyContactPhone?: string | null;
1529
+ dietaryRestrictions?: string[];
1530
+ tshirtSize?: string | null;
1531
+ bikeRentalInterest?: boolean | null;
1532
+ onboardingPasswordDone?: true;
1533
+ transportMode?: "personal_vehicle" | "rv" | "burner_bus" | "rideshare" | "other" | "burner_air" | "private_plane" | null;
1534
+ attendanceResponse?: "attending" | "not_attending" | "undecided";
1535
+ shelterWizardDone?: true;
1536
+ year?: number;
1537
+ }
1538
+ type ApplicationWorkflowInput = {
1539
+ action: "invite";
1540
+ } | {
1541
+ action: "assign_interviewer";
1542
+ interviewerId: string | null;
1543
+ } | {
1544
+ action: "schedule_manual";
1545
+ scheduledAt: string;
1546
+ } | {
1547
+ action: "red_flag";
1548
+ flag: string;
1549
+ } | {
1550
+ action: "interview_note";
1551
+ note: string;
1552
+ } | {
1553
+ action: "referrer";
1554
+ referrerUserId: string | null;
1555
+ } | {
1556
+ action: "transition";
1557
+ to: "approved" | "rejected" | "waitlisted" | "interviewed";
1558
+ reason?: string;
1559
+ activateMemberOnApproval?: boolean;
1560
+ };
1561
+ interface ApplicationWorkflowOptions {
1562
+ admins: {
1563
+ id: string;
1564
+ name: string | null;
1565
+ }[];
1566
+ workload: {
1567
+ interviewerId: string;
1568
+ interviewerName: string | null;
1569
+ pendingInterviews: number;
1570
+ completedInterviews: number;
1571
+ totalAssigned: number;
1572
+ lastAssignedAt: string | null;
1573
+ }[];
1574
+ referrers: {
1575
+ id: string;
1576
+ displayName: string;
1577
+ }[];
1578
+ }
1579
+ interface ApplicationActivityItem {
1580
+ id: string;
1581
+ type: "audit" | "message";
1582
+ timestamp: string;
1583
+ action?: string;
1584
+ details?: Record<string, unknown>;
1585
+ direction?: "inbound" | "outbound";
1586
+ subject?: string;
1587
+ body?: string;
1588
+ fromEmail?: string;
1589
+ actorName?: string;
1590
+ }
1591
+ type ShiftAdminOperation = {
1592
+ action: "create_type";
1593
+ name: string;
1594
+ description?: string;
1595
+ durationHours: number;
1596
+ } | {
1597
+ action: "update_type";
1598
+ id: string;
1599
+ name?: string;
1600
+ description?: string;
1601
+ durationHours?: number;
1602
+ } | {
1603
+ action: "delete_type";
1604
+ id: string;
1605
+ } | {
1606
+ action: "create_shift";
1607
+ shiftTypeId: string;
1608
+ shiftDate: string;
1609
+ startTime: string;
1610
+ endTime: string;
1611
+ maxSlots: number;
1612
+ notes?: string;
1613
+ } | {
1614
+ action: "update_shift";
1615
+ id: string;
1616
+ maxSlots?: number;
1617
+ notes?: string;
1618
+ startTime?: string;
1619
+ endTime?: string;
1620
+ } | {
1621
+ action: "delete_shift";
1622
+ id: string;
1623
+ } | {
1624
+ action: "bulk_create";
1625
+ shiftTypeId: string;
1626
+ dates: string[];
1627
+ startTime: string;
1628
+ endTime: string;
1629
+ maxSlots: number;
1630
+ } | {
1631
+ action: "clear_day";
1632
+ date: string;
1633
+ } | {
1634
+ action: "copy_day";
1635
+ sourceDate: string;
1636
+ targetDate: string;
1637
+ } | {
1638
+ action: "remove_signup";
1639
+ id: string;
1640
+ } | {
1641
+ action: "signup_role";
1642
+ id: string;
1643
+ role: string;
1644
+ };
1645
+ interface ShiftAdminOperationResult {
1646
+ id?: string;
1647
+ createdCount?: number;
1648
+ deletedCount?: number;
1649
+ copiedCount?: number;
1650
+ skippedCount?: number;
1651
+ }
1652
+ interface OwnerShelterPatch {
1653
+ name?: string | null;
1654
+ maxOccupants?: number;
1655
+ rvLengthFt?: number | null;
1656
+ rvAmperage?: 30 | 50 | null;
1657
+ shelterLengthFt?: number | null;
1658
+ shelterWidthFt?: number | null;
1659
+ shelterHeightFt?: number | null;
1660
+ needsPower?: boolean;
1661
+ needsPumping?: boolean;
1662
+ shelterDescription?: string | null;
1663
+ }
1664
+ interface OwnerShelterCreate extends OwnerShelterPatch {
1665
+ year?: number;
1666
+ shelterType: "rv" | "shiftpod" | "tent" | "hexayurt" | "other" | "car" | "truck" | "van" | "trailer";
1667
+ maxOccupants: number;
1668
+ payerUserId?: string | null;
1669
+ mateUserIds?: string[];
1670
+ completeWizard?: boolean;
1671
+ hasSpaceForOthers?: boolean;
1672
+ askingPrice?: number | null;
1673
+ }
1674
+ interface MemberShelter {
1675
+ id: string;
1676
+ name: string | null;
1677
+ shelterType: string;
1678
+ maxOccupants: number;
1679
+ rvLengthFt: number | null;
1680
+ rvAmperage: number | null;
1681
+ shelterLengthFt: number | null;
1682
+ shelterWidthFt: number | null;
1683
+ shelterHeightFt: number | null;
1684
+ needsPower: boolean | null;
1685
+ needsPumping: boolean | null;
1686
+ shelterDescription: string | null;
1687
+ members: Array<{
1688
+ id: string;
1689
+ name: string | null;
1690
+ isOwner: boolean;
1691
+ assignmentId: string;
1692
+ status: string;
1693
+ }>;
1694
+ }
1695
+ interface MemberShelterPage {
1696
+ currentAssignment: {
1697
+ id: string;
1698
+ isOwner: boolean;
1699
+ shelter: MemberShelter;
1700
+ } | null;
1701
+ availableShelters: MemberShelter[];
1702
+ pendingInvites: Array<{
1703
+ id: string;
1704
+ shelter: {
1434
1705
  id: string;
1435
- registered: boolean;
1706
+ name: string | null;
1707
+ shelterType: string;
1708
+ ownerName: string | null;
1709
+ };
1710
+ }>;
1711
+ }
1712
+ interface DocumentWriteInput {
1713
+ title: string;
1714
+ type: string;
1715
+ body?: unknown;
1716
+ description?: string | null;
1717
+ requiresSignature?: boolean;
1718
+ year?: number;
1719
+ deadline?: string | null;
1720
+ filePath?: string | null;
1721
+ externalUrl?: string | null;
1722
+ isActive?: boolean;
1723
+ }
1724
+ interface ContractSection {
1725
+ id: string;
1726
+ title: string;
1727
+ bodyHtml: string;
1728
+ sortOrder: number;
1729
+ }
1730
+ type ShiftAdminWorkflow = {
1731
+ action: "assign_member";
1732
+ shiftId: string;
1733
+ memberId: string;
1734
+ forceAssign?: boolean;
1735
+ } | {
1736
+ action: "assign_shelter";
1737
+ shiftId: string;
1738
+ shelterId: string;
1739
+ forceAssign?: boolean;
1740
+ } | {
1741
+ action: "publish";
1742
+ };
1743
+ interface ShiftAdminWorkflowResult {
1744
+ assignedCount?: number;
1745
+ skippedCount?: number;
1746
+ notificationsSent?: number;
1747
+ notificationsFailed?: number;
1748
+ totalMembers?: number;
1749
+ }
1750
+ interface ShiftPlannerData {
1751
+ year: number;
1752
+ members: Array<{
1753
+ id: string;
1754
+ name: string;
1755
+ email: string | null;
1756
+ dietaryRestrictions: string[] | null;
1757
+ shiftCapabilities: string[] | null;
1758
+ arrivalDate: string | null;
1759
+ departureDate: string | null;
1760
+ shelters: Array<{
1761
+ id: string;
1762
+ name: string;
1763
+ shelterType: string;
1436
1764
  }>;
1437
- deleteDevice: (payload: {
1438
- token: string;
1439
- }, opts?: {
1440
- signal?: AbortSignal;
1441
- }) => Promise<{
1442
- unregistered: boolean;
1765
+ }>;
1766
+ shelters: Array<{
1767
+ id: string;
1768
+ name: string;
1769
+ shelterType: string;
1770
+ }>;
1771
+ }
1772
+ interface MemberBikeStatus {
1773
+ bikeTypes: Array<{
1774
+ id: string;
1775
+ name: string;
1776
+ description: string | null;
1777
+ available: number;
1778
+ }>;
1779
+ rental: {
1780
+ id: string;
1781
+ status: string;
1782
+ bikeType: string;
1783
+ bikeNumber: string | null;
1784
+ } | null;
1785
+ hasSignedWaiver: boolean;
1786
+ year: number;
1787
+ }
1788
+ interface MemberProfileUpdate {
1789
+ firstName?: string;
1790
+ lastName?: string;
1791
+ phone?: string | null;
1792
+ emergencyContact?: string | null;
1793
+ emergencyContactName?: string | null;
1794
+ emergencyContactRelationship?: string | null;
1795
+ emergencyContactPhone?: string | null;
1796
+ birthday?: string | null;
1797
+ playaName?: string | null;
1798
+ bio?: string | null;
1799
+ homeCity?: string | null;
1800
+ otherAllergies?: string | null;
1801
+ dietaryRestrictions?: string[];
1802
+ teamInterests?: string[];
1803
+ hasEpipen?: boolean;
1804
+ tshirtSize?: string | null;
1805
+ referredByUserId?: string | null;
1806
+ socialMedia?: {
1807
+ instagram?: string | null;
1808
+ twitter?: string | null;
1809
+ tiktok?: string | null;
1810
+ facebook?: string | null;
1811
+ } | null;
1812
+ showSocialsInDirectory?: boolean;
1813
+ directoryNameDisplay?: "name" | "playa_name" | "both";
1814
+ }
1815
+ interface MemberTravelUpdate {
1816
+ arrivalDate?: string | null;
1817
+ departureDate?: string | null;
1818
+ buildArrivalDate?: string | null;
1819
+ burnerBusArrivalDate?: string | null;
1820
+ burnerBusDepartureDate?: string | null;
1821
+ burnerAirArrivalDate?: string | null;
1822
+ burnerAirDepartureDate?: string | null;
1823
+ privatePlaneArrivalDate?: string | null;
1824
+ privatePlaneDepartureDate?: string | null;
1825
+ burnerBusArrivalTime?: string | null;
1826
+ burnerBusDepartureTime?: string | null;
1827
+ burnerAirArrivalTime?: string | null;
1828
+ burnerAirDepartureTime?: string | null;
1829
+ privatePlaneArrivalTime?: string | null;
1830
+ privatePlaneDepartureTime?: string | null;
1831
+ arrivalTime?: "morning" | "afternoon" | "evening" | null;
1832
+ departureTime?: "morning" | "afternoon" | "evening" | null;
1833
+ transportMode?: MemberOnboardingUpdate["transportMode"];
1834
+ departureTransportMode?: MemberOnboardingUpdate["transportMode"];
1835
+ isBuildWeek?: boolean;
1836
+ isStrike?: boolean;
1837
+ wantsBikeRental?: boolean;
1838
+ attendanceResponse?: "attending" | "not_attending" | "undecided";
1839
+ containerService?: string | null;
1840
+ containerItemCount?: number | null;
1841
+ containerShippingNotes?: string | null;
1842
+ bikeTypePreference?: "ebike" | "pedal" | null;
1843
+ cookOrCleanPreference?: "cook" | "clean" | "no_preference" | null;
1844
+ }
1845
+ interface MemberSelfProfilePatch {
1846
+ profile?: MemberProfileUpdate;
1847
+ campYear?: MemberTravelUpdate;
1848
+ year?: number;
1849
+ }
1850
+ interface MemberProfileDetails {
1851
+ profile: { [K in keyof MemberProfileUpdate]-?: Exclude<MemberProfileUpdate[K], undefined> | null; } & {
1852
+ id: string;
1853
+ email: string | null;
1854
+ name: string | null;
1855
+ role: string | null;
1856
+ status: string | null;
1857
+ profilePhotoPath: string | null;
1858
+ referralCode: string;
1859
+ invitedAt: string | null;
1860
+ yearJoined: number | null;
1861
+ is747Alumni: boolean | null;
1862
+ createdAt: string | null;
1863
+ adminRoles: string[] | null;
1864
+ shiftCapabilities: string[] | null;
1865
+ };
1866
+ campYear: ({ [K in keyof MemberTravelUpdate]-?: Exclude<MemberTravelUpdate[K], undefined> | null; } & {
1867
+ year: number;
1868
+ ticketStatus: string | null;
1869
+ ticketConfirmationNumber: string | null;
1870
+ ticketNotes: string | null;
1871
+ hasWillCallTicket: boolean | null;
1872
+ }) | null;
1873
+ yearsAttended: number[];
1874
+ }
1875
+ interface MemberPushPreferences {
1876
+ shift_reminders: boolean;
1877
+ event_updates: boolean;
1878
+ camp_announcements: boolean;
1879
+ payment_reminders: boolean;
1880
+ document_requests: boolean;
1881
+ }
1882
+ interface MemberDocumentPage {
1883
+ defaultLegalName: string;
1884
+ documents: Array<{
1885
+ id: string;
1886
+ name: string;
1887
+ description: string | null;
1888
+ documentType: string;
1889
+ deadline: string | null;
1890
+ filePath: string | null;
1891
+ externalUrl: string | null;
1892
+ htmlContent: string | null;
1893
+ signatureId: string | null;
1894
+ isSigned: boolean;
1895
+ signedAt: string | null;
1896
+ }>;
1897
+ pastYearGroups: Array<{
1898
+ year: number;
1899
+ documents: Array<{
1900
+ id: string;
1901
+ name: string;
1902
+ description: string | null;
1903
+ filePath: string | null;
1904
+ externalUrl: string | null;
1443
1905
  }>;
1444
- /** The acting member's communication + (admin) notification preferences (PLA-1262). */
1906
+ }>;
1907
+ }
1908
+ interface MemberShiftView {
1909
+ arrivalDate: string | null;
1910
+ departureDate: string | null;
1911
+ shifts: Array<{
1912
+ signupId: string;
1913
+ shiftId: string;
1914
+ shiftTypeName: string;
1915
+ shiftDate: string;
1916
+ startTime: string | null;
1917
+ endTime: string | null;
1918
+ status: string | null;
1919
+ coworkers: string[];
1920
+ }>;
1921
+ }
1922
+ type AdminShelterOperation = {
1923
+ action: "approve" | "remove";
1924
+ assignmentId: string;
1925
+ } | {
1926
+ action: "status";
1927
+ assignmentId: string;
1928
+ status: string;
1929
+ } | {
1930
+ action: "assign" | "move";
1931
+ shelterId: string;
1932
+ userId: string;
1933
+ forceOverCapacity?: boolean;
1934
+ } | {
1935
+ action: "transfer";
1936
+ shelterId: string;
1937
+ newOwnerUserId: string;
1938
+ } | {
1939
+ action: "create";
1940
+ ownerUserId: string;
1941
+ data: OwnerShelterCreate;
1942
+ } | {
1943
+ action: "update";
1944
+ shelterId: string;
1945
+ data: OwnerShelterPatch;
1946
+ } | {
1947
+ action: "placement";
1948
+ shelterId: string;
1949
+ mapX: number | null;
1950
+ mapY: number | null;
1951
+ } | {
1952
+ action: "delete";
1953
+ shelterId: string;
1954
+ };
1955
+ interface MobileShifts {
1956
+ shifts: Array<{
1957
+ id: string;
1958
+ date: string;
1959
+ startTime: string | null;
1960
+ endTime: string | null;
1961
+ maxSlots: number;
1962
+ type: {
1963
+ id: string;
1964
+ name: string;
1965
+ description: string | null;
1966
+ };
1967
+ currentSignups: number;
1968
+ isFull: boolean;
1969
+ isSignedUp: boolean;
1970
+ isEligible: boolean;
1971
+ signupId?: string;
1972
+ signupStatus?: string | null;
1973
+ }>;
1974
+ profile: {
1975
+ arrivalDate: string | null;
1976
+ departureDate: string | null;
1977
+ status: string | null;
1978
+ };
1979
+ }
1980
+ interface AdminCampSettings {
1981
+ year: number;
1982
+ slotLimits: Record<string, number>;
1983
+ feeTiers: Array<{
1984
+ id: string;
1985
+ name: string;
1986
+ displayName: string;
1987
+ amount: string;
1988
+ }>;
1989
+ reminders: Array<{
1990
+ type: string;
1991
+ enabled: boolean;
1992
+ }>;
1993
+ contract: {
1994
+ campName: string;
1995
+ legalEntity: string;
1996
+ logoUrl: string | null;
1997
+ addressLines: string[];
1998
+ footerText: string | null;
1999
+ };
2000
+ }
2001
+ type CampSettingsOperation = {
2002
+ action: "slot_limits";
2003
+ limits: Record<string, number>;
2004
+ } | {
2005
+ action: "fee_tier";
2006
+ id: string;
2007
+ displayName: string;
2008
+ amount: number;
2009
+ } | {
2010
+ action: "reminder";
2011
+ type: "payment" | "onboarding" | "documents" | "logistics_undecided" | "photo_avatar" | "photo_fullsize" | "attendance_nudge";
2012
+ enabled: boolean;
2013
+ } | ({
2014
+ action: "contract";
2015
+ } & AdminCampSettings["contract"]);
2016
+ type AdminBikeOperation = {
2017
+ action: "checkout";
2018
+ rentalId: string;
2019
+ bikeInventoryId: string;
2020
+ } | {
2021
+ action: "return";
2022
+ rentalId: string;
2023
+ depositStatus: "refunded" | "forfeited";
2024
+ damageNotes?: string;
2025
+ } | {
2026
+ action: "add";
2027
+ bikeId: string;
2028
+ typeId: string;
2029
+ notes?: string;
2030
+ } | {
2031
+ action: "mark_paid";
2032
+ rentalId: string;
2033
+ confirmationNumber: string;
2034
+ } | {
2035
+ action: "bike_status";
2036
+ bikeId: string;
2037
+ status: "available" | "rented" | "maintenance" | "retired";
2038
+ notes?: string;
2039
+ } | {
2040
+ action: "rental_status";
2041
+ rentalId: string;
2042
+ status: "pending_payment" | "pending_waiver" | "reserved" | "checked_out" | "returned" | "cancelled";
2043
+ } | {
2044
+ action: "nudge_interest";
2045
+ } | {
2046
+ action: "booking_link";
2047
+ memberId: string;
2048
+ };
2049
+ interface AdminBikeOperationResult {
2050
+ success: true;
2051
+ sent?: number;
2052
+ failed?: number;
2053
+ }
2054
+ type AdminPaymentOperation = {
2055
+ action: "manual_payment";
2056
+ payerId: string;
2057
+ paidForUserId?: string | null;
2058
+ amount: number;
2059
+ method: string;
2060
+ notes?: string;
2061
+ year?: number;
2062
+ } | {
2063
+ action: "assign_fee";
2064
+ memberId: string;
2065
+ feeTierId: string;
2066
+ feeType: "base" | "addon";
2067
+ } | {
2068
+ action: "refund";
2069
+ paymentId: string;
2070
+ } | {
2071
+ action: "link_refund";
2072
+ refundEventId: string;
2073
+ paymentId: string;
2074
+ } | {
2075
+ action: "nudge";
2076
+ memberIds: string[];
2077
+ };
2078
+ interface AdminPaymentOperationResult {
2079
+ success: true;
2080
+ paymentId?: string;
2081
+ sent?: number;
2082
+ failed?: number;
2083
+ }
2084
+ interface AdminPaymentSummary {
2085
+ totalUsers: number;
2086
+ totalOwed: number;
2087
+ totalPaid: number;
2088
+ totalBalance: number;
2089
+ paidCount: number;
2090
+ partialCount: number;
2091
+ unpaidCount: number;
2092
+ }
2093
+ interface UnmatchedRefund {
2094
+ id: string;
2095
+ amount: string;
2096
+ method: string | null;
2097
+ reason: string | null;
2098
+ refundedAt: string;
2099
+ givebutterRefundId: string;
2100
+ }
2101
+ interface SchedulingAvailability {
2102
+ id: string;
2103
+ dayOfWeek: number;
2104
+ startTime: string;
2105
+ endTime: string;
2106
+ timezone: string;
2107
+ }
2108
+ interface SchedulingOverride {
2109
+ id: string;
2110
+ overrideDate: string;
2111
+ overrideType: string;
2112
+ startTime: string | null;
2113
+ endTime: string | null;
2114
+ reason: string | null;
2115
+ }
2116
+ interface SchedulingAdminResult {
2117
+ token?: string;
2118
+ interviewerId?: string;
2119
+ availability?: SchedulingAvailability;
2120
+ override?: SchedulingOverride;
2121
+ success?: boolean;
2122
+ }
2123
+ interface SchedulingAdminSettings {
2124
+ googleConnected: boolean;
2125
+ interviewer: {
2126
+ id: string;
2127
+ schedulingType: string | null;
2128
+ externalSchedulingUrl: string | null;
2129
+ } | null;
2130
+ availability: SchedulingAvailability[];
2131
+ overrides: SchedulingOverride[];
2132
+ bookings: {
2133
+ id: string;
2134
+ candidateName: string;
2135
+ candidateEmail: string;
2136
+ startsAt: string;
2137
+ endsAt: string;
2138
+ applicationId: string;
2139
+ }[];
2140
+ }
2141
+ type SchedulingAdminOperation = {
2142
+ action: "feed_settings" | "rotate_feed";
2143
+ } | {
2144
+ action: "add_availability";
2145
+ interviewerId: string;
2146
+ input: {
2147
+ dayOfWeek: number;
2148
+ startTime: string;
2149
+ endTime: string;
2150
+ timezone: string;
2151
+ };
2152
+ } | {
2153
+ action: "delete_availability" | "delete_override";
2154
+ id: string;
2155
+ } | {
2156
+ action: "add_override";
2157
+ interviewerId: string;
2158
+ input: {
2159
+ overrideDate: string;
2160
+ overrideType: "block" | "available";
2161
+ startTime: string | null;
2162
+ endTime: string | null;
2163
+ };
2164
+ } | {
2165
+ action: "set_type";
2166
+ schedulingType: "google" | "external" | "manual";
2167
+ externalUrl?: string;
2168
+ };
2169
+ interface InterviewFeedBooking {
2170
+ id: string;
2171
+ startsAt: string;
2172
+ endsAt: string;
2173
+ candidateName: string;
2174
+ candidateEmail: string;
2175
+ candidateTimezone: string;
2176
+ applicationId: string;
2177
+ interviewerName: string | null;
2178
+ }
2179
+ interface AdminImportantDate {
2180
+ id: string;
2181
+ title: string;
2182
+ description: string | null;
2183
+ date: string;
2184
+ endDate: string | null;
2185
+ category: string | null;
2186
+ notifyDaysBefore: number[] | null;
2187
+ isSystem: boolean | null;
2188
+ slug: string | null;
2189
+ }
2190
+ interface AdminImportantDateInput {
2191
+ title: string;
2192
+ description: string;
2193
+ date: string;
2194
+ endDate: string | null;
2195
+ category: "dues" | "documents" | "tickets" | "event" | "other" | "system";
2196
+ notifyDaysBefore: number[];
2197
+ }
2198
+ type AdminImportantDateOperation = {
2199
+ action: "create";
2200
+ input: AdminImportantDateInput;
2201
+ } | {
2202
+ action: "update";
2203
+ id: string;
2204
+ input: AdminImportantDateInput;
2205
+ } | {
2206
+ action: "delete";
2207
+ id: string;
2208
+ };
2209
+ interface AdminPaymentsPage {
2210
+ year: number;
2211
+ transactions: {
2212
+ id: string;
2213
+ userId: string | null;
2214
+ date: string | null;
2215
+ createdAt: string | null;
2216
+ memberName: string;
2217
+ memberEmail: string;
2218
+ description: string | null;
2219
+ duesType: string | null;
2220
+ amount: number;
2221
+ paymentMethod: string;
2222
+ status: string;
2223
+ paidByName: string | null;
2224
+ paymentId: string | null;
2225
+ }[];
2226
+ typeBreakdown: {
2227
+ duesType: string | null;
2228
+ type: string;
2229
+ count: number;
2230
+ total: number;
2231
+ }[];
2232
+ unmatchedRefunds: {
2233
+ id: string;
2234
+ amount: string;
2235
+ method: string | null;
2236
+ reason: string | null;
2237
+ refundedAt: string;
2238
+ givebutterRefundId: string;
2239
+ }[];
2240
+ membersForPayment: {
2241
+ id: string;
2242
+ name: string;
2243
+ email: string;
2244
+ balance: number;
2245
+ }[];
2246
+ membersForRefund: {
2247
+ id: string;
2248
+ name: string;
2249
+ email: string;
2250
+ }[];
2251
+ }
2252
+ interface ScholarshipStats {
2253
+ totalAssigned: number;
2254
+ totalUsed: number;
2255
+ totalExpired: number;
2256
+ totalAmount: number;
2257
+ usedAmount: number;
2258
+ }
2259
+ interface AdminScholarshipsPage {
2260
+ year: number;
2261
+ scholarships: {
2262
+ id: string;
2263
+ userId: string;
2264
+ promoCode: string;
2265
+ discountAmount: string;
2266
+ reason: string | null;
2267
+ status: ScholarshipStatus;
2268
+ year: number;
2269
+ usedAt: string | null;
2270
+ createdAt: string | null;
2271
+ profile: {
2272
+ id: string;
2273
+ name: string | null;
2274
+ email: string | null;
2275
+ } | null;
2276
+ }[];
2277
+ availableMembers: {
2278
+ id: string;
2279
+ name: string | null;
2280
+ email: string | null;
2281
+ }[];
2282
+ usersWithSucceededPayment: string[];
2283
+ paymentLookupErrorMessage: string | null;
2284
+ discountsApplied: {
2285
+ id: string;
2286
+ discount: string | null;
2287
+ description: string | null;
2288
+ createdAt: string | null;
2289
+ profile: {
2290
+ id: string;
2291
+ name: string | null;
2292
+ email: string | null;
2293
+ } | null;
2294
+ }[];
2295
+ stats: ScholarshipStats;
2296
+ }
2297
+ type AdminMemberRole = "applicant" | "member" | "admin" | "super_admin";
2298
+ type AdminMemberStatus = "registered" | "pending" | "invite_sent" | "interview_scheduled" | "interviewed" | "approved" | "waitlisted" | "active" | "rejected" | "inactive";
2299
+ interface AdminMemberInvite {
2300
+ firstName: string;
2301
+ lastName: string;
2302
+ email: string;
2303
+ phone?: string | null;
2304
+ role: AdminMemberRole;
2305
+ status: AdminMemberStatus;
2306
+ virginBurner?: boolean;
2307
+ sendInvite?: boolean;
2308
+ }
2309
+ type AdminMemberOperation = {
2310
+ action: "role";
2311
+ profileId: string;
2312
+ role: AdminMemberRole;
2313
+ } | {
2314
+ action: "admin_roles";
2315
+ profileId: string;
2316
+ adminRoles: ("super_admin" | "finance" | "operations" | "membership" | "scholarship")[];
2317
+ } | {
2318
+ action: "status";
2319
+ profileId: string;
2320
+ status: AdminMemberStatus;
2321
+ } | {
2322
+ action: "attendance";
2323
+ profileId: string;
2324
+ attendanceResponse: "attending" | "not_attending" | "undecided" | null;
2325
+ /** Defaults to the active camp year. An explicit year must already have a camp year row. */
2326
+ year?: number;
2327
+ } | {
2328
+ action: "profile";
2329
+ profileId: string;
2330
+ profile?: MemberProfileUpdate;
2331
+ campYear?: Omit<MemberTravelUpdate, "attendanceResponse">;
2332
+ year?: number;
2333
+ } | {
2334
+ action: "delete";
2335
+ profileId: string;
2336
+ } | ({
2337
+ action: "invite";
2338
+ } & AdminMemberInvite) | {
2339
+ action: "bike_interest";
2340
+ profileId: string;
2341
+ wantsBikeRental: boolean;
2342
+ bikeTypePreference: "ebike" | "pedal" | null;
2343
+ /** Defaults to the active camp year. An explicit year must already have a camp year row. */
2344
+ year?: number;
2345
+ } | {
2346
+ action: "summer_rsvp";
2347
+ profileId: string;
2348
+ eventId: string;
2349
+ nightsAttending: string[];
2350
+ isDayTripOnly: boolean;
2351
+ dietaryRestrictions: string | null;
2352
+ notes: string | null;
2353
+ } | {
2354
+ action: "summer_cancel";
2355
+ rsvpId: string;
2356
+ } | {
2357
+ action: "meeting_rsvp";
2358
+ profileId: string;
2359
+ meetingId: string;
2360
+ dateOptionId: string;
2361
+ } | {
2362
+ action: "meeting_cancel";
2363
+ profileId: string;
2364
+ meetingId: string;
2365
+ };
2366
+ interface AdminImportRow {
2367
+ firstName: string;
2368
+ lastName: string;
2369
+ name?: string;
2370
+ email: string;
2371
+ phone?: string | null;
2372
+ playaName?: string | null;
2373
+ yearJoined?: number | null;
2374
+ attendingThisYear?: boolean;
2375
+ role: AdminMemberRole;
2376
+ status: AdminMemberStatus;
2377
+ }
2378
+ type AdminImportOperation = {
2379
+ action: "validate_emails";
2380
+ emails: string[];
2381
+ } | {
2382
+ action: "import";
2383
+ rows: AdminImportRow[];
2384
+ year: number;
2385
+ } | {
2386
+ action: "welcome";
2387
+ profileIds: string[];
2388
+ } | {
2389
+ action: "invite_broadcast";
2390
+ } | {
2391
+ action: "invite_existing";
2392
+ profileId: string;
2393
+ };
2394
+ interface AdminImportResult {
2395
+ duplicates?: string[];
2396
+ created?: number;
2397
+ failed?: number;
2398
+ errors?: string[];
2399
+ createdRows?: {
2400
+ index: number;
2401
+ profileId: string;
2402
+ }[];
2403
+ sent?: number;
2404
+ skipped?: number;
2405
+ }
2406
+ type BookkeepingAdminOperation = {
2407
+ action: "close" | "rollover";
2408
+ year: number;
2409
+ } | {
2410
+ action: "lessons";
2411
+ year: number;
2412
+ text: string;
2413
+ };
2414
+ interface AdminGivebutterWidgets {
2415
+ year: number;
2416
+ widgets: {
2417
+ id: string;
2418
+ category: string;
2419
+ tierKey: string;
2420
+ widgetId: string;
2421
+ label: string | null;
2422
+ isActive: boolean;
2423
+ year: number;
2424
+ }[];
2425
+ }
2426
+ type AdminGivebutterWidgetOperation = {
2427
+ action: "upsert";
2428
+ category: "dues" | "rv_addon" | "donation";
2429
+ tierKey: string;
2430
+ widgetId: string;
2431
+ label: string | null;
2432
+ } | {
2433
+ action: "delete";
2434
+ id: string;
2435
+ } | {
2436
+ action: "toggle";
2437
+ id: string;
2438
+ isActive: boolean;
2439
+ };
2440
+ type EmailSegmentKey = "allMembers" | "admins" | "unpaidDues" | "rvFeesOwed" | "hasntLoggedIn" | "outstandingRsvp" | "needsTicket" | "attendingBuildWeek" | "attendingSummerCamp" | "hasUnsignedDocuments";
2441
+ interface EmailRecipientFilter {
2442
+ status?: string[];
2443
+ paymentStatus?: string[];
2444
+ isAttending?: boolean;
2445
+ isBuildWeek?: boolean;
2446
+ tagIds?: string[];
2447
+ roles?: string[];
2448
+ memberIds?: string[];
2449
+ }
2450
+ interface EmailRecipient {
2451
+ id: string;
2452
+ name: string | null;
2453
+ email: string;
2454
+ }
2455
+ interface EmailComposerOptions {
2456
+ tags: {
2457
+ id: string;
2458
+ name: string;
2459
+ color: string;
2460
+ memberCount: number;
2461
+ }[];
2462
+ members: EmailRecipient[];
2463
+ segmentCounts: Record<EmailSegmentKey, number | null>;
2464
+ }
2465
+ /**
2466
+ * The admin delivery/retry tab. Each log is an `email_retries` row (PLA-801, the single retry
2467
+ * system). The `retried` tab lists rows re-attempted at least once.
2468
+ */
2469
+ interface EmailDeliveryPage {
2470
+ logs: {
2471
+ id: string;
2472
+ recipientEmail: string | null;
2473
+ subject: string;
2474
+ emailType: string;
2475
+ /** Always null: retry rows carry the rendered message, not a template reference. */
2476
+ templateId: string | null;
2477
+ status: string;
2478
+ error: string | null;
2479
+ /** Provider failure class (e.g. transient vs permanent) when the last attempt failed. */
2480
+ failureClass: string | null;
2481
+ retryCount: number;
2482
+ /** When the retry executor will next attempt the row, if it is still pending. */
2483
+ nextRetryAt: string | null;
2484
+ /** Set only for delivered rows. */
2485
+ sentAt: string | null;
2486
+ createdAt: string;
2487
+ updatedAt: string;
2488
+ }[];
2489
+ totalSent: number;
2490
+ succeededSent: number;
2491
+ failed: number;
2492
+ queued: number;
2493
+ retryableCount: number;
2494
+ successRate: number;
2495
+ tabCounts: {
2496
+ failed: number;
2497
+ queued: number;
2498
+ succeeded: number;
2499
+ retried: number;
2500
+ };
2501
+ tabTotal: number;
2502
+ safePage: number;
2503
+ }
2504
+ /** Result of one `emails.syncContacts` call (POST /email/contacts/sync). */
2505
+ interface ContactSyncResponse {
2506
+ /** Contacts synced by this call only. */
2507
+ synced: number;
2508
+ /** Contacts that failed in this call only. */
2509
+ failed: number;
2510
+ /** True when the call stopped at its time limit before finishing; resume with `cursor`. */
2511
+ skipped: boolean;
2512
+ /** Opaque resume token for a partial sync; null once the sync is complete. */
2513
+ cursor: string | null;
2514
+ message: string;
2515
+ }
2516
+ interface EmailCmsPreview {
2517
+ html: string;
2518
+ cmsAvailable: boolean;
2519
+ storyId: number | null;
2520
+ templateContent: {
2521
+ subject: string;
2522
+ previewText: string;
2523
+ heading: string;
2524
+ body: string;
2525
+ ctaText: string;
2526
+ ctaUrl: string;
2527
+ signOff: string;
2528
+ signOffName: string;
2529
+ } | null;
2530
+ baseContent: {
2531
+ logoImage: string;
2532
+ logoText: string;
2533
+ footerText: string;
2534
+ footerUrl: string;
2535
+ footerUrlText: string;
2536
+ noreplyText: string;
2537
+ contactEmail: string;
2538
+ };
2539
+ }
2540
+ interface AdminMemberExportRow {
2541
+ email: string;
2542
+ firstName: string | null;
2543
+ lastName: string | null;
2544
+ status: string | null;
2545
+ role: string | null;
2546
+ hasPaidBaseDues: boolean;
2547
+ hasPaidRvDues: boolean;
2548
+ ownsRvShelter: boolean;
2549
+ shelterType: string | null;
2550
+ isAttending: boolean;
2551
+ }
2552
+ interface AdminGivebutterCatalog {
2553
+ campaigns: {
2554
+ id: number;
2555
+ title: string;
2556
+ status: string;
2557
+ lastSyncedAt: string;
2558
+ }[];
2559
+ items: {
2560
+ id: number;
2561
+ campaignId: number;
2562
+ name: string;
2563
+ price: number;
2564
+ active: boolean;
2565
+ }[];
2566
+ activeTier: {
2567
+ tier: "base_dues";
2568
+ campaignId: number;
2569
+ itemId: number;
2570
+ } | null;
2571
+ }
2572
+ type AdminGivebutterCatalogOperation = {
2573
+ action: "sync";
2574
+ } | {
2575
+ action: "set_active_tier";
2576
+ tier: "base_dues";
2577
+ campaignId: number;
2578
+ itemId: number;
2579
+ };
2580
+ type PackingContainerType = "hdx_tote" | "suitcase" | "box" | "bag" | "other";
2581
+ interface PackingContainer {
2582
+ id: string;
2583
+ name: string;
2584
+ type: PackingContainerType;
2585
+ size: string | null;
2586
+ description: string | null;
2587
+ }
2588
+ interface PackingContainerInput {
2589
+ name: string;
2590
+ type?: PackingContainerType;
2591
+ size?: string | null;
2592
+ description?: string | null;
2593
+ year: number;
2594
+ }
2595
+ interface PackingContainerListResponse {
2596
+ containers: (PackingContainer & {
2597
+ itemCount: number;
2598
+ })[];
2599
+ year: number;
2600
+ }
2601
+ interface PackingPlacementListResponse {
2602
+ items: PackingItem[];
2603
+ year: number;
2604
+ total: number;
2605
+ }
2606
+ interface AdminInterviewBooking {
2607
+ id: string;
2608
+ applicationId: string;
2609
+ startsAt: string;
2610
+ endsAt: string;
2611
+ candidateName: string;
2612
+ candidateEmail: string;
2613
+ timezone: string;
2614
+ }
2615
+ interface AccountReviewProfile {
2616
+ id: string;
2617
+ firstName: string;
2618
+ lastName: string;
2619
+ email: string | null;
2620
+ status: string | null;
2621
+ role: string | null;
2622
+ supabaseUserId: string | null;
2623
+ createdAt: string | null;
2624
+ provider: string | null;
2625
+ lastSignIn: string | null;
2626
+ }
2627
+ interface AdminAccountsPage {
2628
+ duplicates: {
2629
+ normalizedName: string;
2630
+ distance: number;
2631
+ profiles: (AccountReviewProfile & {
2632
+ applicationCount: number;
2633
+ campYears: number[];
2634
+ campYearCount: number;
2635
+ })[];
2636
+ }[];
2637
+ needsAttention: (AccountReviewProfile & {
2638
+ category: "registered-admin" | "registered-member" | "new-user-signed-in";
2639
+ applicationCount: number;
2640
+ })[];
2641
+ orphans: {
2642
+ id: string;
2643
+ email: string | null;
2644
+ createdAt: string | null;
2645
+ invitedAt: string | null;
2646
+ provider: null;
2647
+ }[];
2648
+ }
2649
+ type AdminAccountsOperation = {
2650
+ action: "promote" | "delete";
2651
+ profileIds: string[];
2652
+ } | {
2653
+ action: "dismiss";
2654
+ profileIdA: string;
2655
+ profileIdB: string;
2656
+ } | {
2657
+ action: "merge";
2658
+ primaryId: string;
2659
+ duplicateId: string;
2660
+ };
2661
+ interface AdminBikeInterestRow {
2662
+ userId: string;
2663
+ wantsBikeRental: boolean | null;
2664
+ bikeTypePreference: string | null;
2665
+ arrivalDate: string | null;
2666
+ attendanceResponse: string | null;
2667
+ transportMode: string | null;
2668
+ shelterWizardDone: boolean | null;
2669
+ hasConfirmedShelter: boolean;
2670
+ hasUnsignedDocuments: boolean;
2671
+ profiles: {
2672
+ name: string | null;
2673
+ email: string | null;
2674
+ firstName: string | null;
2675
+ lastName: string | null;
2676
+ phone: string | null;
2677
+ emergencyContactName: string | null;
2678
+ emergencyContactPhone: string | null;
2679
+ dietaryRestrictions: string[] | null;
2680
+ tshirtSize: string | null;
2681
+ onboardingPasswordDone: boolean | null;
2682
+ } | null;
2683
+ }
2684
+ //#endregion
2685
+ //#region src/client.d.ts
2686
+ interface ClientOptions {
2687
+ /** Base URL for authenticated /api/v1 routes, e.g. https://api.playaos.app */
2688
+ baseUrl: string;
2689
+ /** Optional base URL for /api/embed/v1 routes when they live on a different host. */
2690
+ embedBaseUrl?: string;
2691
+ /** API key in the format pk_live_* */
2692
+ apiKey: string;
2693
+ /**
2694
+ * Supabase session JWT of the acting member, sent as `X-PlayaOS-Member-Token`
2695
+ * on every /api/v1 call (PLA-1195). Member-scoped endpoints (a member's own
2696
+ * dues, payments, application, shelter, shifts signup, …) require it and
2697
+ * return 401 without it. Org-level endpoints do not require it, but a token
2698
+ * that is sent must still verify — an expired or invalid one is a 401 on any
2699
+ * /api/v1 route that installs the member middleware. Prefer
2700
+ * `client.withMember(token)` to derive a per-request client from a shared
2701
+ * server-side one rather than constructing a client per user.
2702
+ */
2703
+ memberToken?: string;
2704
+ }
2705
+ export declare class PlayaOSClient {
2706
+ private readonly baseUrl;
2707
+ private readonly embedBaseUrl;
2708
+ private readonly apiKey;
2709
+ private readonly memberToken;
2710
+ constructor(opts: ClientOptions);
2711
+ /** Credentials for /api/v1 calls; the embed surface uses `apiKey` alone as the camp key. */
2712
+ private get auth();
2713
+ /**
2714
+ * Derive a client that acts as one member (PLA-1195): same host and org key,
2715
+ * plus the member's Supabase session JWT on every /api/v1 call. Use this in a
2716
+ * server that holds one org key and serves many signed-in members.
2717
+ */
2718
+ withMember(memberToken: string): PlayaOSClient;
2719
+ /**
2720
+ * Admin dual-path (PLA-1203): when the client has a memberToken, call `/api/v1`
2721
+ * (org key + X-PlayaOS-Member-Token). Otherwise keep the legacy embed-admin
2722
+ * Bearer-JWT path so published consumers without withMember() still work.
2723
+ */
2724
+ private adminV1OrEmbed;
2725
+ /** Resolve admin credential: memberToken clients skip accessToken; embed path requires it. */
2726
+ private adminAccess;
2727
+ readonly publicBooking: {
2728
+ details: (token: string, opts?: {
2729
+ signal?: AbortSignal;
2730
+ }) => Promise<{
2731
+ title: string;
2732
+ description: string | null;
2733
+ durationMinutes: number;
2734
+ candidateName: string;
2735
+ candidateEmail: string;
2736
+ booking: {
2737
+ id: string;
2738
+ startsAt: string;
2739
+ endsAt: string;
2740
+ timezone: string;
2741
+ } | null;
2742
+ }>;
2743
+ slots: (token: string, opts?: {
2744
+ signal?: AbortSignal;
2745
+ }) => Promise<{
2746
+ slots: Array<{
2747
+ start: string;
2748
+ end: string;
2749
+ interviewerId: string;
2750
+ }>;
2751
+ }>;
2752
+ book: (token: string, payload: {
2753
+ slotStart: string;
2754
+ interviewerId: string;
2755
+ candidateTimezone: string;
2756
+ }, opts?: {
2757
+ signal?: AbortSignal;
2758
+ }) => Promise<{
2759
+ booking: {
2760
+ id: string;
2761
+ startsAt: string;
2762
+ endsAt: string;
2763
+ meetLink: string | null;
2764
+ };
2765
+ }>;
2766
+ cancel: (token: string, payload: {
2767
+ bookingId: string;
2768
+ }, opts?: {
2769
+ signal?: AbortSignal;
2770
+ }) => Promise<{
2771
+ cancelled: true;
2772
+ }>;
2773
+ };
2774
+ readonly campSettings: {
2775
+ catalog: (opts?: {
2776
+ signal?: AbortSignal;
2777
+ }) => Promise<AdminGivebutterCatalog>;
2778
+ catalogOperation: (payload: AdminGivebutterCatalogOperation, opts?: {
2779
+ signal?: AbortSignal;
2780
+ }) => Promise<{
2781
+ success?: boolean;
2782
+ campaigns?: number;
2783
+ items?: number;
2784
+ }>;
2785
+ widgets: (opts?: {
2786
+ signal?: AbortSignal;
2787
+ }) => Promise<AdminGivebutterWidgets>;
2788
+ widgetOperation: (payload: AdminGivebutterWidgetOperation, opts?: {
2789
+ signal?: AbortSignal;
2790
+ }) => Promise<{
2791
+ success: true;
2792
+ }>;
2793
+ admin: (opts?: {
2794
+ signal?: AbortSignal;
2795
+ }) => Promise<AdminCampSettings>;
2796
+ update: (payload: CampSettingsOperation, opts?: {
2797
+ signal?: AbortSignal;
2798
+ }) => Promise<{
2799
+ success: true;
2800
+ }>;
2801
+ };
2802
+ readonly scheduling: {
2803
+ booking: (id: string, opts?: {
2804
+ signal?: AbortSignal;
2805
+ }) => Promise<AdminInterviewBooking>;
2806
+ adminSettings: (opts?: {
2807
+ signal?: AbortSignal;
2808
+ }) => Promise<SchedulingAdminSettings>;
2809
+ adminOperation: (payload: SchedulingAdminOperation, opts?: {
2810
+ signal?: AbortSignal;
2811
+ }) => Promise<SchedulingAdminResult>;
2812
+ feed: (interviewerId: string, token: string, opts?: {
2813
+ signal?: AbortSignal;
2814
+ }) => Promise<InterviewFeedBooking[]>;
2815
+ };
2816
+ readonly members: {
2817
+ adminExport: (params: {
2818
+ year: number;
2819
+ }, opts?: {
2820
+ signal?: AbortSignal;
2821
+ }) => Promise<{
2822
+ data: AdminMemberExportRow[];
2823
+ }>;
2824
+ adminOperation: (payload: AdminMemberOperation, opts?: {
2825
+ signal?: AbortSignal;
2826
+ }) => Promise<{
2827
+ success: true;
2828
+ profileId?: string;
2829
+ year?: number;
2830
+ }>;
2831
+ adminImportOperation: (payload: AdminImportOperation, opts?: {
2832
+ signal?: AbortSignal;
2833
+ }) => Promise<AdminImportResult>;
2834
+ adminDetail: (id: string, params?: {
2835
+ year?: number;
2836
+ }, opts?: {
2837
+ signal?: AbortSignal;
2838
+ }) => Promise<MemberProfileDetails>;
2839
+ adminHistory: (id: string, opts?: {
2840
+ signal?: AbortSignal;
2841
+ }) => Promise<{
2842
+ data: {
2843
+ id: string;
2844
+ editorName: string | null;
2845
+ changes: Record<string, {
2846
+ from: unknown;
2847
+ to: unknown;
2848
+ }>;
2849
+ createdAt: string | null;
2850
+ }[];
2851
+ }>;
2852
+ selfProfile: (params?: {
2853
+ year?: number;
2854
+ }, opts?: {
2855
+ signal?: AbortSignal;
2856
+ }) => Promise<MemberProfileDetails>;
2857
+ updateSelfProfile: (payload: MemberSelfProfilePatch, opts?: {
2858
+ signal?: AbortSignal;
2859
+ }) => Promise<{
2860
+ profileId: string;
2861
+ year: number | null;
2862
+ }>;
2863
+ referrers: (params: {
2864
+ q: string;
2865
+ }, opts?: {
2866
+ signal?: AbortSignal;
2867
+ }) => Promise<{
2868
+ data: Array<{
2869
+ id: string;
2870
+ name: string | null;
2871
+ }>;
2872
+ }>;
2873
+ referrer: (id: string, opts?: {
2874
+ signal?: AbortSignal;
2875
+ }) => Promise<{
2876
+ id: string;
2877
+ name: string | null;
2878
+ }>;
2879
+ getPushPreferences: (opts?: {
2880
+ signal?: AbortSignal;
2881
+ }) => Promise<MemberPushPreferences>;
2882
+ updatePushPreferences: (payload: Partial<MemberPushPreferences>, opts?: {
2883
+ signal?: AbortSignal;
2884
+ }) => Promise<MemberPushPreferences>;
2885
+ adminPhotoDownloadUrl: (id: string, params?: {
2886
+ original?: boolean;
2887
+ }, opts?: {
2888
+ signal?: AbortSignal;
2889
+ }) => Promise<{
2890
+ url: string;
2891
+ fileName: string;
2892
+ }>;
2893
+ adminPhotoUploadUrl: (id: string, payload: {
2894
+ contentType: "image/jpeg" | "image/png" | "image/webp";
2895
+ kind?: "avatar" | "original";
2896
+ }, opts?: {
2897
+ signal?: AbortSignal;
2898
+ }) => Promise<{
2899
+ uploadUrl: string;
2900
+ path: string;
2901
+ token: string;
2902
+ key: string;
2903
+ }>;
2904
+ adminSetPhoto: (id: string, payload: {
2905
+ key: string;
2906
+ originalKey?: string | null;
2907
+ }, opts?: {
2908
+ signal?: AbortSignal;
2909
+ }) => Promise<{
2910
+ avatarUrl: string;
2911
+ originalUrl: string | null;
2912
+ }>;
2913
+ adminDeletePhoto: (id: string, opts?: {
2914
+ signal?: AbortSignal;
2915
+ }) => Promise<{
2916
+ success: boolean;
2917
+ }>;
2918
+ updateOnboarding: (payload: MemberOnboardingUpdate, opts?: {
2919
+ signal?: AbortSignal;
2920
+ }) => Promise<{
2921
+ profileId: string;
2922
+ year: number | null;
2923
+ }>;
2924
+ bootstrap: (opts?: {
2925
+ signal?: AbortSignal;
2926
+ }) => Promise<MemberBootstrap>;
2927
+ dashboard: (opts?: {
2928
+ signal?: AbortSignal;
2929
+ }) => Promise<MemberDashboard>;
2930
+ /** Presigned profile-photo upload (PLA-1263). PUT the bytes, then setPhoto. */
2931
+ createPhotoUploadUrl: (payload: {
2932
+ contentType: "image/jpeg" | "image/png" | "image/webp";
2933
+ kind?: "avatar" | "original";
2934
+ }, opts?: {
2935
+ signal?: AbortSignal;
2936
+ }) => Promise<{
2937
+ uploadUrl: string;
2938
+ path: string;
2939
+ token: string;
2940
+ key: string;
2941
+ }>;
2942
+ setPhoto: (payload: {
2943
+ key: string;
2944
+ originalKey?: string | null;
2945
+ }, opts?: {
2946
+ signal?: AbortSignal;
2947
+ }) => Promise<{
2948
+ avatarUrl: string;
2949
+ originalUrl: string | null;
2950
+ }>;
2951
+ deletePhoto: (opts?: {
2952
+ signal?: AbortSignal;
2953
+ }) => Promise<{
2954
+ success: boolean;
2955
+ }>;
2956
+ /** Active push device tokens for the acting member (PLA-1261). */
2957
+ listDevices: (opts?: {
2958
+ signal?: AbortSignal;
2959
+ }) => Promise<MemberDevice[]>;
2960
+ registerDevice: (payload: {
2961
+ token: string;
2962
+ platform: "ios" | "android";
2963
+ environment?: "sandbox" | "production";
2964
+ }, opts?: {
2965
+ signal?: AbortSignal;
2966
+ }) => Promise<{
2967
+ id: string;
2968
+ registered: boolean;
2969
+ }>;
2970
+ deleteDevice: (payload: {
2971
+ token: string;
2972
+ }, opts?: {
2973
+ signal?: AbortSignal;
2974
+ }) => Promise<{
2975
+ unregistered: boolean;
2976
+ }>;
2977
+ /** The acting member's communication + (admin) notification preferences (PLA-1262). */
1445
2978
  getPreferences: (opts?: {
1446
2979
  signal?: AbortSignal;
1447
2980
  }) => Promise<MemberPreferences>;
1448
2981
  updatePreferences: (payload: {
1449
- emailMarketingOptIn: boolean;
1450
- adminNotifications?: AdminNotificationPrefs;
2982
+ emailMarketingOptIn?: boolean;
2983
+ adminNotifications?: Partial<AdminNotificationPrefs>;
1451
2984
  }, opts?: {
1452
2985
  signal?: AbortSignal;
1453
2986
  }) => Promise<MemberPreferences>;
@@ -1529,10 +3062,14 @@ export declare class PlayaOSClient {
1529
3062
  signal?: AbortSignal;
1530
3063
  }) => Promise<{
1531
3064
  url: string;
3065
+ fileName: string;
1532
3066
  }>;
1533
3067
  };
1534
3068
  /** Summer-camp events + the acting member's RSVP (PLA-1270). */
1535
3069
  readonly summerCamp: {
3070
+ listAttendees: (eventId: string, opts?: {
3071
+ signal?: AbortSignal;
3072
+ }) => Promise<SummerCampAttendee[]>;
1536
3073
  listEvents: (opts?: {
1537
3074
  signal?: AbortSignal;
1538
3075
  }) => Promise<SummerCampEvent[]>;
@@ -1593,6 +3130,37 @@ export declare class PlayaOSClient {
1593
3130
  }) => Promise<Paginated<DuesStatus>>;
1594
3131
  };
1595
3132
  readonly shifts: {
3133
+ memberAction: (payload: {
3134
+ action: "signup";
3135
+ shiftId: string;
3136
+ } | {
3137
+ action: "cancel";
3138
+ signupId: string;
3139
+ }, opts?: {
3140
+ signal?: AbortSignal;
3141
+ }) => Promise<{
3142
+ success: true;
3143
+ }>;
3144
+ mobile: (params: {
3145
+ type: "available" | "my-shifts";
3146
+ date: string;
3147
+ }, opts?: {
3148
+ signal?: AbortSignal;
3149
+ }) => Promise<MobileShifts>;
3150
+ memberView: (opts?: {
3151
+ signal?: AbortSignal;
3152
+ }) => Promise<MemberShiftView>;
3153
+ adminWorkflow: (payload: ShiftAdminWorkflow, opts?: {
3154
+ signal?: AbortSignal;
3155
+ }) => Promise<ShiftAdminWorkflowResult>;
3156
+ planner: (params?: {
3157
+ year?: number;
3158
+ }, opts?: {
3159
+ signal?: AbortSignal;
3160
+ }) => Promise<ShiftPlannerData>;
3161
+ adminOperation: (payload: ShiftAdminOperation, opts?: {
3162
+ signal?: AbortSignal;
3163
+ }) => Promise<ShiftAdminOperationResult>;
1596
3164
  adminTypes: (opts?: {
1597
3165
  signal?: AbortSignal;
1598
3166
  }) => Promise<AdminShiftType[]>;
@@ -1622,6 +3190,37 @@ export declare class PlayaOSClient {
1622
3190
  }) => Promise<CommitmentsListResponse>;
1623
3191
  };
1624
3192
  readonly payments: {
3193
+ adminPage: (params?: {
3194
+ year?: number;
3195
+ }, opts?: {
3196
+ signal?: AbortSignal;
3197
+ }) => Promise<AdminPaymentsPage>;
3198
+ adminOperation: (payload: AdminPaymentOperation, opts?: {
3199
+ signal?: AbortSignal;
3200
+ }) => Promise<AdminPaymentOperationResult>;
3201
+ unmatchedRefunds: (opts?: {
3202
+ signal?: AbortSignal;
3203
+ }) => Promise<UnmatchedRefund[]>;
3204
+ memberPayments: (id: string, opts?: {
3205
+ signal?: AbortSignal;
3206
+ }) => Promise<Array<{
3207
+ id: string;
3208
+ amount: string;
3209
+ paymentStatus: string | null;
3210
+ paymentDate: string | null;
3211
+ paymentMethod: string | null;
3212
+ }>>;
3213
+ adminSummary: (opts?: {
3214
+ signal?: AbortSignal;
3215
+ }) => Promise<AdminPaymentSummary>;
3216
+ exportMonarch: (params?: {
3217
+ from?: string;
3218
+ to?: string;
3219
+ }, opts?: {
3220
+ signal?: AbortSignal;
3221
+ }) => Promise<{
3222
+ csv: string;
3223
+ }>;
1625
3224
  list: (params?: {
1626
3225
  type?: "dues" | "payment";
1627
3226
  memberId?: string;
@@ -1692,6 +3291,14 @@ export declare class PlayaOSClient {
1692
3291
  };
1693
3292
  /** Bookkeeping reads (PLA-1345): camp-year list + ops-binder export preview. */
1694
3293
  readonly bookkeeping: {
3294
+ syncGoogleSheets: (opts?: {
3295
+ signal?: AbortSignal;
3296
+ }) => Promise<SheetsSyncResult>;
3297
+ adminOperation: (payload: BookkeepingAdminOperation, opts?: {
3298
+ signal?: AbortSignal;
3299
+ }) => Promise<{
3300
+ success: true;
3301
+ }>;
1695
3302
  years: (opts?: {
1696
3303
  signal?: AbortSignal;
1697
3304
  }) => Promise<CampYearWithCounts[]>;
@@ -1715,6 +3322,16 @@ export declare class PlayaOSClient {
1715
3322
  }) => Promise<Paginated<WebhookLog>>;
1716
3323
  };
1717
3324
  readonly notifications: {
3325
+ dispatch: (payload: {
3326
+ audience: "all" | "member" | "admin";
3327
+ title: string;
3328
+ body: string;
3329
+ }, opts?: {
3330
+ signal?: AbortSignal;
3331
+ }) => Promise<{
3332
+ queued: true;
3333
+ recipientCount: number;
3334
+ }>;
1718
3335
  /** Set the acting member's notification high-water mark to now (PLA-1261). */
1719
3336
  markSeen: (opts?: {
1720
3337
  signal?: AbortSignal;
@@ -1731,9 +3348,73 @@ export declare class PlayaOSClient {
1731
3348
  }) => Promise<NotificationLog[]>;
1732
3349
  };
1733
3350
  readonly documents: {
3351
+ memberPage: (params?: {
3352
+ year?: number;
3353
+ }, opts?: {
3354
+ signal?: AbortSignal;
3355
+ }) => Promise<MemberDocumentPage>;
3356
+ create: (payload: DocumentWriteInput, opts?: {
3357
+ signal?: AbortSignal;
3358
+ }) => Promise<CampDocument>;
3359
+ update: (id: string, payload: Partial<DocumentWriteInput>, opts?: {
3360
+ signal?: AbortSignal;
3361
+ }) => Promise<CampDocument>;
3362
+ delete: (id: string, opts?: {
3363
+ signal?: AbortSignal;
3364
+ }) => Promise<{
3365
+ id: string;
3366
+ deleted: true;
3367
+ }>;
3368
+ createUploadUrl: (payload: {
3369
+ fileName: string;
3370
+ contentType: string;
3371
+ }, opts?: {
3372
+ signal?: AbortSignal;
3373
+ }) => Promise<{
3374
+ uploadUrl: string;
3375
+ path: string;
3376
+ token: string;
3377
+ key: string;
3378
+ }>;
3379
+ sourceDownloadUrl: (payload: {
3380
+ filePath: string;
3381
+ download?: boolean;
3382
+ }, opts?: {
3383
+ signal?: AbortSignal;
3384
+ }) => Promise<{
3385
+ url: string;
3386
+ }>;
3387
+ getSections: (id: string, opts?: {
3388
+ signal?: AbortSignal;
3389
+ }) => Promise<ContractSection[]>;
3390
+ saveSections: (id: string, payload: {
3391
+ sections: Array<Omit<ContractSection, "id"> & {
3392
+ id?: string;
3393
+ }>;
3394
+ }, opts?: {
3395
+ signal?: AbortSignal;
3396
+ }) => Promise<ContractSection[]>;
3397
+ renderContract: (id: string, opts?: {
3398
+ signal?: AbortSignal;
3399
+ }) => Promise<{
3400
+ html: string;
3401
+ }>;
3402
+ signatureDownloadUrl: (id: string, opts?: {
3403
+ signal?: AbortSignal;
3404
+ }) => Promise<{
3405
+ url: string;
3406
+ fileName: string;
3407
+ }>;
3408
+ deleteSignature: (id: string, opts?: {
3409
+ signal?: AbortSignal;
3410
+ }) => Promise<{
3411
+ id: string;
3412
+ deleted: true;
3413
+ }>;
1734
3414
  list: (params?: {
1735
3415
  type?: string;
1736
3416
  year?: number;
3417
+ activeYear?: boolean;
1737
3418
  }, opts?: {
1738
3419
  signal?: AbortSignal;
1739
3420
  }) => Promise<AdminCampDocument[]>;
@@ -1753,6 +3434,11 @@ export declare class PlayaOSClient {
1753
3434
  type: "checkbox" | "drawn" | "typed";
1754
3435
  signerName?: string;
1755
3436
  };
3437
+ strict?: boolean;
3438
+ audit?: {
3439
+ ipAddress?: string;
3440
+ userAgent?: string;
3441
+ };
1756
3442
  }, opts?: {
1757
3443
  signal?: AbortSignal;
1758
3444
  }) => Promise<CampDocumentSignature>;
@@ -1762,6 +3448,19 @@ export declare class PlayaOSClient {
1762
3448
  }) => Promise<CampDocumentDownloadUrl>;
1763
3449
  };
1764
3450
  readonly meetings: {
3451
+ /** Save the acting member's response; the date option must belong to this meeting. */
3452
+ rsvp: (id: string, payload: {
3453
+ dateOptionId: string;
3454
+ }, opts?: {
3455
+ signal?: AbortSignal;
3456
+ }) => Promise<{
3457
+ ok: true;
3458
+ }>;
3459
+ cancelRsvp: (id: string, opts?: {
3460
+ signal?: AbortSignal;
3461
+ }) => Promise<{
3462
+ ok: true;
3463
+ }>;
1765
3464
  list: (params?: {
1766
3465
  year?: number;
1767
3466
  limit?: number;
@@ -1785,6 +3484,22 @@ export declare class PlayaOSClient {
1785
3484
  }>;
1786
3485
  };
1787
3486
  readonly scholarships: {
3487
+ adminPage: (params?: {
3488
+ year?: number;
3489
+ }, opts?: {
3490
+ signal?: AbortSignal;
3491
+ }) => Promise<AdminScholarshipsPage>;
3492
+ refresh: (id: string, opts?: {
3493
+ signal?: AbortSignal;
3494
+ }) => Promise<{
3495
+ givebutterActive: boolean;
3496
+ givebutterUsed: number;
3497
+ }>;
3498
+ stats: (params?: {
3499
+ year?: number;
3500
+ }, opts?: {
3501
+ signal?: AbortSignal;
3502
+ }) => Promise<ScholarshipStats>;
1788
3503
  /** Create a scholarship (code + Givebutter sync). Admin-only (PLA-1266). */
1789
3504
  create: (payload: CreateScholarshipInput, opts?: {
1790
3505
  signal?: AbortSignal;
@@ -1792,16 +3507,23 @@ export declare class PlayaOSClient {
1792
3507
  /** Move a scholarship between assigned/used/expired. Admin-only (PLA-1266). */
1793
3508
  updateStatus: (id: string, status: ScholarshipStatus, opts?: {
1794
3509
  signal?: AbortSignal;
3510
+ verifyProvider?: boolean;
3511
+ providerManaged?: boolean;
1795
3512
  }) => Promise<Scholarship>;
1796
3513
  /** Delete a scholarship (deactivates its code). Admin-only (PLA-1266). */
1797
3514
  remove: (id: string, opts?: {
1798
3515
  signal?: AbortSignal;
3516
+ providerManaged?: boolean;
1799
3517
  }) => Promise<{
1800
3518
  id: string;
1801
3519
  deleted: boolean;
1802
3520
  }>;
1803
3521
  };
1804
3522
  readonly tickets: {
3523
+ /** Admin upsert by member and camp year, including members with no existing tracking row. */
3524
+ upsert: (memberId: string, year: number, payload: TicketUpdateInput, opts?: {
3525
+ signal?: AbortSignal;
3526
+ }) => Promise<Ticket>;
1805
3527
  /** Admin ticket-page projection; requires ticket, vehicle-pass, and member read scopes. */
1806
3528
  adminList: (params?: {
1807
3529
  year?: number;
@@ -1814,12 +3536,117 @@ export declare class PlayaOSClient {
1814
3536
  }) => Promise<Ticket>;
1815
3537
  };
1816
3538
  readonly vehiclePasses: {
3539
+ /** Admin upsert by member and camp year, including members with no existing tracking row. */
3540
+ upsert: (memberId: string, year: number, payload: VehiclePassUpdateInput, opts?: {
3541
+ signal?: AbortSignal;
3542
+ }) => Promise<VehiclePass>;
1817
3543
  /** Update a member's vehicle-pass status. Admin-only (PLA-1266). */
1818
3544
  update: (id: string, payload: VehiclePassUpdateInput, opts?: {
1819
3545
  signal?: AbortSignal;
1820
3546
  }) => Promise<VehiclePass>;
1821
3547
  };
1822
3548
  readonly shelters: {
3549
+ adminOperation: (payload: AdminShelterOperation, opts?: {
3550
+ signal?: AbortSignal;
3551
+ }) => Promise<{
3552
+ success: true;
3553
+ shelterId?: string;
3554
+ feesRecalculated?: boolean;
3555
+ }>;
3556
+ createForMember: (payload: OwnerShelterCreate, opts?: {
3557
+ signal?: AbortSignal;
3558
+ }) => Promise<{
3559
+ shelterId: string;
3560
+ shareUrl: string | null;
3561
+ }>;
3562
+ updateForMember: (id: string, payload: OwnerShelterPatch, opts?: {
3563
+ signal?: AbortSignal;
3564
+ }) => Promise<{
3565
+ updated: true;
3566
+ }>;
3567
+ deleteForMember: (id: string, opts?: {
3568
+ signal?: AbortSignal;
3569
+ }) => Promise<{
3570
+ shelterType: string;
3571
+ }>;
3572
+ memberPage: (params?: {
3573
+ year?: number;
3574
+ }, opts?: {
3575
+ signal?: AbortSignal;
3576
+ }) => Promise<MemberShelterPage>;
3577
+ searchMembers: (params: {
3578
+ q: string;
3579
+ }, opts?: {
3580
+ signal?: AbortSignal;
3581
+ }) => Promise<{
3582
+ data: Array<{
3583
+ id: string;
3584
+ name: string | null;
3585
+ }>;
3586
+ }>;
3587
+ requestJoin: (id: string, opts?: {
3588
+ signal?: AbortSignal;
3589
+ }) => Promise<{
3590
+ id: string;
3591
+ }>;
3592
+ inviteCandidates: (id: string, opts?: {
3593
+ signal?: AbortSignal;
3594
+ }) => Promise<{
3595
+ data: Array<{
3596
+ id: string;
3597
+ firstName: string | null;
3598
+ lastName: string | null;
3599
+ name: string | null;
3600
+ email: string | null;
3601
+ profilePhotoPath: string | null;
3602
+ }>;
3603
+ }>;
3604
+ previewJoinRequest: (token: string, opts?: {
3605
+ signal?: AbortSignal;
3606
+ }) => Promise<{
3607
+ shelterName: string | null;
3608
+ requesterName: string | null;
3609
+ status: string | null;
3610
+ }>;
3611
+ decideJoinRequest: (payload: {
3612
+ token: string;
3613
+ approved: boolean;
3614
+ }, opts?: {
3615
+ signal?: AbortSignal;
3616
+ }) => Promise<{
3617
+ success: true;
3618
+ status: "confirmed" | "declined";
3619
+ }>;
3620
+ requestPayer: (payload: {
3621
+ payerUserId: string;
3622
+ year?: number;
3623
+ }, opts?: {
3624
+ signal?: AbortSignal;
3625
+ }) => Promise<{
3626
+ existingShelterId: string | null;
3627
+ }>;
3628
+ pendingPayerRequests: (params?: {
3629
+ year?: number;
3630
+ }, opts?: {
3631
+ signal?: AbortSignal;
3632
+ }) => Promise<{
3633
+ data: Array<{
3634
+ assignmentId: string;
3635
+ userId: string;
3636
+ name: string;
3637
+ }>;
3638
+ }>;
3639
+ resolvePayerRequests: (payload: {
3640
+ shelterId: string;
3641
+ decisions: Array<{
3642
+ assignmentId: string;
3643
+ approved: boolean;
3644
+ }>;
3645
+ }, opts?: {
3646
+ signal?: AbortSignal;
3647
+ }) => Promise<{
3648
+ success: true;
3649
+ }>;
1823
3650
  /** Admin-only shelter table/map projection; requires members:read and a member token. */
1824
3651
  adminList: (params: {
1825
3652
  year: number;
@@ -1864,6 +3691,33 @@ export declare class PlayaOSClient {
1864
3691
  }>;
1865
3692
  };
1866
3693
  readonly bikes: {
3694
+ adminInterest: (params?: {
3695
+ year?: number;
3696
+ }, opts?: {
3697
+ signal?: AbortSignal;
3698
+ }) => Promise<{
3699
+ year: number;
3700
+ data: AdminBikeInterestRow[];
3701
+ }>;
3702
+ adminOperation: (payload: AdminBikeOperation, opts?: {
3703
+ signal?: AbortSignal;
3704
+ }) => Promise<AdminBikeOperationResult>;
3705
+ memberStatus: (params?: {
3706
+ year?: number;
3707
+ }, opts?: {
3708
+ signal?: AbortSignal;
3709
+ }) => Promise<MemberBikeStatus>;
3710
+ reserveForMember: (payload: {
3711
+ bikeTypeId: string;
3712
+ year?: number;
3713
+ }, opts?: {
3714
+ signal?: AbortSignal;
3715
+ }) => Promise<{
3716
+ id: string;
3717
+ status: string;
3718
+ depositAmount: number | null;
3719
+ waiverSigned: boolean;
3720
+ }>;
1867
3721
  list: (params?: {
1868
3722
  status?: string;
1869
3723
  }, opts?: {
@@ -1933,6 +3787,37 @@ export declare class PlayaOSClient {
1933
3787
  }) => Promise<BikeRentalInterestedNotReservedResponse>;
1934
3788
  };
1935
3789
  readonly tags: {
3790
+ create: (payload: {
3791
+ name: string;
3792
+ description?: string | null;
3793
+ color?: string | null;
3794
+ }, opts?: {
3795
+ signal?: AbortSignal;
3796
+ }) => Promise<MemberTag>;
3797
+ update: (id: string, payload: {
3798
+ name: string;
3799
+ description?: string | null;
3800
+ color?: string | null;
3801
+ }, opts?: {
3802
+ signal?: AbortSignal;
3803
+ }) => Promise<MemberTag>;
3804
+ delete: (id: string, opts?: {
3805
+ signal?: AbortSignal;
3806
+ }) => Promise<{
3807
+ id: string;
3808
+ }>;
3809
+ assign: (memberId: string, tagId: string, opts?: {
3810
+ signal?: AbortSignal;
3811
+ }) => Promise<{
3812
+ memberId: string;
3813
+ tagId: string;
3814
+ }>;
3815
+ remove: (memberId: string, tagId: string, opts?: {
3816
+ signal?: AbortSignal;
3817
+ }) => Promise<{
3818
+ memberId: string;
3819
+ tagId: string;
3820
+ }>;
1936
3821
  list: (opts?: {
1937
3822
  signal?: AbortSignal;
1938
3823
  }) => Promise<MemberTagWithMemberCount[]>;
@@ -1963,6 +3848,59 @@ export declare class PlayaOSClient {
1963
3848
  * and 401 on an org key alone.
1964
3849
  */
1965
3850
  readonly packing: {
3851
+ containers: {
3852
+ list: (params?: {
3853
+ year?: number;
3854
+ }, opts?: {
3855
+ signal?: AbortSignal;
3856
+ }) => Promise<PackingContainerListResponse>;
3857
+ create: (payload: PackingContainerInput, opts?: {
3858
+ signal?: AbortSignal;
3859
+ }) => Promise<{
3860
+ id: string;
3861
+ }>;
3862
+ update: (id: string, payload: Partial<Omit<PackingContainerInput, "year">> & {
3863
+ year: number;
3864
+ }, opts?: {
3865
+ signal?: AbortSignal;
3866
+ }) => Promise<PackingContainer>;
3867
+ remove: (id: string, params: {
3868
+ year: number;
3869
+ }, opts?: {
3870
+ signal?: AbortSignal;
3871
+ }) => Promise<{
3872
+ ok: true;
3873
+ }>;
3874
+ };
3875
+ placements: {
3876
+ list: (params?: {
3877
+ year?: number;
3878
+ shelter?: string;
3879
+ filter?: "packed" | "unpacked";
3880
+ containerId?: string;
3881
+ }, opts?: {
3882
+ signal?: AbortSignal;
3883
+ }) => Promise<PackingPlacementListResponse>;
3884
+ place: (payload: {
3885
+ slug: string;
3886
+ containerId: string;
3887
+ year: number;
3888
+ shelter?: string;
3889
+ }, opts?: {
3890
+ signal?: AbortSignal;
3891
+ }) => Promise<{
3892
+ ok: true;
3893
+ }>;
3894
+ unpack: (payload: {
3895
+ slug: string;
3896
+ year: number;
3897
+ shelter?: string;
3898
+ }, opts?: {
3899
+ signal?: AbortSignal;
3900
+ }) => Promise<{
3901
+ ok: true;
3902
+ }>;
3903
+ };
1966
3904
  /** The resolved list: curated base + camp layer + personal layer (ADR-071). */
1967
3905
  list: (params?: {
1968
3906
  year?: number;
@@ -2062,12 +4000,24 @@ export declare class PlayaOSClient {
2062
4000
  /**
2063
4001
  * SAP — Special Access Pass, for early/overnight vehicle arrival (PLA-1202).
2064
4002
  * Admin/super_admin only; there is no member-facing SAP surface. Year is
2065
- * always the org's active camp year — the server derives it, callers never
2066
- * pass one.
4003
+ * the selected year when supplied, otherwise the org's active camp year.
2067
4004
  */
2068
4005
  readonly sap: {
4006
+ roster: (params?: {
4007
+ year?: number;
4008
+ }, opts?: {
4009
+ signal?: AbortSignal;
4010
+ }) => Promise<Array<{
4011
+ id: string;
4012
+ name: string | null;
4013
+ email: string | null;
4014
+ role: string | null;
4015
+ status: string | null;
4016
+ buildArrivalDate: string | null;
4017
+ }>>;
2069
4018
  allocation: {
2070
4019
  get: (opts?: {
4020
+ year?: number;
2071
4021
  signal?: AbortSignal;
2072
4022
  }) => Promise<SapAllocation>;
2073
4023
  update: (payload: UpdateSapAllocationInput, opts?: {
@@ -2075,7 +4025,21 @@ export declare class PlayaOSClient {
2075
4025
  }) => Promise<SapAllocation>;
2076
4026
  };
2077
4027
  dayAllocations: {
4028
+ update: (id: string, payload: {
4029
+ slotsAvailable: number;
4030
+ notes?: string | null;
4031
+ }, opts?: {
4032
+ signal?: AbortSignal;
4033
+ }) => Promise<{
4034
+ ok: true;
4035
+ }>;
4036
+ remove: (id: string, opts?: {
4037
+ signal?: AbortSignal;
4038
+ }) => Promise<{
4039
+ ok: true;
4040
+ }>;
2078
4041
  list: (opts?: {
4042
+ year?: number;
2079
4043
  signal?: AbortSignal;
2080
4044
  }) => Promise<{
2081
4045
  items: SapDayAllocation[];
@@ -2087,6 +4051,7 @@ export declare class PlayaOSClient {
2087
4051
  };
2088
4052
  assignments: {
2089
4053
  list: (opts?: {
4054
+ year?: number;
2090
4055
  signal?: AbortSignal;
2091
4056
  }) => Promise<{
2092
4057
  items: SapAssignment[];
@@ -2105,6 +4070,14 @@ export declare class PlayaOSClient {
2105
4070
  };
2106
4071
  };
2107
4072
  readonly importantDates: {
4073
+ adminList: (opts?: {
4074
+ signal?: AbortSignal;
4075
+ }) => Promise<AdminImportantDate[]>;
4076
+ adminOperation: (payload: AdminImportantDateOperation, opts?: {
4077
+ signal?: AbortSignal;
4078
+ }) => Promise<{
4079
+ success: true;
4080
+ }>;
2108
4081
  /** Visible camp dates (PLA-1268), optionally pinned to a year. */
2109
4082
  list: (params?: {
2110
4083
  year?: number;
@@ -2113,6 +4086,103 @@ export declare class PlayaOSClient {
2113
4086
  }) => Promise<ImportantDate[]>;
2114
4087
  };
2115
4088
  readonly emails: {
4089
+ recipients: (payload: EmailRecipientFilter, opts?: {
4090
+ signal?: AbortSignal;
4091
+ }) => Promise<EmailRecipient[]>;
4092
+ composerOptions: (params?: {
4093
+ q?: string;
4094
+ }, opts?: {
4095
+ signal?: AbortSignal;
4096
+ }) => Promise<EmailComposerOptions>;
4097
+ broadcast: (payload: {
4098
+ subject: string;
4099
+ body: string;
4100
+ filter?: EmailRecipientFilter;
4101
+ segmentKey?: EmailSegmentKey;
4102
+ }, opts?: {
4103
+ signal?: AbortSignal;
4104
+ }) => Promise<{
4105
+ success: true;
4106
+ sent: number;
4107
+ failed: number;
4108
+ total: number;
4109
+ }>;
4110
+ history: (opts?: {
4111
+ signal?: AbortSignal;
4112
+ }) => Promise<{
4113
+ broadcasts: {
4114
+ id: string;
4115
+ subject: string;
4116
+ recipientCount: number | null;
4117
+ sentAt: string | null;
4118
+ senderName: string | null;
4119
+ }[];
4120
+ }>;
4121
+ deliveryPage: (params?: {
4122
+ tab?: "failed" | "queued" | "succeeded" | "retried";
4123
+ page?: number;
4124
+ }, opts?: {
4125
+ signal?: AbortSignal;
4126
+ }) => Promise<EmailDeliveryPage>;
4127
+ /**
4128
+ * Make one failed retry row due now; the retry executor sends it (nothing is sent by this call).
4129
+ * Permanent failures are refused with 400.
4130
+ */
4131
+ retryLog: (id: string, opts?: {
4132
+ signal?: AbortSignal;
4133
+ }) => Promise<{
4134
+ success: true;
4135
+ }>;
4136
+ /** Run this camp's due retry rows through the retry executor now (about 30s budget). */
4137
+ retryFailed: (opts?: {
4138
+ signal?: AbortSignal;
4139
+ }) => Promise<{
4140
+ retried: number;
4141
+ skipped: number;
4142
+ }>;
4143
+ dismissLog: (id: string, opts?: {
4144
+ signal?: AbortSignal;
4145
+ }) => Promise<{
4146
+ success: true;
4147
+ }>;
4148
+ cmsPreview: (id: string, opts?: {
4149
+ signal?: AbortSignal;
4150
+ }) => Promise<EmailCmsPreview>;
4151
+ setupContacts: (opts?: {
4152
+ signal?: AbortSignal;
4153
+ }) => Promise<{
4154
+ segmentIds: Record<string, string>;
4155
+ failedSegments: string[];
4156
+ }>;
4157
+ /**
4158
+ * Sync this camp's members into its own Resend account. Each call works for a bounded time; when
4159
+ * it stops at that limit it returns `skipped: true` and a `cursor`. Pass that cursor back as
4160
+ * `opts.cursor` to resume after the last processed member, and repeat until `cursor` is null
4161
+ * (sync complete). `synced`/`failed` count the one call. Fails with 400 until
4162
+ * {@link setupContacts} has run, or on an invalid cursor.
4163
+ */
4164
+ syncContacts: (opts?: {
4165
+ cursor?: string | null;
4166
+ signal?: AbortSignal;
4167
+ }) => Promise<ContactSyncResponse>;
4168
+ /**
4169
+ * Release an interview invitation stuck behind an uncertain or abandoned delivery claim, so the
4170
+ * next invite attempt sends again. Check the email provider first. Accepted deliveries are never
4171
+ * released.
4172
+ */
4173
+ releaseInvitationDelivery: (applicationId: string, opts?: {
4174
+ signal?: AbortSignal;
4175
+ }) => Promise<{
4176
+ released: number;
4177
+ }>;
4178
+ syncTemplates: (opts?: {
4179
+ signal?: AbortSignal;
4180
+ }) => Promise<{
4181
+ id: string;
4182
+ name: string;
4183
+ previewId: string;
4184
+ action: "created" | "updated";
4185
+ }[]>;
2116
4186
  /** Admin template registry (PLA-1265). */
2117
4187
  listTemplates: (opts?: {
2118
4188
  signal?: AbortSignal;
@@ -2134,6 +4204,23 @@ export declare class PlayaOSClient {
2134
4204
  }) => Promise<EmailRetryListResponse>;
2135
4205
  };
2136
4206
  readonly onboarding: {
4207
+ createCustomItem: (payload: {
4208
+ categoryId: string;
4209
+ name: string;
4210
+ year: number;
4211
+ }, opts?: {
4212
+ signal?: AbortSignal;
4213
+ }) => Promise<MemberCustomChecklistItem>;
4214
+ updateCustomItem: (id: string, payload: {
4215
+ completed: boolean;
4216
+ }, opts?: {
4217
+ signal?: AbortSignal;
4218
+ }) => Promise<MemberCustomChecklistItem>;
4219
+ deleteCustomItem: (id: string, opts?: {
4220
+ signal?: AbortSignal;
4221
+ }) => Promise<{
4222
+ success: true;
4223
+ }>;
2137
4224
  /** The camp's onboarding checklist template (PLA-1340 adds `priority`). */
2138
4225
  checklist: (params?: PaginationParams, opts?: {
2139
4226
  signal?: AbortSignal;
@@ -2161,7 +4248,69 @@ export declare class PlayaOSClient {
2161
4248
  }) => Promise<OnboardingProgress>;
2162
4249
  };
2163
4250
  readonly admin: {
4251
+ accounts: {
4252
+ page: (opts?: {
4253
+ signal?: AbortSignal;
4254
+ }) => Promise<AdminAccountsPage>;
4255
+ operate: (payload: AdminAccountsOperation, opts?: {
4256
+ signal?: AbortSignal;
4257
+ }) => Promise<{
4258
+ success: true;
4259
+ }>;
4260
+ };
4261
+ webhooks: {
4262
+ page: (opts?: {
4263
+ signal?: AbortSignal;
4264
+ }) => Promise<AdminWebhooksPage>;
4265
+ candidates: (payer: {
4266
+ firstName: string | null;
4267
+ lastName: string | null;
4268
+ phone: string | null;
4269
+ }, opts?: {
4270
+ signal?: AbortSignal;
4271
+ }) => Promise<WebhookCandidate[]>;
4272
+ retry: (id: string, opts?: {
4273
+ signal?: AbortSignal;
4274
+ }) => Promise<{
4275
+ queued: true;
4276
+ }>;
4277
+ match: (id: string, selection: WebhookMatchSelection, opts?: {
4278
+ signal?: AbortSignal;
4279
+ }) => Promise<{
4280
+ queued: true;
4281
+ }>;
4282
+ retryFailed: (opts?: {
4283
+ signal?: AbortSignal;
4284
+ }) => Promise<{
4285
+ queued: number;
4286
+ failed: number;
4287
+ }>;
4288
+ };
2164
4289
  applications: {
4290
+ workflow: (id: string, payload: ApplicationWorkflowInput, opts?: {
4291
+ signal?: AbortSignal;
4292
+ }) => Promise<{
4293
+ applicationId: string;
4294
+ }>;
4295
+ workflowOptions: (params?: {
4296
+ q?: string;
4297
+ excludeUserId?: string;
4298
+ }, opts?: {
4299
+ signal?: AbortSignal;
4300
+ }) => Promise<ApplicationWorkflowOptions>;
4301
+ activity: (id: string, opts?: {
4302
+ signal?: AbortSignal;
4303
+ }) => Promise<{
4304
+ data: ApplicationActivityItem[];
4305
+ }>;
4306
+ sendMessage: (id: string, payload: {
4307
+ subject: string;
4308
+ body: string;
4309
+ }, opts?: {
4310
+ signal?: AbortSignal;
4311
+ }) => Promise<{
4312
+ success: true;
4313
+ }>;
2165
4314
  /**
2166
4315
  * Admin-scoped application list (PLA-1322): the member-safe shape plus the
2167
4316
  * applicant phone, referrer name and admin-managed metadata, with the same
@@ -2518,5 +4667,5 @@ interface PublicMarketplaceClient {
2518
4667
  }
2519
4668
  export declare function createPublicMarketplaceClient(opts: PublicMarketplaceClientOptions): PublicMarketplaceClient;
2520
4669
  //#endregion
2521
- export type { AdminBikeInventory, AdminBikeRental, AdminBikeType, AdminCampDocument, AdminDocumentSignature, AdminNotificationPrefs, AdminShelter, AdminShift, AdminShiftType, AdminTicketRow, Application, ApplicationAdmin, ApplicationAnnotations, ApplicationCapacity, ApplicationCreatePayload, ApplicationCreateResponse, ApplicationNote, ApplicationScore, ApplicationStatus, ApplicationTransitionPayload, ApplicationTransitionResponse, BikeRentalCatalogItem, BikeRentalCatalogResponse, BikeRentalDeliveryMode, BikeRentalFramePreference, BikeRentalInterestedMember, BikeRentalInterestedNotReservedResponse, BikeRentalRequestInput, BikeRentalRequestResult, BikeRentalReservation, BikeRentalReservationListResponse, BikeRentalWaiver, BookkeepingExportPreview, BuildStrikeReportRow, CampDocumentDownloadUrl, CampDocumentSignature, CampDocumentSignaturesResponse, CampYearWithCounts, Commitment, CommitmentDataType, CommitmentValue, CommitmentsListResponse, CreateMeetingInput, CreateSapAssignmentInput, CreateScholarshipInput, DailyHeadcount, DashboardMetrics, DuesStatus, DuesSummaryRow, DuesTypePayor, EmailLog, EmailRetry, EmailRetryCount, EmailRetryListResponse, EmailTemplate, ExchangeParams, ExchangeResult, ImageUploadTarget, ImportantDate, ListingImage, LogisticsBreakdowns, LogisticsSummary, MarketplaceFlagReason, Meeting, MeetingDateOption, MeetingListResponse, MeetingRsvp, Member, MemberCreatePayload, MemberCreateResponse, MemberCustomChecklistItem, MemberDeactivateResponse, MemberDevice, MemberDuesStatus, MemberPreferences, MemberRole, MemberTag, MemberTagAssignment, MemberTagWithMemberCount, MemberUpdatePayload, MemberUpdateResponse, NewListingInput, OnboardingChecklistCategory, OnboardingChecklistItem, OnboardingProgress, OrgConfig, PackingCampAdminItem, PackingCampAdminList, PackingCampCategory, PackingCampCategoryInput, PackingCampItem, PackingItem, PackingItemStatus, PackingLayer, PackingListResponse, PackingPersonalItem, PaymentPageResponse, PublicMarketplaceClient, PublicMarketplaceClientOptions, RvAmperageTotal, SapAllocation, SapAssignment, SapDayAllocation, Scholarship, ScholarshipStatus, ShelterTypeDistribution, Shift, ShiftSignup, ShiftType, Ticket, TicketStatus, TicketUpdateInput, TshirtSizeTotal, UnsureDateMember, UpdateSapAllocationInput, UpdateSapAssignmentInput, UpsertPackingCampItemInput, UpsertSapDayAllocationInput, VehiclePass, VehiclePassStatus, VehiclePassUpdateInput, Waiver, WaiverContent, WaiverSection, WaiverSignPayload, WaiverSignResponse, WaiverStatus, WebhookLog };
4670
+ export type { AccountReviewProfile, AdminAccountsOperation, AdminAccountsPage, AdminBikeInterestRow, AdminBikeInventory, AdminBikeOperation, AdminBikeOperationResult, AdminBikeRental, AdminBikeType, AdminCampDocument, AdminCampSettings, AdminDocumentSignature, AdminGivebutterCatalog, AdminGivebutterCatalogOperation, AdminGivebutterWidgetOperation, AdminGivebutterWidgets, AdminImportOperation, AdminImportResult, AdminImportRow, AdminImportantDate, AdminImportantDateInput, AdminImportantDateOperation, AdminInterviewBooking, AdminMemberExportRow, AdminMemberInvite, AdminMemberOperation, AdminMemberRole, AdminMemberStatus, AdminNotificationPrefs, AdminPaymentOperation, AdminPaymentOperationResult, AdminPaymentSummary, AdminPaymentsPage, AdminScholarshipsPage, AdminShelter, AdminShelterOperation, AdminShift, AdminShiftType, AdminTicketRow, AdminWebhooksPage, Application, ApplicationActivityItem, ApplicationAdmin, ApplicationAnnotations, ApplicationCapacity, ApplicationCreatePayload, ApplicationCreateResponse, ApplicationNote, ApplicationScore, ApplicationStatus, ApplicationTransitionPayload, ApplicationTransitionResponse, ApplicationWorkflowInput, ApplicationWorkflowOptions, BikeRentalCatalogItem, BikeRentalCatalogResponse, BikeRentalDeliveryMode, BikeRentalFramePreference, BikeRentalInterestedMember, BikeRentalInterestedNotReservedResponse, BikeRentalRequestInput, BikeRentalRequestResult, BikeRentalReservation, BikeRentalReservationListResponse, BikeRentalWaiver, BookkeepingAdminOperation, BookkeepingExportPreview, BuildStrikeReportRow, CampDocumentDownloadUrl, CampDocumentSignature, CampDocumentSignaturesResponse, CampSettingsOperation, CampYearWithCounts, Commitment, CommitmentDataType, CommitmentValue, CommitmentsListResponse, ContactSyncResponse, ContractSection, CreateMeetingInput, CreateSapAssignmentInput, CreateScholarshipInput, DailyHeadcount, DashboardMetrics, DocumentWriteInput, DuesStatus, DuesSummaryRow, DuesTypePayor, EmailCmsPreview, EmailComposerOptions, EmailDeliveryPage, EmailLog, EmailRecipient, EmailRecipientFilter, EmailRetry, EmailRetryCount, EmailRetryListResponse, EmailSegmentKey, EmailTemplate, ExchangeParams, ExchangeResult, ImageUploadTarget, ImportantDate, InterviewFeedBooking, ListingImage, LogisticsBreakdowns, LogisticsSummary, MarketplaceFlagReason, Meeting, MeetingDateOption, MeetingListResponse, MeetingRsvp, Member, MemberBikeStatus, MemberBootstrap, MemberCreatePayload, MemberCreateResponse, MemberCustomChecklistItem, MemberDashboard, MemberDeactivateResponse, MemberDevice, MemberDocumentPage, MemberDuesStatus, MemberOnboardingUpdate, MemberPreferences, MemberProfileDetails, MemberPushPreferences, MemberRole, MemberSelfProfile, MemberSelfProfilePatch, MemberShelter, MemberShelterPage, MemberShiftView, MemberTag, MemberTagAssignment, MemberTagWithMemberCount, MemberUpdatePayload, MemberUpdateResponse, MobileShifts, NewListingInput, OnboardingChecklistCategory, OnboardingChecklistItem, OnboardingProgress, OrgConfig, OwnerShelterCreate, OwnerShelterPatch, PackingCampAdminItem, PackingCampAdminList, PackingCampCategory, PackingCampCategoryInput, PackingCampItem, PackingContainer, PackingContainerInput, PackingContainerListResponse, PackingContainerType, PackingItem, PackingItemStatus, PackingLayer, PackingListResponse, PackingPersonalItem, PackingPlacementListResponse, PaymentPageResponse, PublicMarketplaceClient, PublicMarketplaceClientOptions, RvAmperageTotal, SapAllocation, SapAssignment, SapDayAllocation, SchedulingAdminOperation, SchedulingAdminResult, SchedulingAdminSettings, SchedulingAvailability, SchedulingOverride, Scholarship, ScholarshipStats, ScholarshipStatus, SheetsSyncResult, ShelterTypeDistribution, Shift, ShiftAdminOperation, ShiftAdminOperationResult, ShiftAdminWorkflow, ShiftAdminWorkflowResult, ShiftPlannerData, ShiftSignup, ShiftType, SummerCampAttendee, SummerCampEvent, SummerCampRsvp, SummerCampRsvpInput, Ticket, TicketStatus, TicketUpdateInput, TshirtSizeTotal, UnmatchedRefund, UnsureDateMember, UpdateSapAllocationInput, UpdateSapAssignmentInput, UpsertPackingCampItemInput, UpsertSapDayAllocationInput, VehiclePass, VehiclePassStatus, VehiclePassUpdateInput, Waiver, WaiverContent, WaiverSection, WaiverSignPayload, WaiverSignResponse, WaiverStatus, WebhookCandidate, WebhookLog, WebhookMatchSelection };
2522
4671
  //# sourceMappingURL=index.d.ts.map