feat(tools): add Google Calendar tools and register Gmail/GCal in daemon

Add calendar.today, calendar.list, calendar.search tools mirroring the
Gmail tool pattern. Includes gcal-auth CLI command, config schema, tool
policy entries (messaging/coding profiles + group:gcal), and 17 tests.
Also wires up gmail and gcal tool registration in the daemon and TUI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
William Valentin
2026-02-10 11:40:53 -08:00
parent 4cc29f534a
commit 94264e848c
11 changed files with 1386 additions and 2 deletions
+9
View File
@@ -167,10 +167,18 @@ const heartbeatSchema = z.object({
disk_threshold_mb: z.number().min(10).default(100),
}).default({});
const gcalSchema = z.object({
enabled: z.boolean().default(false),
credentials_file: z.string().optional(),
token_file: z.string().default('~/.config/flynn/gcal-token.json'),
calendar_ids: z.array(z.string()).default(['primary']),
}).optional();
const automationSchema = z.object({
cron: z.array(cronJobSchema).default([]),
webhooks: z.array(webhookSchema).default([]),
gmail: gmailSchema,
gcal: gcalSchema,
heartbeat: heartbeatSchema,
}).default({});
@@ -408,5 +416,6 @@ export type HeartbeatConfig = z.infer<typeof heartbeatSchema>;
export type HeartbeatCheck = z.infer<typeof heartbeatCheckSchema>;
export type EmbeddingConfig = z.infer<typeof embeddingSchema>;
export type EmbeddingProvider = z.infer<typeof embeddingProviderSchema>;
export type GcalConfig = z.infer<typeof gcalSchema>;
export type PairingCodeConfig = z.infer<typeof pairingSchema>;
export type LogLevel = z.infer<typeof logLevelSchema>;