@hasna/contacts 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/dist/assets/index-0l6aQb1t.css +1 -0
- package/dashboard/dist/assets/index-opnZdkVD.js +229 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/cli/index.js +530 -16
- package/dist/db/companies.d.ts.map +1 -1
- package/dist/db/companies.test.d.ts +2 -0
- package/dist/db/companies.test.d.ts.map +1 -0
- package/dist/db/contacts.d.ts +1 -0
- package/dist/db/contacts.d.ts.map +1 -1
- package/dist/db/contacts.test.d.ts +2 -0
- package/dist/db/contacts.test.d.ts.map +1 -0
- package/dist/db/database.d.ts +1 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/groups.d.ts +12 -0
- package/dist/db/groups.d.ts.map +1 -0
- package/dist/db/relationships.test.d.ts +2 -0
- package/dist/db/relationships.test.d.ts.map +1 -0
- package/dist/db/tags.d.ts.map +1 -1
- package/dist/db/tags.test.d.ts +2 -0
- package/dist/db/tags.test.d.ts.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -5
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/dedup.d.ts +10 -0
- package/dist/lib/dedup.d.ts.map +1 -0
- package/dist/lib/import.test.d.ts +2 -0
- package/dist/lib/import.test.d.ts.map +1 -0
- package/dist/mcp/index.js +567 -76
- package/dist/mcp/mcp.test.d.ts +2 -0
- package/dist/mcp/mcp.test.d.ts.map +1 -0
- package/dist/server/index.js +38 -3
- package/dist/types/index.d.ts +25 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/index-B4ndI7Qt.js +0 -49
- 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,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"companies.test.d.ts","sourceRoot":"","sources":["../../src/db/companies.test.ts"],"names":[],"mappings":""}
|
package/dist/db/contacts.d.ts
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.test.d.ts","sourceRoot":"","sources":["../../src/db/contacts.test.ts"],"names":[],"mappings":""}
|
package/dist/db/database.d.ts
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.test.d.ts","sourceRoot":"","sources":["../../src/db/relationships.test.ts"],"names":[],"mappings":""}
|
package/dist/db/tags.d.ts.map
CHANGED
|
@@ -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,
|
|
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 @@
|
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"import.test.d.ts","sourceRoot":"","sources":["../../src/lib/import.test.ts"],"names":[],"mappings":""}
|