@voyantjs/bookings 0.52.1 → 0.52.3

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.
@@ -0,0 +1,217 @@
1
+ import { actionLedgerEntries } from "@voyantjs/action-ledger/schema";
2
+ import { sql } from "drizzle-orm";
3
+ import { bookingTravelerTravelDetails } from "./schema/travel-details.js";
4
+ import { bookings, bookingTravelers } from "./schema-core.js";
5
+ import { bookingItems } from "./schema-items.js";
6
+ const DEFAULT_SAMPLE_LIMIT = 20;
7
+ const MAX_SAMPLE_LIMIT = 100;
8
+ const BOOKING_CONFIRM_ACTION_NAME = "booking.status.confirm";
9
+ const BOOKING_EXPIRE_ACTION_NAME = "booking.status.expire";
10
+ const BOOKING_CANCEL_ACTION_NAME = "booking.status.cancel";
11
+ const BOOKING_COMPLETE_ACTION_NAME = "booking.status.complete";
12
+ const BOOKING_TRAVELER_CREATE_ACTION_NAMES = [
13
+ "booking.traveler.create",
14
+ "booking.traveler_with_travel_details.create",
15
+ ];
16
+ const BOOKING_TRAVELER_TRAVEL_DETAILS_ACTION_NAMES = [
17
+ "booking.traveler_with_travel_details.create",
18
+ "booking.traveler_travel_details.update",
19
+ ];
20
+ const BOOKING_ITEM_CREATE_ACTION_NAME = "booking.item.create";
21
+ export function buildBookingActionLedgerDriftQueries(input = {}) {
22
+ const sampleLimit = normalizeSampleLimit(input.sampleLimit);
23
+ return {
24
+ booking_confirmed: buildBookingStatusDriftQuery({
25
+ check: "booking_confirmed",
26
+ actionName: BOOKING_CONFIRM_ACTION_NAME,
27
+ timestampColumn: bookings.confirmedAt,
28
+ input,
29
+ sampleLimit,
30
+ }),
31
+ booking_expired: buildBookingStatusDriftQuery({
32
+ check: "booking_expired",
33
+ actionName: BOOKING_EXPIRE_ACTION_NAME,
34
+ timestampColumn: bookings.expiredAt,
35
+ input,
36
+ sampleLimit,
37
+ }),
38
+ booking_cancelled: buildBookingStatusDriftQuery({
39
+ check: "booking_cancelled",
40
+ actionName: BOOKING_CANCEL_ACTION_NAME,
41
+ timestampColumn: bookings.cancelledAt,
42
+ input,
43
+ sampleLimit,
44
+ }),
45
+ booking_completed: buildBookingStatusDriftQuery({
46
+ check: "booking_completed",
47
+ actionName: BOOKING_COMPLETE_ACTION_NAME,
48
+ timestampColumn: bookings.completedAt,
49
+ input,
50
+ sampleLimit,
51
+ }),
52
+ booking_item: sql `
53
+ SELECT
54
+ 'booking_item' AS check,
55
+ count(*)::int AS missing_count,
56
+ coalesce(
57
+ array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
58
+ FILTER (WHERE sample_ordinal <= ${sampleLimit}),
59
+ ARRAY[]::text[]
60
+ ) AS sample_ids
61
+ FROM (
62
+ SELECT
63
+ ${bookingItems.id} AS candidate_id,
64
+ ${bookingItems.createdAt} AS created_at,
65
+ row_number() OVER (
66
+ ORDER BY ${bookingItems.createdAt} DESC, ${bookingItems.id} DESC
67
+ ) AS sample_ordinal
68
+ FROM ${bookingItems}
69
+ WHERE 1 = 1
70
+ ${buildCreatedAtCondition(bookingItems.createdAt, input.createdAtFrom)}
71
+ AND NOT EXISTS (
72
+ SELECT 1
73
+ FROM ${actionLedgerEntries}
74
+ WHERE ${actionLedgerEntries.actionName} = ${BOOKING_ITEM_CREATE_ACTION_NAME}
75
+ AND ${actionLedgerEntries.targetType} = ${"booking_item"}
76
+ AND ${actionLedgerEntries.targetId} = ${bookingItems.id}
77
+ )
78
+ ) missing
79
+ `,
80
+ booking_traveler: sql `
81
+ SELECT
82
+ 'booking_traveler' AS check,
83
+ count(*)::int AS missing_count,
84
+ coalesce(
85
+ array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
86
+ FILTER (WHERE sample_ordinal <= ${sampleLimit}),
87
+ ARRAY[]::text[]
88
+ ) AS sample_ids
89
+ FROM (
90
+ SELECT
91
+ ${bookingTravelers.id} AS candidate_id,
92
+ ${bookingTravelers.createdAt} AS created_at,
93
+ row_number() OVER (
94
+ ORDER BY ${bookingTravelers.createdAt} DESC, ${bookingTravelers.id} DESC
95
+ ) AS sample_ordinal
96
+ FROM ${bookingTravelers}
97
+ WHERE 1 = 1
98
+ ${buildCreatedAtCondition(bookingTravelers.createdAt, input.createdAtFrom)}
99
+ AND NOT EXISTS (
100
+ SELECT 1
101
+ FROM ${actionLedgerEntries}
102
+ WHERE ${actionLedgerEntries.actionName} IN (${sql.join(BOOKING_TRAVELER_CREATE_ACTION_NAMES.map((actionName) => sql `${actionName}`), sql `, `)})
103
+ AND ${actionLedgerEntries.targetType} = ${"booking_traveler"}
104
+ AND ${actionLedgerEntries.targetId} = ${bookingTravelers.id}
105
+ )
106
+ ) missing
107
+ `,
108
+ booking_traveler_travel_details: sql `
109
+ SELECT
110
+ 'booking_traveler_travel_details' AS check,
111
+ count(*)::int AS missing_count,
112
+ coalesce(
113
+ array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
114
+ FILTER (WHERE sample_ordinal <= ${sampleLimit}),
115
+ ARRAY[]::text[]
116
+ ) AS sample_ids
117
+ FROM (
118
+ SELECT
119
+ ${bookingTravelerTravelDetails.travelerId} AS candidate_id,
120
+ ${bookingTravelerTravelDetails.createdAt} AS created_at,
121
+ row_number() OVER (
122
+ ORDER BY ${bookingTravelerTravelDetails.createdAt} DESC,
123
+ ${bookingTravelerTravelDetails.travelerId} DESC
124
+ ) AS sample_ordinal
125
+ FROM ${bookingTravelerTravelDetails}
126
+ WHERE 1 = 1
127
+ ${buildCreatedAtCondition(bookingTravelerTravelDetails.createdAt, input.createdAtFrom)}
128
+ AND NOT EXISTS (
129
+ SELECT 1
130
+ FROM ${actionLedgerEntries}
131
+ WHERE ${actionLedgerEntries.actionName} IN (${sql.join(BOOKING_TRAVELER_TRAVEL_DETAILS_ACTION_NAMES.map((actionName) => sql `${actionName}`), sql `, `)})
132
+ AND ${actionLedgerEntries.targetType} = ${"booking_traveler"}
133
+ AND ${actionLedgerEntries.targetId} = ${bookingTravelerTravelDetails.travelerId}
134
+ )
135
+ ) missing
136
+ `,
137
+ };
138
+ }
139
+ export async function checkBookingActionLedgerDrift(db, input = {}) {
140
+ const queries = buildBookingActionLedgerDriftQueries(input);
141
+ const results = await Promise.all([
142
+ db.execute(queries.booking_confirmed),
143
+ db.execute(queries.booking_expired),
144
+ db.execute(queries.booking_cancelled),
145
+ db.execute(queries.booking_completed),
146
+ db.execute(queries.booking_item),
147
+ db.execute(queries.booking_traveler),
148
+ db.execute(queries.booking_traveler_travel_details),
149
+ ]);
150
+ const rows = results
151
+ .flatMap((result) => extractRows(result))
152
+ .map((row) => normalizeRow(row));
153
+ return {
154
+ ok: rows.every((row) => row.missingCount === 0),
155
+ rows,
156
+ };
157
+ }
158
+ function buildBookingStatusDriftQuery(input) {
159
+ return sql `
160
+ SELECT
161
+ ${input.check} AS check,
162
+ count(*)::int AS missing_count,
163
+ coalesce(
164
+ array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
165
+ FILTER (WHERE sample_ordinal <= ${input.sampleLimit}),
166
+ ARRAY[]::text[]
167
+ ) AS sample_ids
168
+ FROM (
169
+ SELECT
170
+ ${bookings.id} AS candidate_id,
171
+ ${input.timestampColumn} AS created_at,
172
+ row_number() OVER (
173
+ ORDER BY ${input.timestampColumn} DESC, ${bookings.id} DESC
174
+ ) AS sample_ordinal
175
+ FROM ${bookings}
176
+ WHERE ${input.timestampColumn} IS NOT NULL
177
+ ${buildCreatedAtCondition(input.timestampColumn, input.input.createdAtFrom)}
178
+ AND NOT EXISTS (
179
+ SELECT 1
180
+ FROM ${actionLedgerEntries}
181
+ WHERE ${actionLedgerEntries.actionName} = ${input.actionName}
182
+ AND ${actionLedgerEntries.targetType} = ${"booking"}
183
+ AND ${actionLedgerEntries.targetId} = ${bookings.id}
184
+ )
185
+ ) missing
186
+ `;
187
+ }
188
+ function normalizeSampleLimit(limit) {
189
+ if (!limit)
190
+ return DEFAULT_SAMPLE_LIMIT;
191
+ return Math.min(Math.max(Math.trunc(limit), 1), MAX_SAMPLE_LIMIT);
192
+ }
193
+ function buildCreatedAtCondition(column, value) {
194
+ if (!value)
195
+ return sql ``;
196
+ const date = value instanceof Date ? value : new Date(value);
197
+ if (Number.isNaN(date.getTime())) {
198
+ throw new Error("createdAtFrom must be a valid date");
199
+ }
200
+ return sql `AND ${column} >= ${date}`;
201
+ }
202
+ function extractRows(result) {
203
+ if (Array.isArray(result))
204
+ return result;
205
+ const maybeRows = result.rows;
206
+ return Array.isArray(maybeRows) ? maybeRows : [];
207
+ }
208
+ function normalizeRow(row) {
209
+ return {
210
+ check: row.check,
211
+ missingCount: Number(row.missing_count),
212
+ sampleIds: row.sample_ids ?? [],
213
+ };
214
+ }
215
+ export const __test__ = {
216
+ normalizeRow,
217
+ };
@@ -177,7 +177,7 @@ export declare const availabilitySlotsRef: import("drizzle-orm/pg-core").PgTable
177
177
  tableName: "availability_slots";
178
178
  dataType: "string";
179
179
  columnType: "PgText";
180
- data: "open" | "closed" | "sold_out" | "cancelled";
180
+ data: "cancelled" | "open" | "closed" | "sold_out";
181
181
  driverParam: string;
182
182
  notNull: true;
183
183
  hasDefault: false;
@@ -189,7 +189,7 @@ export declare const availabilitySlotsRef: import("drizzle-orm/pg-core").PgTable
189
189
  identity: undefined;
190
190
  generated: undefined;
191
191
  }, {}, {
192
- $type: "open" | "closed" | "sold_out" | "cancelled";
192
+ $type: "cancelled" | "open" | "closed" | "sold_out";
193
193
  }>;
194
194
  unlimited: import("drizzle-orm/pg-core").PgColumn<{
195
195
  name: "unlimited";
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import type { LinkableDefinition, Module } from "@voyantjs/core";
2
2
  import type { HonoModule } from "@voyantjs/hono/module";
3
3
  import { type BookingRouteRuntimeOptions } from "./route-runtime.js";
4
+ export { BOOKING_ACTION_LEDGER_CAPABILITIES, BOOKING_PII_READ_CAPABILITY, BOOKING_STATUS_CAPABILITIES, bookingActionLedgerCapabilityRegistry, } from "./action-ledger-capabilities.js";
4
5
  export { bookingsSupplierExtension } from "./extensions/suppliers.js";
5
6
  export { type BookingPiiAuditEvent, type BookingPiiService, type BookingPiiServiceOptions, createBookingPiiService, type UpsertBookingTravelerTravelDetailInput, } from "./pii.js";
6
7
  export { type PiiAccessContext, redactBookingContact, redactEmail, redactPhone, redactString, redactTravelerIdentity, shouldRevealBookingPii, } from "./pii-redaction.js";
7
- export type { BookingTravelerSharingGroupMember, BookingTravelerSharingGroupSummary, ConvertProductData, CreateTravelerWithTravelDetailsInput, UpdateTravelerWithTravelDetailsInput, } from "./service.js";
8
+ export type { BookingCancelledEvent, BookingConfirmedEvent, BookingTravelerSharingGroupMember, BookingTravelerSharingGroupSummary, ConvertProductData, CreateTravelerWithTravelDetailsInput, UpdateTravelerWithTravelDetailsInput, } from "./service.js";
8
9
  export { bookingsService } from "./service.js";
9
10
  export { type AddBookingGroupMemberInput, type BookingGroupListQuery, type BookingGroupMemberWithBooking, bookingGroupsService, type CreateBookingGroupInput, listGroupBookingTravelers, type UpdateBookingGroupInput, } from "./service-groups.js";
10
11
  export { BOOKING_TRANSITIONS, type BookingStatus, type BookingStatusPatch, BookingTransitionError, canTransitionBooking, transitionBooking, } from "./state-machine.js";
@@ -21,7 +22,7 @@ export declare function createBookingsHonoModule(options?: BookingsHonoModuleOpt
21
22
  export declare const bookingsHonoModule: HonoModule;
22
23
  export type { BookingRouteRuntime, BookingRouteRuntimeOptions, ResolveBookingKmsProvider, } from "./route-runtime.js";
23
24
  export { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
24
- export type { BookingRoutes } from "./routes.js";
25
+ export type { BookingActionLedgerListResponse, BookingRoutes } from "./routes.js";
25
26
  export type { PublicBookingRoutes } from "./routes-public.js";
26
27
  export { publicBookingRoutes } from "./routes-public.js";
27
28
  export type { BookingTravelerBedPreference, BookingTravelerDietary, BookingTravelerIdentity, BookingTravelerTravelDetail, DecryptedBookingTravelerTravelDetail, NewBookingTravelerTravelDetail, TravelerAllocationMap, } from "./schema/travel-details.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
2
2
  import { bookingRoutes } from "./routes.js";
3
3
  import { publicBookingRoutes } from "./routes-public.js";
4
+ export { BOOKING_ACTION_LEDGER_CAPABILITIES, BOOKING_PII_READ_CAPABILITY, BOOKING_STATUS_CAPABILITIES, bookingActionLedgerCapabilityRegistry, } from "./action-ledger-capabilities.js";
4
5
  export { bookingsSupplierExtension } from "./extensions/suppliers.js";
5
6
  export { createBookingPiiService, } from "./pii.js";
6
7
  export { redactBookingContact, redactEmail, redactPhone, redactString, redactTravelerIdentity, shouldRevealBookingPii, } from "./pii-redaction.js";
@@ -12,15 +12,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
12
12
  output: {
13
13
  data: {
14
14
  id: string;
15
- productId: string | null;
16
15
  createdAt: string;
17
- updatedAt: string;
18
16
  metadata: {
19
17
  [x: string]: import("hono/utils/types").JSONValue;
20
18
  } | null;
19
+ updatedAt: string;
21
20
  kind: "other" | "shared_room" | "cruise_party";
22
21
  label: string;
23
22
  primaryBookingId: string | null;
23
+ productId: string | null;
24
24
  optionUnitId: string | null;
25
25
  }[];
26
26
  total: number;
@@ -38,15 +38,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
38
38
  output: {
39
39
  data: {
40
40
  id: string;
41
- productId: string | null;
42
41
  createdAt: string;
43
- updatedAt: string;
44
42
  metadata: {
45
43
  [x: string]: import("hono/utils/types").JSONValue;
46
44
  } | null;
45
+ updatedAt: string;
47
46
  kind: "other" | "shared_room" | "cruise_party";
48
47
  label: string;
49
48
  primaryBookingId: string | null;
49
+ productId: string | null;
50
50
  optionUnitId: string | null;
51
51
  };
52
52
  };
@@ -83,10 +83,10 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
83
83
  groupId: string;
84
84
  booking: {
85
85
  id: string;
86
- status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress" | "expired";
86
+ status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
87
+ organizationId: string | null;
87
88
  createdAt: string;
88
89
  updatedAt: string;
89
- organizationId: string | null;
90
90
  redeemedAt: string | null;
91
91
  startDate: string | null;
92
92
  endDate: string | null;
@@ -135,15 +135,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
135
135
  } | null;
136
136
  }[];
137
137
  id: string;
138
- productId: string | null;
139
138
  createdAt: string;
140
- updatedAt: string;
141
139
  metadata: {
142
140
  [x: string]: import("hono/utils/types").JSONValue;
143
141
  } | null;
142
+ updatedAt: string;
144
143
  kind: "other" | "shared_room" | "cruise_party";
145
144
  label: string;
146
145
  primaryBookingId: string | null;
146
+ productId: string | null;
147
147
  optionUnitId: string | null;
148
148
  };
149
149
  };
@@ -173,15 +173,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
173
173
  output: {
174
174
  data: {
175
175
  id: string;
176
- productId: string | null;
177
176
  createdAt: string;
178
- updatedAt: string;
179
177
  metadata: {
180
178
  [x: string]: import("hono/utils/types").JSONValue;
181
179
  } | null;
180
+ updatedAt: string;
182
181
  kind: "other" | "shared_room" | "cruise_party";
183
182
  label: string;
184
183
  primaryBookingId: string | null;
184
+ productId: string | null;
185
185
  optionUnitId: string | null;
186
186
  };
187
187
  };
@@ -232,10 +232,10 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
232
232
  groupId: string;
233
233
  booking: {
234
234
  id: string;
235
- status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress" | "expired";
235
+ status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
236
+ organizationId: string | null;
236
237
  createdAt: string;
237
238
  updatedAt: string;
238
- organizationId: string | null;
239
239
  redeemedAt: string | null;
240
240
  startDate: string | null;
241
241
  endDate: string | null;
@@ -373,10 +373,10 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
373
373
  output: {
374
374
  data: {
375
375
  id: string;
376
- notes: string | null;
377
376
  createdAt: string;
378
377
  updatedAt: string;
379
378
  email: string | null;
379
+ notes: string | null;
380
380
  firstName: string;
381
381
  lastName: string;
382
382
  bookingId: string;
@@ -43,7 +43,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
43
43
  data: {
44
44
  sessionId: string;
45
45
  bookingNumber: string;
46
- status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress" | "expired";
46
+ status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
47
47
  externalBookingRef: string | null;
48
48
  communicationLanguage: string | null;
49
49
  sellCurrency: string;
@@ -74,7 +74,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
74
74
  title: string;
75
75
  description: string | null;
76
76
  itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
77
- status: "cancelled" | "draft" | "on_hold" | "confirmed" | "expired" | "fulfilled";
77
+ status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
78
78
  serviceDate: string | null;
79
79
  startsAt: string | null;
80
80
  endsAt: string | null;
@@ -107,7 +107,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
107
107
  availabilitySlotId: string | null;
108
108
  quantity: number;
109
109
  allocationType: "resource" | "unit" | "pickup";
110
- status: "cancelled" | "confirmed" | "expired" | "fulfilled" | "held" | "released";
110
+ status: "expired" | "cancelled" | "confirmed" | "fulfilled" | "held" | "released";
111
111
  holdExpiresAt: string | null;
112
112
  confirmedAt: string | null;
113
113
  releasedAt: string | null;
@@ -328,7 +328,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
328
328
  session: {
329
329
  sessionId: string;
330
330
  bookingNumber: string;
331
- status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress" | "expired";
331
+ status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
332
332
  externalBookingRef: string | null;
333
333
  communicationLanguage: string | null;
334
334
  sellCurrency: string;
@@ -359,7 +359,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
359
359
  title: string;
360
360
  description: string | null;
361
361
  itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
362
- status: "cancelled" | "draft" | "on_hold" | "confirmed" | "expired" | "fulfilled";
362
+ status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
363
363
  serviceDate: string | null;
364
364
  startsAt: string | null;
365
365
  endsAt: string | null;
@@ -392,7 +392,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
392
392
  availabilitySlotId: string | null;
393
393
  quantity: number;
394
394
  allocationType: "resource" | "unit" | "pickup";
395
- status: "cancelled" | "confirmed" | "expired" | "fulfilled" | "held" | "released";
395
+ status: "expired" | "cancelled" | "confirmed" | "fulfilled" | "held" | "released";
396
396
  holdExpiresAt: string | null;
397
397
  confirmedAt: string | null;
398
398
  releasedAt: string | null;
@@ -512,7 +512,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
512
512
  data: {
513
513
  bookingId: string;
514
514
  bookingNumber: string;
515
- status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress" | "expired";
515
+ status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
516
516
  sellCurrency: string;
517
517
  sellAmountCents: number | null;
518
518
  startDate: string | null;
@@ -533,7 +533,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
533
533
  title: string;
534
534
  description: string | null;
535
535
  itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
536
- status: "cancelled" | "draft" | "on_hold" | "confirmed" | "expired" | "fulfilled";
536
+ status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
537
537
  serviceDate: string | null;
538
538
  startsAt: string | null;
539
539
  endsAt: string | null;
@@ -569,7 +569,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
569
569
  travelerId: string | null;
570
570
  fulfillmentType: "other" | "voucher" | "ticket" | "pdf" | "qr_code" | "barcode" | "mobile";
571
571
  deliveryChannel: "api" | "email" | "other" | "download" | "wallet";
572
- status: "pending" | "failed" | "issued" | "reissued" | "revoked";
572
+ status: "failed" | "pending" | "issued" | "reissued" | "revoked";
573
573
  artifactUrl: string | null;
574
574
  }[];
575
575
  };
@@ -27,15 +27,24 @@ export type Env = {
27
27
  db: PostgresJsDatabase;
28
28
  eventBus?: EventBus;
29
29
  userId?: string;
30
- actor?: "staff" | "customer" | "partner" | "supplier";
31
- callerType?: "session" | "api_key" | "internal";
30
+ agentId?: string;
31
+ workflowPrincipalId?: string;
32
+ principalSubtype?: string;
33
+ sessionId?: string;
34
+ organizationId?: string | null;
35
+ workflowRunId?: string | null;
36
+ workflowStepId?: string | null;
37
+ actor?: "staff" | "customer" | "partner" | "supplier" | "agent" | "system";
38
+ callerType?: "session" | "api_key" | "internal" | "agent" | "workflow";
39
+ apiTokenId?: string;
40
+ apiKeyId?: string;
32
41
  scopes?: string[] | null;
33
42
  isInternalRequest?: boolean;
34
43
  authorizeBookingPii?: (args: {
35
44
  db: PostgresJsDatabase;
36
45
  userId?: string;
37
- actor?: "staff" | "customer" | "partner" | "supplier";
38
- callerType?: "session" | "api_key" | "internal";
46
+ actor?: "staff" | "customer" | "partner" | "supplier" | "agent" | "system";
47
+ callerType?: "session" | "api_key" | "internal" | "agent" | "workflow";
39
48
  scopes?: string[] | null;
40
49
  isInternalRequest?: boolean;
41
50
  bookingId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"routes-shared.d.ts","sourceRoot":"","sources":["../src/routes-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,yBAAyB,EAAE,MAAM,CAAA;IACjC,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,6BAA6B,EAAE,MAAM,CAAA;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;CACpC,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,GAAG;IAChB,QAAQ,EAAE,WAAW,CAAA;IACrB,SAAS,EAAE;QACT,SAAS,CAAC,EAAE,eAAe,CAAA;QAC3B,EAAE,EAAE,kBAAkB,CAAA;QACtB,QAAQ,CAAC,EAAE,QAAQ,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;QACrD,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;QAC/C,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACxB,iBAAiB,CAAC,EAAE,OAAO,CAAA;QAC3B,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE;YAC3B,EAAE,EAAE,kBAAkB,CAAA;YACtB,MAAM,CAAC,EAAE,MAAM,CAAA;YACf,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;YACrD,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;YAC/C,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;YACxB,iBAAiB,CAAC,EAAE,OAAO,CAAA;YAC3B,SAAS,EAAE,MAAM,CAAA;YACjB,UAAU,EAAE,MAAM,CAAA;YAClB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;SACrC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACjC,CAAA;CACF,CAAA;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,OAYvC;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM;;gBAEnE"}
1
+ {"version":3,"file":"routes-shared.d.ts","sourceRoot":"","sources":["../src/routes-shared.ts"],"names":[],"mappings":"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"}