@datasynx/agentic-crm 0.1.0 → 1.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 (309) hide show
  1. package/README.md +270 -669
  2. package/dist/{approvals-DpjxGHFp.js → approvals-CmDT2eUg.js} +7 -24
  3. package/dist/approvals-CmDT2eUg.js.map +1 -0
  4. package/dist/{ask-CID3jnuL.js → ask-CDysGnRg.js} +6 -6
  5. package/dist/{ask-CID3jnuL.js.map → ask-CDysGnRg.js.map} +1 -1
  6. package/dist/atomic-write-8yjqqLtS.js +29 -0
  7. package/dist/atomic-write-8yjqqLtS.js.map +1 -0
  8. package/dist/atomic-write-BYmF-ThH.cjs +37 -0
  9. package/dist/atomic-write-BYmF-ThH.cjs.map +1 -0
  10. package/dist/attachments-CX2GAtsw.cjs +517 -0
  11. package/dist/attachments-CX2GAtsw.cjs.map +1 -0
  12. package/dist/attachments-D207gXfN.js +514 -0
  13. package/dist/attachments-D207gXfN.js.map +1 -0
  14. package/dist/attachments-rLa96rOK.js +514 -0
  15. package/dist/attachments-rLa96rOK.js.map +1 -0
  16. package/dist/auth-B5DcjJ_6.js +2 -0
  17. package/dist/{auth-DFWwWcYD.js → auth-DDXZTwS0.js} +4 -13
  18. package/dist/auth-DDXZTwS0.js.map +1 -0
  19. package/dist/{autofill-Di_-SP7t.js → autofill-B9VtlR2j.js} +2 -2
  20. package/dist/{autofill-Di_-SP7t.js.map → autofill-B9VtlR2j.js.map} +1 -1
  21. package/dist/{backup-CeMk9z86.js → backup-CTlIxUdO.js} +5 -7
  22. package/dist/backup-CTlIxUdO.js.map +1 -0
  23. package/dist/backup-LFnC09oV.js +2 -0
  24. package/dist/chunk-BfDYWZQ8.cjs +32 -0
  25. package/dist/chunk-BfDYWZQ8.cjs.map +1 -0
  26. package/dist/chunk-BhUZmQg5.js +32 -0
  27. package/dist/chunk-BhUZmQg5.js.map +1 -0
  28. package/dist/chunk-ChC83jai.js +2 -0
  29. package/dist/chunk-e_w8qqtP.js +32 -0
  30. package/dist/chunk-e_w8qqtP.js.map +1 -0
  31. package/dist/{churn-C28IgnAj.js → churn-DN9WDGNM.js} +3 -3
  32. package/dist/{churn-C28IgnAj.js.map → churn-DN9WDGNM.js.map} +1 -1
  33. package/dist/cli.js +285 -186
  34. package/dist/cli.js.map +1 -1
  35. package/dist/{compliance-CKSBoQUe.js → compliance-Bc12Hn9a.js} +3 -3
  36. package/dist/{compliance-CKSBoQUe.js.map → compliance-Bc12Hn9a.js.map} +1 -1
  37. package/dist/{compliance-CujOqAKk.js → compliance-TqYQXhBj.js} +1 -1
  38. package/dist/{compliance-B1kk5-YS.js → compliance-kq0xHRw3.js} +3 -3
  39. package/dist/{compliance-B1kk5-YS.js.map → compliance-kq0xHRw3.js.map} +1 -1
  40. package/dist/{compliance-B91zNvCR.cjs → compliance-pAj9FcGI.cjs} +3 -3
  41. package/dist/{compliance-B91zNvCR.cjs.map → compliance-pAj9FcGI.cjs.map} +1 -1
  42. package/dist/{context-builder-BzWAp3Zs.js → context-builder-7Uab5-G4.js} +3 -2
  43. package/dist/context-builder-7Uab5-G4.js.map +1 -0
  44. package/dist/context-builder-hmOPvgso.js +2 -0
  45. package/dist/{custom-fields-CzNeD3_v.js → custom-fields-BMyz5Ruh.js} +1 -1
  46. package/dist/{custom-fields-Pl2t9xzp.js → custom-fields-GzpOHW_2.js} +4 -13
  47. package/dist/custom-fields-GzpOHW_2.js.map +1 -0
  48. package/dist/{custom-objects-CIFrmQ2V.js → custom-objects-BNy-ayR-.js} +1 -1
  49. package/dist/{custom-objects-BHgn1GEX.js → custom-objects-CxW1gHwJ.js} +10 -25
  50. package/dist/custom-objects-CxW1gHwJ.js.map +1 -0
  51. package/dist/{customer-dir-DIylZ8Q6.js → customer-dir-CkMMXhb0.js} +9 -4
  52. package/dist/customer-dir-CkMMXhb0.js.map +1 -0
  53. package/dist/daemon/worker.js +66 -40
  54. package/dist/daemon/worker.js.map +1 -1
  55. package/dist/doctor-C14-vnJ1.js +103 -0
  56. package/dist/doctor-C14-vnJ1.js.map +1 -0
  57. package/dist/email-body-BFSRa0AW.cjs +42 -0
  58. package/dist/email-body-BFSRa0AW.cjs.map +1 -0
  59. package/dist/email-body-BOd7U-D2.js +42 -0
  60. package/dist/email-body-BOd7U-D2.js.map +1 -0
  61. package/dist/{enrichment-3XvgGDfB.js → enrichment-CDFdWmvD.js} +3 -3
  62. package/dist/{enrichment-3XvgGDfB.js.map → enrichment-CDFdWmvD.js.map} +1 -1
  63. package/dist/{file-lock-B_zi7NQl.js → file-lock-CcHotQkZ.js} +3 -4
  64. package/dist/file-lock-CcHotQkZ.js.map +1 -0
  65. package/dist/{gmail-sync-DIaxInDT.js → gmail-sync-B4Iu3AQb.js} +56 -22
  66. package/dist/gmail-sync-B4Iu3AQb.js.map +1 -0
  67. package/dist/{gmail-sync-hHm9gaWd.cjs → gmail-sync-BpSVESSe.cjs} +55 -21
  68. package/dist/gmail-sync-BpSVESSe.cjs.map +1 -0
  69. package/dist/{gmail-sync-rQaVqKWd.js → gmail-sync-DIbrPnTK.js} +55 -21
  70. package/dist/gmail-sync-DIbrPnTK.js.map +1 -0
  71. package/dist/{gmail-webhook-handler-e5Od25FX.js → gmail-webhook-handler-BzOFbvgh.js} +4 -4
  72. package/dist/{gmail-webhook-handler-e5Od25FX.js.map → gmail-webhook-handler-BzOFbvgh.js.map} +1 -1
  73. package/dist/{gmail-webhook-handler-DS7OlRPX.js → gmail-webhook-handler-CvSDW_Js.js} +2 -2
  74. package/dist/{goal-engine-KpBftn4V.js → goal-engine-BbroPhqm.js} +10 -11
  75. package/dist/goal-engine-BbroPhqm.js.map +1 -0
  76. package/dist/{goal-engine-CUZSpERI.js → goal-engine-CfDAJTFt.js} +1 -1
  77. package/dist/{google-drive-sync-DEPcqFca.js → google-drive-sync-B_I1d54Y.js} +3 -3
  78. package/dist/{google-drive-sync-DEPcqFca.js.map → google-drive-sync-B_I1d54Y.js.map} +1 -1
  79. package/dist/html-BaeOCZKE.js +36 -0
  80. package/dist/html-BaeOCZKE.js.map +1 -0
  81. package/dist/html-CmOku6jS.cjs +47 -0
  82. package/dist/html-CmOku6jS.cjs.map +1 -0
  83. package/dist/{hygiene-DZqfYpFf.js → hygiene-DzQPnc6P.js} +3 -3
  84. package/dist/{hygiene-DZqfYpFf.js.map → hygiene-DzQPnc6P.js.map} +1 -1
  85. package/dist/identity-CB7j-Zr1.js +2 -0
  86. package/dist/{identity-CI6olMNm.js → identity-_uZ3Lbr2.js} +2 -2
  87. package/dist/{identity-CI6olMNm.js.map → identity-_uZ3Lbr2.js.map} +1 -1
  88. package/dist/{import-hubspot-BaK71U_K.js → import-hubspot-CTId9IGV.js} +51 -45
  89. package/dist/import-hubspot-CTId9IGV.js.map +1 -0
  90. package/dist/{index-YqwMd6aQ.d.cts → index-BAutNcAT.d.cts} +20 -12
  91. package/dist/index-BAutNcAT.d.cts.map +1 -0
  92. package/dist/{index-V8BFaH-b.d.ts → index-FzDsNSSb.d.ts} +12 -4
  93. package/dist/index-FzDsNSSb.d.ts.map +1 -0
  94. package/dist/index.cjs +19 -21
  95. package/dist/index.cjs.map +1 -1
  96. package/dist/index.d.cts +20 -12
  97. package/dist/index.d.cts.map +1 -1
  98. package/dist/index.d.ts +12 -4
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +19 -21
  101. package/dist/index.js.map +1 -1
  102. package/dist/interactions-writer-B2y-73lh.js +2 -0
  103. package/dist/{interactions-writer-SLHnoEeE.js → interactions-writer-B8XAzdqR.js} +34 -4
  104. package/dist/interactions-writer-B8XAzdqR.js.map +1 -0
  105. package/dist/{interactions-writer-CrPStUll.cjs → interactions-writer-BRJNrefF.cjs} +7 -3
  106. package/dist/interactions-writer-BRJNrefF.cjs.map +1 -0
  107. package/dist/{interactions-writer-DO3KcSR3.js → interactions-writer-ZQcpFOh9.js} +7 -3
  108. package/dist/interactions-writer-ZQcpFOh9.js.map +1 -0
  109. package/dist/json-store-WWsFzXub.js +43 -0
  110. package/dist/json-store-WWsFzXub.js.map +1 -0
  111. package/dist/{knowledge-base-D0Fh40kc.js → knowledge-base--063Kpa3.js} +51 -22
  112. package/dist/knowledge-base--063Kpa3.js.map +1 -0
  113. package/dist/{lancedb-CCBbpulq.js → lancedb-CswQEE5K.js} +1 -1
  114. package/dist/{lancedb-rlvWoPwl.js → lancedb-CuHKNsNZ.js} +4 -3
  115. package/dist/lancedb-CuHKNsNZ.js.map +1 -0
  116. package/dist/{lead-model-BCFzyktm.js → lead-model-CEmx7te7.js} +6 -14
  117. package/dist/lead-model-CEmx7te7.js.map +1 -0
  118. package/dist/{llm-Z8RIYkpF.js → llm-BnSUBisu.js} +2 -2
  119. package/dist/{llm-Z8RIYkpF.js.map → llm-BnSUBisu.js.map} +1 -1
  120. package/dist/{llm-iijeXmgq.cjs → llm-CXycmEl9.cjs} +2 -2
  121. package/dist/{llm-iijeXmgq.cjs.map → llm-CXycmEl9.cjs.map} +1 -1
  122. package/dist/{llm-DEjWcqmW.js → llm-DSX1-wFu.js} +1 -1
  123. package/dist/{llm-DvzZqva0.js → llm-PZzgPphl.js} +3 -3
  124. package/dist/{llm-DvzZqva0.js.map → llm-PZzgPphl.js.map} +1 -1
  125. package/dist/logger-BkInaGoV.cjs +167 -0
  126. package/dist/logger-BkInaGoV.cjs.map +1 -0
  127. package/dist/logger-Dyl4VcLO.js +147 -0
  128. package/dist/logger-Dyl4VcLO.js.map +1 -0
  129. package/dist/logger-UaF5p9d1.js +147 -0
  130. package/dist/logger-UaF5p9d1.js.map +1 -0
  131. package/dist/logger-vKQS34w9.js +2 -0
  132. package/dist/mcp-CdTJWTJf.d.cts.map +1 -1
  133. package/dist/mcp-CdTJWTJf.d.ts.map +1 -1
  134. package/dist/mcp.cjs +365 -319
  135. package/dist/mcp.cjs.map +1 -1
  136. package/dist/mcp.d.cts.map +1 -1
  137. package/dist/mcp.d.ts.map +1 -1
  138. package/dist/mcp.js +365 -319
  139. package/dist/mcp.js.map +1 -1
  140. package/dist/{memory-Cy6-Tbyl.js → memory-D8hmgD9d.js} +1 -1
  141. package/dist/{memory-Bb6ky3kb.js → memory-Dzr9dXSM.js} +4 -11
  142. package/dist/memory-Dzr9dXSM.js.map +1 -0
  143. package/dist/{microsoft-calendar-B6MMtUQK.js → microsoft-calendar-BgVR8GDv.js} +4 -4
  144. package/dist/{microsoft-calendar-B6MMtUQK.js.map → microsoft-calendar-BgVR8GDv.js.map} +1 -1
  145. package/dist/{microsoft-sync-CpZVoSuq.js → microsoft-sync-D30_XksI.js} +5 -5
  146. package/dist/{microsoft-sync-CpZVoSuq.js.map → microsoft-sync-D30_XksI.js.map} +1 -1
  147. package/dist/{nba-3wanmJ0U.js → nba-DwdfM93s.js} +3 -3
  148. package/dist/{nba-3wanmJ0U.js.map → nba-DwdfM93s.js.map} +1 -1
  149. package/dist/{notification-dispatcher-0vYNngWe.js → notification-dispatcher-inpKyuBz.js} +7 -3
  150. package/dist/notification-dispatcher-inpKyuBz.js.map +1 -0
  151. package/dist/{pipeline-writer-BqBrYrQc.js → pipeline-writer-0LJ6Qkat.js} +1 -1
  152. package/dist/{pipeline-writer-N2omexxp.cjs → pipeline-writer-B1tRAhuD.cjs} +11 -3
  153. package/dist/pipeline-writer-B1tRAhuD.cjs.map +1 -0
  154. package/dist/{pipeline-writer-BvVquKIe.js → pipeline-writer-CIllfnZl.js} +5 -3
  155. package/dist/pipeline-writer-CIllfnZl.js.map +1 -0
  156. package/dist/{pipeline-writer-eufx_0o1.js → pipeline-writer-rDj-ni6q.js} +6 -4
  157. package/dist/pipeline-writer-rDj-ni6q.js.map +1 -0
  158. package/dist/{proactive-agent-BgQXw3ac.js → proactive-agent-B7u3Bj_l.js} +6 -6
  159. package/dist/{proactive-agent-BgQXw3ac.js.map → proactive-agent-B7u3Bj_l.js.map} +1 -1
  160. package/dist/{proactive-worker-BrLHNhjH.js → proactive-worker-1zkm6aJD.js} +7 -8
  161. package/dist/proactive-worker-1zkm6aJD.js.map +1 -0
  162. package/dist/{push-manager-CowY-0IK.js → push-manager-BXM-IHfP.js} +1 -1
  163. package/dist/{push-manager-CdqIIkuh.js → push-manager-C0ECQgva.js} +4 -4
  164. package/dist/push-manager-C0ECQgva.js.map +1 -0
  165. package/dist/{quote-generator-OhSFsi3x.js → quote-generator-ByUyIYtw.js} +1 -1
  166. package/dist/{quote-generator-BfwENXzg.js → quote-generator-CTdR8eEI.js} +5 -5
  167. package/dist/quote-generator-CTdR8eEI.js.map +1 -0
  168. package/dist/rbac-DzbyFhVH.js +2 -0
  169. package/dist/{rbac-CTIktZaC.js → rbac-msmBc_tK.js} +19 -12
  170. package/dist/rbac-msmBc_tK.js.map +1 -0
  171. package/dist/regex-Jt5DatPi.js +13 -0
  172. package/dist/regex-Jt5DatPi.js.map +1 -0
  173. package/dist/{relationship-health-odxEoQdJ.js → relationship-health-ZZNXR1RZ.js} +8 -16
  174. package/dist/relationship-health-ZZNXR1RZ.js.map +1 -0
  175. package/dist/{revenue-simulation-Bqf2DLVB.js → revenue-simulation-D8f_YkUY.js} +9 -19
  176. package/dist/revenue-simulation-D8f_YkUY.js.map +1 -0
  177. package/dist/{revenue-simulation-BJdRTEHc.js → revenue-simulation-njJZlTqm.js} +1 -1
  178. package/dist/safe-path-mpp0dKtO.js +18 -0
  179. package/dist/safe-path-mpp0dKtO.js.map +1 -0
  180. package/dist/{segments-BqcD5HIl.js → segments-DI3LOQNe.js} +5 -14
  181. package/dist/segments-DI3LOQNe.js.map +1 -0
  182. package/dist/sequence-engine-C6nnewHX.js +2 -0
  183. package/dist/{sequence-engine-J1lTW_in.js → sequence-engine-DNTVLq7o.js} +15 -8
  184. package/dist/sequence-engine-DNTVLq7o.js.map +1 -0
  185. package/dist/{sequence-store-DaaWr0Os.js → sequence-store-CmYb6s0g.js} +6 -5
  186. package/dist/sequence-store-CmYb6s0g.js.map +1 -0
  187. package/dist/{server-Dyva03K8.js → server-DoRPPOeR.js} +308 -230
  188. package/dist/server-DoRPPOeR.js.map +1 -0
  189. package/dist/{session-D9ub6Wl1.js → session-B6XaP83h.js} +3 -3
  190. package/dist/session-B6XaP83h.js.map +1 -0
  191. package/dist/{session-B9AilxOE.js → session-BgGDyP2C.js} +3 -3
  192. package/dist/session-BgGDyP2C.js.map +1 -0
  193. package/dist/session-Bp4zTh4l.js +2 -0
  194. package/dist/{session-D0qFkBla.cjs → session-Mm7GQbSH.cjs} +3 -3
  195. package/dist/session-Mm7GQbSH.cjs.map +1 -0
  196. package/dist/{session-store-C8tEvMPw.js → session-store-DWxJ5Pof.js} +79 -17
  197. package/dist/session-store-DWxJ5Pof.js.map +1 -0
  198. package/dist/{session-store-B0QZE8Bx.cjs → session-store-yfwnj0OC.cjs} +126 -16
  199. package/dist/session-store-yfwnj0OC.cjs.map +1 -0
  200. package/dist/{sla-engine-5IhTsBUR.js → sla-engine-CP2KiKDS.js} +1 -1
  201. package/dist/{sla-engine-BqX-7u-7.js → sla-engine-O-A1ntu_.js} +2 -2
  202. package/dist/{sla-engine-BqX-7u-7.js.map → sla-engine-O-A1ntu_.js.map} +1 -1
  203. package/dist/{sop-Vp0UPWFW.js → sop-BV7ICAFR.js} +4 -11
  204. package/dist/sop-BV7ICAFR.js.map +1 -0
  205. package/dist/{sop-DkhVChGy.js → sop-D33qTHUb.js} +1 -1
  206. package/dist/survey-engine-DKctGcLQ.js +2 -0
  207. package/dist/{survey-engine-DBjCYqCv.js → survey-engine-DngXBv47.js} +5 -4
  208. package/dist/survey-engine-DngXBv47.js.map +1 -0
  209. package/dist/{sync-state-CwLSt_1m.js → sync-state-BaA8LbTI.js} +1 -1
  210. package/dist/{sync-state-ChaLbamC.js → sync-state-DMZgzpez.js} +4 -12
  211. package/dist/sync-state-DMZgzpez.js.map +1 -0
  212. package/dist/{ticket-writer-CjqKeIRD.js → ticket-writer-DsfpeLGZ.js} +1 -1
  213. package/dist/{ticket-writer-j2oX_Wal.js → ticket-writer-a9on36Wb.js} +12 -24
  214. package/dist/ticket-writer-a9on36Wb.js.map +1 -0
  215. package/dist/{tone-Bdm5uaht.js → tone-C7bqK69y.js} +5 -12
  216. package/dist/tone-C7bqK69y.js.map +1 -0
  217. package/dist/{tone-DRKlZgPr.cjs → tone-Cmc7O2Fx.cjs} +3 -9
  218. package/dist/tone-Cmc7O2Fx.cjs.map +1 -0
  219. package/dist/{tone-vNb2DAAD.js → tone-mXSftvTn.js} +3 -8
  220. package/dist/tone-mXSftvTn.js.map +1 -0
  221. package/dist/{transcript-watcher-CL2QUygI.js → transcript-watcher-BoClrJAz.js} +18 -11
  222. package/dist/transcript-watcher-BoClrJAz.js.map +1 -0
  223. package/dist/unmatched-transcripts-C92zAoM4.js +2 -0
  224. package/dist/unmatched-transcripts-DC-VQ9YS.js +16 -0
  225. package/dist/unmatched-transcripts-DC-VQ9YS.js.map +1 -0
  226. package/dist/update-deal-CWy1eLJI.js +2 -0
  227. package/dist/{update-deal-DKC79skb.js → update-deal-DSzr_Aau.js} +3 -3
  228. package/dist/{update-deal-DKC79skb.js.map → update-deal-DSzr_Aau.js.map} +1 -1
  229. package/dist/{usage-D0-TYJkw.js → usage-BVlFlKW_.js} +8 -6
  230. package/dist/usage-BVlFlKW_.js.map +1 -0
  231. package/dist/usage-CClTf5e6.cjs.map +1 -1
  232. package/dist/usage-D0u9a-lV.js.map +1 -1
  233. package/dist/{vault-DXCg29W-.js → vault-CfwZdNzC.js} +3 -4
  234. package/dist/vault-CfwZdNzC.js.map +1 -0
  235. package/dist/{vault-C1D3zScD.js → vault-DxKP4_R2.js} +1 -1
  236. package/dist/{webhooks-Xn6zO6kd.cjs → webhooks-CwW-3kvG.cjs} +5 -19
  237. package/dist/webhooks-CwW-3kvG.cjs.map +1 -0
  238. package/dist/{webhooks-7EpA05Qr.js → webhooks-DXr1IoKn.js} +8 -21
  239. package/dist/webhooks-DXr1IoKn.js.map +1 -0
  240. package/dist/{webhooks-BO2UAnmn.js → webhooks-sWZ8CJtR.js} +5 -18
  241. package/dist/webhooks-sWZ8CJtR.js.map +1 -0
  242. package/package.json +22 -2
  243. package/dist/approvals-DpjxGHFp.js.map +0 -1
  244. package/dist/auth-CyFuu9X_.js +0 -2
  245. package/dist/auth-DFWwWcYD.js.map +0 -1
  246. package/dist/backup-CeMk9z86.js.map +0 -1
  247. package/dist/backup-f_hC7rBV.js +0 -2
  248. package/dist/context-builder-BzWAp3Zs.js.map +0 -1
  249. package/dist/context-builder-DlrRcqmJ.js +0 -2
  250. package/dist/custom-fields-Pl2t9xzp.js.map +0 -1
  251. package/dist/custom-objects-BHgn1GEX.js.map +0 -1
  252. package/dist/customer-dir-DIylZ8Q6.js.map +0 -1
  253. package/dist/file-lock-B_zi7NQl.js.map +0 -1
  254. package/dist/gmail-sync-DIaxInDT.js.map +0 -1
  255. package/dist/gmail-sync-hHm9gaWd.cjs.map +0 -1
  256. package/dist/gmail-sync-rQaVqKWd.js.map +0 -1
  257. package/dist/goal-engine-KpBftn4V.js.map +0 -1
  258. package/dist/identity-gyfWdrcX.js +0 -2
  259. package/dist/import-hubspot-BaK71U_K.js.map +0 -1
  260. package/dist/index-V8BFaH-b.d.ts.map +0 -1
  261. package/dist/index-YqwMd6aQ.d.cts.map +0 -1
  262. package/dist/interactions-writer-CrPStUll.cjs.map +0 -1
  263. package/dist/interactions-writer-DO3KcSR3.js.map +0 -1
  264. package/dist/interactions-writer-SLHnoEeE.js.map +0 -1
  265. package/dist/interactions-writer-dSPy1XfO.js +0 -2
  266. package/dist/knowledge-base-D0Fh40kc.js.map +0 -1
  267. package/dist/lancedb-rlvWoPwl.js.map +0 -1
  268. package/dist/lead-model-BCFzyktm.js.map +0 -1
  269. package/dist/memory-Bb6ky3kb.js.map +0 -1
  270. package/dist/notification-dispatcher-0vYNngWe.js.map +0 -1
  271. package/dist/pipeline-writer-BvVquKIe.js.map +0 -1
  272. package/dist/pipeline-writer-N2omexxp.cjs.map +0 -1
  273. package/dist/pipeline-writer-eufx_0o1.js.map +0 -1
  274. package/dist/proactive-worker-BrLHNhjH.js.map +0 -1
  275. package/dist/push-manager-CdqIIkuh.js.map +0 -1
  276. package/dist/quote-generator-BfwENXzg.js.map +0 -1
  277. package/dist/rbac-C7c8tcES.js +0 -2
  278. package/dist/rbac-CTIktZaC.js.map +0 -1
  279. package/dist/relationship-health-odxEoQdJ.js.map +0 -1
  280. package/dist/revenue-simulation-Bqf2DLVB.js.map +0 -1
  281. package/dist/segments-BqcD5HIl.js.map +0 -1
  282. package/dist/sequence-engine-CCTHEBgi.js +0 -2
  283. package/dist/sequence-engine-J1lTW_in.js.map +0 -1
  284. package/dist/sequence-store-DaaWr0Os.js.map +0 -1
  285. package/dist/server-Dyva03K8.js.map +0 -1
  286. package/dist/session-B9AilxOE.js.map +0 -1
  287. package/dist/session-D0qFkBla.cjs.map +0 -1
  288. package/dist/session-D9ub6Wl1.js.map +0 -1
  289. package/dist/session-mWHA71Lw.js +0 -2
  290. package/dist/session-store-B0QZE8Bx.cjs.map +0 -1
  291. package/dist/session-store-C8tEvMPw.js.map +0 -1
  292. package/dist/sop-Vp0UPWFW.js.map +0 -1
  293. package/dist/survey-engine-C06hcQt3.js +0 -2
  294. package/dist/survey-engine-DBjCYqCv.js.map +0 -1
  295. package/dist/sync-state-ChaLbamC.js.map +0 -1
  296. package/dist/ticket-writer-j2oX_Wal.js.map +0 -1
  297. package/dist/tone-Bdm5uaht.js.map +0 -1
  298. package/dist/tone-DRKlZgPr.cjs.map +0 -1
  299. package/dist/tone-vNb2DAAD.js.map +0 -1
  300. package/dist/transcript-watcher-CL2QUygI.js.map +0 -1
  301. package/dist/unmatched-transcripts-BsH5bhkU.js +0 -26
  302. package/dist/unmatched-transcripts-BsH5bhkU.js.map +0 -1
  303. package/dist/unmatched-transcripts-D0PrJ9iz.js +0 -2
  304. package/dist/update-deal-BNwPGaTV.js +0 -2
  305. package/dist/usage-D0-TYJkw.js.map +0 -1
  306. package/dist/vault-DXCg29W-.js.map +0 -1
  307. package/dist/webhooks-7EpA05Qr.js.map +0 -1
  308. package/dist/webhooks-BO2UAnmn.js.map +0 -1
  309. package/dist/webhooks-Xn6zO6kd.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-hubspot-CTId9IGV.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 path from \"path\";\nimport { z } from \"zod\";\nimport { readJsonFile, writeJsonFile } from \"./json-store.js\";\nimport { assertSafeSlug } from \"./customer-dir.js\";\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 raw = readJsonFile<unknown>(contactsPath(dataDir, slug), []);\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}\n\nexport function upsertContact(dataDir: string, slug: string, contact: CustomerContact): void {\n assertSafeSlug(slug);\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 writeJsonFile(contactsPath(dataDir, slug), contacts);\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 { escapeRegExp } from \"../core/regex.js\";\nimport { writeFileAtomic } from \"../fs/atomic-write.js\";\nimport { writeJsonFile } from \"../fs/json-store.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 writeFileAtomic(mainFactsPath, `${lines}\\n\\n# Customer: ${name}\\n`);\n writeFileAtomic(path.join(customerDir, \"interactions.md\"), `# Interactions — ${name}\\n\\n`);\n writeFileAtomic(path.join(customerDir, \"pipeline.md\"), `# Pipeline — ${name}\\n\\n`);\n writeJsonFile(path.join(customerDir, \"sources.json\"), {\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 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\n/** Patch several frontmatter fields in main_facts.md with a single read+write. */\nfunction updateMainFactsFields(\n dataDir: string,\n slug: string,\n fields: Record<string, string | undefined>\n): void {\n const entries = Object.entries(fields).filter(\n (e): e is [string, string] => e[1] !== undefined && e[1] !== \"\"\n );\n if (entries.length === 0) return;\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 for (const [field, value] of entries) {\n const regex = new RegExp(`^${escapeRegExp(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 }\n writeFileAtomic(p, content);\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 writeJsonFile(p, merged);\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 writeJsonFile(progressPath(dataDir), progress);\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 + owner + HubSpot id, batched into one read+write.\n const factsPatch: Record<string, string | undefined> = {};\n for (const [hsKey, dxKey] of Object.entries(COMPANY_FIELD_MAP)) {\n const val = row[hsKey] ?? \"\";\n if (val) factsPatch[dxKey] = val;\n }\n\n const ownerEmail = row[\"hubspot_owner_email\"] ?? row[\"HubSpot Owner Email\"] ?? \"\";\n if (ownerEmail && ownerMap[ownerEmail]) {\n factsPatch[\"assigned_rep\"] = ownerMap[ownerEmail]!;\n result.ownersResolved++;\n }\n\n if (hubspotId) factsPatch[\"hubspot_company_id\"] = hubspotId;\n\n updateMainFactsFields(dataDir, slug, factsPatch);\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) — batched into\n // a single read+write instead of one per field.\n const existing = readMainFactsRaw(dataDir, slug);\n const factsPatch: Record<string, string | undefined> = {};\n if (email && !existing.includes(\"email:\")) factsPatch[\"email\"] = email;\n if (phone && !existing.includes(\"phone:\")) factsPatch[\"phone\"] = phone;\n if (contactName && !existing.includes(\"primary_contact:\"))\n factsPatch[\"primary_contact\"] = contactName;\n\n // Owner mapping\n const ownerEmail = row[\"contact_owner\"] ?? row[\"Contact Owner\"] ?? \"\";\n if (ownerEmail && ownerMap[ownerEmail] && !existing.includes(\"assigned_rep:\")) {\n factsPatch[\"assigned_rep\"] = ownerMap[ownerEmail]!;\n result.ownersResolved++;\n }\n updateMainFactsFields(dataDir, slug, factsPatch);\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, InteractionDedup } = await import(\"../fs/interactions-writer.js\");\n const dedup = new InteractionDedup(dataDir);\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 if (await dedup.seen(slug, 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 dedup.markAppended(slug, sourceRef);\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":"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"}
@@ -95,12 +95,12 @@ declare const MainFactsSchema: z.ZodObject<{
95
95
  created: z.ZodEffects<z.ZodString, string, unknown>;
96
96
  updated: z.ZodEffects<z.ZodString, string, unknown>;
97
97
  }, "strip", z.ZodTypeAny, {
98
- created: string;
99
98
  name: string;
100
- relationship_stage: "prospect" | "active" | "churned" | "paused";
101
99
  currency: string;
102
- tags: string[];
103
100
  updated: string;
101
+ created: string;
102
+ relationship_stage: "prospect" | "active" | "churned" | "paused";
103
+ tags: string[];
104
104
  domain?: string | undefined;
105
105
  email?: string | undefined;
106
106
  phone?: string | undefined;
@@ -111,17 +111,17 @@ declare const MainFactsSchema: z.ZodObject<{
111
111
  }, {
112
112
  name: string;
113
113
  relationship_stage: "prospect" | "active" | "churned" | "paused";
114
+ currency?: string | undefined;
115
+ updated?: unknown;
114
116
  created?: unknown;
115
117
  domain?: string | undefined;
116
118
  email?: string | undefined;
117
119
  phone?: string | undefined;
118
120
  industry?: string | undefined;
119
121
  deal_value?: number | undefined;
120
- currency?: string | undefined;
121
122
  primary_contact?: string | undefined;
122
123
  timezone?: string | undefined;
123
124
  tags?: string[] | undefined;
124
- updated?: unknown;
125
125
  }>;
126
126
  type MainFacts = z.infer<typeof MainFactsSchema>;
127
127
  //# sourceMappingURL=main-facts.d.ts.map
@@ -135,11 +135,13 @@ declare const InteractionEntrySchema: z.ZodObject<{
135
135
  subject: z.ZodOptional<z.ZodString>;
136
136
  summary: z.ZodString;
137
137
  nextSteps: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
138
+ /** Relative links (from the customer dir) to converted attachment Markdown. */
139
+ attachments: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
138
140
  sourceRef: z.ZodString;
139
141
  synced: z.ZodString;
140
142
  }, "strip", z.ZodTypeAny, {
141
- date: string;
142
143
  type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
144
+ date: string;
143
145
  with: string;
144
146
  summary: string;
145
147
  nextSteps: string[];
@@ -147,9 +149,10 @@ declare const InteractionEntrySchema: z.ZodObject<{
147
149
  synced: string;
148
150
  direction?: "inbound" | "outbound" | undefined;
149
151
  subject?: string | undefined;
152
+ attachments?: string[] | undefined;
150
153
  }, {
151
- date: string;
152
154
  type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
155
+ date: string;
153
156
  with: string;
154
157
  summary: string;
155
158
  sourceRef: string;
@@ -157,6 +160,7 @@ declare const InteractionEntrySchema: z.ZodObject<{
157
160
  direction?: "inbound" | "outbound" | undefined;
158
161
  subject?: string | undefined;
159
162
  nextSteps?: string[] | undefined;
163
+ attachments?: string[] | undefined;
160
164
  }>;
161
165
  type InteractionEntry = z.infer<typeof InteractionEntrySchema>;
162
166
  //# sourceMappingURL=interaction.d.ts.map
@@ -173,17 +177,17 @@ declare const PipelineDealSchema: z.ZodObject<{
173
177
  updated: z.ZodString;
174
178
  }, "strip", z.ZodTypeAny, {
175
179
  name: string;
180
+ stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
176
181
  currency: string;
177
182
  updated: string;
178
- stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
179
183
  value?: number | undefined;
180
184
  probability?: number | undefined;
181
185
  close_date?: string | undefined;
182
186
  notes?: string | undefined;
183
187
  }, {
184
188
  name: string;
185
- updated: string;
186
189
  stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
190
+ updated: string;
187
191
  value?: number | undefined;
188
192
  currency?: string | undefined;
189
193
  probability?: number | undefined;
@@ -341,9 +345,9 @@ declare const KbArticleSchema: z.ZodObject<{
341
345
  updatedAt: z.ZodString;
342
346
  sourceTicketId: z.ZodOptional<z.ZodString>;
343
347
  }, "strip", z.ZodTypeAny, {
344
- tags: string[];
345
348
  id: string;
346
349
  title: string;
350
+ tags: string[];
347
351
  createdAt: string;
348
352
  category: string;
349
353
  public: boolean;
@@ -515,7 +519,11 @@ interface RbacConfig {
515
519
  declare function getRbacConfig(dataDir: string): RbacConfig;
516
520
  declare function getRole(dataDir: string, actor: string): Role;
517
521
  declare function canSeeCustomer(dataDir: string, actor: string, slug: string): boolean;
518
- /** Load the field-level ACL (field → allowed roles) from rbac.json. */
522
+ /**
523
+ * Build a once-loaded predicate for which customers `actor` may see. Equivalent
524
+ * to calling canSeeCustomer per slug, but reads/parses rbac.json a single time
525
+ * (and uses O(1) Set membership) — for hot loops like list_customers.
526
+ */
519
527
  //#endregion
520
528
  //#region src/core/session-store.d.ts
521
529
  interface Session {
@@ -535,4 +543,4 @@ declare const VERSION = "0.1.0";
535
543
 
536
544
  //#endregion
537
545
  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 };
538
- //# sourceMappingURL=index-YqwMd6aQ.d.cts.map
546
+ //# sourceMappingURL=index-BAutNcAT.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BAutNcAT.d.cts","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":";;;;cAea,qBAAmB,CAAA,CAAA;;IAAA,IAAA,cAAA,CAAA,OAAA,CAAA;IAAA,KAAA,aAAA;IAUpB,OAAA,cAAa,aAAA,CAAA;EAAA,CAAA,EAAA,OAAA,cAAA,EAAA;IAAkB,IAAA,EAAA,OAAA;IAAf,KAAE,EAAA,MAAA;IAAK,OAAA,EAAA,OAAA;;;;ICvBtB,OAAA,CAAA,EAAA,OAoBX,GAAA,SAAA;EAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;SApB0B,EAAA,MAAA;EAAA,OAAA,EAAA,MAAA;EAsBhB,KAAA,CAAA,EAAA;IAAS,IAAA,EAAA,OAAA;IAAkB,KAAA,EAAA,MAAA;IAAf,OAAE,EAAA,OAAA;EAAK,CAAA,GAAA,SAAA;;;;ECtBlB,WAAA,CAAA,EAAA;IAYX,IAAA,EAAA,YAAA;;;;;;;;;;;;;;;;;;IAZiC,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAA,UAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;EAcvB,CAAA,GAAA,SAAA;EAAgB,OAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;KFShB,aAAA,GAAgB,CAAA,CAAE,aAAa;;;;cCvB9B,iBAAe,CAAA,CAAA;;EDaf,MAAA,eAAA,YAMX,CAAA;EAAA,KAAA,eAAA,YAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAN8B,CAAA,EAAA,MAAA,GAAA,SAAA;EAAA,OAAA,CAAA,EAAA,OAAA;EAUpB,OAAA,CAAA,EAAA,OAAa;EAAA,MAAA,CAAA,EAAA,MAAA,GAAA,SAAA;OAAkB,CAAA,EAAA,MAAA,GAAA,SAAA;OAAb,CAAA,EAAA,MAAA,GAAA,SAAA;EAAK,QAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;;ECvBtB,IAAA,CAAA,EAAA,MAAA,EAAA,GAoBX,SAAA;CAAA,CAAA;KAEU,SAAA,GAAY,CAAA,CAAE,aAAa;;;;cCtB1B,wBAAsB,CAAA,CAAA;;EFatB,IAAA,WAAA,CAAA,CAAA,OAMX,EAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,CAAA,CAAA;EAAA,SAAA,eAAA,UAAA,CAAA,CAAA,SAAA,EAAA,UAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAN8B,CAAA,EAAA,MAAA,GAAA,SAAA;EAAA,SAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;EAUpB,WAAA,CAAA,EAAA,MAAa,EAAA,GAAA,SAAA;CAAA,CAAA;AAAkB,KET/B,gBAAA,GAAmB,CAAA,CAAE,KFSU,CAAA,OETG,sBFSH,CAAA;;;;cGvB9B,oBAAkB,CAAA,CAAA;;EHalB,KAAA,WAAA,CAAA,CAAA,MAMX,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,EAAA,KAAA,EAAA,MAAA,CAAA,CAAA;EAAA,KAAA,eAAA,YAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;KGLU,YAAA,GAAe,CAAA,CAAE,aAAa;;;;cCd7B,oBAAkB,CAAA,CAAA;cAClB,sBAAoB,CAAA,CAAA;AJYpB,cIVA,YJgBX,EIhBuB,CAAA,CAAA,SJgBvB,CAAA;EAAA,EAAA,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAN8B,CAAA,EAAA,MAAA,GAAA,SAAA;AAAA,CAAA,CAAA;AAUpB,KIFA,MAAA,GAAS,CAAA,CAAE,KJEE,CAAA,OIFW,YJEX,CAAA;AAAA,KIDb,YAAA,GAAe,CAAA,CAAE,KJCJ,CAAA,OIDiB,kBJCjB,CAAA;AAAkB,KIA/B,cAAA,GAAiB,CAAA,CAAE,KJAY,CAAA,OIAC,oBJAD,CAAA;;;;cKvB9B,qBAAmB,CAAA,CAAA;;ELanB,QAAA,aAAA;EAMX,SAAA,aAAA;;;;;;;;;;;;;cKZW,aAAW,CAAA,CAAA;;;;;;;;;;;;;;;ILMQ,WAAA,EAAA,MAAA;IAAA,QAAA,EAAA,MAAA;IAUpB,SAAA,EAAA,MAAa;IAAA,KAAA,EAAA,MAAA;MAAkB,MAAA,CAAA;UAAb,aAAA;EAAK,UAAA,aAAA;;;;ECvBtB,SAAA,aAoBX;EAAA,cAAA,cAAA,YAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;UApB0B,CAAA,EAAA,MAAA,GAAA,SAAA;AAAA,CAAA,EAAA;EAsBhB,KAAA,EAAA,MAAS;EAAA,WAAA,EAAA,MAAA;MAAkB,EAAA,MAAA;UAAb,EAAA,MAAA;EAAK,SAAA,EAAA;;;;ICtBlB,KAAA,EAAA,MAAA;EAYX,CAAA,EAAA;;;;;;;;;;;;;KGcU,aAAA,GAAgB,CAAA,CAAE,aAAa;KAC/B,KAAA,GAAQ,CAAA,CAAE,aAAa;;;;cC3BtB,iBAAe,CAAA,CAAA;;ENaf,KAAA,aAAA;EAMX,QAAA,cAAA,YAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;KMRU,aAAA,GAAgB,CAAA,CAAE,aAAa;KAC/B,SAAA,GAAY;;;ANCQ;;;cObnB,wBAAsB,CAAA,CAAA;;EPatB,IAAA,cAAA,UAMX,CAAA,CAAA,KAAA,EAAA,MAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EAAA,QAAA,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAN8B,EAAA,MAAA;EAAA,IAAA,CAAA,EAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,SAAA;EAUpB,KAAA,CAAA,EAAA;IAAa,GAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IAAkB,GAAA,CAAA,EAAA,MAAA,GAAA,SAAA;MAAf,SAAE;EAAK,cAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;;cOXtB,sBAAoB,CAAA,CAAA;ENZpB,QAAA,aAoBX;EAAA,IAAA,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;KMGU,gBAAA,GAAmB,CAAA,CAAE,aAAa;ANvBlB,KMwBhB,cAAA,GAAiB,CAAA,CAAE,KNxBH,CAAA,OMwBgB,oBNxBhB,CAAA;AAAA;;;iBOON,cAAA;;ERMT,MAAA,CAAA,EAAA,MAAA;EAMX,KAAA,CAAA,EAAA,MAAA;;IQPE;;;;;;UCNa,cAAA;;ETOJ,SAAA,EAAA,MAAA;EAMX,YAAA,EAAA,MAAA;;;;;;;;;AAIuB,iBSuJH,SAAA,CTvJG,MAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,EAAA,IAAU,CAAV,EAAA;SAAkB,CAAA,EAAA,OAAA;QAAb,CAAA,EAAA,MAAA;AAAK,CAAA,CAAA,ES2JhC,OT3JgC,CS2JxB,cT3JwB,GAAA,IAAA,CAAA;;;iBUpBb,QAAA;;EVUT,KAAA,CAAA,EAAA,MAAA;EAMX,KAAA,CAAA,EAAA,MAAA;;sBURC;;;iBC4BmB,WAAA;;qBAAuD;;;iBCnB7D,cAAA;;;iBAsCM,aAAA,iCAA8C,QAAQ;;;;UCzD3D,UAAA;;;EbYJ,IAAA,EAAA,MAAA;EAMX,IAAA,EAAA,MAAA;;;iBacc,YAAA,mBAA+B;iBA6B/B,cAAA,UACL;;;;IAER;;;;KC/DS,IAAA;UAEK,UAAA;UACP,eAAe;EdQZ,OAAA,CAAA,EcPD,IdOC;EAMX,eAAA,CAAA,EcZkB,MdYlB,CAAA,MAAA,EAAA,MAAA,EAAA,CAAA;;ccVY,eAAe;;iBAsBb,aAAA,mBAAgC;iBAUhC,OAAA,kCAAyC;iBAuBzC,cAAA;;;;;;;;UClEC,OAAA;;;EfeJ,SAAA,EAAA,MAAA;EAMX,KAAA,CAAA,EAAA,MAAA;;iBeZc,UAAA,IAAc;iBAId,UAAA,CAAA,GAAc;iBAId,YAAA,CAAA;;;;cCjBH,OAAA"}
@@ -136,11 +136,13 @@ declare const InteractionEntrySchema: z.ZodObject<{
136
136
  subject: z.ZodOptional<z.ZodString>;
137
137
  summary: z.ZodString;
138
138
  nextSteps: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
139
+ /** Relative links (from the customer dir) to converted attachment Markdown. */
140
+ attachments: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
139
141
  sourceRef: z.ZodString;
140
142
  synced: z.ZodString;
141
143
  }, "strip", z.ZodTypeAny, {
142
- type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
143
144
  date: string;
145
+ type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
144
146
  with: string;
145
147
  summary: string;
146
148
  nextSteps: string[];
@@ -148,9 +150,10 @@ declare const InteractionEntrySchema: z.ZodObject<{
148
150
  synced: string;
149
151
  direction?: "inbound" | "outbound" | undefined;
150
152
  subject?: string | undefined;
153
+ attachments?: string[] | undefined;
151
154
  }, {
152
- type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
153
155
  date: string;
156
+ type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
154
157
  with: string;
155
158
  summary: string;
156
159
  sourceRef: string;
@@ -158,6 +161,7 @@ declare const InteractionEntrySchema: z.ZodObject<{
158
161
  direction?: "inbound" | "outbound" | undefined;
159
162
  subject?: string | undefined;
160
163
  nextSteps?: string[] | undefined;
164
+ attachments?: string[] | undefined;
161
165
  }>;
162
166
  type InteractionEntry = z.infer<typeof InteractionEntrySchema>;
163
167
  //# sourceMappingURL=interaction.d.ts.map
@@ -516,7 +520,11 @@ interface RbacConfig {
516
520
  declare function getRbacConfig(dataDir: string): RbacConfig;
517
521
  declare function getRole(dataDir: string, actor: string): Role;
518
522
  declare function canSeeCustomer(dataDir: string, actor: string, slug: string): boolean;
519
- /** Load the field-level ACL (field → allowed roles) from rbac.json. */
523
+ /**
524
+ * Build a once-loaded predicate for which customers `actor` may see. Equivalent
525
+ * to calling canSeeCustomer per slug, but reads/parses rbac.json a single time
526
+ * (and uses O(1) Set membership) — for hot loops like list_customers.
527
+ */
520
528
  //#endregion
521
529
  //#region src/core/session-store.d.ts
522
530
  interface Session {
@@ -536,4 +544,4 @@ declare const VERSION = "0.1.0";
536
544
 
537
545
  //#endregion
538
546
  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
547
+ //# sourceMappingURL=index-FzDsNSSb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-FzDsNSSb.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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"}
package/dist/index.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("./chunk-DakpK96I.cjs");
3
- const require_session_store = require("./session-store-B0QZE8Bx.cjs");
3
+ const require_session_store = require("./session-store-yfwnj0OC.cjs");
4
+ const require_atomic_write = require("./atomic-write-BYmF-ThH.cjs");
4
5
  let commander = require("commander");
5
6
  let path = require("path");
6
7
  path = require_chunk.__toESM(path, 1);
@@ -28,28 +29,25 @@ async function createCustomer(opts) {
28
29
  updated: today
29
30
  });
30
31
  const interactionsPath = path.default.join(dir, "interactions.md");
31
- if (!fs.default.existsSync(interactionsPath)) fs.default.writeFileSync(interactionsPath, `# Interactions — ${opts.name}\n\n`);
32
+ if (!fs.default.existsSync(interactionsPath)) require_atomic_write.writeFileAtomic(interactionsPath, `# Interactions — ${opts.name}\n\n`);
32
33
  const pipelinePath = path.default.join(dir, "pipeline.md");
33
- if (!fs.default.existsSync(pipelinePath)) fs.default.writeFileSync(pipelinePath, `# Pipeline — ${opts.name}\n\n| Deal | Stage | Value | Currency | Probability | Close Date | Updated | Notes |\n|---|---|---|---|---|---|---|---|\n`);
34
+ if (!fs.default.existsSync(pipelinePath)) require_atomic_write.writeFileAtomic(pipelinePath, `# Pipeline — ${opts.name}\n\n| Deal | Stage | Value | Currency | Probability | Close Date | Updated | Notes |\n|---|---|---|---|---|---|---|---|\n`);
34
35
  const sourcesPath = path.default.join(dir, "sources.json");
35
- if (!fs.default.existsSync(sourcesPath)) {
36
- const sources = {
37
- gmail: {
38
- type: "gmail",
39
- query: opts.domain ? `from:${opts.domain} OR to:${opts.domain}` : opts.email ? `from:${opts.email} OR to:${opts.email}` : "",
40
- enabled: true
41
- },
42
- version: 1,
43
- created: (/* @__PURE__ */ new Date()).toISOString()
44
- };
45
- fs.default.writeFileSync(sourcesPath, JSON.stringify(sources, null, 2));
46
- }
36
+ if (!fs.default.existsSync(sourcesPath)) require_session_store.writeJsonFile(sourcesPath, {
37
+ gmail: {
38
+ type: "gmail",
39
+ query: opts.domain ? `from:${opts.domain} OR to:${opts.domain}` : opts.email ? `from:${opts.email} OR to:${opts.email}` : "",
40
+ enabled: true
41
+ },
42
+ version: 1,
43
+ created: (/* @__PURE__ */ new Date()).toISOString()
44
+ });
47
45
  return {
48
46
  id,
49
47
  dir
50
48
  };
51
49
  }
52
- new commander.Command("create").argument("<name>", "Customer name").option("--domain <domain>", "Primary domain (for Gmail sync)").option("--email <email>", "Primary contact email").action(async (name, opts) => {
50
+ new commander.Command("create").description("Create a new customer").argument("<name>", "Customer name").option("--domain <domain>", "Primary domain (for Gmail sync)").option("--email <email>", "Primary contact email").action(async (name, opts) => {
53
51
  try {
54
52
  const { id, dir } = await createCustomer({
55
53
  name,
@@ -135,17 +133,17 @@ async function runValidate(opts, dataDir) {
135
133
  }
136
134
  try {
137
135
  let content = fs.default.readFileSync(factsPath, "utf-8");
138
- const { data } = (0, gray_matter.default)(content);
136
+ let parsed = (0, gray_matter.default)(content);
139
137
  if (opts.fix) {
140
- const result = applyFix(factsPath, content, data);
138
+ const result = applyFix(factsPath, content, parsed.data);
141
139
  if (result) {
142
140
  content = result.content;
141
+ parsed = (0, gray_matter.default)(content);
143
142
  fixedCount++;
144
143
  console.log(require_session_store.info(`⚙ ${slug}: fixed ${result.fixed.join(", ")}`));
145
144
  }
146
145
  }
147
- const { data: refetchedData } = (0, gray_matter.default)(content);
148
- require_session_store.MainFactsSchema.parse(refetchedData);
146
+ require_session_store.MainFactsSchema.parse(parsed.data);
149
147
  if (!fs.default.existsSync(interactionsPath)) console.log(require_session_store.warning(`⚠ ${slug}: missing interactions.md`));
150
148
  else console.log(require_session_store.success(`✓ ${slug}`));
151
149
  } catch (err) {
@@ -159,7 +157,7 @@ async function runValidate(opts, dataDir) {
159
157
  process.exit(1);
160
158
  } else console.log(require_session_store.success("\n✓ All customers valid."));
161
159
  }
162
- new commander.Command("validate").option("--fix", "Auto-fix recoverable issues").action(async (opts) => {
160
+ new commander.Command("validate").description("Validate all customer data against schemas").option("--fix", "Auto-fix recoverable issues").action(async (opts) => {
163
161
  await runValidate(opts, process.env["DXCRM_DATA_DIR"] ?? process.cwd());
164
162
  });
165
163
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ensureCustomerDir","writeMainFacts","Command","success","bold","error","filterAuditLog","readAuditLog","Command","matter","warning","listCustomerSlugs","error","info","success","Command"],"sources":["../src/commands/create.ts","../src/commands/audit.ts","../src/commands/validate.ts","../src/version.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport slugify from \"slug\";\nimport { ensureCustomerDir, writeMainFacts } from \"../fs/customer-dir.js\";\nimport { success, error, bold } from \"../ui/colors.js\";\n\nexport async function createCustomer(opts: {\n name: string;\n domain?: string;\n email?: string;\n dataDir?: string;\n}): Promise<{ id: string; dir: string }> {\n const id = slugify(opts.name, { lower: true });\n const dataDir = opts.dataDir ?? process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n await ensureCustomerDir(dataDir, id);\n const dir = path.join(dataDir, \"customers\", id);\n\n // Write main_facts.md\n const today = new Date().toISOString().slice(0, 10);\n await writeMainFacts(dataDir, id, {\n name: opts.name,\n domain: opts.domain,\n email: opts.email,\n relationship_stage: \"prospect\",\n tags: [],\n currency: \"EUR\",\n created: today,\n updated: today,\n });\n\n // Create interactions.md\n const interactionsPath = path.join(dir, \"interactions.md\");\n if (!fs.existsSync(interactionsPath)) {\n fs.writeFileSync(interactionsPath, `# Interactions — ${opts.name}\\n\\n`);\n }\n\n // Create pipeline.md\n const pipelinePath = path.join(dir, \"pipeline.md\");\n if (!fs.existsSync(pipelinePath)) {\n fs.writeFileSync(\n pipelinePath,\n `# Pipeline — ${opts.name}\\n\\n| Deal | Stage | Value | Currency | Probability | Close Date | Updated | Notes |\\n|---|---|---|---|---|---|---|---|\\n`\n );\n }\n\n // Create sources.json\n const sourcesPath = path.join(dir, \"sources.json\");\n if (!fs.existsSync(sourcesPath)) {\n const gmailQuery = opts.domain\n ? `from:${opts.domain} OR to:${opts.domain}`\n : opts.email\n ? `from:${opts.email} OR to:${opts.email}`\n : \"\";\n const sources = {\n gmail: {\n type: \"gmail\",\n query: gmailQuery,\n enabled: true,\n },\n version: 1,\n created: new Date().toISOString(),\n };\n fs.writeFileSync(sourcesPath, JSON.stringify(sources, null, 2));\n }\n\n return { id, dir };\n}\n\nexport const createCommand = new Command(\"create\")\n .argument(\"<name>\", \"Customer name\")\n .option(\"--domain <domain>\", \"Primary domain (for Gmail sync)\")\n .option(\"--email <email>\", \"Primary contact email\")\n .action(async (name: string, opts: { domain?: string; email?: string }) => {\n try {\n const { id, dir } = await createCustomer({ name, ...opts });\n console.log(success(`✓ Created customer: ${bold(id)}`));\n console.log(` Dir: ${dir}`);\n console.log(` Files: main_facts.md, interactions.md, pipeline.md, sources.json`);\n } catch (err) {\n console.error(error(`✗ ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { readAuditLog, filterAuditLog } from \"../fs/audit-log.js\";\n\nconst SEP = \"─\".repeat(70);\n\nexport async function runAudit(\n opts: {\n slug?: string;\n actor?: string;\n limit?: number;\n tail?: boolean;\n },\n dataDir?: string\n): Promise<void> {\n const dir = dataDir ?? process.cwd();\n const limit = opts.limit ?? 20;\n\n const allEntries = readAuditLog(dir);\n const entries = filterAuditLog(allEntries, {\n ...(opts.slug !== undefined ? { slug: opts.slug } : {}),\n ...(opts.actor !== undefined ? { actor: opts.actor } : {}),\n limit,\n });\n\n console.log(SEP);\n console.log(\" DatasynxOpenCRM — Audit Trail\");\n\n if (opts.slug) console.log(` Customer: ${opts.slug}`);\n if (opts.actor) console.log(` Actor: ${opts.actor}`);\n\n console.log(SEP);\n\n if (entries.length === 0) {\n console.log(\" No audit entries found.\");\n console.log(SEP);\n return;\n }\n\n for (const entry of entries) {\n console.log(\n ` ${entry.timestamp} ${entry.actor.padEnd(12)} ${entry.tool.padEnd(20)} ${entry.slug.padEnd(20)} ${entry.summary}`\n );\n }\n\n console.log(SEP);\n console.log(` ${entries.length} entr${entries.length === 1 ? \"y\" : \"ies\"} shown`);\n console.log(SEP);\n}\n\nexport const auditCommand = new Command(\"audit\")\n .description(\"Show CRM audit trail — who changed what and when\")\n .option(\"--slug <slug>\", \"Filter by customer slug\")\n .option(\"--actor <actor>\", \"Filter by actor\")\n .option(\"--limit <n>\", \"Number of entries to show (default: 20)\", parseInt)\n .option(\"--tail\", \"Show all new entries (simplified: shows current entries)\")\n .action((opts: { slug?: string; actor?: string; limit?: number; tail?: boolean }) =>\n runAudit(opts, process.env[\"DXCRM_DATA_DIR\"])\n );\n","import { Command } from \"commander\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { MainFactsSchema } from \"../schemas/main-facts.js\";\nimport { listCustomerSlugs } from \"../fs/customer-dir.js\";\nimport matter from \"gray-matter\";\nimport { success, error, warning, info } from \"../ui/colors.js\";\n\nconst RECOVERABLE_DEFAULTS: Record<string, unknown> = {\n tags: [],\n currency: \"EUR\",\n};\n\nexport function applyFix(\n factsPath: string,\n content: string,\n data: Record<string, unknown>\n): { fixed: string[]; content: string } | null {\n const fixed: string[] = [];\n const patched = { ...data };\n\n for (const [field, defaultValue] of Object.entries(RECOVERABLE_DEFAULTS)) {\n if (patched[field] === undefined || patched[field] === null) {\n patched[field] = defaultValue;\n fixed.push(`${field} → ${JSON.stringify(defaultValue)}`);\n }\n }\n\n if (patched[\"updated\"] === undefined && patched[\"created\"]) {\n patched[\"updated\"] = patched[\"created\"];\n fixed.push(`updated → ${String(patched[\"created\"])}`);\n }\n\n if (fixed.length === 0) return null;\n\n const parsed = matter(content);\n const newContent = matter.stringify(parsed.content, patched);\n fs.writeFileSync(factsPath, newContent);\n return { fixed, content: newContent };\n}\n\nexport async function runValidate(opts: { fix?: boolean }, dataDir: string): Promise<void> {\n const customersDir = path.join(dataDir, \"customers\");\n\n if (!fs.existsSync(customersDir)) {\n console.log(warning(\"⚠ No customers directory found.\"));\n return;\n }\n\n const slugs = listCustomerSlugs(dataDir);\n\n let errorCount = 0;\n let fixedCount = 0;\n\n for (const slug of slugs) {\n const factsPath = path.join(customersDir, slug, \"main_facts.md\");\n const interactionsPath = path.join(customersDir, slug, \"interactions.md\");\n\n if (!fs.existsSync(factsPath)) {\n console.log(error(`✗ ${slug}: missing main_facts.md`));\n errorCount++;\n continue;\n }\n\n try {\n let content = fs.readFileSync(factsPath, \"utf-8\") as string;\n const { data } = matter(content);\n\n if (opts.fix) {\n const result = applyFix(factsPath, content, data as Record<string, unknown>);\n if (result) {\n content = result.content;\n fixedCount++;\n console.log(info(`⚙ ${slug}: fixed ${result.fixed.join(\", \")}`));\n }\n }\n\n const { data: refetchedData } = matter(content);\n MainFactsSchema.parse(refetchedData);\n\n if (!fs.existsSync(interactionsPath)) {\n console.log(warning(`⚠ ${slug}: missing interactions.md`));\n } else {\n console.log(success(`✓ ${slug}`));\n }\n } catch (err) {\n console.log(error(`✗ ${slug}: ${(err as Error).message}`));\n errorCount++;\n }\n }\n\n if (opts.fix && fixedCount > 0) {\n console.log(info(`\\n⚙ Fixed ${fixedCount} customer(s).`));\n }\n\n if (errorCount > 0) {\n console.error(error(`\\n${errorCount} error(s) found.`));\n process.exit(1);\n } else {\n console.log(success(\"\\n✓ All customers valid.\"));\n }\n}\n\nexport const validateCommand = new Command(\"validate\")\n .option(\"--fix\", \"Auto-fix recoverable issues\")\n .action(async (opts: { fix?: boolean }) => {\n await runValidate(opts, process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd());\n });\n","export const VERSION = \"0.1.0\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["ensureCustomerDir","writeMainFacts","Command","success","bold","error","filterAuditLog","readAuditLog","Command","matter","warning","listCustomerSlugs","error","info","success","Command"],"sources":["../src/commands/create.ts","../src/commands/audit.ts","../src/commands/validate.ts","../src/version.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport slugify from \"slug\";\nimport { ensureCustomerDir, writeMainFacts } from \"../fs/customer-dir.js\";\nimport { writeFileAtomic } from \"../fs/atomic-write.js\";\nimport { writeJsonFile } from \"../fs/json-store.js\";\nimport { success, error, bold } from \"../ui/colors.js\";\n\nexport async function createCustomer(opts: {\n name: string;\n domain?: string;\n email?: string;\n dataDir?: string;\n}): Promise<{ id: string; dir: string }> {\n const id = slugify(opts.name, { lower: true });\n const dataDir = opts.dataDir ?? process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n await ensureCustomerDir(dataDir, id);\n const dir = path.join(dataDir, \"customers\", id);\n\n // Write main_facts.md\n const today = new Date().toISOString().slice(0, 10);\n await writeMainFacts(dataDir, id, {\n name: opts.name,\n domain: opts.domain,\n email: opts.email,\n relationship_stage: \"prospect\",\n tags: [],\n currency: \"EUR\",\n created: today,\n updated: today,\n });\n\n // Create interactions.md\n const interactionsPath = path.join(dir, \"interactions.md\");\n if (!fs.existsSync(interactionsPath)) {\n writeFileAtomic(interactionsPath, `# Interactions — ${opts.name}\\n\\n`);\n }\n\n // Create pipeline.md\n const pipelinePath = path.join(dir, \"pipeline.md\");\n if (!fs.existsSync(pipelinePath)) {\n writeFileAtomic(\n pipelinePath,\n `# Pipeline — ${opts.name}\\n\\n| Deal | Stage | Value | Currency | Probability | Close Date | Updated | Notes |\\n|---|---|---|---|---|---|---|---|\\n`\n );\n }\n\n // Create sources.json\n const sourcesPath = path.join(dir, \"sources.json\");\n if (!fs.existsSync(sourcesPath)) {\n const gmailQuery = opts.domain\n ? `from:${opts.domain} OR to:${opts.domain}`\n : opts.email\n ? `from:${opts.email} OR to:${opts.email}`\n : \"\";\n const sources = {\n gmail: {\n type: \"gmail\",\n query: gmailQuery,\n enabled: true,\n },\n version: 1,\n created: new Date().toISOString(),\n };\n writeJsonFile(sourcesPath, sources);\n }\n\n return { id, dir };\n}\n\nexport const createCommand = new Command(\"create\")\n .description(\"Create a new customer\")\n .argument(\"<name>\", \"Customer name\")\n .option(\"--domain <domain>\", \"Primary domain (for Gmail sync)\")\n .option(\"--email <email>\", \"Primary contact email\")\n .action(async (name: string, opts: { domain?: string; email?: string }) => {\n try {\n const { id, dir } = await createCustomer({ name, ...opts });\n console.log(success(`✓ Created customer: ${bold(id)}`));\n console.log(` Dir: ${dir}`);\n console.log(` Files: main_facts.md, interactions.md, pipeline.md, sources.json`);\n } catch (err) {\n console.error(error(`✗ ${(err as Error).message}`));\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { readAuditLog, filterAuditLog } from \"../fs/audit-log.js\";\n\nconst SEP = \"─\".repeat(70);\n\nexport async function runAudit(\n opts: {\n slug?: string;\n actor?: string;\n limit?: number;\n tail?: boolean;\n },\n dataDir?: string\n): Promise<void> {\n const dir = dataDir ?? process.cwd();\n const limit = opts.limit ?? 20;\n\n const allEntries = readAuditLog(dir);\n const entries = filterAuditLog(allEntries, {\n ...(opts.slug !== undefined ? { slug: opts.slug } : {}),\n ...(opts.actor !== undefined ? { actor: opts.actor } : {}),\n limit,\n });\n\n console.log(SEP);\n console.log(\" DatasynxOpenCRM — Audit Trail\");\n\n if (opts.slug) console.log(` Customer: ${opts.slug}`);\n if (opts.actor) console.log(` Actor: ${opts.actor}`);\n\n console.log(SEP);\n\n if (entries.length === 0) {\n console.log(\" No audit entries found.\");\n console.log(SEP);\n return;\n }\n\n for (const entry of entries) {\n console.log(\n ` ${entry.timestamp} ${entry.actor.padEnd(12)} ${entry.tool.padEnd(20)} ${entry.slug.padEnd(20)} ${entry.summary}`\n );\n }\n\n console.log(SEP);\n console.log(` ${entries.length} entr${entries.length === 1 ? \"y\" : \"ies\"} shown`);\n console.log(SEP);\n}\n\nexport const auditCommand = new Command(\"audit\")\n .description(\"Show CRM audit trail — who changed what and when\")\n .option(\"--slug <slug>\", \"Filter by customer slug\")\n .option(\"--actor <actor>\", \"Filter by actor\")\n .option(\"--limit <n>\", \"Number of entries to show (default: 20)\", parseInt)\n .option(\"--tail\", \"Show all new entries (simplified: shows current entries)\")\n .action((opts: { slug?: string; actor?: string; limit?: number; tail?: boolean }) =>\n runAudit(opts, process.env[\"DXCRM_DATA_DIR\"])\n );\n","import { Command } from \"commander\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { MainFactsSchema } from \"../schemas/main-facts.js\";\nimport { listCustomerSlugs } from \"../fs/customer-dir.js\";\nimport matter from \"gray-matter\";\nimport { success, error, warning, info } from \"../ui/colors.js\";\n\nconst RECOVERABLE_DEFAULTS: Record<string, unknown> = {\n tags: [],\n currency: \"EUR\",\n};\n\nexport function applyFix(\n factsPath: string,\n content: string,\n data: Record<string, unknown>\n): { fixed: string[]; content: string } | null {\n const fixed: string[] = [];\n const patched = { ...data };\n\n for (const [field, defaultValue] of Object.entries(RECOVERABLE_DEFAULTS)) {\n if (patched[field] === undefined || patched[field] === null) {\n patched[field] = defaultValue;\n fixed.push(`${field} → ${JSON.stringify(defaultValue)}`);\n }\n }\n\n if (patched[\"updated\"] === undefined && patched[\"created\"]) {\n patched[\"updated\"] = patched[\"created\"];\n fixed.push(`updated → ${String(patched[\"created\"])}`);\n }\n\n if (fixed.length === 0) return null;\n\n const parsed = matter(content);\n const newContent = matter.stringify(parsed.content, patched);\n fs.writeFileSync(factsPath, newContent);\n return { fixed, content: newContent };\n}\n\nexport async function runValidate(opts: { fix?: boolean }, dataDir: string): Promise<void> {\n const customersDir = path.join(dataDir, \"customers\");\n\n if (!fs.existsSync(customersDir)) {\n console.log(warning(\"⚠ No customers directory found.\"));\n return;\n }\n\n const slugs = listCustomerSlugs(dataDir);\n\n let errorCount = 0;\n let fixedCount = 0;\n\n for (const slug of slugs) {\n const factsPath = path.join(customersDir, slug, \"main_facts.md\");\n const interactionsPath = path.join(customersDir, slug, \"interactions.md\");\n\n if (!fs.existsSync(factsPath)) {\n console.log(error(`✗ ${slug}: missing main_facts.md`));\n errorCount++;\n continue;\n }\n\n try {\n let content = fs.readFileSync(factsPath, \"utf-8\") as string;\n let parsed = matter(content);\n\n if (opts.fix) {\n const result = applyFix(factsPath, content, parsed.data as Record<string, unknown>);\n if (result) {\n content = result.content;\n parsed = matter(content); // only re-parse when a fix actually rewrote content\n fixedCount++;\n console.log(info(`⚙ ${slug}: fixed ${result.fixed.join(\", \")}`));\n }\n }\n\n MainFactsSchema.parse(parsed.data);\n\n if (!fs.existsSync(interactionsPath)) {\n console.log(warning(`⚠ ${slug}: missing interactions.md`));\n } else {\n console.log(success(`✓ ${slug}`));\n }\n } catch (err) {\n console.log(error(`✗ ${slug}: ${(err as Error).message}`));\n errorCount++;\n }\n }\n\n if (opts.fix && fixedCount > 0) {\n console.log(info(`\\n⚙ Fixed ${fixedCount} customer(s).`));\n }\n\n if (errorCount > 0) {\n console.error(error(`\\n${errorCount} error(s) found.`));\n process.exit(1);\n } else {\n console.log(success(\"\\n✓ All customers valid.\"));\n }\n}\n\nexport const validateCommand = new Command(\"validate\")\n .description(\"Validate all customer data against schemas\")\n .option(\"--fix\", \"Auto-fix recoverable issues\")\n .action(async (opts: { fix?: boolean }) => {\n await runValidate(opts, process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd());\n });\n","export const VERSION = \"0.1.0\";\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -95,12 +95,12 @@ declare const MainFactsSchema: z.ZodObject<{
95
95
  created: z.ZodEffects<z.ZodString, string, unknown>;
96
96
  updated: z.ZodEffects<z.ZodString, string, unknown>;
97
97
  }, "strip", z.ZodTypeAny, {
98
- created: string;
99
98
  name: string;
100
- relationship_stage: "prospect" | "active" | "churned" | "paused";
101
99
  currency: string;
102
- tags: string[];
103
100
  updated: string;
101
+ created: string;
102
+ relationship_stage: "prospect" | "active" | "churned" | "paused";
103
+ tags: string[];
104
104
  domain?: string | undefined;
105
105
  email?: string | undefined;
106
106
  phone?: string | undefined;
@@ -111,17 +111,17 @@ declare const MainFactsSchema: z.ZodObject<{
111
111
  }, {
112
112
  name: string;
113
113
  relationship_stage: "prospect" | "active" | "churned" | "paused";
114
+ currency?: string | undefined;
115
+ updated?: unknown;
114
116
  created?: unknown;
115
117
  domain?: string | undefined;
116
118
  email?: string | undefined;
117
119
  phone?: string | undefined;
118
120
  industry?: string | undefined;
119
121
  deal_value?: number | undefined;
120
- currency?: string | undefined;
121
122
  primary_contact?: string | undefined;
122
123
  timezone?: string | undefined;
123
124
  tags?: string[] | undefined;
124
- updated?: unknown;
125
125
  }>;
126
126
  type MainFacts = z.infer<typeof MainFactsSchema>;
127
127
  //# sourceMappingURL=main-facts.d.ts.map
@@ -135,11 +135,13 @@ declare const InteractionEntrySchema: z.ZodObject<{
135
135
  subject: z.ZodOptional<z.ZodString>;
136
136
  summary: z.ZodString;
137
137
  nextSteps: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
138
+ /** Relative links (from the customer dir) to converted attachment Markdown. */
139
+ attachments: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
138
140
  sourceRef: z.ZodString;
139
141
  synced: z.ZodString;
140
142
  }, "strip", z.ZodTypeAny, {
141
- date: string;
142
143
  type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
144
+ date: string;
143
145
  with: string;
144
146
  summary: string;
145
147
  nextSteps: string[];
@@ -147,9 +149,10 @@ declare const InteractionEntrySchema: z.ZodObject<{
147
149
  synced: string;
148
150
  direction?: "inbound" | "outbound" | undefined;
149
151
  subject?: string | undefined;
152
+ attachments?: string[] | undefined;
150
153
  }, {
151
- date: string;
152
154
  type: "Email" | "Call" | "Meeting" | "Note" | "Demo" | "Proposal" | "Contract" | "Other";
155
+ date: string;
153
156
  with: string;
154
157
  summary: string;
155
158
  sourceRef: string;
@@ -157,6 +160,7 @@ declare const InteractionEntrySchema: z.ZodObject<{
157
160
  direction?: "inbound" | "outbound" | undefined;
158
161
  subject?: string | undefined;
159
162
  nextSteps?: string[] | undefined;
163
+ attachments?: string[] | undefined;
160
164
  }>;
161
165
  type InteractionEntry = z.infer<typeof InteractionEntrySchema>;
162
166
  //# sourceMappingURL=interaction.d.ts.map
@@ -173,17 +177,17 @@ declare const PipelineDealSchema: z.ZodObject<{
173
177
  updated: z.ZodString;
174
178
  }, "strip", z.ZodTypeAny, {
175
179
  name: string;
180
+ stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
176
181
  currency: string;
177
182
  updated: string;
178
- stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
179
183
  value?: number | undefined;
180
184
  probability?: number | undefined;
181
185
  close_date?: string | undefined;
182
186
  notes?: string | undefined;
183
187
  }, {
184
188
  name: string;
185
- updated: string;
186
189
  stage: "lead" | "qualified" | "proposal" | "negotiation" | "won" | "lost";
190
+ updated: string;
187
191
  value?: number | undefined;
188
192
  currency?: string | undefined;
189
193
  probability?: number | undefined;
@@ -341,9 +345,9 @@ declare const KbArticleSchema: z.ZodObject<{
341
345
  updatedAt: z.ZodString;
342
346
  sourceTicketId: z.ZodOptional<z.ZodString>;
343
347
  }, "strip", z.ZodTypeAny, {
344
- tags: string[];
345
348
  id: string;
346
349
  title: string;
350
+ tags: string[];
347
351
  createdAt: string;
348
352
  category: string;
349
353
  public: boolean;
@@ -515,7 +519,11 @@ interface RbacConfig {
515
519
  declare function getRbacConfig(dataDir: string): RbacConfig;
516
520
  declare function getRole(dataDir: string, actor: string): Role;
517
521
  declare function canSeeCustomer(dataDir: string, actor: string, slug: string): boolean;
518
- /** Load the field-level ACL (field → allowed roles) from rbac.json. */
522
+ /**
523
+ * Build a once-loaded predicate for which customers `actor` may see. Equivalent
524
+ * to calling canSeeCustomer per slug, but reads/parses rbac.json a single time
525
+ * (and uses O(1) Set membership) — for hot loops like list_customers.
526
+ */
519
527
  //#endregion
520
528
  //#region src/core/session-store.d.ts
521
529
  interface Session {
@@ -535,4 +543,4 @@ declare const VERSION = "0.1.0";
535
543
 
536
544
  //#endregion
537
545
  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 };
538
- //# sourceMappingURL=index-YqwMd6aQ.d.cts.map
546
+ //# sourceMappingURL=index-BAutNcAT.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-YqwMd6aQ.d.cts","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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"}
1
+ {"version":3,"file":"index-BAutNcAT.d.cts","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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"}