@agent-native/scheduling 0.2.1 → 0.2.2-nightly-20260927013707
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/actions/_helpers.d.ts +0 -13
- package/dist/actions/_helpers.d.ts.map +1 -1
- package/dist/actions/_helpers.js +0 -16
- package/dist/actions/_helpers.js.map +1 -1
- package/dist/actions/create-team.js +0 -1
- package/dist/actions/create-team.js.map +1 -1
- package/dist/actions/list-bookings.js +0 -4
- package/dist/actions/list-bookings.js.map +1 -1
- package/dist/actions/refresh-busy-times.js +0 -1
- package/dist/actions/refresh-busy-times.js.map +1 -1
- package/dist/actions/revoke-private-link.js +0 -2
- package/dist/actions/revoke-private-link.js.map +1 -1
- package/dist/actions/update-profile.js +0 -5
- package/dist/actions/update-profile.js.map +1 -1
- package/dist/core/buffers.d.ts +0 -18
- package/dist/core/buffers.d.ts.map +1 -1
- package/dist/core/buffers.js +0 -6
- package/dist/core/buffers.js.map +1 -1
- package/dist/core/conflicts.d.ts +0 -4
- package/dist/core/conflicts.d.ts.map +1 -1
- package/dist/core/conflicts.js +0 -1
- package/dist/core/conflicts.js.map +1 -1
- package/dist/core/limits.d.ts +0 -8
- package/dist/core/limits.d.ts.map +1 -1
- package/dist/core/limits.js.map +1 -1
- package/dist/core/round-robin.d.ts +0 -17
- package/dist/core/round-robin.d.ts.map +1 -1
- package/dist/core/round-robin.js.map +1 -1
- package/dist/core/rrule.d.ts.map +1 -1
- package/dist/core/rrule.js +0 -7
- package/dist/core/rrule.js.map +1 -1
- package/dist/core/rules.d.ts +0 -17
- package/dist/core/rules.d.ts.map +1 -1
- package/dist/core/rules.js +0 -8
- package/dist/core/rules.js.map +1 -1
- package/dist/core/slots.d.ts +0 -31
- package/dist/core/slots.d.ts.map +1 -1
- package/dist/core/slots.js +0 -9
- package/dist/core/slots.js.map +1 -1
- package/dist/core/time.d.ts +0 -24
- package/dist/core/time.d.ts.map +1 -1
- package/dist/core/time.js +0 -37
- package/dist/core/time.js.map +1 -1
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -10
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +0 -9
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +0 -18
- package/dist/manifest.js.map +1 -1
- package/dist/react/components/SlotPicker.d.ts +0 -8
- package/dist/react/components/SlotPicker.d.ts.map +1 -1
- package/dist/react/components/SlotPicker.js.map +1 -1
- package/dist/react/components/TimezoneSelect.d.ts.map +1 -1
- package/dist/react/components/TimezoneSelect.js +0 -2
- package/dist/react/components/TimezoneSelect.js.map +1 -1
- package/dist/react/components/booking-links/AvailabilityEditor.d.ts +0 -4
- package/dist/react/components/booking-links/AvailabilityEditor.d.ts.map +1 -1
- package/dist/react/components/booking-links/AvailabilityEditor.js +0 -15
- package/dist/react/components/booking-links/AvailabilityEditor.js.map +1 -1
- package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts +0 -6
- package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts.map +1 -1
- package/dist/react/components/booking-links/BookingLinkCreateDialog.js +0 -16
- package/dist/react/components/booking-links/BookingLinkCreateDialog.js.map +1 -1
- package/dist/react/components/booking-links/ConferencingSelector.d.ts +0 -2
- package/dist/react/components/booking-links/ConferencingSelector.d.ts.map +1 -1
- package/dist/react/components/booking-links/ConferencingSelector.js +0 -24
- package/dist/react/components/booking-links/ConferencingSelector.js.map +1 -1
- package/dist/react/components/booking-links/CustomFieldsEditor.d.ts +0 -1
- package/dist/react/components/booking-links/CustomFieldsEditor.d.ts.map +1 -1
- package/dist/react/components/booking-links/CustomFieldsEditor.js +0 -14
- package/dist/react/components/booking-links/CustomFieldsEditor.js.map +1 -1
- package/dist/react/components/booking-links/DurationPicker.d.ts +0 -1
- package/dist/react/components/booking-links/DurationPicker.d.ts.map +1 -1
- package/dist/react/components/booking-links/DurationPicker.js +1 -11
- package/dist/react/components/booking-links/DurationPicker.js.map +1 -1
- package/dist/react/components/booking-links/SlugEditor.d.ts +0 -3
- package/dist/react/components/booking-links/SlugEditor.d.ts.map +1 -1
- package/dist/react/components/booking-links/SlugEditor.js +0 -11
- package/dist/react/components/booking-links/SlugEditor.js.map +1 -1
- package/dist/react/components/booking-links/index.d.ts +0 -9
- package/dist/react/components/booking-links/index.d.ts.map +1 -1
- package/dist/react/components/booking-links/index.js +0 -9
- package/dist/react/components/booking-links/index.js.map +1 -1
- package/dist/react/components/index.d.ts +0 -10
- package/dist/react/components/index.d.ts.map +1 -1
- package/dist/react/components/index.js +0 -10
- package/dist/react/components/index.js.map +1 -1
- package/dist/react/hooks/useBookingFlow.d.ts.map +1 -1
- package/dist/react/hooks/useBookingFlow.js +0 -10
- package/dist/react/hooks/useBookingFlow.js.map +1 -1
- package/dist/react/hooks/useEventType.d.ts.map +1 -1
- package/dist/react/hooks/useEventType.js +0 -4
- package/dist/react/hooks/useEventType.js.map +1 -1
- package/dist/react/hooks/useReschedule.d.ts.map +1 -1
- package/dist/react/hooks/useReschedule.js +0 -4
- package/dist/react/hooks/useReschedule.js.map +1 -1
- package/dist/react/hooks/useSlots.d.ts +0 -2
- package/dist/react/hooks/useSlots.d.ts.map +1 -1
- package/dist/react/hooks/useSlots.js +0 -8
- package/dist/react/hooks/useSlots.js.map +1 -1
- package/dist/react/hooks/useTimezone.d.ts.map +1 -1
- package/dist/react/hooks/useTimezone.js +0 -4
- package/dist/react/hooks/useTimezone.js.map +1 -1
- package/dist/react/index.d.ts +0 -5
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +0 -5
- package/dist/react/index.js.map +1 -1
- package/dist/schema/bookings.d.ts +0 -7
- package/dist/schema/bookings.d.ts.map +1 -1
- package/dist/schema/bookings.js +0 -29
- package/dist/schema/bookings.js.map +1 -1
- package/dist/schema/calendar-cache.d.ts.map +1 -1
- package/dist/schema/calendar-cache.js +0 -11
- package/dist/schema/calendar-cache.js.map +1 -1
- package/dist/schema/credentials.d.ts +0 -8
- package/dist/schema/credentials.d.ts.map +1 -1
- package/dist/schema/credentials.js +0 -28
- package/dist/schema/credentials.js.map +1 -1
- package/dist/schema/event-types.d.ts +0 -10
- package/dist/schema/event-types.d.ts.map +1 -1
- package/dist/schema/event-types.js +0 -42
- package/dist/schema/event-types.js.map +1 -1
- package/dist/schema/index.d.ts +0 -11
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +0 -11
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/routing-forms.d.ts.map +1 -1
- package/dist/schema/routing-forms.js +0 -17
- package/dist/schema/routing-forms.js.map +1 -1
- package/dist/schema/schedules.d.ts +0 -12
- package/dist/schema/schedules.d.ts.map +1 -1
- package/dist/schema/schedules.js +0 -25
- package/dist/schema/schedules.js.map +1 -1
- package/dist/schema/teams.d.ts.map +1 -1
- package/dist/schema/teams.js +0 -7
- package/dist/schema/teams.js.map +1 -1
- package/dist/schema/workflows.d.ts +0 -7
- package/dist/schema/workflows.d.ts.map +1 -1
- package/dist/schema/workflows.js +0 -19
- package/dist/schema/workflows.js.map +1 -1
- package/dist/server/availability-engine.d.ts +0 -12
- package/dist/server/availability-engine.d.ts.map +1 -1
- package/dist/server/availability-engine.js +0 -20
- package/dist/server/availability-engine.js.map +1 -1
- package/dist/server/booking-service.d.ts +0 -14
- package/dist/server/booking-service.d.ts.map +1 -1
- package/dist/server/booking-service.js +0 -8
- package/dist/server/booking-service.js.map +1 -1
- package/dist/server/bookings-repo.d.ts +0 -7
- package/dist/server/bookings-repo.d.ts.map +1 -1
- package/dist/server/bookings-repo.js +0 -3
- package/dist/server/bookings-repo.js.map +1 -1
- package/dist/server/context.d.ts +0 -16
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js.map +1 -1
- package/dist/server/db-types.d.ts +0 -11
- package/dist/server/db-types.d.ts.map +1 -1
- package/dist/server/event-types-repo.d.ts +0 -10
- package/dist/server/event-types-repo.d.ts.map +1 -1
- package/dist/server/event-types-repo.js +0 -21
- package/dist/server/event-types-repo.js.map +1 -1
- package/dist/server/hooks.d.ts.map +1 -1
- package/dist/server/hooks.js +0 -11
- package/dist/server/hooks.js.map +1 -1
- package/dist/server/ics.d.ts +0 -7
- package/dist/server/ics.d.ts.map +1 -1
- package/dist/server/ics.js.map +1 -1
- package/dist/server/providers/builtin-video.d.ts +0 -5
- package/dist/server/providers/builtin-video.d.ts.map +1 -1
- package/dist/server/providers/builtin-video.js.map +1 -1
- package/dist/server/providers/google-calendar.d.ts +0 -3
- package/dist/server/providers/google-calendar.d.ts.map +1 -1
- package/dist/server/providers/google-calendar.js +0 -2
- package/dist/server/providers/google-calendar.js.map +1 -1
- package/dist/server/providers/google-meet.d.ts +0 -7
- package/dist/server/providers/google-meet.d.ts.map +1 -1
- package/dist/server/providers/google-meet.js.map +1 -1
- package/dist/server/providers/office365.d.ts +0 -6
- package/dist/server/providers/office365.d.ts.map +1 -1
- package/dist/server/providers/office365.js.map +1 -1
- package/dist/server/providers/registry.d.ts +0 -4
- package/dist/server/providers/registry.d.ts.map +1 -1
- package/dist/server/providers/registry.js.map +1 -1
- package/dist/server/providers/teams.d.ts +0 -6
- package/dist/server/providers/teams.d.ts.map +1 -1
- package/dist/server/providers/teams.js +0 -2
- package/dist/server/providers/teams.js.map +1 -1
- package/dist/server/providers/types.d.ts +0 -27
- package/dist/server/providers/types.d.ts.map +1 -1
- package/dist/server/providers/zoom.d.ts +0 -19
- package/dist/server/providers/zoom.d.ts.map +1 -1
- package/dist/server/providers/zoom.js +0 -2
- package/dist/server/providers/zoom.js.map +1 -1
- package/dist/server/schedules-repo.d.ts.map +1 -1
- package/dist/server/schedules-repo.js +0 -4
- package/dist/server/schedules-repo.js.map +1 -1
- package/dist/server/video-oauth-state.d.ts +0 -5
- package/dist/server/video-oauth-state.d.ts.map +1 -1
- package/dist/server/video-oauth-state.js +1 -9
- package/dist/server/video-oauth-state.js.map +1 -1
- package/dist/server/video-oauth.d.ts +0 -4
- package/dist/server/video-oauth.d.ts.map +1 -1
- package/dist/server/video-oauth.js +0 -23
- package/dist/server/video-oauth.js.map +1 -1
- package/dist/shared/index.d.ts +0 -37
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +0 -4
- package/dist/shared/index.js.map +1 -1
- package/package.json +4 -4
- package/src/actions/_helpers.ts +0 -16
- package/src/actions/booking-authz.spec.ts +0 -6
- package/src/actions/create-team.ts +0 -1
- package/src/actions/event-type-authz.spec.ts +0 -11
- package/src/actions/list-bookings.ts +0 -4
- package/src/actions/refresh-busy-times.ts +0 -1
- package/src/actions/revoke-private-link.ts +0 -2
- package/src/actions/update-profile.ts +0 -5
- package/src/core/buffers.ts +0 -18
- package/src/core/conflicts.ts +0 -4
- package/src/core/limits.ts +0 -8
- package/src/core/round-robin.test.ts +0 -1
- package/src/core/round-robin.ts +0 -17
- package/src/core/rrule.ts +0 -7
- package/src/core/rules.ts +0 -17
- package/src/core/slots.test.ts +1 -11
- package/src/core/slots.ts +0 -40
- package/src/core/time.ts +0 -37
- package/src/index.ts +0 -11
- package/src/manifest.ts +0 -19
- package/src/react/components/SlotPicker.tsx +0 -8
- package/src/react/components/TimezoneSelect.tsx +0 -2
- package/src/react/components/_shadcn-shims.d.ts +0 -35
- package/src/react/components/booking-links/AvailabilityEditor.tsx +0 -15
- package/src/react/components/booking-links/BookingLinkCreateDialog.tsx +0 -22
- package/src/react/components/booking-links/ConferencingSelector.tsx +0 -26
- package/src/react/components/booking-links/CustomFieldsEditor.tsx +0 -15
- package/src/react/components/booking-links/DurationPicker.tsx +1 -12
- package/src/react/components/booking-links/SlugEditor.tsx +0 -14
- package/src/react/components/booking-links/index.ts +0 -9
- package/src/react/components/index.ts +0 -10
- package/src/react/hooks/useBookingFlow.ts +0 -10
- package/src/react/hooks/useEventType.ts +0 -4
- package/src/react/hooks/useReschedule.ts +0 -4
- package/src/react/hooks/useSlots.ts +0 -10
- package/src/react/hooks/useTimezone.ts +0 -4
- package/src/react/index.ts +0 -5
- package/src/schema/bookings.ts +0 -29
- package/src/schema/calendar-cache.ts +0 -11
- package/src/schema/credentials.ts +0 -28
- package/src/schema/event-types.ts +0 -42
- package/src/schema/index.ts +0 -11
- package/src/schema/routing-forms.ts +0 -17
- package/src/schema/schedules.ts +0 -25
- package/src/schema/teams.ts +0 -7
- package/src/schema/workflows.ts +0 -19
- package/src/server/availability-engine.test.ts +0 -1
- package/src/server/availability-engine.ts +0 -22
- package/src/server/booking-service.spec.ts +0 -15
- package/src/server/booking-service.ts +0 -22
- package/src/server/bookings-repo.ts +0 -10
- package/src/server/context.ts +0 -16
- package/src/server/db-types.ts +0 -11
- package/src/server/event-types-repo.ts +0 -31
- package/src/server/hooks.ts +0 -11
- package/src/server/ics.ts +0 -7
- package/src/server/providers/builtin-video.ts +0 -5
- package/src/server/providers/google-calendar.ts +0 -5
- package/src/server/providers/google-meet.ts +0 -7
- package/src/server/providers/office365.ts +0 -6
- package/src/server/providers/registry.ts +0 -4
- package/src/server/providers/teams.ts +0 -8
- package/src/server/providers/types.ts +0 -27
- package/src/server/providers/zoom.ts +0 -21
- package/src/server/schedules-repo.ts +0 -4
- package/src/server/video-oauth-state.ts +1 -10
- package/src/server/video-oauth.ts +0 -23
- package/src/shared/index.ts +0 -38
package/src/manifest.ts
CHANGED
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Machine-readable manifest of what this package ships.
|
|
3
|
-
*
|
|
4
|
-
* Consumed by `agent-native add scheduling` (or the template scaffolder) to:
|
|
5
|
-
* - generate stub action files in the consumer's `actions/` folder
|
|
6
|
-
* - symlink/copy skill files into the consumer's `.agents/skills/`
|
|
7
|
-
* - append required secret declarations
|
|
8
|
-
* - print the list in `agent-native info @agent-native/scheduling`
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
1
|
export interface SchedulingManifest {
|
|
12
2
|
manifestVersion: 1;
|
|
13
3
|
name: string;
|
|
@@ -23,7 +13,6 @@ export const MANIFEST: SchedulingManifest = {
|
|
|
23
13
|
manifestVersion: 1,
|
|
24
14
|
name: "@agent-native/scheduling",
|
|
25
15
|
actions: [
|
|
26
|
-
// Event types
|
|
27
16
|
"list-event-types",
|
|
28
17
|
"get-event-type",
|
|
29
18
|
"create-event-type",
|
|
@@ -35,7 +24,6 @@ export const MANIFEST: SchedulingManifest = {
|
|
|
35
24
|
"set-event-type-location",
|
|
36
25
|
"add-private-link",
|
|
37
26
|
"revoke-private-link",
|
|
38
|
-
// Availability / schedules
|
|
39
27
|
"list-schedules",
|
|
40
28
|
"create-schedule",
|
|
41
29
|
"update-schedule",
|
|
@@ -46,7 +34,6 @@ export const MANIFEST: SchedulingManifest = {
|
|
|
46
34
|
"get-availability",
|
|
47
35
|
"check-availability",
|
|
48
36
|
"find-available-slot",
|
|
49
|
-
// Bookings
|
|
50
37
|
"list-bookings",
|
|
51
38
|
"get-booking",
|
|
52
39
|
"create-booking",
|
|
@@ -59,7 +46,6 @@ export const MANIFEST: SchedulingManifest = {
|
|
|
59
46
|
"send-reschedule-link",
|
|
60
47
|
"add-booking-note",
|
|
61
48
|
"export-bookings-csv",
|
|
62
|
-
// Integrations
|
|
63
49
|
"list-calendar-integrations",
|
|
64
50
|
"connect-calendar",
|
|
65
51
|
"connect-video",
|
|
@@ -69,29 +55,24 @@ export const MANIFEST: SchedulingManifest = {
|
|
|
69
55
|
"set-destination-calendar",
|
|
70
56
|
"refresh-busy-times",
|
|
71
57
|
"install-conferencing-app",
|
|
72
|
-
// Team
|
|
73
58
|
"create-team",
|
|
74
59
|
"invite-team-member",
|
|
75
60
|
"accept-team-invite",
|
|
76
61
|
"remove-team-member",
|
|
77
62
|
"update-member-role",
|
|
78
63
|
"set-team-branding",
|
|
79
|
-
// Round-robin / hosts
|
|
80
64
|
"assign-round-robin-host",
|
|
81
65
|
"set-event-type-hosts",
|
|
82
66
|
"set-host-availability-override",
|
|
83
67
|
"create-host-group",
|
|
84
|
-
// Settings / profile
|
|
85
68
|
"update-profile",
|
|
86
69
|
"set-appearance",
|
|
87
70
|
"set-default-conferencing-app",
|
|
88
|
-
// Workflows
|
|
89
71
|
"list-workflows",
|
|
90
72
|
"create-workflow",
|
|
91
73
|
"update-workflow",
|
|
92
74
|
"delete-workflow",
|
|
93
75
|
"toggle-workflow",
|
|
94
|
-
// Routing forms
|
|
95
76
|
"list-routing-forms",
|
|
96
77
|
"create-routing-form",
|
|
97
78
|
"update-routing-form",
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
import { TZDate } from "@date-fns/tz";
|
|
2
2
|
import { format } from "date-fns";
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* SlotPicker — minimal, unstyled primitive that renders a vertical list of
|
|
6
|
-
* available slots grouped by date. Consumers style the buttons via their
|
|
7
|
-
* own Tailwind class layer.
|
|
8
|
-
*
|
|
9
|
-
* This is the "headless" spec: consumers can wrap it with their app's design
|
|
10
|
-
* system for a fully styled picker.
|
|
11
|
-
*/
|
|
12
4
|
import type { Slot } from "../../shared/index.js";
|
|
13
5
|
import { useSchedulingT } from "../i18n.js";
|
|
14
6
|
|
|
@@ -4,8 +4,6 @@ export interface TimezoneSelectProps {
|
|
|
4
4
|
className?: string;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
// A compact list; consumers can replace with the full 600+ IANA zones from
|
|
8
|
-
// `Intl.supportedValuesOf("timeZone")` at the call site if they need all of them.
|
|
9
7
|
const COMMON_ZONES = [
|
|
10
8
|
"UTC",
|
|
11
9
|
"America/New_York",
|
|
@@ -1,38 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type shims for the consumer's shadcn/ui components.
|
|
3
|
-
*
|
|
4
|
-
* The scheduling package's React components import shadcn primitives via
|
|
5
|
-
* the standard `@/components/ui/*` alias. That alias is resolved at
|
|
6
|
-
* *build time* by the consumer's bundler (Vite / React Router) using the
|
|
7
|
-
* template's `tsconfig.json` `paths` setting.
|
|
8
|
-
*
|
|
9
|
-
* The package itself doesn't have access to that alias during `tsc`
|
|
10
|
-
* compilation, so we declare broad shapes here to make the compiler happy
|
|
11
|
-
* without coupling the package to a specific shadcn version. Runtime
|
|
12
|
-
* behaviour is driven entirely by the consumer's actual shadcn modules.
|
|
13
|
-
*
|
|
14
|
-
* Expected consumer primitives (add to your `app/components/ui/` folder
|
|
15
|
-
* before importing any `@agent-native/scheduling/react/components` files):
|
|
16
|
-
*
|
|
17
|
-
* - button (Button)
|
|
18
|
-
* - input (Input)
|
|
19
|
-
* - label (Label)
|
|
20
|
-
* - textarea (Textarea)
|
|
21
|
-
* - switch (Switch)
|
|
22
|
-
* - badge (Badge)
|
|
23
|
-
* - card (Card, CardContent, CardDescription, CardHeader, CardTitle)
|
|
24
|
-
* - dialog (Dialog, DialogContent, DialogHeader, DialogTitle,
|
|
25
|
-
* DialogDescription, DialogFooter, DialogTrigger)
|
|
26
|
-
* - select (Select, SelectContent, SelectItem, SelectTrigger, SelectValue)
|
|
27
|
-
* - separator (Separator)
|
|
28
|
-
* - tabs (Tabs, TabsList, TabsTrigger, TabsContent)
|
|
29
|
-
* - tooltip (Tooltip, TooltipContent, TooltipTrigger)
|
|
30
|
-
* - dropdown-menu (DropdownMenu, DropdownMenuContent, DropdownMenuItem,
|
|
31
|
-
* DropdownMenuSeparator, DropdownMenuTrigger)
|
|
32
|
-
* - alert-dialog (AlertDialog, AlertDialogAction, AlertDialogCancel,
|
|
33
|
-
* AlertDialogContent, AlertDialogDescription, AlertDialogFooter,
|
|
34
|
-
* AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger)
|
|
35
|
-
*/
|
|
36
1
|
declare module "@/components/ui/button" {
|
|
37
2
|
import type { ComponentType, ButtonHTMLAttributes, ReactNode } from "react";
|
|
38
3
|
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
@@ -1,15 +1,4 @@
|
|
|
1
1
|
import { type LocaleCode } from "@agent-native/core/client/i18n";
|
|
2
|
-
/**
|
|
3
|
-
* AvailabilityEditor — weekly schedule grid with per-day toggles and time
|
|
4
|
-
* pickers. Matches the calendar template's visual baseline.
|
|
5
|
-
*
|
|
6
|
-
* This is the "schedule body" — for the full per-day intervals +
|
|
7
|
-
* date-override grid, compose this with a `DateOverridesEditor`
|
|
8
|
-
* (not included yet; scheduling's existing per-page implementation
|
|
9
|
-
* remains canonical for v0.1).
|
|
10
|
-
*
|
|
11
|
-
* Shadcn primitives expected in the consumer: input, switch.
|
|
12
|
-
*/
|
|
13
2
|
import { Input, Switch } from "@agent-native/toolkit/ui";
|
|
14
3
|
|
|
15
4
|
import { schedulingMessage, useSchedulingT } from "../../i18n.js";
|
|
@@ -131,10 +120,6 @@ export function AvailabilityEditor({
|
|
|
131
120
|
);
|
|
132
121
|
}
|
|
133
122
|
|
|
134
|
-
/**
|
|
135
|
-
* Summarize a `WeeklySchedule` in a short phrase, e.g. "Weekdays, 9 am - 5 pm".
|
|
136
|
-
* Useful for list-row subtitles.
|
|
137
|
-
*/
|
|
138
123
|
export function summarizeAvailability(
|
|
139
124
|
ws: WeeklySchedule,
|
|
140
125
|
locale: LocaleCode = "en-US",
|
|
@@ -10,17 +10,6 @@ import {
|
|
|
10
10
|
Label,
|
|
11
11
|
Textarea,
|
|
12
12
|
} from "@agent-native/toolkit/ui";
|
|
13
|
-
/**
|
|
14
|
-
* BookingLinkCreateDialog — dialog prompting for Title / URL / Duration
|
|
15
|
-
* when creating a new booking link (a.k.a. event type).
|
|
16
|
-
*
|
|
17
|
-
* The consumer owns the mutation — this component just collects the four
|
|
18
|
-
* inputs and calls `onSubmit` once the user clicks Continue. It stays
|
|
19
|
-
* dumb: no data fetching, no optimistic UI.
|
|
20
|
-
*
|
|
21
|
-
* Shadcn primitives expected in the consumer: dialog, button, input,
|
|
22
|
-
* label, textarea.
|
|
23
|
-
*/
|
|
24
13
|
import { useEffect, useState } from "react";
|
|
25
14
|
|
|
26
15
|
import { useSchedulingT } from "../../i18n.js";
|
|
@@ -35,15 +24,9 @@ export interface BookingLinkCreateDraft {
|
|
|
35
24
|
export interface BookingLinkCreateDialogProps {
|
|
36
25
|
open: boolean;
|
|
37
26
|
onOpenChange: (open: boolean) => void;
|
|
38
|
-
/**
|
|
39
|
-
* URL prefix shown before the slug input, e.g.
|
|
40
|
-
* "calendar.app/meet/alice/" or "cal.local/steve@foo.com/"
|
|
41
|
-
*/
|
|
42
27
|
slugPrefix: string;
|
|
43
|
-
/** Default duration in minutes. Defaults to 30. */
|
|
44
28
|
defaultLength?: number;
|
|
45
29
|
onSubmit: (draft: BookingLinkCreateDraft) => void | Promise<void>;
|
|
46
|
-
/** Button label — defaults to "Continue". */
|
|
47
30
|
submitLabel?: string;
|
|
48
31
|
}
|
|
49
32
|
|
|
@@ -75,7 +58,6 @@ export function BookingLinkCreateDialog(props: BookingLinkCreateDialogProps) {
|
|
|
75
58
|
const [submitting, setSubmitting] = useState(false);
|
|
76
59
|
const [slugEdited, setSlugEdited] = useState(false);
|
|
77
60
|
|
|
78
|
-
// Reset form when the dialog reopens
|
|
79
61
|
useEffect(() => {
|
|
80
62
|
if (open) {
|
|
81
63
|
setForm({
|
|
@@ -136,10 +118,6 @@ export function BookingLinkCreateDialog(props: BookingLinkCreateDialogProps) {
|
|
|
136
118
|
className="rounded-l-none border-0 focus-visible:ring-0 focus-visible:ring-offset-0"
|
|
137
119
|
value={form.slug}
|
|
138
120
|
onChange={(e) => {
|
|
139
|
-
// Capture before setForm — React nulls e.currentTarget once
|
|
140
|
-
// the event finishes synchronous propagation, so reading it
|
|
141
|
-
// inside the updater closure throws "Cannot read properties
|
|
142
|
-
// of null (reading 'value')".
|
|
143
121
|
const next = e.currentTarget.value;
|
|
144
122
|
setSlugEdited(true);
|
|
145
123
|
setForm((prev) => ({
|
|
@@ -16,30 +16,6 @@ import {
|
|
|
16
16
|
IconVideo,
|
|
17
17
|
IconVideoOff,
|
|
18
18
|
} from "@tabler/icons-react";
|
|
19
|
-
/**
|
|
20
|
-
* ConferencingSelector — choose how a booking's video meeting is set up.
|
|
21
|
-
*
|
|
22
|
-
* Renders a grid of options (no conferencing, Google Meet, Zoom, custom
|
|
23
|
-
* link). Each option is fully styled with the consumer's shadcn
|
|
24
|
-
* primitives. The Zoom option does NOT accept a pasted personal meeting
|
|
25
|
-
* URL — the user connects their Zoom account via OAuth instead, and the
|
|
26
|
-
* app auto-creates a meeting per booking. See `connect-video` action.
|
|
27
|
-
*
|
|
28
|
-
* Shadcn primitives expected in the consumer: button, input, label,
|
|
29
|
-
* badge. Icons from `@tabler/icons-react`.
|
|
30
|
-
*
|
|
31
|
-
* Props:
|
|
32
|
-
* - `value` — current conferencing config { type, url? }
|
|
33
|
-
* - `onChange` — called with the next config (call instantly — the
|
|
34
|
-
* caller owns persistence, typically optimistic)
|
|
35
|
-
* - `zoomStatus` — 'connected' | 'disconnected' | 'not-configured'
|
|
36
|
-
* drives the Connect Zoom button / installed chip
|
|
37
|
-
* - `onConnectZoom` — optional callback that starts the OAuth flow; if
|
|
38
|
-
* omitted, the button is hidden (useful for preview)
|
|
39
|
-
* - `googleConnected` — whether Google Meet is available (depends on
|
|
40
|
-
* Google Calendar credential)
|
|
41
|
-
* - `onConnectGoogle` — optional, same shape as onConnectZoom
|
|
42
|
-
*/
|
|
43
19
|
import { useId, type ComponentType } from "react";
|
|
44
20
|
|
|
45
21
|
import { useSchedulingT } from "../../i18n.js";
|
|
@@ -48,7 +24,6 @@ export type ConferencingType = "none" | "google_meet" | "zoom" | "custom";
|
|
|
48
24
|
|
|
49
25
|
export interface ConferencingValue {
|
|
50
26
|
type: ConferencingType;
|
|
51
|
-
/** Used for `custom` — the meeting URL. Ignored for `zoom` (OAuth-created). */
|
|
52
27
|
url?: string;
|
|
53
28
|
}
|
|
54
29
|
|
|
@@ -61,7 +36,6 @@ export interface ConferencingSelectorProps {
|
|
|
61
36
|
googleStatus?: ProviderStatus;
|
|
62
37
|
onConnectZoom?: () => void;
|
|
63
38
|
onConnectGoogle?: () => void;
|
|
64
|
-
/** Hide the label above the grid (for use inside a card with its own title). */
|
|
65
39
|
hideLabel?: boolean;
|
|
66
40
|
}
|
|
67
41
|
|
|
@@ -9,20 +9,6 @@ import {
|
|
|
9
9
|
IconTrash,
|
|
10
10
|
} from "@tabler/icons-react";
|
|
11
11
|
import { nanoid } from "nanoid";
|
|
12
|
-
/**
|
|
13
|
-
* CustomFieldsEditor — add, remove, reorder, and configure custom form
|
|
14
|
-
* fields shown on a booking page.
|
|
15
|
-
*
|
|
16
|
-
* The shape matches the calendar template's `CustomField`. The scheduling
|
|
17
|
-
* template's event types also have `customFields` — both can use this
|
|
18
|
-
* directly.
|
|
19
|
-
*
|
|
20
|
-
* All edits flow through `onChange` synchronously so the caller can
|
|
21
|
-
* update the UI (and persist) optimistically.
|
|
22
|
-
*
|
|
23
|
-
* Shadcn primitives expected in the consumer: button, input, label,
|
|
24
|
-
* textarea, switch. Icons from `@tabler/icons-react`.
|
|
25
|
-
*/
|
|
26
12
|
import { useState } from "react";
|
|
27
13
|
|
|
28
14
|
import { useSchedulingT } from "../../i18n.js";
|
|
@@ -50,7 +36,6 @@ export interface CustomField {
|
|
|
50
36
|
export interface CustomFieldsEditorProps {
|
|
51
37
|
fields: CustomField[];
|
|
52
38
|
onChange: (fields: CustomField[]) => void;
|
|
53
|
-
/** Hide the outer label + add button (e.g. if rendered inside its own card). */
|
|
54
39
|
hideLabel?: boolean;
|
|
55
40
|
}
|
|
56
41
|
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import { Button, Input } from "@agent-native/toolkit/ui";
|
|
2
2
|
import { IconPlus, IconX } from "@tabler/icons-react";
|
|
3
|
-
/**
|
|
4
|
-
* DurationPicker — multi-select of booking durations rendered as pills.
|
|
5
|
-
*
|
|
6
|
-
* Bookers will pick between the selected durations on the public booking
|
|
7
|
-
* page (if more than one is selected). Shows 15/30/45/60 as default
|
|
8
|
-
* presets; the user can type an arbitrary number and add it too.
|
|
9
|
-
*
|
|
10
|
-
* Shadcn primitives expected in the consumer: button, input, label.
|
|
11
|
-
*/
|
|
12
3
|
import { useState } from "react";
|
|
13
4
|
|
|
14
5
|
import { useSchedulingT } from "../../i18n.js";
|
|
@@ -19,7 +10,6 @@ export interface DurationPickerProps {
|
|
|
19
10
|
value: number[];
|
|
20
11
|
onChange: (next: number[]) => void;
|
|
21
12
|
presets?: number[];
|
|
22
|
-
/** Minimum valid duration, defaults to 5 (minutes). */
|
|
23
13
|
min?: number;
|
|
24
14
|
}
|
|
25
15
|
|
|
@@ -36,7 +26,7 @@ export function DurationPicker(props: DurationPickerProps) {
|
|
|
36
26
|
const next = value.includes(mins)
|
|
37
27
|
? value.filter((d) => d !== mins)
|
|
38
28
|
: [...value, mins].sort((a, b) => a - b);
|
|
39
|
-
if (next.length === 0) return;
|
|
29
|
+
if (next.length === 0) return;
|
|
40
30
|
onChange(next);
|
|
41
31
|
};
|
|
42
32
|
|
|
@@ -52,7 +42,6 @@ export function DurationPicker(props: DurationPickerProps) {
|
|
|
52
42
|
onChange(next);
|
|
53
43
|
};
|
|
54
44
|
|
|
55
|
-
// Union of presets + selected values → pill row.
|
|
56
45
|
const pillOptions = Array.from(new Set([...presets, ...value])).sort(
|
|
57
46
|
(a, b) => a - b,
|
|
58
47
|
);
|
|
@@ -1,30 +1,16 @@
|
|
|
1
1
|
import { Label } from "@agent-native/toolkit/ui";
|
|
2
|
-
/**
|
|
3
|
-
* SlugEditor — inline-editable URL preview for a booking link.
|
|
4
|
-
*
|
|
5
|
-
* Renders the public booking URL as a single interactive line. Clicking
|
|
6
|
-
* the username segment (if editable) or the slug segment swaps it for an
|
|
7
|
-
* input; pressing Enter / blurring commits. All changes are fired through
|
|
8
|
-
* the `onUsernameChange` / `onSlugChange` callbacks synchronously — the
|
|
9
|
-
* caller owns persistence and should update UI optimistically.
|
|
10
|
-
*
|
|
11
|
-
* Shadcn primitives expected in the consumer: label.
|
|
12
|
-
*/
|
|
13
2
|
import { useState } from "react";
|
|
14
3
|
|
|
15
4
|
import { useSchedulingT } from "../../i18n.js";
|
|
16
5
|
|
|
17
6
|
export interface SlugEditorProps {
|
|
18
7
|
host: string;
|
|
19
|
-
/** Path prefix before the username, e.g. "/meet" (calendar) or "" (scheduling). */
|
|
20
8
|
pathPrefix?: string;
|
|
21
9
|
username: string;
|
|
22
10
|
slug: string;
|
|
23
11
|
onUsernameChange?: (next: string) => void;
|
|
24
12
|
onSlugChange: (next: string) => void;
|
|
25
|
-
/** Hide the top label (e.g. inside a compact inline row). */
|
|
26
13
|
hideLabel?: boolean;
|
|
27
|
-
/** Label text. Defaults to "URL". */
|
|
28
14
|
label?: string;
|
|
29
15
|
}
|
|
30
16
|
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared booking-link / event-type UI components. Consumers:
|
|
3
|
-
* - calendar template → app/pages/BookingLinksPage
|
|
4
|
-
* - custom scheduling surfaces → event-type detail pages
|
|
5
|
-
*
|
|
6
|
-
* Every component here renders with the consumer's shadcn primitives
|
|
7
|
-
* imported via `@/components/ui/*`. See the top of each file for the
|
|
8
|
-
* list of primitives required.
|
|
9
|
-
*/
|
|
10
1
|
export * from "./AvailabilityEditor.js";
|
|
11
2
|
export * from "./BookingLinkCreateDialog.js";
|
|
12
3
|
export * from "./ConferencingSelector.js";
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Styled components for the scheduling package.
|
|
3
|
-
*
|
|
4
|
-
* These components import shadcn primitives from the consumer via the
|
|
5
|
-
* `@/components/ui/*` alias — the package doesn't bundle shadcn. See each
|
|
6
|
-
* component file for the list of primitives it expects.
|
|
7
|
-
*
|
|
8
|
-
* NOTE: In v0.1 the main `<Booker>` lives in app surfaces first. Once its API
|
|
9
|
-
* stabilizes we hoist it here (v0.2).
|
|
10
|
-
*/
|
|
11
1
|
export * from "./SlotPicker.js";
|
|
12
2
|
export * from "./TimezoneSelect.js";
|
|
13
3
|
export * from "./booking-links/index.js";
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useBookingFlow — the Booker state machine.
|
|
3
|
-
*
|
|
4
|
-
* Stages: "pick-date" → "pick-slot" → "fill-form" → "success"
|
|
5
|
-
* (plus "error" for any step's failure).
|
|
6
|
-
*
|
|
7
|
-
* Persistence: stores the current selection in a tuple that can be mirrored
|
|
8
|
-
* to URL query params and `application_state.booker-state` so both the agent
|
|
9
|
-
* and a page refresh see the same state.
|
|
10
|
-
*/
|
|
11
1
|
import { useState, useCallback } from "react";
|
|
12
2
|
|
|
13
3
|
import type { Slot } from "../../shared/index.js";
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useSlots — fetches available time slots for an event type over a date
|
|
3
|
-
* range. Plays well with @tanstack/react-query when it's available, falls
|
|
4
|
-
* back to a plain fetch + state when not.
|
|
5
|
-
*
|
|
6
|
-
* The hook is transport-agnostic: consumers pass a `fetchSlots` callback
|
|
7
|
-
* that calls their own API (typically an action like `check-availability`).
|
|
8
|
-
*/
|
|
9
1
|
import { useEffect, useState, useCallback } from "react";
|
|
10
2
|
|
|
11
3
|
import type { Slot } from "../../shared/index.js";
|
|
@@ -18,7 +10,6 @@ export interface UseSlotsOpts {
|
|
|
18
10
|
from: string;
|
|
19
11
|
to: string;
|
|
20
12
|
timezone?: string;
|
|
21
|
-
/** Consumer-provided fetch function — typically calls `check-availability` */
|
|
22
13
|
fetchSlots: (params: {
|
|
23
14
|
eventTypeId?: string;
|
|
24
15
|
slug?: string;
|
|
@@ -28,7 +19,6 @@ export interface UseSlotsOpts {
|
|
|
28
19
|
to: string;
|
|
29
20
|
timezone?: string;
|
|
30
21
|
}) => Promise<{ slots: Slot[] }>;
|
|
31
|
-
/** If false, don't fetch (e.g. waiting on a dependency) */
|
|
32
22
|
enabled?: boolean;
|
|
33
23
|
}
|
|
34
24
|
|
package/src/react/index.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Headless hooks for scheduling UIs. The stable API surface of the React
|
|
3
|
-
* entry point — components live at `@agent-native/scheduling/react/components`
|
|
4
|
-
* and are less stable until v1.0.
|
|
5
|
-
*/
|
|
6
1
|
export * from "./hooks/useTimezone.js";
|
|
7
2
|
export * from "./hooks/useSlots.js";
|
|
8
3
|
export * from "./hooks/useBookingFlow.js";
|
package/src/schema/bookings.ts
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bookings — the materialized appointments created when someone books an
|
|
3
|
-
* event type.
|
|
4
|
-
*
|
|
5
|
-
* Each Booking may have multiple attendees (seated events), multiple
|
|
6
|
-
* references (one per external system: Google Calendar event id, Zoom
|
|
7
|
-
* meeting id, etc.), and a recurring parent (for recurring series).
|
|
8
|
-
*/
|
|
9
1
|
import {
|
|
10
2
|
table,
|
|
11
3
|
text,
|
|
@@ -17,19 +9,15 @@ import { boolean } from "drizzle-orm/pg-core";
|
|
|
17
9
|
|
|
18
10
|
export const bookings = table("bookings", {
|
|
19
11
|
id: text("id").primaryKey(),
|
|
20
|
-
/** Public booking uid used in URLs like /booking/:uid and /reschedule/:uid */
|
|
21
12
|
uid: text("uid").notNull().unique(),
|
|
22
13
|
eventTypeId: text("event_type_id").notNull(),
|
|
23
|
-
/** Organizer email (assigned host for round-robin) */
|
|
24
14
|
hostEmail: text("host_email").notNull(),
|
|
25
15
|
|
|
26
16
|
title: text("title").notNull(),
|
|
27
17
|
description: text("description"),
|
|
28
18
|
|
|
29
|
-
/** ISO 8601 UTC */
|
|
30
19
|
startTime: text("start_time").notNull(),
|
|
31
20
|
endTime: text("end_time").notNull(),
|
|
32
|
-
/** Timezone in which the organizer/attendees originally picked the slot */
|
|
33
21
|
timezone: text("timezone").notNull().default("UTC"),
|
|
34
22
|
|
|
35
23
|
status: text("status", {
|
|
@@ -38,32 +26,24 @@ export const bookings = table("bookings", {
|
|
|
38
26
|
.notNull()
|
|
39
27
|
.default("confirmed"),
|
|
40
28
|
|
|
41
|
-
/** JSON Location — see shared types */
|
|
42
29
|
location: text("location"),
|
|
43
30
|
|
|
44
|
-
/** JSON object of custom field responses */
|
|
45
31
|
customResponses: text("custom_responses"),
|
|
46
32
|
|
|
47
|
-
/** Reschedule/cancel tokens for public magic links */
|
|
48
33
|
cancelToken: text("cancel_token"),
|
|
49
34
|
rescheduleToken: text("reschedule_token"),
|
|
50
35
|
|
|
51
|
-
/** uid of the booking this one replaced (reschedule chain) */
|
|
52
36
|
fromReschedule: text("from_reschedule"),
|
|
53
37
|
cancellationReason: text("cancellation_reason"),
|
|
54
38
|
reschedulingReason: text("rescheduling_reason"),
|
|
55
39
|
|
|
56
|
-
/** Calendar invite iCal UID (stable across reschedules for RFC 5545 compliance) */
|
|
57
40
|
iCalUid: text("ical_uid").notNull(),
|
|
58
41
|
iCalSequence: integer("ical_sequence").notNull().default(0),
|
|
59
42
|
|
|
60
|
-
/** Recurring series parent id; null for non-recurring */
|
|
61
43
|
recurringEventId: text("recurring_event_id"),
|
|
62
44
|
|
|
63
|
-
/** Payment state (Tier 2) */
|
|
64
45
|
paid: boolean("paid").notNull().default(false),
|
|
65
46
|
|
|
66
|
-
/** Whether the host marked themselves a no-show */
|
|
67
47
|
noShowHost: boolean("no_show_host").notNull().default(false),
|
|
68
48
|
|
|
69
49
|
metadata: text("metadata"),
|
|
@@ -73,7 +53,6 @@ export const bookings = table("bookings", {
|
|
|
73
53
|
...ownableColumns(),
|
|
74
54
|
});
|
|
75
55
|
|
|
76
|
-
/** Attendees attached to a booking (N for seated events, 1 for personal). */
|
|
77
56
|
export const bookingAttendees = table("booking_attendees", {
|
|
78
57
|
id: text("id").primaryKey(),
|
|
79
58
|
bookingId: text("booking_id").notNull(),
|
|
@@ -85,14 +64,9 @@ export const bookingAttendees = table("booking_attendees", {
|
|
|
85
64
|
createdAt: text("created_at").notNull(),
|
|
86
65
|
});
|
|
87
66
|
|
|
88
|
-
/**
|
|
89
|
-
* External system references — Google Calendar event ids, Zoom meeting ids,
|
|
90
|
-
* ICS UIDs, etc. One booking → many references.
|
|
91
|
-
*/
|
|
92
67
|
export const bookingReferences = table("booking_references", {
|
|
93
68
|
id: text("id").primaryKey(),
|
|
94
69
|
bookingId: text("booking_id").notNull(),
|
|
95
|
-
/** Provider kind: "google_calendar", "office365_calendar", "zoom_video", … */
|
|
96
70
|
type: text("type").notNull(),
|
|
97
71
|
externalId: text("external_id").notNull(),
|
|
98
72
|
meetingUrl: text("meeting_url"),
|
|
@@ -101,17 +75,14 @@ export const bookingReferences = table("booking_references", {
|
|
|
101
75
|
createdAt: text("created_at").notNull(),
|
|
102
76
|
});
|
|
103
77
|
|
|
104
|
-
/** Seat reservations — one per attendee on a seated event. */
|
|
105
78
|
export const bookingSeats = table("booking_seats", {
|
|
106
79
|
id: text("id").primaryKey(),
|
|
107
80
|
bookingId: text("booking_id").notNull(),
|
|
108
81
|
attendeeId: text("attendee_id").notNull(),
|
|
109
|
-
/** Opaque reference string used for attendee self-manage links */
|
|
110
82
|
referenceUid: text("reference_uid").notNull().unique(),
|
|
111
83
|
createdAt: text("created_at").notNull(),
|
|
112
84
|
});
|
|
113
85
|
|
|
114
|
-
/** Internal notes on a booking (host-only). */
|
|
115
86
|
export const bookingNotes = table("booking_notes", {
|
|
116
87
|
id: text("id").primaryKey(),
|
|
117
88
|
bookingId: text("booking_id").notNull(),
|
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Calendar cache — short-TTL cache of busy intervals fetched from external
|
|
3
|
-
* calendars. Keyed by (credentialId, selected-calendars-hash, time-window).
|
|
4
|
-
*
|
|
5
|
-
* Booking the same slot twice at 3:00pm is the worst UX in a scheduling
|
|
6
|
-
* product, so this cache has a short TTL (default 5 min) and is explicitly
|
|
7
|
-
* busted on every booking create/update/cancel.
|
|
8
|
-
*/
|
|
9
1
|
import { table, text } from "@agent-native/core/db/schema";
|
|
10
2
|
|
|
11
3
|
export const calendarCache = table("calendar_cache", {
|
|
12
4
|
id: text("id").primaryKey(),
|
|
13
5
|
credentialId: text("credential_id").notNull(),
|
|
14
|
-
/** Hash of (credentialId + sorted selected calendar ids + time range) */
|
|
15
6
|
cacheKey: text("cache_key").notNull().unique(),
|
|
16
|
-
/** ISO 8601 start of the queried window */
|
|
17
7
|
windowStart: text("window_start").notNull(),
|
|
18
8
|
windowEnd: text("window_end").notNull(),
|
|
19
|
-
/** JSON array of {start, end} busy intervals */
|
|
20
9
|
busyJson: text("busy_json").notNull(),
|
|
21
10
|
expiresAt: text("expires_at").notNull(),
|
|
22
11
|
createdAt: text("created_at").notNull(),
|