@agent-native/scheduling 0.2.1 → 0.2.2-nightly-20260927023146

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dist/actions/_helpers.d.ts +0 -13
  2. package/dist/actions/_helpers.d.ts.map +1 -1
  3. package/dist/actions/_helpers.js +0 -16
  4. package/dist/actions/_helpers.js.map +1 -1
  5. package/dist/actions/create-team.js +0 -1
  6. package/dist/actions/create-team.js.map +1 -1
  7. package/dist/actions/list-bookings.js +0 -4
  8. package/dist/actions/list-bookings.js.map +1 -1
  9. package/dist/actions/refresh-busy-times.js +0 -1
  10. package/dist/actions/refresh-busy-times.js.map +1 -1
  11. package/dist/actions/revoke-private-link.js +0 -2
  12. package/dist/actions/revoke-private-link.js.map +1 -1
  13. package/dist/actions/update-profile.js +0 -5
  14. package/dist/actions/update-profile.js.map +1 -1
  15. package/dist/core/buffers.d.ts +0 -18
  16. package/dist/core/buffers.d.ts.map +1 -1
  17. package/dist/core/buffers.js +0 -6
  18. package/dist/core/buffers.js.map +1 -1
  19. package/dist/core/conflicts.d.ts +0 -4
  20. package/dist/core/conflicts.d.ts.map +1 -1
  21. package/dist/core/conflicts.js +0 -1
  22. package/dist/core/conflicts.js.map +1 -1
  23. package/dist/core/limits.d.ts +0 -8
  24. package/dist/core/limits.d.ts.map +1 -1
  25. package/dist/core/limits.js.map +1 -1
  26. package/dist/core/round-robin.d.ts +0 -17
  27. package/dist/core/round-robin.d.ts.map +1 -1
  28. package/dist/core/round-robin.js.map +1 -1
  29. package/dist/core/rrule.d.ts.map +1 -1
  30. package/dist/core/rrule.js +0 -7
  31. package/dist/core/rrule.js.map +1 -1
  32. package/dist/core/rules.d.ts +0 -17
  33. package/dist/core/rules.d.ts.map +1 -1
  34. package/dist/core/rules.js +0 -8
  35. package/dist/core/rules.js.map +1 -1
  36. package/dist/core/slots.d.ts +0 -31
  37. package/dist/core/slots.d.ts.map +1 -1
  38. package/dist/core/slots.js +0 -9
  39. package/dist/core/slots.js.map +1 -1
  40. package/dist/core/time.d.ts +0 -24
  41. package/dist/core/time.d.ts.map +1 -1
  42. package/dist/core/time.js +0 -37
  43. package/dist/core/time.js.map +1 -1
  44. package/dist/index.d.ts +0 -10
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +0 -10
  47. package/dist/index.js.map +1 -1
  48. package/dist/manifest.d.ts +0 -9
  49. package/dist/manifest.d.ts.map +1 -1
  50. package/dist/manifest.js +0 -18
  51. package/dist/manifest.js.map +1 -1
  52. package/dist/react/components/SlotPicker.d.ts +0 -8
  53. package/dist/react/components/SlotPicker.d.ts.map +1 -1
  54. package/dist/react/components/SlotPicker.js.map +1 -1
  55. package/dist/react/components/TimezoneSelect.d.ts.map +1 -1
  56. package/dist/react/components/TimezoneSelect.js +0 -2
  57. package/dist/react/components/TimezoneSelect.js.map +1 -1
  58. package/dist/react/components/booking-links/AvailabilityEditor.d.ts +0 -4
  59. package/dist/react/components/booking-links/AvailabilityEditor.d.ts.map +1 -1
  60. package/dist/react/components/booking-links/AvailabilityEditor.js +0 -15
  61. package/dist/react/components/booking-links/AvailabilityEditor.js.map +1 -1
  62. package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts +0 -6
  63. package/dist/react/components/booking-links/BookingLinkCreateDialog.d.ts.map +1 -1
  64. package/dist/react/components/booking-links/BookingLinkCreateDialog.js +0 -16
  65. package/dist/react/components/booking-links/BookingLinkCreateDialog.js.map +1 -1
  66. package/dist/react/components/booking-links/ConferencingSelector.d.ts +0 -2
  67. package/dist/react/components/booking-links/ConferencingSelector.d.ts.map +1 -1
  68. package/dist/react/components/booking-links/ConferencingSelector.js +0 -24
  69. package/dist/react/components/booking-links/ConferencingSelector.js.map +1 -1
  70. package/dist/react/components/booking-links/CustomFieldsEditor.d.ts +0 -1
  71. package/dist/react/components/booking-links/CustomFieldsEditor.d.ts.map +1 -1
  72. package/dist/react/components/booking-links/CustomFieldsEditor.js +0 -14
  73. package/dist/react/components/booking-links/CustomFieldsEditor.js.map +1 -1
  74. package/dist/react/components/booking-links/DurationPicker.d.ts +0 -1
  75. package/dist/react/components/booking-links/DurationPicker.d.ts.map +1 -1
  76. package/dist/react/components/booking-links/DurationPicker.js +1 -11
  77. package/dist/react/components/booking-links/DurationPicker.js.map +1 -1
  78. package/dist/react/components/booking-links/SlugEditor.d.ts +0 -3
  79. package/dist/react/components/booking-links/SlugEditor.d.ts.map +1 -1
  80. package/dist/react/components/booking-links/SlugEditor.js +0 -11
  81. package/dist/react/components/booking-links/SlugEditor.js.map +1 -1
  82. package/dist/react/components/booking-links/index.d.ts +0 -9
  83. package/dist/react/components/booking-links/index.d.ts.map +1 -1
  84. package/dist/react/components/booking-links/index.js +0 -9
  85. package/dist/react/components/booking-links/index.js.map +1 -1
  86. package/dist/react/components/index.d.ts +0 -10
  87. package/dist/react/components/index.d.ts.map +1 -1
  88. package/dist/react/components/index.js +0 -10
  89. package/dist/react/components/index.js.map +1 -1
  90. package/dist/react/hooks/useBookingFlow.d.ts.map +1 -1
  91. package/dist/react/hooks/useBookingFlow.js +0 -10
  92. package/dist/react/hooks/useBookingFlow.js.map +1 -1
  93. package/dist/react/hooks/useEventType.d.ts.map +1 -1
  94. package/dist/react/hooks/useEventType.js +0 -4
  95. package/dist/react/hooks/useEventType.js.map +1 -1
  96. package/dist/react/hooks/useReschedule.d.ts.map +1 -1
  97. package/dist/react/hooks/useReschedule.js +0 -4
  98. package/dist/react/hooks/useReschedule.js.map +1 -1
  99. package/dist/react/hooks/useSlots.d.ts +0 -2
  100. package/dist/react/hooks/useSlots.d.ts.map +1 -1
  101. package/dist/react/hooks/useSlots.js +0 -8
  102. package/dist/react/hooks/useSlots.js.map +1 -1
  103. package/dist/react/hooks/useTimezone.d.ts.map +1 -1
  104. package/dist/react/hooks/useTimezone.js +0 -4
  105. package/dist/react/hooks/useTimezone.js.map +1 -1
  106. package/dist/react/index.d.ts +0 -5
  107. package/dist/react/index.d.ts.map +1 -1
  108. package/dist/react/index.js +0 -5
  109. package/dist/react/index.js.map +1 -1
  110. package/dist/schema/bookings.d.ts +0 -7
  111. package/dist/schema/bookings.d.ts.map +1 -1
  112. package/dist/schema/bookings.js +0 -29
  113. package/dist/schema/bookings.js.map +1 -1
  114. package/dist/schema/calendar-cache.d.ts.map +1 -1
  115. package/dist/schema/calendar-cache.js +0 -11
  116. package/dist/schema/calendar-cache.js.map +1 -1
  117. package/dist/schema/credentials.d.ts +0 -8
  118. package/dist/schema/credentials.d.ts.map +1 -1
  119. package/dist/schema/credentials.js +0 -28
  120. package/dist/schema/credentials.js.map +1 -1
  121. package/dist/schema/event-types.d.ts +0 -10
  122. package/dist/schema/event-types.d.ts.map +1 -1
  123. package/dist/schema/event-types.js +0 -42
  124. package/dist/schema/event-types.js.map +1 -1
  125. package/dist/schema/index.d.ts +0 -11
  126. package/dist/schema/index.d.ts.map +1 -1
  127. package/dist/schema/index.js +0 -11
  128. package/dist/schema/index.js.map +1 -1
  129. package/dist/schema/routing-forms.d.ts.map +1 -1
  130. package/dist/schema/routing-forms.js +0 -17
  131. package/dist/schema/routing-forms.js.map +1 -1
  132. package/dist/schema/schedules.d.ts +0 -12
  133. package/dist/schema/schedules.d.ts.map +1 -1
  134. package/dist/schema/schedules.js +0 -25
  135. package/dist/schema/schedules.js.map +1 -1
  136. package/dist/schema/teams.d.ts.map +1 -1
  137. package/dist/schema/teams.js +0 -7
  138. package/dist/schema/teams.js.map +1 -1
  139. package/dist/schema/workflows.d.ts +0 -7
  140. package/dist/schema/workflows.d.ts.map +1 -1
  141. package/dist/schema/workflows.js +0 -19
  142. package/dist/schema/workflows.js.map +1 -1
  143. package/dist/server/availability-engine.d.ts +0 -12
  144. package/dist/server/availability-engine.d.ts.map +1 -1
  145. package/dist/server/availability-engine.js +0 -20
  146. package/dist/server/availability-engine.js.map +1 -1
  147. package/dist/server/booking-service.d.ts +0 -14
  148. package/dist/server/booking-service.d.ts.map +1 -1
  149. package/dist/server/booking-service.js +0 -8
  150. package/dist/server/booking-service.js.map +1 -1
  151. package/dist/server/bookings-repo.d.ts +0 -7
  152. package/dist/server/bookings-repo.d.ts.map +1 -1
  153. package/dist/server/bookings-repo.js +0 -3
  154. package/dist/server/bookings-repo.js.map +1 -1
  155. package/dist/server/context.d.ts +0 -16
  156. package/dist/server/context.d.ts.map +1 -1
  157. package/dist/server/context.js.map +1 -1
  158. package/dist/server/db-types.d.ts +0 -11
  159. package/dist/server/db-types.d.ts.map +1 -1
  160. package/dist/server/event-types-repo.d.ts +0 -10
  161. package/dist/server/event-types-repo.d.ts.map +1 -1
  162. package/dist/server/event-types-repo.js +0 -21
  163. package/dist/server/event-types-repo.js.map +1 -1
  164. package/dist/server/hooks.d.ts.map +1 -1
  165. package/dist/server/hooks.js +0 -11
  166. package/dist/server/hooks.js.map +1 -1
  167. package/dist/server/ics.d.ts +0 -7
  168. package/dist/server/ics.d.ts.map +1 -1
  169. package/dist/server/ics.js.map +1 -1
  170. package/dist/server/providers/builtin-video.d.ts +0 -5
  171. package/dist/server/providers/builtin-video.d.ts.map +1 -1
  172. package/dist/server/providers/builtin-video.js.map +1 -1
  173. package/dist/server/providers/google-calendar.d.ts +0 -3
  174. package/dist/server/providers/google-calendar.d.ts.map +1 -1
  175. package/dist/server/providers/google-calendar.js +0 -2
  176. package/dist/server/providers/google-calendar.js.map +1 -1
  177. package/dist/server/providers/google-meet.d.ts +0 -7
  178. package/dist/server/providers/google-meet.d.ts.map +1 -1
  179. package/dist/server/providers/google-meet.js.map +1 -1
  180. package/dist/server/providers/office365.d.ts +0 -6
  181. package/dist/server/providers/office365.d.ts.map +1 -1
  182. package/dist/server/providers/office365.js.map +1 -1
  183. package/dist/server/providers/registry.d.ts +0 -4
  184. package/dist/server/providers/registry.d.ts.map +1 -1
  185. package/dist/server/providers/registry.js.map +1 -1
  186. package/dist/server/providers/teams.d.ts +0 -6
  187. package/dist/server/providers/teams.d.ts.map +1 -1
  188. package/dist/server/providers/teams.js +0 -2
  189. package/dist/server/providers/teams.js.map +1 -1
  190. package/dist/server/providers/types.d.ts +0 -27
  191. package/dist/server/providers/types.d.ts.map +1 -1
  192. package/dist/server/providers/zoom.d.ts +0 -19
  193. package/dist/server/providers/zoom.d.ts.map +1 -1
  194. package/dist/server/providers/zoom.js +0 -2
  195. package/dist/server/providers/zoom.js.map +1 -1
  196. package/dist/server/schedules-repo.d.ts.map +1 -1
  197. package/dist/server/schedules-repo.js +0 -4
  198. package/dist/server/schedules-repo.js.map +1 -1
  199. package/dist/server/video-oauth-state.d.ts +0 -5
  200. package/dist/server/video-oauth-state.d.ts.map +1 -1
  201. package/dist/server/video-oauth-state.js +1 -9
  202. package/dist/server/video-oauth-state.js.map +1 -1
  203. package/dist/server/video-oauth.d.ts +0 -4
  204. package/dist/server/video-oauth.d.ts.map +1 -1
  205. package/dist/server/video-oauth.js +0 -23
  206. package/dist/server/video-oauth.js.map +1 -1
  207. package/dist/shared/index.d.ts +0 -37
  208. package/dist/shared/index.d.ts.map +1 -1
  209. package/dist/shared/index.js +0 -4
  210. package/dist/shared/index.js.map +1 -1
  211. package/package.json +4 -4
  212. package/src/actions/_helpers.ts +0 -16
  213. package/src/actions/booking-authz.spec.ts +0 -6
  214. package/src/actions/create-team.ts +0 -1
  215. package/src/actions/event-type-authz.spec.ts +0 -11
  216. package/src/actions/list-bookings.ts +0 -4
  217. package/src/actions/refresh-busy-times.ts +0 -1
  218. package/src/actions/revoke-private-link.ts +0 -2
  219. package/src/actions/update-profile.ts +0 -5
  220. package/src/core/buffers.ts +0 -18
  221. package/src/core/conflicts.ts +0 -4
  222. package/src/core/limits.ts +0 -8
  223. package/src/core/round-robin.test.ts +0 -1
  224. package/src/core/round-robin.ts +0 -17
  225. package/src/core/rrule.ts +0 -7
  226. package/src/core/rules.ts +0 -17
  227. package/src/core/slots.test.ts +1 -11
  228. package/src/core/slots.ts +0 -40
  229. package/src/core/time.ts +0 -37
  230. package/src/index.ts +0 -11
  231. package/src/manifest.ts +0 -19
  232. package/src/react/components/SlotPicker.tsx +0 -8
  233. package/src/react/components/TimezoneSelect.tsx +0 -2
  234. package/src/react/components/_shadcn-shims.d.ts +0 -35
  235. package/src/react/components/booking-links/AvailabilityEditor.tsx +0 -15
  236. package/src/react/components/booking-links/BookingLinkCreateDialog.tsx +0 -22
  237. package/src/react/components/booking-links/ConferencingSelector.tsx +0 -26
  238. package/src/react/components/booking-links/CustomFieldsEditor.tsx +0 -15
  239. package/src/react/components/booking-links/DurationPicker.tsx +1 -12
  240. package/src/react/components/booking-links/SlugEditor.tsx +0 -14
  241. package/src/react/components/booking-links/index.ts +0 -9
  242. package/src/react/components/index.ts +0 -10
  243. package/src/react/hooks/useBookingFlow.ts +0 -10
  244. package/src/react/hooks/useEventType.ts +0 -4
  245. package/src/react/hooks/useReschedule.ts +0 -4
  246. package/src/react/hooks/useSlots.ts +0 -10
  247. package/src/react/hooks/useTimezone.ts +0 -4
  248. package/src/react/index.ts +0 -5
  249. package/src/schema/bookings.ts +0 -29
  250. package/src/schema/calendar-cache.ts +0 -11
  251. package/src/schema/credentials.ts +0 -28
  252. package/src/schema/event-types.ts +0 -42
  253. package/src/schema/index.ts +0 -11
  254. package/src/schema/routing-forms.ts +0 -17
  255. package/src/schema/schedules.ts +0 -25
  256. package/src/schema/teams.ts +0 -7
  257. package/src/schema/workflows.ts +0 -19
  258. package/src/server/availability-engine.test.ts +0 -1
  259. package/src/server/availability-engine.ts +0 -22
  260. package/src/server/booking-service.spec.ts +0 -15
  261. package/src/server/booking-service.ts +0 -22
  262. package/src/server/bookings-repo.ts +0 -10
  263. package/src/server/context.ts +0 -16
  264. package/src/server/db-types.ts +0 -11
  265. package/src/server/event-types-repo.ts +0 -31
  266. package/src/server/hooks.ts +0 -11
  267. package/src/server/ics.ts +0 -7
  268. package/src/server/providers/builtin-video.ts +0 -5
  269. package/src/server/providers/google-calendar.ts +0 -5
  270. package/src/server/providers/google-meet.ts +0 -7
  271. package/src/server/providers/office365.ts +0 -6
  272. package/src/server/providers/registry.ts +0 -4
  273. package/src/server/providers/teams.ts +0 -8
  274. package/src/server/providers/types.ts +0 -27
  275. package/src/server/providers/zoom.ts +0 -21
  276. package/src/server/schedules-repo.ts +0 -4
  277. package/src/server/video-oauth-state.ts +1 -10
  278. package/src/server/video-oauth.ts +0 -23
  279. 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; // keep at least one
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,7 +1,3 @@
1
- /**
2
- * useEventType — fetch one event type by id or slug via a consumer-provided
3
- * callback (typically calling the `get-event-type` action).
4
- */
5
1
  import { useEffect, useState } from "react";
6
2
 
7
3
  import type { EventType } from "../../shared/index.js";
@@ -1,7 +1,3 @@
1
- /**
2
- * useReschedule — fetch an existing booking + drive the Booker through a
3
- * reschedule flow that replaces its start/end time.
4
- */
5
1
  import { useEffect, useState } from "react";
6
2
 
7
3
  import type { Booking } 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
 
@@ -1,7 +1,3 @@
1
- /**
2
- * Timezone hook — resolves the viewer's IANA timezone with `localStorage`
3
- * persistence and a setter. Booker uses this to display slot times.
4
- */
5
1
  import { useCallback, useEffect, useState } from "react";
6
2
 
7
3
  const KEY = "scheduling.timezone";
@@ -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";
@@ -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(),