@hasna/contacts 0.6.34 → 0.6.36

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 (214) hide show
  1. package/README.md +10 -1
  2. package/dashboard/dist/assets/index-0l6aQb1t.css +1 -0
  3. package/dashboard/dist/assets/index-opnZdkVD.js +229 -0
  4. package/dashboard/dist/index.html +13 -0
  5. package/dist/cli/commands/advanced.d.ts +3 -0
  6. package/dist/cli/commands/advanced.d.ts.map +1 -0
  7. package/dist/cli/commands/audience.d.ts +18 -0
  8. package/dist/cli/commands/audience.d.ts.map +1 -0
  9. package/dist/cli/commands/core.d.ts +3 -0
  10. package/dist/cli/commands/core.d.ts.map +1 -0
  11. package/dist/cli/commands/crm.d.ts +3 -0
  12. package/dist/cli/commands/crm.d.ts.map +1 -0
  13. package/dist/cli/index.d.ts +3 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +2994 -579
  16. package/dist/cli/storage.d.ts +3 -0
  17. package/dist/cli/storage.d.ts.map +1 -0
  18. package/dist/cli/utils.d.ts +10 -0
  19. package/dist/cli/utils.d.ts.map +1 -0
  20. package/dist/cloud/http-storage.d.ts +88 -0
  21. package/dist/cloud/http-storage.d.ts.map +1 -0
  22. package/dist/db/activity.d.ts +15 -0
  23. package/dist/db/activity.d.ts.map +1 -0
  24. package/dist/db/applications.d.ts +10 -0
  25. package/dist/db/applications.d.ts.map +1 -0
  26. package/dist/db/audiences.d.ts +51 -0
  27. package/dist/db/audiences.d.ts.map +1 -0
  28. package/dist/db/companies.d.ts +19 -0
  29. package/dist/db/companies.d.ts.map +1 -0
  30. package/dist/db/contact-tasks.d.ts +19 -0
  31. package/dist/db/contact-tasks.d.ts.map +1 -0
  32. package/dist/db/contacts.d.ts +30 -0
  33. package/dist/db/contacts.d.ts.map +1 -0
  34. package/dist/db/coordination.d.ts +30 -0
  35. package/dist/db/coordination.d.ts.map +1 -0
  36. package/dist/db/database.d.ts +8 -0
  37. package/dist/db/database.d.ts.map +1 -0
  38. package/dist/db/deals.d.ts +14 -0
  39. package/dist/db/deals.d.ts.map +1 -0
  40. package/dist/db/documents.d.ts +38 -0
  41. package/dist/db/documents.d.ts.map +1 -0
  42. package/dist/db/events.d.ts +14 -0
  43. package/dist/db/events.d.ts.map +1 -0
  44. package/dist/db/field-history.d.ts +17 -0
  45. package/dist/db/field-history.d.ts.map +1 -0
  46. package/dist/db/freshness.d.ts +24 -0
  47. package/dist/db/freshness.d.ts.map +1 -0
  48. package/dist/db/graph.d.ts +21 -0
  49. package/dist/db/graph.d.ts.map +1 -0
  50. package/dist/db/groups.d.ts +22 -0
  51. package/dist/db/groups.d.ts.map +1 -0
  52. package/dist/db/health.d.ts +40 -0
  53. package/dist/db/health.d.ts.map +1 -0
  54. package/dist/db/identity.d.ts +32 -0
  55. package/dist/db/identity.d.ts.map +1 -0
  56. package/dist/db/job-history.d.ts +29 -0
  57. package/dist/db/job-history.d.ts.map +1 -0
  58. package/dist/db/learnings.d.ts +43 -0
  59. package/dist/db/learnings.d.ts.map +1 -0
  60. package/dist/db/notes.d.ts +8 -0
  61. package/dist/db/notes.d.ts.map +1 -0
  62. package/dist/db/org-chart.d.ts +37 -0
  63. package/dist/db/org-chart.d.ts.map +1 -0
  64. package/dist/db/org-members.d.ts +9 -0
  65. package/dist/db/org-members.d.ts.map +1 -0
  66. package/dist/db/paths.d.ts +15 -0
  67. package/dist/db/paths.d.ts.map +1 -0
  68. package/dist/db/pg-migrations.d.ts +8 -0
  69. package/dist/db/pg-migrations.d.ts.map +1 -0
  70. package/dist/db/project-memberships.d.ts +8 -0
  71. package/dist/db/project-memberships.d.ts.map +1 -0
  72. package/dist/db/relationships.d.ts +30 -0
  73. package/dist/db/relationships.d.ts.map +1 -0
  74. package/dist/db/signals.d.ts +18 -0
  75. package/dist/db/signals.d.ts.map +1 -0
  76. package/dist/db/sqlite-adapter.d.ts +15 -0
  77. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  78. package/dist/db/storage.d.ts +15 -0
  79. package/dist/db/storage.d.ts.map +1 -0
  80. package/dist/db/tags.d.ts +14 -0
  81. package/dist/db/tags.d.ts.map +1 -0
  82. package/dist/db/tombstones.d.ts +19 -0
  83. package/dist/db/tombstones.d.ts.map +1 -0
  84. package/dist/db/vendor-comms.d.ts +15 -0
  85. package/dist/db/vendor-comms.d.ts.map +1 -0
  86. package/dist/generated/storage-kit/health.d.ts +20 -0
  87. package/dist/generated/storage-kit/health.d.ts.map +1 -0
  88. package/dist/generated/storage-kit/index.d.ts +8 -0
  89. package/dist/generated/storage-kit/index.d.ts.map +1 -0
  90. package/dist/generated/storage-kit/migrations.d.ts +48 -0
  91. package/dist/generated/storage-kit/migrations.d.ts.map +1 -0
  92. package/dist/generated/storage-kit/mode.d.ts +48 -0
  93. package/dist/generated/storage-kit/mode.d.ts.map +1 -0
  94. package/dist/generated/storage-kit/pool.d.ts +34 -0
  95. package/dist/generated/storage-kit/pool.d.ts.map +1 -0
  96. package/dist/generated/storage-kit/query.d.ts +36 -0
  97. package/dist/generated/storage-kit/query.d.ts.map +1 -0
  98. package/dist/generated/storage-kit/tls.d.ts +26 -0
  99. package/dist/generated/storage-kit/tls.d.ts.map +1 -0
  100. package/dist/index.d.ts +9 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +805 -75
  103. package/dist/lib/apple-contacts.d.ts +3 -0
  104. package/dist/lib/apple-contacts.d.ts.map +1 -0
  105. package/dist/lib/audience-contract.d.ts +215 -0
  106. package/dist/lib/audience-contract.d.ts.map +1 -0
  107. package/dist/lib/audit.d.ts +12 -0
  108. package/dist/lib/audit.d.ts.map +1 -0
  109. package/dist/lib/brief.d.ts +3 -0
  110. package/dist/lib/brief.d.ts.map +1 -0
  111. package/dist/lib/config.d.ts +7 -0
  112. package/dist/lib/config.d.ts.map +1 -0
  113. package/dist/lib/connector.d.ts +44 -0
  114. package/dist/lib/connector.d.ts.map +1 -0
  115. package/dist/lib/context.d.ts +5 -0
  116. package/dist/lib/context.d.ts.map +1 -0
  117. package/dist/lib/dedup.d.ts +10 -0
  118. package/dist/lib/dedup.d.ts.map +1 -0
  119. package/dist/lib/document-scanner.d.ts +8 -0
  120. package/dist/lib/document-scanner.d.ts.map +1 -0
  121. package/dist/lib/embeddings.d.ts +9 -0
  122. package/dist/lib/embeddings.d.ts.map +1 -0
  123. package/dist/lib/export.d.ts +8 -0
  124. package/dist/lib/export.d.ts.map +1 -0
  125. package/dist/lib/freshness.d.ts +19 -0
  126. package/dist/lib/freshness.d.ts.map +1 -0
  127. package/dist/lib/gmail-import.d.ts +51 -0
  128. package/dist/lib/gmail-import.d.ts.map +1 -0
  129. package/dist/lib/google-contacts.d.ts +115 -0
  130. package/dist/lib/google-contacts.d.ts.map +1 -0
  131. package/dist/lib/images.d.ts +30 -0
  132. package/dist/lib/images.d.ts.map +1 -0
  133. package/dist/lib/import.d.ts +10 -0
  134. package/dist/lib/import.d.ts.map +1 -0
  135. package/dist/lib/learning-maintenance.d.ts +8 -0
  136. package/dist/lib/learning-maintenance.d.ts.map +1 -0
  137. package/dist/lib/mailery-sync.d.ts +46 -0
  138. package/dist/lib/mailery-sync.d.ts.map +1 -0
  139. package/dist/lib/meeting-capture.d.ts +15 -0
  140. package/dist/lib/meeting-capture.d.ts.map +1 -0
  141. package/dist/lib/package-version.d.ts +6 -0
  142. package/dist/lib/package-version.d.ts.map +1 -0
  143. package/dist/lib/signals.d.ts +9 -0
  144. package/dist/lib/signals.d.ts.map +1 -0
  145. package/dist/lib/signature-parser.d.ts +36 -0
  146. package/dist/lib/signature-parser.d.ts.map +1 -0
  147. package/dist/lib/stats.d.ts +24 -0
  148. package/dist/lib/stats.d.ts.map +1 -0
  149. package/dist/lib/timeline.d.ts +11 -0
  150. package/dist/lib/timeline.d.ts.map +1 -0
  151. package/dist/lib/upcoming.d.ts +14 -0
  152. package/dist/lib/upcoming.d.ts.map +1 -0
  153. package/dist/lib/vault.d.ts +28 -0
  154. package/dist/lib/vault.d.ts.map +1 -0
  155. package/dist/mcp/handlers/advanced.d.ts +14 -0
  156. package/dist/mcp/handlers/advanced.d.ts.map +1 -0
  157. package/dist/mcp/handlers/audience.d.ts +9 -0
  158. package/dist/mcp/handlers/audience.d.ts.map +1 -0
  159. package/dist/mcp/handlers/core.d.ts +10 -0
  160. package/dist/mcp/handlers/core.d.ts.map +1 -0
  161. package/dist/mcp/handlers/crm.d.ts +14 -0
  162. package/dist/mcp/handlers/crm.d.ts.map +1 -0
  163. package/dist/mcp/handlers/index.d.ts +4 -0
  164. package/dist/mcp/handlers/index.d.ts.map +1 -0
  165. package/dist/mcp/handlers/types.d.ts +10 -0
  166. package/dist/mcp/handlers/types.d.ts.map +1 -0
  167. package/dist/mcp/http.d.ts +17 -0
  168. package/dist/mcp/http.d.ts.map +1 -0
  169. package/dist/mcp/index.d.ts +5 -0
  170. package/dist/mcp/index.d.ts.map +1 -0
  171. package/dist/mcp/index.js +1054 -291
  172. package/dist/mcp/register-tools.d.ts +3 -0
  173. package/dist/mcp/register-tools.d.ts.map +1 -0
  174. package/dist/mcp/schema.d.ts +3 -0
  175. package/dist/mcp/schema.d.ts.map +1 -0
  176. package/dist/mcp/storage-tools.d.ts +3 -0
  177. package/dist/mcp/storage-tools.d.ts.map +1 -0
  178. package/dist/mcp/tools.d.ts +3799 -0
  179. package/dist/mcp/tools.d.ts.map +1 -0
  180. package/dist/sdk/index.d.ts +16 -0
  181. package/dist/sdk/index.d.ts.map +1 -0
  182. package/dist/sdk/index.js +63 -0
  183. package/dist/sdk/v1.generated.d.ts +270 -0
  184. package/dist/sdk/v1.generated.d.ts.map +1 -0
  185. package/dist/server/cloud-index.d.ts +3 -0
  186. package/dist/server/cloud-index.d.ts.map +1 -0
  187. package/dist/server/cloud-serve.d.ts +3 -0
  188. package/dist/server/cloud-serve.d.ts.map +1 -0
  189. package/dist/server/cloud.d.ts +53 -0
  190. package/dist/server/cloud.d.ts.map +1 -0
  191. package/dist/server/index.d.ts +3 -0
  192. package/dist/server/index.d.ts.map +1 -0
  193. package/dist/server/index.js +1750 -332
  194. package/dist/server/openapi.d.ts +1134 -0
  195. package/dist/server/openapi.d.ts.map +1 -0
  196. package/dist/server/pg-store.d.ts +893 -0
  197. package/dist/server/pg-store.d.ts.map +1 -0
  198. package/dist/server/security.d.ts +24 -0
  199. package/dist/server/security.d.ts.map +1 -0
  200. package/dist/server/serve.d.ts +9 -0
  201. package/dist/server/serve.d.ts.map +1 -0
  202. package/dist/server/v1.d.ts +28 -0
  203. package/dist/server/v1.d.ts.map +1 -0
  204. package/dist/store/index.d.ts +387 -0
  205. package/dist/store/index.d.ts.map +1 -0
  206. package/dist/types/index.d.ts +856 -0
  207. package/dist/types/index.d.ts.map +1 -0
  208. package/dist/types/project-memberships.d.ts +32 -0
  209. package/dist/types/project-memberships.d.ts.map +1 -0
  210. package/hasna.contract.json +1 -1
  211. package/migrations/0015_contact_project_membership_authority.sql +88 -0
  212. package/package.json +4 -2
  213. package/vendor/fast-uri/README.md +12 -0
  214. package/dist/server/cloud-index.js +0 -9187
@@ -0,0 +1,3 @@
1
+ export declare function exportFromApple(): Promise<string>;
2
+ export declare function importToApple(vcfData: string): Promise<void>;
3
+ //# sourceMappingURL=apple-contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apple-contacts.d.ts","sourceRoot":"","sources":["../../src/lib/apple-contacts.ts"],"names":[],"mappings":"AAAA,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAQvD;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Vendored minimal mirror of the `hasna.audience.v1` contract from
3
+ * @hasna/contracts (branch feat/distribution-schemas). The upstream package is
4
+ * not published yet, so this file mirrors the schema shape 1:1 (strict object,
5
+ * contract base fields, predicate refinement rules). Once @hasna/contracts
6
+ * ships, this mirror can be replaced with:
7
+ *
8
+ * import { AudienceSchema, parseContract, SCHEMA_IDS } from "@hasna/contracts/schemas";
9
+ * parseContract(SCHEMA_IDS.audience, value);
10
+ */
11
+ import { z } from "zod";
12
+ import type { Audience } from "../types/index.js";
13
+ export declare const AUDIENCE_CONTRACT_SCHEMA_ID: "hasna.audience.v1";
14
+ export declare const AudiencePredicateContractSchema: z.ZodEffects<z.ZodObject<{
15
+ kind: z.ZodEnum<["tag", "attribute", "group"]>;
16
+ key: z.ZodOptional<z.ZodString>;
17
+ op: z.ZodDefault<z.ZodEnum<["eq", "neq", "in", "not_in", "exists", "not_exists"]>>;
18
+ value: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
19
+ values: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "many">>;
20
+ }, "strict", z.ZodTypeAny, {
21
+ values: (string | number | boolean)[];
22
+ kind: "tag" | "attribute" | "group";
23
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
24
+ key?: string | undefined;
25
+ value?: string | number | boolean | undefined;
26
+ }, {
27
+ kind: "tag" | "attribute" | "group";
28
+ values?: (string | number | boolean)[] | undefined;
29
+ key?: string | undefined;
30
+ value?: string | number | boolean | undefined;
31
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
32
+ }>, {
33
+ values: (string | number | boolean)[];
34
+ kind: "tag" | "attribute" | "group";
35
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
36
+ key?: string | undefined;
37
+ value?: string | number | boolean | undefined;
38
+ }, {
39
+ kind: "tag" | "attribute" | "group";
40
+ values?: (string | number | boolean)[] | undefined;
41
+ key?: string | undefined;
42
+ value?: string | number | boolean | undefined;
43
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
44
+ }>;
45
+ export declare const AudienceDefinitionContractSchema: z.ZodObject<{
46
+ match: z.ZodDefault<z.ZodEnum<["all", "any"]>>;
47
+ predicates: z.ZodArray<z.ZodEffects<z.ZodObject<{
48
+ kind: z.ZodEnum<["tag", "attribute", "group"]>;
49
+ key: z.ZodOptional<z.ZodString>;
50
+ op: z.ZodDefault<z.ZodEnum<["eq", "neq", "in", "not_in", "exists", "not_exists"]>>;
51
+ value: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
52
+ values: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "many">>;
53
+ }, "strict", z.ZodTypeAny, {
54
+ values: (string | number | boolean)[];
55
+ kind: "tag" | "attribute" | "group";
56
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
57
+ key?: string | undefined;
58
+ value?: string | number | boolean | undefined;
59
+ }, {
60
+ kind: "tag" | "attribute" | "group";
61
+ values?: (string | number | boolean)[] | undefined;
62
+ key?: string | undefined;
63
+ value?: string | number | boolean | undefined;
64
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
65
+ }>, {
66
+ values: (string | number | boolean)[];
67
+ kind: "tag" | "attribute" | "group";
68
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
69
+ key?: string | undefined;
70
+ value?: string | number | boolean | undefined;
71
+ }, {
72
+ kind: "tag" | "attribute" | "group";
73
+ values?: (string | number | boolean)[] | undefined;
74
+ key?: string | undefined;
75
+ value?: string | number | boolean | undefined;
76
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
77
+ }>, "many">;
78
+ }, "strict", z.ZodTypeAny, {
79
+ match: "all" | "any";
80
+ predicates: {
81
+ values: (string | number | boolean)[];
82
+ kind: "tag" | "attribute" | "group";
83
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
84
+ key?: string | undefined;
85
+ value?: string | number | boolean | undefined;
86
+ }[];
87
+ }, {
88
+ predicates: {
89
+ kind: "tag" | "attribute" | "group";
90
+ values?: (string | number | boolean)[] | undefined;
91
+ key?: string | undefined;
92
+ value?: string | number | boolean | undefined;
93
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
94
+ }[];
95
+ match?: "all" | "any" | undefined;
96
+ }>;
97
+ export declare const ConsentPolicyContractSchema: z.ZodEnum<["opt_in", "opt_out", "transactional", "none"]>;
98
+ export declare const AudienceContractSchema: z.ZodObject<{
99
+ schema: z.ZodLiteral<"hasna.audience.v1">;
100
+ id: z.ZodString;
101
+ createdAt: z.ZodString;
102
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
103
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
104
+ audienceId: z.ZodString;
105
+ name: z.ZodString;
106
+ definition: z.ZodObject<{
107
+ match: z.ZodDefault<z.ZodEnum<["all", "any"]>>;
108
+ predicates: z.ZodArray<z.ZodEffects<z.ZodObject<{
109
+ kind: z.ZodEnum<["tag", "attribute", "group"]>;
110
+ key: z.ZodOptional<z.ZodString>;
111
+ op: z.ZodDefault<z.ZodEnum<["eq", "neq", "in", "not_in", "exists", "not_exists"]>>;
112
+ value: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
113
+ values: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "many">>;
114
+ }, "strict", z.ZodTypeAny, {
115
+ values: (string | number | boolean)[];
116
+ kind: "tag" | "attribute" | "group";
117
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
118
+ key?: string | undefined;
119
+ value?: string | number | boolean | undefined;
120
+ }, {
121
+ kind: "tag" | "attribute" | "group";
122
+ values?: (string | number | boolean)[] | undefined;
123
+ key?: string | undefined;
124
+ value?: string | number | boolean | undefined;
125
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
126
+ }>, {
127
+ values: (string | number | boolean)[];
128
+ kind: "tag" | "attribute" | "group";
129
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
130
+ key?: string | undefined;
131
+ value?: string | number | boolean | undefined;
132
+ }, {
133
+ kind: "tag" | "attribute" | "group";
134
+ values?: (string | number | boolean)[] | undefined;
135
+ key?: string | undefined;
136
+ value?: string | number | boolean | undefined;
137
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
138
+ }>, "many">;
139
+ }, "strict", z.ZodTypeAny, {
140
+ match: "all" | "any";
141
+ predicates: {
142
+ values: (string | number | boolean)[];
143
+ kind: "tag" | "attribute" | "group";
144
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
145
+ key?: string | undefined;
146
+ value?: string | number | boolean | undefined;
147
+ }[];
148
+ }, {
149
+ predicates: {
150
+ kind: "tag" | "attribute" | "group";
151
+ values?: (string | number | boolean)[] | undefined;
152
+ key?: string | undefined;
153
+ value?: string | number | boolean | undefined;
154
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
155
+ }[];
156
+ match?: "all" | "any" | undefined;
157
+ }>;
158
+ consentPolicy: z.ZodEnum<["opt_in", "opt_out", "transactional", "none"]>;
159
+ suppressionSyncedAt: z.ZodOptional<z.ZodString>;
160
+ }, "strict", z.ZodTypeAny, {
161
+ name: string;
162
+ id: string;
163
+ schema: "hasna.audience.v1";
164
+ createdAt: string;
165
+ audienceId: string;
166
+ definition: {
167
+ match: "all" | "any";
168
+ predicates: {
169
+ values: (string | number | boolean)[];
170
+ kind: "tag" | "attribute" | "group";
171
+ op: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists";
172
+ key?: string | undefined;
173
+ value?: string | number | boolean | undefined;
174
+ }[];
175
+ };
176
+ consentPolicy: "opt_in" | "opt_out" | "transactional" | "none";
177
+ metadata?: Record<string, unknown> | undefined;
178
+ updatedAt?: string | null | undefined;
179
+ suppressionSyncedAt?: string | undefined;
180
+ }, {
181
+ name: string;
182
+ id: string;
183
+ schema: "hasna.audience.v1";
184
+ createdAt: string;
185
+ audienceId: string;
186
+ definition: {
187
+ predicates: {
188
+ kind: "tag" | "attribute" | "group";
189
+ values?: (string | number | boolean)[] | undefined;
190
+ key?: string | undefined;
191
+ value?: string | number | boolean | undefined;
192
+ op?: "eq" | "neq" | "in" | "not_in" | "exists" | "not_exists" | undefined;
193
+ }[];
194
+ match?: "all" | "any" | undefined;
195
+ };
196
+ consentPolicy: "opt_in" | "opt_out" | "transactional" | "none";
197
+ metadata?: Record<string, unknown> | undefined;
198
+ updatedAt?: string | null | undefined;
199
+ suppressionSyncedAt?: string | undefined;
200
+ }>;
201
+ export type AudienceContract = z.infer<typeof AudienceContractSchema>;
202
+ /** Map a stored audience row to a hasna.audience.v1 contract document. */
203
+ export declare function toAudienceContract(audience: Audience): AudienceContract;
204
+ /** Validate an arbitrary value against the vendored hasna.audience.v1 mirror. */
205
+ export declare function validateAudienceContract(value: unknown): {
206
+ ok: true;
207
+ value: AudienceContract;
208
+ } | {
209
+ ok: false;
210
+ issues: {
211
+ path: string;
212
+ message: string;
213
+ }[];
214
+ };
215
+ //# sourceMappingURL=audience-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience-contract.d.ts","sourceRoot":"","sources":["../../src/lib/audience-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,eAAO,MAAM,2BAA2B,EAAG,mBAA4B,CAAC;AAUxE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBxC,CAAC;AAEL,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKlC,CAAC;AAEZ,eAAO,MAAM,2BAA2B,2DAAyD,CAAC;AAElG,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaxB,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAwBvE;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAO3J"}
@@ -0,0 +1,12 @@
1
+ import type { ContactsDatabase } from "../db/database.js";
2
+ import type { ContactWithDetails } from "../types/index.js";
3
+ export interface AuditResult {
4
+ contact_id: string;
5
+ display_name: string;
6
+ score: number;
7
+ missing: string[];
8
+ suggestions: string[];
9
+ }
10
+ export declare function auditContact(contact: ContactWithDetails): AuditResult;
11
+ export declare function listContactAudit(db?: ContactsDatabase): Promise<AuditResult[]>;
12
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CA2BrE;AAED,wBAAsB,gBAAgB,CAAC,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAMpF"}
@@ -0,0 +1,3 @@
1
+ import type { ContactsDatabase } from "../db/database.js";
2
+ export declare function generateBrief(contactId: string, db?: ContactsDatabase): string;
3
+ //# sourceMappingURL=brief.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../../src/lib/brief.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQ1D,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,GAAG,MAAM,CA0D9E"}
@@ -0,0 +1,7 @@
1
+ interface ContactsConfig {
2
+ db_path?: string;
3
+ }
4
+ export declare function readConfig(): ContactsConfig;
5
+ export declare function writeConfig(config: ContactsConfig): void;
6
+ export {};
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,UAAU,IAAI,cAAc,CAG3C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAGxD"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Generic connector runner — the scalable foundation for all external service
3
+ * integrations. Any connector (Gmail, Google Contacts, HubSpot, Salesforce…)
4
+ * uses this same interface; only the `name` and `args` differ.
5
+ *
6
+ * Prerequisites: the target connector must be globally installed and authed:
7
+ * bun install -g @hasnaxyz/connect-{name}
8
+ * connect-{name} auth login
9
+ */
10
+ export interface ConnectorRunOptions {
11
+ /** Connector profile to use (default: "default") */
12
+ profile?: string;
13
+ /** Timeout in ms (default: 30_000) */
14
+ timeout?: number;
15
+ }
16
+ export declare class ConnectorNotInstalledError extends Error {
17
+ readonly connectorName: string;
18
+ constructor(connectorName: string);
19
+ }
20
+ export declare class ConnectorAuthError extends Error {
21
+ readonly connectorName: string;
22
+ constructor(connectorName: string, detail?: string);
23
+ }
24
+ /**
25
+ * Execute any connector operation and return the parsed JSON output.
26
+ *
27
+ * Usage:
28
+ * const messages = await runConnector("gmail", ["messages", "list", "-q", "from:acme.com"]);
29
+ * const contacts = await runConnector("googlecontacts", ["contacts", "list"]);
30
+ */
31
+ export declare function runConnector(name: string, args: string[], opts?: ConnectorRunOptions): Promise<unknown>;
32
+ /**
33
+ * Returns the path to a connector's token file.
34
+ * Useful for implementations that need direct API access with refreshed tokens.
35
+ * Checks canonical path first, then legacy fallback.
36
+ */
37
+ export declare function getConnectorTokenPath(name: string, profile?: string): string | null;
38
+ /**
39
+ * Read and parse connector tokens from disk.
40
+ * Useful when a library needs a raw access token (e.g. for batched REST calls
41
+ * that would be too slow to do one-at-a-time through the CLI).
42
+ */
43
+ export declare function readConnectorTokens(name: string, profile?: string): Record<string, unknown>;
44
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../src/lib/connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,aAAa,EAAE,MAAM;gBAArB,aAAa,EAAE,MAAM;CAOlD;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aACf,aAAa,EAAE,MAAM;gBAArB,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAQnE;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAyDlB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAY,GAAG,MAAM,GAAG,IAAI,CAUtF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ9F"}
@@ -0,0 +1,5 @@
1
+ import type { ContactsDatabase } from "../db/database.js";
2
+ export declare function getContactCard(contactId: string, db?: ContactsDatabase): object;
3
+ export declare function getContactBrief(contactId: string, taskContext?: string, db?: ContactsDatabase): object;
4
+ export declare function assembleContext(contactIds: string[], format?: 'meeting_prep' | 'deal_review' | 'outreach' | 'research', db?: ContactsDatabase): Promise<object>;
5
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/lib/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK1D,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAc/E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAkCtG;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,cAAc,GAAG,aAAa,GAAG,UAAU,GAAG,UAA2B,EAAE,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOrL"}
@@ -0,0 +1,10 @@
1
+ import type { ContactsDatabase } from "../db/database.js";
2
+ export declare function findEmailDuplicates(db: ContactsDatabase): Array<{
3
+ email: string;
4
+ contact_ids: string[];
5
+ }>;
6
+ export declare function findNameDuplicates(db: ContactsDatabase): Array<{
7
+ contact_ids: [string, string];
8
+ similarity: number;
9
+ }>;
10
+ //# sourceMappingURL=dedup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../../src/lib/dedup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CASzG;AAeD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC;IAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAYrH"}
@@ -0,0 +1,8 @@
1
+ export interface DocumentScanResult {
2
+ fields: Record<string, string>;
3
+ raw_text: string;
4
+ document_type: string;
5
+ confidence: number;
6
+ }
7
+ export declare function scanDocument(imageSource: string, docType?: string): Promise<DocumentScanResult>;
8
+ //# sourceMappingURL=document-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-scanner.d.ts","sourceRoot":"","sources":["../../src/lib/document-scanner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoGrG"}
@@ -0,0 +1,9 @@
1
+ import type { ContactsDatabase } from "../db/database.js";
2
+ export declare function buildContactEmbeddingText(contact: Record<string, unknown>): string;
3
+ export declare function embedContact(contactId: string, db?: ContactsDatabase): Promise<void>;
4
+ export declare function embedAllContacts(db?: ContactsDatabase): Promise<number>;
5
+ export declare function semanticSearch(query: string, limit?: number, db?: ContactsDatabase): Array<{
6
+ contact_id: string;
7
+ score: number;
8
+ }>;
9
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/lib/embeddings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAuB1D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAclF;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1F;AAED,wBAAsB,gBAAgB,CAAC,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAO7E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,EAAE,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB7H"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Export contacts to CSV, vCard (.vcf), or JSON formats.
3
+ * Accepts ContactWithDetails from src/types/index.ts.
4
+ */
5
+ import type { ContactWithDetails } from "../types/index.js";
6
+ export type ExportContact = ContactWithDetails;
7
+ export declare function exportContacts(format: "json" | "csv" | "vcf", contacts: ExportContact[]): Promise<string>;
8
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/lib/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAqK/C,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAC9B,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,CAWjB"}
@@ -0,0 +1,19 @@
1
+ import type { ContactsDatabase } from "../db/database.js";
2
+ export interface FreshnessResult {
3
+ contact_id: string;
4
+ score: number;
5
+ breakdown: Record<string, {
6
+ confidence: string;
7
+ last_verified?: string;
8
+ days_ago?: number;
9
+ }>;
10
+ needs_enrichment: boolean;
11
+ }
12
+ export declare function getFreshnessScore(contactId: string, db?: ContactsDatabase): FreshnessResult;
13
+ export declare function getStaleContacts(_threshold?: number, db?: ContactsDatabase): Array<{
14
+ id: string;
15
+ display_name: string;
16
+ score: number;
17
+ }>;
18
+ export declare function markFieldVerified(contactId: string, fieldName: string, source: string, db?: ContactsDatabase): void;
19
+ //# sourceMappingURL=freshness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freshness.d.ts","sourceRoot":"","sources":["../../src/lib/freshness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAoD3F;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,SAAK,EACf,EAAE,CAAC,EAAE,gBAAgB,GACpB,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAW5D;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,EAAE,CAAC,EAAE,gBAAgB,GACpB,IAAI,CAON"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Gmail contact import — fetches messages matching a query via the connect-gmail
3
+ * connector, extracts unique senders/recipients, and returns them as
4
+ * CreateContactInput objects ready to upsert into the local DB.
5
+ *
6
+ * Auth: connect-gmail auth login (run once per profile)
7
+ * Install: bun install -g @hasnaxyz/connect-gmail
8
+ */
9
+ import type { CreateContactInput } from "../types/index.js";
10
+ /**
11
+ * Parse a single RFC 5322 address header value into { name, email } pairs.
12
+ * Handles: "Name <email>", "<email>", "email", and comma-separated lists.
13
+ */
14
+ export declare function parseAddressHeader(header: string): Array<{
15
+ name: string;
16
+ email: string;
17
+ }>;
18
+ /**
19
+ * Infer a company name from an email domain.
20
+ * Returns null for personal/generic domains (gmail, yahoo, hotmail, etc.).
21
+ */
22
+ export declare function domainToCompany(email: string): string | null;
23
+ /**
24
+ * Parse display name into first/last name.
25
+ */
26
+ export declare function parseName(displayName: string): {
27
+ first_name?: string;
28
+ last_name?: string;
29
+ };
30
+ export interface GmailImportOptions {
31
+ query: string;
32
+ /** Max messages to scan (default 200, max 500) */
33
+ max_messages?: number;
34
+ /** Gmail profile to use (default: "default") */
35
+ gmail_profile?: string;
36
+ tag_ids?: string[];
37
+ group_id?: string;
38
+ }
39
+ export interface ExtractedContact {
40
+ email: string;
41
+ name: string;
42
+ company_hint: string | null;
43
+ contact_input: CreateContactInput;
44
+ }
45
+ /**
46
+ * Fetch messages matching `query` from Gmail and extract unique contacts.
47
+ * Uses connect-gmail's stored tokens for auth — no API keys needed in code.
48
+ * Does NOT write to the database — returns prepared CreateContactInput objects.
49
+ */
50
+ export declare function extractContactsFromGmail(opts: GmailImportOptions): Promise<ExtractedContact[]>;
51
+ //# sourceMappingURL=gmail-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-import.d.ts","sourceRoot":"","sources":["../../src/lib/gmail-import.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAK5D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBzF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAO1F;AAID,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,kBAAkB,CAAC;CACnC;AAQD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsF7B"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Google Contacts sync — bidirectional sync between local DB and Google Contacts
3
+ * via the connect-googlecontacts connector.
4
+ *
5
+ * Auth: connect-googlecontacts auth login (run once per profile)
6
+ * Install: bun install -g @hasnaxyz/connect-googlecontacts
7
+ *
8
+ * Data format: Google People API
9
+ * https://developers.google.com/people/api/rest/v1/people
10
+ */
11
+ import type { ContactWithDetails, CreateContactInput } from "../types/index.js";
12
+ import { ConnectorRunOptions } from "./connector.js";
13
+ interface PeopleName {
14
+ displayName?: string;
15
+ givenName?: string;
16
+ familyName?: string;
17
+ middleName?: string;
18
+ }
19
+ interface PeopleEmail {
20
+ value?: string;
21
+ type?: string;
22
+ formattedType?: string;
23
+ }
24
+ interface PeoplePhone {
25
+ value?: string;
26
+ type?: string;
27
+ formattedType?: string;
28
+ }
29
+ interface PeopleOrg {
30
+ name?: string;
31
+ title?: string;
32
+ department?: string;
33
+ }
34
+ interface PeopleAddress {
35
+ streetAddress?: string;
36
+ city?: string;
37
+ region?: string;
38
+ postalCode?: string;
39
+ country?: string;
40
+ type?: string;
41
+ }
42
+ interface PeopleBio {
43
+ value?: string;
44
+ }
45
+ interface PeopleUrl {
46
+ value?: string;
47
+ type?: string;
48
+ }
49
+ export interface GooglePerson {
50
+ resourceName: string;
51
+ etag?: string;
52
+ names?: PeopleName[];
53
+ emailAddresses?: PeopleEmail[];
54
+ phoneNumbers?: PeoplePhone[];
55
+ organizations?: PeopleOrg[];
56
+ addresses?: PeopleAddress[];
57
+ biographies?: PeopleBio[];
58
+ urls?: PeopleUrl[];
59
+ birthdays?: Array<{
60
+ date?: {
61
+ year?: number;
62
+ month?: number;
63
+ day?: number;
64
+ };
65
+ }>;
66
+ }
67
+ export interface GoogleContactsSyncOptions extends ConnectorRunOptions {
68
+ /** Max contacts to pull per page (connector handles pagination automatically) */
69
+ page_size?: number;
70
+ /** Only import contacts matching this query */
71
+ query?: string;
72
+ }
73
+ export interface GoogleContactsPushOptions extends ConnectorRunOptions {
74
+ /** If true, update existing Google contact if resourceName is stored in custom_fields */
75
+ update_existing?: boolean;
76
+ }
77
+ export interface SyncResult {
78
+ imported: number;
79
+ updated: number;
80
+ skipped: number;
81
+ errors: string[];
82
+ }
83
+ /**
84
+ * Convert a Google People API person to a CreateContactInput.
85
+ */
86
+ export declare function googlePersonToContactInput(person: GooglePerson): CreateContactInput;
87
+ /**
88
+ * Convert a local ContactWithDetails to Google People API create/update args.
89
+ * Returns the CLI flags for `connect-googlecontacts contacts create`.
90
+ */
91
+ export declare function contactToGoogleArgs(contact: ContactWithDetails): string[];
92
+ /**
93
+ * List all contacts from Google Contacts.
94
+ */
95
+ export declare function listGoogleContacts(opts?: GoogleContactsSyncOptions): Promise<GooglePerson[]>;
96
+ /**
97
+ * Search contacts in Google Contacts.
98
+ */
99
+ export declare function searchGoogleContacts(query: string, opts?: ConnectorRunOptions): Promise<GooglePerson[]>;
100
+ /**
101
+ * Create a new contact in Google Contacts from a local contact.
102
+ * Returns the Google resource name (e.g. "people/c12345").
103
+ */
104
+ export declare function pushContactToGoogle(contact: ContactWithDetails, opts?: GoogleContactsPushOptions): Promise<{
105
+ resourceName: string;
106
+ action: "created" | "updated";
107
+ }>;
108
+ /**
109
+ * Sync all Google Contacts into the local database.
110
+ * Caller is responsible for the actual upsert (pass a db upsert function).
111
+ * Returns structured CreateContactInput objects ready for upsert.
112
+ */
113
+ export declare function pullGoogleContactsAsInputs(opts?: GoogleContactsSyncOptions): Promise<CreateContactInput[]>;
114
+ export {};
115
+ //# sourceMappingURL=google-contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-contacts.d.ts","sourceRoot":"","sources":["../../src/lib/google-contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export declare function getImagesDir(): string;
2
+ /**
3
+ * Save an image for a contact or company.
4
+ * Accepts a file path (copies it) or base64 data (writes it).
5
+ * Returns the stored filename (e.g. "abc123.jpg")
6
+ */
7
+ export declare function saveImage(entityId: string, source: string, options?: {
8
+ format?: string;
9
+ }): string;
10
+ /**
11
+ * Get the image path for an entity. Returns null if no image exists.
12
+ */
13
+ export declare function getImagePath(entityId: string): string | null;
14
+ /**
15
+ * Get image as base64 data URI for embedding in responses.
16
+ */
17
+ export declare function getImageAsBase64(entityId: string): string | null;
18
+ /**
19
+ * Delete an entity's image.
20
+ */
21
+ export declare function deleteImage(entityId: string): boolean;
22
+ /**
23
+ * List all stored images.
24
+ */
25
+ export declare function listImages(): Array<{
26
+ entity_id: string;
27
+ filename: string;
28
+ path: string;
29
+ }>;
30
+ //# sourceMappingURL=images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/lib/images.ts"],"names":[],"mappings":"AAcA,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,MAAM,CAuCR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWrD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAQzF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Import contacts from CSV, vCard (.vcf), or JSON formats.
3
+ * Returns an array of CreateContactInput objects (matching src/types/index.ts).
4
+ */
5
+ import type { CreateContactInput } from "../types/index.js";
6
+ export type { CreateContactInput };
7
+ export declare function importFromCsv(data: string): CreateContactInput[];
8
+ export declare function parseLinkedIn(csv: string): CreateContactInput[];
9
+ export declare function importContacts(format: "json" | "csv" | "vcf", data: string): Promise<CreateContactInput[]>;
10
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/lib/import.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,kBAAkB,EASnB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAgHnC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAGhE;AAuND,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAkD/D;AAUD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,EAC9B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAa/B"}