@wirecat/cli-core 0.488.0 → 0.490.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/dist/calendar/cli/index.js +48 -13
  3. package/dist/calendar/index.d.ts +1 -1
  4. package/dist/calendar/mcp/index.d.ts +390 -0
  5. package/dist/calendar/mcp/index.js +50 -12
  6. package/dist/calendar/reads.d.ts +9 -2
  7. package/dist/calendar/reads.js +60 -5
  8. package/dist/calendar/recurrence.d.ts +20 -0
  9. package/dist/calendar/recurrence.js +74 -0
  10. package/dist/calendar/sync.d.ts +6 -0
  11. package/dist/calendar/sync.js +123 -41
  12. package/dist/calendar/testing/memory.js +90 -7
  13. package/dist/calendar/testing/sync-contract.js +90 -0
  14. package/dist/calendar/testing/writer-contract.d.ts +2 -6
  15. package/dist/calendar/testing/writer-contract.js +157 -29
  16. package/dist/calendar/testing/writer.d.ts +3 -1
  17. package/dist/calendar/testing/writer.js +11 -0
  18. package/dist/calendar/writer.d.ts +20 -3
  19. package/dist/calendar/writer.js +8 -4
  20. package/dist/calendar/writes.d.ts +21 -12
  21. package/dist/calendar/writes.js +259 -20
  22. package/dist/errors/reasons.d.ts +1 -1
  23. package/dist/errors/reasons.js +5 -0
  24. package/dist/meetings/event-store.d.ts +80 -2
  25. package/dist/meetings/event-store.js +65 -1
  26. package/dist/meetings/index.d.ts +2 -1
  27. package/dist/meetings/index.js +1 -0
  28. package/dist/meetings/testing/event-store-contract.d.ts +1 -1
  29. package/dist/meetings/testing/event-store-contract.js +114 -0
  30. package/dist/store/drivers/node-sqlite.d.ts +9 -1
  31. package/dist/store/drivers/node-sqlite.js +30 -8
  32. package/dist/store/sqlite/calendar-events.d.ts +4 -0
  33. package/dist/store/sqlite/calendar-events.js +89 -0
  34. package/dist/store/sqlite/calendar.js +126 -94
  35. package/dist/store/sqlite/identities.d.ts +1 -1
  36. package/dist/store/sqlite/identities.js +4 -1
  37. package/dist/store/sqlite/knowledge.js +4 -2
  38. package/dist/store/sqlite/manifest.js +1 -0
  39. package/dist/store/sqlite/migrations.generated.js +10 -0
  40. package/dist/store/sqlite/note-index.d.ts +16 -1
  41. package/dist/store/sqlite/note-index.js +68 -3
  42. package/dist/store/sqlite/notes.js +7 -5
  43. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,118 @@ shape of this file.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.490.0 — 31.10.2026
11
+
12
+ ### Changed — may break callers
13
+
14
+ - **Notes, documents, knowledge annotations and contacts `--notes` are found by any part of a word, in any letter
15
+ case (store version 40).** `notes` with a search, `knowledge.annotations` with a search and `contacts` with
16
+ `notes` used `instr(lower(...))`, which folds only Latin letters and reads every row: a mixed-case Cyrillic word
17
+ was missed, and a search took 1.5–4 s on a store five times today's size. They now match `note_trigrams` and
18
+ `document_trigrams`, trigram indexes over the normalized title and text (`ё` as `е`, accents dropped) that the
19
+ notes drain keeps, and answer in milliseconds. A query of one or two characters is refused with "search needs at
20
+ least three characters", as message search is; an empty one still filters nothing. The title is searched too,
21
+ not only the text. The notes and documents stored before version 40 get their trigrams in batches from the
22
+ notes drain (`search notes`, `store migrate`); until then they are matched as before.
23
+
24
+ ## 0.489.0 — 31.10.2026
25
+
26
+ ### Added
27
+
28
+ - **`events list changed:<date>`: what changed since a date.** It keeps the events first stored, moved, or cancelled
29
+ or removed since then, from the local copy, each with `change` (`new`, `moved`, `cancelled`), `changed_at` and, for
30
+ a moved one, `was` (`starts_at`, `ends_at`). A move counts when a copy's time now differs from its time at the date,
31
+ so a meeting moved and moved back is no change. MCP `events_list` takes the same word. New `EventFilter.changedSince`,
32
+ `EventStore.historyOf` and `eventChange`, from `@wirecat/cli-core/meetings`.
33
+ - **`events list overlapping`: meetings that clash.** It keeps timed events that overlap another one, each with
34
+ `overlaps` (`event:<id>` of the others). An event counts only when it takes the owner's time: not cancelled, not
35
+ all-day, with a copy the owner did not decline or mark free. New `EventFilter.overlapping`.
36
+ - **Changing or deleting "this and all following" occurrences.** `events update <occurrence> --following` (MCP
37
+ `following: true`) ends the series with UNTIL just before the occurrence and starts a new series there with the
38
+ change. The new series keeps the attendees, and the EXDATE and RDATE dates from the split on. It is built from the
39
+ writer's `create` and `update`, so no adapter needs code for it. The new series is made first, under an id
40
+ journaled before the call; if ending the old series then fails, the error names that id, and a retry with `--id`
41
+ finds the series instead of making a second one. A COUNT series needs `--repeat` for the new part
42
+ (`event.repeat-count`). `events delete <occurrence> --following` only ends the series. `WriteScope` stays
43
+ `this | series` for writers; `FollowingScope` adds `following`.
44
+ - **Moving an event to another calendar of the same account.** `CalendarWriter` gains an optional
45
+ `move(calendar, externalId, target, { etag, notify })`. With it, `events move <event> --to-calendar <id>` (MCP
46
+ `event_move`, `to_calendar`) moves the event with its id. Its key is `events.move`, plus `extraKeys("move")`;
47
+ `CalendarWrite` gains `move`. It refuses a calendar of another account, the same calendar, a read-only calendar
48
+ (`calendar.read-only`), an event type other than `default` (`event.unmovable`), and an occurrence without
49
+ `--series`. The store cancels the old copy and saves the new one under the same UID.
50
+ - **The contract kits cover both.** `calendarWriterContract` runs the "following" split over `memoryEventStore`
51
+ (earlier slots kept, the new series from the occurrence, no second series on a retry after a lost answer). With
52
+ `CalendarWriterFixture.target` and a writer that has `move`, it also checks a move: id kept, old etag a conflict,
53
+ retry finds the event. `fakeCalendarWriter` moves.
54
+
55
+ ### Changed — may break callers
56
+
57
+ - **Calendar writes that are easy to undo go ahead by default, as tg's and drive's writes do.** In
58
+ `CALENDAR_WRITE_DEFAULTS`, `events.create`, `events.update`, `events.respond` and the new `events.move` are
59
+ `allow` (were `ask`). `events.delete` stays `ask`, and it also covers `--following`. `events.delete.series` and
60
+ `events.notify` stay `deny`, so mailing attendees still needs the owner's yes. A profile that wants a question
61
+ first sets the key to `ask`.
62
+ - **A calendar series update whose new rule ends it sooner also needs `events.delete.series`,** which is `deny` by
63
+ default. `events update --series --repeat` with a COUNT or UNTIL that drops slots the series had (a bound added, an
64
+ earlier UNTIL, a smaller COUNT, or a bound of the other kind) deleted the later slots under `events.update` alone; it
65
+ now takes the same key as deleting the series. A rule with no end, or a later one, still needs only
66
+ `events.update`.
67
+ - **A calendar `sync` with a failed calendar prints nothing on stdout, and `sync.partial` carries the whole result.**
68
+ It printed the report and then failed, so stdout held an answer and the run was a failure (WC-OUT-14). Now the
69
+ error's message lists each failed calendar as `calendar <id> (<title>): <error>`, `details.calendars` holds every
70
+ synced calendar's `calendar_id`, `external_id`, `title`, `round`, `state`, `saved`, `removed`, `occurrences` and, on a
71
+ failed one, `error`, and the error says `retry.safe: true` (`retryable: true`, `sent: false`: a sync sends the
72
+ provider no write). A host that queues the report and prints it before the error must stop doing so.
73
+ - **`EventStore` gains `slotsOf`, and `LinkReview` gains `calendarId`** (the calendar of a `calendar_entry` review's
74
+ copy). `resolveAnswer` takes the account id after the store.
75
+ - **`EventStore` gains `saveSlots`**, which saves several series' slots and the sync cursor in one transaction.
76
+
77
+ - **`EventStore` gains `participantsOf(eventIds, calendarIds)`**: the participants of those events' copies on those
78
+ calendars, in one read.
79
+
80
+ - **`StoredEntry` gains `createdAt` and `transparency`, and `EventStore` gains `historyOf`.**
81
+
82
+ ### Fixed
83
+
84
+ - **A calendar sync commits a few times per calendar, not twice per repeating event.** The slots of up to 50 series
85
+ (250 slots) and the cursor go in one transaction. On a 20,000-event store with 819 weekly series (engine and SQLite
86
+ store, fake provider): 123 write transactions instead of 1,663 for a full round.
87
+ - **The daily full round asks only the series that changed for their slots.** A series with the stored etag and slots
88
+ stored in the window keeps them; every series is asked again once a week, and on `--rescan`. On the same store the
89
+ next day's full round made 0 `instances` requests instead of 819 and took 6.7 s instead of 15.1 s. A series that does
90
+ not change lacks at most 7 days of slots at the window's far end, three months ahead.
91
+
92
+ - **The daily full calendar sync no longer marks events outside its window as deleted.** A full list returns only
93
+ what falls in the window (a year back, three months ahead), but `markUnseen` limited only plain occurrences to it,
94
+ so every older or later single event, moved occurrence and ended series was marked deleted, and its event cancelled
95
+ or marked gone at the source. It now marks only what `entryInWindow` (new, from `@wirecat/cli-core/meetings`) puts
96
+ in the window. Stores already damaged heal on their next sync: each calendar runs the new
97
+ `EventStore.restoreUnseen` once, which brings back the entries marked outside the window of the list that marked
98
+ them, with their events. A rescan cannot do this, since it never lists them again. Implementations of `EventStore`
99
+ outside cli-core need `restoreUnseen`.
100
+ - **A repeating event moved to another time no longer keeps its slots at the old time.** An incremental sync saved the
101
+ slots the provider gave for the series and left the old ones scheduled. Now the series' stored plain slots in the
102
+ window that the provider no longer gives are cancelled.
103
+ - **A `sync --rescan` its budget stopped no longer leaves calendars it did not reach on incremental rounds.** The rescan
104
+ is saved as each calendar's round before the first request, so the next plain `sync` lists those in full.
105
+ - **A create the provider made but the store failed to save names the event's id.** The error carries
106
+ `operation_id` and `id` and says to sync, or to repeat with `--id`, which finds the event instead of making it again.
107
+ The same for the new series of `events update --following`.
108
+ - **`links resolve` no longer changes a link choice of another account's calendar.** It refuses with
109
+ `permission_error`; `links review` still lists every account's choices.
110
+ - **`events list` by time seeks the time index, and `people list` reads attendees in one query.** The list query put
111
+ both time bounds inside `CASE WHEN all_day`, so SQLite scanned the events from the start of the window; plain bounds
112
+ on `starts_at`, wider than the exact ones (back by the longest stored event plus a day, forward by a day), now let it
113
+ seek. `people list` read each of up to 1,000 events with five queries. On a 20,000-event store: `events list` today
114
+ 12.5 → 2 ms, `people list` for a week 83 → 15 ms, same answers.
115
+
116
+ - **The store's `node:sqlite` driver prepares each SQL text once per connection.** It prepared every statement again
117
+ on every call, which was a quarter of a gcal sync's time. Each connection now keeps up to 1,000 prepared
118
+ statements (least recently used out first) and finalizes them on `close()`. gcal 0.1.1's first sync of a synthetic
119
+ calendar ran 2.5–2.7 times faster (5,000 events: 6.7 → 2.5 s; 50,000: 68 → 28 s). `prepare()` with the same SQL
120
+ now returns the same statement. Bun's driver already cached through `db.query()`.
121
+
10
122
  ## 0.488.0 — 30.10.2026
11
123
 
12
124
  ### Added
@@ -12,7 +12,7 @@ import { BUSY_QUERY_HELP, busyAnswer, busyQuery, workingHoursOf } from "../busy.
12
12
  import { CALENDAR_UNTRUSTED_FIELDS, calendarIn, calendarItem, EVENTS_QUERY_HELP, eventAnswer, eventIdOf, eventOf, eventsAnswer, eventsFilter, peopleAnswer, resolveAnswer, reviewsAnswer, } from "../reads.js";
13
13
  import { REPEAT_HELP } from "../recurrence.js";
14
14
  import { calendarStatus, syncCalendars } from "../sync.js";
15
- import { createEvent, deleteEvent, EVENT_RESPONSES, respondToEvent, updateEvent, } from "../writes.js";
15
+ import { createEvent, deleteEvent, EVENT_RESPONSES, moveEvent, respondToEvent, updateEvent, } from "../writes.js";
16
16
  const LOCAL_READ = { remote: "none", local: "read" };
17
17
  const LOCAL_WRITE = { remote: "none", local: "write" };
18
18
  const FETCH = { remote: "read", local: "write" };
@@ -168,11 +168,28 @@ const addCalendarCommandsDefinition = (program, deps) => {
168
168
  : report.hint;
169
169
  if (report.hint === undefined)
170
170
  delete report.hint;
171
- print({ ...report, ...(embeddings === undefined ? {} : { embeddings }), ...(next ? { next } : {}) }, command);
172
- if (report.synced.some((one) => one.error !== undefined))
173
- throw new CliError("provider_error", "some calendars did not sync; run sync again to retry them", {
171
+ const failed = report.synced.filter((one) => one.error !== undefined);
172
+ if (failed.length)
173
+ // A failure prints nothing on stdout (WC-OUT-14), so the error carries every calendar's result.
174
+ throw new CliError("provider_error", `${failed.map((one) => `calendar ${one.calendarId} (${one.title ?? one.externalId}): ${one.error}`).join("; ")}` +
175
+ " — run sync again to retry", {
174
176
  reason: "sync.partial",
177
+ calendars: report.synced.map((one) => ({
178
+ calendar_id: String(one.calendarId),
179
+ external_id: one.externalId,
180
+ title: one.title,
181
+ round: one.round,
182
+ state: one.state,
183
+ saved: one.saved,
184
+ removed: one.removed,
185
+ occurrences: one.occurrences,
186
+ ...(one.error === undefined ? {} : { error: one.error }),
187
+ })),
188
+ retryable: true,
189
+ // A sync sends the provider no write, so running it again changes nothing there.
190
+ sent: false,
175
191
  });
192
+ print({ ...report, ...(embeddings === undefined ? {} : { embeddings }), ...(next ? { next } : {}) }, command);
176
193
  });
177
194
  output(example(annotate(program.command("status"), { effects: LOCAL_READ }).description("how far each synced calendar's sync is: entries done, partial or complete, and when it last moved"), "status --json")).action(async (_opts, command) => {
178
195
  print(await calendarStatus(deps.store, deps.accountId, {
@@ -261,7 +278,7 @@ const addCalendarCommandsDefinition = (program, deps) => {
261
278
  .description("join a copy to the event you choose, or keep it apart")
262
279
  .argument("<review>", "the review's id from links review")
263
280
  .argument("<choice>", "one of its candidates, as event:<id>, or apart"), "links resolve 7 event:42")).action(async (review, choice, _opts, command) => {
264
- print(await resolveAnswer(deps.store, review, choice, now()), command);
281
+ print(await resolveAnswer(deps.store, deps.accountId, review, choice, now()), command);
265
282
  });
266
283
  };
267
284
  const collect = (value, previous = []) => [...previous, value];
@@ -278,6 +295,7 @@ const addEventWrites = (events, writes, { deps, now, zone, output, print, exampl
278
295
  id: "--id",
279
296
  calendar: "--calendar",
280
297
  series: "--series",
298
+ following: "--following",
281
299
  repeat: "--repeat",
282
300
  },
283
301
  });
@@ -302,9 +320,10 @@ const addEventWrites = (events, writes, { deps, now, zone, output, print, exampl
302
320
  ...Object.fromEntries(Object.entries(given).filter(([, value]) => value !== undefined)),
303
321
  ...(attendee === undefined || attendee.length === 0 ? {} : { attendees: attendee }),
304
322
  });
305
- const choicesOf = ({ calendar, series, notify }) => ({
323
+ const choicesOf = ({ calendar, series, following, notify }) => ({
306
324
  ...(calendar === undefined ? {} : { calendar }),
307
325
  ...(series ? { series: true } : {}),
326
+ ...(following ? { following: true } : {}),
308
327
  ...(notify === undefined ? {} : { notify }),
309
328
  });
310
329
  const write = (name) => annotate(events.command(name), { effects: REMOTE_WRITE, offline: false });
@@ -323,17 +342,33 @@ const addEventWrites = (events, writes, { deps, now, zone, output, print, exampl
323
342
  }), command);
324
343
  });
325
344
  output(example(notify(target(fields(write("update"), true))
326
- .description("change an event; with --series every occurrence of the repeating event; new times or dates switch it " +
327
- "between timed and all-day")
328
- .option("--series", "change the whole repeating event, not only this occurrence")), "events update event:42 --start-time 2026-11-02T14:00 --end-time 2026-11-02T15:00 --notify", "events update event:42 --series --repeat 'FREQ=WEEKLY;BYDAY=TU;UNTIL=20261231T230000Z' --no-notify")).action(async (reference, opts, command) => {
329
- const { calendar: _calendar, series: _series, notify: _notify, ...rest } = opts;
330
- printWritten(await updateEvent(context(command), reference, fieldsOf(rest), choicesOf(opts)), command);
345
+ .description("change an event; with --series every occurrence of the repeating event, with --following this " +
346
+ "occurrence and every later one; new times or dates switch it between timed and all-day")
347
+ .option("--series", "change the whole repeating event, not only this occurrence")
348
+ .option("--following", "change this occurrence and every later one: the repeating event ends before it and a new one starts " +
349
+ "with the change")
350
+ .option("--id <id>", "with --following, the id an outcome_unknown named: a retry finds that new series")), "events update event:42 --start-time 2026-11-02T14:00 --end-time 2026-11-02T15:00 --notify", "events update event:42 --series --repeat 'FREQ=WEEKLY;BYDAY=TU;UNTIL=20261231T230000Z' --no-notify", "events update event:42 --following --start-time 2026-11-09T10:00 --end-time 2026-11-09T10:30 --no-notify")).action(async (reference, opts, command) => {
351
+ const { calendar: _calendar, series: _series, following: _following, notify: _notify, id, ...rest } = opts;
352
+ printWritten(await updateEvent(context(command), reference, fieldsOf(rest), {
353
+ ...choicesOf(opts),
354
+ ...(id === undefined ? {} : { id }),
355
+ }), command);
331
356
  });
332
357
  output(example(notify(target(write("delete"))
333
- .description("delete an event; a whole repeating event needs events.delete.series allowed first")
334
- .option("--series", "delete the whole repeating event, not only this occurrence")), "events delete event:42 --no-notify")).action(async (reference, opts, command) => {
358
+ .description("delete an event; a whole repeating event, or every later occurrence, needs events.delete.series " +
359
+ "allowed first")
360
+ .option("--series", "delete the whole repeating event, not only this occurrence")
361
+ .option("--following", "delete this occurrence and every later one: the repeating event ends before it")), "events delete event:42 --no-notify", "events delete event:42 --following --no-notify")).action(async (reference, opts, command) => {
335
362
  printWritten(await deleteEvent(context(command), reference, choicesOf(opts)), command);
336
363
  });
364
+ if (writes.writer.move)
365
+ output(example(notify(target(write("move"))
366
+ .description("move an event, with its id, to another calendar of the account; a repeating one moves whole")
367
+ .requiredOption("--to-calendar <id>", "the calendar to move it to: its id, or the provider's id")
368
+ .option("--series", "move the whole repeating event an occurrence belongs to")), "events move event:42 --to-calendar 4 --no-notify")).action(async (reference, opts, command) => {
369
+ const { series, calendar, notify } = opts;
370
+ printWritten(await moveEvent(context(command), reference, opts.toCalendar, choicesOf({ series, calendar, notify })), command);
371
+ });
337
372
  output(example(notify(target(write("respond"))
338
373
  .description("answer an invitation; the organiser is told only with --notify")
339
374
  .addArgument(new Argument("<response>", "the answer").choices(EVENT_RESPONSES))), "events respond event:42 accepted --notify")).action(async (reference, response, opts, command) => {
@@ -2,5 +2,5 @@ export type { CalendarAccessRole, CalendarInput, EntryAttachment, EntryAttachmen
2
2
  export { repeatRule } from "./recurrence.js";
3
3
  export type { BusyTimes, CalendarExpander, CalendarSource, CalendarSourceTraits, ChangePage, ChangeResult, FreeBusyRequest, SyncWindow, } from "./source.js";
4
4
  export { type CalendarCursor, type CalendarSyncOptions, type CalendarSyncReport, type CalendarSyncResult, calendarStatus, calendarSyncWindow, type PendingRound, parseCalendarCursor, syncCalendars, } from "./sync.js";
5
- export { CALENDAR_WRITE_DEFAULTS, CALENDAR_WRITE_KEYS, type CalendarWrite, type CalendarWriter, calendarConflict, EVENTS_DELETE_SERIES_KEY, EVENTS_NOTIFY_KEY, type EventDraft, type EventPatch, type EventResponse, type WriteScope, } from "./writer.js";
5
+ export { CALENDAR_WRITE_DEFAULTS, CALENDAR_WRITE_KEYS, type CalendarWrite, type CalendarWriter, calendarConflict, EVENTS_DELETE_SERIES_KEY, EVENTS_NOTIFY_KEY, type EventDraft, type EventPatch, type EventResponse, type FollowingScope, type WriteScope, } from "./writer.js";
6
6
  export type { CalendarWrites } from "./writes.js";
@@ -391,10 +391,19 @@ export declare const calendarWriteTools: ({
391
391
  series: {
392
392
  type: string;
393
393
  };
394
+ following: {
395
+ type: string;
396
+ description: string;
397
+ };
394
398
  notify: {
395
399
  type: string;
396
400
  description: string;
397
401
  };
402
+ id: {
403
+ type: string;
404
+ minLength: number;
405
+ description: string;
406
+ };
398
407
  } | {
399
408
  account_id: {
400
409
  type: string;
@@ -412,6 +421,36 @@ export declare const calendarWriteTools: ({
412
421
  series: {
413
422
  type: string;
414
423
  };
424
+ following: {
425
+ type: string;
426
+ description: string;
427
+ };
428
+ notify: {
429
+ type: string;
430
+ description: string;
431
+ };
432
+ } | {
433
+ account_id: {
434
+ type: string;
435
+ minimum: number;
436
+ };
437
+ event: {
438
+ type: string;
439
+ minLength: number;
440
+ };
441
+ calendar: {
442
+ type: string;
443
+ minLength: number;
444
+ description: string;
445
+ };
446
+ to_calendar: {
447
+ type: string;
448
+ minLength: number;
449
+ description: string;
450
+ };
451
+ series: {
452
+ type: string;
453
+ };
415
454
  notify: {
416
455
  type: string;
417
456
  description: string;
@@ -586,6 +625,40 @@ export declare const calendarWriteTools: ({
586
625
  series: {
587
626
  type: string;
588
627
  };
628
+ following: {
629
+ type: string;
630
+ description: string;
631
+ };
632
+ notify: {
633
+ type: string;
634
+ description: string;
635
+ };
636
+ id: {
637
+ type: string;
638
+ minLength: number;
639
+ description: string;
640
+ };
641
+ } | {
642
+ account_id: {
643
+ type: string;
644
+ minimum: number;
645
+ };
646
+ event: {
647
+ type: string;
648
+ minLength: number;
649
+ };
650
+ calendar: {
651
+ type: string;
652
+ minLength: number;
653
+ description: string;
654
+ };
655
+ series: {
656
+ type: string;
657
+ };
658
+ following: {
659
+ type: string;
660
+ description: string;
661
+ };
589
662
  notify: {
590
663
  type: string;
591
664
  description: string;
@@ -604,6 +677,11 @@ export declare const calendarWriteTools: ({
604
677
  minLength: number;
605
678
  description: string;
606
679
  };
680
+ to_calendar: {
681
+ type: string;
682
+ minLength: number;
683
+ description: string;
684
+ };
607
685
  series: {
608
686
  type: string;
609
687
  };
@@ -781,6 +859,40 @@ export declare const calendarWriteTools: ({
781
859
  series: {
782
860
  type: string;
783
861
  };
862
+ following: {
863
+ type: string;
864
+ description: string;
865
+ };
866
+ notify: {
867
+ type: string;
868
+ description: string;
869
+ };
870
+ id: {
871
+ type: string;
872
+ minLength: number;
873
+ description: string;
874
+ };
875
+ } | {
876
+ account_id: {
877
+ type: string;
878
+ minimum: number;
879
+ };
880
+ event: {
881
+ type: string;
882
+ minLength: number;
883
+ };
884
+ calendar: {
885
+ type: string;
886
+ minLength: number;
887
+ description: string;
888
+ };
889
+ series: {
890
+ type: string;
891
+ };
892
+ following: {
893
+ type: string;
894
+ description: string;
895
+ };
784
896
  notify: {
785
897
  type: string;
786
898
  description: string;
@@ -799,6 +911,11 @@ export declare const calendarWriteTools: ({
799
911
  minLength: number;
800
912
  description: string;
801
913
  };
914
+ to_calendar: {
915
+ type: string;
916
+ minLength: number;
917
+ description: string;
918
+ };
802
919
  series: {
803
920
  type: string;
804
921
  };
@@ -976,6 +1093,66 @@ export declare const calendarWriteTools: ({
976
1093
  series: {
977
1094
  type: string;
978
1095
  };
1096
+ following: {
1097
+ type: string;
1098
+ description: string;
1099
+ };
1100
+ notify: {
1101
+ type: string;
1102
+ description: string;
1103
+ };
1104
+ id: {
1105
+ type: string;
1106
+ minLength: number;
1107
+ description: string;
1108
+ };
1109
+ } | {
1110
+ account_id: {
1111
+ type: string;
1112
+ minimum: number;
1113
+ };
1114
+ event: {
1115
+ type: string;
1116
+ minLength: number;
1117
+ };
1118
+ calendar: {
1119
+ type: string;
1120
+ minLength: number;
1121
+ description: string;
1122
+ };
1123
+ series: {
1124
+ type: string;
1125
+ };
1126
+ following: {
1127
+ type: string;
1128
+ description: string;
1129
+ };
1130
+ notify: {
1131
+ type: string;
1132
+ description: string;
1133
+ };
1134
+ } | {
1135
+ account_id: {
1136
+ type: string;
1137
+ minimum: number;
1138
+ };
1139
+ event: {
1140
+ type: string;
1141
+ minLength: number;
1142
+ };
1143
+ calendar: {
1144
+ type: string;
1145
+ minLength: number;
1146
+ description: string;
1147
+ };
1148
+ to_calendar: {
1149
+ type: string;
1150
+ minLength: number;
1151
+ description: string;
1152
+ };
1153
+ series: {
1154
+ type: string;
1155
+ };
979
1156
  notify: {
980
1157
  type: string;
981
1158
  description: string;
@@ -994,6 +1171,219 @@ export declare const calendarWriteTools: ({
994
1171
  minLength: number;
995
1172
  description: string;
996
1173
  };
1174
+ response: {
1175
+ type: string;
1176
+ enum: readonly EventResponse[];
1177
+ };
1178
+ notify: {
1179
+ type: string;
1180
+ description: string;
1181
+ };
1182
+ };
1183
+ required: string[];
1184
+ additionalProperties: boolean;
1185
+ };
1186
+ annotations: {
1187
+ readOnlyHint: boolean;
1188
+ destructiveHint: boolean;
1189
+ idempotentHint: boolean;
1190
+ openWorldHint: boolean;
1191
+ };
1192
+ } | {
1193
+ name: string;
1194
+ description: string;
1195
+ inputSchema: {
1196
+ type: string;
1197
+ properties: {
1198
+ title: {
1199
+ type: string;
1200
+ minLength: number;
1201
+ };
1202
+ start_time: {
1203
+ type: string;
1204
+ minLength: number;
1205
+ description: string;
1206
+ };
1207
+ end_time: {
1208
+ type: string;
1209
+ minLength: number;
1210
+ description: string;
1211
+ };
1212
+ start_date: {
1213
+ type: string;
1214
+ minLength: number;
1215
+ description: string;
1216
+ };
1217
+ end_date: {
1218
+ type: string;
1219
+ minLength: number;
1220
+ description: string;
1221
+ };
1222
+ timezone: {
1223
+ type: string;
1224
+ minLength: number;
1225
+ };
1226
+ location: {
1227
+ type: string;
1228
+ description: string;
1229
+ };
1230
+ description: {
1231
+ type: string;
1232
+ description: string;
1233
+ };
1234
+ attendees: {
1235
+ type: string;
1236
+ items: {
1237
+ type: string;
1238
+ minLength: number;
1239
+ };
1240
+ description: string;
1241
+ };
1242
+ repeat: {
1243
+ type: string;
1244
+ minLength: number;
1245
+ description: string;
1246
+ };
1247
+ account_id: {
1248
+ type: string;
1249
+ minimum: number;
1250
+ };
1251
+ calendar: {
1252
+ type: string;
1253
+ minLength: number;
1254
+ };
1255
+ notify: {
1256
+ type: string;
1257
+ description: string;
1258
+ };
1259
+ id: {
1260
+ type: string;
1261
+ minLength: number;
1262
+ description: string;
1263
+ };
1264
+ } | {
1265
+ title: {
1266
+ type: string;
1267
+ minLength: number;
1268
+ };
1269
+ start_time: {
1270
+ type: string;
1271
+ minLength: number;
1272
+ description: string;
1273
+ };
1274
+ end_time: {
1275
+ type: string;
1276
+ minLength: number;
1277
+ description: string;
1278
+ };
1279
+ start_date: {
1280
+ type: string;
1281
+ minLength: number;
1282
+ description: string;
1283
+ };
1284
+ end_date: {
1285
+ type: string;
1286
+ minLength: number;
1287
+ description: string;
1288
+ };
1289
+ timezone: {
1290
+ type: string;
1291
+ minLength: number;
1292
+ };
1293
+ location: {
1294
+ type: string;
1295
+ description: string;
1296
+ };
1297
+ description: {
1298
+ type: string;
1299
+ description: string;
1300
+ };
1301
+ attendees: {
1302
+ type: string;
1303
+ items: {
1304
+ type: string;
1305
+ minLength: number;
1306
+ };
1307
+ description: string;
1308
+ };
1309
+ repeat: {
1310
+ type: string;
1311
+ minLength: number;
1312
+ description: string;
1313
+ };
1314
+ account_id: {
1315
+ type: string;
1316
+ minimum: number;
1317
+ };
1318
+ event: {
1319
+ type: string;
1320
+ minLength: number;
1321
+ };
1322
+ calendar: {
1323
+ type: string;
1324
+ minLength: number;
1325
+ description: string;
1326
+ };
1327
+ series: {
1328
+ type: string;
1329
+ };
1330
+ following: {
1331
+ type: string;
1332
+ description: string;
1333
+ };
1334
+ notify: {
1335
+ type: string;
1336
+ description: string;
1337
+ };
1338
+ id: {
1339
+ type: string;
1340
+ minLength: number;
1341
+ description: string;
1342
+ };
1343
+ } | {
1344
+ account_id: {
1345
+ type: string;
1346
+ minimum: number;
1347
+ };
1348
+ event: {
1349
+ type: string;
1350
+ minLength: number;
1351
+ };
1352
+ calendar: {
1353
+ type: string;
1354
+ minLength: number;
1355
+ description: string;
1356
+ };
1357
+ series: {
1358
+ type: string;
1359
+ };
1360
+ following: {
1361
+ type: string;
1362
+ description: string;
1363
+ };
1364
+ notify: {
1365
+ type: string;
1366
+ description: string;
1367
+ };
1368
+ } | {
1369
+ account_id: {
1370
+ type: string;
1371
+ minimum: number;
1372
+ };
1373
+ event: {
1374
+ type: string;
1375
+ minLength: number;
1376
+ };
1377
+ calendar: {
1378
+ type: string;
1379
+ minLength: number;
1380
+ description: string;
1381
+ };
1382
+ to_calendar: {
1383
+ type: string;
1384
+ minLength: number;
1385
+ description: string;
1386
+ };
997
1387
  series: {
998
1388
  type: string;
999
1389
  };