@datasynx/agentic-crm 0.1.0
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/LICENSE +21 -0
- package/README.md +767 -0
- package/dist/agent-config-zPvcqu07.js +14 -0
- package/dist/agent-config-zPvcqu07.js.map +1 -0
- package/dist/approvals-DpjxGHFp.js +67 -0
- package/dist/approvals-DpjxGHFp.js.map +1 -0
- package/dist/ask-CID3jnuL.js +52 -0
- package/dist/ask-CID3jnuL.js.map +1 -0
- package/dist/audit-log-DNMY9mUZ.js +49 -0
- package/dist/audit-log-DNMY9mUZ.js.map +1 -0
- package/dist/auth-CyFuu9X_.js +2 -0
- package/dist/auth-DFWwWcYD.js +93 -0
- package/dist/auth-DFWwWcYD.js.map +1 -0
- package/dist/autofill-Di_-SP7t.js +51 -0
- package/dist/autofill-Di_-SP7t.js.map +1 -0
- package/dist/backup-CeMk9z86.js +417 -0
- package/dist/backup-CeMk9z86.js.map +1 -0
- package/dist/backup-f_hC7rBV.js +2 -0
- package/dist/calendly-Bft_wwji.js +52 -0
- package/dist/calendly-Bft_wwji.js.map +1 -0
- package/dist/calendly-D3coO92o.cjs +53 -0
- package/dist/calendly-D3coO92o.cjs.map +1 -0
- package/dist/chunk-DakpK96I.cjs +43 -0
- package/dist/churn-C28IgnAj.js +54 -0
- package/dist/churn-C28IgnAj.js.map +1 -0
- package/dist/cli.js +4396 -0
- package/dist/cli.js.map +1 -0
- package/dist/colors-BG07TZQz.js +11 -0
- package/dist/colors-BG07TZQz.js.map +1 -0
- package/dist/compliance-B1kk5-YS.js +115 -0
- package/dist/compliance-B1kk5-YS.js.map +1 -0
- package/dist/compliance-B91zNvCR.cjs +156 -0
- package/dist/compliance-B91zNvCR.cjs.map +1 -0
- package/dist/compliance-CKSBoQUe.js +118 -0
- package/dist/compliance-CKSBoQUe.js.map +1 -0
- package/dist/compliance-CujOqAKk.js +2 -0
- package/dist/context-builder-BzWAp3Zs.js +96 -0
- package/dist/context-builder-BzWAp3Zs.js.map +1 -0
- package/dist/context-builder-DlrRcqmJ.js +2 -0
- package/dist/conversation-intel-mm7Lhemh.js +72 -0
- package/dist/conversation-intel-mm7Lhemh.js.map +1 -0
- package/dist/custom-fields-CzNeD3_v.js +2 -0
- package/dist/custom-fields-Pl2t9xzp.js +73 -0
- package/dist/custom-fields-Pl2t9xzp.js.map +1 -0
- package/dist/custom-objects-BHgn1GEX.js +78 -0
- package/dist/custom-objects-BHgn1GEX.js.map +1 -0
- package/dist/custom-objects-CIFrmQ2V.js +2 -0
- package/dist/customer-dir-DIylZ8Q6.js +75 -0
- package/dist/customer-dir-DIylZ8Q6.js.map +1 -0
- package/dist/daemon/worker.js +207 -0
- package/dist/daemon/worker.js.map +1 -0
- package/dist/enrichment-3XvgGDfB.js +103 -0
- package/dist/enrichment-3XvgGDfB.js.map +1 -0
- package/dist/file-lock-B_zi7NQl.js +22 -0
- package/dist/file-lock-B_zi7NQl.js.map +1 -0
- package/dist/gmail-auth-BP6cJwfw.js +40 -0
- package/dist/gmail-auth-BP6cJwfw.js.map +1 -0
- package/dist/gmail-auth-DxakCtGm.cjs +44 -0
- package/dist/gmail-auth-DxakCtGm.cjs.map +1 -0
- package/dist/gmail-auth-OComS92L.js +40 -0
- package/dist/gmail-auth-OComS92L.js.map +1 -0
- package/dist/gmail-push-watch-DELQFMPk.js +20 -0
- package/dist/gmail-push-watch-DELQFMPk.js.map +1 -0
- package/dist/gmail-sender-StTpJ9Ub.js +32 -0
- package/dist/gmail-sender-StTpJ9Ub.js.map +1 -0
- package/dist/gmail-sync-DIaxInDT.js +204 -0
- package/dist/gmail-sync-DIaxInDT.js.map +1 -0
- package/dist/gmail-sync-hHm9gaWd.cjs +218 -0
- package/dist/gmail-sync-hHm9gaWd.cjs.map +1 -0
- package/dist/gmail-sync-rQaVqKWd.js +214 -0
- package/dist/gmail-sync-rQaVqKWd.js.map +1 -0
- package/dist/gmail-webhook-handler-DS7OlRPX.js +3 -0
- package/dist/gmail-webhook-handler-e5Od25FX.js +97 -0
- package/dist/gmail-webhook-handler-e5Od25FX.js.map +1 -0
- package/dist/goal-engine-CUZSpERI.js +2 -0
- package/dist/goal-engine-KpBftn4V.js +295 -0
- package/dist/goal-engine-KpBftn4V.js.map +1 -0
- package/dist/google-drive-sync-DEPcqFca.js +105 -0
- package/dist/google-drive-sync-DEPcqFca.js.map +1 -0
- package/dist/hybrid-search-BmHttLrR.js +40 -0
- package/dist/hybrid-search-BmHttLrR.js.map +1 -0
- package/dist/hygiene-DZqfYpFf.js +38 -0
- package/dist/hygiene-DZqfYpFf.js.map +1 -0
- package/dist/identity-CI6olMNm.js +41 -0
- package/dist/identity-CI6olMNm.js.map +1 -0
- package/dist/identity-gyfWdrcX.js +2 -0
- package/dist/import-hubspot-BaK71U_K.js +588 -0
- package/dist/import-hubspot-BaK71U_K.js.map +1 -0
- package/dist/index-V8BFaH-b.d.ts +539 -0
- package/dist/index-V8BFaH-b.d.ts.map +1 -0
- package/dist/index-YqwMd6aQ.d.cts +538 -0
- package/dist/index-YqwMd6aQ.d.cts.map +1 -0
- package/dist/index.cjs +185 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +538 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +539 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/dist/interactions-writer-CrPStUll.cjs +77 -0
- package/dist/interactions-writer-CrPStUll.cjs.map +1 -0
- package/dist/interactions-writer-DO3KcSR3.js +52 -0
- package/dist/interactions-writer-DO3KcSR3.js.map +1 -0
- package/dist/interactions-writer-SLHnoEeE.js +46 -0
- package/dist/interactions-writer-SLHnoEeE.js.map +1 -0
- package/dist/interactions-writer-dSPy1XfO.js +2 -0
- package/dist/knowledge-base-D0Fh40kc.js +1013 -0
- package/dist/knowledge-base-D0Fh40kc.js.map +1 -0
- package/dist/lancedb-CCBbpulq.js +2 -0
- package/dist/lancedb-rlvWoPwl.js +98 -0
- package/dist/lancedb-rlvWoPwl.js.map +1 -0
- package/dist/lead-model-BCFzyktm.js +109 -0
- package/dist/lead-model-BCFzyktm.js.map +1 -0
- package/dist/llm-DEjWcqmW.js +2 -0
- package/dist/llm-DvzZqva0.js +372 -0
- package/dist/llm-DvzZqva0.js.map +1 -0
- package/dist/llm-Z8RIYkpF.js +174 -0
- package/dist/llm-Z8RIYkpF.js.map +1 -0
- package/dist/llm-iijeXmgq.cjs +198 -0
- package/dist/llm-iijeXmgq.cjs.map +1 -0
- package/dist/mcp-CdTJWTJf.d.cts +12 -0
- package/dist/mcp-CdTJWTJf.d.cts.map +1 -0
- package/dist/mcp-CdTJWTJf.d.ts +12 -0
- package/dist/mcp-CdTJWTJf.d.ts.map +1 -0
- package/dist/mcp.cjs +7464 -0
- package/dist/mcp.cjs.map +1 -0
- package/dist/mcp.d.cts +12 -0
- package/dist/mcp.d.cts.map +1 -0
- package/dist/mcp.d.ts +12 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +7448 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory-Bb6ky3kb.js +58 -0
- package/dist/memory-Bb6ky3kb.js.map +1 -0
- package/dist/memory-Cy6-Tbyl.js +2 -0
- package/dist/metrics-DH8wHvya.js +26 -0
- package/dist/metrics-DH8wHvya.js.map +1 -0
- package/dist/microsoft-auth-B8_S45gh.js +17 -0
- package/dist/microsoft-auth-B8_S45gh.js.map +1 -0
- package/dist/microsoft-calendar-B6MMtUQK.js +67 -0
- package/dist/microsoft-calendar-B6MMtUQK.js.map +1 -0
- package/dist/microsoft-sync-CpZVoSuq.js +68 -0
- package/dist/microsoft-sync-CpZVoSuq.js.map +1 -0
- package/dist/nba-3wanmJ0U.js +48 -0
- package/dist/nba-3wanmJ0U.js.map +1 -0
- package/dist/notification-dispatcher-0vYNngWe.js +97 -0
- package/dist/notification-dispatcher-0vYNngWe.js.map +1 -0
- package/dist/opportunity-score-BTMOQSTV.js +47 -0
- package/dist/opportunity-score-BTMOQSTV.js.map +1 -0
- package/dist/pipedrive-client-CdGKpH9b.js +17 -0
- package/dist/pipedrive-client-CdGKpH9b.js.map +1 -0
- package/dist/pipeline-writer-BqBrYrQc.js +2 -0
- package/dist/pipeline-writer-BvVquKIe.js +96 -0
- package/dist/pipeline-writer-BvVquKIe.js.map +1 -0
- package/dist/pipeline-writer-N2omexxp.cjs +121 -0
- package/dist/pipeline-writer-N2omexxp.cjs.map +1 -0
- package/dist/pipeline-writer-eufx_0o1.js +102 -0
- package/dist/pipeline-writer-eufx_0o1.js.map +1 -0
- package/dist/proactive-agent-BgQXw3ac.js +96 -0
- package/dist/proactive-agent-BgQXw3ac.js.map +1 -0
- package/dist/proactive-worker-BrLHNhjH.js +229 -0
- package/dist/proactive-worker-BrLHNhjH.js.map +1 -0
- package/dist/push-manager-CdqIIkuh.js +108 -0
- package/dist/push-manager-CdqIIkuh.js.map +1 -0
- package/dist/push-manager-CowY-0IK.js +2 -0
- package/dist/quote-generator-BfwENXzg.js +133 -0
- package/dist/quote-generator-BfwENXzg.js.map +1 -0
- package/dist/quote-generator-OhSFsi3x.js +2 -0
- package/dist/rbac-C7c8tcES.js +2 -0
- package/dist/rbac-CTIktZaC.js +91 -0
- package/dist/rbac-CTIktZaC.js.map +1 -0
- package/dist/relationship-health-odxEoQdJ.js +454 -0
- package/dist/relationship-health-odxEoQdJ.js.map +1 -0
- package/dist/revenue-simulation-BJdRTEHc.js +2 -0
- package/dist/revenue-simulation-Bqf2DLVB.js +251 -0
- package/dist/revenue-simulation-Bqf2DLVB.js.map +1 -0
- package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/salesforce-client-rhZFa_p5.js +51 -0
- package/dist/salesforce-client-rhZFa_p5.js.map +1 -0
- package/dist/segments-BqcD5HIl.js +61 -0
- package/dist/segments-BqcD5HIl.js.map +1 -0
- package/dist/sequence-engine-CCTHEBgi.js +2 -0
- package/dist/sequence-engine-J1lTW_in.js +91 -0
- package/dist/sequence-engine-J1lTW_in.js.map +1 -0
- package/dist/sequence-store-DaaWr0Os.js +221 -0
- package/dist/sequence-store-DaaWr0Os.js.map +1 -0
- package/dist/server-Dyva03K8.js +4287 -0
- package/dist/server-Dyva03K8.js.map +1 -0
- package/dist/session-B9AilxOE.js +81 -0
- package/dist/session-B9AilxOE.js.map +1 -0
- package/dist/session-D0qFkBla.cjs +82 -0
- package/dist/session-D0qFkBla.cjs.map +1 -0
- package/dist/session-D9ub6Wl1.js +79 -0
- package/dist/session-D9ub6Wl1.js.map +1 -0
- package/dist/session-mWHA71Lw.js +2 -0
- package/dist/session-store-B0QZE8Bx.cjs +697 -0
- package/dist/session-store-B0QZE8Bx.cjs.map +1 -0
- package/dist/session-store-C8tEvMPw.js +543 -0
- package/dist/session-store-C8tEvMPw.js.map +1 -0
- package/dist/session-store-CEa39Dxs.js +15 -0
- package/dist/session-store-CEa39Dxs.js.map +1 -0
- package/dist/sla-engine-5IhTsBUR.js +2 -0
- package/dist/sla-engine-BqX-7u-7.js +53 -0
- package/dist/sla-engine-BqX-7u-7.js.map +1 -0
- package/dist/sop-DkhVChGy.js +2 -0
- package/dist/sop-Vp0UPWFW.js +70 -0
- package/dist/sop-Vp0UPWFW.js.map +1 -0
- package/dist/survey-engine-C06hcQt3.js +2 -0
- package/dist/survey-engine-DBjCYqCv.js +147 -0
- package/dist/survey-engine-DBjCYqCv.js.map +1 -0
- package/dist/sync-state-ChaLbamC.js +33 -0
- package/dist/sync-state-ChaLbamC.js.map +1 -0
- package/dist/sync-state-CwLSt_1m.js +2 -0
- package/dist/ticket-writer-CjqKeIRD.js +2 -0
- package/dist/ticket-writer-j2oX_Wal.js +134 -0
- package/dist/ticket-writer-j2oX_Wal.js.map +1 -0
- package/dist/tone-Bdm5uaht.js +48 -0
- package/dist/tone-Bdm5uaht.js.map +1 -0
- package/dist/tone-DRKlZgPr.cjs +43 -0
- package/dist/tone-DRKlZgPr.cjs.map +1 -0
- package/dist/tone-vNb2DAAD.js +39 -0
- package/dist/tone-vNb2DAAD.js.map +1 -0
- package/dist/transcript-watcher-CL2QUygI.js +132 -0
- package/dist/transcript-watcher-CL2QUygI.js.map +1 -0
- package/dist/unmatched-transcripts-BsH5bhkU.js +26 -0
- package/dist/unmatched-transcripts-BsH5bhkU.js.map +1 -0
- package/dist/unmatched-transcripts-D0PrJ9iz.js +2 -0
- package/dist/update-deal-BNwPGaTV.js +2 -0
- package/dist/update-deal-DKC79skb.js +91 -0
- package/dist/update-deal-DKC79skb.js.map +1 -0
- package/dist/usage-CClTf5e6.cjs +57 -0
- package/dist/usage-CClTf5e6.cjs.map +1 -0
- package/dist/usage-D0-TYJkw.js +93 -0
- package/dist/usage-D0-TYJkw.js.map +1 -0
- package/dist/usage-D0u9a-lV.js +54 -0
- package/dist/usage-D0u9a-lV.js.map +1 -0
- package/dist/vault-C1D3zScD.js +2 -0
- package/dist/vault-DXCg29W-.js +86 -0
- package/dist/vault-DXCg29W-.js.map +1 -0
- package/dist/webhooks-7EpA05Qr.js +138 -0
- package/dist/webhooks-7EpA05Qr.js.map +1 -0
- package/dist/webhooks-BO2UAnmn.js +94 -0
- package/dist/webhooks-BO2UAnmn.js.map +1 -0
- package/dist/webhooks-Xn6zO6kd.cjs +97 -0
- package/dist/webhooks-Xn6zO6kd.cjs.map +1 -0
- package/dist/write-queue-BDolUxfs.cjs +26 -0
- package/dist/write-queue-BDolUxfs.cjs.map +1 -0
- package/dist/write-queue-IbsAjUnh.js +21 -0
- package/dist/write-queue-IbsAjUnh.js.map +1 -0
- package/package.json +142 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-hubspot-BaK71U_K.js","names":[],"sources":["../src/core/csv-stream.ts","../src/fs/contacts-writer.ts","../src/commands/import-hubspot.ts"],"sourcesContent":["import fs from \"fs\";\nimport readline from \"readline\";\n\nexport interface CsvStreamOptions {\n delimiter?: string;\n}\n\nfunction parseCSVLine(line: string, delimiter = \",\"): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (ch === delimiter && !inQuotes) {\n result.push(current.trim());\n current = \"\";\n } else {\n current += ch;\n }\n }\n result.push(current.trim());\n return result;\n}\n\n/** Streaming line-by-line CSV parser — O(1) memory for arbitrarily large files. */\nexport async function* streamCSV(\n filePath: string,\n opts: CsvStreamOptions = {}\n): AsyncGenerator<Record<string, string>> {\n const delimiter = opts.delimiter ?? \",\";\n const stream = fs.createReadStream(filePath, { encoding: \"utf-8\" });\n const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });\n\n let headers: string[] | null = null;\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const values = parseCSVLine(trimmed, delimiter);\n if (!headers) {\n headers = values.map((h) => h.replace(/^\"|\"$/g, \"\").trim());\n continue;\n }\n const row: Record<string, string> = {};\n headers.forEach((h, i) => {\n row[h] = values[i] ?? \"\";\n });\n yield row;\n }\n}\n\n/** Synchronous full-load parser — for small files (<10MB). */\nexport function parseCSVSync(content: string, delimiter = \",\"): Array<Record<string, string>> {\n const lines = content.trim().split(\"\\n\");\n if (lines.length < 2) return [];\n const headers = (lines[0] ?? \"\").split(delimiter).map((h) => h.trim().replace(/^\"|\"$/g, \"\"));\n return lines.slice(1).map((line) => {\n const values = parseCSVLine(line, delimiter);\n const row: Record<string, string> = {};\n headers.forEach((h, i) => {\n row[h] = values[i] ?? \"\";\n });\n return row;\n });\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { z } from \"zod\";\n\nexport const CustomerContactSchema = z.object({\n email: z.string().email(),\n name: z.string().min(1),\n title: z.string().optional(),\n phone: z.string().optional(),\n department: z.string().optional(),\n linkedinUrl: z.string().url().optional(),\n isPrimary: z.boolean().default(false),\n hubspotId: z.string().optional(),\n hubspotOwnerId: z.string().optional(),\n createdAt: z.string().optional(),\n});\n\nexport type CustomerContact = z.infer<typeof CustomerContactSchema>;\n\nfunction contactsPath(dataDir: string, slug: string): string {\n return path.join(dataDir, \"customers\", slug, \"contacts.json\");\n}\n\nexport function listContacts(dataDir: string, slug: string): CustomerContact[] {\n const p = contactsPath(dataDir, slug);\n if (!fs.existsSync(p)) return [];\n try {\n const raw = JSON.parse(fs.readFileSync(p, \"utf-8\") as string) as unknown;\n if (!Array.isArray(raw)) return [];\n return raw.flatMap((item) => {\n const r = CustomerContactSchema.safeParse(item);\n return r.success ? [r.data] : [];\n });\n } catch {\n return [];\n }\n}\n\nexport function upsertContact(dataDir: string, slug: string, contact: CustomerContact): void {\n const contacts = listContacts(dataDir, slug);\n const idx = contacts.findIndex((c) => c.email.toLowerCase() === contact.email.toLowerCase());\n if (idx >= 0) {\n contacts[idx] = { ...contacts[idx], ...contact };\n } else {\n contacts.push(contact);\n }\n // Ensure only one primary\n if (contact.isPrimary) {\n for (const c of contacts) {\n if (c.email.toLowerCase() !== contact.email.toLowerCase()) {\n c.isPrimary = false;\n }\n }\n }\n const dir = path.dirname(contactsPath(dataDir, slug));\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(contactsPath(dataDir, slug), JSON.stringify(contacts, null, 2), \"utf-8\");\n}\n\nexport function getPrimaryContact(dataDir: string, slug: string): CustomerContact | null {\n const contacts = listContacts(dataDir, slug);\n return contacts.find((c) => c.isPrimary) ?? contacts[0] ?? null;\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { createHash } from \"crypto\";\nimport { streamCSV } from \"../core/csv-stream.js\";\nimport { upsertContact } from \"../fs/contacts-writer.js\";\nimport type { PipelineDeal } from \"../schemas/pipeline.js\";\nimport type { InteractionEntry } from \"../schemas/interaction.js\";\n\nexport interface HubSpotImportResult {\n companiesProcessed: number;\n contactsImported: number;\n dealsImported: number;\n engagementsImported: number;\n errors: string[];\n customPropertiesSaved: number;\n ownersResolved: number;\n}\n\nexport interface HubSpotImportOptions {\n dryRun?: boolean;\n ownerMap?: Record<string, string>; // hubspot email → dxcrm actor\n resume?: boolean;\n analyzeOnly?: boolean;\n}\n\nexport interface HubSpotAnalysis {\n companiesFound: number;\n contactsFound: number;\n dealsFound: number;\n engagementsFound: number;\n customPropertiesDetected: string[];\n ownersDetected: string[];\n unknownStages: string[];\n unmappedContacts: number;\n estimatedMinutes: number;\n}\n\n// ─── Stage + Type maps ────────────────────────────────────────────────────────\n\nconst STAGE_MAP: Record<string, PipelineDeal[\"stage\"]> = {\n appointmentscheduled: \"qualified\",\n qualifiedtobuy: \"qualified\",\n presentationscheduled: \"proposal\",\n decisionmakerboughtin: \"negotiation\",\n contractsent: \"negotiation\",\n closedwon: \"won\",\n closedlost: \"lost\",\n // Additional HubSpot stages\n prospecting: \"lead\",\n qualification: \"qualified\",\n proposal: \"proposal\",\n negotiation: \"negotiation\",\n closedwon2: \"won\",\n closedlost2: \"lost\",\n};\n\nconst TYPE_MAP: Record<string, InteractionEntry[\"type\"]> = {\n NOTE: \"Note\",\n CALL: \"Call\",\n EMAIL: \"Email\",\n MEETING: \"Meeting\",\n TASK: \"Note\",\n LINKEDIN_MESSAGE: \"Email\",\n WHATSAPP_MESSAGE: \"Email\",\n POSTAL_MAIL: \"Note\",\n};\n\n// Known HubSpot columns → dxcrm main_facts fields\nconst COMPANY_FIELD_MAP: Record<string, string> = {\n hs_annual_revenue: \"annual_revenue\",\n num_associated_contacts: \"contact_count\",\n industry: \"industry\",\n city: \"city\",\n country: \"country\",\n hs_lead_status: \"lead_status\",\n lifecyclestage: \"lifecycle_stage\",\n numberofemployees: \"employee_count\",\n phone: \"phone\",\n address: \"address\",\n zip: \"zip\",\n state: \"state\",\n};\n\nconst KNOWN_COMPANY_COLUMNS = new Set([\n \"name\",\n \"Name\",\n \"domain\",\n \"Domain\",\n \"website\",\n \"Website\",\n \"phone\",\n \"Phone\",\n \"address\",\n \"Address\",\n \"city\",\n \"City\",\n \"country\",\n \"Country\",\n \"state\",\n \"State\",\n \"zip\",\n \"Zip\",\n \"industry\",\n \"Industry\",\n \"numberofemployees\",\n \"Number of Employees\",\n \"hs_annual_revenue\",\n \"Annual Revenue\",\n \"lifecyclestage\",\n \"Lifecycle Stage\",\n \"hubspot_owner_email\",\n \"HubSpot Owner Email\",\n \"create_date\",\n \"createdate\",\n \"hs_lastmodifieddate\",\n \"hs_object_id\",\n \"Record ID\",\n]);\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60);\n}\n\nfunction hashStr(s: string): string {\n return createHash(\"sha256\").update(s).digest(\"hex\").slice(0, 16);\n}\n\nfunction coerceDate(raw: string): string {\n if (!raw) return new Date().toISOString().slice(0, 10);\n // HubSpot timestamps: \"2026-01-15 14:30:00 UTC\", \"1705318200000\" (ms), \"2026-01-15\"\n if (/^\\d{13}$/.test(raw.trim())) {\n return new Date(parseInt(raw, 10)).toISOString().slice(0, 10);\n }\n const d = new Date(raw.trim());\n if (!isNaN(d.getTime())) return d.toISOString().slice(0, 10);\n return new Date().toISOString().slice(0, 10);\n}\n\n// ─── Customer creation ────────────────────────────────────────────────────────\n\nfunction ensureCustomer(\n dataDir: string,\n name: string,\n domain: string,\n email: string,\n dryRun: boolean\n): { slug: string; created: boolean } {\n const slug = slugify(name || \"unknown\");\n const customerDir = path.join(dataDir, \"customers\", slug);\n const mainFactsPath = path.join(customerDir, \"main_facts.md\");\n if (fs.existsSync(mainFactsPath)) return { slug, created: false };\n if (dryRun) return { slug, created: true };\n\n fs.mkdirSync(customerDir, { recursive: true });\n const today = new Date().toISOString().slice(0, 10);\n const lines = [\n \"---\",\n `name: ${name}`,\n domain ? `domain: ${domain}` : null,\n email ? `email: ${email}` : null,\n \"relationship_stage: prospect\",\n `created: ${today}`,\n `updated: ${today}`,\n `last_touchpoint: ${today}`,\n \"tags: []\",\n \"currency: EUR\",\n \"---\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n fs.writeFileSync(mainFactsPath, `${lines}\\n\\n# Customer: ${name}\\n`, \"utf-8\");\n fs.writeFileSync(\n path.join(customerDir, \"interactions.md\"),\n `# Interactions — ${name}\\n\\n`,\n \"utf-8\"\n );\n fs.writeFileSync(path.join(customerDir, \"pipeline.md\"), `# Pipeline — ${name}\\n\\n`, \"utf-8\");\n fs.writeFileSync(\n path.join(customerDir, \"sources.json\"),\n JSON.stringify(\n {\n gmail: {\n query: domain\n ? `from:${domain} OR to:${domain}`\n : email\n ? `from:${email} OR to:${email}`\n : \"\",\n enabled: true,\n },\n transcripts: { paths: [], extensions: [\".txt\", \".vtt\"], enabled: false },\n },\n null,\n 2\n ),\n \"utf-8\"\n );\n return { slug, created: true };\n}\n\nfunction readMainFactsRaw(dataDir: string, slug: string): string {\n const p = path.join(dataDir, \"customers\", slug, \"main_facts.md\");\n return fs.existsSync(p) ? (fs.readFileSync(p, \"utf-8\") as string) : \"\";\n}\n\nfunction updateMainFactsField(dataDir: string, slug: string, field: string, value: string): void {\n const p = path.join(dataDir, \"customers\", slug, \"main_facts.md\");\n if (!fs.existsSync(p)) return;\n let content = fs.readFileSync(p, \"utf-8\") as string;\n const regex = new RegExp(`^${field}:.*$`, \"m\");\n if (regex.test(content)) {\n content = content.replace(regex, `${field}: ${value}`);\n } else {\n const firstDash = content.indexOf(\"---\");\n const secondDash = content.indexOf(\"---\", firstDash + 3);\n if (secondDash >= 0) {\n content = content.slice(0, secondDash) + `${field}: ${value}\\n` + content.slice(secondDash);\n }\n }\n fs.writeFileSync(p, content, \"utf-8\");\n}\n\n// ─── Custom Properties ────────────────────────────────────────────────────────\n\nfunction saveCustomProperties(dataDir: string, slug: string, props: Record<string, string>): void {\n if (Object.keys(props).length === 0) return;\n const p = path.join(dataDir, \"customers\", slug, \"custom_properties.json\");\n let existing: Record<string, unknown> = {};\n if (fs.existsSync(p)) {\n try {\n existing = JSON.parse(fs.readFileSync(p, \"utf-8\") as string) as Record<string, unknown>;\n } catch {\n existing = {};\n }\n }\n const merged = {\n source: \"hubspot-import\",\n importedAt: new Date().toISOString(),\n properties: { ...((existing[\"properties\"] as Record<string, string>) ?? {}), ...props },\n };\n fs.writeFileSync(p, JSON.stringify(merged, null, 2), \"utf-8\");\n}\n\n// ─── Progress / Resume ────────────────────────────────────────────────────────\n\ninterface ImportProgress {\n importId: string;\n source: string;\n startedAt: string;\n phases: {\n companies: { status: \"done\" | \"in-progress\" | \"pending\"; processed: number };\n contacts: { status: \"done\" | \"in-progress\" | \"pending\"; processed: number };\n deals: { status: \"done\" | \"in-progress\" | \"pending\"; processed: number };\n engagements: { status: \"done\" | \"in-progress\" | \"pending\"; processed: number };\n };\n}\n\nfunction progressPath(dataDir: string): string {\n return path.join(dataDir, \".agentic\", \"import-progress.json\");\n}\n\nfunction readProgress(dataDir: string): ImportProgress | null {\n const p = progressPath(dataDir);\n if (!fs.existsSync(p)) return null;\n try {\n return JSON.parse(fs.readFileSync(p, \"utf-8\") as string) as ImportProgress;\n } catch {\n return null;\n }\n}\n\nfunction writeProgress(dataDir: string, progress: ImportProgress): void {\n fs.mkdirSync(path.dirname(progressPath(dataDir)), { recursive: true });\n fs.writeFileSync(progressPath(dataDir), JSON.stringify(progress, null, 2), \"utf-8\");\n}\n\nfunction clearProgress(dataDir: string): void {\n const p = progressPath(dataDir);\n if (fs.existsSync(p)) fs.unlinkSync(p);\n}\n\n// ─── Analyze ──────────────────────────────────────────────────────────────────\n\nexport async function analyzeHubSpotExport(exportDir: string): Promise<HubSpotAnalysis> {\n const analysis: HubSpotAnalysis = {\n companiesFound: 0,\n contactsFound: 0,\n dealsFound: 0,\n engagementsFound: 0,\n customPropertiesDetected: [],\n ownersDetected: [],\n unknownStages: [],\n unmappedContacts: 0,\n estimatedMinutes: 0,\n };\n\n const customProps = new Set<string>();\n const owners = new Set<string>();\n const unknownStages = new Set<string>();\n const companyNames = new Set<string>();\n\n // Companies\n const companiesPath = path.join(exportDir, \"companies.csv\");\n if (fs.existsSync(companiesPath)) {\n for await (const row of streamCSV(companiesPath)) {\n analysis.companiesFound++;\n const name = (row[\"name\"] ?? row[\"Name\"] ?? \"\").trim();\n if (name) companyNames.add(name.toLowerCase());\n const owner = row[\"hubspot_owner_email\"] ?? row[\"HubSpot Owner Email\"] ?? \"\";\n if (owner) owners.add(owner);\n // Detect custom columns\n for (const key of Object.keys(row)) {\n if (!KNOWN_COMPANY_COLUMNS.has(key) && row[key]) customProps.add(key);\n }\n }\n }\n\n // Contacts\n const contactsPath = path.join(exportDir, \"contacts.csv\");\n if (fs.existsSync(contactsPath)) {\n for await (const row of streamCSV(contactsPath)) {\n analysis.contactsFound++;\n const company = (row[\"company\"] ?? row[\"Company\"] ?? row[\"associated_company\"] ?? \"\").trim();\n if (company && !companyNames.has(company.toLowerCase())) analysis.unmappedContacts++;\n const owner = row[\"contact_owner\"] ?? row[\"Contact Owner\"] ?? \"\";\n if (owner) owners.add(owner);\n }\n }\n\n // Deals\n const dealsPath = path.join(exportDir, \"deals.csv\");\n if (fs.existsSync(dealsPath)) {\n for await (const row of streamCSV(dealsPath)) {\n analysis.dealsFound++;\n const stage = (row[\"dealstage\"] ?? row[\"Deal Stage\"] ?? \"\").trim().toLowerCase();\n if (stage && !STAGE_MAP[stage]) unknownStages.add(stage);\n }\n }\n\n // Engagements\n const engagementsPath = path.join(exportDir, \"engagements.csv\");\n if (fs.existsSync(engagementsPath)) {\n for await (const _row of streamCSV(engagementsPath)) {\n analysis.engagementsFound++;\n }\n }\n\n analysis.customPropertiesDetected = Array.from(customProps).slice(0, 50);\n analysis.ownersDetected = Array.from(owners);\n analysis.unknownStages = Array.from(unknownStages);\n\n const totalRows =\n analysis.companiesFound +\n analysis.contactsFound +\n analysis.dealsFound +\n analysis.engagementsFound;\n analysis.estimatedMinutes = Math.ceil(totalRows / 2000); // ~2000 rows/min\n\n return analysis;\n}\n\n// ─── Main Import ──────────────────────────────────────────────────────────────\n\nexport async function runHubSpotCsvImport(\n exportDir: string,\n dataDir: string,\n opts: HubSpotImportOptions = {}\n): Promise<HubSpotImportResult> {\n const result: HubSpotImportResult = {\n companiesProcessed: 0,\n contactsImported: 0,\n dealsImported: 0,\n engagementsImported: 0,\n errors: [],\n customPropertiesSaved: 0,\n ownersResolved: 0,\n };\n\n const dryRun = opts.dryRun ?? false;\n const ownerMap = opts.ownerMap ?? {};\n\n // Resume handling\n let progress: ImportProgress | null = null;\n if (opts.resume) {\n progress = readProgress(dataDir);\n if (progress) {\n console.error(`[import] Resuming import ${progress.importId}...`);\n }\n }\n\n if (!progress) {\n progress = {\n importId: `hs-import-${new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19)}`,\n source: exportDir,\n startedAt: new Date().toISOString(),\n phases: {\n companies: { status: \"pending\", processed: 0 },\n contacts: { status: \"pending\", processed: 0 },\n deals: { status: \"pending\", processed: 0 },\n engagements: { status: \"pending\", processed: 0 },\n },\n };\n }\n\n const companySlugMap = new Map<string, string>(); // name.lower → slug\n const emailSlugMap = new Map<string, string>(); // email.lower → slug\n\n // ── Phase 1: Companies ──────────────────────────────────────────────────────\n const companiesPath = path.join(exportDir, \"companies.csv\");\n if (fs.existsSync(companiesPath) && progress.phases.companies.status !== \"done\") {\n progress.phases.companies.status = \"in-progress\";\n if (!dryRun) writeProgress(dataDir, progress);\n\n for await (const row of streamCSV(companiesPath)) {\n const name = (row[\"name\"] ?? row[\"Name\"] ?? \"\").trim();\n if (!name) continue;\n\n const domain = (\n row[\"domain\"] ??\n row[\"Domain\"] ??\n row[\"website\"] ??\n row[\"Website\"] ??\n \"\"\n ).trim();\n const hubspotId = (row[\"hs_object_id\"] ?? row[\"Record ID\"] ?? \"\").trim();\n\n try {\n const { slug, created } = ensureCustomer(dataDir, name, domain, \"\", dryRun);\n companySlugMap.set(name.toLowerCase(), slug);\n result.companiesProcessed++;\n\n if (!dryRun && created) {\n // Map known fields\n for (const [hsKey, dxKey] of Object.entries(COMPANY_FIELD_MAP)) {\n const val = row[hsKey] ?? \"\";\n if (val) updateMainFactsField(dataDir, slug, dxKey, val);\n }\n\n // Owner mapping\n const ownerEmail = row[\"hubspot_owner_email\"] ?? row[\"HubSpot Owner Email\"] ?? \"\";\n if (ownerEmail && ownerMap[ownerEmail]) {\n updateMainFactsField(dataDir, slug, \"assigned_rep\", ownerMap[ownerEmail]!);\n result.ownersResolved++;\n }\n\n // HubSpot ID reference\n if (hubspotId) {\n updateMainFactsField(dataDir, slug, \"hubspot_company_id\", hubspotId);\n }\n\n // Custom properties — everything not in known columns\n const customProps: Record<string, string> = {};\n for (const [key, val] of Object.entries(row)) {\n if (!KNOWN_COMPANY_COLUMNS.has(key) && val) customProps[key] = val;\n }\n if (Object.keys(customProps).length > 0) {\n saveCustomProperties(dataDir, slug, customProps);\n result.customPropertiesSaved += Object.keys(customProps).length;\n }\n }\n } catch (err) {\n result.errors.push(`Company '${name}': ${(err as Error).message}`);\n }\n\n progress.phases.companies.processed++;\n }\n\n progress.phases.companies.status = \"done\";\n if (!dryRun) writeProgress(dataDir, progress);\n } else if (progress.phases.companies.status === \"done\") {\n // Rebuild maps from disk for resume\n const customersDir = path.join(dataDir, \"customers\");\n if (fs.existsSync(customersDir)) {\n for (const slug of fs.readdirSync(customersDir)) {\n const mf = path.join(customersDir, slug, \"main_facts.md\");\n if (!fs.existsSync(mf)) continue;\n const content = fs.readFileSync(mf, \"utf-8\") as string;\n const nameMatch = content.match(/^name:\\s*(.+)$/m);\n if (nameMatch?.[1]) companySlugMap.set(nameMatch[1].trim().toLowerCase(), slug);\n }\n }\n }\n\n // ── Phase 2: Contacts ───────────────────────────────────────────────────────\n const contactsPath = path.join(exportDir, \"contacts.csv\");\n if (fs.existsSync(contactsPath) && progress.phases.contacts.status !== \"done\") {\n progress.phases.contacts.status = \"in-progress\";\n if (!dryRun) writeProgress(dataDir, progress);\n\n for await (const row of streamCSV(contactsPath)) {\n const firstName = (row[\"firstname\"] ?? row[\"First Name\"] ?? \"\").trim();\n const lastName = (row[\"lastname\"] ?? row[\"Last Name\"] ?? \"\").trim();\n const email = (row[\"email\"] ?? row[\"Email\"] ?? \"\").trim();\n const companyName = (\n row[\"company\"] ??\n row[\"Company\"] ??\n row[\"associated_company\"] ??\n row[\"Associated Company\"] ??\n \"\"\n ).trim();\n const phone = (row[\"phone\"] ?? row[\"Phone\"] ?? row[\"mobilephone\"] ?? \"\").trim();\n const title = (row[\"jobtitle\"] ?? row[\"Job Title\"] ?? \"\").trim();\n const department = (row[\"department\"] ?? row[\"Department\"] ?? \"\").trim();\n const hubspotId = (row[\"vid\"] ?? row[\"Contact ID\"] ?? row[\"hs_object_id\"] ?? \"\").trim();\n\n let slug = companySlugMap.get(companyName.toLowerCase());\n\n if (!slug && companyName) {\n const domain = (row[\"website\"] ?? \"\").trim();\n try {\n const { slug: newSlug, created } = ensureCustomer(\n dataDir,\n companyName,\n domain,\n email,\n dryRun\n );\n slug = newSlug;\n companySlugMap.set(companyName.toLowerCase(), newSlug);\n if (created) result.companiesProcessed++;\n } catch (err) {\n result.errors.push(`Auto-company '${companyName}': ${(err as Error).message}`);\n }\n }\n\n if (!slug) continue;\n\n if (!dryRun) {\n const contactName = [firstName, lastName].filter(Boolean).join(\" \");\n const isFirst = !fs.existsSync(path.join(dataDir, \"customers\", slug, \"contacts.json\"));\n\n // Multi-contact support\n if (email || contactName) {\n const contactEntry = {\n email: email || `${slugify(contactName)}@unknown.local`,\n name: contactName || email,\n ...(title ? { title } : {}),\n ...(phone ? { phone } : {}),\n ...(department ? { department } : {}),\n ...(hubspotId ? { hubspotId } : {}),\n isPrimary: isFirst,\n createdAt: new Date().toISOString(),\n };\n try {\n upsertContact(dataDir, slug, contactEntry);\n } catch {\n /* skip invalid */\n }\n }\n\n // Update main_facts primary contact (first contact only)\n const existing = readMainFactsRaw(dataDir, slug);\n if (email && !existing.includes(\"email:\"))\n updateMainFactsField(dataDir, slug, \"email\", email);\n if (phone && !existing.includes(\"phone:\"))\n updateMainFactsField(dataDir, slug, \"phone\", phone);\n if (contactName && !existing.includes(\"primary_contact:\")) {\n updateMainFactsField(dataDir, slug, \"primary_contact\", contactName);\n }\n\n // Owner mapping\n const ownerEmail = row[\"contact_owner\"] ?? row[\"Contact Owner\"] ?? \"\";\n if (ownerEmail && ownerMap[ownerEmail] && !existing.includes(\"assigned_rep:\")) {\n updateMainFactsField(dataDir, slug, \"assigned_rep\", ownerMap[ownerEmail]!);\n result.ownersResolved++;\n }\n }\n\n if (email) emailSlugMap.set(email.toLowerCase(), slug);\n result.contactsImported++;\n progress.phases.contacts.processed++;\n }\n\n progress.phases.contacts.status = \"done\";\n if (!dryRun) writeProgress(dataDir, progress);\n }\n\n // ── Phase 3: Deals ──────────────────────────────────────────────────────────\n const dealsPath = path.join(exportDir, \"deals.csv\");\n if (fs.existsSync(dealsPath) && progress.phases.deals.status !== \"done\") {\n if (!dryRun) {\n const { upsertDeal } = await import(\"../fs/pipeline-writer.js\");\n progress.phases.deals.status = \"in-progress\";\n writeProgress(dataDir, progress);\n\n for await (const row of streamCSV(dealsPath)) {\n const dealName = (row[\"dealname\"] ?? row[\"Deal Name\"] ?? row[\"name\"] ?? \"\").trim();\n if (!dealName) continue;\n\n const companyName = (\n row[\"associated_company\"] ??\n row[\"Associated Company\"] ??\n row[\"company\"] ??\n \"\"\n ).trim();\n const amountStr = (row[\"amount\"] ?? row[\"Amount\"] ?? \"0\").trim().replace(/[^0-9.]/g, \"\");\n const stageRaw = (row[\"dealstage\"] ?? row[\"Deal Stage\"] ?? \"\").trim().toLowerCase();\n const closeDateRaw = (\n row[\"closedate\"] ??\n row[\"Close Date\"] ??\n row[\"close_date\"] ??\n \"\"\n ).trim();\n const currency = (row[\"deal_currency_code\"] ?? row[\"Currency\"] ?? \"EUR\").trim();\n const dealId = (row[\"hs_deal_id\"] ?? row[\"hs_object_id\"] ?? row[\"Record ID\"] ?? \"\").trim();\n const ownerEmail = (row[\"hubspot_owner_email\"] ?? row[\"HubSpot Owner Email\"] ?? \"\").trim();\n const description = (row[\"description\"] ?? row[\"Description\"] ?? \"\").trim();\n\n const slug =\n companySlugMap.get(companyName.toLowerCase()) ?? slugify(companyName || \"unknown\");\n const stage = STAGE_MAP[stageRaw] ?? \"qualified\";\n const amount = parseFloat(amountStr) || 0;\n const closeDate = coerceDate(closeDateRaw);\n\n const notesParts: string[] = [];\n if (dealId) notesParts.push(`hubspot://deal/${dealId}`);\n if (description) notesParts.push(description.slice(0, 200));\n if (ownerEmail && ownerMap[ownerEmail]) notesParts.push(`owner:${ownerMap[ownerEmail]}`);\n\n const deal: PipelineDeal = {\n name: dealName,\n stage,\n value: amount,\n currency: currency || \"EUR\",\n probability: stage === \"won\" ? 1 : stage === \"lost\" ? 0 : 0.5,\n close_date: closeDate,\n updated: new Date().toISOString().slice(0, 10),\n ...(notesParts.length > 0 ? { notes: notesParts.join(\" | \") } : {}),\n };\n\n try {\n await upsertDeal(dataDir, slug, deal);\n result.dealsImported++;\n } catch (err) {\n result.errors.push(`Deal '${dealName}': ${(err as Error).message}`);\n }\n\n progress.phases.deals.processed++;\n }\n\n progress.phases.deals.status = \"done\";\n writeProgress(dataDir, progress);\n } else {\n // Dry run count\n for await (const row of streamCSV(dealsPath)) {\n if ((row[\"dealname\"] ?? row[\"name\"] ?? \"\").trim()) result.dealsImported++;\n }\n progress.phases.deals.status = \"done\";\n }\n }\n\n // ── Phase 4: Engagements ────────────────────────────────────────────────────\n const engagementsPath = path.join(exportDir, \"engagements.csv\");\n if (fs.existsSync(engagementsPath) && progress.phases.engagements.status !== \"done\") {\n if (!dryRun) {\n const { appendInteraction, readInteractions } = await import(\"../fs/interactions-writer.js\");\n progress.phases.engagements.status = \"in-progress\";\n writeProgress(dataDir, progress);\n\n for await (const row of streamCSV(engagementsPath)) {\n const engType = (\n row[\"engagement_type\"] ??\n row[\"Engagement Type\"] ??\n row[\"type\"] ??\n row[\"Type\"] ??\n \"NOTE\"\n )\n .trim()\n .toUpperCase();\n const timestamp = (\n row[\"hs_timestamp\"] ??\n row[\"Timestamp\"] ??\n row[\"date\"] ??\n row[\"createdate\"] ??\n \"\"\n ).trim();\n const body = (\n row[\"hs_body_preview\"] ??\n row[\"Body\"] ??\n row[\"notes\"] ??\n row[\"Notes\"] ??\n row[\"hs_note_body\"] ??\n \"\"\n ).trim();\n const subject = (row[\"subject\"] ?? row[\"Subject\"] ?? \"\").trim();\n const contactEmail = (\n row[\"associated_contact_email\"] ??\n row[\"Contact Email\"] ??\n row[\"from_email\"] ??\n \"\"\n )\n .trim()\n .toLowerCase();\n const engId = (\n row[\"id\"] ??\n row[\"engagement_id\"] ??\n row[\"hs_object_id\"] ??\n hashStr(timestamp + body)\n ).trim();\n const callDuration = (row[\"call_duration\"] ?? row[\"hs_call_duration\"] ?? \"\").trim();\n const callOutcome = (row[\"call_outcome\"] ?? row[\"hs_call_disposition\"] ?? \"\").trim();\n const callRecording = (\n row[\"call_recording_url\"] ??\n row[\"hs_call_recording_url\"] ??\n \"\"\n ).trim();\n\n const slug =\n emailSlugMap.get(contactEmail) ??\n companySlugMap.get((row[\"associated_company\"] ?? \"\").toLowerCase().trim());\n if (!slug) continue;\n\n const sourceRef = `hubspot://engagement/${engId}`;\n try {\n const existing = await readInteractions(dataDir, slug).catch(() => \"\");\n if (existing.includes(sourceRef)) continue;\n\n const date = coerceDate(timestamp);\n const type = TYPE_MAP[engType] ?? \"Note\";\n\n // Build rich summary\n const summaryParts: string[] = [];\n if (subject) summaryParts.push(`Subject: ${subject}`);\n if (body) summaryParts.push(body.slice(0, 500));\n if (callDuration) summaryParts.push(`Duration: ${callDuration}s`);\n if (callOutcome) summaryParts.push(`Outcome: ${callOutcome}`);\n if (callRecording) summaryParts.push(`Recording: ${callRecording}`);\n\n const summary = summaryParts.join(\" | \") || `${type} imported from HubSpot`;\n\n await appendInteraction(dataDir, slug, {\n date,\n type,\n with: contactEmail || slug,\n summary,\n nextSteps: [],\n sourceRef,\n synced: new Date().toISOString(),\n });\n result.engagementsImported++;\n } catch (err) {\n result.errors.push(`Engagement ${engId}: ${(err as Error).message}`);\n }\n\n progress.phases.engagements.processed++;\n }\n\n progress.phases.engagements.status = \"done\";\n writeProgress(dataDir, progress);\n } else {\n for await (const _row of streamCSV(engagementsPath)) result.engagementsImported++;\n progress.phases.engagements.status = \"done\";\n }\n }\n\n // Done — clear progress file\n if (!dryRun) clearProgress(dataDir);\n\n return result;\n}\n"],"mappings":";;;;;;AAOA,SAAS,aAAa,MAAc,YAAY,KAAe;CAC7D,MAAM,SAAmB,CAAC;CAC1B,IAAI,UAAU;CACd,IAAI,WAAW;CACf,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,KAAK,KAAK;EAChB,IAAI,OAAO,MACT,IAAI,YAAY,KAAK,IAAI,OAAO,MAAK;GACnC,WAAW;GACX;EACF,OACE,WAAW,CAAC;OAET,IAAI,OAAO,aAAa,CAAC,UAAU;GACxC,OAAO,KAAK,QAAQ,KAAK,CAAC;GAC1B,UAAU;EACZ,OACE,WAAW;CAEf;CACA,OAAO,KAAK,QAAQ,KAAK,CAAC;CAC1B,OAAO;AACT;;AAGA,gBAAuB,UACrB,UACA,OAAyB,CAAC,GACc;CACxC,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,SAAS,GAAG,iBAAiB,UAAU,EAAE,UAAU,QAAQ,CAAC;CAClE,MAAM,KAAK,SAAS,gBAAgB;EAAE,OAAO;EAAQ,WAAW;CAAS,CAAC;CAE1E,IAAI,UAA2B;CAE/B,WAAW,MAAM,QAAQ,IAAI;EAC3B,MAAM,UAAU,KAAK,KAAK;EAC1B,IAAI,CAAC,SAAS;EACd,MAAM,SAAS,aAAa,SAAS,SAAS;EAC9C,IAAI,CAAC,SAAS;GACZ,UAAU,OAAO,KAAK,MAAM,EAAE,QAAQ,UAAU,EAAE,EAAE,KAAK,CAAC;GAC1D;EACF;EACA,MAAM,MAA8B,CAAC;EACrC,QAAQ,SAAS,GAAG,MAAM;GACxB,IAAI,KAAK,OAAO,MAAM;EACxB,CAAC;EACD,MAAM;CACR;AACF;;;ACpDA,MAAa,wBAAwB,EAAE,OAAO;CAC5C,OAAO,EAAE,OAAO,EAAE,MAAM;CACxB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;CACtB,OAAO,EAAE,OAAO,EAAE,SAAS;CAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;CAC3B,YAAY,EAAE,OAAO,EAAE,SAAS;CAChC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;CACvC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;CACpC,WAAW,EAAE,OAAO,EAAE,SAAS;CAC/B,gBAAgB,EAAE,OAAO,EAAE,SAAS;CACpC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAID,SAAS,aAAa,SAAiB,MAAsB;CAC3D,OAAO,KAAK,KAAK,SAAS,aAAa,MAAM,eAAe;AAC9D;AAEA,SAAgB,aAAa,SAAiB,MAAiC;CAC7E,MAAM,IAAI,aAAa,SAAS,IAAI;CACpC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC;CAC/B,IAAI;EACF,MAAM,MAAM,KAAK,MAAM,GAAG,aAAa,GAAG,OAAO,CAAW;EAC5D,IAAI,CAAC,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC;EACjC,OAAO,IAAI,SAAS,SAAS;GAC3B,MAAM,IAAI,sBAAsB,UAAU,IAAI;GAC9C,OAAO,EAAE,UAAU,CAAC,EAAE,IAAI,IAAI,CAAC;EACjC,CAAC;CACH,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,cAAc,SAAiB,MAAc,SAAgC;CAC3F,MAAM,WAAW,aAAa,SAAS,IAAI;CAC3C,MAAM,MAAM,SAAS,WAAW,MAAM,EAAE,MAAM,YAAY,MAAM,QAAQ,MAAM,YAAY,CAAC;CAC3F,IAAI,OAAO,GACT,SAAS,OAAO;EAAE,GAAG,SAAS;EAAM,GAAG;CAAQ;MAE/C,SAAS,KAAK,OAAO;CAGvB,IAAI,QAAQ;OACL,MAAM,KAAK,UACd,IAAI,EAAE,MAAM,YAAY,MAAM,QAAQ,MAAM,YAAY,GACtD,EAAE,YAAY;CAAA;CAIpB,MAAM,MAAM,KAAK,QAAQ,aAAa,SAAS,IAAI,CAAC;CACpD,GAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;CACrC,GAAG,cAAc,aAAa,SAAS,IAAI,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AAC1F;;;AClBA,MAAM,YAAmD;CACvD,sBAAsB;CACtB,gBAAgB;CAChB,uBAAuB;CACvB,uBAAuB;CACvB,cAAc;CACd,WAAW;CACX,YAAY;CAEZ,aAAa;CACb,eAAe;CACf,UAAU;CACV,aAAa;CACb,YAAY;CACZ,aAAa;AACf;AAEA,MAAM,WAAqD;CACzD,MAAM;CACN,MAAM;CACN,OAAO;CACP,SAAS;CACT,MAAM;CACN,kBAAkB;CAClB,kBAAkB;CAClB,aAAa;AACf;AAGA,MAAM,oBAA4C;CAChD,mBAAmB;CACnB,yBAAyB;CACzB,UAAU;CACV,MAAM;CACN,SAAS;CACT,gBAAgB;CAChB,gBAAgB;CAChB,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT,KAAK;CACL,OAAO;AACT;AAEA,MAAM,wBAAwB,IAAI,IAAI;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAID,SAAS,QAAQ,MAAsB;CACrC,OAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AAChB;AAEA,SAAS,QAAQ,GAAmB;CAClC,OAAO,WAAW,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACjE;AAEA,SAAS,WAAW,KAAqB;CACvC,IAAI,CAAC,KAAK,wBAAO,IAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;CAErD,IAAI,WAAW,KAAK,IAAI,KAAK,CAAC,GAC5B,OAAO,IAAI,KAAK,SAAS,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;CAE9D,MAAM,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC;CAC7B,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;CAC3D,wBAAO,IAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C;AAIA,SAAS,eACP,SACA,MACA,QACA,OACA,QACoC;CACpC,MAAM,OAAO,QAAQ,QAAQ,SAAS;CACtC,MAAM,cAAc,KAAK,KAAK,SAAS,aAAa,IAAI;CACxD,MAAM,gBAAgB,KAAK,KAAK,aAAa,eAAe;CAC5D,IAAI,GAAG,WAAW,aAAa,GAAG,OAAO;EAAE;EAAM,SAAS;CAAM;CAChE,IAAI,QAAQ,OAAO;EAAE;EAAM,SAAS;CAAK;CAEzC,GAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;CAC7C,MAAM,yBAAQ,IAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;CAClD,MAAM,QAAQ;EACZ;EACA,SAAS;EACT,SAAS,WAAW,WAAW;EAC/B,QAAQ,UAAU,UAAU;EAC5B;EACA,YAAY;EACZ,YAAY;EACZ,oBAAoB;EACpB;EACA;EACA;CACF,EACG,OAAO,OAAO,EACd,KAAK,IAAI;CACZ,GAAG,cAAc,eAAe,GAAG,MAAM,kBAAkB,KAAK,KAAK,OAAO;CAC5E,GAAG,cACD,KAAK,KAAK,aAAa,iBAAiB,GACxC,oBAAoB,KAAK,OACzB,OACF;CACA,GAAG,cAAc,KAAK,KAAK,aAAa,aAAa,GAAG,gBAAgB,KAAK,OAAO,OAAO;CAC3F,GAAG,cACD,KAAK,KAAK,aAAa,cAAc,GACrC,KAAK,UACH;EACE,OAAO;GACL,OAAO,SACH,QAAQ,OAAO,SAAS,WACxB,QACE,QAAQ,MAAM,SAAS,UACvB;GACN,SAAS;EACX;EACA,aAAa;GAAE,OAAO,CAAC;GAAG,YAAY,CAAC,QAAQ,MAAM;GAAG,SAAS;EAAM;CACzE,GACA,MACA,CACF,GACA,OACF;CACA,OAAO;EAAE;EAAM,SAAS;CAAK;AAC/B;AAEA,SAAS,iBAAiB,SAAiB,MAAsB;CAC/D,MAAM,IAAI,KAAK,KAAK,SAAS,aAAa,MAAM,eAAe;CAC/D,OAAO,GAAG,WAAW,CAAC,IAAK,GAAG,aAAa,GAAG,OAAO,IAAe;AACtE;AAEA,SAAS,qBAAqB,SAAiB,MAAc,OAAe,OAAqB;CAC/F,MAAM,IAAI,KAAK,KAAK,SAAS,aAAa,MAAM,eAAe;CAC/D,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG;CACvB,IAAI,UAAU,GAAG,aAAa,GAAG,OAAO;CACxC,MAAM,QAAQ,IAAI,OAAO,IAAI,MAAM,OAAO,GAAG;CAC7C,IAAI,MAAM,KAAK,OAAO,GACpB,UAAU,QAAQ,QAAQ,OAAO,GAAG,MAAM,IAAI,OAAO;MAChD;EACL,MAAM,YAAY,QAAQ,QAAQ,KAAK;EACvC,MAAM,aAAa,QAAQ,QAAQ,OAAO,YAAY,CAAC;EACvD,IAAI,cAAc,GAChB,UAAU,QAAQ,MAAM,GAAG,UAAU,IAAI,GAAG,MAAM,IAAI,MAAM,MAAM,QAAQ,MAAM,UAAU;CAE9F;CACA,GAAG,cAAc,GAAG,SAAS,OAAO;AACtC;AAIA,SAAS,qBAAqB,SAAiB,MAAc,OAAqC;CAChG,IAAI,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;CACrC,MAAM,IAAI,KAAK,KAAK,SAAS,aAAa,MAAM,wBAAwB;CACxE,IAAI,WAAoC,CAAC;CACzC,IAAI,GAAG,WAAW,CAAC,GACjB,IAAI;EACF,WAAW,KAAK,MAAM,GAAG,aAAa,GAAG,OAAO,CAAW;CAC7D,QAAQ;EACN,WAAW,CAAC;CACd;CAEF,MAAM,SAAS;EACb,QAAQ;EACR,6BAAY,IAAI,KAAK,GAAE,YAAY;EACnC,YAAY;GAAE,GAAK,SAAS,iBAA4C,CAAC;GAAI,GAAG;EAAM;CACxF;CACA,GAAG,cAAc,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAC9D;AAgBA,SAAS,aAAa,SAAyB;CAC7C,OAAO,KAAK,KAAK,SAAS,YAAY,sBAAsB;AAC9D;AAEA,SAAS,aAAa,SAAwC;CAC5D,MAAM,IAAI,aAAa,OAAO;CAC9B,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,OAAO;CAC9B,IAAI;EACF,OAAO,KAAK,MAAM,GAAG,aAAa,GAAG,OAAO,CAAW;CACzD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAAc,SAAiB,UAAgC;CACtE,GAAG,UAAU,KAAK,QAAQ,aAAa,OAAO,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;CACrE,GAAG,cAAc,aAAa,OAAO,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACpF;AAEA,SAAS,cAAc,SAAuB;CAC5C,MAAM,IAAI,aAAa,OAAO;CAC9B,IAAI,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC;AACvC;AAIA,eAAsB,qBAAqB,WAA6C;CACtF,MAAM,WAA4B;EAChC,gBAAgB;EAChB,eAAe;EACf,YAAY;EACZ,kBAAkB;EAClB,0BAA0B,CAAC;EAC3B,gBAAgB,CAAC;EACjB,eAAe,CAAC;EAChB,kBAAkB;EAClB,kBAAkB;CACpB;CAEA,MAAM,8BAAc,IAAI,IAAY;CACpC,MAAM,yBAAS,IAAI,IAAY;CAC/B,MAAM,gCAAgB,IAAI,IAAY;CACtC,MAAM,+BAAe,IAAI,IAAY;CAGrC,MAAM,gBAAgB,KAAK,KAAK,WAAW,eAAe;CAC1D,IAAI,GAAG,WAAW,aAAa,GAC7B,WAAW,MAAM,OAAO,UAAU,aAAa,GAAG;EAChD,SAAS;EACT,MAAM,QAAQ,IAAI,WAAW,IAAI,WAAW,IAAI,KAAK;EACrD,IAAI,MAAM,aAAa,IAAI,KAAK,YAAY,CAAC;EAC7C,MAAM,QAAQ,IAAI,0BAA0B,IAAI,0BAA0B;EAC1E,IAAI,OAAO,OAAO,IAAI,KAAK;EAE3B,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,GAC/B,IAAI,CAAC,sBAAsB,IAAI,GAAG,KAAK,IAAI,MAAM,YAAY,IAAI,GAAG;CAExE;CAIF,MAAM,eAAe,KAAK,KAAK,WAAW,cAAc;CACxD,IAAI,GAAG,WAAW,YAAY,GAC5B,WAAW,MAAM,OAAO,UAAU,YAAY,GAAG;EAC/C,SAAS;EACT,MAAM,WAAW,IAAI,cAAc,IAAI,cAAc,IAAI,yBAAyB,IAAI,KAAK;EAC3F,IAAI,WAAW,CAAC,aAAa,IAAI,QAAQ,YAAY,CAAC,GAAG,SAAS;EAClE,MAAM,QAAQ,IAAI,oBAAoB,IAAI,oBAAoB;EAC9D,IAAI,OAAO,OAAO,IAAI,KAAK;CAC7B;CAIF,MAAM,YAAY,KAAK,KAAK,WAAW,WAAW;CAClD,IAAI,GAAG,WAAW,SAAS,GACzB,WAAW,MAAM,OAAO,UAAU,SAAS,GAAG;EAC5C,SAAS;EACT,MAAM,SAAS,IAAI,gBAAgB,IAAI,iBAAiB,IAAI,KAAK,EAAE,YAAY;EAC/E,IAAI,SAAS,CAAC,UAAU,QAAQ,cAAc,IAAI,KAAK;CACzD;CAIF,MAAM,kBAAkB,KAAK,KAAK,WAAW,iBAAiB;CAC9D,IAAI,GAAG,WAAW,eAAe,GAC/B,WAAW,MAAM,QAAQ,UAAU,eAAe,GAChD,SAAS;CAIb,SAAS,2BAA2B,MAAM,KAAK,WAAW,EAAE,MAAM,GAAG,EAAE;CACvE,SAAS,iBAAiB,MAAM,KAAK,MAAM;CAC3C,SAAS,gBAAgB,MAAM,KAAK,aAAa;CAEjD,MAAM,YACJ,SAAS,iBACT,SAAS,gBACT,SAAS,aACT,SAAS;CACX,SAAS,mBAAmB,KAAK,KAAK,YAAY,GAAI;CAEtD,OAAO;AACT;AAIA,eAAsB,oBACpB,WACA,SACA,OAA6B,CAAC,GACA;CAC9B,MAAM,SAA8B;EAClC,oBAAoB;EACpB,kBAAkB;EAClB,eAAe;EACf,qBAAqB;EACrB,QAAQ,CAAC;EACT,uBAAuB;EACvB,gBAAgB;CAClB;CAEA,MAAM,SAAS,KAAK,UAAU;CAC9B,MAAM,WAAW,KAAK,YAAY,CAAC;CAGnC,IAAI,WAAkC;CACtC,IAAI,KAAK,QAAQ;EACf,WAAW,aAAa,OAAO;EAC/B,IAAI,UACF,QAAQ,MAAM,4BAA4B,SAAS,SAAS,IAAI;CAEpE;CAEA,IAAI,CAAC,UACH,WAAW;EACT,UAAU,8BAAa,IAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE,MAAM,GAAG,EAAE;EACjF,QAAQ;EACR,4BAAW,IAAI,KAAK,GAAE,YAAY;EAClC,QAAQ;GACN,WAAW;IAAE,QAAQ;IAAW,WAAW;GAAE;GAC7C,UAAU;IAAE,QAAQ;IAAW,WAAW;GAAE;GAC5C,OAAO;IAAE,QAAQ;IAAW,WAAW;GAAE;GACzC,aAAa;IAAE,QAAQ;IAAW,WAAW;GAAE;EACjD;CACF;CAGF,MAAM,iCAAiB,IAAI,IAAoB;CAC/C,MAAM,+BAAe,IAAI,IAAoB;CAG7C,MAAM,gBAAgB,KAAK,KAAK,WAAW,eAAe;CAC1D,IAAI,GAAG,WAAW,aAAa,KAAK,SAAS,OAAO,UAAU,WAAW,QAAQ;EAC/E,SAAS,OAAO,UAAU,SAAS;EACnC,IAAI,CAAC,QAAQ,cAAc,SAAS,QAAQ;EAE5C,WAAW,MAAM,OAAO,UAAU,aAAa,GAAG;GAChD,MAAM,QAAQ,IAAI,WAAW,IAAI,WAAW,IAAI,KAAK;GACrD,IAAI,CAAC,MAAM;GAEX,MAAM,UACJ,IAAI,aACJ,IAAI,aACJ,IAAI,cACJ,IAAI,cACJ,IACA,KAAK;GACP,MAAM,aAAa,IAAI,mBAAmB,IAAI,gBAAgB,IAAI,KAAK;GAEvE,IAAI;IACF,MAAM,EAAE,MAAM,YAAY,eAAe,SAAS,MAAM,QAAQ,IAAI,MAAM;IAC1E,eAAe,IAAI,KAAK,YAAY,GAAG,IAAI;IAC3C,OAAO;IAEP,IAAI,CAAC,UAAU,SAAS;KAEtB,KAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,iBAAiB,GAAG;MAC9D,MAAM,MAAM,IAAI,UAAU;MAC1B,IAAI,KAAK,qBAAqB,SAAS,MAAM,OAAO,GAAG;KACzD;KAGA,MAAM,aAAa,IAAI,0BAA0B,IAAI,0BAA0B;KAC/E,IAAI,cAAc,SAAS,aAAa;MACtC,qBAAqB,SAAS,MAAM,gBAAgB,SAAS,WAAY;MACzE,OAAO;KACT;KAGA,IAAI,WACF,qBAAqB,SAAS,MAAM,sBAAsB,SAAS;KAIrE,MAAM,cAAsC,CAAC;KAC7C,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,GAAG,GACzC,IAAI,CAAC,sBAAsB,IAAI,GAAG,KAAK,KAAK,YAAY,OAAO;KAEjE,IAAI,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;MACvC,qBAAqB,SAAS,MAAM,WAAW;MAC/C,OAAO,yBAAyB,OAAO,KAAK,WAAW,EAAE;KAC3D;IACF;GACF,SAAS,KAAK;IACZ,OAAO,OAAO,KAAK,YAAY,KAAK,KAAM,IAAc,SAAS;GACnE;GAEA,SAAS,OAAO,UAAU;EAC5B;EAEA,SAAS,OAAO,UAAU,SAAS;EACnC,IAAI,CAAC,QAAQ,cAAc,SAAS,QAAQ;CAC9C,OAAO,IAAI,SAAS,OAAO,UAAU,WAAW,QAAQ;EAEtD,MAAM,eAAe,KAAK,KAAK,SAAS,WAAW;EACnD,IAAI,GAAG,WAAW,YAAY,GAC5B,KAAK,MAAM,QAAQ,GAAG,YAAY,YAAY,GAAG;GAC/C,MAAM,KAAK,KAAK,KAAK,cAAc,MAAM,eAAe;GACxD,IAAI,CAAC,GAAG,WAAW,EAAE,GAAG;GAExB,MAAM,YADU,GAAG,aAAa,IAAI,OACZ,EAAE,MAAM,iBAAiB;GACjD,IAAI,YAAY,IAAI,eAAe,IAAI,UAAU,GAAG,KAAK,EAAE,YAAY,GAAG,IAAI;EAChF;CAEJ;CAGA,MAAM,eAAe,KAAK,KAAK,WAAW,cAAc;CACxD,IAAI,GAAG,WAAW,YAAY,KAAK,SAAS,OAAO,SAAS,WAAW,QAAQ;EAC7E,SAAS,OAAO,SAAS,SAAS;EAClC,IAAI,CAAC,QAAQ,cAAc,SAAS,QAAQ;EAE5C,WAAW,MAAM,OAAO,UAAU,YAAY,GAAG;GAC/C,MAAM,aAAa,IAAI,gBAAgB,IAAI,iBAAiB,IAAI,KAAK;GACrE,MAAM,YAAY,IAAI,eAAe,IAAI,gBAAgB,IAAI,KAAK;GAClE,MAAM,SAAS,IAAI,YAAY,IAAI,YAAY,IAAI,KAAK;GACxD,MAAM,eACJ,IAAI,cACJ,IAAI,cACJ,IAAI,yBACJ,IAAI,yBACJ,IACA,KAAK;GACP,MAAM,SAAS,IAAI,YAAY,IAAI,YAAY,IAAI,kBAAkB,IAAI,KAAK;GAC9E,MAAM,SAAS,IAAI,eAAe,IAAI,gBAAgB,IAAI,KAAK;GAC/D,MAAM,cAAc,IAAI,iBAAiB,IAAI,iBAAiB,IAAI,KAAK;GACvE,MAAM,aAAa,IAAI,UAAU,IAAI,iBAAiB,IAAI,mBAAmB,IAAI,KAAK;GAEtF,IAAI,OAAO,eAAe,IAAI,YAAY,YAAY,CAAC;GAEvD,IAAI,CAAC,QAAQ,aAAa;IACxB,MAAM,UAAU,IAAI,cAAc,IAAI,KAAK;IAC3C,IAAI;KACF,MAAM,EAAE,MAAM,SAAS,YAAY,eACjC,SACA,aACA,QACA,OACA,MACF;KACA,OAAO;KACP,eAAe,IAAI,YAAY,YAAY,GAAG,OAAO;KACrD,IAAI,SAAS,OAAO;IACtB,SAAS,KAAK;KACZ,OAAO,OAAO,KAAK,iBAAiB,YAAY,KAAM,IAAc,SAAS;IAC/E;GACF;GAEA,IAAI,CAAC,MAAM;GAEX,IAAI,CAAC,QAAQ;IACX,MAAM,cAAc,CAAC,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;IAClE,MAAM,UAAU,CAAC,GAAG,WAAW,KAAK,KAAK,SAAS,aAAa,MAAM,eAAe,CAAC;IAGrF,IAAI,SAAS,aAAa;KACxB,MAAM,eAAe;MACnB,OAAO,SAAS,GAAG,QAAQ,WAAW,EAAE;MACxC,MAAM,eAAe;MACrB,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;MACzB,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;MACzB,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;MACnC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;MACjC,WAAW;MACX,4BAAW,IAAI,KAAK,GAAE,YAAY;KACpC;KACA,IAAI;MACF,cAAc,SAAS,MAAM,YAAY;KAC3C,QAAQ,CAER;IACF;IAGA,MAAM,WAAW,iBAAiB,SAAS,IAAI;IAC/C,IAAI,SAAS,CAAC,SAAS,SAAS,QAAQ,GACtC,qBAAqB,SAAS,MAAM,SAAS,KAAK;IACpD,IAAI,SAAS,CAAC,SAAS,SAAS,QAAQ,GACtC,qBAAqB,SAAS,MAAM,SAAS,KAAK;IACpD,IAAI,eAAe,CAAC,SAAS,SAAS,kBAAkB,GACtD,qBAAqB,SAAS,MAAM,mBAAmB,WAAW;IAIpE,MAAM,aAAa,IAAI,oBAAoB,IAAI,oBAAoB;IACnE,IAAI,cAAc,SAAS,eAAe,CAAC,SAAS,SAAS,eAAe,GAAG;KAC7E,qBAAqB,SAAS,MAAM,gBAAgB,SAAS,WAAY;KACzE,OAAO;IACT;GACF;GAEA,IAAI,OAAO,aAAa,IAAI,MAAM,YAAY,GAAG,IAAI;GACrD,OAAO;GACP,SAAS,OAAO,SAAS;EAC3B;EAEA,SAAS,OAAO,SAAS,SAAS;EAClC,IAAI,CAAC,QAAQ,cAAc,SAAS,QAAQ;CAC9C;CAGA,MAAM,YAAY,KAAK,KAAK,WAAW,WAAW;CAClD,IAAI,GAAG,WAAW,SAAS,KAAK,SAAS,OAAO,MAAM,WAAW,QAC/D,IAAI,CAAC,QAAQ;EACX,MAAM,EAAE,eAAe,MAAM,OAAO;EACpC,SAAS,OAAO,MAAM,SAAS;EAC/B,cAAc,SAAS,QAAQ;EAE/B,WAAW,MAAM,OAAO,UAAU,SAAS,GAAG;GAC5C,MAAM,YAAY,IAAI,eAAe,IAAI,gBAAgB,IAAI,WAAW,IAAI,KAAK;GACjF,IAAI,CAAC,UAAU;GAEf,MAAM,eACJ,IAAI,yBACJ,IAAI,yBACJ,IAAI,cACJ,IACA,KAAK;GACP,MAAM,aAAa,IAAI,aAAa,IAAI,aAAa,KAAK,KAAK,EAAE,QAAQ,YAAY,EAAE;GACvF,MAAM,YAAY,IAAI,gBAAgB,IAAI,iBAAiB,IAAI,KAAK,EAAE,YAAY;GAClF,MAAM,gBACJ,IAAI,gBACJ,IAAI,iBACJ,IAAI,iBACJ,IACA,KAAK;GACP,MAAM,YAAY,IAAI,yBAAyB,IAAI,eAAe,OAAO,KAAK;GAC9E,MAAM,UAAU,IAAI,iBAAiB,IAAI,mBAAmB,IAAI,gBAAgB,IAAI,KAAK;GACzF,MAAM,cAAc,IAAI,0BAA0B,IAAI,0BAA0B,IAAI,KAAK;GACzF,MAAM,eAAe,IAAI,kBAAkB,IAAI,kBAAkB,IAAI,KAAK;GAE1E,MAAM,OACJ,eAAe,IAAI,YAAY,YAAY,CAAC,KAAK,QAAQ,eAAe,SAAS;GACnF,MAAM,QAAQ,UAAU,aAAa;GACrC,MAAM,SAAS,WAAW,SAAS,KAAK;GACxC,MAAM,YAAY,WAAW,YAAY;GAEzC,MAAM,aAAuB,CAAC;GAC9B,IAAI,QAAQ,WAAW,KAAK,kBAAkB,QAAQ;GACtD,IAAI,aAAa,WAAW,KAAK,YAAY,MAAM,GAAG,GAAG,CAAC;GAC1D,IAAI,cAAc,SAAS,aAAa,WAAW,KAAK,SAAS,SAAS,aAAa;GAEvF,MAAM,OAAqB;IACzB,MAAM;IACN;IACA,OAAO;IACP,UAAU,YAAY;IACtB,aAAa,UAAU,QAAQ,IAAI,UAAU,SAAS,IAAI;IAC1D,YAAY;IACZ,0BAAS,IAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;IAC7C,GAAI,WAAW,SAAS,IAAI,EAAE,OAAO,WAAW,KAAK,KAAK,EAAE,IAAI,CAAC;GACnE;GAEA,IAAI;IACF,MAAM,WAAW,SAAS,MAAM,IAAI;IACpC,OAAO;GACT,SAAS,KAAK;IACZ,OAAO,OAAO,KAAK,SAAS,SAAS,KAAM,IAAc,SAAS;GACpE;GAEA,SAAS,OAAO,MAAM;EACxB;EAEA,SAAS,OAAO,MAAM,SAAS;EAC/B,cAAc,SAAS,QAAQ;CACjC,OAAO;EAEL,WAAW,MAAM,OAAO,UAAU,SAAS,GACzC,KAAK,IAAI,eAAe,IAAI,WAAW,IAAI,KAAK,GAAG,OAAO;EAE5D,SAAS,OAAO,MAAM,SAAS;CACjC;CAIF,MAAM,kBAAkB,KAAK,KAAK,WAAW,iBAAiB;CAC9D,IAAI,GAAG,WAAW,eAAe,KAAK,SAAS,OAAO,YAAY,WAAW,QAC3E,IAAI,CAAC,QAAQ;EACX,MAAM,EAAE,mBAAmB,qBAAqB,MAAM,OAAO;EAC7D,SAAS,OAAO,YAAY,SAAS;EACrC,cAAc,SAAS,QAAQ;EAE/B,WAAW,MAAM,OAAO,UAAU,eAAe,GAAG;GAClD,MAAM,WACJ,IAAI,sBACJ,IAAI,sBACJ,IAAI,WACJ,IAAI,WACJ,QAEC,KAAK,EACL,YAAY;GACf,MAAM,aACJ,IAAI,mBACJ,IAAI,gBACJ,IAAI,WACJ,IAAI,iBACJ,IACA,KAAK;GACP,MAAM,QACJ,IAAI,sBACJ,IAAI,WACJ,IAAI,YACJ,IAAI,YACJ,IAAI,mBACJ,IACA,KAAK;GACP,MAAM,WAAW,IAAI,cAAc,IAAI,cAAc,IAAI,KAAK;GAC9D,MAAM,gBACJ,IAAI,+BACJ,IAAI,oBACJ,IAAI,iBACJ,IAEC,KAAK,EACL,YAAY;GACf,MAAM,SACJ,IAAI,SACJ,IAAI,oBACJ,IAAI,mBACJ,QAAQ,YAAY,IAAI,GACxB,KAAK;GACP,MAAM,gBAAgB,IAAI,oBAAoB,IAAI,uBAAuB,IAAI,KAAK;GAClF,MAAM,eAAe,IAAI,mBAAmB,IAAI,0BAA0B,IAAI,KAAK;GACnF,MAAM,iBACJ,IAAI,yBACJ,IAAI,4BACJ,IACA,KAAK;GAEP,MAAM,OACJ,aAAa,IAAI,YAAY,KAC7B,eAAe,KAAK,IAAI,yBAAyB,IAAI,YAAY,EAAE,KAAK,CAAC;GAC3E,IAAI,CAAC,MAAM;GAEX,MAAM,YAAY,wBAAwB;GAC1C,IAAI;IAEF,KAAI,MADmB,iBAAiB,SAAS,IAAI,EAAE,YAAY,EAAE,GACxD,SAAS,SAAS,GAAG;IAElC,MAAM,OAAO,WAAW,SAAS;IACjC,MAAM,OAAO,SAAS,YAAY;IAGlC,MAAM,eAAyB,CAAC;IAChC,IAAI,SAAS,aAAa,KAAK,YAAY,SAAS;IACpD,IAAI,MAAM,aAAa,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;IAC9C,IAAI,cAAc,aAAa,KAAK,aAAa,aAAa,EAAE;IAChE,IAAI,aAAa,aAAa,KAAK,YAAY,aAAa;IAC5D,IAAI,eAAe,aAAa,KAAK,cAAc,eAAe;IAElE,MAAM,UAAU,aAAa,KAAK,KAAK,KAAK,GAAG,KAAK;IAEpD,MAAM,kBAAkB,SAAS,MAAM;KACrC;KACA;KACA,MAAM,gBAAgB;KACtB;KACA,WAAW,CAAC;KACZ;KACA,yBAAQ,IAAI,KAAK,GAAE,YAAY;IACjC,CAAC;IACD,OAAO;GACT,SAAS,KAAK;IACZ,OAAO,OAAO,KAAK,cAAc,MAAM,IAAK,IAAc,SAAS;GACrE;GAEA,SAAS,OAAO,YAAY;EAC9B;EAEA,SAAS,OAAO,YAAY,SAAS;EACrC,cAAc,SAAS,QAAQ;CACjC,OAAO;EACL,WAAW,MAAM,QAAQ,UAAU,eAAe,GAAG,OAAO;EAC5D,SAAS,OAAO,YAAY,SAAS;CACvC;CAIF,IAAI,CAAC,QAAQ,cAAc,OAAO;CAElC,OAAO;AACT"}
|
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/schemas/sources.d.ts
|
|
5
|
+
|
|
6
|
+
declare const GlobalSourcesSchema: z.ZodObject<{
|
|
7
|
+
gmail: z.ZodOptional<z.ZodObject<{
|
|
8
|
+
type: z.ZodLiteral<"gmail">;
|
|
9
|
+
query: z.ZodString;
|
|
10
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
type: "gmail";
|
|
13
|
+
query: string;
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
}, {
|
|
16
|
+
type: "gmail";
|
|
17
|
+
query: string;
|
|
18
|
+
enabled?: boolean | undefined;
|
|
19
|
+
}>>;
|
|
20
|
+
calendar: z.ZodOptional<z.ZodObject<{
|
|
21
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
}, {
|
|
25
|
+
enabled?: boolean | undefined;
|
|
26
|
+
}>>;
|
|
27
|
+
transcripts: z.ZodOptional<z.ZodObject<{
|
|
28
|
+
type: z.ZodLiteral<"transcript">;
|
|
29
|
+
paths: z.ZodArray<z.ZodString, "many">;
|
|
30
|
+
extensions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
31
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
32
|
+
}, "strip", z.ZodTypeAny, {
|
|
33
|
+
type: "transcript";
|
|
34
|
+
enabled: boolean;
|
|
35
|
+
paths: string[];
|
|
36
|
+
extensions: string[];
|
|
37
|
+
}, {
|
|
38
|
+
type: "transcript";
|
|
39
|
+
paths: string[];
|
|
40
|
+
enabled?: boolean | undefined;
|
|
41
|
+
extensions?: string[] | undefined;
|
|
42
|
+
}>>;
|
|
43
|
+
version: z.ZodDefault<z.ZodNumber>;
|
|
44
|
+
created: z.ZodString;
|
|
45
|
+
}, "strip", z.ZodTypeAny, {
|
|
46
|
+
version: number;
|
|
47
|
+
created: string;
|
|
48
|
+
gmail?: {
|
|
49
|
+
type: "gmail";
|
|
50
|
+
query: string;
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
} | undefined;
|
|
53
|
+
calendar?: {
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
} | undefined;
|
|
56
|
+
transcripts?: {
|
|
57
|
+
type: "transcript";
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
paths: string[];
|
|
60
|
+
extensions: string[];
|
|
61
|
+
} | undefined;
|
|
62
|
+
}, {
|
|
63
|
+
created: string;
|
|
64
|
+
gmail?: {
|
|
65
|
+
type: "gmail";
|
|
66
|
+
query: string;
|
|
67
|
+
enabled?: boolean | undefined;
|
|
68
|
+
} | undefined;
|
|
69
|
+
calendar?: {
|
|
70
|
+
enabled?: boolean | undefined;
|
|
71
|
+
} | undefined;
|
|
72
|
+
transcripts?: {
|
|
73
|
+
type: "transcript";
|
|
74
|
+
paths: string[];
|
|
75
|
+
enabled?: boolean | undefined;
|
|
76
|
+
extensions?: string[] | undefined;
|
|
77
|
+
} | undefined;
|
|
78
|
+
version?: number | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
type GlobalSources = z.infer<typeof GlobalSourcesSchema>;
|
|
81
|
+
//# sourceMappingURL=sources.d.ts.map
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region src/schemas/main-facts.d.ts
|
|
84
|
+
declare const MainFactsSchema: z.ZodObject<{
|
|
85
|
+
name: z.ZodString;
|
|
86
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
87
|
+
email: z.ZodOptional<z.ZodString>;
|
|
88
|
+
phone: z.ZodOptional<z.ZodString>;
|
|
89
|
+
industry: z.ZodOptional<z.ZodString>;
|
|
90
|
+
relationship_stage: z.ZodEnum<["prospect", "active", "churned", "paused"]>;
|
|
91
|
+
deal_value: z.ZodOptional<z.ZodNumber>;
|
|
92
|
+
currency: z.ZodDefault<z.ZodString>;
|
|
93
|
+
primary_contact: z.ZodOptional<z.ZodString>;
|
|
94
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
95
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
96
|
+
created: z.ZodEffects<z.ZodString, string, unknown>;
|
|
97
|
+
updated: z.ZodEffects<z.ZodString, string, unknown>;
|
|
98
|
+
}, "strip", z.ZodTypeAny, {
|
|
99
|
+
created: string;
|
|
100
|
+
name: string;
|
|
101
|
+
relationship_stage: "prospect" | "active" | "churned" | "paused";
|
|
102
|
+
currency: string;
|
|
103
|
+
tags: string[];
|
|
104
|
+
updated: string;
|
|
105
|
+
domain?: string | undefined;
|
|
106
|
+
email?: string | undefined;
|
|
107
|
+
phone?: string | undefined;
|
|
108
|
+
industry?: string | undefined;
|
|
109
|
+
deal_value?: number | undefined;
|
|
110
|
+
primary_contact?: string | undefined;
|
|
111
|
+
timezone?: string | undefined;
|
|
112
|
+
}, {
|
|
113
|
+
name: string;
|
|
114
|
+
relationship_stage: "prospect" | "active" | "churned" | "paused";
|
|
115
|
+
created?: unknown;
|
|
116
|
+
domain?: string | undefined;
|
|
117
|
+
email?: string | undefined;
|
|
118
|
+
phone?: string | undefined;
|
|
119
|
+
industry?: string | undefined;
|
|
120
|
+
deal_value?: number | undefined;
|
|
121
|
+
currency?: string | undefined;
|
|
122
|
+
primary_contact?: string | undefined;
|
|
123
|
+
timezone?: string | undefined;
|
|
124
|
+
tags?: string[] | undefined;
|
|
125
|
+
updated?: unknown;
|
|
126
|
+
}>;
|
|
127
|
+
type MainFacts = z.infer<typeof MainFactsSchema>;
|
|
128
|
+
//# sourceMappingURL=main-facts.d.ts.map
|
|
129
|
+
//#endregion
|
|
130
|
+
//#region src/schemas/interaction.d.ts
|
|
131
|
+
declare const InteractionEntrySchema: z.ZodObject<{
|
|
132
|
+
date: z.ZodString;
|
|
133
|
+
type: z.ZodEnum<["Email", "Call", "Meeting", "Note", "Demo", "Proposal", "Contract", "Other"]>;
|
|
134
|
+
direction: z.ZodOptional<z.ZodEnum<["inbound", "outbound"]>>;
|
|
135
|
+
with: z.ZodString;
|
|
136
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
137
|
+
summary: z.ZodString;
|
|
138
|
+
nextSteps: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
139
|
+
sourceRef: z.ZodString;
|
|
140
|
+
synced: z.ZodString;
|
|
141
|
+
}, "strip", z.ZodTypeAny, {
|
|
142
|
+
type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
|
|
143
|
+
date: string;
|
|
144
|
+
with: string;
|
|
145
|
+
summary: string;
|
|
146
|
+
nextSteps: string[];
|
|
147
|
+
sourceRef: string;
|
|
148
|
+
synced: string;
|
|
149
|
+
direction?: "inbound" | "outbound" | undefined;
|
|
150
|
+
subject?: string | undefined;
|
|
151
|
+
}, {
|
|
152
|
+
type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
|
|
153
|
+
date: string;
|
|
154
|
+
with: string;
|
|
155
|
+
summary: string;
|
|
156
|
+
sourceRef: string;
|
|
157
|
+
synced: string;
|
|
158
|
+
direction?: "inbound" | "outbound" | undefined;
|
|
159
|
+
subject?: string | undefined;
|
|
160
|
+
nextSteps?: string[] | undefined;
|
|
161
|
+
}>;
|
|
162
|
+
type InteractionEntry = z.infer<typeof InteractionEntrySchema>;
|
|
163
|
+
//# sourceMappingURL=interaction.d.ts.map
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region src/schemas/pipeline.d.ts
|
|
166
|
+
declare const PipelineDealSchema: z.ZodObject<{
|
|
167
|
+
name: z.ZodString;
|
|
168
|
+
stage: z.ZodEnum<["lead", "qualified", "proposal", "negotiation", "won", "lost"]>;
|
|
169
|
+
value: z.ZodOptional<z.ZodNumber>;
|
|
170
|
+
currency: z.ZodDefault<z.ZodString>;
|
|
171
|
+
probability: z.ZodOptional<z.ZodNumber>;
|
|
172
|
+
close_date: z.ZodOptional<z.ZodString>;
|
|
173
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
174
|
+
updated: z.ZodString;
|
|
175
|
+
}, "strip", z.ZodTypeAny, {
|
|
176
|
+
name: string;
|
|
177
|
+
currency: string;
|
|
178
|
+
updated: string;
|
|
179
|
+
stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
|
|
180
|
+
value?: number | undefined;
|
|
181
|
+
probability?: number | undefined;
|
|
182
|
+
close_date?: string | undefined;
|
|
183
|
+
notes?: string | undefined;
|
|
184
|
+
}, {
|
|
185
|
+
name: string;
|
|
186
|
+
updated: string;
|
|
187
|
+
stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
|
|
188
|
+
value?: number | undefined;
|
|
189
|
+
currency?: string | undefined;
|
|
190
|
+
probability?: number | undefined;
|
|
191
|
+
close_date?: string | undefined;
|
|
192
|
+
notes?: string | undefined;
|
|
193
|
+
}>;
|
|
194
|
+
type PipelineDeal = z.infer<typeof PipelineDealSchema>;
|
|
195
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/schemas/ticket.d.ts
|
|
198
|
+
declare const TicketStatusSchema: z.ZodEnum<["open", "in-progress", "waiting", "resolved", "closed"]>;
|
|
199
|
+
declare const TicketPrioritySchema: z.ZodEnum<["urgent", "high", "normal", "low"]>;
|
|
200
|
+
declare const TicketSchema: z.ZodObject<{
|
|
201
|
+
id: z.ZodString;
|
|
202
|
+
title: z.ZodString;
|
|
203
|
+
status: z.ZodEnum<["open", "in-progress", "waiting", "resolved", "closed"]>;
|
|
204
|
+
priority: z.ZodDefault<z.ZodEnum<["urgent", "high", "normal", "low"]>>;
|
|
205
|
+
assignee: z.ZodOptional<z.ZodString>;
|
|
206
|
+
created: z.ZodString;
|
|
207
|
+
slaDue: z.ZodOptional<z.ZodString>;
|
|
208
|
+
resolved: z.ZodOptional<z.ZodString>;
|
|
209
|
+
description: z.ZodOptional<z.ZodString>;
|
|
210
|
+
}, "strip", z.ZodTypeAny, {
|
|
211
|
+
status: "open" | "in-progress" | "waiting" | "resolved" | "closed";
|
|
212
|
+
created: string;
|
|
213
|
+
id: string;
|
|
214
|
+
title: string;
|
|
215
|
+
priority: "urgent" | "high" | "normal" | "low";
|
|
216
|
+
resolved?: string | undefined;
|
|
217
|
+
assignee?: string | undefined;
|
|
218
|
+
slaDue?: string | undefined;
|
|
219
|
+
description?: string | undefined;
|
|
220
|
+
}, {
|
|
221
|
+
status: "open" | "in-progress" | "waiting" | "resolved" | "closed";
|
|
222
|
+
created: string;
|
|
223
|
+
id: string;
|
|
224
|
+
title: string;
|
|
225
|
+
resolved?: string | undefined;
|
|
226
|
+
priority?: "urgent" | "high" | "normal" | "low" | undefined;
|
|
227
|
+
assignee?: string | undefined;
|
|
228
|
+
slaDue?: string | undefined;
|
|
229
|
+
description?: string | undefined;
|
|
230
|
+
}>;
|
|
231
|
+
type Ticket = z.infer<typeof TicketSchema>;
|
|
232
|
+
type TicketStatus = z.infer<typeof TicketStatusSchema>;
|
|
233
|
+
type TicketPriority = z.infer<typeof TicketPrioritySchema>;
|
|
234
|
+
//# sourceMappingURL=ticket.d.ts.map
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/schemas/quote.d.ts
|
|
237
|
+
declare const QuoteLineItemSchema: z.ZodObject<{
|
|
238
|
+
description: z.ZodString;
|
|
239
|
+
quantity: z.ZodNumber;
|
|
240
|
+
unitPrice: z.ZodNumber;
|
|
241
|
+
total: z.ZodNumber;
|
|
242
|
+
}, "strip", z.ZodTypeAny, {
|
|
243
|
+
description: string;
|
|
244
|
+
quantity: number;
|
|
245
|
+
unitPrice: number;
|
|
246
|
+
total: number;
|
|
247
|
+
}, {
|
|
248
|
+
description: string;
|
|
249
|
+
quantity: number;
|
|
250
|
+
unitPrice: number;
|
|
251
|
+
total: number;
|
|
252
|
+
}>;
|
|
253
|
+
declare const QuoteSchema: z.ZodObject<{
|
|
254
|
+
quoteNumber: z.ZodString;
|
|
255
|
+
slug: z.ZodString;
|
|
256
|
+
dealName: z.ZodString;
|
|
257
|
+
lineItems: z.ZodArray<z.ZodObject<{
|
|
258
|
+
description: z.ZodString;
|
|
259
|
+
quantity: z.ZodNumber;
|
|
260
|
+
unitPrice: z.ZodNumber;
|
|
261
|
+
total: z.ZodNumber;
|
|
262
|
+
}, "strip", z.ZodTypeAny, {
|
|
263
|
+
description: string;
|
|
264
|
+
quantity: number;
|
|
265
|
+
unitPrice: number;
|
|
266
|
+
total: number;
|
|
267
|
+
}, {
|
|
268
|
+
description: string;
|
|
269
|
+
quantity: number;
|
|
270
|
+
unitPrice: number;
|
|
271
|
+
total: number;
|
|
272
|
+
}>, "many">;
|
|
273
|
+
subtotal: z.ZodNumber;
|
|
274
|
+
vatPercent: z.ZodNumber;
|
|
275
|
+
vat: z.ZodNumber;
|
|
276
|
+
total: z.ZodNumber;
|
|
277
|
+
currency: z.ZodDefault<z.ZodString>;
|
|
278
|
+
createdAt: z.ZodString;
|
|
279
|
+
validUntilDays: z.ZodDefault<z.ZodNumber>;
|
|
280
|
+
validUntil: z.ZodString;
|
|
281
|
+
status: z.ZodDefault<z.ZodEnum<["draft", "sent", "viewed", "accepted", "declined"]>>;
|
|
282
|
+
viewedAt: z.ZodOptional<z.ZodString>;
|
|
283
|
+
acceptedAt: z.ZodOptional<z.ZodString>;
|
|
284
|
+
htmlPath: z.ZodOptional<z.ZodString>;
|
|
285
|
+
}, "strip", z.ZodTypeAny, {
|
|
286
|
+
status: "draft" | "sent" | "viewed" | "accepted" | "declined";
|
|
287
|
+
currency: string;
|
|
288
|
+
total: number;
|
|
289
|
+
quoteNumber: string;
|
|
290
|
+
slug: string;
|
|
291
|
+
dealName: string;
|
|
292
|
+
lineItems: {
|
|
293
|
+
description: string;
|
|
294
|
+
quantity: number;
|
|
295
|
+
unitPrice: number;
|
|
296
|
+
total: number;
|
|
297
|
+
}[];
|
|
298
|
+
subtotal: number;
|
|
299
|
+
vatPercent: number;
|
|
300
|
+
vat: number;
|
|
301
|
+
createdAt: string;
|
|
302
|
+
validUntilDays: number;
|
|
303
|
+
validUntil: string;
|
|
304
|
+
viewedAt?: string | undefined;
|
|
305
|
+
acceptedAt?: string | undefined;
|
|
306
|
+
htmlPath?: string | undefined;
|
|
307
|
+
}, {
|
|
308
|
+
total: number;
|
|
309
|
+
quoteNumber: string;
|
|
310
|
+
slug: string;
|
|
311
|
+
dealName: string;
|
|
312
|
+
lineItems: {
|
|
313
|
+
description: string;
|
|
314
|
+
quantity: number;
|
|
315
|
+
unitPrice: number;
|
|
316
|
+
total: number;
|
|
317
|
+
}[];
|
|
318
|
+
subtotal: number;
|
|
319
|
+
vatPercent: number;
|
|
320
|
+
vat: number;
|
|
321
|
+
createdAt: string;
|
|
322
|
+
validUntil: string;
|
|
323
|
+
status?: "draft" | "sent" | "viewed" | "accepted" | "declined" | undefined;
|
|
324
|
+
currency?: string | undefined;
|
|
325
|
+
validUntilDays?: number | undefined;
|
|
326
|
+
viewedAt?: string | undefined;
|
|
327
|
+
acceptedAt?: string | undefined;
|
|
328
|
+
htmlPath?: string | undefined;
|
|
329
|
+
}>;
|
|
330
|
+
type QuoteLineItem = z.infer<typeof QuoteLineItemSchema>;
|
|
331
|
+
type Quote = z.infer<typeof QuoteSchema>;
|
|
332
|
+
//# sourceMappingURL=quote.d.ts.map
|
|
333
|
+
//#endregion
|
|
334
|
+
//#region src/schemas/kb-article.d.ts
|
|
335
|
+
declare const KbArticleSchema: z.ZodObject<{
|
|
336
|
+
id: z.ZodString;
|
|
337
|
+
title: z.ZodString;
|
|
338
|
+
category: z.ZodDefault<z.ZodString>;
|
|
339
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
340
|
+
public: z.ZodDefault<z.ZodBoolean>;
|
|
341
|
+
createdAt: z.ZodString;
|
|
342
|
+
updatedAt: z.ZodString;
|
|
343
|
+
sourceTicketId: z.ZodOptional<z.ZodString>;
|
|
344
|
+
}, "strip", z.ZodTypeAny, {
|
|
345
|
+
tags: string[];
|
|
346
|
+
id: string;
|
|
347
|
+
title: string;
|
|
348
|
+
createdAt: string;
|
|
349
|
+
category: string;
|
|
350
|
+
public: boolean;
|
|
351
|
+
updatedAt: string;
|
|
352
|
+
sourceTicketId?: string | undefined;
|
|
353
|
+
}, {
|
|
354
|
+
id: string;
|
|
355
|
+
title: string;
|
|
356
|
+
createdAt: string;
|
|
357
|
+
updatedAt: string;
|
|
358
|
+
tags?: string[] | undefined;
|
|
359
|
+
category?: string | undefined;
|
|
360
|
+
public?: boolean | undefined;
|
|
361
|
+
sourceTicketId?: string | undefined;
|
|
362
|
+
}>;
|
|
363
|
+
type KbArticleMeta = z.infer<typeof KbArticleSchema>;
|
|
364
|
+
type KbArticle = KbArticleMeta & {
|
|
365
|
+
body: string;
|
|
366
|
+
};
|
|
367
|
+
//# sourceMappingURL=kb-article.d.ts.map
|
|
368
|
+
//#endregion
|
|
369
|
+
//#region src/schemas/survey.d.ts
|
|
370
|
+
declare const SurveyDefinitionSchema: z.ZodObject<{
|
|
371
|
+
id: z.ZodString;
|
|
372
|
+
type: z.ZodDefault<z.ZodEnum<["nps", "csat", "ces"]>>;
|
|
373
|
+
question: z.ZodString;
|
|
374
|
+
scale: z.ZodDefault<z.ZodObject<{
|
|
375
|
+
min: z.ZodDefault<z.ZodNumber>;
|
|
376
|
+
max: z.ZodDefault<z.ZodNumber>;
|
|
377
|
+
}, "strip", z.ZodTypeAny, {
|
|
378
|
+
min: number;
|
|
379
|
+
max: number;
|
|
380
|
+
}, {
|
|
381
|
+
min?: number | undefined;
|
|
382
|
+
max?: number | undefined;
|
|
383
|
+
}>>;
|
|
384
|
+
includeComment: z.ZodDefault<z.ZodBoolean>;
|
|
385
|
+
commentPrompt: z.ZodOptional<z.ZodString>;
|
|
386
|
+
createdAt: z.ZodString;
|
|
387
|
+
}, "strip", z.ZodTypeAny, {
|
|
388
|
+
type: "nps" | "csat" | "ces";
|
|
389
|
+
id: string;
|
|
390
|
+
createdAt: string;
|
|
391
|
+
question: string;
|
|
392
|
+
scale: {
|
|
393
|
+
min: number;
|
|
394
|
+
max: number;
|
|
395
|
+
};
|
|
396
|
+
includeComment: boolean;
|
|
397
|
+
commentPrompt?: string | undefined;
|
|
398
|
+
}, {
|
|
399
|
+
id: string;
|
|
400
|
+
createdAt: string;
|
|
401
|
+
question: string;
|
|
402
|
+
type?: "nps" | "csat" | "ces" | undefined;
|
|
403
|
+
scale?: {
|
|
404
|
+
min?: number | undefined;
|
|
405
|
+
max?: number | undefined;
|
|
406
|
+
} | undefined;
|
|
407
|
+
includeComment?: boolean | undefined;
|
|
408
|
+
commentPrompt?: string | undefined;
|
|
409
|
+
}>;
|
|
410
|
+
declare const SurveyResponseSchema: z.ZodObject<{
|
|
411
|
+
surveyId: z.ZodString;
|
|
412
|
+
slug: z.ZodString;
|
|
413
|
+
contactEmail: z.ZodString;
|
|
414
|
+
score: z.ZodNumber;
|
|
415
|
+
comment: z.ZodOptional<z.ZodString>;
|
|
416
|
+
respondedAt: z.ZodString;
|
|
417
|
+
token: z.ZodString;
|
|
418
|
+
sentAt: z.ZodString;
|
|
419
|
+
}, "strip", z.ZodTypeAny, {
|
|
420
|
+
slug: string;
|
|
421
|
+
surveyId: string;
|
|
422
|
+
contactEmail: string;
|
|
423
|
+
score: number;
|
|
424
|
+
respondedAt: string;
|
|
425
|
+
token: string;
|
|
426
|
+
sentAt: string;
|
|
427
|
+
comment?: string | undefined;
|
|
428
|
+
}, {
|
|
429
|
+
slug: string;
|
|
430
|
+
surveyId: string;
|
|
431
|
+
contactEmail: string;
|
|
432
|
+
score: number;
|
|
433
|
+
respondedAt: string;
|
|
434
|
+
token: string;
|
|
435
|
+
sentAt: string;
|
|
436
|
+
comment?: string | undefined;
|
|
437
|
+
}>;
|
|
438
|
+
type SurveyDefinition = z.infer<typeof SurveyDefinitionSchema>;
|
|
439
|
+
type SurveyResponse = z.infer<typeof SurveyResponseSchema>;
|
|
440
|
+
//# sourceMappingURL=survey.d.ts.map
|
|
441
|
+
//#endregion
|
|
442
|
+
//#region src/commands/create.d.ts
|
|
443
|
+
declare function createCustomer(opts: {
|
|
444
|
+
name: string;
|
|
445
|
+
domain?: string;
|
|
446
|
+
email?: string;
|
|
447
|
+
dataDir?: string;
|
|
448
|
+
}): Promise<{
|
|
449
|
+
id: string;
|
|
450
|
+
dir: string;
|
|
451
|
+
}>;
|
|
452
|
+
//#endregion
|
|
453
|
+
//#region src/commands/backup.d.ts
|
|
454
|
+
interface BackupManifest {
|
|
455
|
+
version: "1";
|
|
456
|
+
createdAt: string;
|
|
457
|
+
dxcrmVersion: string;
|
|
458
|
+
directories: string[];
|
|
459
|
+
customerCount: number;
|
|
460
|
+
fileCount: number;
|
|
461
|
+
totalBytes: number;
|
|
462
|
+
sha256: string;
|
|
463
|
+
encrypted: boolean;
|
|
464
|
+
retentionTier?: "daily" | "weekly" | "monthly";
|
|
465
|
+
}
|
|
466
|
+
declare function runBackup(output?: string, dataDir?: string, opts?: {
|
|
467
|
+
encrypt?: boolean;
|
|
468
|
+
remote?: string;
|
|
469
|
+
}): Promise<BackupManifest | null>;
|
|
470
|
+
//#endregion
|
|
471
|
+
//#region src/commands/audit.d.ts
|
|
472
|
+
declare function runAudit(opts: {
|
|
473
|
+
slug?: string;
|
|
474
|
+
actor?: string;
|
|
475
|
+
limit?: number;
|
|
476
|
+
tail?: boolean;
|
|
477
|
+
}, dataDir?: string): Promise<void>;
|
|
478
|
+
//#endregion
|
|
479
|
+
//#region src/commands/validate.d.ts
|
|
480
|
+
declare function runValidate(opts: {
|
|
481
|
+
fix?: boolean;
|
|
482
|
+
}, dataDir: string): Promise<void>;
|
|
483
|
+
//#endregion
|
|
484
|
+
//#region src/fs/customer-dir.d.ts
|
|
485
|
+
declare function customerExists(dataDir: string, slug: string): boolean;
|
|
486
|
+
/** List all customer slugs (immediate subdirectories of customers/). */
|
|
487
|
+
|
|
488
|
+
declare function readMainFacts(dataDir: string, slug: string): Promise<MainFacts>;
|
|
489
|
+
//# sourceMappingURL=customer-dir.d.ts.map
|
|
490
|
+
//#endregion
|
|
491
|
+
//#region src/fs/audit-log.d.ts
|
|
492
|
+
interface AuditEntry {
|
|
493
|
+
timestamp: string;
|
|
494
|
+
actor: string;
|
|
495
|
+
tool: string;
|
|
496
|
+
slug: string;
|
|
497
|
+
summary: string;
|
|
498
|
+
}
|
|
499
|
+
declare function readAuditLog(dataDir: string): AuditEntry[];
|
|
500
|
+
declare function filterAuditLog(entries: AuditEntry[], opts: {
|
|
501
|
+
slug?: string;
|
|
502
|
+
actor?: string;
|
|
503
|
+
limit?: number;
|
|
504
|
+
}): AuditEntry[];
|
|
505
|
+
//# sourceMappingURL=audit-log.d.ts.map
|
|
506
|
+
//#endregion
|
|
507
|
+
//#region src/core/rbac.d.ts
|
|
508
|
+
type Role = "admin" | "manager" | "rep";
|
|
509
|
+
interface RbacConfig {
|
|
510
|
+
actors: Record<string, Role>;
|
|
511
|
+
default?: Role;
|
|
512
|
+
owned_customers?: Record<string, string[]>;
|
|
513
|
+
/** Field-level ACL: field name → roles allowed to see it. Others get it redacted. */
|
|
514
|
+
field_acl?: Record<string, Role[]>;
|
|
515
|
+
}
|
|
516
|
+
declare function getRbacConfig(dataDir: string): RbacConfig;
|
|
517
|
+
declare function getRole(dataDir: string, actor: string): Role;
|
|
518
|
+
declare function canSeeCustomer(dataDir: string, actor: string, slug: string): boolean;
|
|
519
|
+
/** Load the field-level ACL (field → allowed roles) from rbac.json. */
|
|
520
|
+
//#endregion
|
|
521
|
+
//#region src/core/session-store.d.ts
|
|
522
|
+
interface Session {
|
|
523
|
+
customerSlug: string;
|
|
524
|
+
customerName: string;
|
|
525
|
+
startedAt: string;
|
|
526
|
+
owner?: string;
|
|
527
|
+
}
|
|
528
|
+
declare function setSession(s: Session): void;
|
|
529
|
+
declare function getSession(): Session | null;
|
|
530
|
+
declare function clearSession(): void;
|
|
531
|
+
//# sourceMappingURL=session-store.d.ts.map
|
|
532
|
+
//#endregion
|
|
533
|
+
//#region src/version.d.ts
|
|
534
|
+
declare const VERSION = "0.1.0";
|
|
535
|
+
//# sourceMappingURL=version.d.ts.map
|
|
536
|
+
|
|
537
|
+
//#endregion
|
|
538
|
+
export { type GlobalSources, type InteractionEntry, type KbArticle, type MainFacts, type PipelineDeal, type QuoteLineItem, type Quote as QuoteRecord, type SurveyDefinition, type SurveyResponse, type TicketPriority, type Ticket as TicketRecord, type TicketStatus, VERSION, canSeeCustomer, clearSession, createCustomer, customerExists, filterAuditLog, getRbacConfig, getRole, getSession, readAuditLog, readMainFacts, runAudit, runBackup, runValidate, setSession };
|
|
539
|
+
//# sourceMappingURL=index-V8BFaH-b.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-V8BFaH-b.d.ts","names":[],"sources":["../src/schemas/sources.ts","../src/schemas/main-facts.ts","../src/schemas/interaction.ts","../src/schemas/pipeline.ts","../src/schemas/ticket.ts","../src/schemas/quote.ts","../src/schemas/kb-article.ts","../src/schemas/survey.ts","../src/commands/create.ts","../src/commands/backup.ts","../src/commands/audit.ts","../src/commands/validate.ts","../src/fs/customer-dir.ts","../src/fs/audit-log.ts","../src/core/rbac.ts","../src/core/session-store.ts","../src/version.ts"],"mappings":"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"}
|