@lztek/sarah-sells 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.
Files changed (88) hide show
  1. package/AGENTS.md +52 -0
  2. package/CONTEXT.md +42 -0
  3. package/dist/commands/ai.d.ts +3 -0
  4. package/dist/commands/ai.d.ts.map +1 -0
  5. package/dist/commands/ai.js +89 -0
  6. package/dist/commands/ai.js.map +1 -0
  7. package/dist/commands/auth.d.ts +3 -0
  8. package/dist/commands/auth.d.ts.map +1 -0
  9. package/dist/commands/auth.js +154 -0
  10. package/dist/commands/auth.js.map +1 -0
  11. package/dist/commands/campaigns.d.ts +3 -0
  12. package/dist/commands/campaigns.d.ts.map +1 -0
  13. package/dist/commands/campaigns.js +117 -0
  14. package/dist/commands/campaigns.js.map +1 -0
  15. package/dist/commands/inboxes.d.ts +3 -0
  16. package/dist/commands/inboxes.d.ts.map +1 -0
  17. package/dist/commands/inboxes.js +38 -0
  18. package/dist/commands/inboxes.js.map +1 -0
  19. package/dist/commands/leads.d.ts +3 -0
  20. package/dist/commands/leads.d.ts.map +1 -0
  21. package/dist/commands/leads.js +34 -0
  22. package/dist/commands/leads.js.map +1 -0
  23. package/dist/commands/mailgun.d.ts +3 -0
  24. package/dist/commands/mailgun.d.ts.map +1 -0
  25. package/dist/commands/mailgun.js +68 -0
  26. package/dist/commands/mailgun.js.map +1 -0
  27. package/dist/commands/mcp.d.ts +3 -0
  28. package/dist/commands/mcp.d.ts.map +1 -0
  29. package/dist/commands/mcp.js +12 -0
  30. package/dist/commands/mcp.js.map +1 -0
  31. package/dist/commands/org.d.ts +3 -0
  32. package/dist/commands/org.d.ts.map +1 -0
  33. package/dist/commands/org.js +81 -0
  34. package/dist/commands/org.js.map +1 -0
  35. package/dist/commands/prospects.d.ts +3 -0
  36. package/dist/commands/prospects.d.ts.map +1 -0
  37. package/dist/commands/prospects.js +129 -0
  38. package/dist/commands/prospects.js.map +1 -0
  39. package/dist/commands/schema.d.ts +4 -0
  40. package/dist/commands/schema.d.ts.map +1 -0
  41. package/dist/commands/schema.js +23 -0
  42. package/dist/commands/schema.js.map +1 -0
  43. package/dist/commands/templates.d.ts +3 -0
  44. package/dist/commands/templates.d.ts.map +1 -0
  45. package/dist/commands/templates.js +75 -0
  46. package/dist/commands/templates.js.map +1 -0
  47. package/dist/commands/zoominfo.d.ts +3 -0
  48. package/dist/commands/zoominfo.d.ts.map +1 -0
  49. package/dist/commands/zoominfo.js +41 -0
  50. package/dist/commands/zoominfo.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +37 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/lib/auth.d.ts +19 -0
  56. package/dist/lib/auth.d.ts.map +1 -0
  57. package/dist/lib/auth.js +151 -0
  58. package/dist/lib/auth.js.map +1 -0
  59. package/dist/lib/http-client.d.ts +21 -0
  60. package/dist/lib/http-client.d.ts.map +1 -0
  61. package/dist/lib/http-client.js +62 -0
  62. package/dist/lib/http-client.js.map +1 -0
  63. package/dist/lib/output.d.ts +7 -0
  64. package/dist/lib/output.d.ts.map +1 -0
  65. package/dist/lib/output.js +22 -0
  66. package/dist/lib/output.js.map +1 -0
  67. package/dist/lib/safety.d.ts +8 -0
  68. package/dist/lib/safety.d.ts.map +1 -0
  69. package/dist/lib/safety.js +64 -0
  70. package/dist/lib/safety.js.map +1 -0
  71. package/dist/lib/schema-registry.d.ts +42 -0
  72. package/dist/lib/schema-registry.d.ts.map +1 -0
  73. package/dist/lib/schema-registry.js +368 -0
  74. package/dist/lib/schema-registry.js.map +1 -0
  75. package/dist/mcp/server.d.ts +2 -0
  76. package/dist/mcp/server.d.ts.map +1 -0
  77. package/dist/mcp/server.js +317 -0
  78. package/dist/mcp/server.js.map +1 -0
  79. package/package.json +50 -0
  80. package/skills/sarah-ai-sdr/SKILL.md +38 -0
  81. package/skills/sarah-campaigns/SKILL.md +54 -0
  82. package/skills/sarah-inboxes/SKILL.md +28 -0
  83. package/skills/sarah-leads/SKILL.md +37 -0
  84. package/skills/sarah-mailgun/SKILL.md +36 -0
  85. package/skills/sarah-org/SKILL.md +41 -0
  86. package/skills/sarah-prospects/SKILL.md +46 -0
  87. package/skills/sarah-setup/SKILL.md +93 -0
  88. package/skills/sarah-zoominfo/SKILL.md +43 -0
@@ -0,0 +1,151 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ const ENV_ACCESS_TOKEN = 'SARAH_ACCESS_TOKEN';
5
+ const ENV_SERVICE_SECRET = 'SARAH_SERVICE_SECRET';
6
+ const ENV_API_URL = 'SARAH_API_URL';
7
+ const ENV_SUPABASE_URL = 'SARAH_SUPABASE_URL';
8
+ const ENV_SUPABASE_ANON_KEY = 'SARAH_SUPABASE_ANON_KEY';
9
+ const DEFAULT_API_URL = 'http://localhost:3010';
10
+ const DEFAULT_SUPABASE_URL = 'https://sjcgecmfcyplmtiqombq.supabase.co';
11
+ const DEFAULT_SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InNqY2dlY21mY3lwbG10aXFvbWJxIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTg3NTMyOTEsImV4cCI6MjA3NDMyOTI5MX0.OGJomPK5-74WTQteh7YX7yCClFUxvh66zRJWys8WyPY';
12
+ function getConfigDir() {
13
+ const dir = path.join(os.homedir(), '.config', 'sarah');
14
+ if (!fs.existsSync(dir)) {
15
+ fs.mkdirSync(dir, { recursive: true });
16
+ }
17
+ return dir;
18
+ }
19
+ function getSessionPath() {
20
+ return path.join(getConfigDir(), 'session.json');
21
+ }
22
+ function loadStoredSession() {
23
+ const sessionPath = getSessionPath();
24
+ if (!fs.existsSync(sessionPath))
25
+ return null;
26
+ try {
27
+ const data = JSON.parse(fs.readFileSync(sessionPath, 'utf-8'));
28
+ return data;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function saveSession(session) {
35
+ const sessionPath = getSessionPath();
36
+ fs.writeFileSync(sessionPath, JSON.stringify(session, null, 2), { mode: 0o600 });
37
+ }
38
+ export function clearSession() {
39
+ const sessionPath = getSessionPath();
40
+ if (fs.existsSync(sessionPath)) {
41
+ fs.unlinkSync(sessionPath);
42
+ }
43
+ }
44
+ function getSupabaseUrl() {
45
+ return process.env[ENV_SUPABASE_URL] || DEFAULT_SUPABASE_URL;
46
+ }
47
+ function getSupabaseAnonKey() {
48
+ return process.env[ENV_SUPABASE_ANON_KEY] || DEFAULT_SUPABASE_ANON_KEY;
49
+ }
50
+ export async function loginWithPassword(email, password) {
51
+ const supabaseUrl = getSupabaseUrl();
52
+ const anonKey = getSupabaseAnonKey();
53
+ const response = await fetch(`${supabaseUrl}/auth/v1/token?grant_type=password`, {
54
+ method: 'POST',
55
+ headers: {
56
+ 'Content-Type': 'application/json',
57
+ 'apikey': anonKey,
58
+ },
59
+ body: JSON.stringify({ email, password }),
60
+ });
61
+ if (!response.ok) {
62
+ const error = await response.json().catch(() => ({ message: 'Unknown error' }));
63
+ throw new Error(error.error_description ||
64
+ error.msg ||
65
+ error.message ||
66
+ `Login failed (${response.status})`);
67
+ }
68
+ const data = await response.json();
69
+ const session = {
70
+ access_token: data.access_token,
71
+ refresh_token: data.refresh_token,
72
+ expires_at: Math.floor(Date.now() / 1000) + data.expires_in,
73
+ user_email: data.user.email,
74
+ };
75
+ saveSession(session);
76
+ return session;
77
+ }
78
+ async function refreshSession(session) {
79
+ const supabaseUrl = getSupabaseUrl();
80
+ const anonKey = getSupabaseAnonKey();
81
+ const response = await fetch(`${supabaseUrl}/auth/v1/token?grant_type=refresh_token`, {
82
+ method: 'POST',
83
+ headers: {
84
+ 'Content-Type': 'application/json',
85
+ 'apikey': anonKey,
86
+ },
87
+ body: JSON.stringify({ refresh_token: session.refresh_token }),
88
+ });
89
+ if (!response.ok) {
90
+ clearSession();
91
+ throw new Error('Session expired. Run `sarah auth login` to re-authenticate.');
92
+ }
93
+ const data = await response.json();
94
+ const newSession = {
95
+ access_token: data.access_token,
96
+ refresh_token: data.refresh_token,
97
+ expires_at: Math.floor(Date.now() / 1000) + data.expires_in,
98
+ user_email: data.user.email,
99
+ };
100
+ saveSession(newSession);
101
+ return newSession;
102
+ }
103
+ export async function getAccessToken() {
104
+ // 1. Env var takes precedence (for CI/CD, agents with pre-set tokens)
105
+ const envToken = process.env[ENV_ACCESS_TOKEN];
106
+ if (envToken)
107
+ return envToken;
108
+ // 2. Try stored session
109
+ let session = loadStoredSession();
110
+ if (!session) {
111
+ throw new Error('Not authenticated. Run `sarah auth login` or set SARAH_ACCESS_TOKEN.');
112
+ }
113
+ // 3. Auto-refresh if expired (with 60s buffer)
114
+ const now = Math.floor(Date.now() / 1000);
115
+ if (now >= session.expires_at - 60) {
116
+ session = await refreshSession(session);
117
+ }
118
+ return session.access_token;
119
+ }
120
+ export function getServiceSecret() {
121
+ return process.env[ENV_SERVICE_SECRET];
122
+ }
123
+ export function getApiUrl() {
124
+ return process.env[ENV_API_URL] || DEFAULT_API_URL;
125
+ }
126
+ export async function getAuthHeaders() {
127
+ const serviceSecret = getServiceSecret();
128
+ if (serviceSecret) {
129
+ return {
130
+ 'x-service-secret': serviceSecret,
131
+ 'Content-Type': 'application/json',
132
+ };
133
+ }
134
+ const token = await getAccessToken();
135
+ return {
136
+ 'Authorization': `Bearer ${token}`,
137
+ 'X-Auth-Token': token,
138
+ 'Content-Type': 'application/json',
139
+ };
140
+ }
141
+ export function getStoredSessionInfo() {
142
+ const session = loadStoredSession();
143
+ if (!session)
144
+ return null;
145
+ return {
146
+ email: session.user_email,
147
+ expires_at: session.expires_at,
148
+ authenticated: true,
149
+ };
150
+ }
151
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface ApiResponse<T = unknown> {
2
+ ok: boolean;
3
+ status: number;
4
+ data: T;
5
+ error?: string;
6
+ }
7
+ export interface RequestOptions {
8
+ method?: string;
9
+ body?: unknown;
10
+ params?: Record<string, string>;
11
+ fields?: string;
12
+ headers?: Record<string, string>;
13
+ }
14
+ export declare function apiRequest<T = unknown>(path: string, options?: RequestOptions): Promise<ApiResponse<T>>;
15
+ export declare const api: {
16
+ get: <T = unknown>(path: string, opts?: Omit<RequestOptions, "method">) => Promise<ApiResponse<T>>;
17
+ post: <T = unknown>(path: string, body?: unknown, opts?: Omit<RequestOptions, "method" | "body">) => Promise<ApiResponse<T>>;
18
+ patch: <T = unknown>(path: string, body?: unknown, opts?: Omit<RequestOptions, "method" | "body">) => Promise<ApiResponse<T>>;
19
+ delete: <T = unknown>(path: string, opts?: Omit<RequestOptions, "method">) => Promise<ApiResponse<T>>;
20
+ };
21
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/lib/http-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAaD,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAiDzB;AAED,eAAO,MAAM,GAAG;UACR,CAAC,kBAAkB,MAAM,SAAS,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;WAG/D,CAAC,kBAAkB,MAAM,SAAS,OAAO,SAAS,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC;YAGxF,CAAC,kBAAkB,MAAM,SAAS,OAAO,SAAS,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC;aAGxF,CAAC,kBAAkB,MAAM,SAAS,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;CAE1E,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { getApiUrl, getAuthHeaders } from './auth.js';
2
+ function buildUrl(path, params) {
3
+ const base = getApiUrl();
4
+ const url = new URL(path, base);
5
+ if (params) {
6
+ for (const [key, value] of Object.entries(params)) {
7
+ url.searchParams.set(key, value);
8
+ }
9
+ }
10
+ return url.toString();
11
+ }
12
+ export async function apiRequest(path, options = {}) {
13
+ const { method = 'GET', body, params, fields, headers: extraHeaders } = options;
14
+ const queryParams = { ...params };
15
+ if (fields) {
16
+ queryParams.fields = fields;
17
+ }
18
+ const url = buildUrl(path, Object.keys(queryParams).length > 0 ? queryParams : undefined);
19
+ const authHeaders = await getAuthHeaders();
20
+ const headers = { ...authHeaders, ...extraHeaders };
21
+ const fetchOptions = {
22
+ method,
23
+ headers,
24
+ };
25
+ if (body && method !== 'GET') {
26
+ fetchOptions.body = JSON.stringify(body);
27
+ }
28
+ try {
29
+ const response = await fetch(url, fetchOptions);
30
+ const contentType = response.headers.get('content-type') || '';
31
+ let data;
32
+ if (contentType.includes('application/json')) {
33
+ data = await response.json();
34
+ }
35
+ else {
36
+ data = await response.text();
37
+ }
38
+ if (!response.ok) {
39
+ const errorMsg = typeof data === 'object' && data !== null && 'error' in data
40
+ ? String(data.error)
41
+ : `HTTP ${response.status}`;
42
+ return { ok: false, status: response.status, data, error: errorMsg };
43
+ }
44
+ return { ok: true, status: response.status, data };
45
+ }
46
+ catch (err) {
47
+ const message = err instanceof Error ? err.message : String(err);
48
+ return {
49
+ ok: false,
50
+ status: 0,
51
+ data: null,
52
+ error: `Network error: ${message}`,
53
+ };
54
+ }
55
+ }
56
+ export const api = {
57
+ get: (path, opts) => apiRequest(path, { ...opts, method: 'GET' }),
58
+ post: (path, body, opts) => apiRequest(path, { ...opts, method: 'POST', body }),
59
+ patch: (path, body, opts) => apiRequest(path, { ...opts, method: 'PATCH', body }),
60
+ delete: (path, opts) => apiRequest(path, { ...opts, method: 'DELETE' }),
61
+ };
62
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/lib/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ApiResponse } from './http-client.js';
2
+ export declare function outputJson(data: unknown): void;
3
+ export declare function outputNdjson(items: unknown[]): void;
4
+ export declare function outputError(message: string): void;
5
+ export declare function handleApiResponse<T>(response: ApiResponse<T>): T;
6
+ export declare function outputSuccess(message: string): void;
7
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAInD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAMhE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEnD"}
@@ -0,0 +1,22 @@
1
+ export function outputJson(data) {
2
+ process.stdout.write(JSON.stringify(data, null, 2) + '\n');
3
+ }
4
+ export function outputNdjson(items) {
5
+ for (const item of items) {
6
+ process.stdout.write(JSON.stringify(item) + '\n');
7
+ }
8
+ }
9
+ export function outputError(message) {
10
+ process.stderr.write(`Error: ${message}\n`);
11
+ }
12
+ export function handleApiResponse(response) {
13
+ if (!response.ok) {
14
+ outputError(response.error || `Request failed with status ${response.status}`);
15
+ process.exit(1);
16
+ }
17
+ return response.data;
18
+ }
19
+ export function outputSuccess(message) {
20
+ process.stderr.write(`${message}\n`);
21
+ }
22
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,QAAwB;IAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,8BAA8B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function validateUuid(value: string, name: string): string;
2
+ export declare function validateEmail(value: string): string;
3
+ export declare function rejectControlChars(value: string, name: string): string;
4
+ export declare function validateFilePath(value: string): string;
5
+ export declare function validateResourceName(value: string, name: string): string;
6
+ export declare function parseJsonArg(value: string, name: string): unknown;
7
+ export declare function confirmAction(message: string): Promise<boolean>;
8
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/lib/safety.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQtD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBrE"}
@@ -0,0 +1,64 @@
1
+ import * as readline from 'node:readline';
2
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3
+ const CONTROL_CHAR_REGEX = /[\x00-\x1f]/;
4
+ const TRAVERSAL_REGEX = /\.\.\//;
5
+ export function validateUuid(value, name) {
6
+ if (!UUID_REGEX.test(value)) {
7
+ throw new Error(`Invalid ${name}: "${value}" is not a valid UUID`);
8
+ }
9
+ return value;
10
+ }
11
+ export function validateEmail(value) {
12
+ if (!value.includes('@') || !value.includes('.')) {
13
+ throw new Error(`Invalid email: "${value}"`);
14
+ }
15
+ return value.toLowerCase().trim();
16
+ }
17
+ export function rejectControlChars(value, name) {
18
+ if (CONTROL_CHAR_REGEX.test(value)) {
19
+ throw new Error(`${name} contains invalid control characters`);
20
+ }
21
+ return value;
22
+ }
23
+ export function validateFilePath(value) {
24
+ if (TRAVERSAL_REGEX.test(value)) {
25
+ throw new Error(`File path "${value}" contains directory traversal`);
26
+ }
27
+ if (value.includes('\0')) {
28
+ throw new Error('File path contains null bytes');
29
+ }
30
+ return value;
31
+ }
32
+ export function validateResourceName(value, name) {
33
+ if (value.includes('?') || value.includes('#')) {
34
+ throw new Error(`${name} "${value}" contains invalid characters (? or #)`);
35
+ }
36
+ if (value.includes('%')) {
37
+ throw new Error(`${name} "${value}" appears to be pre-encoded (contains %)`);
38
+ }
39
+ return rejectControlChars(value, name);
40
+ }
41
+ export function parseJsonArg(value, name) {
42
+ try {
43
+ return JSON.parse(value);
44
+ }
45
+ catch {
46
+ throw new Error(`Invalid JSON for ${name}: ${value}`);
47
+ }
48
+ }
49
+ export async function confirmAction(message) {
50
+ if (process.env.SARAH_CONFIRM === 'true') {
51
+ return true;
52
+ }
53
+ const rl = readline.createInterface({
54
+ input: process.stdin,
55
+ output: process.stderr,
56
+ });
57
+ return new Promise((resolve) => {
58
+ rl.question(`${message} [y/N] `, (answer) => {
59
+ rl.close();
60
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
61
+ });
62
+ });
63
+ }
64
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/lib/safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ interface SchemaEntry {
2
+ resource: string;
3
+ method: string;
4
+ description: string;
5
+ httpMethod: string;
6
+ path: string;
7
+ params?: Record<string, SchemaField>;
8
+ body?: Record<string, SchemaField>;
9
+ response?: string;
10
+ }
11
+ interface SchemaField {
12
+ type: string;
13
+ required?: boolean;
14
+ description?: string;
15
+ enum?: string[];
16
+ }
17
+ export declare const schemaRegistry: {
18
+ get(key: string): SchemaEntry | undefined;
19
+ listAll(): string[];
20
+ getByResource(resource: string): SchemaEntry[];
21
+ toToolDefinitions(): {
22
+ name: string;
23
+ description: string;
24
+ inputSchema: {
25
+ type: "object";
26
+ properties: {
27
+ [x: string]: {
28
+ enum?: string[] | undefined;
29
+ type: string;
30
+ description: string | undefined;
31
+ } | {
32
+ enum?: string[] | undefined;
33
+ type: string;
34
+ description: string | undefined;
35
+ };
36
+ };
37
+ required: string[];
38
+ };
39
+ }[];
40
+ };
41
+ export {};
42
+ //# sourceMappingURL=schema-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-registry.d.ts","sourceRoot":"","sources":["../../src/lib/schema-registry.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AA8UD,eAAO,MAAM,cAAc;aAChB,MAAM,GAAG,WAAW,GAAG,SAAS;eAI9B,MAAM,EAAE;4BAIK,MAAM,GAAG,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;CAiC/C,CAAC"}