@foldedspacelabs/metistry-mcp-eventkit 0.12.0 → 0.14.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.
- package/dist/events.d.ts +67 -0
- package/dist/events.js +83 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/manifest.yaml +2 -1
- package/package.json +2 -2
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** A participant as the helper reports it (`participant()` in ek-helper.swift). */
|
|
2
|
+
export interface HelperParticipant {
|
|
3
|
+
name?: string | null;
|
|
4
|
+
email?: string | null;
|
|
5
|
+
status?: string;
|
|
6
|
+
role?: string;
|
|
7
|
+
type?: string;
|
|
8
|
+
self?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** One event as the helper's `list_events` reports it. Every field past `calendar` arrived with T2-11; an older helper sends none of them. */
|
|
11
|
+
export interface HelperEvent {
|
|
12
|
+
id?: string;
|
|
13
|
+
title?: string;
|
|
14
|
+
start?: string;
|
|
15
|
+
end?: string;
|
|
16
|
+
all_day?: boolean;
|
|
17
|
+
location?: string;
|
|
18
|
+
calendar?: string;
|
|
19
|
+
attendees?: string[];
|
|
20
|
+
participants?: HelperParticipant[];
|
|
21
|
+
organizer?: HelperParticipant | null;
|
|
22
|
+
ical_uid?: string | null;
|
|
23
|
+
recurring?: boolean;
|
|
24
|
+
occurrence?: string | null;
|
|
25
|
+
notes?: string | null;
|
|
26
|
+
}
|
|
27
|
+
/** A participant as `GET /events` serves it: the address as EventKit gave it (the sync lowercases), the owner's own row marked. */
|
|
28
|
+
export interface Participant {
|
|
29
|
+
name: string | null;
|
|
30
|
+
email: string | null;
|
|
31
|
+
status: string;
|
|
32
|
+
role: string;
|
|
33
|
+
type: string;
|
|
34
|
+
self: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** One event as `GET /events` serves it. The first eight fields are unchanged from before T2-11, so every existing reader still reads them. */
|
|
37
|
+
export interface BridgeEvent {
|
|
38
|
+
id: string;
|
|
39
|
+
title: string;
|
|
40
|
+
start: string;
|
|
41
|
+
end: string;
|
|
42
|
+
all_day: boolean;
|
|
43
|
+
location: string;
|
|
44
|
+
calendar: string;
|
|
45
|
+
/** Names only — `morning-brief` and `weekly-review` join these as strings. */
|
|
46
|
+
attendees: string[];
|
|
47
|
+
/** Null only for an event the helper could not name — served (a brief still lists it), never synced. */
|
|
48
|
+
event_id: string | null;
|
|
49
|
+
ical_uid: string | null;
|
|
50
|
+
series_id: string | null;
|
|
51
|
+
participants: Participant[];
|
|
52
|
+
organizer: Participant | null;
|
|
53
|
+
self_status: string | null;
|
|
54
|
+
}
|
|
55
|
+
/** Everything a participant's status may be; anything else a helper says is `unknown`. */
|
|
56
|
+
export declare const PARTICIPANT_STATUSES: readonly ["unknown", "pending", "accepted", "declined", "tentative", "delegated", "completed", "in_process"];
|
|
57
|
+
/**
|
|
58
|
+
* The occurrence key: the identifier, and for an occurrence of a recurring
|
|
59
|
+
* event its original date (`20260928T133000Z`, or `20260928` all-day).
|
|
60
|
+
* Null when the helper gave no identifier — an event that cannot be named
|
|
61
|
+
* cannot be keyed (EKEvent.h: nil only for an event never saved).
|
|
62
|
+
*/
|
|
63
|
+
export declare function eventKey(e: Pick<HelperEvent, "id" | "recurring" | "occurrence">): string | null;
|
|
64
|
+
/** The owner's own answer to this event, or null when there is nothing to answer (see the header). */
|
|
65
|
+
export declare function selfStatus(participants: Participant[], organizer: Participant | null): string | null;
|
|
66
|
+
/** The helper's event → the bridge's. `notes` is never carried (see the header). */
|
|
67
|
+
export declare function bridgeEvent(e: HelperEvent): BridgeEvent;
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// What `GET /events` serves for one event, made from what the Swift helper
|
|
2
|
+
// read. Pure: no socket, no clock — the wire contract's tests drive it with
|
|
3
|
+
// a scripted helper, and every calendar consumer (the routines, the eventkit
|
|
4
|
+
// sync that fills `calendar_events`) reads the same fields from it.
|
|
5
|
+
//
|
|
6
|
+
// Three facts are decided HERE rather than in Swift, so they are tested on
|
|
7
|
+
// every platform CI runs on:
|
|
8
|
+
//
|
|
9
|
+
// * **`event_id` names one occurrence.** EventKit's `eventIdentifier` is the
|
|
10
|
+
// SERIES for a recurring event (every Monday standup shares it), and a
|
|
11
|
+
// meeting note is for one Monday. A recurring occurrence's key is the
|
|
12
|
+
// identifier plus its ORIGINAL date (`occurrenceDate`, which stays put
|
|
13
|
+
// when that one occurrence is moved — EKEvent.h), the shape Google uses
|
|
14
|
+
// for its instance ids. A one-off event's key is its identifier alone, so
|
|
15
|
+
// moving it does not orphan its note.
|
|
16
|
+
// * **`self_status` is the owner's answer**, from the participant EventKit
|
|
17
|
+
// marks `isCurrentUser`; the organizer of a meeting has accepted it by
|
|
18
|
+
// definition (RFC 5545 gives the organizer's own PARTSTAT as ACCEPTED);
|
|
19
|
+
// an event with nobody else in it has nothing to answer, so null.
|
|
20
|
+
// * **`notes` never leaves the bridge.** The invite body carries dial-in
|
|
21
|
+
// codes and confidential agendas (today-hub-requests A1). The helper reads
|
|
22
|
+
// it only when asked, the bridge never asks, and this function drops the
|
|
23
|
+
// field even if a helper sends it unasked — so no consumer of `GET
|
|
24
|
+
// /events`, and nothing any consumer writes, can carry one.
|
|
25
|
+
/** Everything a participant's status may be; anything else a helper says is `unknown`. */
|
|
26
|
+
export const PARTICIPANT_STATUSES = ["unknown", "pending", "accepted", "declined", "tentative", "delegated", "completed", "in_process"];
|
|
27
|
+
const STATUSES = new Set(PARTICIPANT_STATUSES);
|
|
28
|
+
const text = (v) => (typeof v === "string" && v !== "" ? v : null);
|
|
29
|
+
function participant(p) {
|
|
30
|
+
return {
|
|
31
|
+
name: text(p.name),
|
|
32
|
+
email: text(p.email),
|
|
33
|
+
status: typeof p.status === "string" && STATUSES.has(p.status) ? p.status : "unknown",
|
|
34
|
+
role: text(p.role) ?? "unknown",
|
|
35
|
+
type: text(p.type) ?? "unknown",
|
|
36
|
+
self: p.self === true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The occurrence key: the identifier, and for an occurrence of a recurring
|
|
41
|
+
* event its original date (`20260928T133000Z`, or `20260928` all-day).
|
|
42
|
+
* Null when the helper gave no identifier — an event that cannot be named
|
|
43
|
+
* cannot be keyed (EKEvent.h: nil only for an event never saved).
|
|
44
|
+
*/
|
|
45
|
+
export function eventKey(e) {
|
|
46
|
+
const id = text(e.id);
|
|
47
|
+
if (id === null)
|
|
48
|
+
return null;
|
|
49
|
+
const occurrence = e.recurring === true ? text(e.occurrence) : null;
|
|
50
|
+
return occurrence === null ? id : `${id}_${occurrence}`;
|
|
51
|
+
}
|
|
52
|
+
/** The owner's own answer to this event, or null when there is nothing to answer (see the header). */
|
|
53
|
+
export function selfStatus(participants, organizer) {
|
|
54
|
+
const mine = participants.find((p) => p.self);
|
|
55
|
+
if (mine)
|
|
56
|
+
return mine.status;
|
|
57
|
+
if (organizer?.self)
|
|
58
|
+
return "accepted";
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/** The helper's event → the bridge's. `notes` is never carried (see the header). */
|
|
62
|
+
export function bridgeEvent(e) {
|
|
63
|
+
const key = eventKey(e);
|
|
64
|
+
const participants = Array.isArray(e.participants) ? e.participants.map(participant) : [];
|
|
65
|
+
const organizer = e.organizer ? participant(e.organizer) : null;
|
|
66
|
+
return {
|
|
67
|
+
id: e.id ?? "",
|
|
68
|
+
title: e.title ?? "",
|
|
69
|
+
start: e.start ?? "",
|
|
70
|
+
end: e.end ?? "",
|
|
71
|
+
all_day: e.all_day === true,
|
|
72
|
+
location: e.location ?? "",
|
|
73
|
+
calendar: e.calendar ?? "",
|
|
74
|
+
attendees: Array.isArray(e.attendees) ? e.attendees.filter((a) => typeof a === "string") : [],
|
|
75
|
+
event_id: key,
|
|
76
|
+
ical_uid: text(e.ical_uid),
|
|
77
|
+
series_id: e.recurring === true ? text(e.id) : null,
|
|
78
|
+
participants,
|
|
79
|
+
organizer,
|
|
80
|
+
self_status: selfStatus(participants, organizer),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Server } from "node:http";
|
|
2
2
|
import type { Helper } from "./helper.js";
|
|
3
|
+
export { bridgeEvent, eventKey, selfStatus, PARTICIPANT_STATUSES, type BridgeEvent, type HelperEvent, type HelperParticipant, type Participant } from "./events.js";
|
|
3
4
|
export interface BridgeConfig {
|
|
4
5
|
token: string;
|
|
5
6
|
}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { createServer } from "node:http";
|
|
7
7
|
import { randomUUID } from "node:crypto";
|
|
8
8
|
import { authorized, errorEnvelope, statusFor, runCheck } from "@foldedspacelabs/metistry-core";
|
|
9
|
+
import { bridgeEvent } from "./events.js";
|
|
10
|
+
export { bridgeEvent, eventKey, selfStatus, PARTICIPANT_STATUSES } from "./events.js";
|
|
9
11
|
const CONFIRM_TTL_MS = 5 * 60 * 1000;
|
|
10
12
|
function send(res, status, body) {
|
|
11
13
|
const text = JSON.stringify(body);
|
|
@@ -62,10 +64,22 @@ export function makeBridge(helper, cfg) {
|
|
|
62
64
|
});
|
|
63
65
|
return send(res, result.status === "ok" ? 200 : 503, result);
|
|
64
66
|
}
|
|
67
|
+
// Every event with its occurrence key, participants, organizer and the
|
|
68
|
+
// owner's own answer (events.ts). Never the invite body: the helper is
|
|
69
|
+
// not asked for `notes`, and `bridgeEvent` drops the field if one comes
|
|
70
|
+
// anyway — no reader of this route can hand one on (T2-11). `window` is
|
|
71
|
+
// the span the helper read, so a sync can tell an event that was
|
|
72
|
+
// cancelled from one that is simply outside what it asked for; an older
|
|
73
|
+
// helper sends none and the response says so by omitting it.
|
|
65
74
|
if (key === "GET /events") {
|
|
66
75
|
const days = Math.min(Math.max(Number(url.searchParams.get("days") ?? 1), 1), 31);
|
|
67
76
|
const r = await helper.request({ op: "list_events", days });
|
|
68
|
-
|
|
77
|
+
if (!r.ok)
|
|
78
|
+
return fail(res, "internal");
|
|
79
|
+
const events = (Array.isArray(r.events) ? r.events : []).map(bridgeEvent);
|
|
80
|
+
const w = r.window;
|
|
81
|
+
const window = w && typeof w.start === "string" && typeof w.end === "string" ? { start: w.start, end: w.end } : undefined;
|
|
82
|
+
return send(res, 200, { events, ...(window ? { window } : {}), as_of: new Date().toISOString() });
|
|
69
83
|
}
|
|
70
84
|
if (key === "GET /reminders") {
|
|
71
85
|
const r = await helper.request({ op: "list_reminders" });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,6CAA6C;AAE7C,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/manifest.yaml
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
schema: 1
|
|
1
2
|
name: eventkit
|
|
2
3
|
type: bridge
|
|
3
4
|
description: Calendar + Reminders read/write via EventKit (PoC-9)
|
|
@@ -9,7 +10,7 @@ discovery: eager # 4 tools — under the PoC-17 lazy threshold
|
|
|
9
10
|
degrades: absent # router stops offering calendar when the Mac is away
|
|
10
11
|
exposes:
|
|
11
12
|
- name: list_events
|
|
12
|
-
description: Events from today for N days
|
|
13
|
+
description: Events from today for N days — title, times, location, attendees with address and answer, organizer, series and the occurrence key; never the invite body
|
|
13
14
|
- name: list_reminders
|
|
14
15
|
description: Incomplete reminders across lists
|
|
15
16
|
- name: create_event
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foldedspacelabs/metistry-mcp-eventkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Metistry EventKit bridge: Calendar + Reminders over the §4.3 wire contract (HTTP + bearer auth + check() + preview-confirm). Ships a compiled, signed Swift helper; TCC-bound — runs as its own launchd service. Usable standalone.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"darwin"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@foldedspacelabs/metistry-core": "0.
|
|
24
|
+
"@foldedspacelabs/metistry-core": "0.14.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^22.20.1",
|