@agent-native/scheduling 0.1.23 → 0.1.25

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 (75) hide show
  1. package/README.md +16 -0
  2. package/agent-native.package.json +154 -0
  3. package/dist/actions/_helpers.d.ts +10 -0
  4. package/dist/actions/_helpers.d.ts.map +1 -1
  5. package/dist/actions/_helpers.js +14 -0
  6. package/dist/actions/_helpers.js.map +1 -1
  7. package/dist/actions/add-booking-attendee.js +2 -0
  8. package/dist/actions/add-booking-attendee.js.map +1 -1
  9. package/dist/actions/add-booking-note.js +2 -1
  10. package/dist/actions/add-booking-note.js.map +1 -1
  11. package/dist/actions/confirm-booking.js +5 -0
  12. package/dist/actions/confirm-booking.js.map +1 -1
  13. package/dist/actions/duplicate-event-type.js +2 -0
  14. package/dist/actions/duplicate-event-type.js.map +1 -1
  15. package/dist/actions/get-booking.d.ts +3 -1
  16. package/dist/actions/get-booking.js +8 -1
  17. package/dist/actions/get-booking.js.map +1 -1
  18. package/dist/actions/mark-no-show.js +6 -0
  19. package/dist/actions/mark-no-show.js.map +1 -1
  20. package/dist/actions/remove-booking-attendee.js +2 -0
  21. package/dist/actions/remove-booking-attendee.js.map +1 -1
  22. package/dist/actions/revoke-private-link.js +18 -1
  23. package/dist/actions/revoke-private-link.js.map +1 -1
  24. package/dist/actions/send-reschedule-link.js +2 -0
  25. package/dist/actions/send-reschedule-link.js.map +1 -1
  26. package/dist/manifest.d.ts +5 -1
  27. package/dist/manifest.d.ts.map +1 -1
  28. package/dist/manifest.js +6 -1
  29. package/dist/manifest.js.map +1 -1
  30. package/dist/server/availability-engine.d.ts +20 -0
  31. package/dist/server/availability-engine.d.ts.map +1 -1
  32. package/dist/server/availability-engine.js +73 -23
  33. package/dist/server/availability-engine.js.map +1 -1
  34. package/dist/server/booking-service.d.ts.map +1 -1
  35. package/dist/server/booking-service.js +16 -5
  36. package/dist/server/booking-service.js.map +1 -1
  37. package/dist/server/bookings-repo.d.ts.map +1 -1
  38. package/dist/server/bookings-repo.js +50 -48
  39. package/dist/server/bookings-repo.js.map +1 -1
  40. package/dist/server/providers/index.d.ts +2 -0
  41. package/dist/server/providers/index.d.ts.map +1 -1
  42. package/dist/server/providers/index.js +1 -0
  43. package/dist/server/providers/index.js.map +1 -1
  44. package/dist/server/providers/teams.d.ts +22 -0
  45. package/dist/server/providers/teams.d.ts.map +1 -0
  46. package/dist/server/providers/teams.js +112 -0
  47. package/dist/server/providers/teams.js.map +1 -0
  48. package/docs/eject.md +11 -10
  49. package/docs/llms-full.txt +75 -14
  50. package/docs/llms.txt +15 -1
  51. package/docs/providers.md +30 -2
  52. package/docs/skills/integrations/SKILL.md +19 -1
  53. package/package.json +7 -6
  54. package/src/actions/_helpers.ts +18 -0
  55. package/src/actions/add-booking-attendee.ts +2 -0
  56. package/src/actions/add-booking-note.ts +2 -1
  57. package/src/actions/booking-authz.spec.ts +288 -0
  58. package/src/actions/confirm-booking.ts +4 -0
  59. package/src/actions/duplicate-event-type.ts +2 -0
  60. package/src/actions/event-type-authz.spec.ts +209 -0
  61. package/src/actions/get-booking.ts +7 -1
  62. package/src/actions/mark-no-show.ts +5 -0
  63. package/src/actions/remove-booking-attendee.ts +2 -0
  64. package/src/actions/revoke-private-link.ts +16 -1
  65. package/src/actions/send-reschedule-link.ts +2 -0
  66. package/src/manifest.test.ts +19 -0
  67. package/src/manifest.ts +9 -7
  68. package/src/server/availability-engine.test.ts +344 -0
  69. package/src/server/availability-engine.ts +100 -22
  70. package/src/server/booking-service.spec.ts +557 -0
  71. package/src/server/booking-service.ts +17 -6
  72. package/src/server/bookings-repo.ts +54 -48
  73. package/src/server/providers/index.ts +2 -0
  74. package/src/server/providers/teams.test.ts +246 -0
  75. package/src/server/providers/teams.ts +183 -0
package/README.md CHANGED
@@ -35,6 +35,22 @@ export { default } from "@agent-native/scheduling/actions/create-booking";
35
35
 
36
36
  Override by replacing the stub body with a full `defineAction(...)`.
37
37
 
38
+ ## Package lifecycle
39
+
40
+ Scheduling publishes a static, versioned `agent-native.package.json`. Inspect
41
+ its contributions without executing package code, preview installation, or
42
+ eject the published source into a local workspace package:
43
+
44
+ ```bash
45
+ agent-native package inspect @agent-native/scheduling --json
46
+ agent-native package add @agent-native/scheduling --apply
47
+ agent-native package eject @agent-native/scheduling --apply
48
+ ```
49
+
50
+ Add and eject are dry-run unless `--apply` is explicit. The CLI refuses file
51
+ collisions and unsupported layouts and rolls back if dependency installation
52
+ fails.
53
+
38
54
  ## Docs for your AI
39
55
 
40
56
  Expose the package docs to your AI coding tool via `llms.txt`:
@@ -0,0 +1,154 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "name": "@agent-native/scheduling",
4
+ "actions": [
5
+ "list-event-types",
6
+ "get-event-type",
7
+ "create-event-type",
8
+ "update-event-type",
9
+ "duplicate-event-type",
10
+ "delete-event-type",
11
+ "toggle-event-type-hidden",
12
+ "reorder-event-types",
13
+ "set-event-type-location",
14
+ "add-private-link",
15
+ "revoke-private-link",
16
+ "list-schedules",
17
+ "create-schedule",
18
+ "update-schedule",
19
+ "delete-schedule",
20
+ "set-default-schedule",
21
+ "add-date-override",
22
+ "remove-date-override",
23
+ "get-availability",
24
+ "check-availability",
25
+ "find-available-slot",
26
+ "list-bookings",
27
+ "get-booking",
28
+ "create-booking",
29
+ "reschedule-booking",
30
+ "cancel-booking",
31
+ "confirm-booking",
32
+ "mark-no-show",
33
+ "add-booking-attendee",
34
+ "remove-booking-attendee",
35
+ "send-reschedule-link",
36
+ "add-booking-note",
37
+ "export-bookings-csv",
38
+ "list-calendar-integrations",
39
+ "connect-calendar",
40
+ "connect-video",
41
+ "disconnect-calendar",
42
+ "list-selected-calendars",
43
+ "toggle-selected-calendar",
44
+ "set-destination-calendar",
45
+ "refresh-busy-times",
46
+ "install-conferencing-app",
47
+ "create-team",
48
+ "invite-team-member",
49
+ "accept-team-invite",
50
+ "remove-team-member",
51
+ "update-member-role",
52
+ "set-team-branding",
53
+ "assign-round-robin-host",
54
+ "set-event-type-hosts",
55
+ "set-host-availability-override",
56
+ "create-host-group",
57
+ "update-profile",
58
+ "set-appearance",
59
+ "set-default-conferencing-app",
60
+ "list-workflows",
61
+ "create-workflow",
62
+ "update-workflow",
63
+ "delete-workflow",
64
+ "toggle-workflow",
65
+ "list-routing-forms",
66
+ "create-routing-form",
67
+ "update-routing-form",
68
+ "delete-routing-form",
69
+ "submit-routing-form-response",
70
+ "list-routing-form-responses"
71
+ ],
72
+ "schemaEntryPoint": "@agent-native/scheduling/schema",
73
+ "docs": {
74
+ "llms": "docs/llms.txt",
75
+ "llmsFull": "docs/llms-full.txt",
76
+ "skills": [
77
+ "scheduling-basics",
78
+ "event-types",
79
+ "availability",
80
+ "bookings",
81
+ "booker",
82
+ "slot-engine",
83
+ "team-scheduling",
84
+ "integrations",
85
+ "embeds",
86
+ "workflows",
87
+ "routing-forms"
88
+ ]
89
+ },
90
+ "requiredSecrets": [
91
+ {
92
+ "key": "GOOGLE_CLIENT_ID",
93
+ "label": "Google OAuth Client ID",
94
+ "optional": true
95
+ },
96
+ {
97
+ "key": "GOOGLE_CLIENT_SECRET",
98
+ "label": "Google OAuth Client Secret",
99
+ "optional": true
100
+ },
101
+ {
102
+ "key": "MICROSOFT_CLIENT_ID",
103
+ "label": "Microsoft OAuth Client ID",
104
+ "optional": true
105
+ },
106
+ {
107
+ "key": "MICROSOFT_CLIENT_SECRET",
108
+ "label": "Microsoft OAuth Client Secret",
109
+ "optional": true
110
+ },
111
+ {
112
+ "key": "ZOOM_CLIENT_ID",
113
+ "label": "Zoom OAuth Client ID",
114
+ "optional": true
115
+ },
116
+ {
117
+ "key": "ZOOM_CLIENT_SECRET",
118
+ "label": "Zoom OAuth Client Secret",
119
+ "optional": true
120
+ },
121
+ {
122
+ "key": "DAILY_API_KEY",
123
+ "label": "Daily.co API Key (built-in video)",
124
+ "optional": true
125
+ },
126
+ {
127
+ "key": "TWILIO_ACCOUNT_SID",
128
+ "label": "Twilio Account SID (SMS workflows)",
129
+ "optional": true
130
+ },
131
+ {
132
+ "key": "TWILIO_AUTH_TOKEN",
133
+ "label": "Twilio Auth Token",
134
+ "optional": true
135
+ },
136
+ {
137
+ "key": "TWILIO_FROM_NUMBER",
138
+ "label": "Twilio sender number",
139
+ "optional": true
140
+ }
141
+ ],
142
+ "peerProviders": [
143
+ "google-calendar",
144
+ "office365",
145
+ "zoom",
146
+ "teams",
147
+ "google-meet",
148
+ "builtin-video"
149
+ ],
150
+ "eject": {
151
+ "sourceRoot": "src",
152
+ "targetDirectory": "packages/scheduling"
153
+ }
154
+ }
@@ -1,5 +1,15 @@
1
1
  export declare function currentUserEmail(): string;
2
2
  export declare function currentUserEmailOrNull(): string | null;
3
+ /**
4
+ * Verify the current user is the host of a booking. Throws "Not authorized to
5
+ * <action>" if not. Mirrors the `isHost` half of the `isHost || hasToken`
6
+ * guard used by cancel-booking/reschedule-booking, for booking actions that
7
+ * don't accept a public capability token (attendee/note/status mutations —
8
+ * host identity is the only legitimate caller for these).
9
+ */
10
+ export declare function assertBookingHost(booking: {
11
+ hostEmail: string;
12
+ }, action: string): void;
3
13
  export declare function currentOrgId(): string | undefined;
4
14
  export declare function assertTeamAdmin(teamId: string): Promise<void>;
5
15
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../src/actions/_helpers.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnE;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
1
+ {"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../src/actions/_helpers.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9B,MAAM,EAAE,MAAM,GACb,IAAI,CAMN;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnE;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
@@ -12,6 +12,20 @@ export function currentUserEmail() {
12
12
  export function currentUserEmailOrNull() {
13
13
  return getSchedulingContext().getCurrentUserEmail() ?? null;
14
14
  }
15
+ /**
16
+ * Verify the current user is the host of a booking. Throws "Not authorized to
17
+ * <action>" if not. Mirrors the `isHost` half of the `isHost || hasToken`
18
+ * guard used by cancel-booking/reschedule-booking, for booking actions that
19
+ * don't accept a public capability token (attendee/note/status mutations —
20
+ * host identity is the only legitimate caller for these).
21
+ */
22
+ export function assertBookingHost(booking, action) {
23
+ const userEmail = currentUserEmailOrNull();
24
+ const isHost = !!userEmail && userEmail === booking.hostEmail;
25
+ if (!isHost) {
26
+ throw new Error(`Not authorized to ${action}`);
27
+ }
28
+ }
15
29
  export function currentOrgId() {
16
30
  return getSchedulingContext().getCurrentOrgId?.();
17
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../src/actions/_helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,oBAAoB,EAAE,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,oBAAoB,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE;SACvB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;SACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CACxC,CACF;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC3B,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE;SACvB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;SACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CACxC,CACF;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../src/actions/_helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,oBAAoB,EAAE,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAA8B,EAC9B,MAAc;IAEd,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,oBAAoB,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE;SACvB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;SACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CACxC,CACF;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC3B,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE;SACvB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;SACxB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CACxC,CACF;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -3,6 +3,7 @@ import { nanoid } from "nanoid";
3
3
  import { z } from "zod";
4
4
  import { getBookingByUid } from "../server/bookings-repo.js";
5
5
  import { getSchedulingContext } from "../server/context.js";
6
+ import { assertBookingHost } from "./_helpers.js";
6
7
  export default defineAction({
7
8
  description: "Add an attendee (or seat reservation) to a booking",
8
9
  schema: z.object({
@@ -15,6 +16,7 @@ export default defineAction({
15
16
  const booking = await getBookingByUid(args.uid);
16
17
  if (!booking)
17
18
  throw new Error(`Booking ${args.uid} not found`);
19
+ assertBookingHost(booking, "add an attendee to this booking");
18
20
  const { getDb, schema } = getSchedulingContext();
19
21
  await getDb()
20
22
  .insert(schema.bookingAttendees)
@@ -1 +1 @@
1
- {"version":3,"file":"add-booking-attendee.js","sourceRoot":"","sources":["../../src/actions/add-booking-attendee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,oDAAoD;IACjE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,KAAK,EAAE;aACV,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAC/B,MAAM,CAAC;YACN,EAAE,EAAE,MAAM,EAAE;YACZ,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;YAC/B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACL,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"add-booking-attendee.js","sourceRoot":"","sources":["../../src/actions/add-booking-attendee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,oDAAoD;IACjE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,iBAAiB,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAC;QAC9D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,KAAK,EAAE;aACV,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAC/B,MAAM,CAAC;YACN,EAAE,EAAE,MAAM,EAAE;YACZ,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;YAC/B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACL,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
@@ -3,7 +3,7 @@ import { nanoid } from "nanoid";
3
3
  import { z } from "zod";
4
4
  import { getBookingByUid } from "../server/bookings-repo.js";
5
5
  import { getSchedulingContext } from "../server/context.js";
6
- import { currentUserEmail } from "./_helpers.js";
6
+ import { assertBookingHost, currentUserEmail } from "./_helpers.js";
7
7
  export default defineAction({
8
8
  description: "Add an internal (host-only) note to a booking",
9
9
  schema: z.object({ uid: z.string(), content: z.string() }),
@@ -11,6 +11,7 @@ export default defineAction({
11
11
  const booking = await getBookingByUid(args.uid);
12
12
  if (!booking)
13
13
  throw new Error(`Booking ${args.uid} not found`);
14
+ assertBookingHost(booking, "add a note to this booking");
14
15
  const { getDb, schema } = getSchedulingContext();
15
16
  const id = nanoid();
16
17
  await getDb().insert(schema.bookingNotes).values({
@@ -1 +1 @@
1
- {"version":3,"file":"add-booking-note.js","sourceRoot":"","sources":["../../src/actions/add-booking-note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,+CAA+C;IAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1D,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;YAC/C,EAAE;YACF,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,WAAW,EAAE,gBAAgB,EAAE;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"add-booking-note.js","sourceRoot":"","sources":["../../src/actions/add-booking-note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEpE,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,+CAA+C;IAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1D,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;QACzD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;YAC/C,EAAE;YACF,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,WAAW,EAAE,gBAAgB,EAAE;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
@@ -1,10 +1,15 @@
1
1
  import { defineAction } from "@agent-native/core";
2
2
  import { z } from "zod";
3
3
  import { updateBookingStatus, getBookingByUid, } from "../server/bookings-repo.js";
4
+ import { assertBookingHost } from "./_helpers.js";
4
5
  export default defineAction({
5
6
  description: "Confirm a pending booking (requires-confirmation flow)",
6
7
  schema: z.object({ uid: z.string() }),
7
8
  run: async (args) => {
9
+ const booking = await getBookingByUid(args.uid);
10
+ if (!booking)
11
+ throw new Error(`Booking ${args.uid} not found`);
12
+ assertBookingHost(booking, "confirm this booking");
8
13
  await updateBookingStatus(args.uid, "confirmed");
9
14
  return { booking: await getBookingByUid(args.uid) };
10
15
  },
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-booking.js","sourceRoot":"","sources":["../../src/actions/confirm-booking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAEpC,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,wDAAwD;IACrE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACrC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"confirm-booking.js","sourceRoot":"","sources":["../../src/actions/confirm-booking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,wDAAwD;IACrE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACrC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;QACnD,MAAM,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { defineAction } from "@agent-native/core";
2
+ import { assertAccess } from "@agent-native/core/sharing";
2
3
  import { z } from "zod";
3
4
  import { getEventTypeById, createEventType, } from "../server/event-types-repo.js";
4
5
  import { currentUserEmail, currentOrgId } from "./_helpers.js";
@@ -13,6 +14,7 @@ export default defineAction({
13
14
  const source = await getEventTypeById(args.id);
14
15
  if (!source)
15
16
  throw new Error("Event type not found");
17
+ await assertAccess("event-type", args.id, "editor");
16
18
  return {
17
19
  eventType: await createEventType({
18
20
  ownerEmail: source.teamId ? undefined : currentUserEmail(),
@@ -1 +1 @@
1
- {"version":3,"file":"duplicate-event-type.js","sourceRoot":"","sources":["../../src/actions/duplicate-event-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,yCAAyC;IACtD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACrD,OAAO;YACL,SAAS,EAAE,MAAM,eAAe,CAAC;gBAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE;gBAC1D,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,YAAY,EAAE;gBACrB,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG,MAAM,CAAC,KAAK,SAAS;gBAChD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;gBAChC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;SACH,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"duplicate-event-type.js","sourceRoot":"","sources":["../../src/actions/duplicate-event-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,yCAAyC;IACtD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO;YACL,SAAS,EAAE,MAAM,eAAe,CAAC;gBAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE;gBAC1D,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,YAAY,EAAE;gBACrB,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG,MAAM,CAAC,KAAK,SAAS;gBAChD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;gBAChC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;SACH,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -1,7 +1,9 @@
1
1
  declare const _default: import("@agent-native/core").ActionDefinition<{
2
2
  uid: string;
3
3
  }, {
4
- booking: import("../index.js").Booking | null;
4
+ booking: null;
5
+ } | {
6
+ booking: import("../index.js").Booking;
5
7
  }>;
6
8
  export default _default;
7
9
  //# sourceMappingURL=get-booking.d.ts.map
@@ -1,9 +1,16 @@
1
1
  import { defineAction } from "@agent-native/core";
2
2
  import { z } from "zod";
3
3
  import { getBookingByUid } from "../server/bookings-repo.js";
4
+ import { assertBookingHost } from "./_helpers.js";
4
5
  export default defineAction({
5
6
  description: "Get a booking by uid",
6
7
  schema: z.object({ uid: z.string() }),
7
- run: async (args) => ({ booking: await getBookingByUid(args.uid) }),
8
+ run: async (args) => {
9
+ const booking = await getBookingByUid(args.uid);
10
+ if (!booking)
11
+ return { booking: null };
12
+ assertBookingHost(booking, "view this booking");
13
+ return { booking };
14
+ },
8
15
  });
9
16
  //# sourceMappingURL=get-booking.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-booking.js","sourceRoot":"","sources":["../../src/actions/get-booking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,sBAAsB;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACrC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;CACpE,CAAC,CAAC"}
1
+ {"version":3,"file":"get-booking.js","sourceRoot":"","sources":["../../src/actions/get-booking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,sBAAsB;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACrC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvC,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;CACF,CAAC,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { defineAction } from "@agent-native/core";
2
2
  import { z } from "zod";
3
3
  import { markNoShow } from "../server/booking-service.js";
4
+ import { getBookingByUid } from "../server/bookings-repo.js";
5
+ import { assertBookingHost } from "./_helpers.js";
4
6
  export default defineAction({
5
7
  description: "Mark an attendee as no-show on a booking",
6
8
  schema: z.object({
@@ -8,6 +10,10 @@ export default defineAction({
8
10
  attendeeEmail: z.string(),
9
11
  }),
10
12
  run: async (args) => {
13
+ const booking = await getBookingByUid(args.uid);
14
+ if (!booking)
15
+ throw new Error(`Booking ${args.uid} not found`);
16
+ assertBookingHost(booking, "mark no-show on this booking");
11
17
  await markNoShow(args.uid, args.attendeeEmail);
12
18
  return { ok: true };
13
19
  },
@@ -1 +1 @@
1
- {"version":3,"file":"mark-no-show.js","sourceRoot":"","sources":["../../src/actions/mark-no-show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,0CAA0C;IACvD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;KAC1B,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"mark-no-show.js","sourceRoot":"","sources":["../../src/actions/mark-no-show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,0CAA0C;IACvD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;KAC1B,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,iBAAiB,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;QAC3D,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAC,CAAC"}
@@ -3,6 +3,7 @@ import { and, eq } from "drizzle-orm";
3
3
  import { z } from "zod";
4
4
  import { getBookingByUid } from "../server/bookings-repo.js";
5
5
  import { getSchedulingContext } from "../server/context.js";
6
+ import { assertBookingHost } from "./_helpers.js";
6
7
  export default defineAction({
7
8
  description: "Remove an attendee from a booking",
8
9
  schema: z.object({ uid: z.string(), email: z.string() }),
@@ -10,6 +11,7 @@ export default defineAction({
10
11
  const booking = await getBookingByUid(args.uid);
11
12
  if (!booking)
12
13
  throw new Error(`Booking ${args.uid} not found`);
14
+ assertBookingHost(booking, "remove an attendee from this booking");
13
15
  const { getDb, schema } = getSchedulingContext();
14
16
  await getDb()
15
17
  .delete(schema.bookingAttendees)
@@ -1 +1 @@
1
- {"version":3,"file":"remove-booking-attendee.js","sourceRoot":"","sources":["../../src/actions/remove-booking-attendee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,mCAAmC;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACxD,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,KAAK,EAAE;aACV,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAC/B,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,EACjD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAC9C,CACF,CAAC;QACJ,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"remove-booking-attendee.js","sourceRoot":"","sources":["../../src/actions/remove-booking-attendee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,mCAAmC;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACxD,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,iBAAiB,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;QACnE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,KAAK,EAAE;aACV,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAC/B,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,EACjD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAC9C,CACF,CAAC;QACJ,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { defineAction } from "@agent-native/core";
2
+ import { assertAccess } from "@agent-native/core/sharing";
2
3
  import { eq } from "drizzle-orm";
3
4
  import { z } from "zod";
4
5
  import { getSchedulingContext } from "../server/context.js";
@@ -7,7 +8,23 @@ export default defineAction({
7
8
  schema: z.object({ hash: z.string() }),
8
9
  run: async (args) => {
9
10
  const { getDb, schema } = getSchedulingContext();
10
- await getDb()
11
+ const db = getDb();
12
+ const [link] = await db
13
+ .select({ eventTypeId: schema.hashedLinks.eventTypeId })
14
+ .from(schema.hashedLinks)
15
+ .where(eq(schema.hashedLinks.hash, args.hash))
16
+ .limit(1);
17
+ if (!link)
18
+ return { ok: true };
19
+ try {
20
+ await assertAccess("event-type", link.eventTypeId, "editor");
21
+ }
22
+ catch {
23
+ // Keep private-link hashes unprobeable: callers without access receive
24
+ // the same idempotent result as callers presenting an unknown hash.
25
+ return { ok: true };
26
+ }
27
+ await db
11
28
  .delete(schema.hashedLinks)
12
29
  .where(eq(schema.hashedLinks.hash, args.hash));
13
30
  return { ok: true };
@@ -1 +1 @@
1
- {"version":3,"file":"revoke-private-link.js","sourceRoot":"","sources":["../../src/actions/revoke-private-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,8BAA8B;IAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACtC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,KAAK,EAAE;aACV,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;aAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"revoke-private-link.js","sourceRoot":"","sources":["../../src/actions/revoke-private-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAe,YAAY,CAAC;IAC1B,WAAW,EAAE,8BAA8B;IAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACtC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;aACpB,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;aACvD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;aACxB,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aAC7C,KAAK,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,oEAAoE;YACpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,EAAE;aACL,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;aAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAC,CAAC"}
@@ -2,6 +2,7 @@ import { defineAction } from "@agent-native/core";
2
2
  import { z } from "zod";
3
3
  import { getBookingByUid } from "../server/bookings-repo.js";
4
4
  import { getSchedulingContext } from "../server/context.js";
5
+ import { assertBookingHost } from "./_helpers.js";
5
6
  export default defineAction({
6
7
  description: "Return the public reschedule URL for a booking (send it to an attendee)",
7
8
  schema: z.object({ uid: z.string() }),
@@ -9,6 +10,7 @@ export default defineAction({
9
10
  const booking = await getBookingByUid(args.uid);
10
11
  if (!booking)
11
12
  throw new Error(`Booking ${args.uid} not found`);
13
+ assertBookingHost(booking, "view the reschedule link for this booking");
12
14
  const baseUrl = getSchedulingContext().publicBaseUrl ?? "";
13
15
  return {
14
16
  url: `${baseUrl}/reschedule/${booking.uid}?token=${booking.rescheduleToken}`,
@@ -1 +1 @@
1
- {"version":3,"file":"send-reschedule-link.js","sourceRoot":"","sources":["../../src/actions/send-reschedule-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,yEAAyE;IAC3E,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACrC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC;QAC3D,OAAO;YACL,GAAG,EAAE,GAAG,OAAO,eAAe,OAAO,CAAC,GAAG,UAAU,OAAO,CAAC,eAAe,EAAE;SAC7E,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"send-reschedule-link.js","sourceRoot":"","sources":["../../src/actions/send-reschedule-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,yEAAyE;IAC3E,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACrC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/D,iBAAiB,CAAC,OAAO,EAAE,2CAA2C,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC;QAC3D,OAAO;YACL,GAAG,EAAE,GAAG,OAAO,eAAe,OAAO,CAAC,GAAG,UAAU,OAAO,CAAC,eAAe,EAAE;SAC7E,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -8,8 +8,8 @@
8
8
  * - print the list in `agent-native info @agent-native/scheduling`
9
9
  */
10
10
  export interface SchedulingManifest {
11
+ manifestVersion: 1;
11
12
  name: string;
12
- version: string;
13
13
  actions: string[];
14
14
  schemaEntryPoint: string;
15
15
  docs: {
@@ -23,6 +23,10 @@ export interface SchedulingManifest {
23
23
  optional?: boolean;
24
24
  }[];
25
25
  peerProviders: string[];
26
+ eject?: {
27
+ sourceRoot: string;
28
+ targetDirectory: string;
29
+ };
26
30
  }
27
31
  export declare const MANIFEST: SchedulingManifest;
28
32
  //# sourceMappingURL=manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,eAAe,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IACtE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,QAAQ,EAAE,kBAqJtB,CAAC"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,CAAC,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3D,eAAe,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IACtE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,eAAO,MAAM,QAAQ,EAAE,kBA0JtB,CAAC"}
package/dist/manifest.js CHANGED
@@ -8,8 +8,8 @@
8
8
  * - print the list in `agent-native info @agent-native/scheduling`
9
9
  */
10
10
  export const MANIFEST = {
11
+ manifestVersion: 1,
11
12
  name: "@agent-native/scheduling",
12
- version: "0.1.0",
13
13
  actions: [
14
14
  // Event types
15
15
  "list-event-types",
@@ -153,8 +153,13 @@ export const MANIFEST = {
153
153
  "google-calendar",
154
154
  "office365",
155
155
  "zoom",
156
+ "teams",
156
157
  "google-meet",
157
158
  "builtin-video",
158
159
  ],
160
+ eject: {
161
+ sourceRoot: "src",
162
+ targetDirectory: "packages/scheduling",
163
+ },
159
164
  };
160
165
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,24 @@
1
1
  import type { EventType, BusyInterval, Slot } from "../shared/index.js";
2
+ export declare class SlotConflictError extends Error {
3
+ statusCode: number;
4
+ constructor(message?: string);
5
+ }
6
+ export interface AssertSlotAvailableInput {
7
+ hostEmail: string;
8
+ startTime: string;
9
+ endTime: string;
10
+ beforeEventBuffer?: number;
11
+ afterEventBuffer?: number;
12
+ /** Booking uid to ignore when checking conflicts (e.g. the one being rescheduled). */
13
+ excludeBookingUid?: string;
14
+ }
15
+ /**
16
+ * Re-validate a single requested interval right before it's written —
17
+ * cheap by design: aggregates busy only over the buffer-expanded window
18
+ * instead of scanning a full day like `getAvailableSlots`. Throws
19
+ * `SlotConflictError` if the window collides with existing busy time.
20
+ */
21
+ export declare function assertSlotAvailable(input: AssertSlotAvailableInput): Promise<void>;
2
22
  export interface GetSlotsInput {
3
23
  eventType: EventType;
4
24
  /** The user we're finding availability for — their schedule + calendars. */
@@ -1 +1 @@
1
- {"version":3,"file":"availability-engine.d.ts","sourceRoot":"","sources":["../../src/server/availability-engine.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,SAAS,EAET,YAAY,EACZ,IAAI,EACL,MAAM,oBAAoB,CAAC;AAK5B,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAyC7E;AAmBD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;CAChB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA4D1B"}
1
+ {"version":3,"file":"availability-engine.d.ts","sourceRoot":"","sources":["../../src/server/availability-engine.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,SAAS,EAET,YAAY,EACZ,IAAI,EACL,MAAM,oBAAoB,CAAC;AAO5B,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,UAAU,SAAO;IACjB,YAAY,OAAO,SAA0C,EAG5D;CACF;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAyC7E;AAmBD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;CAChB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwF1B"}