@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.
Files changed (156) hide show
  1. package/.env.example +57 -0
  2. package/README.md +374 -0
  3. package/dist/index.js +189 -0
  4. package/dist/mcp/index.js +1132 -0
  5. package/docker-compose.prod.yml +91 -0
  6. package/docker-compose.yml +358 -0
  7. package/drizzle/0000_dapper_the_professor.sql +159 -0
  8. package/drizzle/0001_api_keys.sql +51 -0
  9. package/drizzle/meta/0000_snapshot.json +1532 -0
  10. package/drizzle/meta/_journal.json +13 -0
  11. package/drizzle.config.ts +20 -0
  12. package/package.json +114 -0
  13. package/scripts/add-extraction-job.ts +122 -0
  14. package/scripts/benchmark-pgvector.ts +122 -0
  15. package/scripts/bootstrap.sh +209 -0
  16. package/scripts/check-runtime-pack.ts +111 -0
  17. package/scripts/claude-mcp-config.ts +336 -0
  18. package/scripts/docker-entrypoint.sh +183 -0
  19. package/scripts/doctor.ts +377 -0
  20. package/scripts/init-db.sql +33 -0
  21. package/scripts/install.sh +1110 -0
  22. package/scripts/mcp-setup.ts +271 -0
  23. package/scripts/migrations/001_create_pgvector_extension.sql +31 -0
  24. package/scripts/migrations/002_create_memory_embeddings_table.sql +75 -0
  25. package/scripts/migrations/003_create_hnsw_index.sql +94 -0
  26. package/scripts/migrations/004_create_memory_embeddings_standalone.sql +70 -0
  27. package/scripts/migrations/005_create_chunks_table.sql +95 -0
  28. package/scripts/migrations/006_create_processing_queue.sql +45 -0
  29. package/scripts/migrations/generate_test_data.sql +42 -0
  30. package/scripts/migrations/phase1_comprehensive_test.sql +204 -0
  31. package/scripts/migrations/run_migrations.sh +286 -0
  32. package/scripts/migrations/test_hnsw_index.sql +255 -0
  33. package/scripts/pre-commit-secrets +282 -0
  34. package/scripts/run-extraction-worker.ts +46 -0
  35. package/scripts/run-phase1-tests.sh +291 -0
  36. package/scripts/setup.ts +222 -0
  37. package/scripts/smoke-install.sh +12 -0
  38. package/scripts/test-health-endpoint.sh +328 -0
  39. package/src/api/index.ts +2 -0
  40. package/src/api/middleware/auth.ts +80 -0
  41. package/src/api/middleware/csrf.ts +308 -0
  42. package/src/api/middleware/errorHandler.ts +166 -0
  43. package/src/api/middleware/rateLimit.ts +360 -0
  44. package/src/api/middleware/validation.ts +514 -0
  45. package/src/api/routes/documents.ts +286 -0
  46. package/src/api/routes/profiles.ts +237 -0
  47. package/src/api/routes/search.ts +71 -0
  48. package/src/api/stores/index.ts +58 -0
  49. package/src/config/bootstrap-env.ts +3 -0
  50. package/src/config/env.ts +71 -0
  51. package/src/config/feature-flags.ts +25 -0
  52. package/src/config/index.ts +140 -0
  53. package/src/config/secrets.config.ts +291 -0
  54. package/src/db/client.ts +92 -0
  55. package/src/db/index.ts +73 -0
  56. package/src/db/postgres.ts +72 -0
  57. package/src/db/schema/chunks.schema.ts +31 -0
  58. package/src/db/schema/containers.schema.ts +46 -0
  59. package/src/db/schema/documents.schema.ts +49 -0
  60. package/src/db/schema/embeddings.schema.ts +32 -0
  61. package/src/db/schema/index.ts +11 -0
  62. package/src/db/schema/memories.schema.ts +72 -0
  63. package/src/db/schema/profiles.schema.ts +34 -0
  64. package/src/db/schema/queue.schema.ts +59 -0
  65. package/src/db/schema/relationships.schema.ts +42 -0
  66. package/src/db/schema.ts +223 -0
  67. package/src/db/worker-connection.ts +47 -0
  68. package/src/index.ts +235 -0
  69. package/src/mcp/CLAUDE.md +1 -0
  70. package/src/mcp/index.ts +1380 -0
  71. package/src/mcp/legacyState.ts +22 -0
  72. package/src/mcp/rateLimit.ts +358 -0
  73. package/src/mcp/resources.ts +309 -0
  74. package/src/mcp/results.ts +104 -0
  75. package/src/mcp/tools.ts +401 -0
  76. package/src/queues/config.ts +119 -0
  77. package/src/queues/index.ts +289 -0
  78. package/src/sdk/client.ts +225 -0
  79. package/src/sdk/errors.ts +266 -0
  80. package/src/sdk/http.ts +560 -0
  81. package/src/sdk/index.ts +244 -0
  82. package/src/sdk/resources/base.ts +65 -0
  83. package/src/sdk/resources/connections.ts +204 -0
  84. package/src/sdk/resources/documents.ts +163 -0
  85. package/src/sdk/resources/index.ts +10 -0
  86. package/src/sdk/resources/memories.ts +150 -0
  87. package/src/sdk/resources/search.ts +60 -0
  88. package/src/sdk/resources/settings.ts +36 -0
  89. package/src/sdk/types.ts +674 -0
  90. package/src/services/chunking/index.ts +451 -0
  91. package/src/services/chunking.service.ts +650 -0
  92. package/src/services/csrf.service.ts +252 -0
  93. package/src/services/documents.repository.ts +219 -0
  94. package/src/services/documents.service.ts +191 -0
  95. package/src/services/embedding.service.ts +404 -0
  96. package/src/services/extraction.service.ts +300 -0
  97. package/src/services/extractors/code.extractor.ts +451 -0
  98. package/src/services/extractors/index.ts +9 -0
  99. package/src/services/extractors/markdown.extractor.ts +461 -0
  100. package/src/services/extractors/pdf.extractor.ts +315 -0
  101. package/src/services/extractors/text.extractor.ts +118 -0
  102. package/src/services/extractors/url.extractor.ts +243 -0
  103. package/src/services/index.ts +235 -0
  104. package/src/services/ingestion.service.ts +177 -0
  105. package/src/services/llm/anthropic.ts +400 -0
  106. package/src/services/llm/base.ts +460 -0
  107. package/src/services/llm/contradiction-detector.service.ts +526 -0
  108. package/src/services/llm/heuristics.ts +148 -0
  109. package/src/services/llm/index.ts +309 -0
  110. package/src/services/llm/memory-classifier.service.ts +383 -0
  111. package/src/services/llm/memory-extension-detector.service.ts +523 -0
  112. package/src/services/llm/mock.ts +470 -0
  113. package/src/services/llm/openai.ts +398 -0
  114. package/src/services/llm/prompts.ts +438 -0
  115. package/src/services/llm/types.ts +373 -0
  116. package/src/services/memory.repository.ts +1769 -0
  117. package/src/services/memory.service.ts +1338 -0
  118. package/src/services/memory.types.ts +234 -0
  119. package/src/services/persistence/index.ts +295 -0
  120. package/src/services/pipeline.service.ts +509 -0
  121. package/src/services/profile.repository.ts +436 -0
  122. package/src/services/profile.service.ts +560 -0
  123. package/src/services/profile.types.ts +270 -0
  124. package/src/services/relationships/detector.ts +1128 -0
  125. package/src/services/relationships/index.ts +268 -0
  126. package/src/services/relationships/memory-integration.ts +459 -0
  127. package/src/services/relationships/strategies.ts +132 -0
  128. package/src/services/relationships/types.ts +370 -0
  129. package/src/services/search.service.ts +761 -0
  130. package/src/services/search.types.ts +220 -0
  131. package/src/services/secrets.service.ts +384 -0
  132. package/src/services/vectorstore/base.ts +327 -0
  133. package/src/services/vectorstore/index.ts +444 -0
  134. package/src/services/vectorstore/memory.ts +286 -0
  135. package/src/services/vectorstore/migration.ts +295 -0
  136. package/src/services/vectorstore/mock.ts +403 -0
  137. package/src/services/vectorstore/pgvector.ts +695 -0
  138. package/src/services/vectorstore/types.ts +247 -0
  139. package/src/startup.ts +389 -0
  140. package/src/types/api.types.ts +193 -0
  141. package/src/types/document.types.ts +103 -0
  142. package/src/types/index.ts +241 -0
  143. package/src/types/profile.base.ts +133 -0
  144. package/src/utils/errors.ts +447 -0
  145. package/src/utils/id.ts +15 -0
  146. package/src/utils/index.ts +101 -0
  147. package/src/utils/logger.ts +313 -0
  148. package/src/utils/sanitization.ts +501 -0
  149. package/src/utils/secret-validation.ts +273 -0
  150. package/src/utils/synonyms.ts +188 -0
  151. package/src/utils/validation.ts +581 -0
  152. package/src/workers/chunking.worker.ts +242 -0
  153. package/src/workers/embedding.worker.ts +358 -0
  154. package/src/workers/extraction.worker.ts +346 -0
  155. package/src/workers/indexing.worker.ts +505 -0
  156. 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
+ }