ai-vault 1.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.
- package/LICENSE +21 -0
- package/README.md +287 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -0
- package/dist/providers/_template/index.d.ts +35 -0
- package/dist/providers/_template/index.d.ts.map +1 -0
- package/dist/providers/_template/index.js +146 -0
- package/dist/providers/_template/index.js.map +1 -0
- package/dist/providers/base.d.ts +34 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +91 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/grok/index.d.ts +47 -0
- package/dist/providers/grok/index.d.ts.map +1 -0
- package/dist/providers/grok/index.js +250 -0
- package/dist/providers/grok/index.js.map +1 -0
- package/dist/providers/index.d.ts +21 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +35 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types/index.d.ts +141 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provider.d.ts +85 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +25 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/schemas.d.ts +532 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +106 -0
- package/dist/types/schemas.js.map +1 -0
- package/dist/utils/api-client.d.ts +54 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +138 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/scraper.d.ts +58 -0
- package/dist/utils/scraper.d.ts.map +1 -0
- package/dist/utils/scraper.js +146 -0
- package/dist/utils/scraper.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base provider class with shared functionality
|
|
3
|
+
*/
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import { createWriteStream } from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import crypto from 'crypto';
|
|
9
|
+
export class BaseProvider {
|
|
10
|
+
config;
|
|
11
|
+
client;
|
|
12
|
+
/**
|
|
13
|
+
* Initialize HTTP client with authentication
|
|
14
|
+
*/
|
|
15
|
+
initClient(baseURL, headers = {}) {
|
|
16
|
+
this.client = axios.create({
|
|
17
|
+
baseURL,
|
|
18
|
+
headers: {
|
|
19
|
+
'User-Agent': 'ai-vault/1.0.0',
|
|
20
|
+
...headers,
|
|
21
|
+
},
|
|
22
|
+
timeout: 30000,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Default implementation for downloading media files
|
|
27
|
+
*/
|
|
28
|
+
async downloadMedia(url, outputPath) {
|
|
29
|
+
const response = await axios.get(url, {
|
|
30
|
+
responseType: 'stream',
|
|
31
|
+
headers: {
|
|
32
|
+
'User-Agent': 'ai-vault/1.0.0',
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
// Ensure output directory exists
|
|
36
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
37
|
+
// Create hash stream for deduplication
|
|
38
|
+
const hash = crypto.createHash('sha256');
|
|
39
|
+
let size = 0;
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const writer = createWriteStream(outputPath);
|
|
42
|
+
response.data.on('data', (chunk) => {
|
|
43
|
+
hash.update(chunk);
|
|
44
|
+
size += chunk.length;
|
|
45
|
+
});
|
|
46
|
+
response.data.pipe(writer);
|
|
47
|
+
writer.on('finish', () => {
|
|
48
|
+
const mimeType = response.headers['content-type'] || 'application/octet-stream';
|
|
49
|
+
resolve({
|
|
50
|
+
path: outputPath,
|
|
51
|
+
size,
|
|
52
|
+
mimeType,
|
|
53
|
+
hash: hash.digest('hex'),
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
writer.on('error', reject);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Helper to check if authentication is configured
|
|
61
|
+
*/
|
|
62
|
+
requireAuth() {
|
|
63
|
+
if (!this.config) {
|
|
64
|
+
throw new Error(`Provider ${this.name} is not configured. Run 'ai-vault setup' first.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Helper for exponential backoff retry
|
|
69
|
+
*/
|
|
70
|
+
async retry(fn, maxRetries = 3, baseDelay = 1000) {
|
|
71
|
+
let lastError;
|
|
72
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
73
|
+
try {
|
|
74
|
+
return await fn();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
lastError = error;
|
|
78
|
+
// Don't retry on authentication errors
|
|
79
|
+
if (lastError.name === 'AuthenticationError') {
|
|
80
|
+
throw lastError;
|
|
81
|
+
}
|
|
82
|
+
if (i < maxRetries - 1) {
|
|
83
|
+
const delay = baseDelay * Math.pow(2, i);
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
throw lastError;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grok (X.AI) Provider
|
|
3
|
+
*
|
|
4
|
+
* Supports two methods:
|
|
5
|
+
* 1. X.AI API (api.x.ai) - Requires API key
|
|
6
|
+
* 2. Web scraping (x.com/i/grok) - Requires session cookies
|
|
7
|
+
*/
|
|
8
|
+
import { BaseProvider } from '../base';
|
|
9
|
+
import type { ProviderConfig, Conversation } from '../../types';
|
|
10
|
+
import type { ListConversationsOptions, ConversationSummary } from '../../types/provider';
|
|
11
|
+
export declare class GrokProvider extends BaseProvider {
|
|
12
|
+
readonly name: "grok";
|
|
13
|
+
readonly displayName = "Grok (X.AI)";
|
|
14
|
+
readonly supportedAuthMethods: ('api-key' | 'cookies' | 'oauth')[];
|
|
15
|
+
private scraper?;
|
|
16
|
+
private apiClient?;
|
|
17
|
+
private useWebScraping;
|
|
18
|
+
/**
|
|
19
|
+
* Authenticate with Grok
|
|
20
|
+
*/
|
|
21
|
+
authenticate(config: ProviderConfig): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if currently authenticated
|
|
24
|
+
*/
|
|
25
|
+
isAuthenticated(): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* List all conversations
|
|
28
|
+
*/
|
|
29
|
+
listConversations(options?: ListConversationsOptions): Promise<ConversationSummary[]>;
|
|
30
|
+
/**
|
|
31
|
+
* List conversations via web scraping
|
|
32
|
+
*/
|
|
33
|
+
private listConversationsViaScraping;
|
|
34
|
+
/**
|
|
35
|
+
* Fetch complete conversation
|
|
36
|
+
*/
|
|
37
|
+
fetchConversation(id: string): Promise<Conversation>;
|
|
38
|
+
/**
|
|
39
|
+
* Fetch conversation via web scraping
|
|
40
|
+
*/
|
|
41
|
+
private fetchConversationViaScraping;
|
|
42
|
+
/**
|
|
43
|
+
* Cleanup browser resources
|
|
44
|
+
*/
|
|
45
|
+
cleanup(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/grok/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAuB,MAAM,aAAa,CAAC;AACrF,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAK1F,qBAAa,YAAa,SAAQ,YAAY;IAC5C,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,EAAE,CAA0B;IAE5F,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,cAAc,CAAS;IAE/B;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAyC5D;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IA4BzC;;OAEG;IACG,iBAAiB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAc3F;;OAEG;YACW,4BAA4B;IAmE1C;;OAEG;IACG,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAW1D;;OAEG;YACW,4BAA4B;IAiG1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grok (X.AI) Provider
|
|
3
|
+
*
|
|
4
|
+
* Supports two methods:
|
|
5
|
+
* 1. X.AI API (api.x.ai) - Requires API key
|
|
6
|
+
* 2. Web scraping (x.com/i/grok) - Requires session cookies
|
|
7
|
+
*/
|
|
8
|
+
import { BaseProvider } from '../base';
|
|
9
|
+
import { AuthenticationError, NotFoundError } from '../../types/provider';
|
|
10
|
+
import { BrowserScraper, autoScroll } from '../../utils/scraper';
|
|
11
|
+
import { createApiClient } from '../../utils/api-client';
|
|
12
|
+
export class GrokProvider extends BaseProvider {
|
|
13
|
+
name = 'grok';
|
|
14
|
+
displayName = 'Grok (X.AI)';
|
|
15
|
+
supportedAuthMethods = ['api-key', 'cookies'];
|
|
16
|
+
scraper;
|
|
17
|
+
apiClient;
|
|
18
|
+
useWebScraping = false;
|
|
19
|
+
/**
|
|
20
|
+
* Authenticate with Grok
|
|
21
|
+
*/
|
|
22
|
+
async authenticate(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
// Method 1: X.AI API with API key
|
|
25
|
+
if (config.authMethod === 'api-key') {
|
|
26
|
+
if (!config.apiKey) {
|
|
27
|
+
throw new AuthenticationError('API key is required. Get one at https://console.x.ai');
|
|
28
|
+
}
|
|
29
|
+
this.apiClient = createApiClient({
|
|
30
|
+
baseURL: config.customEndpoint || 'https://api.x.ai',
|
|
31
|
+
apiKey: config.apiKey,
|
|
32
|
+
});
|
|
33
|
+
this.useWebScraping = false;
|
|
34
|
+
// Test API authentication
|
|
35
|
+
try {
|
|
36
|
+
await this.apiClient.get('/v1/models');
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw error; // ApiClient handles auth errors
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Method 2: Web scraping with cookies
|
|
44
|
+
if (config.authMethod === 'cookies') {
|
|
45
|
+
if (!config.cookies) {
|
|
46
|
+
throw new AuthenticationError('Session cookies are required');
|
|
47
|
+
}
|
|
48
|
+
this.useWebScraping = true;
|
|
49
|
+
this.scraper = new BrowserScraper();
|
|
50
|
+
await this.scraper.init();
|
|
51
|
+
return this.isAuthenticated();
|
|
52
|
+
}
|
|
53
|
+
throw new AuthenticationError(`Unsupported auth method: ${config.authMethod}`);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if currently authenticated
|
|
57
|
+
*/
|
|
58
|
+
async isAuthenticated() {
|
|
59
|
+
this.requireAuth();
|
|
60
|
+
if (!this.useWebScraping && this.apiClient) {
|
|
61
|
+
try {
|
|
62
|
+
await this.apiClient.get('/v1/models');
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Test web scraping authentication
|
|
70
|
+
const page = await this.scraper.createPage({
|
|
71
|
+
cookies: this.config.cookies,
|
|
72
|
+
domain: '.x.com',
|
|
73
|
+
});
|
|
74
|
+
await page.goto('https://x.com/i/grok', { waitUntil: 'networkidle', timeout: 30000 });
|
|
75
|
+
// Check if we're redirected to login
|
|
76
|
+
const url = page.url();
|
|
77
|
+
const isAuthenticated = !url.includes('/login') && !url.includes('/oauth');
|
|
78
|
+
await page.close();
|
|
79
|
+
return isAuthenticated;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* List all conversations
|
|
83
|
+
*/
|
|
84
|
+
async listConversations(options) {
|
|
85
|
+
this.requireAuth();
|
|
86
|
+
if (this.useWebScraping) {
|
|
87
|
+
return this.listConversationsViaScraping(options);
|
|
88
|
+
}
|
|
89
|
+
// Note: X.AI public API doesn't have list conversations endpoint
|
|
90
|
+
// We'd need to use the Grok SDK or web scraping
|
|
91
|
+
console.warn('X.AI API does not support listing conversations. Using web scraping...');
|
|
92
|
+
this.useWebScraping = true;
|
|
93
|
+
return this.listConversationsViaScraping(options);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* List conversations via web scraping
|
|
97
|
+
*/
|
|
98
|
+
async listConversationsViaScraping(_options) {
|
|
99
|
+
const page = await this.scraper.createPage({
|
|
100
|
+
cookies: this.config.cookies,
|
|
101
|
+
domain: '.x.com',
|
|
102
|
+
});
|
|
103
|
+
try {
|
|
104
|
+
await page.goto('https://x.com/i/grok', { waitUntil: 'networkidle', timeout: 30000 });
|
|
105
|
+
// Wait for conversations list to load
|
|
106
|
+
await page
|
|
107
|
+
.waitForSelector('[data-testid="conversation-item"], .conversation-list-item', {
|
|
108
|
+
timeout: 10000,
|
|
109
|
+
})
|
|
110
|
+
.catch(() => {
|
|
111
|
+
// Try alternative selectors if standard ones don't work
|
|
112
|
+
});
|
|
113
|
+
// Scroll to load more conversations
|
|
114
|
+
await autoScroll(page);
|
|
115
|
+
// Extract conversation data
|
|
116
|
+
const conversations = await page.evaluate(() => {
|
|
117
|
+
const items = Array.from(document.querySelectorAll('[data-testid="conversation-item"], .conversation-list-item, [data-conversation-id]'));
|
|
118
|
+
return items
|
|
119
|
+
.map((item) => {
|
|
120
|
+
const id = item.getAttribute('data-conversation-id') || item.getAttribute('data-id') || '';
|
|
121
|
+
const titleEl = item.querySelector('.conversation-title, [data-testid="conversation-title"]');
|
|
122
|
+
const title = titleEl?.textContent?.trim() || 'Untitled';
|
|
123
|
+
const previewEl = item.querySelector('.conversation-preview, .message-preview');
|
|
124
|
+
const preview = previewEl?.textContent?.trim();
|
|
125
|
+
const timeEl = item.querySelector('time, .timestamp');
|
|
126
|
+
const timestamp = timeEl?.getAttribute('datetime') || timeEl?.textContent || '';
|
|
127
|
+
return { id, title, preview, timestamp };
|
|
128
|
+
})
|
|
129
|
+
.filter((item) => item.id); // Only keep items with IDs
|
|
130
|
+
});
|
|
131
|
+
await page.close();
|
|
132
|
+
// Transform to ConversationSummary format
|
|
133
|
+
return conversations.map((conv) => ({
|
|
134
|
+
id: conv.id,
|
|
135
|
+
title: conv.title,
|
|
136
|
+
messageCount: 0, // Unknown from list view
|
|
137
|
+
createdAt: conv.timestamp ? new Date(conv.timestamp) : new Date(),
|
|
138
|
+
updatedAt: conv.timestamp ? new Date(conv.timestamp) : new Date(),
|
|
139
|
+
hasMedia: false, // Unknown from list view
|
|
140
|
+
preview: conv.preview,
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
await page.close();
|
|
145
|
+
throw new Error(`Failed to list conversations: ${error}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Fetch complete conversation
|
|
150
|
+
*/
|
|
151
|
+
async fetchConversation(id) {
|
|
152
|
+
this.requireAuth();
|
|
153
|
+
if (this.useWebScraping) {
|
|
154
|
+
return this.fetchConversationViaScraping(id);
|
|
155
|
+
}
|
|
156
|
+
// API method (not available in public API)
|
|
157
|
+
throw new Error('Fetching individual conversations requires web scraping');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Fetch conversation via web scraping
|
|
161
|
+
*/
|
|
162
|
+
async fetchConversationViaScraping(id) {
|
|
163
|
+
const page = await this.scraper.createPage({
|
|
164
|
+
cookies: this.config.cookies,
|
|
165
|
+
domain: '.x.com',
|
|
166
|
+
});
|
|
167
|
+
try {
|
|
168
|
+
const url = `https://x.com/i/grok/conversation/${id}`;
|
|
169
|
+
await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 });
|
|
170
|
+
// Check if conversation exists
|
|
171
|
+
const notFound = await page.$('.error-page, [data-testid="error"]');
|
|
172
|
+
if (notFound) {
|
|
173
|
+
await page.close();
|
|
174
|
+
throw new NotFoundError(`Conversation ${id} not found`);
|
|
175
|
+
}
|
|
176
|
+
// Scroll to load all messages
|
|
177
|
+
await autoScroll(page);
|
|
178
|
+
// Extract conversation data
|
|
179
|
+
const data = await page.evaluate(() => {
|
|
180
|
+
const titleEl = document.querySelector('.conversation-title, h1');
|
|
181
|
+
const title = titleEl?.textContent?.trim() || 'Untitled';
|
|
182
|
+
const messageEls = Array.from(document.querySelectorAll('.message, [data-testid="message"], .chat-message'));
|
|
183
|
+
const messages = messageEls.map((el, idx) => {
|
|
184
|
+
const roleEl = el.querySelector('.message-role, [data-role]');
|
|
185
|
+
const role = roleEl?.getAttribute('data-role') ||
|
|
186
|
+
(el.classList.contains('user-message') ? 'user' : 'assistant');
|
|
187
|
+
const contentEl = el.querySelector('.message-content, .message-text');
|
|
188
|
+
const content = contentEl?.textContent?.trim() || '';
|
|
189
|
+
const timeEl = el.querySelector('time, .timestamp');
|
|
190
|
+
const timestamp = timeEl?.getAttribute('datetime') || new Date().toISOString();
|
|
191
|
+
// Extract media attachments
|
|
192
|
+
const mediaEls = Array.from(el.querySelectorAll('img, video'));
|
|
193
|
+
const attachments = mediaEls.map((media, mediaIdx) => ({
|
|
194
|
+
id: `${idx}-${mediaIdx}`,
|
|
195
|
+
type: media.tagName.toLowerCase(),
|
|
196
|
+
url: media.getAttribute('src') || '',
|
|
197
|
+
}));
|
|
198
|
+
return {
|
|
199
|
+
id: `msg-${idx}`,
|
|
200
|
+
role: role,
|
|
201
|
+
content,
|
|
202
|
+
timestamp,
|
|
203
|
+
attachments: attachments.length > 0 ? attachments : undefined,
|
|
204
|
+
};
|
|
205
|
+
});
|
|
206
|
+
return { title, messages };
|
|
207
|
+
});
|
|
208
|
+
await page.close();
|
|
209
|
+
// Transform to standard format
|
|
210
|
+
const messages = data.messages.map((msg) => ({
|
|
211
|
+
id: msg.id,
|
|
212
|
+
role: msg.role,
|
|
213
|
+
content: msg.content,
|
|
214
|
+
timestamp: new Date(msg.timestamp),
|
|
215
|
+
attachments: msg.attachments?.map((att) => ({
|
|
216
|
+
id: att.id,
|
|
217
|
+
type: att.type,
|
|
218
|
+
url: att.url,
|
|
219
|
+
})),
|
|
220
|
+
}));
|
|
221
|
+
return {
|
|
222
|
+
id,
|
|
223
|
+
provider: this.name,
|
|
224
|
+
title: data.title,
|
|
225
|
+
messages,
|
|
226
|
+
createdAt: messages[0]?.timestamp || new Date(),
|
|
227
|
+
updatedAt: messages[messages.length - 1]?.timestamp || new Date(),
|
|
228
|
+
metadata: {
|
|
229
|
+
messageCount: messages.length,
|
|
230
|
+
characterCount: messages.reduce((sum, m) => sum + m.content.length, 0),
|
|
231
|
+
mediaCount: messages.reduce((sum, m) => sum + (m.attachments?.length || 0), 0),
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
await page.close();
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Cleanup browser resources
|
|
242
|
+
*/
|
|
243
|
+
async cleanup() {
|
|
244
|
+
if (this.scraper) {
|
|
245
|
+
await this.scraper.close();
|
|
246
|
+
this.scraper = undefined;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/grok/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAkB,MAAM,wBAAwB,CAAC;AAEzE,MAAM,OAAO,YAAa,SAAQ,YAAY;IACnC,IAAI,GAAG,MAAe,CAAC;IACvB,WAAW,GAAG,aAAa,CAAC;IAC5B,oBAAoB,GAAwC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEpF,OAAO,CAAkB;IACzB,SAAS,CAAa;IACtB,cAAc,GAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,kCAAkC;QAClC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,IAAI,mBAAmB,CAAC,sDAAsD,CAAC,CAAC;YACxF,CAAC;YAED,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;gBAC/B,OAAO,EAAE,MAAM,CAAC,cAAc,IAAI,kBAAkB;gBACpD,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAE5B,0BAA0B;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,CAAC,gCAAgC;YAC/C,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAE1B,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,mBAAmB,CAAC,4BAA4B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAQ,CAAC,UAAU,CAAC;YAC1C,OAAO,EAAE,IAAI,CAAC,MAAO,CAAC,OAAQ;YAC9B,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtF,qCAAqC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE3E,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,OAAkC;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,iEAAiE;QACjE,gDAAgD;QAChD,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACvF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,4BAA4B,CACxC,QAAmC;QAEnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAQ,CAAC,UAAU,CAAC;YAC1C,OAAO,EAAE,IAAI,CAAC,MAAO,CAAC,OAAQ;YAC9B,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAEtF,sCAAsC;YACtC,MAAM,IAAI;iBACP,eAAe,CAAC,4DAA4D,EAAE;gBAC7E,OAAO,EAAE,KAAK;aACf,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,wDAAwD;YAC1D,CAAC,CAAC,CAAC;YAEL,oCAAoC;YACpC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAEvB,4BAA4B;YAC5B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,QAAQ,CAAC,gBAAgB,CACvB,oFAAoF,CACrF,CACW,CAAC;gBAEf,OAAO,KAAK;qBACT,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE;oBACrB,MAAM,EAAE,GACN,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;oBAClF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAChC,yDAAyD,CAC1D,CAAC;oBACF,MAAM,KAAK,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC;oBACzD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,CAAC;oBAChF,MAAM,OAAO,GAAG,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;oBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;oBACtD,MAAM,SAAS,GAAG,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,MAAM,EAAE,WAAW,IAAI,EAAE,CAAC;oBAEhF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;gBAC3C,CAAC,CAAC;qBACD,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B;YAChE,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAEnB,0CAA0C;YAC1C,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,YAAY,EAAE,CAAC,EAAE,yBAAyB;gBAC1C,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;gBACjE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;gBACjE,QAAQ,EAAE,KAAK,EAAE,yBAAyB;gBAC1C,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,EAAU;QAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,2CAA2C;QAC3C,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,4BAA4B,CAAC,EAAU;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAQ,CAAC,UAAU,CAAC;YAC1C,OAAO,EAAE,IAAI,CAAC,MAAO,CAAC,OAAQ;YAC9B,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,qCAAqC,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAEnE,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC;YACpE,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;YAC1D,CAAC;YAED,8BAA8B;YAC9B,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAEvB,4BAA4B;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;gBAClE,MAAM,KAAK,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC;gBAEzD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,QAAQ,CAAC,gBAAgB,CAAC,kDAAkD,CAAC,CACjE,CAAC;gBAEf,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAW,EAAE,GAAW,EAAE,EAAE;oBAC3D,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC;oBAC9D,MAAM,IAAI,GACR,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC;wBACjC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;oBAEjE,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC;oBACtE,MAAM,OAAO,GAAG,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBAErD,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;oBACpD,MAAM,SAAS,GAAG,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAE/E,4BAA4B;oBAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAkB,CAAC;oBAChF,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAkB,EAAE,QAAgB,EAAE,EAAE,CAAC,CAAC;wBAC1E,EAAE,EAAE,GAAG,GAAG,IAAI,QAAQ,EAAE;wBACxB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,EAAuB;wBACtD,GAAG,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;qBACrC,CAAC,CAAC,CAAC;oBAEJ,OAAO;wBACL,EAAE,EAAE,OAAO,GAAG,EAAE;wBAChB,IAAI,EAAE,IAA4B;wBAClC,OAAO;wBACP,SAAS;wBACT,WAAW,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;qBAC9D,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAEnB,+BAA+B;YAC/B,MAAM,QAAQ,GAAc,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACtD,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAClC,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAC/B,CAAC,GAAG,EAAc,EAAE,CAAC,CAAC;oBACpB,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,GAAG,EAAE,GAAG,CAAC,GAAG;iBACb,CAAC,CACH;aACF,CAAC,CAAC,CAAC;YAEJ,OAAO;gBACL,EAAE;gBACF,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ;gBACR,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE;gBAC/C,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE;gBACjE,QAAQ,EAAE;oBACR,YAAY,EAAE,QAAQ,CAAC,MAAM;oBAC7B,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;oBACtE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;iBAC/E;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry - all AI platform providers
|
|
3
|
+
*/
|
|
4
|
+
import { GrokProvider } from './grok';
|
|
5
|
+
import type { Provider } from '../types/provider';
|
|
6
|
+
import type { ProviderName } from '../types';
|
|
7
|
+
export declare const providers: Record<string, new () => Provider>;
|
|
8
|
+
/**
|
|
9
|
+
* Get a provider instance by name
|
|
10
|
+
*/
|
|
11
|
+
export declare function getProvider(name: ProviderName): Provider;
|
|
12
|
+
/**
|
|
13
|
+
* Get all available provider names
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAvailableProviders(): ProviderName[];
|
|
16
|
+
/**
|
|
17
|
+
* Check if a provider is available
|
|
18
|
+
*/
|
|
19
|
+
export declare function isProviderAvailable(name: string): boolean;
|
|
20
|
+
export { GrokProvider };
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,QAAQ,CAKxD,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAUxD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry - all AI platform providers
|
|
3
|
+
*/
|
|
4
|
+
import { GrokProvider } from './grok';
|
|
5
|
+
// Provider registry
|
|
6
|
+
export const providers = {
|
|
7
|
+
grok: GrokProvider,
|
|
8
|
+
// chatgpt: ChatGPTProvider, // Coming soon
|
|
9
|
+
// claude: ClaudeProvider, // Coming soon
|
|
10
|
+
// gemini: GeminiProvider, // Coming soon
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Get a provider instance by name
|
|
14
|
+
*/
|
|
15
|
+
export function getProvider(name) {
|
|
16
|
+
const ProviderClass = providers[name];
|
|
17
|
+
if (!ProviderClass) {
|
|
18
|
+
throw new Error(`Provider '${name}' not found. Available providers: ${Object.keys(providers).join(', ')}`);
|
|
19
|
+
}
|
|
20
|
+
return new ProviderClass();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get all available provider names
|
|
24
|
+
*/
|
|
25
|
+
export function getAvailableProviders() {
|
|
26
|
+
return Object.keys(providers);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if a provider is available
|
|
30
|
+
*/
|
|
31
|
+
export function isProviderAvailable(name) {
|
|
32
|
+
return name in providers;
|
|
33
|
+
}
|
|
34
|
+
export { GrokProvider };
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,oBAAoB;AACpB,MAAM,CAAC,MAAM,SAAS,GAAuC;IAC3D,IAAI,EAAE,YAAY;IAClB,2CAA2C;IAC3C,yCAAyC;IACzC,yCAAyC;CAC1C,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,qCAAqC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAmB,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,IAAI,SAAS,CAAC;AAC3B,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for AI Vault
|
|
3
|
+
*/
|
|
4
|
+
export type ProviderName = 'grok' | 'chatgpt' | 'claude' | 'gemini' | 'perplexity';
|
|
5
|
+
export type AuthMethod = 'api-key' | 'cookies' | 'oauth';
|
|
6
|
+
export interface ProviderConfig {
|
|
7
|
+
name: ProviderName;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
authMethod: AuthMethod;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
cookies?: Record<string, string>;
|
|
12
|
+
customEndpoint?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface Message {
|
|
15
|
+
id: string;
|
|
16
|
+
role: 'user' | 'assistant' | 'system';
|
|
17
|
+
content: string;
|
|
18
|
+
timestamp: Date;
|
|
19
|
+
metadata?: MessageMetadata;
|
|
20
|
+
attachments?: Attachment[];
|
|
21
|
+
}
|
|
22
|
+
export interface MessageMetadata {
|
|
23
|
+
model?: string;
|
|
24
|
+
tokenCount?: number;
|
|
25
|
+
thinkingProcess?: string;
|
|
26
|
+
citations?: Citation[];
|
|
27
|
+
[key: string]: any;
|
|
28
|
+
}
|
|
29
|
+
export interface Citation {
|
|
30
|
+
title: string;
|
|
31
|
+
url: string;
|
|
32
|
+
snippet?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface Attachment {
|
|
35
|
+
id: string;
|
|
36
|
+
type: 'image' | 'video' | 'audio' | 'document' | 'code';
|
|
37
|
+
url: string;
|
|
38
|
+
localPath?: string;
|
|
39
|
+
mimeType?: string;
|
|
40
|
+
size?: number;
|
|
41
|
+
metadata?: {
|
|
42
|
+
width?: number;
|
|
43
|
+
height?: number;
|
|
44
|
+
duration?: number;
|
|
45
|
+
[key: string]: any;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface Conversation {
|
|
49
|
+
id: string;
|
|
50
|
+
provider: ProviderName;
|
|
51
|
+
title: string;
|
|
52
|
+
messages: Message[];
|
|
53
|
+
createdAt: Date;
|
|
54
|
+
updatedAt: Date;
|
|
55
|
+
metadata: ConversationMetadata;
|
|
56
|
+
}
|
|
57
|
+
export interface ConversationMetadata {
|
|
58
|
+
tags?: string[];
|
|
59
|
+
archived?: boolean;
|
|
60
|
+
starred?: boolean;
|
|
61
|
+
folder?: string;
|
|
62
|
+
messageCount: number;
|
|
63
|
+
characterCount: number;
|
|
64
|
+
mediaCount: number;
|
|
65
|
+
[key: string]: any;
|
|
66
|
+
}
|
|
67
|
+
export interface ArchiveOptions {
|
|
68
|
+
providers?: ProviderName[];
|
|
69
|
+
since?: Date;
|
|
70
|
+
until?: Date;
|
|
71
|
+
includeMedia?: boolean;
|
|
72
|
+
outputFormat?: OutputFormat[];
|
|
73
|
+
filter?: ConversationFilter;
|
|
74
|
+
dryRun?: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface ConversationFilter {
|
|
77
|
+
starred?: boolean;
|
|
78
|
+
archived?: boolean;
|
|
79
|
+
minMessages?: number;
|
|
80
|
+
maxMessages?: number;
|
|
81
|
+
searchQuery?: string;
|
|
82
|
+
tags?: string[];
|
|
83
|
+
}
|
|
84
|
+
export type OutputFormat = 'json' | 'markdown' | 'html' | 'txt';
|
|
85
|
+
export interface ArchiveResult {
|
|
86
|
+
provider: ProviderName;
|
|
87
|
+
conversationsArchived: number;
|
|
88
|
+
mediaDownloaded: number;
|
|
89
|
+
errors: ArchiveError[];
|
|
90
|
+
duration: number;
|
|
91
|
+
}
|
|
92
|
+
export interface ArchiveError {
|
|
93
|
+
conversationId?: string;
|
|
94
|
+
message: string;
|
|
95
|
+
stack?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface StorageConfig {
|
|
98
|
+
basePath: string;
|
|
99
|
+
organizationStrategy: 'by-provider' | 'by-date' | 'flat';
|
|
100
|
+
compression?: boolean;
|
|
101
|
+
encryption?: boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface StorageMetadata {
|
|
104
|
+
version: string;
|
|
105
|
+
totalConversations: number;
|
|
106
|
+
totalSize: number;
|
|
107
|
+
lastArchived: Date;
|
|
108
|
+
providers: Record<ProviderName, ProviderStats>;
|
|
109
|
+
}
|
|
110
|
+
export interface ProviderStats {
|
|
111
|
+
conversationCount: number;
|
|
112
|
+
mediaCount: number;
|
|
113
|
+
lastSync: Date;
|
|
114
|
+
}
|
|
115
|
+
export interface VaultConfig {
|
|
116
|
+
version: string;
|
|
117
|
+
storage: StorageConfig;
|
|
118
|
+
providers: ProviderConfig[];
|
|
119
|
+
scheduling?: ScheduleConfig;
|
|
120
|
+
media?: MediaConfig;
|
|
121
|
+
export?: ExportConfig;
|
|
122
|
+
}
|
|
123
|
+
export interface ScheduleConfig {
|
|
124
|
+
enabled: boolean;
|
|
125
|
+
cron?: string;
|
|
126
|
+
timezone?: string;
|
|
127
|
+
providers?: ProviderName[];
|
|
128
|
+
}
|
|
129
|
+
export interface MediaConfig {
|
|
130
|
+
enabled: boolean;
|
|
131
|
+
deduplication: boolean;
|
|
132
|
+
maxFileSize?: number;
|
|
133
|
+
allowedTypes?: string[];
|
|
134
|
+
quality?: 'original' | 'high' | 'medium' | 'low';
|
|
135
|
+
}
|
|
136
|
+
export interface ExportConfig {
|
|
137
|
+
formats: OutputFormat[];
|
|
138
|
+
includeMetadata: boolean;
|
|
139
|
+
prettyPrint: boolean;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|