@miguelarios/pim-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @miguelarios/pim-core
2
+
3
+ Shared config, validation, errors, and utilities for PIM agent MCP servers.
4
+
5
+ This is an internal library used by [@miguelarios/email-mcp](https://www.npmjs.com/package/@miguelarios/email-mcp), [@miguelarios/cal-mcp](https://www.npmjs.com/package/@miguelarios/cal-mcp), and [@miguelarios/card-mcp](https://www.npmjs.com/package/@miguelarios/card-mcp). You probably don't need to install this directly.
6
+
7
+ ## License
8
+
9
+ MIT
@@ -0,0 +1,35 @@
1
+ export interface CardDavConfig {
2
+ url: string;
3
+ username: string;
4
+ password: string;
5
+ }
6
+ export declare function loadCardDavConfig(): CardDavConfig;
7
+ export interface CalDavAccount {
8
+ id: string;
9
+ url: string;
10
+ username: string;
11
+ password: string;
12
+ }
13
+ export interface CalDavConfig {
14
+ accounts: CalDavAccount[];
15
+ }
16
+ export declare function loadCalDavConfig(): CalDavConfig;
17
+ export interface EmailConfig {
18
+ imap: {
19
+ host: string;
20
+ port: number;
21
+ user: string;
22
+ pass: string;
23
+ secure: boolean;
24
+ };
25
+ smtp: {
26
+ host: string;
27
+ port: number;
28
+ user: string;
29
+ pass: string;
30
+ secure: boolean;
31
+ };
32
+ fromName?: string;
33
+ }
34
+ export declare function loadEmailConfig(): EmailConfig;
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAiBD,wBAAgB,iBAAiB,IAAI,aAAa,CAwBjD;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAcD,wBAAgB,gBAAgB,IAAI,YAAY,CA0B/C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAWD,wBAAgB,eAAe,IAAI,WAAW,CA0C7C"}
package/dist/config.js ADDED
@@ -0,0 +1,117 @@
1
+ import * as v from "valibot";
2
+ import { ConfigurationError } from "./errors.js";
3
+ const CardDavEnvSchema = v.object({
4
+ CARDDAV_URL: v.pipe(v.string("CARDDAV_URL is required"), v.url("CARDDAV_URL must be a valid URL")),
5
+ CARDDAV_USER: v.pipe(v.string("CARDDAV_USER is required"), v.minLength(1, "CARDDAV_USER cannot be empty")),
6
+ CARDDAV_PASS: v.pipe(v.string("CARDDAV_PASS is required"), v.minLength(1, "CARDDAV_PASS cannot be empty")),
7
+ });
8
+ export function loadCardDavConfig() {
9
+ const env = {
10
+ CARDDAV_URL: process.env.CARDDAV_URL,
11
+ CARDDAV_USER: process.env.CARDDAV_USER,
12
+ CARDDAV_PASS: process.env.CARDDAV_PASS,
13
+ };
14
+ try {
15
+ const validated = v.parse(CardDavEnvSchema, env);
16
+ return {
17
+ url: validated.CARDDAV_URL,
18
+ username: validated.CARDDAV_USER,
19
+ password: validated.CARDDAV_PASS,
20
+ };
21
+ }
22
+ catch (error) {
23
+ if (v.isValiError(error)) {
24
+ const messages = error.issues.map((issue) => {
25
+ const path = issue.path?.map((p) => p.key).join(".") ?? "unknown";
26
+ return `${path}: ${issue.message}`;
27
+ });
28
+ throw new ConfigurationError(`Config validation failed: ${messages.join("; ")}`);
29
+ }
30
+ throw error;
31
+ }
32
+ }
33
+ const CalDavAccountSchema = v.object({
34
+ id: v.pipe(v.string(), v.minLength(1, "Account id cannot be empty")),
35
+ url: v.pipe(v.string(), v.url("Account url must be a valid URL")),
36
+ username: v.pipe(v.string(), v.minLength(1, "Account username cannot be empty")),
37
+ password: v.pipe(v.string(), v.minLength(1, "Account password cannot be empty")),
38
+ });
39
+ const CalDavAccountsSchema = v.pipe(v.array(CalDavAccountSchema), v.minLength(1, "At least one CalDAV account is required"));
40
+ export function loadCalDavConfig() {
41
+ const raw = process.env.CALDAV_ACCOUNTS;
42
+ if (!raw) {
43
+ throw new ConfigurationError("CALDAV_ACCOUNTS environment variable is required");
44
+ }
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(raw);
48
+ }
49
+ catch {
50
+ throw new ConfigurationError("CALDAV_ACCOUNTS must be valid JSON");
51
+ }
52
+ try {
53
+ const accounts = v.parse(CalDavAccountsSchema, parsed);
54
+ return { accounts };
55
+ }
56
+ catch (error) {
57
+ if (v.isValiError(error)) {
58
+ const messages = error.issues.map((issue) => {
59
+ const path = issue.path?.map((p) => p.key).join(".") ?? "unknown";
60
+ return `${path}: ${issue.message}`;
61
+ });
62
+ throw new ConfigurationError(`Config validation failed: ${messages.join("; ")}`);
63
+ }
64
+ throw error;
65
+ }
66
+ }
67
+ const EmailEnvSchema = v.object({
68
+ IMAP_HOST: v.pipe(v.string("IMAP_HOST is required"), v.minLength(1, "IMAP_HOST cannot be empty")),
69
+ IMAP_USER: v.pipe(v.string("IMAP_USER is required"), v.minLength(1, "IMAP_USER cannot be empty")),
70
+ IMAP_PASS: v.pipe(v.string("IMAP_PASS is required"), v.minLength(1, "IMAP_PASS cannot be empty")),
71
+ SMTP_HOST: v.pipe(v.string("SMTP_HOST is required"), v.minLength(1, "SMTP_HOST cannot be empty")),
72
+ SMTP_USER: v.pipe(v.string("SMTP_USER is required"), v.minLength(1, "SMTP_USER cannot be empty")),
73
+ SMTP_PASS: v.pipe(v.string("SMTP_PASS is required"), v.minLength(1, "SMTP_PASS cannot be empty")),
74
+ });
75
+ export function loadEmailConfig() {
76
+ const env = {
77
+ IMAP_HOST: process.env.IMAP_HOST,
78
+ IMAP_USER: process.env.IMAP_USER,
79
+ IMAP_PASS: process.env.IMAP_PASS,
80
+ SMTP_HOST: process.env.SMTP_HOST,
81
+ SMTP_USER: process.env.SMTP_USER,
82
+ SMTP_PASS: process.env.SMTP_PASS,
83
+ };
84
+ try {
85
+ const validated = v.parse(EmailEnvSchema, env);
86
+ const imapPort = Number.parseInt(process.env.IMAP_PORT || "993", 10);
87
+ const smtpPort = Number.parseInt(process.env.SMTP_PORT || "465", 10);
88
+ return {
89
+ imap: {
90
+ host: validated.IMAP_HOST,
91
+ port: Number.isNaN(imapPort) ? 993 : imapPort,
92
+ user: validated.IMAP_USER,
93
+ pass: validated.IMAP_PASS,
94
+ secure: process.env.IMAP_SECURE !== "false",
95
+ },
96
+ smtp: {
97
+ host: validated.SMTP_HOST,
98
+ port: Number.isNaN(smtpPort) ? 465 : smtpPort,
99
+ user: validated.SMTP_USER,
100
+ pass: validated.SMTP_PASS,
101
+ secure: process.env.SMTP_SECURE !== "false",
102
+ },
103
+ fromName: process.env.SMTP_FROM_NAME || undefined,
104
+ };
105
+ }
106
+ catch (error) {
107
+ if (v.isValiError(error)) {
108
+ const messages = error.issues.map((issue) => {
109
+ const path = issue.path?.map((p) => p.key).join(".") ?? "unknown";
110
+ return `${path}: ${issue.message}`;
111
+ });
112
+ throw new ConfigurationError(`Config validation failed: ${messages.join("; ")}`);
113
+ }
114
+ throw error;
115
+ }
116
+ }
117
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export declare enum ErrorCode {
2
+ CONNECTION_FAILED = "CONNECTION_FAILED",
3
+ CONNECTION_TIMEOUT = "CONNECTION_TIMEOUT",
4
+ CONNECTION_REFUSED = "CONNECTION_REFUSED",
5
+ AUTH_FAILED = "AUTH_FAILED",
6
+ AUTH_INVALID_CREDENTIALS = "AUTH_INVALID_CREDENTIALS",
7
+ VALIDATION_FAILED = "VALIDATION_FAILED",
8
+ INVALID_INPUT = "INVALID_INPUT",
9
+ CONFIG_INVALID = "CONFIG_INVALID",
10
+ CONFIG_MISSING = "CONFIG_MISSING",
11
+ CONTACT_NOT_FOUND = "CONTACT_NOT_FOUND",
12
+ ADDRESSBOOK_NOT_FOUND = "ADDRESSBOOK_NOT_FOUND",
13
+ CONTACT_CONFLICT = "CONTACT_CONFLICT",
14
+ EMAIL_NOT_FOUND = "EMAIL_NOT_FOUND",
15
+ FOLDER_NOT_FOUND = "FOLDER_NOT_FOUND",
16
+ SEND_FAILED = "SEND_FAILED",
17
+ ATTACHMENT_NOT_FOUND = "ATTACHMENT_NOT_FOUND",
18
+ CALENDAR_NOT_FOUND = "CALENDAR_NOT_FOUND",
19
+ EVENT_NOT_FOUND = "EVENT_NOT_FOUND",
20
+ INVALID_ICS = "INVALID_ICS",
21
+ INTERNAL_ERROR = "INTERNAL_ERROR",
22
+ OPERATION_FAILED = "OPERATION_FAILED"
23
+ }
24
+ export declare abstract class PimError extends Error {
25
+ readonly code: ErrorCode;
26
+ readonly isRetryable: boolean;
27
+ readonly timestamp: Date;
28
+ constructor(message: string, code: ErrorCode, isRetryable?: boolean);
29
+ toJSON(): {
30
+ name: string;
31
+ message: string;
32
+ code: ErrorCode;
33
+ isRetryable: boolean;
34
+ timestamp: Date;
35
+ };
36
+ }
37
+ export declare class ConnectionError extends PimError {
38
+ constructor(message: string, code?: ErrorCode);
39
+ }
40
+ export declare class AuthenticationError extends PimError {
41
+ constructor(message: string, code?: ErrorCode);
42
+ }
43
+ export declare class ValidationError extends PimError {
44
+ readonly field?: string;
45
+ constructor(message: string, field?: string);
46
+ }
47
+ export declare class ConfigurationError extends PimError {
48
+ readonly configKey?: string;
49
+ constructor(message: string, configKey?: string);
50
+ }
51
+ export declare class ContactError extends PimError {
52
+ readonly contactId?: string;
53
+ constructor(message: string, code: ErrorCode, contactId?: string);
54
+ }
55
+ export declare class EmailError extends PimError {
56
+ readonly emailUid?: number;
57
+ constructor(message: string, code: ErrorCode, emailUid?: number);
58
+ }
59
+ export declare class CalendarError extends PimError {
60
+ readonly eventUid?: string;
61
+ constructor(message: string, code: ErrorCode, eventUid?: string);
62
+ }
63
+ export declare function isRetryableError(error: Error): boolean;
64
+ export declare function toPimError(error: Error): PimError;
65
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACnB,iBAAiB,sBAAsB;IACvC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;IACzC,WAAW,gBAAgB;IAC3B,wBAAwB,6BAA6B;IACrD,iBAAiB,sBAAsB;IACvC,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,qBAAqB,0BAA0B;IAC/C,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,WAAW,gBAAgB;IAC3B,oBAAoB,yBAAyB;IAC7C,kBAAkB,uBAAuB;IACzC,eAAe,oBAAoB;IACnC,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;CACtC;AAED,8BAAsB,QAAS,SAAQ,KAAK;IAC1C,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,SAAS,EAAE,IAAI,CAAC;gBAEpB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,UAAQ;IAWjE,MAAM;;;;;;;CASP;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,SAAuC;CAG3E;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,SAAiC;CAGrE;AAED,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;gBACnB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAI5C;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAIhD;AAED,qBAAa,YAAa,SAAQ,QAAQ;IACxC,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM;CAIjE;AAED,qBAAa,UAAW,SAAQ,QAAQ;IACtC,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACtB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM;CAIhE;AAED,qBAAa,aAAc,SAAQ,QAAQ;IACzC,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;gBACtB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM;CAIhE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAMtD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAwBjD"}
package/dist/errors.js ADDED
@@ -0,0 +1,125 @@
1
+ export var ErrorCode;
2
+ (function (ErrorCode) {
3
+ ErrorCode["CONNECTION_FAILED"] = "CONNECTION_FAILED";
4
+ ErrorCode["CONNECTION_TIMEOUT"] = "CONNECTION_TIMEOUT";
5
+ ErrorCode["CONNECTION_REFUSED"] = "CONNECTION_REFUSED";
6
+ ErrorCode["AUTH_FAILED"] = "AUTH_FAILED";
7
+ ErrorCode["AUTH_INVALID_CREDENTIALS"] = "AUTH_INVALID_CREDENTIALS";
8
+ ErrorCode["VALIDATION_FAILED"] = "VALIDATION_FAILED";
9
+ ErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
10
+ ErrorCode["CONFIG_INVALID"] = "CONFIG_INVALID";
11
+ ErrorCode["CONFIG_MISSING"] = "CONFIG_MISSING";
12
+ ErrorCode["CONTACT_NOT_FOUND"] = "CONTACT_NOT_FOUND";
13
+ ErrorCode["ADDRESSBOOK_NOT_FOUND"] = "ADDRESSBOOK_NOT_FOUND";
14
+ ErrorCode["CONTACT_CONFLICT"] = "CONTACT_CONFLICT";
15
+ ErrorCode["EMAIL_NOT_FOUND"] = "EMAIL_NOT_FOUND";
16
+ ErrorCode["FOLDER_NOT_FOUND"] = "FOLDER_NOT_FOUND";
17
+ ErrorCode["SEND_FAILED"] = "SEND_FAILED";
18
+ ErrorCode["ATTACHMENT_NOT_FOUND"] = "ATTACHMENT_NOT_FOUND";
19
+ ErrorCode["CALENDAR_NOT_FOUND"] = "CALENDAR_NOT_FOUND";
20
+ ErrorCode["EVENT_NOT_FOUND"] = "EVENT_NOT_FOUND";
21
+ ErrorCode["INVALID_ICS"] = "INVALID_ICS";
22
+ ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
23
+ ErrorCode["OPERATION_FAILED"] = "OPERATION_FAILED";
24
+ })(ErrorCode || (ErrorCode = {}));
25
+ export class PimError extends Error {
26
+ code;
27
+ isRetryable;
28
+ timestamp;
29
+ constructor(message, code, isRetryable = false) {
30
+ super(message);
31
+ this.name = this.constructor.name;
32
+ this.code = code;
33
+ this.isRetryable = isRetryable;
34
+ this.timestamp = new Date();
35
+ if (Error.captureStackTrace) {
36
+ Error.captureStackTrace(this, this.constructor);
37
+ }
38
+ }
39
+ toJSON() {
40
+ return {
41
+ name: this.name,
42
+ message: this.message,
43
+ code: this.code,
44
+ isRetryable: this.isRetryable,
45
+ timestamp: this.timestamp,
46
+ };
47
+ }
48
+ }
49
+ export class ConnectionError extends PimError {
50
+ constructor(message, code = ErrorCode.CONNECTION_FAILED) {
51
+ super(message, code, true);
52
+ }
53
+ }
54
+ export class AuthenticationError extends PimError {
55
+ constructor(message, code = ErrorCode.AUTH_FAILED) {
56
+ super(message, code, false);
57
+ }
58
+ }
59
+ export class ValidationError extends PimError {
60
+ field;
61
+ constructor(message, field) {
62
+ super(message, ErrorCode.VALIDATION_FAILED, false);
63
+ this.field = field;
64
+ }
65
+ }
66
+ export class ConfigurationError extends PimError {
67
+ configKey;
68
+ constructor(message, configKey) {
69
+ super(message, ErrorCode.CONFIG_INVALID, false);
70
+ this.configKey = configKey;
71
+ }
72
+ }
73
+ export class ContactError extends PimError {
74
+ contactId;
75
+ constructor(message, code, contactId) {
76
+ super(message, code, false);
77
+ this.contactId = contactId;
78
+ }
79
+ }
80
+ export class EmailError extends PimError {
81
+ emailUid;
82
+ constructor(message, code, emailUid) {
83
+ super(message, code, false);
84
+ this.emailUid = emailUid;
85
+ }
86
+ }
87
+ export class CalendarError extends PimError {
88
+ eventUid;
89
+ constructor(message, code, eventUid) {
90
+ super(message, code, false);
91
+ this.eventUid = eventUid;
92
+ }
93
+ }
94
+ export function isRetryableError(error) {
95
+ if (error instanceof PimError) {
96
+ return error.isRetryable;
97
+ }
98
+ const msg = error.message;
99
+ return msg.includes("ECONNRESET") || msg.includes("ENOTFOUND") || msg.includes("ETIMEDOUT");
100
+ }
101
+ export function toPimError(error) {
102
+ if (error instanceof PimError)
103
+ return error;
104
+ const msg = error.message.toLowerCase();
105
+ if (msg.includes("auth") || msg.includes("login") || msg.includes("credential")) {
106
+ return new AuthenticationError(error.message);
107
+ }
108
+ if (msg.includes("econnrefused") ||
109
+ msg.includes("econnreset") ||
110
+ msg.includes("enotfound") ||
111
+ msg.includes("connection")) {
112
+ return new ConnectionError(error.message);
113
+ }
114
+ if (msg.includes("timeout") || msg.includes("etimedout")) {
115
+ return new ConnectionError(error.message, ErrorCode.CONNECTION_TIMEOUT);
116
+ }
117
+ const wrapped = new (class InternalError extends PimError {
118
+ constructor() {
119
+ super(error.message, ErrorCode.INTERNAL_ERROR, false);
120
+ this.stack = error.stack;
121
+ }
122
+ })();
123
+ return wrapped;
124
+ }
125
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { type CalDavAccount, type CalDavConfig, loadCalDavConfig, type CardDavConfig, loadCardDavConfig, type EmailConfig, loadEmailConfig, } from "./config.js";
2
+ export { AuthenticationError, CalendarError, ConfigurationError, ConnectionError, ContactError, EmailError, ErrorCode, PimError, ValidationError, isRetryableError, toPimError, } from "./errors.js";
3
+ export { type Contact, buildVCard, parseVCard, } from "./vcard.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,gBAAgB,EAChB,KAAK,aAAa,EAClB,iBAAiB,EACjB,KAAK,WAAW,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,OAAO,EACZ,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { loadCalDavConfig, loadCardDavConfig, loadEmailConfig, } from "./config.js";
2
+ export { AuthenticationError, CalendarError, ConfigurationError, ConnectionError, ContactError, EmailError, ErrorCode, PimError, ValidationError, isRetryableError, toPimError, } from "./errors.js";
3
+ export { buildVCard, parseVCard, } from "./vcard.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,EAEhB,iBAAiB,EAEjB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface Contact {
2
+ uid: string;
3
+ fullName: string;
4
+ firstName?: string;
5
+ lastName?: string;
6
+ emails: string[];
7
+ phones: string[];
8
+ organization?: string;
9
+ title?: string;
10
+ note?: string;
11
+ }
12
+ export declare function parseVCard(data: string): Contact;
13
+ export declare function buildVCard(contact: Contact): string;
14
+ //# sourceMappingURL=vcard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcard.d.ts","sourceRoot":"","sources":["../src/vcard.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqBhD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA8BnD"}
package/dist/vcard.js ADDED
@@ -0,0 +1,82 @@
1
+ export function parseVCard(data) {
2
+ const lines = unfoldLines(data);
3
+ const uid = extractFirst(lines, "UID") ?? "";
4
+ const fullName = extractFirst(lines, "FN") ?? "";
5
+ const n = extractFirst(lines, "N");
6
+ const emails = extractAll(lines, "EMAIL");
7
+ const phones = extractAll(lines, "TEL");
8
+ const organization = extractFirst(lines, "ORG");
9
+ const title = extractFirst(lines, "TITLE");
10
+ const note = extractFirst(lines, "NOTE");
11
+ let firstName;
12
+ let lastName;
13
+ if (n) {
14
+ const parts = n.split(";");
15
+ lastName = parts[0] || undefined;
16
+ firstName = parts[1] || undefined;
17
+ }
18
+ return { uid, fullName, firstName, lastName, emails, phones, organization, title, note };
19
+ }
20
+ export function buildVCard(contact) {
21
+ const lines = [
22
+ "BEGIN:VCARD",
23
+ "VERSION:3.0",
24
+ `UID:${contact.uid}`,
25
+ `FN:${contact.fullName}`,
26
+ ];
27
+ if (contact.lastName || contact.firstName) {
28
+ lines.push(`N:${contact.lastName ?? ""};${contact.firstName ?? ""};;;`);
29
+ }
30
+ for (const email of contact.emails) {
31
+ lines.push(`EMAIL:${email}`);
32
+ }
33
+ for (const phone of contact.phones) {
34
+ lines.push(`TEL:${phone}`);
35
+ }
36
+ if (contact.organization) {
37
+ lines.push(`ORG:${contact.organization}`);
38
+ }
39
+ if (contact.title) {
40
+ lines.push(`TITLE:${contact.title}`);
41
+ }
42
+ if (contact.note) {
43
+ lines.push(`NOTE:${contact.note}`);
44
+ }
45
+ lines.push("END:VCARD");
46
+ return lines.join("\r\n");
47
+ }
48
+ /** Unfold continuation lines per RFC 6350 */
49
+ function unfoldLines(data) {
50
+ return data
51
+ .replace(/\r\n[ \t]/g, "")
52
+ .replace(/\n[ \t]/g, "")
53
+ .split(/\r?\n/);
54
+ }
55
+ /** Extract first matching property value (ignoring parameters like ;TYPE=HOME) */
56
+ function extractFirst(lines, property) {
57
+ for (const line of lines) {
58
+ const upper = line.toUpperCase();
59
+ if (upper.startsWith(`${property}:`) || upper.startsWith(`${property};`)) {
60
+ const colonIndex = line.indexOf(":");
61
+ if (colonIndex !== -1) {
62
+ return line.slice(colonIndex + 1).trim();
63
+ }
64
+ }
65
+ }
66
+ return undefined;
67
+ }
68
+ /** Extract all values for a property (e.g., multiple EMAIL lines) */
69
+ function extractAll(lines, property) {
70
+ const results = [];
71
+ for (const line of lines) {
72
+ const upper = line.toUpperCase();
73
+ if (upper.startsWith(`${property}:`) || upper.startsWith(`${property};`)) {
74
+ const colonIndex = line.indexOf(":");
75
+ if (colonIndex !== -1) {
76
+ results.push(line.slice(colonIndex + 1).trim());
77
+ }
78
+ }
79
+ }
80
+ return results;
81
+ }
82
+ //# sourceMappingURL=vcard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcard.js","sourceRoot":"","sources":["../src/vcard.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEzC,IAAI,SAA6B,CAAC;IAClC,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACjC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,KAAK,GAAa;QACtB,aAAa;QACb,aAAa;QACb,OAAO,OAAO,CAAC,GAAG,EAAE;QACpB,MAAM,OAAO,CAAC,QAAQ,EAAE;KACzB,CAAC;IAEF,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,QAAQ,IAAI,EAAE,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,6CAA6C;AAC7C,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,OAAO,CAAC,CAAC;AACpB,CAAC;AAED,kFAAkF;AAClF,SAAS,YAAY,CAAC,KAAe,EAAE,QAAgB;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qEAAqE;AACrE,SAAS,UAAU,CAAC,KAAe,EAAE,QAAgB;IACnD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@miguelarios/pim-core",
3
+ "version": "0.1.0",
4
+ "description": "Shared config, validation, errors, and utilities for PIM agent MCP servers",
5
+ "keywords": ["pim", "mcp", "config", "validation"],
6
+ "license": "MIT",
7
+ "author": "Miguel Rios",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/miguelarios/pim-agents.git",
11
+ "directory": "packages/core"
12
+ },
13
+ "homepage": "https://github.com/miguelarios/pim-agents",
14
+ "bugs": "https://github.com/miguelarios/pim-agents/issues",
15
+ "type": "module",
16
+ "main": "dist/index.js",
17
+ "types": "dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "import": "./dist/index.js",
21
+ "types": "./dist/index.d.ts"
22
+ }
23
+ },
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "typecheck": "tsc --noEmit",
27
+ "test": "vitest run"
28
+ },
29
+ "dependencies": {
30
+ "valibot": "^1.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "typescript": "^5.7.0",
34
+ "vitest": "^3.0.0"
35
+ }
36
+ }