@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.
Files changed (251) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +767 -0
  3. package/dist/agent-config-zPvcqu07.js +14 -0
  4. package/dist/agent-config-zPvcqu07.js.map +1 -0
  5. package/dist/approvals-DpjxGHFp.js +67 -0
  6. package/dist/approvals-DpjxGHFp.js.map +1 -0
  7. package/dist/ask-CID3jnuL.js +52 -0
  8. package/dist/ask-CID3jnuL.js.map +1 -0
  9. package/dist/audit-log-DNMY9mUZ.js +49 -0
  10. package/dist/audit-log-DNMY9mUZ.js.map +1 -0
  11. package/dist/auth-CyFuu9X_.js +2 -0
  12. package/dist/auth-DFWwWcYD.js +93 -0
  13. package/dist/auth-DFWwWcYD.js.map +1 -0
  14. package/dist/autofill-Di_-SP7t.js +51 -0
  15. package/dist/autofill-Di_-SP7t.js.map +1 -0
  16. package/dist/backup-CeMk9z86.js +417 -0
  17. package/dist/backup-CeMk9z86.js.map +1 -0
  18. package/dist/backup-f_hC7rBV.js +2 -0
  19. package/dist/calendly-Bft_wwji.js +52 -0
  20. package/dist/calendly-Bft_wwji.js.map +1 -0
  21. package/dist/calendly-D3coO92o.cjs +53 -0
  22. package/dist/calendly-D3coO92o.cjs.map +1 -0
  23. package/dist/chunk-DakpK96I.cjs +43 -0
  24. package/dist/churn-C28IgnAj.js +54 -0
  25. package/dist/churn-C28IgnAj.js.map +1 -0
  26. package/dist/cli.js +4396 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/colors-BG07TZQz.js +11 -0
  29. package/dist/colors-BG07TZQz.js.map +1 -0
  30. package/dist/compliance-B1kk5-YS.js +115 -0
  31. package/dist/compliance-B1kk5-YS.js.map +1 -0
  32. package/dist/compliance-B91zNvCR.cjs +156 -0
  33. package/dist/compliance-B91zNvCR.cjs.map +1 -0
  34. package/dist/compliance-CKSBoQUe.js +118 -0
  35. package/dist/compliance-CKSBoQUe.js.map +1 -0
  36. package/dist/compliance-CujOqAKk.js +2 -0
  37. package/dist/context-builder-BzWAp3Zs.js +96 -0
  38. package/dist/context-builder-BzWAp3Zs.js.map +1 -0
  39. package/dist/context-builder-DlrRcqmJ.js +2 -0
  40. package/dist/conversation-intel-mm7Lhemh.js +72 -0
  41. package/dist/conversation-intel-mm7Lhemh.js.map +1 -0
  42. package/dist/custom-fields-CzNeD3_v.js +2 -0
  43. package/dist/custom-fields-Pl2t9xzp.js +73 -0
  44. package/dist/custom-fields-Pl2t9xzp.js.map +1 -0
  45. package/dist/custom-objects-BHgn1GEX.js +78 -0
  46. package/dist/custom-objects-BHgn1GEX.js.map +1 -0
  47. package/dist/custom-objects-CIFrmQ2V.js +2 -0
  48. package/dist/customer-dir-DIylZ8Q6.js +75 -0
  49. package/dist/customer-dir-DIylZ8Q6.js.map +1 -0
  50. package/dist/daemon/worker.js +207 -0
  51. package/dist/daemon/worker.js.map +1 -0
  52. package/dist/enrichment-3XvgGDfB.js +103 -0
  53. package/dist/enrichment-3XvgGDfB.js.map +1 -0
  54. package/dist/file-lock-B_zi7NQl.js +22 -0
  55. package/dist/file-lock-B_zi7NQl.js.map +1 -0
  56. package/dist/gmail-auth-BP6cJwfw.js +40 -0
  57. package/dist/gmail-auth-BP6cJwfw.js.map +1 -0
  58. package/dist/gmail-auth-DxakCtGm.cjs +44 -0
  59. package/dist/gmail-auth-DxakCtGm.cjs.map +1 -0
  60. package/dist/gmail-auth-OComS92L.js +40 -0
  61. package/dist/gmail-auth-OComS92L.js.map +1 -0
  62. package/dist/gmail-push-watch-DELQFMPk.js +20 -0
  63. package/dist/gmail-push-watch-DELQFMPk.js.map +1 -0
  64. package/dist/gmail-sender-StTpJ9Ub.js +32 -0
  65. package/dist/gmail-sender-StTpJ9Ub.js.map +1 -0
  66. package/dist/gmail-sync-DIaxInDT.js +204 -0
  67. package/dist/gmail-sync-DIaxInDT.js.map +1 -0
  68. package/dist/gmail-sync-hHm9gaWd.cjs +218 -0
  69. package/dist/gmail-sync-hHm9gaWd.cjs.map +1 -0
  70. package/dist/gmail-sync-rQaVqKWd.js +214 -0
  71. package/dist/gmail-sync-rQaVqKWd.js.map +1 -0
  72. package/dist/gmail-webhook-handler-DS7OlRPX.js +3 -0
  73. package/dist/gmail-webhook-handler-e5Od25FX.js +97 -0
  74. package/dist/gmail-webhook-handler-e5Od25FX.js.map +1 -0
  75. package/dist/goal-engine-CUZSpERI.js +2 -0
  76. package/dist/goal-engine-KpBftn4V.js +295 -0
  77. package/dist/goal-engine-KpBftn4V.js.map +1 -0
  78. package/dist/google-drive-sync-DEPcqFca.js +105 -0
  79. package/dist/google-drive-sync-DEPcqFca.js.map +1 -0
  80. package/dist/hybrid-search-BmHttLrR.js +40 -0
  81. package/dist/hybrid-search-BmHttLrR.js.map +1 -0
  82. package/dist/hygiene-DZqfYpFf.js +38 -0
  83. package/dist/hygiene-DZqfYpFf.js.map +1 -0
  84. package/dist/identity-CI6olMNm.js +41 -0
  85. package/dist/identity-CI6olMNm.js.map +1 -0
  86. package/dist/identity-gyfWdrcX.js +2 -0
  87. package/dist/import-hubspot-BaK71U_K.js +588 -0
  88. package/dist/import-hubspot-BaK71U_K.js.map +1 -0
  89. package/dist/index-V8BFaH-b.d.ts +539 -0
  90. package/dist/index-V8BFaH-b.d.ts.map +1 -0
  91. package/dist/index-YqwMd6aQ.d.cts +538 -0
  92. package/dist/index-YqwMd6aQ.d.cts.map +1 -0
  93. package/dist/index.cjs +185 -0
  94. package/dist/index.cjs.map +1 -0
  95. package/dist/index.d.cts +538 -0
  96. package/dist/index.d.cts.map +1 -0
  97. package/dist/index.d.ts +539 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +165 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/interactions-writer-CrPStUll.cjs +77 -0
  102. package/dist/interactions-writer-CrPStUll.cjs.map +1 -0
  103. package/dist/interactions-writer-DO3KcSR3.js +52 -0
  104. package/dist/interactions-writer-DO3KcSR3.js.map +1 -0
  105. package/dist/interactions-writer-SLHnoEeE.js +46 -0
  106. package/dist/interactions-writer-SLHnoEeE.js.map +1 -0
  107. package/dist/interactions-writer-dSPy1XfO.js +2 -0
  108. package/dist/knowledge-base-D0Fh40kc.js +1013 -0
  109. package/dist/knowledge-base-D0Fh40kc.js.map +1 -0
  110. package/dist/lancedb-CCBbpulq.js +2 -0
  111. package/dist/lancedb-rlvWoPwl.js +98 -0
  112. package/dist/lancedb-rlvWoPwl.js.map +1 -0
  113. package/dist/lead-model-BCFzyktm.js +109 -0
  114. package/dist/lead-model-BCFzyktm.js.map +1 -0
  115. package/dist/llm-DEjWcqmW.js +2 -0
  116. package/dist/llm-DvzZqva0.js +372 -0
  117. package/dist/llm-DvzZqva0.js.map +1 -0
  118. package/dist/llm-Z8RIYkpF.js +174 -0
  119. package/dist/llm-Z8RIYkpF.js.map +1 -0
  120. package/dist/llm-iijeXmgq.cjs +198 -0
  121. package/dist/llm-iijeXmgq.cjs.map +1 -0
  122. package/dist/mcp-CdTJWTJf.d.cts +12 -0
  123. package/dist/mcp-CdTJWTJf.d.cts.map +1 -0
  124. package/dist/mcp-CdTJWTJf.d.ts +12 -0
  125. package/dist/mcp-CdTJWTJf.d.ts.map +1 -0
  126. package/dist/mcp.cjs +7464 -0
  127. package/dist/mcp.cjs.map +1 -0
  128. package/dist/mcp.d.cts +12 -0
  129. package/dist/mcp.d.cts.map +1 -0
  130. package/dist/mcp.d.ts +12 -0
  131. package/dist/mcp.d.ts.map +1 -0
  132. package/dist/mcp.js +7448 -0
  133. package/dist/mcp.js.map +1 -0
  134. package/dist/memory-Bb6ky3kb.js +58 -0
  135. package/dist/memory-Bb6ky3kb.js.map +1 -0
  136. package/dist/memory-Cy6-Tbyl.js +2 -0
  137. package/dist/metrics-DH8wHvya.js +26 -0
  138. package/dist/metrics-DH8wHvya.js.map +1 -0
  139. package/dist/microsoft-auth-B8_S45gh.js +17 -0
  140. package/dist/microsoft-auth-B8_S45gh.js.map +1 -0
  141. package/dist/microsoft-calendar-B6MMtUQK.js +67 -0
  142. package/dist/microsoft-calendar-B6MMtUQK.js.map +1 -0
  143. package/dist/microsoft-sync-CpZVoSuq.js +68 -0
  144. package/dist/microsoft-sync-CpZVoSuq.js.map +1 -0
  145. package/dist/nba-3wanmJ0U.js +48 -0
  146. package/dist/nba-3wanmJ0U.js.map +1 -0
  147. package/dist/notification-dispatcher-0vYNngWe.js +97 -0
  148. package/dist/notification-dispatcher-0vYNngWe.js.map +1 -0
  149. package/dist/opportunity-score-BTMOQSTV.js +47 -0
  150. package/dist/opportunity-score-BTMOQSTV.js.map +1 -0
  151. package/dist/pipedrive-client-CdGKpH9b.js +17 -0
  152. package/dist/pipedrive-client-CdGKpH9b.js.map +1 -0
  153. package/dist/pipeline-writer-BqBrYrQc.js +2 -0
  154. package/dist/pipeline-writer-BvVquKIe.js +96 -0
  155. package/dist/pipeline-writer-BvVquKIe.js.map +1 -0
  156. package/dist/pipeline-writer-N2omexxp.cjs +121 -0
  157. package/dist/pipeline-writer-N2omexxp.cjs.map +1 -0
  158. package/dist/pipeline-writer-eufx_0o1.js +102 -0
  159. package/dist/pipeline-writer-eufx_0o1.js.map +1 -0
  160. package/dist/proactive-agent-BgQXw3ac.js +96 -0
  161. package/dist/proactive-agent-BgQXw3ac.js.map +1 -0
  162. package/dist/proactive-worker-BrLHNhjH.js +229 -0
  163. package/dist/proactive-worker-BrLHNhjH.js.map +1 -0
  164. package/dist/push-manager-CdqIIkuh.js +108 -0
  165. package/dist/push-manager-CdqIIkuh.js.map +1 -0
  166. package/dist/push-manager-CowY-0IK.js +2 -0
  167. package/dist/quote-generator-BfwENXzg.js +133 -0
  168. package/dist/quote-generator-BfwENXzg.js.map +1 -0
  169. package/dist/quote-generator-OhSFsi3x.js +2 -0
  170. package/dist/rbac-C7c8tcES.js +2 -0
  171. package/dist/rbac-CTIktZaC.js +91 -0
  172. package/dist/rbac-CTIktZaC.js.map +1 -0
  173. package/dist/relationship-health-odxEoQdJ.js +454 -0
  174. package/dist/relationship-health-odxEoQdJ.js.map +1 -0
  175. package/dist/revenue-simulation-BJdRTEHc.js +2 -0
  176. package/dist/revenue-simulation-Bqf2DLVB.js +251 -0
  177. package/dist/revenue-simulation-Bqf2DLVB.js.map +1 -0
  178. package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
  179. package/dist/salesforce-client-rhZFa_p5.js +51 -0
  180. package/dist/salesforce-client-rhZFa_p5.js.map +1 -0
  181. package/dist/segments-BqcD5HIl.js +61 -0
  182. package/dist/segments-BqcD5HIl.js.map +1 -0
  183. package/dist/sequence-engine-CCTHEBgi.js +2 -0
  184. package/dist/sequence-engine-J1lTW_in.js +91 -0
  185. package/dist/sequence-engine-J1lTW_in.js.map +1 -0
  186. package/dist/sequence-store-DaaWr0Os.js +221 -0
  187. package/dist/sequence-store-DaaWr0Os.js.map +1 -0
  188. package/dist/server-Dyva03K8.js +4287 -0
  189. package/dist/server-Dyva03K8.js.map +1 -0
  190. package/dist/session-B9AilxOE.js +81 -0
  191. package/dist/session-B9AilxOE.js.map +1 -0
  192. package/dist/session-D0qFkBla.cjs +82 -0
  193. package/dist/session-D0qFkBla.cjs.map +1 -0
  194. package/dist/session-D9ub6Wl1.js +79 -0
  195. package/dist/session-D9ub6Wl1.js.map +1 -0
  196. package/dist/session-mWHA71Lw.js +2 -0
  197. package/dist/session-store-B0QZE8Bx.cjs +697 -0
  198. package/dist/session-store-B0QZE8Bx.cjs.map +1 -0
  199. package/dist/session-store-C8tEvMPw.js +543 -0
  200. package/dist/session-store-C8tEvMPw.js.map +1 -0
  201. package/dist/session-store-CEa39Dxs.js +15 -0
  202. package/dist/session-store-CEa39Dxs.js.map +1 -0
  203. package/dist/sla-engine-5IhTsBUR.js +2 -0
  204. package/dist/sla-engine-BqX-7u-7.js +53 -0
  205. package/dist/sla-engine-BqX-7u-7.js.map +1 -0
  206. package/dist/sop-DkhVChGy.js +2 -0
  207. package/dist/sop-Vp0UPWFW.js +70 -0
  208. package/dist/sop-Vp0UPWFW.js.map +1 -0
  209. package/dist/survey-engine-C06hcQt3.js +2 -0
  210. package/dist/survey-engine-DBjCYqCv.js +147 -0
  211. package/dist/survey-engine-DBjCYqCv.js.map +1 -0
  212. package/dist/sync-state-ChaLbamC.js +33 -0
  213. package/dist/sync-state-ChaLbamC.js.map +1 -0
  214. package/dist/sync-state-CwLSt_1m.js +2 -0
  215. package/dist/ticket-writer-CjqKeIRD.js +2 -0
  216. package/dist/ticket-writer-j2oX_Wal.js +134 -0
  217. package/dist/ticket-writer-j2oX_Wal.js.map +1 -0
  218. package/dist/tone-Bdm5uaht.js +48 -0
  219. package/dist/tone-Bdm5uaht.js.map +1 -0
  220. package/dist/tone-DRKlZgPr.cjs +43 -0
  221. package/dist/tone-DRKlZgPr.cjs.map +1 -0
  222. package/dist/tone-vNb2DAAD.js +39 -0
  223. package/dist/tone-vNb2DAAD.js.map +1 -0
  224. package/dist/transcript-watcher-CL2QUygI.js +132 -0
  225. package/dist/transcript-watcher-CL2QUygI.js.map +1 -0
  226. package/dist/unmatched-transcripts-BsH5bhkU.js +26 -0
  227. package/dist/unmatched-transcripts-BsH5bhkU.js.map +1 -0
  228. package/dist/unmatched-transcripts-D0PrJ9iz.js +2 -0
  229. package/dist/update-deal-BNwPGaTV.js +2 -0
  230. package/dist/update-deal-DKC79skb.js +91 -0
  231. package/dist/update-deal-DKC79skb.js.map +1 -0
  232. package/dist/usage-CClTf5e6.cjs +57 -0
  233. package/dist/usage-CClTf5e6.cjs.map +1 -0
  234. package/dist/usage-D0-TYJkw.js +93 -0
  235. package/dist/usage-D0-TYJkw.js.map +1 -0
  236. package/dist/usage-D0u9a-lV.js +54 -0
  237. package/dist/usage-D0u9a-lV.js.map +1 -0
  238. package/dist/vault-C1D3zScD.js +2 -0
  239. package/dist/vault-DXCg29W-.js +86 -0
  240. package/dist/vault-DXCg29W-.js.map +1 -0
  241. package/dist/webhooks-7EpA05Qr.js +138 -0
  242. package/dist/webhooks-7EpA05Qr.js.map +1 -0
  243. package/dist/webhooks-BO2UAnmn.js +94 -0
  244. package/dist/webhooks-BO2UAnmn.js.map +1 -0
  245. package/dist/webhooks-Xn6zO6kd.cjs +97 -0
  246. package/dist/webhooks-Xn6zO6kd.cjs.map +1 -0
  247. package/dist/write-queue-BDolUxfs.cjs +26 -0
  248. package/dist/write-queue-BDolUxfs.cjs.map +1 -0
  249. package/dist/write-queue-IbsAjUnh.js +21 -0
  250. package/dist/write-queue-IbsAjUnh.js.map +1 -0
  251. package/package.json +142 -0
@@ -0,0 +1,221 @@
1
+ import { i as readMainFacts } from "./customer-dir-DIylZ8Q6.js";
2
+ import { t as withJsonFile } from "./file-lock-B_zi7NQl.js";
3
+ import path from "path";
4
+ import fs from "fs";
5
+ import matter from "gray-matter";
6
+ import { z } from "zod";
7
+ import yaml from "js-yaml";
8
+ //#region src/schemas/email-template.ts
9
+ const EmailTemplateSchema = z.object({
10
+ id: z.string().min(1),
11
+ subject: z.string().min(1),
12
+ category: z.string().default("general"),
13
+ variables: z.array(z.string()).default([]),
14
+ language: z.string().default("de"),
15
+ createdAt: z.string(),
16
+ updatedAt: z.string().optional()
17
+ });
18
+ //#endregion
19
+ //#region src/fs/template-store.ts
20
+ function templatesDir(dataDir) {
21
+ return path.join(dataDir, ".agentic", "templates");
22
+ }
23
+ function parseTemplateFile(filePath, id) {
24
+ try {
25
+ const raw = matter(fs.readFileSync(filePath, "utf-8"));
26
+ const result = EmailTemplateSchema.safeParse({
27
+ id,
28
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
29
+ ...raw.data
30
+ });
31
+ if (!result.success) return null;
32
+ return {
33
+ ...result.data,
34
+ body: raw.content.trim()
35
+ };
36
+ } catch {
37
+ return null;
38
+ }
39
+ }
40
+ function listTemplates(dataDir, opts) {
41
+ const base = templatesDir(dataDir);
42
+ if (!fs.existsSync(base)) return [];
43
+ const results = [];
44
+ const categories = fs.readdirSync(base).filter((name) => {
45
+ try {
46
+ return fs.statSync(path.join(base, name)).isDirectory();
47
+ } catch {
48
+ return false;
49
+ }
50
+ });
51
+ for (const cat of categories) {
52
+ if (opts?.category && cat !== opts.category) continue;
53
+ const catDir = path.join(base, cat);
54
+ const files = fs.readdirSync(catDir).filter((f) => f.endsWith(".md"));
55
+ for (const file of files) {
56
+ const id = file.replace(/\.md$/, "");
57
+ const tmpl = parseTemplateFile(path.join(catDir, file), id);
58
+ if (tmpl) results.push(tmpl);
59
+ }
60
+ }
61
+ return results;
62
+ }
63
+ function getTemplate(dataDir, id) {
64
+ const base = templatesDir(dataDir);
65
+ if (!fs.existsSync(base)) return null;
66
+ const categories = fs.existsSync(base) ? fs.readdirSync(base).filter((n) => {
67
+ try {
68
+ return fs.statSync(path.join(base, n)).isDirectory();
69
+ } catch {
70
+ return false;
71
+ }
72
+ }) : [];
73
+ for (const cat of categories) {
74
+ const p = path.join(base, cat, `${id}.md`);
75
+ if (fs.existsSync(p)) return parseTemplateFile(p, id);
76
+ }
77
+ return null;
78
+ }
79
+ function writeTemplate(dataDir, tmpl) {
80
+ const { body, ...meta } = tmpl;
81
+ const category = meta.category ?? "general";
82
+ const dir = path.join(templatesDir(dataDir), category);
83
+ fs.mkdirSync(dir, { recursive: true });
84
+ const content = matter.stringify(body, {
85
+ ...meta,
86
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
87
+ });
88
+ fs.writeFileSync(path.join(dir, `${tmpl.id}.md`), content, "utf-8");
89
+ }
90
+ function deleteTemplate(dataDir, id) {
91
+ const tmpl = getTemplate(dataDir, id);
92
+ if (!tmpl) return false;
93
+ const p = path.join(templatesDir(dataDir), tmpl.category, `${id}.md`);
94
+ if (fs.existsSync(p)) {
95
+ fs.unlinkSync(p);
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+ //#endregion
101
+ //#region src/core/template-engine.ts
102
+ const VARIABLE_REGEX = /\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g;
103
+ function interpolate(template, vars) {
104
+ return template.replace(VARIABLE_REGEX, (match, key) => {
105
+ const val = vars[key];
106
+ return val !== void 0 ? String(val) : match;
107
+ });
108
+ }
109
+ function extractVariables(template) {
110
+ return [...template.matchAll(new RegExp(VARIABLE_REGEX.source, "g"))].map((m) => m[1]);
111
+ }
112
+ async function buildVariablesFromCustomer(dataDir, slug) {
113
+ const facts = await readMainFacts(dataDir, slug).catch(() => null);
114
+ const now = /* @__PURE__ */ new Date();
115
+ return {
116
+ company: facts?.name ?? slug,
117
+ domain: facts?.domain ?? "",
118
+ email: facts?.email ?? "",
119
+ stage: facts?.relationship_stage ?? "",
120
+ slug,
121
+ date: now.toLocaleDateString("de-DE"),
122
+ year: now.getFullYear(),
123
+ month: now.toLocaleDateString("de-DE", { month: "long" })
124
+ };
125
+ }
126
+ //#endregion
127
+ //#region src/schemas/sequence.ts
128
+ const SequenceStepSchema = z.object({
129
+ day: z.number().int().min(0),
130
+ templateId: z.string().min(1),
131
+ skipIfReplied: z.boolean().default(true)
132
+ });
133
+ const SequenceSchema = z.object({
134
+ id: z.string().min(1),
135
+ name: z.string().min(1),
136
+ steps: z.array(SequenceStepSchema).min(1),
137
+ createdAt: z.string()
138
+ });
139
+ const SequenceEnrollmentSchema = z.object({
140
+ id: z.string(),
141
+ sequenceId: z.string(),
142
+ slug: z.string(),
143
+ contactEmail: z.string().email(),
144
+ enrolledAt: z.string(),
145
+ status: z.enum([
146
+ "active",
147
+ "paused",
148
+ "completed",
149
+ "bounced"
150
+ ]),
151
+ currentStep: z.number().int().min(0),
152
+ stepsCompleted: z.array(z.number()),
153
+ lastSentAt: z.string().optional(),
154
+ lastRepliedAt: z.string().optional()
155
+ });
156
+ //#endregion
157
+ //#region src/fs/sequence-store.ts
158
+ function sequencesDir(dataDir) {
159
+ return path.join(dataDir, ".agentic", "sequences");
160
+ }
161
+ function enrollmentsPath(dataDir) {
162
+ return path.join(dataDir, ".agentic", "sequence-enrollments.json");
163
+ }
164
+ function listSequences(dataDir) {
165
+ const dir = sequencesDir(dataDir);
166
+ if (!fs.existsSync(dir)) return [];
167
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith(".yaml"));
168
+ const results = [];
169
+ for (const file of files) try {
170
+ const content = fs.readFileSync(path.join(dir, file), "utf-8");
171
+ const raw = yaml.load(content);
172
+ const parsed = SequenceSchema.safeParse(raw);
173
+ if (parsed.success) results.push(parsed.data);
174
+ } catch {}
175
+ return results;
176
+ }
177
+ function getSequence(dataDir, id) {
178
+ return listSequences(dataDir).find((s) => s.id === id) ?? null;
179
+ }
180
+ function writeSequence(dataDir, seq) {
181
+ const dir = sequencesDir(dataDir);
182
+ fs.mkdirSync(dir, { recursive: true });
183
+ const content = yaml.dump(seq);
184
+ fs.writeFileSync(path.join(dir, `${seq.id}.yaml`), content, "utf-8");
185
+ }
186
+ function readEnrollments(dataDir) {
187
+ const p = enrollmentsPath(dataDir);
188
+ if (!fs.existsSync(p)) return [];
189
+ try {
190
+ const raw = JSON.parse(fs.readFileSync(p, "utf-8"));
191
+ return Array.isArray(raw) ? raw : [];
192
+ } catch {
193
+ return [];
194
+ }
195
+ }
196
+ async function writeEnrollment(dataDir, enrollment) {
197
+ await withJsonFile(enrollmentsPath(dataDir), (current) => {
198
+ return [...Array.isArray(current) ? current : [], enrollment];
199
+ });
200
+ }
201
+ async function updateEnrollment(dataDir, id, updates) {
202
+ let updated = null;
203
+ await withJsonFile(enrollmentsPath(dataDir), (current) => {
204
+ const existing = Array.isArray(current) ? current : [];
205
+ const idx = existing.findIndex((e) => e.id === id);
206
+ if (idx < 0) return existing;
207
+ const merged = SequenceEnrollmentSchema.parse({
208
+ ...existing[idx],
209
+ ...updates
210
+ });
211
+ updated = merged;
212
+ const next = [...existing];
213
+ next[idx] = merged;
214
+ return next;
215
+ });
216
+ return updated;
217
+ }
218
+ //#endregion
219
+ export { writeEnrollment as a, extractVariables as c, getTemplate as d, listTemplates as f, updateEnrollment as i, interpolate as l, listSequences as n, writeSequence as o, writeTemplate as p, readEnrollments as r, buildVariablesFromCustomer as s, getSequence as t, deleteTemplate as u };
220
+
221
+ //# sourceMappingURL=sequence-store-DaaWr0Os.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence-store-DaaWr0Os.js","names":[],"sources":["../src/schemas/email-template.ts","../src/fs/template-store.ts","../src/core/template-engine.ts","../src/schemas/sequence.ts","../src/fs/sequence-store.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const EmailTemplateSchema = z.object({\n id: z.string().min(1),\n subject: z.string().min(1),\n category: z.string().default(\"general\"),\n variables: z.array(z.string()).default([]),\n language: z.string().default(\"de\"),\n createdAt: z.string(),\n updatedAt: z.string().optional(),\n});\n\nexport type EmailTemplateMeta = z.infer<typeof EmailTemplateSchema>;\n\nexport interface EmailTemplate extends EmailTemplateMeta {\n body: string;\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport matter from \"gray-matter\";\nimport { EmailTemplateSchema, type EmailTemplate } from \"../schemas/email-template.js\";\n\nexport function templatesDir(dataDir: string): string {\n return path.join(dataDir, \".agentic\", \"templates\");\n}\n\nfunction parseTemplateFile(filePath: string, id: string): EmailTemplate | null {\n try {\n const raw = matter(fs.readFileSync(filePath, \"utf-8\"));\n const result = EmailTemplateSchema.safeParse({\n id,\n createdAt: new Date().toISOString(),\n ...raw.data,\n });\n if (!result.success) return null;\n return { ...result.data, body: raw.content.trim() };\n } catch {\n return null;\n }\n}\n\nexport function listTemplates(dataDir: string, opts?: { category?: string }): EmailTemplate[] {\n const base = templatesDir(dataDir);\n if (!fs.existsSync(base)) return [];\n const results: EmailTemplate[] = [];\n\n const categories = fs.readdirSync(base).filter((name) => {\n try {\n return fs.statSync(path.join(base, name)).isDirectory();\n } catch {\n return false;\n }\n });\n\n for (const cat of categories) {\n if (opts?.category && cat !== opts.category) continue;\n const catDir = path.join(base, cat);\n const files = fs.readdirSync(catDir).filter((f) => f.endsWith(\".md\"));\n for (const file of files) {\n const id = file.replace(/\\.md$/, \"\");\n const tmpl = parseTemplateFile(path.join(catDir, file), id);\n if (tmpl) results.push(tmpl);\n }\n }\n return results;\n}\n\nexport function getTemplate(dataDir: string, id: string): EmailTemplate | null {\n const base = templatesDir(dataDir);\n if (!fs.existsSync(base)) return null;\n\n // Search all categories\n const categories = fs.existsSync(base)\n ? fs.readdirSync(base).filter((n) => {\n try {\n return fs.statSync(path.join(base, n)).isDirectory();\n } catch {\n return false;\n }\n })\n : [];\n\n for (const cat of categories) {\n const p = path.join(base, cat, `${id}.md`);\n if (fs.existsSync(p)) return parseTemplateFile(p, id);\n }\n return null;\n}\n\nexport function writeTemplate(dataDir: string, tmpl: EmailTemplate): void {\n const { body, ...meta } = tmpl;\n const category = meta.category ?? \"general\";\n const dir = path.join(templatesDir(dataDir), category);\n fs.mkdirSync(dir, { recursive: true });\n const content = matter.stringify(body, { ...meta, updatedAt: new Date().toISOString() });\n fs.writeFileSync(path.join(dir, `${tmpl.id}.md`), content, \"utf-8\");\n}\n\nexport function deleteTemplate(dataDir: string, id: string): boolean {\n const tmpl = getTemplate(dataDir, id);\n if (!tmpl) return false;\n const p = path.join(templatesDir(dataDir), tmpl.category, `${id}.md`);\n if (fs.existsSync(p)) {\n fs.unlinkSync(p);\n return true;\n }\n return false;\n}\n","import { readMainFacts } from \"../fs/customer-dir.js\";\n\nexport type TemplateVariables = Record<string, string | number | undefined>;\n\nconst VARIABLE_REGEX = /\\{\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}\\}/g;\n\nexport function interpolate(template: string, vars: TemplateVariables): string {\n return template.replace(VARIABLE_REGEX, (match, key: string) => {\n const val = vars[key];\n return val !== undefined ? String(val) : match; // keep {{key}} if unresolved\n });\n}\n\nexport function extractVariables(template: string): string[] {\n return [...template.matchAll(new RegExp(VARIABLE_REGEX.source, \"g\"))].map((m) => m[1]!);\n}\n\nexport async function buildVariablesFromCustomer(\n dataDir: string,\n slug: string\n): Promise<TemplateVariables> {\n const facts = await readMainFacts(dataDir, slug).catch(() => null);\n const now = new Date();\n return {\n company: facts?.name ?? slug,\n domain: facts?.domain ?? \"\",\n email: facts?.email ?? \"\",\n stage: facts?.relationship_stage ?? \"\",\n slug,\n date: now.toLocaleDateString(\"de-DE\"),\n year: now.getFullYear(),\n month: now.toLocaleDateString(\"de-DE\", { month: \"long\" }),\n };\n}\n","import { z } from \"zod\";\n\nexport const SequenceStepSchema = z.object({\n day: z.number().int().min(0),\n templateId: z.string().min(1),\n skipIfReplied: z.boolean().default(true),\n});\n\nexport const SequenceSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n steps: z.array(SequenceStepSchema).min(1),\n createdAt: z.string(),\n});\n\nexport const SequenceEnrollmentSchema = z.object({\n id: z.string(),\n sequenceId: z.string(),\n slug: z.string(),\n contactEmail: z.string().email(),\n enrolledAt: z.string(),\n status: z.enum([\"active\", \"paused\", \"completed\", \"bounced\"]),\n currentStep: z.number().int().min(0),\n stepsCompleted: z.array(z.number()),\n lastSentAt: z.string().optional(),\n lastRepliedAt: z.string().optional(),\n});\n\nexport type SequenceStep = z.infer<typeof SequenceStepSchema>;\nexport type Sequence = z.infer<typeof SequenceSchema>;\nexport type SequenceEnrollment = z.infer<typeof SequenceEnrollmentSchema>;\n","import fs from \"fs\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\nimport { withJsonFile } from \"../core/file-lock.js\";\nimport {\n SequenceSchema,\n SequenceEnrollmentSchema,\n type Sequence,\n type SequenceEnrollment,\n} from \"../schemas/sequence.js\";\n\nexport function sequencesDir(dataDir: string): string {\n return path.join(dataDir, \".agentic\", \"sequences\");\n}\n\nexport function enrollmentsPath(dataDir: string): string {\n return path.join(dataDir, \".agentic\", \"sequence-enrollments.json\");\n}\n\nexport function listSequences(dataDir: string): Sequence[] {\n const dir = sequencesDir(dataDir);\n if (!fs.existsSync(dir)) return [];\n\n const files = fs.readdirSync(dir).filter((f) => f.endsWith(\".yaml\"));\n const results: Sequence[] = [];\n\n for (const file of files) {\n try {\n const content = fs.readFileSync(path.join(dir, file), \"utf-8\") as string;\n const raw = yaml.load(content);\n const parsed = SequenceSchema.safeParse(raw);\n if (parsed.success) {\n results.push(parsed.data);\n }\n } catch {\n // skip invalid files\n }\n }\n\n return results;\n}\n\nexport function getSequence(dataDir: string, id: string): Sequence | null {\n const sequences = listSequences(dataDir);\n return sequences.find((s) => s.id === id) ?? null;\n}\n\nexport function writeSequence(dataDir: string, seq: Sequence): void {\n const dir = sequencesDir(dataDir);\n fs.mkdirSync(dir, { recursive: true });\n const content = yaml.dump(seq);\n fs.writeFileSync(path.join(dir, `${seq.id}.yaml`), content, \"utf-8\");\n}\n\nexport function readEnrollments(dataDir: string): SequenceEnrollment[] {\n const p = enrollmentsPath(dataDir);\n if (!fs.existsSync(p)) return [];\n try {\n const raw = JSON.parse(fs.readFileSync(p, \"utf-8\") as string) as unknown;\n return Array.isArray(raw) ? (raw as SequenceEnrollment[]) : [];\n } catch {\n return [];\n }\n}\n\nexport async function writeEnrollment(\n dataDir: string,\n enrollment: SequenceEnrollment\n): Promise<void> {\n await withJsonFile<SequenceEnrollment[]>(enrollmentsPath(dataDir), (current) => {\n const existing = Array.isArray(current) ? current : [];\n return [...existing, enrollment];\n });\n}\n\nexport async function updateEnrollment(\n dataDir: string,\n id: string,\n updates: Partial<SequenceEnrollment>\n): Promise<SequenceEnrollment | null> {\n let updated: SequenceEnrollment | null = null;\n\n await withJsonFile<SequenceEnrollment[]>(enrollmentsPath(dataDir), (current) => {\n const existing = Array.isArray(current) ? current : [];\n const idx = existing.findIndex((e) => e.id === id);\n if (idx < 0) return existing;\n\n const merged = SequenceEnrollmentSchema.parse({ ...existing[idx], ...updates });\n updated = merged;\n const next = [...existing];\n next[idx] = merged;\n return next;\n });\n\n return updated;\n}\n"],"mappings":"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"}