From d2df7331e36f2006f8d701fddfb43b6f2ed8a493 Mon Sep 17 00:00:00 2001 From: Natalie Date: Thu, 21 May 2026 17:21:30 -0700 Subject: [PATCH] =?UTF-8?q?feat(@messenger):=20=E2=9C=A8=20add=20status=20?= =?UTF-8?q?constants=20for=20send-queue=20tools?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- imessage-mcp/src/send-queue-status.ts | 25 +++++++++++++++++++++ imessage-mcp/src/tools/cancel-message.ts | 17 +++++++------- imessage-mcp/src/tools/check-send-status.ts | 9 ++++---- imessage-mcp/src/tools/send-message.ts | 6 +++-- 4 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 imessage-mcp/src/send-queue-status.ts diff --git a/imessage-mcp/src/send-queue-status.ts b/imessage-mcp/src/send-queue-status.ts new file mode 100644 index 0000000..3d2ace7 --- /dev/null +++ b/imessage-mcp/src/send-queue-status.ts @@ -0,0 +1,25 @@ +/** + * Lifecycle states for a `macsync.send_queue` row. + * + * Single source of truth for status strings shared across the send-queue + * tools (send / cancel / check-status). These MUST match the mac-sync server + * contract (`SEND_QUEUE_CONTRACTS.md` in the mac-sync server repo): + * + * - a freshly enqueued row is `'queued'` — the drain endpoint fetches + * `WHERE status = 'queued'`. It is NOT `'pending'`. + * - the device reports results back as `'sent'` or `'failed'`. + * - `cancel` moves a still-`'queued'` row to `'cancelled'`. + * + * Referencing these constants instead of bare string literals makes a typo + * (`SEND_QUEUE_STATUS.PENDING`) a compile error, and lets the enqueue value + * flow through a typed query parameter rather than being inlined into SQL. + */ +export const SEND_QUEUE_STATUS = { + QUEUED: 'queued', + SENT: 'sent', + FAILED: 'failed', + CANCELLED: 'cancelled', +} as const; + +export type SendQueueStatus = + (typeof SEND_QUEUE_STATUS)[keyof typeof SEND_QUEUE_STATUS]; diff --git a/imessage-mcp/src/tools/cancel-message.ts b/imessage-mcp/src/tools/cancel-message.ts index b3fb2cd..17430bc 100644 --- a/imessage-mcp/src/tools/cancel-message.ts +++ b/imessage-mcp/src/tools/cancel-message.ts @@ -1,10 +1,11 @@ import { query } from '../db'; +import { SEND_QUEUE_STATUS, type SendQueueStatus } from '../send-queue-status'; interface CancelMessageParams { pending_message_id: string; } -// Schema: macsync.send_queue. Only rows still in 'pending' state can be +// Schema: macsync.send_queue. Only rows still in 'queued' state can be // cancelled; anything 'sent' or already 'cancelled' is reported back as-is. export async function cancelMessage(params: CancelMessageParams): Promise { const { pending_message_id } = params; @@ -31,22 +32,22 @@ export async function cancelMessage(params: CancelMessageParams): Promise { @@ -44,7 +45,7 @@ export async function checkSendStatus(params: CheckSendStatusParams): Promise { let insertResult; try { + const enqueueStatus: SendQueueStatus = SEND_QUEUE_STATUS.QUEUED; insertResult = await query( `INSERT INTO macsync.send_queue (device_id, to_handle, body, status) - VALUES ($1::uuid, $2, $3, 'pending') + VALUES ($1::uuid, $2, $3, $4) RETURNING id, created_at`, - [deviceId, recipient, markedBody], + [deviceId, recipient, markedBody, enqueueStatus], ); } catch (err) { const msg = err instanceof Error ? err.message : String(err);