@hasna/contacts 0.1.0 → 0.2.1

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 (38) hide show
  1. package/dashboard/dist/assets/index-0l6aQb1t.css +1 -0
  2. package/dashboard/dist/assets/index-opnZdkVD.js +229 -0
  3. package/dashboard/dist/index.html +2 -2
  4. package/dist/cli/index.js +531 -17
  5. package/dist/db/companies.d.ts.map +1 -1
  6. package/dist/db/companies.test.d.ts +2 -0
  7. package/dist/db/companies.test.d.ts.map +1 -0
  8. package/dist/db/contacts.d.ts +1 -0
  9. package/dist/db/contacts.d.ts.map +1 -1
  10. package/dist/db/contacts.test.d.ts +2 -0
  11. package/dist/db/contacts.test.d.ts.map +1 -0
  12. package/dist/db/database.d.ts +1 -0
  13. package/dist/db/database.d.ts.map +1 -1
  14. package/dist/db/groups.d.ts +12 -0
  15. package/dist/db/groups.d.ts.map +1 -0
  16. package/dist/db/relationships.test.d.ts +2 -0
  17. package/dist/db/relationships.test.d.ts.map +1 -0
  18. package/dist/db/tags.d.ts.map +1 -1
  19. package/dist/db/tags.test.d.ts +2 -0
  20. package/dist/db/tags.test.d.ts.map +1 -0
  21. package/dist/index.d.ts +3 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +102 -5
  24. package/dist/lib/config.d.ts +7 -0
  25. package/dist/lib/config.d.ts.map +1 -0
  26. package/dist/lib/dedup.d.ts +10 -0
  27. package/dist/lib/dedup.d.ts.map +1 -0
  28. package/dist/lib/import.test.d.ts +2 -0
  29. package/dist/lib/import.test.d.ts.map +1 -0
  30. package/dist/mcp/index.js +567 -76
  31. package/dist/mcp/mcp.test.d.ts +2 -0
  32. package/dist/mcp/mcp.test.d.ts.map +1 -0
  33. package/dist/server/index.js +38 -3
  34. package/dist/types/index.d.ts +25 -0
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/dashboard/dist/assets/index-B4ndI7Qt.js +0 -49
  38. package/dashboard/dist/assets/index-C5bn2HWO.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"companies.d.ts","sourceRoot":"","sources":["../../src/db/companies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAGV,kBAAkB,EAElB,kBAAkB,EAClB,OAAO,EAGP,kBAAkB,EASlB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAoG3B,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAuC1F;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAKxE;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,kBAAuB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;IAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiC9H;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAyBtG;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAQ7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAUlF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAWhF"}
1
+ {"version":3,"file":"companies.d.ts","sourceRoot":"","sources":["../../src/db/companies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAGV,kBAAkB,EAElB,kBAAkB,EAClB,OAAO,EAGP,kBAAkB,EASlB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAoG3B,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAuC1F;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAKxE;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,kBAAuB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;IAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiC9H;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAyBtG;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAQ7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAUlF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAYhF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=companies.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companies.test.d.ts","sourceRoot":"","sources":["../../src/db/companies.test.ts"],"names":[],"mappings":""}
@@ -9,5 +9,6 @@ export declare function listContacts(opts?: ContactListOptions, db?: Database):
9
9
  export declare function updateContact(id: string, input: UpdateContactInput, db?: Database): ContactWithDetails;
10
10
  export declare function deleteContact(id: string, db?: Database): void;
11
11
  export declare function searchContacts(query: string, db?: Database): ContactWithDetails[];
12
+ export declare function listRecentContacts(limit: number, db?: Database): ContactWithDetails[];
12
13
  export declare function mergeContacts(keepId: string, mergeId: string, db?: Database): ContactWithDetails;
13
14
  //# sourceMappingURL=contacts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/db/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAKV,kBAAkB,EAElB,kBAAkB,EAElB,kBAAkB,EAalB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAsH3B,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CA8C1F;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAKxE;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,kBAAuB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;IAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAuC5H;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CA2BtG;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAS7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAsCjF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAqDhG"}
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/db/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAKV,kBAAkB,EAElB,kBAAkB,EAElB,kBAAkB,EAalB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAuH3B,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAiD1F;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAKxE;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,kBAAuB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;IAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAuC5H;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CA8BtG;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAS7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAsCjF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAMrF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CAqDhG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contacts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.test.d.ts","sourceRoot":"","sources":["../../src/db/contacts.test.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
1
  import { Database } from "bun:sqlite";
2
+ export declare function getDbPath(): string;
2
3
  export declare function getDatabase(path?: string): Database;
3
4
  export declare function resetDatabase(): void;
4
5
  export declare function uuid(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgLtC,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAUnD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AA4LD,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAUnD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B"}
@@ -0,0 +1,12 @@
1
+ import { Database } from "bun:sqlite";
2
+ import type { Group, CreateGroupInput } from "../types/index.js";
3
+ export declare function createGroup(db: Database, input: CreateGroupInput): Group;
4
+ export declare function getGroup(db: Database, id: string): Group | null;
5
+ export declare function listGroups(db: Database): Group[];
6
+ export declare function updateGroup(db: Database, id: string, input: Partial<CreateGroupInput>): Group;
7
+ export declare function deleteGroup(db: Database, id: string): void;
8
+ export declare function addContactToGroup(db: Database, contactId: string, groupId: string): void;
9
+ export declare function removeContactFromGroup(db: Database, contactId: string, groupId: string): void;
10
+ export declare function listContactsInGroup(db: Database, groupId: string): string[];
11
+ export declare function listGroupsForContact(db: Database, contactId: string): Group[];
12
+ //# sourceMappingURL=groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/db/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAKxE;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAE/D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,CAIhD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAS7F;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAExF;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7F;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAG3E;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE,CAI7E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=relationships.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.test.d.ts","sourceRoot":"","sources":["../../src/db/relationships.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/db/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EACV,OAAO,EAEP,cAAc,EACd,GAAG,EAEH,cAAc,EACf,MAAM,mBAAmB,CAAC;AAY3B,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CAYnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CAKrD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,GAAG,IAAI,CAIpE;AAED,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,EAAE,CAG7C;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CAuB/E;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAKzD;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAOrF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAG1F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAiBzE;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAOrF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAG1F"}
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/db/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EACV,OAAO,EAEP,cAAc,EACd,GAAG,EAEH,cAAc,EACf,MAAM,mBAAmB,CAAC;AAY3B,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CAYnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CAKrD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,GAAG,IAAI,CAIpE;AAED,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,EAAE,CAG7C;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CAuB/E;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAKzD;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAOrF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAG1F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAkBzE;AAID,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAOrF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAG1F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tags.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.test.d.ts","sourceRoot":"","sources":["../../src/db/tags.test.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export { getDatabase, resetDatabase } from "./db/database.js";
2
- export { createContact, getContact, listContacts, updateContact, deleteContact, searchContacts, mergeContacts, } from "./db/contacts.js";
2
+ export { createContact, getContact, listContacts, updateContact, deleteContact, searchContacts, mergeContacts, listRecentContacts, } from "./db/contacts.js";
3
3
  export { createCompany, getCompany, listCompanies, updateCompany, deleteCompany, searchCompanies, listCompanyEmployees, } from "./db/companies.js";
4
4
  export { createTag, getTag, getTagByName, listTags, updateTag, deleteTag, addTagToContact, removeTagFromContact, listContactsByTag, addTagToCompany, removeTagFromCompany, } from "./db/tags.js";
5
5
  export { createRelationship, listRelationships, getRelationship, deleteRelationship, } from "./db/relationships.js";
6
+ export { createGroup, getGroup, listGroups, updateGroup, deleteGroup, addContactToGroup, removeContactFromGroup, listContactsInGroup, listGroupsForContact, } from "./db/groups.js";
6
7
  export { logActivity, listActivity, getActivity } from "./db/activity.js";
7
- export type { EmailType, PhoneType, AddressType, SocialPlatform, RelationshipType, ContactSource, Email, Phone, Address, SocialProfile, Tag, Contact, ContactWithDetails, Company, CompanyWithDetails, ContactRelationship, ActivityLog, Webhook, CreateEmailInput, CreatePhoneInput, CreateAddressInput, CreateSocialProfileInput, CreateTagInput, UpdateTagInput, CreateContactInput, UpdateContactInput, ContactListOptions, CreateCompanyInput, UpdateCompanyInput, CompanyListOptions, CreateRelationshipInput, CreateActivityInput, CreateWebhookInput, UpdateWebhookInput, ContactRow, CompanyRow, EmailRow, PhoneRow, AddressRow, SocialProfileRow, TagRow, RelationshipRow, ActivityRow, WebhookRow, } from "./types/index.js";
8
+ export type { EmailType, PhoneType, AddressType, SocialPlatform, RelationshipType, ContactSource, PreferredContactMethod, Email, Phone, Address, SocialProfile, Tag, Contact, ContactWithDetails, Company, CompanyWithDetails, ContactRelationship, ActivityLog, Webhook, Group, CreateGroupInput, CreateEmailInput, CreatePhoneInput, CreateAddressInput, CreateSocialProfileInput, CreateTagInput, UpdateTagInput, CreateContactInput, UpdateContactInput, ContactListOptions, CreateCompanyInput, UpdateCompanyInput, CompanyListOptions, CreateRelationshipInput, CreateActivityInput, CreateWebhookInput, UpdateWebhookInput, ContactRow, CompanyRow, EmailRow, PhoneRow, AddressRow, SocialProfileRow, TagRow, RelationshipRow, ActivityRow, WebhookRow, } from "./types/index.js";
8
9
  export { ContactNotFoundError, CompanyNotFoundError, TagNotFoundError, DuplicateTagNameError, } from "./types/index.js";
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,SAAS,EACT,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG1E,YAAY,EAEV,SAAS,EACT,SAAS,EACT,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EAEb,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EAEb,GAAG,EACH,OAAO,EACP,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,OAAO,EAEP,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAElB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,eAAe,EACf,WAAW,EACX,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,SAAS,EACT,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG1E,YAAY,EAEV,SAAS,EACT,SAAS,EACT,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EAEtB,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EAEb,GAAG,EACH,OAAO,EACP,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,OAAO,EACP,KAAK,EACL,gBAAgB,EAEhB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAElB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,eAAe,EACf,WAAW,EACX,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -171,6 +171,25 @@ var MIGRATIONS = [
171
171
  END;
172
172
 
173
173
  CREATE TABLE IF NOT EXISTS _migrations (version INTEGER PRIMARY KEY);
174
+ `,
175
+ `
176
+ ALTER TABLE contacts ADD COLUMN last_contacted_at TEXT;
177
+ ALTER TABLE contacts ADD COLUMN website TEXT;
178
+ ALTER TABLE contacts ADD COLUMN preferred_contact_method TEXT;
179
+
180
+ CREATE TABLE IF NOT EXISTS groups (
181
+ id TEXT PRIMARY KEY,
182
+ name TEXT NOT NULL UNIQUE,
183
+ description TEXT,
184
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
185
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
186
+ );
187
+
188
+ CREATE TABLE IF NOT EXISTS contact_groups (
189
+ contact_id TEXT NOT NULL REFERENCES contacts(id) ON DELETE CASCADE,
190
+ group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
191
+ PRIMARY KEY (contact_id, group_id)
192
+ );
174
193
  `
175
194
  ];
176
195
  var _db = null;
@@ -281,7 +300,8 @@ function rowToContact(row) {
281
300
  return {
282
301
  ...row,
283
302
  source: row.source,
284
- custom_fields: JSON.parse(row.custom_fields || "{}")
303
+ custom_fields: JSON.parse(row.custom_fields || "{}"),
304
+ preferred_contact_method: row.preferred_contact_method ?? null
285
305
  };
286
306
  }
287
307
  function rowToEmail(row) {
@@ -362,8 +382,8 @@ function createContact(input, db) {
362
382
  const firstName = input.first_name ?? "";
363
383
  const lastName = input.last_name ?? "";
364
384
  const displayName = input.display_name ?? (firstName || lastName ? `${firstName} ${lastName}`.trim() : "Unnamed Contact");
365
- d.run(`INSERT INTO contacts (id, first_name, last_name, display_name, nickname, avatar_url, notes, birthday, company_id, job_title, source, custom_fields, created_at, updated_at)
366
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
385
+ d.run(`INSERT INTO contacts (id, first_name, last_name, display_name, nickname, avatar_url, notes, birthday, company_id, job_title, source, custom_fields, last_contacted_at, website, preferred_contact_method, created_at, updated_at)
386
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
367
387
  id,
368
388
  firstName,
369
389
  lastName,
@@ -376,6 +396,9 @@ function createContact(input, db) {
376
396
  input.job_title ?? null,
377
397
  input.source ?? "manual",
378
398
  JSON.stringify(input.custom_fields ?? {}),
399
+ input.last_contacted_at ?? null,
400
+ input.website ?? null,
401
+ input.preferred_contact_method ?? null,
379
402
  timestamp,
380
403
  timestamp
381
404
  ]);
@@ -487,6 +510,18 @@ function updateContact(id, input, db) {
487
510
  setClauses.push("custom_fields = ?");
488
511
  params.push(JSON.stringify(input.custom_fields));
489
512
  }
513
+ if (input.last_contacted_at !== undefined) {
514
+ setClauses.push("last_contacted_at = ?");
515
+ params.push(input.last_contacted_at);
516
+ }
517
+ if (input.website !== undefined) {
518
+ setClauses.push("website = ?");
519
+ params.push(input.website);
520
+ }
521
+ if (input.preferred_contact_method !== undefined) {
522
+ setClauses.push("preferred_contact_method = ?");
523
+ params.push(input.preferred_contact_method);
524
+ }
490
525
  params.push(id);
491
526
  d.run(`UPDATE contacts SET ${setClauses.join(", ")} WHERE id = ?`, params);
492
527
  logActivity(d, { contact_id: id, action: "contact.updated", details: `Updated contact: ${existing.display_name}` });
@@ -532,6 +567,11 @@ function searchContacts(query, db) {
532
567
  }
533
568
  return allRows.map((row) => loadContactDetails(d, rowToContact(row)));
534
569
  }
570
+ function listRecentContacts(limit, db) {
571
+ const d = db || getDatabase();
572
+ const rows = d.query(`SELECT * FROM contacts ORDER BY updated_at DESC LIMIT ?`).all(limit);
573
+ return rows.map((row) => loadContactDetails(d, rowToContact(row)));
574
+ }
535
575
  function mergeContacts(keepId, mergeId, db) {
536
576
  const d = db || getDatabase();
537
577
  const keepRow = d.query(`SELECT * FROM contacts WHERE id = ?`).get(keepId);
@@ -798,7 +838,8 @@ function listCompanyEmployees(companyId, db) {
798
838
  return rows.map((r) => ({
799
839
  ...r,
800
840
  source: r.source,
801
- custom_fields: JSON.parse(r.custom_fields || "{}")
841
+ custom_fields: JSON.parse(r.custom_fields || "{}"),
842
+ preferred_contact_method: r.preferred_contact_method ?? null
802
843
  }));
803
844
  }
804
845
  // src/db/tags.ts
@@ -895,7 +936,8 @@ function listContactsByTag(tagId, db) {
895
936
  return rows.map((r) => ({
896
937
  ...r,
897
938
  source: r.source,
898
- custom_fields: JSON.parse(r.custom_fields || "{}")
939
+ custom_fields: JSON.parse(r.custom_fields || "{}"),
940
+ preferred_contact_method: r.preferred_contact_method ?? null
899
941
  }));
900
942
  }
901
943
  function addTagToCompany(companyId, tagId, db) {
@@ -957,8 +999,54 @@ function deleteRelationship(id, db) {
957
999
  const d = db || getDatabase();
958
1000
  d.run(`DELETE FROM contact_relationships WHERE id = ?`, [id]);
959
1001
  }
1002
+ // src/db/groups.ts
1003
+ function createGroup(db, input) {
1004
+ const id = uuid();
1005
+ db.query(`INSERT INTO groups(id, name, description, created_at, updated_at) VALUES(?,?,?,?,?)`).run(id, input.name, input.description ?? null, now(), now());
1006
+ return getGroup(db, id);
1007
+ }
1008
+ function getGroup(db, id) {
1009
+ return db.query(`SELECT * FROM groups WHERE id = ?`).get(id);
1010
+ }
1011
+ function listGroups(db) {
1012
+ return db.query(`SELECT g.*, COUNT(cg.contact_id) as member_count FROM groups g LEFT JOIN contact_groups cg ON g.id = cg.group_id GROUP BY g.id ORDER BY g.name`).all();
1013
+ }
1014
+ function updateGroup(db, id, input) {
1015
+ const fields = [];
1016
+ const vals = [];
1017
+ if (input.name !== undefined) {
1018
+ fields.push("name = ?");
1019
+ vals.push(input.name);
1020
+ }
1021
+ if (input.description !== undefined) {
1022
+ fields.push("description = ?");
1023
+ vals.push(input.description ?? null);
1024
+ }
1025
+ fields.push("updated_at = ?");
1026
+ vals.push(now());
1027
+ vals.push(id);
1028
+ db.query(`UPDATE groups SET ${fields.join(", ")} WHERE id = ?`).run(...vals);
1029
+ return getGroup(db, id);
1030
+ }
1031
+ function deleteGroup(db, id) {
1032
+ db.query(`DELETE FROM groups WHERE id = ?`).run(id);
1033
+ }
1034
+ function addContactToGroup(db, contactId, groupId) {
1035
+ db.query(`INSERT OR IGNORE INTO contact_groups(contact_id, group_id) VALUES(?,?)`).run(contactId, groupId);
1036
+ }
1037
+ function removeContactFromGroup(db, contactId, groupId) {
1038
+ db.query(`DELETE FROM contact_groups WHERE contact_id = ? AND group_id = ?`).run(contactId, groupId);
1039
+ }
1040
+ function listContactsInGroup(db, groupId) {
1041
+ const rows = db.query(`SELECT contact_id FROM contact_groups WHERE group_id = ?`).all(groupId);
1042
+ return rows.map((r) => r.contact_id);
1043
+ }
1044
+ function listGroupsForContact(db, contactId) {
1045
+ return db.query(`SELECT g.* FROM groups g JOIN contact_groups cg ON g.id = cg.group_id WHERE cg.contact_id = ? ORDER BY g.name`).all(contactId);
1046
+ }
960
1047
  export {
961
1048
  updateTag,
1049
+ updateGroup,
962
1050
  updateContact,
963
1051
  updateCompany,
964
1052
  searchContacts,
@@ -966,10 +1054,15 @@ export {
966
1054
  resetDatabase,
967
1055
  removeTagFromContact,
968
1056
  removeTagFromCompany,
1057
+ removeContactFromGroup,
969
1058
  mergeContacts,
970
1059
  logActivity,
971
1060
  listTags,
972
1061
  listRelationships,
1062
+ listRecentContacts,
1063
+ listGroupsForContact,
1064
+ listGroups,
1065
+ listContactsInGroup,
973
1066
  listContactsByTag,
974
1067
  listContacts,
975
1068
  listCompanyEmployees,
@@ -978,20 +1071,24 @@ export {
978
1071
  getTagByName,
979
1072
  getTag,
980
1073
  getRelationship,
1074
+ getGroup,
981
1075
  getDatabase,
982
1076
  getContact,
983
1077
  getCompany,
984
1078
  getActivity,
985
1079
  deleteTag,
986
1080
  deleteRelationship,
1081
+ deleteGroup,
987
1082
  deleteContact,
988
1083
  deleteCompany,
989
1084
  createTag,
990
1085
  createRelationship,
1086
+ createGroup,
991
1087
  createContact,
992
1088
  createCompany,
993
1089
  addTagToContact,
994
1090
  addTagToCompany,
1091
+ addContactToGroup,
995
1092
  TagNotFoundError,
996
1093
  DuplicateTagNameError,
997
1094
  ContactNotFoundError,
@@ -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":"AAMA,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,10 @@
1
+ import type { Database } from "bun:sqlite";
2
+ export declare function findEmailDuplicates(db: Database): Array<{
3
+ email: string;
4
+ contact_ids: string[];
5
+ }>;
6
+ export declare function findNameDuplicates(db: Database): 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,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CASjG;AAeD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC;IAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAY7G"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=import.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.test.d.ts","sourceRoot":"","sources":["../../src/lib/import.test.ts"],"names":[],"mappings":""}