| import type { AppContext } from "@api/ai/agents/config/shared"; |
| import { db } from "@midday/db/client"; |
| import { getTimerStatus } from "@midday/db/queries"; |
| import { getAppUrl } from "@midday/utils/envs"; |
| import { formatDate } from "@midday/utils/format"; |
| import { tool } from "ai"; |
| import { formatDistance } from "date-fns"; |
| import { z } from "zod"; |
|
|
| const getTimerStatusSchema = z.object({ |
| assignedId: z.string().nullable().optional().describe("User ID"), |
| }); |
|
|
| export const getTimerStatusTool = tool({ |
| description: |
| "Get current timer status - shows if timer is running and elapsed time.", |
| inputSchema: getTimerStatusSchema, |
| execute: async function* ({ assignedId }, executionOptions) { |
| const appContext = executionOptions.experimental_context as AppContext; |
| const teamId = appContext.teamId as string; |
| const userId = assignedId || appContext.userId || null; |
|
|
| if (!teamId) { |
| yield { |
| text: "Unable to get timer status: Team ID not found in context.", |
| }; |
| return; |
| } |
|
|
| try { |
| const status = await getTimerStatus(db, { |
| teamId, |
| assignedId: userId, |
| }); |
|
|
| if (!status.isRunning || !status.currentEntry) { |
| yield { |
| text: "No timer is currently running.", |
| }; |
| return; |
| } |
|
|
| const start = new Date(0); |
| const end = new Date(status.elapsedTime * 1000); |
| const formattedElapsed = formatDistance(start, end, { |
| includeSeconds: false, |
| }); |
| const startTime = status.currentEntry.start |
| ? formatDate(status.currentEntry.start, "HH:mm") |
| : "N/A"; |
|
|
| const response = `Timer is running!\n\n**Project:** ${status.currentEntry.trackerProject?.name || "Unknown"}\n**Started at:** ${startTime}\n**Elapsed time:** ${formattedElapsed}\n**Description:** ${status.currentEntry.description || "None"}`; |
|
|
| yield { |
| text: response, |
| link: { |
| text: "View tracker", |
| url: `${getAppUrl()}/tracker`, |
| }, |
| }; |
| } catch (error) { |
| yield { |
| text: `Failed to get timer status: ${error instanceof Error ? error.message : "Unknown error"}`, |
| }; |
| } |
| }, |
| }); |
|
|