{"version":3,"sources":["../../../src/plugins/temporal/plugin.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Temporal Reasoning Plugin for GQP\n * Enables natural language date parsing\n */\n\nimport type {\n    GQPPlugin,\n    GQPField,\n    PluginContext,\n} from \"../../core/types.js\";\n\n/**\n * Temporal plugin configuration\n */\nexport interface TemporalPluginConfig {\n    /** Timezone for date parsing */\n    timezone?: string;\n    /** Custom date patterns */\n    patterns?: Record<string, { start: string; end: string }>;\n    /** Relative date anchors */\n    anchors?: Record<string, string>;\n}\n\n/**\n * Parsed date range\n */\ninterface DateRange {\n    gte?: Date;\n    lte?: Date;\n    eq?: Date;\n}\n\n/**\n * Temporal Reasoning Plugin\n *\n * Parses natural language date expressions into date ranges.\n *\n * @example\n * ```typescript\n * import { GQP } from '@mzhub/gqp';\n * import { TemporalPlugin } from '@mzhub/gqp/temporal';\n *\n * const graph = new GQP({\n *   sources: { db: fromPrisma(prisma) },\n *   plugins: [\n *     new TemporalPlugin({\n *       timezone: 'America/New_York',\n *       patterns: {\n *         'Q1': { start: '01-01', end: '03-31' },\n *         'Q2': { start: '04-01', end: '06-30' }\n *       }\n *     })\n *   ]\n * });\n *\n * // Query with natural language date\n * await graph.handleToolCall({\n *   action: 'query',\n *   node: 'Order',\n *   filters: { createdAt: 'last week' }\n * });\n * ```\n */\nexport class TemporalPlugin implements GQPPlugin {\n    name = \"temporal\";\n    private config: TemporalPluginConfig;\n    private chronoParser: unknown = null;\n\n    constructor(config: TemporalPluginConfig = {}) {\n        this.config = {\n            timezone: \"UTC\",\n            ...config,\n        };\n    }\n\n    /**\n     * Initialize plugin - try to load chrono-node\n     */\n    async onInit(): Promise<void> {\n        try {\n            const chrono = (await import(\"chrono-node\" as any)) as any;\n            this.chronoParser = chrono;\n        } catch {\n            // chrono-node not available, use built-in parser\n            this.chronoParser = null;\n        }\n    }\n\n    /**\n     * Translate filter values for DateTime fields\n     */\n    translateFilter(\n        field: GQPField,\n        value: unknown,\n        _context: PluginContext\n    ): unknown | null {\n        // Only handle DateTime fields\n        if (field.type !== \"DateTime\") {\n            return null;\n        }\n\n        // Only handle string values (natural language)\n        if (typeof value !== \"string\") {\n            return null;\n        }\n\n        // Check for custom patterns first\n        const customRange = this.matchCustomPattern(value);\n        if (customRange) {\n            return customRange;\n        }\n\n        // Parse with chrono if available\n        if (this.chronoParser) {\n            return this.parseWithChrono(value);\n        }\n\n        // Fall back to built-in parsing\n        return this.parseBuiltIn(value);\n    }\n\n    /**\n     * Match custom patterns (Q1, Q2, fiscal year, etc.)\n     */\n    private matchCustomPattern(value: string): DateRange | null {\n        if (!this.config.patterns) return null;\n\n        const lowerValue = value.toLowerCase().trim();\n        const year = new Date().getFullYear();\n\n        for (const [pattern, range] of Object.entries(this.config.patterns)) {\n            if (lowerValue.includes(pattern.toLowerCase())) {\n                // Extract year if mentioned\n                const yearMatch = lowerValue.match(/\\d{4}/);\n                const targetYear = yearMatch ? parseInt(yearMatch[0]) : year;\n\n                return {\n                    gte: new Date(`${targetYear}-${range.start}T00:00:00Z`),\n                    lte: new Date(`${targetYear}-${range.end}T23:59:59Z`),\n                };\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Parse with chrono-node\n     */\n    private parseWithChrono(value: string): DateRange | null {\n        const chrono = this.chronoParser as {\n            parse: (text: string, ref?: Date) => Array<{\n                start: { date: () => Date };\n                end?: { date: () => Date };\n            }>;\n        };\n\n        const results = chrono.parse(value, new Date());\n        if (results.length === 0) return null;\n\n        const result = results[0];\n\n        if (result.end) {\n            // Range expression (\"last week\", \"from Monday to Friday\")\n            return {\n                gte: result.start.date(),\n                lte: result.end.date(),\n            };\n        }\n\n        // Single date expression (\"yesterday\", \"on Monday\")\n        const date = result.start.date();\n        return {\n            gte: this.startOfDay(date),\n            lte: this.endOfDay(date),\n        };\n    }\n\n    /**\n     * Built-in natural language date parser\n     */\n    private parseBuiltIn(value: string): DateRange | null {\n        const now = new Date();\n        const lowerValue = value.toLowerCase().trim();\n\n        // Today\n        if (lowerValue === \"today\") {\n            return {\n                gte: this.startOfDay(now),\n                lte: this.endOfDay(now),\n            };\n        }\n\n        // Yesterday\n        if (lowerValue === \"yesterday\") {\n            const yesterday = new Date(now);\n            yesterday.setDate(yesterday.getDate() - 1);\n            return {\n                gte: this.startOfDay(yesterday),\n                lte: this.endOfDay(yesterday),\n            };\n        }\n\n        // Last N days/weeks/months\n        const lastMatch = lowerValue.match(\n            /last\\s+(\\d+)?\\s*(day|days|week|weeks|month|months)/\n        );\n        if (lastMatch) {\n            const count = lastMatch[1] ? parseInt(lastMatch[1]) : 1;\n            const unit = lastMatch[2];\n\n            const start = new Date(now);\n            if (unit.startsWith(\"day\")) {\n                start.setDate(start.getDate() - count);\n            } else if (unit.startsWith(\"week\")) {\n                start.setDate(start.getDate() - count * 7);\n            } else if (unit.startsWith(\"month\")) {\n                start.setMonth(start.getMonth() - count);\n            }\n\n            return {\n                gte: this.startOfDay(start),\n                lte: this.endOfDay(now),\n            };\n        }\n\n        // This week\n        if (lowerValue === \"this week\") {\n            const start = new Date(now);\n            const dayOfWeek = start.getDay();\n            start.setDate(start.getDate() - dayOfWeek);\n            return {\n                gte: this.startOfDay(start),\n                lte: this.endOfDay(now),\n            };\n        }\n\n        // Last week\n        if (lowerValue === \"last week\") {\n            const end = new Date(now);\n            const dayOfWeek = end.getDay();\n            end.setDate(end.getDate() - dayOfWeek - 1);\n\n            const start = new Date(end);\n            start.setDate(start.getDate() - 6);\n\n            return {\n                gte: this.startOfDay(start),\n                lte: this.endOfDay(end),\n            };\n        }\n\n        // This month\n        if (lowerValue === \"this month\") {\n            const start = new Date(now.getFullYear(), now.getMonth(), 1);\n            return {\n                gte: this.startOfDay(start),\n                lte: this.endOfDay(now),\n            };\n        }\n\n        // Last month\n        if (lowerValue === \"last month\") {\n            const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);\n            const end = new Date(now.getFullYear(), now.getMonth(), 0);\n            return {\n                gte: this.startOfDay(start),\n                lte: this.endOfDay(end),\n            };\n        }\n\n        // This year\n        if (lowerValue === \"this year\") {\n            const start = new Date(now.getFullYear(), 0, 1);\n            return {\n                gte: this.startOfDay(start),\n                lte: this.endOfDay(now),\n            };\n        }\n\n        // Specific date (YYYY-MM-DD)\n        const dateMatch = lowerValue.match(/(\\d{4})-(\\d{2})-(\\d{2})/);\n        if (dateMatch) {\n            const date = new Date(`${dateMatch[0]}T00:00:00Z`);\n            return {\n                gte: this.startOfDay(date),\n                lte: this.endOfDay(date),\n            };\n        }\n\n        // Unable to parse\n        return null;\n    }\n\n    /**\n     * Get start of day\n     */\n    private startOfDay(date: Date): Date {\n        const result = new Date(date);\n        result.setHours(0, 0, 0, 0);\n        return result;\n    }\n\n    /**\n     * Get end of day\n     */\n    private endOfDay(date: Date): Date {\n        const result = new Date(date);\n        result.setHours(23, 59, 59, 999);\n        return result;\n    }\n}\n\n/**\n * Factory function\n */\nexport function createTemporalPlugin(\n    config: TemporalPluginConfig = {}\n): TemporalPlugin {\n    return new TemporalPlugin(config);\n}\n"]}