@foldedspacelabs/metistry-mcp-eventkit 0.14.4 → 0.15.1
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 +2 -0
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.js +83 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +4 -1
- package/dist/main.js.map +1 -1
- package/dist/move.d.ts +59 -0
- package/dist/move.js +127 -0
- package/dist/move.js.map +1 -0
- package/manifest.yaml +9 -1
- package/package.json +11 -4
package/dist/events.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface HelperEvent {
|
|
|
23
23
|
recurring?: boolean;
|
|
24
24
|
occurrence?: string | null;
|
|
25
25
|
notes?: string | null;
|
|
26
|
+
/** The event's calendar accepts changes (`allowsContentModifications`). Arrived with T2-12; `move_event` refuses a read-only calendar. */
|
|
27
|
+
writable?: boolean;
|
|
26
28
|
}
|
|
27
29
|
/** A participant as `GET /events` serves it: the address as EventKit gave it (the sync lowercases), the owner's own row marked. */
|
|
28
30
|
export interface Participant {
|
package/dist/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,oEAAoE;AACpE,EAAE;AACF,2EAA2E;AAC3E,6BAA6B;AAC7B,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,yCAAyC;AACzC,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,qEAAqE;AACrE,0EAA0E;AAC1E,8EAA8E;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,+DAA+D;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { type Server } from "node:http";
|
|
2
2
|
import type { Helper } from "./helper.js";
|
|
3
3
|
export { bridgeEvent, eventKey, selfStatus, PARTICIPANT_STATUSES, type BridgeEvent, type HelperEvent, type HelperParticipant, type Participant } from "./events.js";
|
|
4
|
+
export { OWNER_DOOR_HEADER, othersIn, parseMove, type MoveRequest } from "./move.js";
|
|
4
5
|
export interface BridgeConfig {
|
|
6
|
+
/** The bearer every caller presents (METISTRY_BRIDGE_TOKEN_EVENTKIT). */
|
|
5
7
|
token: string;
|
|
8
|
+
/**
|
|
9
|
+
* The owner-door token (METISTRY_OWNER_DOOR_TOKEN_EVENTKIT): the second
|
|
10
|
+
* secret a confirm must carry, in `Metistry-Owner-Door`, to move an event
|
|
11
|
+
* with others in it. Only the console's owner door holds it; the assistant
|
|
12
|
+
* never does. Absent = no such move is ever confirmed (fail closed); an
|
|
13
|
+
* event with nobody else in it still moves.
|
|
14
|
+
*/
|
|
15
|
+
ownerDoorToken?: string | undefined;
|
|
6
16
|
}
|
|
7
17
|
export declare function makeBridge(helper: Helper, cfg: BridgeConfig): Server;
|
package/dist/index.js
CHANGED
|
@@ -3,11 +3,17 @@
|
|
|
3
3
|
// on the destructive tools (§4.3 default 2): a create returns what would
|
|
4
4
|
// change plus a short-lived confirm token; the same request with the token
|
|
5
5
|
// executes. Enforced here, not by prompting.
|
|
6
|
+
//
|
|
7
|
+
// Moving an event (`POST /events/move`, T2-12) is the same shape with one
|
|
8
|
+
// more gate: a confirm for an event with others in it must ALSO carry the
|
|
9
|
+
// owner-door token (move.ts says why and how "others" is counted).
|
|
6
10
|
import { createServer } from "node:http";
|
|
7
11
|
import { randomUUID } from "node:crypto";
|
|
8
|
-
import { authorized, errorEnvelope, statusFor, runCheck } from "@foldedspacelabs/metistry-core";
|
|
12
|
+
import { authorized, errorEnvelope, statusFor, runCheck, tokenEquals } from "@foldedspacelabs/metistry-core";
|
|
9
13
|
import { bridgeEvent } from "./events.js";
|
|
14
|
+
import { OWNER_DOOR_HEADER, checkMovable, describeMove, eventFingerprint, moveKey, movedView, parseMove } from "./move.js";
|
|
10
15
|
export { bridgeEvent, eventKey, selfStatus, PARTICIPANT_STATUSES } from "./events.js";
|
|
16
|
+
export { OWNER_DOOR_HEADER, othersIn, parseMove } from "./move.js";
|
|
11
17
|
const CONFIRM_TTL_MS = 5 * 60 * 1000;
|
|
12
18
|
function send(res, status, body) {
|
|
13
19
|
const text = JSON.stringify(body);
|
|
@@ -24,6 +30,14 @@ async function readJson(req) {
|
|
|
24
30
|
return chunks.length ? JSON.parse(Buffer.concat(chunks).toString("utf8")) : {};
|
|
25
31
|
}
|
|
26
32
|
export function makeBridge(helper, cfg) {
|
|
33
|
+
// one secret in two roles is no split at all: whoever holds the bearer would hold the door
|
|
34
|
+
if (cfg.ownerDoorToken !== undefined && (cfg.ownerDoorToken === "" || tokenEquals(cfg.ownerDoorToken, cfg.token))) {
|
|
35
|
+
throw new Error("the owner-door token must be set and differ from the bridge token — mint its own (metistry secrets mint METISTRY_OWNER_DOOR_TOKEN_EVENTKIT)");
|
|
36
|
+
}
|
|
37
|
+
const ownerDoor = (req) => {
|
|
38
|
+
const presented = req.headers[OWNER_DOOR_HEADER];
|
|
39
|
+
return cfg.ownerDoorToken !== undefined && typeof presented === "string" && presented !== "" && tokenEquals(presented, cfg.ownerDoorToken);
|
|
40
|
+
};
|
|
27
41
|
// confirm tokens bind to the exact payload they previewed
|
|
28
42
|
const pendingConfirms = new Map();
|
|
29
43
|
async function previewOrExecute(res, op, body, describe) {
|
|
@@ -41,6 +55,72 @@ export function makeBridge(helper, cfg) {
|
|
|
41
55
|
pendingConfirms.set(token, { payload: canonical, expires: Date.now() + CONFIRM_TTL_MS });
|
|
42
56
|
return send(res, 200, { preview: describe(payload), confirm_token: token, expires_in_sec: CONFIRM_TTL_MS / 1000 });
|
|
43
57
|
}
|
|
58
|
+
// move confirms bind the move AND the event as previewed (move.ts `eventFingerprint`)
|
|
59
|
+
const pendingMoves = new Map();
|
|
60
|
+
const sweep = () => {
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
for (const [k, v] of pendingMoves)
|
|
63
|
+
if (v.expires < now)
|
|
64
|
+
pendingMoves.delete(k);
|
|
65
|
+
};
|
|
66
|
+
async function readEvent(eventId) {
|
|
67
|
+
const r = await helper.request({ op: "get_event", event_id: eventId });
|
|
68
|
+
return r.ok ? { ok: true, check: checkMovable(r.event) } : { ok: false };
|
|
69
|
+
}
|
|
70
|
+
async function move(req, res) {
|
|
71
|
+
let body;
|
|
72
|
+
try {
|
|
73
|
+
body = await readJson(req);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return send(res, 400, errorEnvelope("invalid_request", "request body is not JSON"));
|
|
77
|
+
}
|
|
78
|
+
const parsed = parseMove(body);
|
|
79
|
+
if (!parsed.ok)
|
|
80
|
+
return send(res, 400, errorEnvelope("invalid_request", parsed.message));
|
|
81
|
+
const { move: m, confirmToken } = parsed;
|
|
82
|
+
// the token is spent on first sight, whatever happens next: single-use
|
|
83
|
+
const pending = confirmToken !== null ? pendingMoves.get(confirmToken) : undefined;
|
|
84
|
+
if (confirmToken !== null) {
|
|
85
|
+
pendingMoves.delete(confirmToken);
|
|
86
|
+
if (!pending || pending.expires < Date.now() || pending.move !== moveKey(m)) {
|
|
87
|
+
return send(res, 409, errorEnvelope("conflict", "this confirm token is spent, expired, or for a different move — preview again"));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// the event as it stands NOW, for the preview and again for the confirm
|
|
91
|
+
const read = await readEvent(m.event_id);
|
|
92
|
+
if (!read.ok)
|
|
93
|
+
return fail(res, "internal");
|
|
94
|
+
if (!read.check.ok)
|
|
95
|
+
return send(res, statusFor(read.check.code), errorEnvelope(read.check.code, read.check.message));
|
|
96
|
+
const { event, others } = read.check;
|
|
97
|
+
if (!pending) {
|
|
98
|
+
sweep();
|
|
99
|
+
const token = randomUUID();
|
|
100
|
+
pendingMoves.set(token, { move: moveKey(m), fingerprint: eventFingerprint(event), expires: Date.now() + CONFIRM_TTL_MS });
|
|
101
|
+
return send(res, 200, {
|
|
102
|
+
preview: describeMove(event, m, others),
|
|
103
|
+
event: movedView(event),
|
|
104
|
+
to: { start: m.start, end: m.end },
|
|
105
|
+
others: others.length,
|
|
106
|
+
owner_door_required: others.length > 0,
|
|
107
|
+
confirm_token: token,
|
|
108
|
+
expires_in_sec: CONFIRM_TTL_MS / 1000,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// B10: others in it → the owner's door, or no move. Checked on the event
|
|
112
|
+
// as it stands, so a guest added since the preview is counted too.
|
|
113
|
+
if (others.length > 0 && !ownerDoor(req)) {
|
|
114
|
+
return send(res, 403, errorEnvelope("forbidden", `this event has ${others.length === 1 ? "someone else" : `${others.length} others`} in it — only the owner's door may confirm moving it`));
|
|
115
|
+
}
|
|
116
|
+
if (eventFingerprint(event) !== pending.fingerprint) {
|
|
117
|
+
return send(res, 409, { ...errorEnvelope("conflict", "the event changed since the preview — its time or who is in it — preview again"), event: movedView(event) });
|
|
118
|
+
}
|
|
119
|
+
const r = await helper.request({ op: "move_event", event_id: m.event_id, start: m.start, end: m.end });
|
|
120
|
+
if (!r.ok)
|
|
121
|
+
return send(res, 409, errorEnvelope("conflict", "the calendar refused the move — the event may have changed or been deleted, or its calendar is read-only; preview again"));
|
|
122
|
+
return send(res, 200, { moved: movedView(bridgeEvent(r.moved)), others: others.length });
|
|
123
|
+
}
|
|
44
124
|
return createServer(async (req, res) => {
|
|
45
125
|
try {
|
|
46
126
|
if (!authorized(req.headers.authorization, cfg.token))
|
|
@@ -91,6 +171,8 @@ export function makeBridge(helper, cfg) {
|
|
|
91
171
|
return fail(res, "invalid_request");
|
|
92
172
|
return previewOrExecute(res, "create_event", body, (b) => `create event "${b.title}" ${b.start} → ${b.end} on the default calendar`);
|
|
93
173
|
}
|
|
174
|
+
if (key === "POST /events/move")
|
|
175
|
+
return move(req, res);
|
|
94
176
|
if (key === "POST /reminders") {
|
|
95
177
|
const body = await readJson(req);
|
|
96
178
|
if (typeof body.title !== "string")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -3,7 +3,10 @@ import { Helper } from "./helper.js";
|
|
|
3
3
|
import { makeBridge } from "./index.js";
|
|
4
4
|
// The helper is a SEPARATE launchd service (TCC root binary); we only connect.
|
|
5
5
|
const helper = new Helper(optionalEnv("METISTRY_EK_SOCKET", "/tmp/metistry-eventkit.sock"));
|
|
6
|
-
|
|
6
|
+
// the owner-door token (index.ts BridgeConfig): only the console's owner door
|
|
7
|
+
// holds it; unset, a move of an event with others in it is never confirmed
|
|
8
|
+
const ownerDoorToken = optionalEnv("METISTRY_OWNER_DOOR_TOKEN_EVENTKIT", "").trim();
|
|
9
|
+
const server = makeBridge(helper, { token: requireEnv("METISTRY_BRIDGE_TOKEN_EVENTKIT"), ...(ownerDoorToken ? { ownerDoorToken } : {}) });
|
|
7
10
|
const host = optionalEnv("METISTRY_EK_HOST", "127.0.0.1");
|
|
8
11
|
const port = intEnv("METISTRY_EK_PORT", 7811);
|
|
9
12
|
server.listen(port, host, () => console.log(`eventkit bridge on ${host}:${port}`));
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,+EAA+E;AAC/E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,oBAAoB,EAAE,6BAA6B,CAAC,CAAC,CAAC;AAC5F,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,+EAA+E;AAC/E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,oBAAoB,EAAE,6BAA6B,CAAC,CAAC,CAAC;AAC5F,8EAA8E;AAC9E,2EAA2E;AAC3E,MAAM,cAAc,GAAG,WAAW,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,gCAAgC,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAE1I,MAAM,IAAI,GAAG,WAAW,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;AAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC"}
|
package/dist/move.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type BridgeEvent, type Participant } from "./events.js";
|
|
2
|
+
/** The header a confirm carries the owner-door token in. Never a body field: the payload a confirm token binds is the move, not who is asking. */
|
|
3
|
+
export declare const OWNER_DOOR_HEADER = "metistry-owner-door";
|
|
4
|
+
/** events.ts's occurrence keys and the console's meeting-note door's bound: an id longer than this is refused, never cut. */
|
|
5
|
+
export declare const MOVE_EVENT_ID_MAX = 1024;
|
|
6
|
+
/** What a move asks for, canonical: the id as served, and both instants at second precision in UTC (what the helper's ISO8601DateFormatter reads). */
|
|
7
|
+
export interface MoveRequest {
|
|
8
|
+
event_id: string;
|
|
9
|
+
start: string;
|
|
10
|
+
end: string;
|
|
11
|
+
}
|
|
12
|
+
export type ParsedMove = {
|
|
13
|
+
ok: true;
|
|
14
|
+
move: MoveRequest;
|
|
15
|
+
confirmToken: string | null;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
/** An instant as the helper reads it: `2026-09-28T14:00:00Z`. Null for anything `Date` cannot read. */
|
|
21
|
+
export declare function canonicalInstant(v: unknown): string | null;
|
|
22
|
+
/** The body of `POST /events/move`: exactly `{event_id, start, end, confirm_token?}`. */
|
|
23
|
+
export declare function parseMove(body: unknown): ParsedMove;
|
|
24
|
+
/** The move as one string, fields in a fixed order — what a confirm token binds. Key order in the request body never matters. */
|
|
25
|
+
export declare function moveKey(m: MoveRequest): string;
|
|
26
|
+
/** Everyone in the event who is not the owner — the people a move re-times. Fail-closed: every kind counts, and an organizer who is not the owner counts once. */
|
|
27
|
+
export declare function othersIn(e: Pick<BridgeEvent, "participants" | "organizer">): Participant[];
|
|
28
|
+
/**
|
|
29
|
+
* What the owner saw when they previewed: the event's times, who is in it,
|
|
30
|
+
* and who organises it (not their answers — Dana accepting is no reason to
|
|
31
|
+
* preview again). A confirm is for this; if any
|
|
32
|
+
* of it has changed, the confirm is refused (`409`), never applied to an
|
|
33
|
+
* event the owner has not looked at.
|
|
34
|
+
*/
|
|
35
|
+
export declare function eventFingerprint(e: BridgeEvent): string;
|
|
36
|
+
/** The event as a preview and a confirm show it: never the invite body (bridgeEvent drops it). */
|
|
37
|
+
export declare function movedView(e: BridgeEvent): {
|
|
38
|
+
event_id: string | null;
|
|
39
|
+
title: string;
|
|
40
|
+
start: string;
|
|
41
|
+
end: string;
|
|
42
|
+
all_day: boolean;
|
|
43
|
+
calendar: string;
|
|
44
|
+
participants: Participant[];
|
|
45
|
+
organizer: Participant | null;
|
|
46
|
+
};
|
|
47
|
+
export type MoveCheck = {
|
|
48
|
+
ok: true;
|
|
49
|
+
event: BridgeEvent;
|
|
50
|
+
others: Participant[];
|
|
51
|
+
} | {
|
|
52
|
+
ok: false;
|
|
53
|
+
code: "not_found" | "invalid_request";
|
|
54
|
+
message: string;
|
|
55
|
+
};
|
|
56
|
+
/** Whether this event may be moved at all, whoever asks — the helper's `get_event` answer in, the bridge's event (or the refusal) out. */
|
|
57
|
+
export declare function checkMovable(helperEvent: unknown): MoveCheck;
|
|
58
|
+
/** One line a person reads before confirming. With others: who sees the new time. Without: no warning. */
|
|
59
|
+
export declare function describeMove(e: BridgeEvent, to: MoveRequest, others: Participant[]): string;
|
package/dist/move.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// `move_event` — the pure half of `POST /events/move` (design-build-plan
|
|
2
|
+
// §2.11 "Move a meeting", B10; ticket T2-12). Pure: no socket, no clock, no
|
|
3
|
+
// token store — index.ts owns those — so every rule below is tested on every
|
|
4
|
+
// platform CI runs on.
|
|
5
|
+
//
|
|
6
|
+
// Moving a meeting changes other people's day, so the bridge — not a prompt,
|
|
7
|
+
// not the caller — decides who may confirm one:
|
|
8
|
+
//
|
|
9
|
+
// * **An event with nobody else in it** moves on any confirm the bridge's
|
|
10
|
+
// own bearer carries. The owner's focus block is theirs to shift, and an
|
|
11
|
+
// assistant may shift it after the preview.
|
|
12
|
+
// * **An event with others in it** moves only on a confirm that ALSO
|
|
13
|
+
// carries the owner-door token (`Metistry-Owner-Door`), a second secret
|
|
14
|
+
// only the console's owner door holds. The assistant reaches this bridge
|
|
15
|
+
// with the bearer alone, so its own confirm of such a move is refused
|
|
16
|
+
// here, whatever it was told — and the preview says, before anyone
|
|
17
|
+
// confirms, who would see the new time.
|
|
18
|
+
// * **"Others" is counted fail-closed**: every participant EventKit does
|
|
19
|
+
// not mark as the owner, of any kind (a room is someone's booking too),
|
|
20
|
+
// plus an organizer who is not the owner.
|
|
21
|
+
// * **The confirm is for the event as previewed.** The token binds the
|
|
22
|
+
// request (id, new start, new end) and a fingerprint of the event as it
|
|
23
|
+
// stood — its times, who is in it, who organises it. A confirm after any
|
|
24
|
+
// of those changed is `409`: the preview the owner agreed to is no longer
|
|
25
|
+
// the truth.
|
|
26
|
+
//
|
|
27
|
+
// Never the invite body: the helper's `get_event` never reads it, and
|
|
28
|
+
// `bridgeEvent` drops it if one arrives.
|
|
29
|
+
import { bridgeEvent } from "./events.js";
|
|
30
|
+
/** The header a confirm carries the owner-door token in. Never a body field: the payload a confirm token binds is the move, not who is asking. */
|
|
31
|
+
export const OWNER_DOOR_HEADER = "metistry-owner-door";
|
|
32
|
+
/** events.ts's occurrence keys and the console's meeting-note door's bound: an id longer than this is refused, never cut. */
|
|
33
|
+
export const MOVE_EVENT_ID_MAX = 1024; // limit: fixed — the meeting-note door's EVENT_ID_MAX; longer than any calendar's id
|
|
34
|
+
const BODY_FIELDS = new Set(["event_id", "start", "end", "confirm_token"]);
|
|
35
|
+
/** An instant as the helper reads it: `2026-09-28T14:00:00Z`. Null for anything `Date` cannot read. */
|
|
36
|
+
export function canonicalInstant(v) {
|
|
37
|
+
if (typeof v !== "string" || v.trim() === "")
|
|
38
|
+
return null;
|
|
39
|
+
const t = Date.parse(v);
|
|
40
|
+
if (Number.isNaN(t))
|
|
41
|
+
return null;
|
|
42
|
+
return new Date(Math.floor(t / 1000) * 1000).toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
43
|
+
}
|
|
44
|
+
/** The body of `POST /events/move`: exactly `{event_id, start, end, confirm_token?}`. */
|
|
45
|
+
export function parseMove(body) {
|
|
46
|
+
if (body === null || typeof body !== "object" || Array.isArray(body))
|
|
47
|
+
return { ok: false, message: "the body is {event_id, start, end} and, to confirm, confirm_token" };
|
|
48
|
+
const b = body;
|
|
49
|
+
const extra = Object.keys(b).filter((k) => !BODY_FIELDS.has(k));
|
|
50
|
+
if (extra.length > 0)
|
|
51
|
+
return { ok: false, message: `unknown field${extra.length > 1 ? "s" : ""} ${extra.join(", ")} — a move is {event_id, start, end, confirm_token?}` };
|
|
52
|
+
const id = b.event_id;
|
|
53
|
+
if (typeof id !== "string" || id === "" || id !== id.trim() || id.length > MOVE_EVENT_ID_MAX || /[\u0000-\u001f\u007f]/.test(id)) {
|
|
54
|
+
return { ok: false, message: `event_id is the event's key exactly as GET /events serves it — at most ${MOVE_EVENT_ID_MAX} characters, no surrounding space, no control characters` };
|
|
55
|
+
}
|
|
56
|
+
const start = canonicalInstant(b.start);
|
|
57
|
+
const end = canonicalInstant(b.end);
|
|
58
|
+
if (start === null || end === null)
|
|
59
|
+
return { ok: false, message: "start and end are ISO 8601 instants" };
|
|
60
|
+
if (Date.parse(end) <= Date.parse(start))
|
|
61
|
+
return { ok: false, message: "end is after start" };
|
|
62
|
+
const token = b.confirm_token;
|
|
63
|
+
if (token !== undefined && (typeof token !== "string" || token === ""))
|
|
64
|
+
return { ok: false, message: "confirm_token is the string the preview returned" };
|
|
65
|
+
return { ok: true, move: { event_id: id, start, end }, confirmToken: typeof token === "string" ? token : null };
|
|
66
|
+
}
|
|
67
|
+
/** The move as one string, fields in a fixed order — what a confirm token binds. Key order in the request body never matters. */
|
|
68
|
+
export function moveKey(m) {
|
|
69
|
+
return JSON.stringify([m.event_id, m.start, m.end]);
|
|
70
|
+
}
|
|
71
|
+
/** Everyone in the event who is not the owner — the people a move re-times. Fail-closed: every kind counts, and an organizer who is not the owner counts once. */
|
|
72
|
+
export function othersIn(e) {
|
|
73
|
+
const others = e.participants.filter((p) => !p.self);
|
|
74
|
+
const org = e.organizer;
|
|
75
|
+
if (org && !org.self) {
|
|
76
|
+
const listed = others.some((p) => (org.email !== null && p.email !== null ? p.email.toLowerCase() === org.email.toLowerCase() : p.name !== null && p.name === org.name));
|
|
77
|
+
if (!listed)
|
|
78
|
+
others.push(org);
|
|
79
|
+
}
|
|
80
|
+
return others;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* What the owner saw when they previewed: the event's times, who is in it,
|
|
84
|
+
* and who organises it (not their answers — Dana accepting is no reason to
|
|
85
|
+
* preview again). A confirm is for this; if any
|
|
86
|
+
* of it has changed, the confirm is refused (`409`), never applied to an
|
|
87
|
+
* event the owner has not looked at.
|
|
88
|
+
*/
|
|
89
|
+
export function eventFingerprint(e) {
|
|
90
|
+
const who = (p) => [p.email?.toLowerCase() ?? null, p.name, p.self, p.type];
|
|
91
|
+
const people = e.participants.map(who).map((x) => JSON.stringify(x)).sort();
|
|
92
|
+
return JSON.stringify([e.event_id, e.start, e.end, e.all_day, people, e.organizer ? who(e.organizer) : null]);
|
|
93
|
+
}
|
|
94
|
+
/** The event as a preview and a confirm show it: never the invite body (bridgeEvent drops it). */
|
|
95
|
+
export function movedView(e) {
|
|
96
|
+
return {
|
|
97
|
+
event_id: e.event_id,
|
|
98
|
+
title: e.title,
|
|
99
|
+
start: e.start,
|
|
100
|
+
end: e.end,
|
|
101
|
+
all_day: e.all_day,
|
|
102
|
+
calendar: e.calendar,
|
|
103
|
+
participants: e.participants,
|
|
104
|
+
organizer: e.organizer,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Whether this event may be moved at all, whoever asks — the helper's `get_event` answer in, the bridge's event (or the refusal) out. */
|
|
108
|
+
export function checkMovable(helperEvent) {
|
|
109
|
+
if (helperEvent === null || helperEvent === undefined || typeof helperEvent !== "object") {
|
|
110
|
+
return { ok: false, code: "not_found", message: "no calendar on this Mac holds an event with this key — it may have been deleted, or it recurs and was moved more than a month from its original date" };
|
|
111
|
+
}
|
|
112
|
+
const h = helperEvent;
|
|
113
|
+
const event = bridgeEvent(h);
|
|
114
|
+
if (h.writable === false)
|
|
115
|
+
return { ok: false, code: "invalid_request", message: `the calendar "${event.calendar}" is read-only — move it where it is subscribed` };
|
|
116
|
+
return { ok: true, event, others: othersIn(event) };
|
|
117
|
+
}
|
|
118
|
+
/** One line a person reads before confirming. With others: who sees the new time. Without: no warning. */
|
|
119
|
+
export function describeMove(e, to, others) {
|
|
120
|
+
const base = `move "${e.title}" from ${e.start} → ${e.end} to ${to.start} → ${to.end}`;
|
|
121
|
+
if (others.length === 0)
|
|
122
|
+
return `${base}; nobody else is in it`;
|
|
123
|
+
const names = others.map((p) => p.name ?? p.email ?? "someone").slice(0, 5);
|
|
124
|
+
const more = others.length > names.length ? ` and ${others.length - names.length} more` : "";
|
|
125
|
+
return `${base}; ${others.length === 1 ? "1 other person" : `${others.length} others`} in it will see the new time: ${names.join(", ")}${more}`;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=move.js.map
|
package/dist/move.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.js","sourceRoot":"","sources":["../src/move.ts"],"names":[],"mappings":"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"}
|
package/manifest.yaml
CHANGED
|
@@ -6,7 +6,7 @@ transport: http
|
|
|
6
6
|
port: 7811
|
|
7
7
|
runs_on: host # TCC-bound: its own launchd service is its own responsible process (PoC-1)
|
|
8
8
|
requires_tcc: [calendars, reminders]
|
|
9
|
-
discovery: eager #
|
|
9
|
+
discovery: eager # 5 tools — under the PoC-17 lazy threshold
|
|
10
10
|
degrades: absent # router stops offering calendar when the Mac is away
|
|
11
11
|
exposes:
|
|
12
12
|
- name: list_events
|
|
@@ -19,3 +19,11 @@ exposes:
|
|
|
19
19
|
- name: create_reminder
|
|
20
20
|
description: Create a reminder — preview-then-confirm
|
|
21
21
|
destructive: true
|
|
22
|
+
- name: move_event
|
|
23
|
+
description: >-
|
|
24
|
+
Move one event (this occurrence only) to a new start and end —
|
|
25
|
+
preview-then-confirm; the preview names who is in it and the new time.
|
|
26
|
+
A confirm for an event with others in it is refused unless it carries
|
|
27
|
+
the owner-door token (Metistry-Owner-Door), which only the console's
|
|
28
|
+
owner door holds
|
|
29
|
+
destructive: true
|
package/package.json
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foldedspacelabs/metistry-mcp-eventkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1",
|
|
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
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/foldedspacelabs/metistry.git",
|
|
9
|
+
"directory": "packages/mcp-eventkit"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/foldedspacelabs/metistry/tree/main/packages/mcp-eventkit",
|
|
12
|
+
"bugs": "https://github.com/foldedspacelabs/metistry/issues",
|
|
6
13
|
"type": "module",
|
|
7
14
|
"main": "./dist/index.js",
|
|
8
15
|
"types": "./dist/index.d.ts",
|
|
@@ -21,12 +28,12 @@
|
|
|
21
28
|
"darwin"
|
|
22
29
|
],
|
|
23
30
|
"dependencies": {
|
|
24
|
-
"@foldedspacelabs/metistry-core": "0.
|
|
31
|
+
"@foldedspacelabs/metistry-core": "0.15.1"
|
|
25
32
|
},
|
|
26
33
|
"devDependencies": {
|
|
27
|
-
"@types/node": "^
|
|
34
|
+
"@types/node": "^26.6.2",
|
|
28
35
|
"typescript": "^7.0.2",
|
|
29
|
-
"vitest": "^
|
|
36
|
+
"vitest": "^5.0.1"
|
|
30
37
|
},
|
|
31
38
|
"scripts": {
|
|
32
39
|
"build": "tsc -p tsconfig.json",
|