@twelvehart/supermemory-runtime 1.0.0-next.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/.env.example +57 -0
- package/README.md +374 -0
- package/dist/index.js +189 -0
- package/dist/mcp/index.js +1132 -0
- package/docker-compose.prod.yml +91 -0
- package/docker-compose.yml +358 -0
- package/drizzle/0000_dapper_the_professor.sql +159 -0
- package/drizzle/0001_api_keys.sql +51 -0
- package/drizzle/meta/0000_snapshot.json +1532 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +20 -0
- package/package.json +114 -0
- package/scripts/add-extraction-job.ts +122 -0
- package/scripts/benchmark-pgvector.ts +122 -0
- package/scripts/bootstrap.sh +209 -0
- package/scripts/check-runtime-pack.ts +111 -0
- package/scripts/claude-mcp-config.ts +336 -0
- package/scripts/docker-entrypoint.sh +183 -0
- package/scripts/doctor.ts +377 -0
- package/scripts/init-db.sql +33 -0
- package/scripts/install.sh +1110 -0
- package/scripts/mcp-setup.ts +271 -0
- package/scripts/migrations/001_create_pgvector_extension.sql +31 -0
- package/scripts/migrations/002_create_memory_embeddings_table.sql +75 -0
- package/scripts/migrations/003_create_hnsw_index.sql +94 -0
- package/scripts/migrations/004_create_memory_embeddings_standalone.sql +70 -0
- package/scripts/migrations/005_create_chunks_table.sql +95 -0
- package/scripts/migrations/006_create_processing_queue.sql +45 -0
- package/scripts/migrations/generate_test_data.sql +42 -0
- package/scripts/migrations/phase1_comprehensive_test.sql +204 -0
- package/scripts/migrations/run_migrations.sh +286 -0
- package/scripts/migrations/test_hnsw_index.sql +255 -0
- package/scripts/pre-commit-secrets +282 -0
- package/scripts/run-extraction-worker.ts +46 -0
- package/scripts/run-phase1-tests.sh +291 -0
- package/scripts/setup.ts +222 -0
- package/scripts/smoke-install.sh +12 -0
- package/scripts/test-health-endpoint.sh +328 -0
- package/src/api/index.ts +2 -0
- package/src/api/middleware/auth.ts +80 -0
- package/src/api/middleware/csrf.ts +308 -0
- package/src/api/middleware/errorHandler.ts +166 -0
- package/src/api/middleware/rateLimit.ts +360 -0
- package/src/api/middleware/validation.ts +514 -0
- package/src/api/routes/documents.ts +286 -0
- package/src/api/routes/profiles.ts +237 -0
- package/src/api/routes/search.ts +71 -0
- package/src/api/stores/index.ts +58 -0
- package/src/config/bootstrap-env.ts +3 -0
- package/src/config/env.ts +71 -0
- package/src/config/feature-flags.ts +25 -0
- package/src/config/index.ts +140 -0
- package/src/config/secrets.config.ts +291 -0
- package/src/db/client.ts +92 -0
- package/src/db/index.ts +73 -0
- package/src/db/postgres.ts +72 -0
- package/src/db/schema/chunks.schema.ts +31 -0
- package/src/db/schema/containers.schema.ts +46 -0
- package/src/db/schema/documents.schema.ts +49 -0
- package/src/db/schema/embeddings.schema.ts +32 -0
- package/src/db/schema/index.ts +11 -0
- package/src/db/schema/memories.schema.ts +72 -0
- package/src/db/schema/profiles.schema.ts +34 -0
- package/src/db/schema/queue.schema.ts +59 -0
- package/src/db/schema/relationships.schema.ts +42 -0
- package/src/db/schema.ts +223 -0
- package/src/db/worker-connection.ts +47 -0
- package/src/index.ts +235 -0
- package/src/mcp/CLAUDE.md +1 -0
- package/src/mcp/index.ts +1380 -0
- package/src/mcp/legacyState.ts +22 -0
- package/src/mcp/rateLimit.ts +358 -0
- package/src/mcp/resources.ts +309 -0
- package/src/mcp/results.ts +104 -0
- package/src/mcp/tools.ts +401 -0
- package/src/queues/config.ts +119 -0
- package/src/queues/index.ts +289 -0
- package/src/sdk/client.ts +225 -0
- package/src/sdk/errors.ts +266 -0
- package/src/sdk/http.ts +560 -0
- package/src/sdk/index.ts +244 -0
- package/src/sdk/resources/base.ts +65 -0
- package/src/sdk/resources/connections.ts +204 -0
- package/src/sdk/resources/documents.ts +163 -0
- package/src/sdk/resources/index.ts +10 -0
- package/src/sdk/resources/memories.ts +150 -0
- package/src/sdk/resources/search.ts +60 -0
- package/src/sdk/resources/settings.ts +36 -0
- package/src/sdk/types.ts +674 -0
- package/src/services/chunking/index.ts +451 -0
- package/src/services/chunking.service.ts +650 -0
- package/src/services/csrf.service.ts +252 -0
- package/src/services/documents.repository.ts +219 -0
- package/src/services/documents.service.ts +191 -0
- package/src/services/embedding.service.ts +404 -0
- package/src/services/extraction.service.ts +300 -0
- package/src/services/extractors/code.extractor.ts +451 -0
- package/src/services/extractors/index.ts +9 -0
- package/src/services/extractors/markdown.extractor.ts +461 -0
- package/src/services/extractors/pdf.extractor.ts +315 -0
- package/src/services/extractors/text.extractor.ts +118 -0
- package/src/services/extractors/url.extractor.ts +243 -0
- package/src/services/index.ts +235 -0
- package/src/services/ingestion.service.ts +177 -0
- package/src/services/llm/anthropic.ts +400 -0
- package/src/services/llm/base.ts +460 -0
- package/src/services/llm/contradiction-detector.service.ts +526 -0
- package/src/services/llm/heuristics.ts +148 -0
- package/src/services/llm/index.ts +309 -0
- package/src/services/llm/memory-classifier.service.ts +383 -0
- package/src/services/llm/memory-extension-detector.service.ts +523 -0
- package/src/services/llm/mock.ts +470 -0
- package/src/services/llm/openai.ts +398 -0
- package/src/services/llm/prompts.ts +438 -0
- package/src/services/llm/types.ts +373 -0
- package/src/services/memory.repository.ts +1769 -0
- package/src/services/memory.service.ts +1338 -0
- package/src/services/memory.types.ts +234 -0
- package/src/services/persistence/index.ts +295 -0
- package/src/services/pipeline.service.ts +509 -0
- package/src/services/profile.repository.ts +436 -0
- package/src/services/profile.service.ts +560 -0
- package/src/services/profile.types.ts +270 -0
- package/src/services/relationships/detector.ts +1128 -0
- package/src/services/relationships/index.ts +268 -0
- package/src/services/relationships/memory-integration.ts +459 -0
- package/src/services/relationships/strategies.ts +132 -0
- package/src/services/relationships/types.ts +370 -0
- package/src/services/search.service.ts +761 -0
- package/src/services/search.types.ts +220 -0
- package/src/services/secrets.service.ts +384 -0
- package/src/services/vectorstore/base.ts +327 -0
- package/src/services/vectorstore/index.ts +444 -0
- package/src/services/vectorstore/memory.ts +286 -0
- package/src/services/vectorstore/migration.ts +295 -0
- package/src/services/vectorstore/mock.ts +403 -0
- package/src/services/vectorstore/pgvector.ts +695 -0
- package/src/services/vectorstore/types.ts +247 -0
- package/src/startup.ts +389 -0
- package/src/types/api.types.ts +193 -0
- package/src/types/document.types.ts +103 -0
- package/src/types/index.ts +241 -0
- package/src/types/profile.base.ts +133 -0
- package/src/utils/errors.ts +447 -0
- package/src/utils/id.ts +15 -0
- package/src/utils/index.ts +101 -0
- package/src/utils/logger.ts +313 -0
- package/src/utils/sanitization.ts +501 -0
- package/src/utils/secret-validation.ts +273 -0
- package/src/utils/synonyms.ts +188 -0
- package/src/utils/validation.ts +581 -0
- package/src/workers/chunking.worker.ts +242 -0
- package/src/workers/embedding.worker.ts +358 -0
- package/src/workers/extraction.worker.ts +346 -0
- package/src/workers/indexing.worker.ts +505 -0
- package/tsconfig.json +38 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supermemory SDK Error Classes
|
|
3
|
+
* Drop-in replacement for the official supermemory npm package
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Base error class for all Supermemory errors
|
|
8
|
+
*/
|
|
9
|
+
export class SupermemoryError extends Error {
|
|
10
|
+
constructor(message?: string) {
|
|
11
|
+
super(message)
|
|
12
|
+
this.name = 'SupermemoryError'
|
|
13
|
+
Object.setPrototypeOf(this, new.target.prototype)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Base class for API-related errors
|
|
19
|
+
*/
|
|
20
|
+
export class APIError<
|
|
21
|
+
TStatus extends number | undefined = number | undefined,
|
|
22
|
+
THeaders extends Headers | undefined = Headers | undefined,
|
|
23
|
+
TError = unknown,
|
|
24
|
+
> extends SupermemoryError {
|
|
25
|
+
readonly status: TStatus
|
|
26
|
+
readonly headers: THeaders
|
|
27
|
+
readonly error: TError
|
|
28
|
+
readonly request_id?: string
|
|
29
|
+
|
|
30
|
+
constructor(status: TStatus, error: TError, message: string | undefined, headers: THeaders) {
|
|
31
|
+
super(message || APIError.makeMessage(status, error))
|
|
32
|
+
this.status = status
|
|
33
|
+
this.headers = headers
|
|
34
|
+
this.error = error
|
|
35
|
+
this.name = 'APIError'
|
|
36
|
+
|
|
37
|
+
// Extract request ID from headers if available
|
|
38
|
+
if (headers && typeof headers.get === 'function') {
|
|
39
|
+
this.request_id = headers.get('x-request-id') || undefined
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private static makeMessage(status: number | undefined, error: unknown): string {
|
|
44
|
+
if (typeof error === 'string') {
|
|
45
|
+
return error
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (error && typeof error === 'object') {
|
|
49
|
+
const errorObj = error as Record<string, unknown>
|
|
50
|
+
if (typeof errorObj.message === 'string') {
|
|
51
|
+
return errorObj.message
|
|
52
|
+
}
|
|
53
|
+
if (typeof errorObj.error === 'string') {
|
|
54
|
+
return errorObj.error
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return status ? `Request failed with status ${status}` : 'Request failed'
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Generate an appropriate error class instance based on status code
|
|
63
|
+
*/
|
|
64
|
+
static generate(
|
|
65
|
+
status: number | undefined,
|
|
66
|
+
error: unknown,
|
|
67
|
+
message: string | undefined,
|
|
68
|
+
headers: Headers | undefined
|
|
69
|
+
): APIError {
|
|
70
|
+
if (!status) {
|
|
71
|
+
return new APIConnectionError({ message })
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
switch (status) {
|
|
75
|
+
case 400:
|
|
76
|
+
return new BadRequestError(status, error, message, headers)
|
|
77
|
+
case 401:
|
|
78
|
+
return new AuthenticationError(status, error, message, headers)
|
|
79
|
+
case 403:
|
|
80
|
+
return new PermissionDeniedError(status, error, message, headers)
|
|
81
|
+
case 404:
|
|
82
|
+
return new NotFoundError(status, error, message, headers)
|
|
83
|
+
case 409:
|
|
84
|
+
return new ConflictError(status, error, message, headers)
|
|
85
|
+
case 422:
|
|
86
|
+
return new UnprocessableEntityError(status, error, message, headers)
|
|
87
|
+
case 429:
|
|
88
|
+
return new RateLimitError(status, error, message, headers)
|
|
89
|
+
default:
|
|
90
|
+
if (status >= 500) {
|
|
91
|
+
return new InternalServerError(status, error, message, headers)
|
|
92
|
+
}
|
|
93
|
+
return new APIError(status, error, message, headers)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Error thrown when the user aborts a request
|
|
100
|
+
*/
|
|
101
|
+
export class APIUserAbortError extends APIError<undefined, undefined, undefined> {
|
|
102
|
+
constructor(message?: string) {
|
|
103
|
+
super(undefined, undefined, message || 'Request was aborted', undefined)
|
|
104
|
+
this.name = 'APIUserAbortError'
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Error thrown when a connection to the API cannot be established
|
|
110
|
+
*/
|
|
111
|
+
export class APIConnectionError extends APIError<undefined, undefined, undefined> {
|
|
112
|
+
override readonly cause?: Error
|
|
113
|
+
|
|
114
|
+
constructor({ message, cause }: { message?: string; cause?: Error } = {}) {
|
|
115
|
+
super(undefined, undefined, message || 'Connection error', undefined)
|
|
116
|
+
this.name = 'APIConnectionError'
|
|
117
|
+
this.cause = cause
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Error thrown when a request times out
|
|
123
|
+
*/
|
|
124
|
+
export class APIConnectionTimeoutError extends APIConnectionError {
|
|
125
|
+
constructor({ message }: { message?: string } = {}) {
|
|
126
|
+
super({ message: message || 'Request timed out' })
|
|
127
|
+
this.name = 'APIConnectionTimeoutError'
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Error thrown for 400 Bad Request responses
|
|
133
|
+
*/
|
|
134
|
+
export class BadRequestError extends APIError<400, Headers | undefined> {
|
|
135
|
+
constructor(status: 400, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
136
|
+
super(status, error, message, headers)
|
|
137
|
+
this.name = 'BadRequestError'
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Error thrown for 401 Unauthorized responses
|
|
143
|
+
*/
|
|
144
|
+
export class AuthenticationError extends APIError<401, Headers | undefined> {
|
|
145
|
+
constructor(status: 401, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
146
|
+
super(status, error, message, headers)
|
|
147
|
+
this.name = 'AuthenticationError'
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Error thrown for 403 Forbidden responses
|
|
153
|
+
*/
|
|
154
|
+
export class PermissionDeniedError extends APIError<403, Headers | undefined> {
|
|
155
|
+
constructor(status: 403, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
156
|
+
super(status, error, message, headers)
|
|
157
|
+
this.name = 'PermissionDeniedError'
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Error thrown for 404 Not Found responses
|
|
163
|
+
*/
|
|
164
|
+
export class NotFoundError extends APIError<404, Headers | undefined> {
|
|
165
|
+
constructor(status: 404, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
166
|
+
super(status, error, message, headers)
|
|
167
|
+
this.name = 'NotFoundError'
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Error thrown for 409 Conflict responses
|
|
173
|
+
*/
|
|
174
|
+
export class ConflictError extends APIError<409, Headers | undefined> {
|
|
175
|
+
constructor(status: 409, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
176
|
+
super(status, error, message, headers)
|
|
177
|
+
this.name = 'ConflictError'
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Error thrown for 422 Unprocessable Entity responses
|
|
183
|
+
*/
|
|
184
|
+
export class UnprocessableEntityError extends APIError<422, Headers | undefined> {
|
|
185
|
+
constructor(status: 422, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
186
|
+
super(status, error, message, headers)
|
|
187
|
+
this.name = 'UnprocessableEntityError'
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Error thrown for 429 Rate Limit responses
|
|
193
|
+
*/
|
|
194
|
+
export class RateLimitError extends APIError<429, Headers | undefined> {
|
|
195
|
+
readonly retryAfter?: number
|
|
196
|
+
|
|
197
|
+
constructor(status: 429, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
198
|
+
super(status, error, message, headers)
|
|
199
|
+
this.name = 'RateLimitError'
|
|
200
|
+
|
|
201
|
+
// Extract retry-after header if available
|
|
202
|
+
if (headers && typeof headers.get === 'function') {
|
|
203
|
+
const retryAfter = headers.get('retry-after')
|
|
204
|
+
if (retryAfter) {
|
|
205
|
+
const parsed = parseInt(retryAfter, 10)
|
|
206
|
+
if (!Number.isNaN(parsed)) {
|
|
207
|
+
this.retryAfter = parsed
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Error thrown for 5xx Internal Server Error responses
|
|
216
|
+
*/
|
|
217
|
+
export class InternalServerError extends APIError<number, Headers | undefined> {
|
|
218
|
+
constructor(status: number, error: unknown, message: string | undefined, headers: Headers | undefined) {
|
|
219
|
+
super(status, error, message, headers)
|
|
220
|
+
this.name = 'InternalServerError'
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Type guard to check if an error is a Supermemory API error
|
|
226
|
+
*/
|
|
227
|
+
export function isAPIError(error: unknown): error is APIError {
|
|
228
|
+
return error instanceof APIError
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Type guard to check if an error is a rate limit error
|
|
233
|
+
*/
|
|
234
|
+
export function isRateLimitError(error: unknown): error is RateLimitError {
|
|
235
|
+
return error instanceof RateLimitError
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Type guard to check if an error is retryable
|
|
240
|
+
*/
|
|
241
|
+
export function isRetryableError(error: unknown): boolean {
|
|
242
|
+
if (error instanceof APIConnectionError) {
|
|
243
|
+
return true
|
|
244
|
+
}
|
|
245
|
+
if (error instanceof RateLimitError) {
|
|
246
|
+
return true
|
|
247
|
+
}
|
|
248
|
+
if (error instanceof InternalServerError) {
|
|
249
|
+
return true
|
|
250
|
+
}
|
|
251
|
+
// Also retry on generic network errors (e.g., fetch failures)
|
|
252
|
+
if (error instanceof Error) {
|
|
253
|
+
const message = error.message.toLowerCase()
|
|
254
|
+
if (
|
|
255
|
+
message.includes('network') ||
|
|
256
|
+
message.includes('fetch') ||
|
|
257
|
+
message.includes('econnrefused') ||
|
|
258
|
+
message.includes('enotfound') ||
|
|
259
|
+
message.includes('timeout') ||
|
|
260
|
+
message.includes('connection')
|
|
261
|
+
) {
|
|
262
|
+
return true
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return false
|
|
266
|
+
}
|