memorysync-sdk 1.0.0 → 1.0.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/dist/index.js CHANGED
@@ -69,7 +69,7 @@ var ServerError = class extends MemorySyncError {
69
69
  this.name = "ServerError";
70
70
  }
71
71
  };
72
- var SDK_VERSION = "1.0.0";
72
+ var SDK_VERSION = "1.0.1";
73
73
  function camelToSnakeKey(key) {
74
74
  return key.replace(/([A-Z])/g, "_$1").toLowerCase();
75
75
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * MemorySync SDK — JavaScript / TypeScript client.\r\n *\r\n * Wraps the public REST surface of MemorySync. Every method here maps 1:1\r\n * to a route that exists in the backend; field names mirror the on-the-wire\r\n * JSON exactly (snake_case is preserved on payloads, camelCase is exposed\r\n * on the public TypeScript API).\r\n */\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport interface MemorySyncConfig {\r\n apiKey: string;\r\n baseUrl: string;\r\n projectId?: string;\r\n endUserId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface AddRequest {\r\n text: string;\r\n source?: string;\r\n tags?: string[];\r\n importance?: number;\r\n sessionId?: string;\r\n metadata?: Record<string, unknown>;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface MemoryRecord {\r\n id: number;\r\n text: string;\r\n summary?: string | null;\r\n tags?: string[] | null;\r\n source?: string | null;\r\n eventType?: string | null;\r\n importance?: number | null;\r\n metadata?: Record<string, unknown> | null;\r\n isSummary: boolean;\r\n createdAt: string;\r\n updatedAt?: string | null;\r\n score?: number | null;\r\n}\r\n\r\nexport interface AddSkippedResponse {\r\n status: \"skipped\";\r\n reason: string;\r\n memoryIds: number[];\r\n candidatesExtracted: number;\r\n candidatesStored: number;\r\n}\r\n\r\nexport type AddResponse = MemoryRecord | AddSkippedResponse;\r\n\r\nexport interface BulkAddItem {\r\n text: string;\r\n source?: string;\r\n eventType?: string;\r\n tags?: string[];\r\n metadata?: Record<string, unknown>;\r\n importance?: number;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface BulkAddItemResult {\r\n index: number;\r\n status: \"created\" | \"skipped\" | \"rejected\";\r\n memoryIds: number[];\r\n reason: string | null;\r\n}\r\n\r\nexport interface BulkAddResponse {\r\n total: number;\r\n created: number;\r\n skipped: number;\r\n rejected: number;\r\n results: BulkAddItemResult[];\r\n}\r\n\r\nexport interface QueryFilters {\r\n memoryType?: string;\r\n source?: string;\r\n tags?: string[];\r\n since?: string;\r\n until?: string;\r\n includeSummaries?: boolean;\r\n tier?: \"hot\" | \"warm\" | \"cold\";\r\n}\r\n\r\nexport interface QueryRequest {\r\n query: string;\r\n k?: number;\r\n filters?: QueryFilters;\r\n sessionId?: string;\r\n traversalDepth?: number;\r\n}\r\n\r\nexport interface QueryResponse {\r\n memories: MemoryRecord[];\r\n context?: string | null;\r\n latencyMs?: number | null;\r\n sessionId?: string | null;\r\n queryIntent?: string | null;\r\n}\r\n\r\nexport interface UpdateRequest {\r\n tags?: string[];\r\n importance?: number;\r\n metadata?: Record<string, unknown>;\r\n source?: string;\r\n eventType?: string;\r\n}\r\n\r\nexport interface SummarizeRequest {\r\n memoryIds: number[];\r\n lossless?: boolean;\r\n}\r\n\r\nexport interface ComposeRequest {\r\n promptTemplate: string;\r\n recallK?: number;\r\n maxTokens?: number;\r\n}\r\n\r\nexport interface ComposeResponse {\r\n composedPrompt: string;\r\n memoriesUsed: number;\r\n tokenCount: number;\r\n truncated: boolean;\r\n}\r\n\r\nexport type RelationshipType =\r\n | \"similar\"\r\n | \"derived_from\"\r\n | \"continuation\"\r\n | \"contradiction\"\r\n | \"summary_of\"\r\n | \"detail_of\"\r\n | \"caused_by\"\r\n | \"references\"\r\n | \"supports\"\r\n | \"extends\";\r\n\r\nexport interface RelationCreateRequest {\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RelationRecord {\r\n id: number;\r\n fromMemoryId: number;\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence: number;\r\n metadata?: Record<string, unknown> | null;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ExportResponse {\r\n userId: number;\r\n memories: Array<Record<string, unknown>>;\r\n generatedAt: string;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Errors\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\ninterface ErrorOpts {\r\n statusCode?: number;\r\n response?: unknown;\r\n requestId?: string;\r\n}\r\n\r\nexport class MemorySyncError extends Error {\r\n readonly statusCode?: number;\r\n readonly response?: unknown;\r\n readonly requestId?: string;\r\n constructor(message: string, opts: ErrorOpts = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = opts.statusCode;\r\n this.response = opts.response;\r\n this.requestId = opts.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\n\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n constructor(message: string, retryAfterSeconds: number, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"RateLimitError\";\r\n this.retryAfterSeconds = retryAfterSeconds;\r\n }\r\n}\r\n\r\nexport class ServerError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.0.0\";\r\n\r\nfunction camelToSnakeKey(key: string): string {\r\n return key.replace(/([A-Z])/g, \"_$1\").toLowerCase();\r\n}\r\n\r\nfunction camelToSnakeShallow(obj: Record<string, unknown> | undefined | null): Record<string, unknown> | undefined {\r\n if (!obj) return undefined;\r\n const out: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(obj)) {\r\n if (v === undefined) continue;\r\n out[camelToSnakeKey(k)] = v;\r\n }\r\n return out;\r\n}\r\n\r\nfunction snakeToCamelMemory(m: Record<string, unknown>): MemoryRecord {\r\n return {\r\n id: m.id as number,\r\n text: (m.text as string) ?? \"\",\r\n summary: (m.summary as string | null) ?? null,\r\n tags: (m.tags as string[] | null) ?? null,\r\n source: (m.source as string | null) ?? null,\r\n eventType: (m.event_type as string | null) ?? null,\r\n importance: (m.importance as number | null) ?? null,\r\n metadata: (m.metadata as Record<string, unknown> | null) ?? null,\r\n isSummary: Boolean(m.is_summary),\r\n createdAt: m.created_at as string,\r\n updatedAt: (m.updated_at as string | null) ?? null,\r\n score: (m.score as number | null) ?? null,\r\n };\r\n}\r\n\r\nfunction safeJson(text: string): unknown {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction extractDetail(body: unknown): string | undefined {\r\n if (!body || typeof body !== \"object\") return undefined;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.detail === \"string\") return b.detail;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.message === \"string\") return e.message;\r\n }\r\n if (Array.isArray(b.detail) && b.detail.length > 0) {\r\n const first = b.detail[0] as Record<string, unknown>;\r\n if (typeof first.msg === \"string\") return first.msg;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.retry_after === \"number\") return b.retry_after;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.retry_after === \"number\") return e.retry_after;\r\n }\r\n return 0;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Client\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport class MemorySyncClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly projectId?: string;\r\n private readonly endUserId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n\r\n constructor(config: MemorySyncConfig) {\r\n if (!config.apiKey?.trim()) throw new Error(\"apiKey is required\");\r\n if (!config.baseUrl?.trim()) throw new Error(\"baseUrl is required\");\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\r\n this.projectId = config.projectId;\r\n this.endUserId = config.endUserId;\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const f = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!f) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = f;\r\n }\r\n\r\n private headers(extra: Record<string, string> = {}): Record<string, string> {\r\n const h: Record<string, string> = {\r\n \"X-API-Key\": this.apiKey,\r\n \"Content-Type\": \"application/json\",\r\n \"Accept\": \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n ...extra,\r\n };\r\n if (this.projectId) h[\"X-Project-ID\"] = this.projectId;\r\n if (this.endUserId) h[\"X-End-User-ID\"] = this.endUserId;\r\n return h;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n path: string,\r\n options: { body?: unknown; endUserOverride?: string } = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const headers = this.headers(\r\n options.endUserOverride ? { \"X-End-User-ID\": options.endUserOverride } : {},\r\n );\r\n const res = await this.fetchImpl(url, {\r\n method,\r\n headers,\r\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n const requestId = res.headers.get(\"X-Request-ID\") ?? undefined;\r\n\r\n if (res.status === 204) return undefined as unknown as T;\r\n\r\n const text = await res.text();\r\n const parsed: unknown = text ? safeJson(text) : null;\r\n\r\n if (!res.ok) this.throwForStatus(res.status, parsed, requestId);\r\n return parsed as T;\r\n } catch (e) {\r\n if (e instanceof MemorySyncError) throw e;\r\n if (e instanceof Error && e.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n throw new MemorySyncError(`Network error: ${(e as Error).message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private throwForStatus(status: number, body: unknown, requestId?: string): never {\r\n const detail = extractDetail(body);\r\n const opts: ErrorOpts = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", opts);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", opts);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", opts);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", opts);\r\n }\r\n if (status === 429) {\r\n const retryAfter = extractRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, opts);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, opts);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, opts);\r\n }\r\n\r\n // ── Memory ─────────────────────────────────────────────────────────\r\n\r\n async add(req: AddRequest): Promise<AddResponse> {\r\n const body: Record<string, unknown> = { text: req.text };\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.endUserId !== undefined) body.end_user_id = req.endUserId;\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/add\", {\r\n body,\r\n endUserOverride: req.endUserId,\r\n });\r\n if (raw && raw.status === \"skipped\") {\r\n return {\r\n status: \"skipped\",\r\n reason: (raw.reason as string) ?? \"no_high_value_content\",\r\n memoryIds: (raw.memory_ids as number[]) ?? [],\r\n candidatesExtracted: (raw.candidates_extracted as number) ?? 0,\r\n candidatesStored: (raw.candidates_stored as number) ?? 0,\r\n };\r\n }\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async bulkAdd(items: BulkAddItem[], opts: { deduplicate?: boolean } = {}): Promise<BulkAddResponse> {\r\n if (items.length === 0) throw new ValidationError(\"items must contain at least one entry\");\r\n if (items.length > 50) throw new ValidationError(\"items may contain at most 50 entries per request\");\r\n const body = {\r\n items: items.map((i) => {\r\n const o: Record<string, unknown> = { text: i.text };\r\n if (i.source !== undefined) o.source = i.source;\r\n if (i.eventType !== undefined) o.event_type = i.eventType;\r\n if (i.tags !== undefined) o.tags = i.tags;\r\n if (i.metadata !== undefined) o.metadata = i.metadata;\r\n if (i.importance !== undefined) o.importance = i.importance;\r\n if (i.endUserId !== undefined) o.end_user_id = i.endUserId;\r\n return o;\r\n }),\r\n deduplicate: opts.deduplicate ?? true,\r\n };\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/bulk-add\", { body });\r\n return {\r\n total: raw.total as number,\r\n created: raw.created as number,\r\n skipped: raw.skipped as number,\r\n rejected: raw.rejected as number,\r\n results: ((raw.results as Array<Record<string, unknown>>) ?? []).map((r) => ({\r\n index: r.index as number,\r\n status: r.status as BulkAddItemResult[\"status\"],\r\n memoryIds: (r.memory_ids as number[]) ?? [],\r\n reason: (r.reason as string | null) ?? null,\r\n })),\r\n };\r\n }\r\n\r\n async query(req: QueryRequest): Promise<QueryResponse> {\r\n const body: Record<string, unknown> = { query: req.query };\r\n if (req.k !== undefined) body.k = req.k;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.traversalDepth !== undefined) body.traversal_depth = req.traversalDepth;\r\n if (req.filters) body.filters = camelToSnakeShallow(req.filters as Record<string, unknown>);\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/query\", { body });\r\n return {\r\n memories: ((raw.memories as Array<Record<string, unknown>>) ?? []).map(snakeToCamelMemory),\r\n context: (raw.context as string | null) ?? null,\r\n latencyMs: (raw.latency_ms as number | null) ?? null,\r\n sessionId: (raw.session_id as string | null) ?? null,\r\n queryIntent: (raw.query_intent as string | null) ?? null,\r\n };\r\n }\r\n\r\n async get(memoryId: number): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", `/memory/${memoryId}`);\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async update(memoryId: number, req: UpdateRequest): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const body: Record<string, unknown> = {};\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.eventType !== undefined) body.event_type = req.eventType;\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"update() requires at least one editable field\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"PATCH\", `/memory/${memoryId}`, { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async forget(memoryIds: number[], reason?: string): Promise<number[]> {\r\n if (!Array.isArray(memoryIds) || memoryIds.length === 0) {\r\n throw new ValidationError(\"memoryIds must be a non-empty array\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: memoryIds };\r\n if (reason !== undefined) body.reason = reason;\r\n return await this.request<number[]>(\"DELETE\", \"/memory/forget\", { body });\r\n }\r\n\r\n async summarize(req: SummarizeRequest): Promise<MemoryRecord> {\r\n if (!req.memoryIds || req.memoryIds.length === 0) {\r\n throw new ValidationError(\"summarize() requires memoryIds\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: req.memoryIds };\r\n if (req.lossless !== undefined) body.lossless = req.lossless;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/summarize\", { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async compose(req: ComposeRequest): Promise<ComposeResponse> {\r\n const body: Record<string, unknown> = { prompt_template: req.promptTemplate };\r\n if (req.recallK !== undefined) body.recall_k = req.recallK;\r\n if (req.maxTokens !== undefined) body.max_tokens = req.maxTokens;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/compose\", { body });\r\n return {\r\n composedPrompt: (raw.composed_prompt as string) ?? \"\",\r\n memoriesUsed: (raw.memories_used as number) ?? 0,\r\n tokenCount: (raw.token_count as number) ?? 0,\r\n truncated: Boolean(raw.truncated),\r\n };\r\n }\r\n\r\n async exportAll(): Promise<ExportResponse> {\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", \"/memory/export\");\r\n return {\r\n userId: raw.user_id as number,\r\n memories: (raw.memories as Array<Record<string, unknown>>) ?? [],\r\n generatedAt: raw.generated_at as string,\r\n };\r\n }\r\n\r\n async createRelation(fromMemoryId: number, req: RelationCreateRequest): Promise<RelationRecord> {\r\n if (!Number.isInteger(fromMemoryId) || fromMemoryId <= 0) {\r\n throw new ValidationError(\"fromMemoryId must be a positive integer\");\r\n }\r\n if (fromMemoryId === req.toMemoryId) {\r\n throw new ValidationError(\"fromMemoryId must differ from toMemoryId (no self-loops)\");\r\n }\r\n const body: Record<string, unknown> = {\r\n to_memory_id: req.toMemoryId,\r\n relationship_type: req.relationshipType,\r\n };\r\n if (req.confidence !== undefined) body.confidence = req.confidence;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n const raw = await this.request<Record<string, unknown>>(\r\n \"POST\",\r\n `/memory/${fromMemoryId}/relations`,\r\n { body },\r\n );\r\n return {\r\n id: raw.id as number,\r\n fromMemoryId: raw.from_memory_id as number,\r\n toMemoryId: raw.to_memory_id as number,\r\n relationshipType: raw.relationship_type as RelationshipType,\r\n confidence: raw.confidence as number,\r\n metadata: (raw.metadata as Record<string, unknown> | null) ?? null,\r\n createdAt: raw.created_at as string,\r\n };\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * MemorySync SDK — JavaScript / TypeScript client.\r\n *\r\n * Wraps the public REST surface of MemorySync. Every method here maps 1:1\r\n * to a route that exists in the backend; field names mirror the on-the-wire\r\n * JSON exactly (snake_case is preserved on payloads, camelCase is exposed\r\n * on the public TypeScript API).\r\n */\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport interface MemorySyncConfig {\r\n apiKey: string;\r\n baseUrl: string;\r\n projectId?: string;\r\n endUserId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface AddRequest {\r\n text: string;\r\n source?: string;\r\n tags?: string[];\r\n importance?: number;\r\n sessionId?: string;\r\n metadata?: Record<string, unknown>;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface MemoryRecord {\r\n id: number;\r\n text: string;\r\n summary?: string | null;\r\n tags?: string[] | null;\r\n source?: string | null;\r\n eventType?: string | null;\r\n importance?: number | null;\r\n metadata?: Record<string, unknown> | null;\r\n isSummary: boolean;\r\n createdAt: string;\r\n updatedAt?: string | null;\r\n score?: number | null;\r\n}\r\n\r\nexport interface AddSkippedResponse {\r\n status: \"skipped\";\r\n reason: string;\r\n memoryIds: number[];\r\n candidatesExtracted: number;\r\n candidatesStored: number;\r\n}\r\n\r\nexport type AddResponse = MemoryRecord | AddSkippedResponse;\r\n\r\nexport interface BulkAddItem {\r\n text: string;\r\n source?: string;\r\n eventType?: string;\r\n tags?: string[];\r\n metadata?: Record<string, unknown>;\r\n importance?: number;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface BulkAddItemResult {\r\n index: number;\r\n status: \"created\" | \"skipped\" | \"rejected\";\r\n memoryIds: number[];\r\n reason: string | null;\r\n}\r\n\r\nexport interface BulkAddResponse {\r\n total: number;\r\n created: number;\r\n skipped: number;\r\n rejected: number;\r\n results: BulkAddItemResult[];\r\n}\r\n\r\nexport interface QueryFilters {\r\n memoryType?: string;\r\n source?: string;\r\n tags?: string[];\r\n since?: string;\r\n until?: string;\r\n includeSummaries?: boolean;\r\n tier?: \"hot\" | \"warm\" | \"cold\";\r\n}\r\n\r\nexport interface QueryRequest {\r\n query: string;\r\n k?: number;\r\n filters?: QueryFilters;\r\n sessionId?: string;\r\n traversalDepth?: number;\r\n}\r\n\r\nexport interface QueryResponse {\r\n memories: MemoryRecord[];\r\n context?: string | null;\r\n latencyMs?: number | null;\r\n sessionId?: string | null;\r\n queryIntent?: string | null;\r\n}\r\n\r\nexport interface UpdateRequest {\r\n tags?: string[];\r\n importance?: number;\r\n metadata?: Record<string, unknown>;\r\n source?: string;\r\n eventType?: string;\r\n}\r\n\r\nexport interface SummarizeRequest {\r\n memoryIds: number[];\r\n lossless?: boolean;\r\n}\r\n\r\nexport interface ComposeRequest {\r\n promptTemplate: string;\r\n recallK?: number;\r\n maxTokens?: number;\r\n}\r\n\r\nexport interface ComposeResponse {\r\n composedPrompt: string;\r\n memoriesUsed: number;\r\n tokenCount: number;\r\n truncated: boolean;\r\n}\r\n\r\nexport type RelationshipType =\r\n | \"similar\"\r\n | \"derived_from\"\r\n | \"continuation\"\r\n | \"contradiction\"\r\n | \"summary_of\"\r\n | \"detail_of\"\r\n | \"caused_by\"\r\n | \"references\"\r\n | \"supports\"\r\n | \"extends\";\r\n\r\nexport interface RelationCreateRequest {\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RelationRecord {\r\n id: number;\r\n fromMemoryId: number;\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence: number;\r\n metadata?: Record<string, unknown> | null;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ExportResponse {\r\n userId: number;\r\n memories: Array<Record<string, unknown>>;\r\n generatedAt: string;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Errors\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\ninterface ErrorOpts {\r\n statusCode?: number;\r\n response?: unknown;\r\n requestId?: string;\r\n}\r\n\r\nexport class MemorySyncError extends Error {\r\n readonly statusCode?: number;\r\n readonly response?: unknown;\r\n readonly requestId?: string;\r\n constructor(message: string, opts: ErrorOpts = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = opts.statusCode;\r\n this.response = opts.response;\r\n this.requestId = opts.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\n\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n constructor(message: string, retryAfterSeconds: number, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"RateLimitError\";\r\n this.retryAfterSeconds = retryAfterSeconds;\r\n }\r\n}\r\n\r\nexport class ServerError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.0.1\";\r\n\r\nfunction camelToSnakeKey(key: string): string {\r\n return key.replace(/([A-Z])/g, \"_$1\").toLowerCase();\r\n}\r\n\r\nfunction camelToSnakeShallow(obj: Record<string, unknown> | undefined | null): Record<string, unknown> | undefined {\r\n if (!obj) return undefined;\r\n const out: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(obj)) {\r\n if (v === undefined) continue;\r\n out[camelToSnakeKey(k)] = v;\r\n }\r\n return out;\r\n}\r\n\r\nfunction snakeToCamelMemory(m: Record<string, unknown>): MemoryRecord {\r\n return {\r\n id: m.id as number,\r\n text: (m.text as string) ?? \"\",\r\n summary: (m.summary as string | null) ?? null,\r\n tags: (m.tags as string[] | null) ?? null,\r\n source: (m.source as string | null) ?? null,\r\n eventType: (m.event_type as string | null) ?? null,\r\n importance: (m.importance as number | null) ?? null,\r\n metadata: (m.metadata as Record<string, unknown> | null) ?? null,\r\n isSummary: Boolean(m.is_summary),\r\n createdAt: m.created_at as string,\r\n updatedAt: (m.updated_at as string | null) ?? null,\r\n score: (m.score as number | null) ?? null,\r\n };\r\n}\r\n\r\nfunction safeJson(text: string): unknown {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction extractDetail(body: unknown): string | undefined {\r\n if (!body || typeof body !== \"object\") return undefined;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.detail === \"string\") return b.detail;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.message === \"string\") return e.message;\r\n }\r\n if (Array.isArray(b.detail) && b.detail.length > 0) {\r\n const first = b.detail[0] as Record<string, unknown>;\r\n if (typeof first.msg === \"string\") return first.msg;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.retry_after === \"number\") return b.retry_after;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.retry_after === \"number\") return e.retry_after;\r\n }\r\n return 0;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Client\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport class MemorySyncClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly projectId?: string;\r\n private readonly endUserId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n\r\n constructor(config: MemorySyncConfig) {\r\n if (!config.apiKey?.trim()) throw new Error(\"apiKey is required\");\r\n if (!config.baseUrl?.trim()) throw new Error(\"baseUrl is required\");\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\r\n this.projectId = config.projectId;\r\n this.endUserId = config.endUserId;\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const f = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!f) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = f;\r\n }\r\n\r\n private headers(extra: Record<string, string> = {}): Record<string, string> {\r\n const h: Record<string, string> = {\r\n \"X-API-Key\": this.apiKey,\r\n \"Content-Type\": \"application/json\",\r\n \"Accept\": \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n ...extra,\r\n };\r\n if (this.projectId) h[\"X-Project-ID\"] = this.projectId;\r\n if (this.endUserId) h[\"X-End-User-ID\"] = this.endUserId;\r\n return h;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n path: string,\r\n options: { body?: unknown; endUserOverride?: string } = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const headers = this.headers(\r\n options.endUserOverride ? { \"X-End-User-ID\": options.endUserOverride } : {},\r\n );\r\n const res = await this.fetchImpl(url, {\r\n method,\r\n headers,\r\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n const requestId = res.headers.get(\"X-Request-ID\") ?? undefined;\r\n\r\n if (res.status === 204) return undefined as unknown as T;\r\n\r\n const text = await res.text();\r\n const parsed: unknown = text ? safeJson(text) : null;\r\n\r\n if (!res.ok) this.throwForStatus(res.status, parsed, requestId);\r\n return parsed as T;\r\n } catch (e) {\r\n if (e instanceof MemorySyncError) throw e;\r\n if (e instanceof Error && e.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n throw new MemorySyncError(`Network error: ${(e as Error).message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private throwForStatus(status: number, body: unknown, requestId?: string): never {\r\n const detail = extractDetail(body);\r\n const opts: ErrorOpts = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", opts);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", opts);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", opts);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", opts);\r\n }\r\n if (status === 429) {\r\n const retryAfter = extractRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, opts);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, opts);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, opts);\r\n }\r\n\r\n // ── Memory ─────────────────────────────────────────────────────────\r\n\r\n async add(req: AddRequest): Promise<AddResponse> {\r\n const body: Record<string, unknown> = { text: req.text };\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.endUserId !== undefined) body.end_user_id = req.endUserId;\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/add\", {\r\n body,\r\n endUserOverride: req.endUserId,\r\n });\r\n if (raw && raw.status === \"skipped\") {\r\n return {\r\n status: \"skipped\",\r\n reason: (raw.reason as string) ?? \"no_high_value_content\",\r\n memoryIds: (raw.memory_ids as number[]) ?? [],\r\n candidatesExtracted: (raw.candidates_extracted as number) ?? 0,\r\n candidatesStored: (raw.candidates_stored as number) ?? 0,\r\n };\r\n }\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async bulkAdd(items: BulkAddItem[], opts: { deduplicate?: boolean } = {}): Promise<BulkAddResponse> {\r\n if (items.length === 0) throw new ValidationError(\"items must contain at least one entry\");\r\n if (items.length > 50) throw new ValidationError(\"items may contain at most 50 entries per request\");\r\n const body = {\r\n items: items.map((i) => {\r\n const o: Record<string, unknown> = { text: i.text };\r\n if (i.source !== undefined) o.source = i.source;\r\n if (i.eventType !== undefined) o.event_type = i.eventType;\r\n if (i.tags !== undefined) o.tags = i.tags;\r\n if (i.metadata !== undefined) o.metadata = i.metadata;\r\n if (i.importance !== undefined) o.importance = i.importance;\r\n if (i.endUserId !== undefined) o.end_user_id = i.endUserId;\r\n return o;\r\n }),\r\n deduplicate: opts.deduplicate ?? true,\r\n };\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/bulk-add\", { body });\r\n return {\r\n total: raw.total as number,\r\n created: raw.created as number,\r\n skipped: raw.skipped as number,\r\n rejected: raw.rejected as number,\r\n results: ((raw.results as Array<Record<string, unknown>>) ?? []).map((r) => ({\r\n index: r.index as number,\r\n status: r.status as BulkAddItemResult[\"status\"],\r\n memoryIds: (r.memory_ids as number[]) ?? [],\r\n reason: (r.reason as string | null) ?? null,\r\n })),\r\n };\r\n }\r\n\r\n async query(req: QueryRequest): Promise<QueryResponse> {\r\n const body: Record<string, unknown> = { query: req.query };\r\n if (req.k !== undefined) body.k = req.k;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.traversalDepth !== undefined) body.traversal_depth = req.traversalDepth;\r\n if (req.filters) body.filters = camelToSnakeShallow(req.filters as Record<string, unknown>);\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/query\", { body });\r\n return {\r\n memories: ((raw.memories as Array<Record<string, unknown>>) ?? []).map(snakeToCamelMemory),\r\n context: (raw.context as string | null) ?? null,\r\n latencyMs: (raw.latency_ms as number | null) ?? null,\r\n sessionId: (raw.session_id as string | null) ?? null,\r\n queryIntent: (raw.query_intent as string | null) ?? null,\r\n };\r\n }\r\n\r\n async get(memoryId: number): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", `/memory/${memoryId}`);\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async update(memoryId: number, req: UpdateRequest): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const body: Record<string, unknown> = {};\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.eventType !== undefined) body.event_type = req.eventType;\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"update() requires at least one editable field\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"PATCH\", `/memory/${memoryId}`, { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async forget(memoryIds: number[], reason?: string): Promise<number[]> {\r\n if (!Array.isArray(memoryIds) || memoryIds.length === 0) {\r\n throw new ValidationError(\"memoryIds must be a non-empty array\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: memoryIds };\r\n if (reason !== undefined) body.reason = reason;\r\n return await this.request<number[]>(\"DELETE\", \"/memory/forget\", { body });\r\n }\r\n\r\n async summarize(req: SummarizeRequest): Promise<MemoryRecord> {\r\n if (!req.memoryIds || req.memoryIds.length === 0) {\r\n throw new ValidationError(\"summarize() requires memoryIds\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: req.memoryIds };\r\n if (req.lossless !== undefined) body.lossless = req.lossless;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/summarize\", { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async compose(req: ComposeRequest): Promise<ComposeResponse> {\r\n const body: Record<string, unknown> = { prompt_template: req.promptTemplate };\r\n if (req.recallK !== undefined) body.recall_k = req.recallK;\r\n if (req.maxTokens !== undefined) body.max_tokens = req.maxTokens;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/compose\", { body });\r\n return {\r\n composedPrompt: (raw.composed_prompt as string) ?? \"\",\r\n memoriesUsed: (raw.memories_used as number) ?? 0,\r\n tokenCount: (raw.token_count as number) ?? 0,\r\n truncated: Boolean(raw.truncated),\r\n };\r\n }\r\n\r\n async exportAll(): Promise<ExportResponse> {\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", \"/memory/export\");\r\n return {\r\n userId: raw.user_id as number,\r\n memories: (raw.memories as Array<Record<string, unknown>>) ?? [],\r\n generatedAt: raw.generated_at as string,\r\n };\r\n }\r\n\r\n async createRelation(fromMemoryId: number, req: RelationCreateRequest): Promise<RelationRecord> {\r\n if (!Number.isInteger(fromMemoryId) || fromMemoryId <= 0) {\r\n throw new ValidationError(\"fromMemoryId must be a positive integer\");\r\n }\r\n if (fromMemoryId === req.toMemoryId) {\r\n throw new ValidationError(\"fromMemoryId must differ from toMemoryId (no self-loops)\");\r\n }\r\n const body: Record<string, unknown> = {\r\n to_memory_id: req.toMemoryId,\r\n relationship_type: req.relationshipType,\r\n };\r\n if (req.confidence !== undefined) body.confidence = req.confidence;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n const raw = await this.request<Record<string, unknown>>(\r\n \"POST\",\r\n `/memory/${fromMemoryId}/relations`,\r\n { body },\r\n );\r\n return {\r\n id: raw.id as number,\r\n fromMemoryId: raw.from_memory_id as number,\r\n toMemoryId: raw.to_memory_id as number,\r\n relationshipType: raw.relationship_type as RelationshipType,\r\n confidence: raw.confidence as number,\r\n metadata: (raw.metadata as Record<string, unknown> | null) ?? null,\r\n createdAt: raw.created_at as string,\r\n };\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -39,7 +39,7 @@ var ServerError = class extends MemorySyncError {
39
39
  this.name = "ServerError";
40
40
  }
41
41
  };
42
- var SDK_VERSION = "1.0.0";
42
+ var SDK_VERSION = "1.0.1";
43
43
  function camelToSnakeKey(key) {
44
44
  return key.replace(/([A-Z])/g, "_$1").toLowerCase();
45
45
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * MemorySync SDK — JavaScript / TypeScript client.\r\n *\r\n * Wraps the public REST surface of MemorySync. Every method here maps 1:1\r\n * to a route that exists in the backend; field names mirror the on-the-wire\r\n * JSON exactly (snake_case is preserved on payloads, camelCase is exposed\r\n * on the public TypeScript API).\r\n */\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport interface MemorySyncConfig {\r\n apiKey: string;\r\n baseUrl: string;\r\n projectId?: string;\r\n endUserId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface AddRequest {\r\n text: string;\r\n source?: string;\r\n tags?: string[];\r\n importance?: number;\r\n sessionId?: string;\r\n metadata?: Record<string, unknown>;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface MemoryRecord {\r\n id: number;\r\n text: string;\r\n summary?: string | null;\r\n tags?: string[] | null;\r\n source?: string | null;\r\n eventType?: string | null;\r\n importance?: number | null;\r\n metadata?: Record<string, unknown> | null;\r\n isSummary: boolean;\r\n createdAt: string;\r\n updatedAt?: string | null;\r\n score?: number | null;\r\n}\r\n\r\nexport interface AddSkippedResponse {\r\n status: \"skipped\";\r\n reason: string;\r\n memoryIds: number[];\r\n candidatesExtracted: number;\r\n candidatesStored: number;\r\n}\r\n\r\nexport type AddResponse = MemoryRecord | AddSkippedResponse;\r\n\r\nexport interface BulkAddItem {\r\n text: string;\r\n source?: string;\r\n eventType?: string;\r\n tags?: string[];\r\n metadata?: Record<string, unknown>;\r\n importance?: number;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface BulkAddItemResult {\r\n index: number;\r\n status: \"created\" | \"skipped\" | \"rejected\";\r\n memoryIds: number[];\r\n reason: string | null;\r\n}\r\n\r\nexport interface BulkAddResponse {\r\n total: number;\r\n created: number;\r\n skipped: number;\r\n rejected: number;\r\n results: BulkAddItemResult[];\r\n}\r\n\r\nexport interface QueryFilters {\r\n memoryType?: string;\r\n source?: string;\r\n tags?: string[];\r\n since?: string;\r\n until?: string;\r\n includeSummaries?: boolean;\r\n tier?: \"hot\" | \"warm\" | \"cold\";\r\n}\r\n\r\nexport interface QueryRequest {\r\n query: string;\r\n k?: number;\r\n filters?: QueryFilters;\r\n sessionId?: string;\r\n traversalDepth?: number;\r\n}\r\n\r\nexport interface QueryResponse {\r\n memories: MemoryRecord[];\r\n context?: string | null;\r\n latencyMs?: number | null;\r\n sessionId?: string | null;\r\n queryIntent?: string | null;\r\n}\r\n\r\nexport interface UpdateRequest {\r\n tags?: string[];\r\n importance?: number;\r\n metadata?: Record<string, unknown>;\r\n source?: string;\r\n eventType?: string;\r\n}\r\n\r\nexport interface SummarizeRequest {\r\n memoryIds: number[];\r\n lossless?: boolean;\r\n}\r\n\r\nexport interface ComposeRequest {\r\n promptTemplate: string;\r\n recallK?: number;\r\n maxTokens?: number;\r\n}\r\n\r\nexport interface ComposeResponse {\r\n composedPrompt: string;\r\n memoriesUsed: number;\r\n tokenCount: number;\r\n truncated: boolean;\r\n}\r\n\r\nexport type RelationshipType =\r\n | \"similar\"\r\n | \"derived_from\"\r\n | \"continuation\"\r\n | \"contradiction\"\r\n | \"summary_of\"\r\n | \"detail_of\"\r\n | \"caused_by\"\r\n | \"references\"\r\n | \"supports\"\r\n | \"extends\";\r\n\r\nexport interface RelationCreateRequest {\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RelationRecord {\r\n id: number;\r\n fromMemoryId: number;\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence: number;\r\n metadata?: Record<string, unknown> | null;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ExportResponse {\r\n userId: number;\r\n memories: Array<Record<string, unknown>>;\r\n generatedAt: string;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Errors\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\ninterface ErrorOpts {\r\n statusCode?: number;\r\n response?: unknown;\r\n requestId?: string;\r\n}\r\n\r\nexport class MemorySyncError extends Error {\r\n readonly statusCode?: number;\r\n readonly response?: unknown;\r\n readonly requestId?: string;\r\n constructor(message: string, opts: ErrorOpts = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = opts.statusCode;\r\n this.response = opts.response;\r\n this.requestId = opts.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\n\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n constructor(message: string, retryAfterSeconds: number, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"RateLimitError\";\r\n this.retryAfterSeconds = retryAfterSeconds;\r\n }\r\n}\r\n\r\nexport class ServerError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.0.0\";\r\n\r\nfunction camelToSnakeKey(key: string): string {\r\n return key.replace(/([A-Z])/g, \"_$1\").toLowerCase();\r\n}\r\n\r\nfunction camelToSnakeShallow(obj: Record<string, unknown> | undefined | null): Record<string, unknown> | undefined {\r\n if (!obj) return undefined;\r\n const out: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(obj)) {\r\n if (v === undefined) continue;\r\n out[camelToSnakeKey(k)] = v;\r\n }\r\n return out;\r\n}\r\n\r\nfunction snakeToCamelMemory(m: Record<string, unknown>): MemoryRecord {\r\n return {\r\n id: m.id as number,\r\n text: (m.text as string) ?? \"\",\r\n summary: (m.summary as string | null) ?? null,\r\n tags: (m.tags as string[] | null) ?? null,\r\n source: (m.source as string | null) ?? null,\r\n eventType: (m.event_type as string | null) ?? null,\r\n importance: (m.importance as number | null) ?? null,\r\n metadata: (m.metadata as Record<string, unknown> | null) ?? null,\r\n isSummary: Boolean(m.is_summary),\r\n createdAt: m.created_at as string,\r\n updatedAt: (m.updated_at as string | null) ?? null,\r\n score: (m.score as number | null) ?? null,\r\n };\r\n}\r\n\r\nfunction safeJson(text: string): unknown {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction extractDetail(body: unknown): string | undefined {\r\n if (!body || typeof body !== \"object\") return undefined;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.detail === \"string\") return b.detail;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.message === \"string\") return e.message;\r\n }\r\n if (Array.isArray(b.detail) && b.detail.length > 0) {\r\n const first = b.detail[0] as Record<string, unknown>;\r\n if (typeof first.msg === \"string\") return first.msg;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.retry_after === \"number\") return b.retry_after;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.retry_after === \"number\") return e.retry_after;\r\n }\r\n return 0;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Client\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport class MemorySyncClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly projectId?: string;\r\n private readonly endUserId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n\r\n constructor(config: MemorySyncConfig) {\r\n if (!config.apiKey?.trim()) throw new Error(\"apiKey is required\");\r\n if (!config.baseUrl?.trim()) throw new Error(\"baseUrl is required\");\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\r\n this.projectId = config.projectId;\r\n this.endUserId = config.endUserId;\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const f = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!f) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = f;\r\n }\r\n\r\n private headers(extra: Record<string, string> = {}): Record<string, string> {\r\n const h: Record<string, string> = {\r\n \"X-API-Key\": this.apiKey,\r\n \"Content-Type\": \"application/json\",\r\n \"Accept\": \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n ...extra,\r\n };\r\n if (this.projectId) h[\"X-Project-ID\"] = this.projectId;\r\n if (this.endUserId) h[\"X-End-User-ID\"] = this.endUserId;\r\n return h;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n path: string,\r\n options: { body?: unknown; endUserOverride?: string } = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const headers = this.headers(\r\n options.endUserOverride ? { \"X-End-User-ID\": options.endUserOverride } : {},\r\n );\r\n const res = await this.fetchImpl(url, {\r\n method,\r\n headers,\r\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n const requestId = res.headers.get(\"X-Request-ID\") ?? undefined;\r\n\r\n if (res.status === 204) return undefined as unknown as T;\r\n\r\n const text = await res.text();\r\n const parsed: unknown = text ? safeJson(text) : null;\r\n\r\n if (!res.ok) this.throwForStatus(res.status, parsed, requestId);\r\n return parsed as T;\r\n } catch (e) {\r\n if (e instanceof MemorySyncError) throw e;\r\n if (e instanceof Error && e.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n throw new MemorySyncError(`Network error: ${(e as Error).message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private throwForStatus(status: number, body: unknown, requestId?: string): never {\r\n const detail = extractDetail(body);\r\n const opts: ErrorOpts = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", opts);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", opts);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", opts);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", opts);\r\n }\r\n if (status === 429) {\r\n const retryAfter = extractRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, opts);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, opts);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, opts);\r\n }\r\n\r\n // ── Memory ─────────────────────────────────────────────────────────\r\n\r\n async add(req: AddRequest): Promise<AddResponse> {\r\n const body: Record<string, unknown> = { text: req.text };\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.endUserId !== undefined) body.end_user_id = req.endUserId;\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/add\", {\r\n body,\r\n endUserOverride: req.endUserId,\r\n });\r\n if (raw && raw.status === \"skipped\") {\r\n return {\r\n status: \"skipped\",\r\n reason: (raw.reason as string) ?? \"no_high_value_content\",\r\n memoryIds: (raw.memory_ids as number[]) ?? [],\r\n candidatesExtracted: (raw.candidates_extracted as number) ?? 0,\r\n candidatesStored: (raw.candidates_stored as number) ?? 0,\r\n };\r\n }\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async bulkAdd(items: BulkAddItem[], opts: { deduplicate?: boolean } = {}): Promise<BulkAddResponse> {\r\n if (items.length === 0) throw new ValidationError(\"items must contain at least one entry\");\r\n if (items.length > 50) throw new ValidationError(\"items may contain at most 50 entries per request\");\r\n const body = {\r\n items: items.map((i) => {\r\n const o: Record<string, unknown> = { text: i.text };\r\n if (i.source !== undefined) o.source = i.source;\r\n if (i.eventType !== undefined) o.event_type = i.eventType;\r\n if (i.tags !== undefined) o.tags = i.tags;\r\n if (i.metadata !== undefined) o.metadata = i.metadata;\r\n if (i.importance !== undefined) o.importance = i.importance;\r\n if (i.endUserId !== undefined) o.end_user_id = i.endUserId;\r\n return o;\r\n }),\r\n deduplicate: opts.deduplicate ?? true,\r\n };\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/bulk-add\", { body });\r\n return {\r\n total: raw.total as number,\r\n created: raw.created as number,\r\n skipped: raw.skipped as number,\r\n rejected: raw.rejected as number,\r\n results: ((raw.results as Array<Record<string, unknown>>) ?? []).map((r) => ({\r\n index: r.index as number,\r\n status: r.status as BulkAddItemResult[\"status\"],\r\n memoryIds: (r.memory_ids as number[]) ?? [],\r\n reason: (r.reason as string | null) ?? null,\r\n })),\r\n };\r\n }\r\n\r\n async query(req: QueryRequest): Promise<QueryResponse> {\r\n const body: Record<string, unknown> = { query: req.query };\r\n if (req.k !== undefined) body.k = req.k;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.traversalDepth !== undefined) body.traversal_depth = req.traversalDepth;\r\n if (req.filters) body.filters = camelToSnakeShallow(req.filters as Record<string, unknown>);\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/query\", { body });\r\n return {\r\n memories: ((raw.memories as Array<Record<string, unknown>>) ?? []).map(snakeToCamelMemory),\r\n context: (raw.context as string | null) ?? null,\r\n latencyMs: (raw.latency_ms as number | null) ?? null,\r\n sessionId: (raw.session_id as string | null) ?? null,\r\n queryIntent: (raw.query_intent as string | null) ?? null,\r\n };\r\n }\r\n\r\n async get(memoryId: number): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", `/memory/${memoryId}`);\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async update(memoryId: number, req: UpdateRequest): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const body: Record<string, unknown> = {};\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.eventType !== undefined) body.event_type = req.eventType;\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"update() requires at least one editable field\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"PATCH\", `/memory/${memoryId}`, { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async forget(memoryIds: number[], reason?: string): Promise<number[]> {\r\n if (!Array.isArray(memoryIds) || memoryIds.length === 0) {\r\n throw new ValidationError(\"memoryIds must be a non-empty array\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: memoryIds };\r\n if (reason !== undefined) body.reason = reason;\r\n return await this.request<number[]>(\"DELETE\", \"/memory/forget\", { body });\r\n }\r\n\r\n async summarize(req: SummarizeRequest): Promise<MemoryRecord> {\r\n if (!req.memoryIds || req.memoryIds.length === 0) {\r\n throw new ValidationError(\"summarize() requires memoryIds\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: req.memoryIds };\r\n if (req.lossless !== undefined) body.lossless = req.lossless;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/summarize\", { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async compose(req: ComposeRequest): Promise<ComposeResponse> {\r\n const body: Record<string, unknown> = { prompt_template: req.promptTemplate };\r\n if (req.recallK !== undefined) body.recall_k = req.recallK;\r\n if (req.maxTokens !== undefined) body.max_tokens = req.maxTokens;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/compose\", { body });\r\n return {\r\n composedPrompt: (raw.composed_prompt as string) ?? \"\",\r\n memoriesUsed: (raw.memories_used as number) ?? 0,\r\n tokenCount: (raw.token_count as number) ?? 0,\r\n truncated: Boolean(raw.truncated),\r\n };\r\n }\r\n\r\n async exportAll(): Promise<ExportResponse> {\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", \"/memory/export\");\r\n return {\r\n userId: raw.user_id as number,\r\n memories: (raw.memories as Array<Record<string, unknown>>) ?? [],\r\n generatedAt: raw.generated_at as string,\r\n };\r\n }\r\n\r\n async createRelation(fromMemoryId: number, req: RelationCreateRequest): Promise<RelationRecord> {\r\n if (!Number.isInteger(fromMemoryId) || fromMemoryId <= 0) {\r\n throw new ValidationError(\"fromMemoryId must be a positive integer\");\r\n }\r\n if (fromMemoryId === req.toMemoryId) {\r\n throw new ValidationError(\"fromMemoryId must differ from toMemoryId (no self-loops)\");\r\n }\r\n const body: Record<string, unknown> = {\r\n to_memory_id: req.toMemoryId,\r\n relationship_type: req.relationshipType,\r\n };\r\n if (req.confidence !== undefined) body.confidence = req.confidence;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n const raw = await this.request<Record<string, unknown>>(\r\n \"POST\",\r\n `/memory/${fromMemoryId}/relations`,\r\n { body },\r\n );\r\n return {\r\n id: raw.id as number,\r\n fromMemoryId: raw.from_memory_id as number,\r\n toMemoryId: raw.to_memory_id as number,\r\n relationshipType: raw.relationship_type as RelationshipType,\r\n confidence: raw.confidence as number,\r\n metadata: (raw.metadata as Record<string, unknown> | null) ?? null,\r\n createdAt: raw.created_at as string,\r\n };\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * MemorySync SDK — JavaScript / TypeScript client.\r\n *\r\n * Wraps the public REST surface of MemorySync. Every method here maps 1:1\r\n * to a route that exists in the backend; field names mirror the on-the-wire\r\n * JSON exactly (snake_case is preserved on payloads, camelCase is exposed\r\n * on the public TypeScript API).\r\n */\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Types\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport interface MemorySyncConfig {\r\n apiKey: string;\r\n baseUrl: string;\r\n projectId?: string;\r\n endUserId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface AddRequest {\r\n text: string;\r\n source?: string;\r\n tags?: string[];\r\n importance?: number;\r\n sessionId?: string;\r\n metadata?: Record<string, unknown>;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface MemoryRecord {\r\n id: number;\r\n text: string;\r\n summary?: string | null;\r\n tags?: string[] | null;\r\n source?: string | null;\r\n eventType?: string | null;\r\n importance?: number | null;\r\n metadata?: Record<string, unknown> | null;\r\n isSummary: boolean;\r\n createdAt: string;\r\n updatedAt?: string | null;\r\n score?: number | null;\r\n}\r\n\r\nexport interface AddSkippedResponse {\r\n status: \"skipped\";\r\n reason: string;\r\n memoryIds: number[];\r\n candidatesExtracted: number;\r\n candidatesStored: number;\r\n}\r\n\r\nexport type AddResponse = MemoryRecord | AddSkippedResponse;\r\n\r\nexport interface BulkAddItem {\r\n text: string;\r\n source?: string;\r\n eventType?: string;\r\n tags?: string[];\r\n metadata?: Record<string, unknown>;\r\n importance?: number;\r\n endUserId?: string;\r\n}\r\n\r\nexport interface BulkAddItemResult {\r\n index: number;\r\n status: \"created\" | \"skipped\" | \"rejected\";\r\n memoryIds: number[];\r\n reason: string | null;\r\n}\r\n\r\nexport interface BulkAddResponse {\r\n total: number;\r\n created: number;\r\n skipped: number;\r\n rejected: number;\r\n results: BulkAddItemResult[];\r\n}\r\n\r\nexport interface QueryFilters {\r\n memoryType?: string;\r\n source?: string;\r\n tags?: string[];\r\n since?: string;\r\n until?: string;\r\n includeSummaries?: boolean;\r\n tier?: \"hot\" | \"warm\" | \"cold\";\r\n}\r\n\r\nexport interface QueryRequest {\r\n query: string;\r\n k?: number;\r\n filters?: QueryFilters;\r\n sessionId?: string;\r\n traversalDepth?: number;\r\n}\r\n\r\nexport interface QueryResponse {\r\n memories: MemoryRecord[];\r\n context?: string | null;\r\n latencyMs?: number | null;\r\n sessionId?: string | null;\r\n queryIntent?: string | null;\r\n}\r\n\r\nexport interface UpdateRequest {\r\n tags?: string[];\r\n importance?: number;\r\n metadata?: Record<string, unknown>;\r\n source?: string;\r\n eventType?: string;\r\n}\r\n\r\nexport interface SummarizeRequest {\r\n memoryIds: number[];\r\n lossless?: boolean;\r\n}\r\n\r\nexport interface ComposeRequest {\r\n promptTemplate: string;\r\n recallK?: number;\r\n maxTokens?: number;\r\n}\r\n\r\nexport interface ComposeResponse {\r\n composedPrompt: string;\r\n memoriesUsed: number;\r\n tokenCount: number;\r\n truncated: boolean;\r\n}\r\n\r\nexport type RelationshipType =\r\n | \"similar\"\r\n | \"derived_from\"\r\n | \"continuation\"\r\n | \"contradiction\"\r\n | \"summary_of\"\r\n | \"detail_of\"\r\n | \"caused_by\"\r\n | \"references\"\r\n | \"supports\"\r\n | \"extends\";\r\n\r\nexport interface RelationCreateRequest {\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RelationRecord {\r\n id: number;\r\n fromMemoryId: number;\r\n toMemoryId: number;\r\n relationshipType: RelationshipType;\r\n confidence: number;\r\n metadata?: Record<string, unknown> | null;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ExportResponse {\r\n userId: number;\r\n memories: Array<Record<string, unknown>>;\r\n generatedAt: string;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Errors\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\ninterface ErrorOpts {\r\n statusCode?: number;\r\n response?: unknown;\r\n requestId?: string;\r\n}\r\n\r\nexport class MemorySyncError extends Error {\r\n readonly statusCode?: number;\r\n readonly response?: unknown;\r\n readonly requestId?: string;\r\n constructor(message: string, opts: ErrorOpts = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = opts.statusCode;\r\n this.response = opts.response;\r\n this.requestId = opts.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\n\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n constructor(message: string, retryAfterSeconds: number, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"RateLimitError\";\r\n this.retryAfterSeconds = retryAfterSeconds;\r\n }\r\n}\r\n\r\nexport class ServerError extends MemorySyncError {\r\n constructor(message: string, opts?: ErrorOpts) {\r\n super(message, opts);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.0.1\";\r\n\r\nfunction camelToSnakeKey(key: string): string {\r\n return key.replace(/([A-Z])/g, \"_$1\").toLowerCase();\r\n}\r\n\r\nfunction camelToSnakeShallow(obj: Record<string, unknown> | undefined | null): Record<string, unknown> | undefined {\r\n if (!obj) return undefined;\r\n const out: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(obj)) {\r\n if (v === undefined) continue;\r\n out[camelToSnakeKey(k)] = v;\r\n }\r\n return out;\r\n}\r\n\r\nfunction snakeToCamelMemory(m: Record<string, unknown>): MemoryRecord {\r\n return {\r\n id: m.id as number,\r\n text: (m.text as string) ?? \"\",\r\n summary: (m.summary as string | null) ?? null,\r\n tags: (m.tags as string[] | null) ?? null,\r\n source: (m.source as string | null) ?? null,\r\n eventType: (m.event_type as string | null) ?? null,\r\n importance: (m.importance as number | null) ?? null,\r\n metadata: (m.metadata as Record<string, unknown> | null) ?? null,\r\n isSummary: Boolean(m.is_summary),\r\n createdAt: m.created_at as string,\r\n updatedAt: (m.updated_at as string | null) ?? null,\r\n score: (m.score as number | null) ?? null,\r\n };\r\n}\r\n\r\nfunction safeJson(text: string): unknown {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nfunction extractDetail(body: unknown): string | undefined {\r\n if (!body || typeof body !== \"object\") return undefined;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.detail === \"string\") return b.detail;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.message === \"string\") return e.message;\r\n }\r\n if (Array.isArray(b.detail) && b.detail.length > 0) {\r\n const first = b.detail[0] as Record<string, unknown>;\r\n if (typeof first.msg === \"string\") return first.msg;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const b = body as Record<string, unknown>;\r\n if (typeof b.retry_after === \"number\") return b.retry_after;\r\n if (b.error && typeof b.error === \"object\") {\r\n const e = b.error as Record<string, unknown>;\r\n if (typeof e.retry_after === \"number\") return e.retry_after;\r\n }\r\n return 0;\r\n}\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Client\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nexport class MemorySyncClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly projectId?: string;\r\n private readonly endUserId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n\r\n constructor(config: MemorySyncConfig) {\r\n if (!config.apiKey?.trim()) throw new Error(\"apiKey is required\");\r\n if (!config.baseUrl?.trim()) throw new Error(\"baseUrl is required\");\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\r\n this.projectId = config.projectId;\r\n this.endUserId = config.endUserId;\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const f = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!f) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = f;\r\n }\r\n\r\n private headers(extra: Record<string, string> = {}): Record<string, string> {\r\n const h: Record<string, string> = {\r\n \"X-API-Key\": this.apiKey,\r\n \"Content-Type\": \"application/json\",\r\n \"Accept\": \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n ...extra,\r\n };\r\n if (this.projectId) h[\"X-Project-ID\"] = this.projectId;\r\n if (this.endUserId) h[\"X-End-User-ID\"] = this.endUserId;\r\n return h;\r\n }\r\n\r\n private async request<T>(\r\n method: string,\r\n path: string,\r\n options: { body?: unknown; endUserOverride?: string } = {},\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${path}`;\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const headers = this.headers(\r\n options.endUserOverride ? { \"X-End-User-ID\": options.endUserOverride } : {},\r\n );\r\n const res = await this.fetchImpl(url, {\r\n method,\r\n headers,\r\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n const requestId = res.headers.get(\"X-Request-ID\") ?? undefined;\r\n\r\n if (res.status === 204) return undefined as unknown as T;\r\n\r\n const text = await res.text();\r\n const parsed: unknown = text ? safeJson(text) : null;\r\n\r\n if (!res.ok) this.throwForStatus(res.status, parsed, requestId);\r\n return parsed as T;\r\n } catch (e) {\r\n if (e instanceof MemorySyncError) throw e;\r\n if (e instanceof Error && e.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n throw new MemorySyncError(`Network error: ${(e as Error).message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private throwForStatus(status: number, body: unknown, requestId?: string): never {\r\n const detail = extractDetail(body);\r\n const opts: ErrorOpts = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", opts);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", opts);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", opts);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", opts);\r\n }\r\n if (status === 429) {\r\n const retryAfter = extractRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, opts);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, opts);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, opts);\r\n }\r\n\r\n // ── Memory ─────────────────────────────────────────────────────────\r\n\r\n async add(req: AddRequest): Promise<AddResponse> {\r\n const body: Record<string, unknown> = { text: req.text };\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.endUserId !== undefined) body.end_user_id = req.endUserId;\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/add\", {\r\n body,\r\n endUserOverride: req.endUserId,\r\n });\r\n if (raw && raw.status === \"skipped\") {\r\n return {\r\n status: \"skipped\",\r\n reason: (raw.reason as string) ?? \"no_high_value_content\",\r\n memoryIds: (raw.memory_ids as number[]) ?? [],\r\n candidatesExtracted: (raw.candidates_extracted as number) ?? 0,\r\n candidatesStored: (raw.candidates_stored as number) ?? 0,\r\n };\r\n }\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async bulkAdd(items: BulkAddItem[], opts: { deduplicate?: boolean } = {}): Promise<BulkAddResponse> {\r\n if (items.length === 0) throw new ValidationError(\"items must contain at least one entry\");\r\n if (items.length > 50) throw new ValidationError(\"items may contain at most 50 entries per request\");\r\n const body = {\r\n items: items.map((i) => {\r\n const o: Record<string, unknown> = { text: i.text };\r\n if (i.source !== undefined) o.source = i.source;\r\n if (i.eventType !== undefined) o.event_type = i.eventType;\r\n if (i.tags !== undefined) o.tags = i.tags;\r\n if (i.metadata !== undefined) o.metadata = i.metadata;\r\n if (i.importance !== undefined) o.importance = i.importance;\r\n if (i.endUserId !== undefined) o.end_user_id = i.endUserId;\r\n return o;\r\n }),\r\n deduplicate: opts.deduplicate ?? true,\r\n };\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/bulk-add\", { body });\r\n return {\r\n total: raw.total as number,\r\n created: raw.created as number,\r\n skipped: raw.skipped as number,\r\n rejected: raw.rejected as number,\r\n results: ((raw.results as Array<Record<string, unknown>>) ?? []).map((r) => ({\r\n index: r.index as number,\r\n status: r.status as BulkAddItemResult[\"status\"],\r\n memoryIds: (r.memory_ids as number[]) ?? [],\r\n reason: (r.reason as string | null) ?? null,\r\n })),\r\n };\r\n }\r\n\r\n async query(req: QueryRequest): Promise<QueryResponse> {\r\n const body: Record<string, unknown> = { query: req.query };\r\n if (req.k !== undefined) body.k = req.k;\r\n if (req.sessionId !== undefined) body.session_id = req.sessionId;\r\n if (req.traversalDepth !== undefined) body.traversal_depth = req.traversalDepth;\r\n if (req.filters) body.filters = camelToSnakeShallow(req.filters as Record<string, unknown>);\r\n\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/query\", { body });\r\n return {\r\n memories: ((raw.memories as Array<Record<string, unknown>>) ?? []).map(snakeToCamelMemory),\r\n context: (raw.context as string | null) ?? null,\r\n latencyMs: (raw.latency_ms as number | null) ?? null,\r\n sessionId: (raw.session_id as string | null) ?? null,\r\n queryIntent: (raw.query_intent as string | null) ?? null,\r\n };\r\n }\r\n\r\n async get(memoryId: number): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", `/memory/${memoryId}`);\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async update(memoryId: number, req: UpdateRequest): Promise<MemoryRecord> {\r\n if (!Number.isInteger(memoryId) || memoryId <= 0) {\r\n throw new ValidationError(\"memoryId must be a positive integer\");\r\n }\r\n const body: Record<string, unknown> = {};\r\n if (req.tags !== undefined) body.tags = req.tags;\r\n if (req.importance !== undefined) body.importance = req.importance;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n if (req.source !== undefined) body.source = req.source;\r\n if (req.eventType !== undefined) body.event_type = req.eventType;\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"update() requires at least one editable field\");\r\n }\r\n const raw = await this.request<Record<string, unknown>>(\"PATCH\", `/memory/${memoryId}`, { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async forget(memoryIds: number[], reason?: string): Promise<number[]> {\r\n if (!Array.isArray(memoryIds) || memoryIds.length === 0) {\r\n throw new ValidationError(\"memoryIds must be a non-empty array\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: memoryIds };\r\n if (reason !== undefined) body.reason = reason;\r\n return await this.request<number[]>(\"DELETE\", \"/memory/forget\", { body });\r\n }\r\n\r\n async summarize(req: SummarizeRequest): Promise<MemoryRecord> {\r\n if (!req.memoryIds || req.memoryIds.length === 0) {\r\n throw new ValidationError(\"summarize() requires memoryIds\");\r\n }\r\n const body: Record<string, unknown> = { memory_ids: req.memoryIds };\r\n if (req.lossless !== undefined) body.lossless = req.lossless;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/summarize\", { body });\r\n return snakeToCamelMemory(raw);\r\n }\r\n\r\n async compose(req: ComposeRequest): Promise<ComposeResponse> {\r\n const body: Record<string, unknown> = { prompt_template: req.promptTemplate };\r\n if (req.recallK !== undefined) body.recall_k = req.recallK;\r\n if (req.maxTokens !== undefined) body.max_tokens = req.maxTokens;\r\n const raw = await this.request<Record<string, unknown>>(\"POST\", \"/memory/compose\", { body });\r\n return {\r\n composedPrompt: (raw.composed_prompt as string) ?? \"\",\r\n memoriesUsed: (raw.memories_used as number) ?? 0,\r\n tokenCount: (raw.token_count as number) ?? 0,\r\n truncated: Boolean(raw.truncated),\r\n };\r\n }\r\n\r\n async exportAll(): Promise<ExportResponse> {\r\n const raw = await this.request<Record<string, unknown>>(\"GET\", \"/memory/export\");\r\n return {\r\n userId: raw.user_id as number,\r\n memories: (raw.memories as Array<Record<string, unknown>>) ?? [],\r\n generatedAt: raw.generated_at as string,\r\n };\r\n }\r\n\r\n async createRelation(fromMemoryId: number, req: RelationCreateRequest): Promise<RelationRecord> {\r\n if (!Number.isInteger(fromMemoryId) || fromMemoryId <= 0) {\r\n throw new ValidationError(\"fromMemoryId must be a positive integer\");\r\n }\r\n if (fromMemoryId === req.toMemoryId) {\r\n throw new ValidationError(\"fromMemoryId must differ from toMemoryId (no self-loops)\");\r\n }\r\n const body: Record<string, unknown> = {\r\n to_memory_id: req.toMemoryId,\r\n relationship_type: req.relationshipType,\r\n };\r\n if (req.confidence !== undefined) body.confidence = req.confidence;\r\n if (req.metadata !== undefined) body.metadata = req.metadata;\r\n const raw = await this.request<Record<string, unknown>>(\r\n \"POST\",\r\n `/memory/${fromMemoryId}/relations`,\r\n { body },\r\n );\r\n return {\r\n id: raw.id as number,\r\n fromMemoryId: raw.from_memory_id as number,\r\n toMemoryId: raw.to_memory_id as number,\r\n relationshipType: raw.relationship_type as RelationshipType,\r\n confidence: raw.confidence as number,\r\n metadata: (raw.metadata as Record<string, unknown> | null) ?? null,\r\n createdAt: raw.created_at as string,\r\n };\r\n }\r\n}\r\n"],"mappings":";AAmLO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAIzC,YAAY,SAAiB,OAAkB,CAAC,GAAG;AACjD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,KAAK;AACrB,SAAK,YAAY,KAAK;AAAA,EACxB;AACF;AAEO,IAAM,YAAN,cAAwB,gBAAgB;AAAA,EAC7C,YAAY,SAAiB,MAAkB;AAC7C,UAAM,SAAS,IAAI;AACnB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,gBAAgB;AAAA,EACnD,YAAY,SAAiB,MAAkB;AAC7C,UAAM,SAAS,IAAI;AACnB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,gBAAgB;AAAA,EACjD,YAAY,SAAiB,MAAkB;AAC7C,UAAM,SAAS,IAAI;AACnB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,gBAAgB;AAAA,EAElD,YAAY,SAAiB,mBAA2B,MAAkB;AACxE,UAAM,SAAS,IAAI;AACnB,SAAK,OAAO;AACZ,SAAK,oBAAoB;AAAA,EAC3B;AACF;AAEO,IAAM,cAAN,cAA0B,gBAAgB;AAAA,EAC/C,YAAY,SAAiB,MAAkB;AAC7C,UAAM,SAAS,IAAI;AACnB,SAAK,OAAO;AAAA,EACd;AACF;AAMA,IAAM,cAAc;AAEpB,SAAS,gBAAgB,KAAqB;AAC5C,SAAO,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AACpD;AAEA,SAAS,oBAAoB,KAAsF;AACjH,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,QAAI,MAAM,OAAW;AACrB,QAAI,gBAAgB,CAAC,CAAC,IAAI;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,GAA0C;AACpE,SAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,MAAO,EAAE,QAAmB;AAAA,IAC5B,SAAU,EAAE,WAA6B;AAAA,IACzC,MAAO,EAAE,QAA4B;AAAA,IACrC,QAAS,EAAE,UAA4B;AAAA,IACvC,WAAY,EAAE,cAAgC;AAAA,IAC9C,YAAa,EAAE,cAAgC;AAAA,IAC/C,UAAW,EAAE,YAA+C;AAAA,IAC5D,WAAW,QAAQ,EAAE,UAAU;AAAA,IAC/B,WAAW,EAAE;AAAA,IACb,WAAY,EAAE,cAAgC;AAAA,IAC9C,OAAQ,EAAE,SAA2B;AAAA,EACvC;AACF;AAEA,SAAS,SAAS,MAAuB;AACvC,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,MAAmC;AACxD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,WAAW,SAAU,QAAO,EAAE;AAC3C,MAAI,EAAE,SAAS,OAAO,EAAE,UAAU,UAAU;AAC1C,UAAM,IAAI,EAAE;AACZ,QAAI,OAAO,EAAE,YAAY,SAAU,QAAO,EAAE;AAAA,EAC9C;AACA,MAAI,MAAM,QAAQ,EAAE,MAAM,KAAK,EAAE,OAAO,SAAS,GAAG;AAClD,UAAM,QAAQ,EAAE,OAAO,CAAC;AACxB,QAAI,OAAO,MAAM,QAAQ,SAAU,QAAO,MAAM;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAuB;AAChD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,gBAAgB,SAAU,QAAO,EAAE;AAChD,MAAI,EAAE,SAAS,OAAO,EAAE,UAAU,UAAU;AAC1C,UAAM,IAAI,EAAE;AACZ,QAAI,OAAO,EAAE,gBAAgB,SAAU,QAAO,EAAE;AAAA,EAClD;AACA,SAAO;AACT;AAMO,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,YAAY,QAA0B;AACpC,QAAI,CAAC,OAAO,QAAQ,KAAK,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAChE,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAClE,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,EAAE;AAC/C,SAAK,YAAY,OAAO;AACxB,SAAK,YAAY,OAAO;AACxB,SAAK,YAAY,OAAO,aAAa;AACrC,UAAM,IAAI,OAAO,UAAU,OAAO,UAAU,cAAc,QAAQ;AAClE,QAAI,CAAC,GAAG;AACN,YAAM,IAAI,MAAM,4EAA4E;AAAA,IAC9F;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,QAAQ,QAAgC,CAAC,GAA2B;AAC1E,UAAM,IAA4B;AAAA,MAChC,aAAa,KAAK;AAAA,MAClB,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,cAAc,qBAAqB,WAAW;AAAA,MAC9C,GAAG;AAAA,IACL;AACA,QAAI,KAAK,UAAW,GAAE,cAAc,IAAI,KAAK;AAC7C,QAAI,KAAK,UAAW,GAAE,eAAe,IAAI,KAAK;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QACZ,QACA,MACA,UAAwD,CAAC,GAC7C;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,QAAI;AACF,YAAM,UAAU,KAAK;AAAA,QACnB,QAAQ,kBAAkB,EAAE,iBAAiB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,MAC5E;AACA,YAAM,MAAM,MAAM,KAAK,UAAU,KAAK;AAAA,QACpC;AAAA,QACA;AAAA,QACA,MAAM,QAAQ,SAAS,SAAY,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,QAClE,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,YAAM,YAAY,IAAI,QAAQ,IAAI,cAAc,KAAK;AAErD,UAAI,IAAI,WAAW,IAAK,QAAO;AAE/B,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,SAAkB,OAAO,SAAS,IAAI,IAAI;AAEhD,UAAI,CAAC,IAAI,GAAI,MAAK,eAAe,IAAI,QAAQ,QAAQ,SAAS;AAC9D,aAAO;AAAA,IACT,SAAS,GAAG;AACV,UAAI,aAAa,gBAAiB,OAAM;AACxC,UAAI,aAAa,SAAS,EAAE,SAAS,cAAc;AACjD,cAAM,IAAI,gBAAgB,2BAA2B,KAAK,SAAS,IAAI;AAAA,MACzE;AACA,YAAM,IAAI,gBAAgB,kBAAmB,EAAY,OAAO,EAAE;AAAA,IACpE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,eAAe,QAAgB,MAAe,WAA2B;AAC/E,UAAM,SAAS,cAAc,IAAI;AACjC,UAAM,OAAkB,EAAE,YAAY,QAAQ,UAAU,MAAM,UAAU;AACxE,QAAI,WAAW,IAAK,OAAM,IAAI,UAAU,UAAU,mBAAmB,IAAI;AACzE,QAAI,WAAW,IAAK,OAAM,IAAI,UAAU,UAAU,aAAa,IAAI;AACnE,QAAI,WAAW,IAAK,OAAM,IAAI,cAAc,UAAU,aAAa,IAAI;AACvE,QAAI,WAAW,OAAO,WAAW,OAAO,WAAW,KAAK;AACtD,YAAM,IAAI,gBAAgB,UAAU,oBAAoB,IAAI;AAAA,IAC9D;AACA,QAAI,WAAW,KAAK;AAClB,YAAM,aAAa,kBAAkB,IAAI;AACzC,YAAM,IAAI,eAAe,UAAU,gBAAgB,YAAY,IAAI;AAAA,IACrE;AACA,QAAI,UAAU,IAAK,OAAM,IAAI,YAAY,UAAU,iBAAiB,MAAM,KAAK,IAAI;AACnF,UAAM,IAAI,gBAAgB,UAAU,qBAAqB,MAAM,IAAI,IAAI;AAAA,EACzE;AAAA;AAAA,EAIA,MAAM,IAAI,KAAuC;AAC/C,UAAM,OAAgC,EAAE,MAAM,IAAI,KAAK;AACvD,QAAI,IAAI,WAAW,OAAW,MAAK,SAAS,IAAI;AAChD,QAAI,IAAI,SAAS,OAAW,MAAK,OAAO,IAAI;AAC5C,QAAI,IAAI,eAAe,OAAW,MAAK,aAAa,IAAI;AACxD,QAAI,IAAI,cAAc,OAAW,MAAK,aAAa,IAAI;AACvD,QAAI,IAAI,aAAa,OAAW,MAAK,WAAW,IAAI;AACpD,QAAI,IAAI,cAAc,OAAW,MAAK,cAAc,IAAI;AAExD,UAAM,MAAM,MAAM,KAAK,QAAiC,QAAQ,eAAe;AAAA,MAC7E;AAAA,MACA,iBAAiB,IAAI;AAAA,IACvB,CAAC;AACD,QAAI,OAAO,IAAI,WAAW,WAAW;AACnC,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAS,IAAI,UAAqB;AAAA,QAClC,WAAY,IAAI,cAA2B,CAAC;AAAA,QAC5C,qBAAsB,IAAI,wBAAmC;AAAA,QAC7D,kBAAmB,IAAI,qBAAgC;AAAA,MACzD;AAAA,IACF;AACA,WAAO,mBAAmB,GAAG;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAQ,OAAsB,OAAkC,CAAC,GAA6B;AAClG,QAAI,MAAM,WAAW,EAAG,OAAM,IAAI,gBAAgB,uCAAuC;AACzF,QAAI,MAAM,SAAS,GAAI,OAAM,IAAI,gBAAgB,kDAAkD;AACnG,UAAM,OAAO;AAAA,MACX,OAAO,MAAM,IAAI,CAAC,MAAM;AACtB,cAAM,IAA6B,EAAE,MAAM,EAAE,KAAK;AAClD,YAAI,EAAE,WAAW,OAAW,GAAE,SAAS,EAAE;AACzC,YAAI,EAAE,cAAc,OAAW,GAAE,aAAa,EAAE;AAChD,YAAI,EAAE,SAAS,OAAW,GAAE,OAAO,EAAE;AACrC,YAAI,EAAE,aAAa,OAAW,GAAE,WAAW,EAAE;AAC7C,YAAI,EAAE,eAAe,OAAW,GAAE,aAAa,EAAE;AACjD,YAAI,EAAE,cAAc,OAAW,GAAE,cAAc,EAAE;AACjD,eAAO;AAAA,MACT,CAAC;AAAA,MACD,aAAa,KAAK,eAAe;AAAA,IACnC;AACA,UAAM,MAAM,MAAM,KAAK,QAAiC,QAAQ,oBAAoB,EAAE,KAAK,CAAC;AAC5F,WAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,UAAU,IAAI;AAAA,MACd,UAAW,IAAI,WAA8C,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,QAC3E,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,QACV,WAAY,EAAE,cAA2B,CAAC;AAAA,QAC1C,QAAS,EAAE,UAA4B;AAAA,MACzC,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAA2C;AACrD,UAAM,OAAgC,EAAE,OAAO,IAAI,MAAM;AACzD,QAAI,IAAI,MAAM,OAAW,MAAK,IAAI,IAAI;AACtC,QAAI,IAAI,cAAc,OAAW,MAAK,aAAa,IAAI;AACvD,QAAI,IAAI,mBAAmB,OAAW,MAAK,kBAAkB,IAAI;AACjE,QAAI,IAAI,QAAS,MAAK,UAAU,oBAAoB,IAAI,OAAkC;AAE1F,UAAM,MAAM,MAAM,KAAK,QAAiC,QAAQ,iBAAiB,EAAE,KAAK,CAAC;AACzF,WAAO;AAAA,MACL,WAAY,IAAI,YAA+C,CAAC,GAAG,IAAI,kBAAkB;AAAA,MACzF,SAAU,IAAI,WAA6B;AAAA,MAC3C,WAAY,IAAI,cAAgC;AAAA,MAChD,WAAY,IAAI,cAAgC;AAAA,MAChD,aAAc,IAAI,gBAAkC;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,UAAyC;AACjD,QAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,YAAY,GAAG;AAChD,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACjE;AACA,UAAM,MAAM,MAAM,KAAK,QAAiC,OAAO,WAAW,QAAQ,EAAE;AACpF,WAAO,mBAAmB,GAAG;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,UAAkB,KAA2C;AACxE,QAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,YAAY,GAAG;AAChD,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACjE;AACA,UAAM,OAAgC,CAAC;AACvC,QAAI,IAAI,SAAS,OAAW,MAAK,OAAO,IAAI;AAC5C,QAAI,IAAI,eAAe,OAAW,MAAK,aAAa,IAAI;AACxD,QAAI,IAAI,aAAa,OAAW,MAAK,WAAW,IAAI;AACpD,QAAI,IAAI,WAAW,OAAW,MAAK,SAAS,IAAI;AAChD,QAAI,IAAI,cAAc,OAAW,MAAK,aAAa,IAAI;AACvD,QAAI,OAAO,KAAK,IAAI,EAAE,WAAW,GAAG;AAClC,YAAM,IAAI,gBAAgB,+CAA+C;AAAA,IAC3E;AACA,UAAM,MAAM,MAAM,KAAK,QAAiC,SAAS,WAAW,QAAQ,IAAI,EAAE,KAAK,CAAC;AAChG,WAAO,mBAAmB,GAAG;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,WAAqB,QAAoC;AACpE,QAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,UAAU,WAAW,GAAG;AACvD,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACjE;AACA,UAAM,OAAgC,EAAE,YAAY,UAAU;AAC9D,QAAI,WAAW,OAAW,MAAK,SAAS;AACxC,WAAO,MAAM,KAAK,QAAkB,UAAU,kBAAkB,EAAE,KAAK,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,UAAU,KAA8C;AAC5D,QAAI,CAAC,IAAI,aAAa,IAAI,UAAU,WAAW,GAAG;AAChD,YAAM,IAAI,gBAAgB,gCAAgC;AAAA,IAC5D;AACA,UAAM,OAAgC,EAAE,YAAY,IAAI,UAAU;AAClE,QAAI,IAAI,aAAa,OAAW,MAAK,WAAW,IAAI;AACpD,UAAM,MAAM,MAAM,KAAK,QAAiC,QAAQ,qBAAqB,EAAE,KAAK,CAAC;AAC7F,WAAO,mBAAmB,GAAG;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAQ,KAA+C;AAC3D,UAAM,OAAgC,EAAE,iBAAiB,IAAI,eAAe;AAC5E,QAAI,IAAI,YAAY,OAAW,MAAK,WAAW,IAAI;AACnD,QAAI,IAAI,cAAc,OAAW,MAAK,aAAa,IAAI;AACvD,UAAM,MAAM,MAAM,KAAK,QAAiC,QAAQ,mBAAmB,EAAE,KAAK,CAAC;AAC3F,WAAO;AAAA,MACL,gBAAiB,IAAI,mBAA8B;AAAA,MACnD,cAAe,IAAI,iBAA4B;AAAA,MAC/C,YAAa,IAAI,eAA0B;AAAA,MAC3C,WAAW,QAAQ,IAAI,SAAS;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,YAAqC;AACzC,UAAM,MAAM,MAAM,KAAK,QAAiC,OAAO,gBAAgB;AAC/E,WAAO;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,UAAW,IAAI,YAA+C,CAAC;AAAA,MAC/D,aAAa,IAAI;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,cAAsB,KAAqD;AAC9F,QAAI,CAAC,OAAO,UAAU,YAAY,KAAK,gBAAgB,GAAG;AACxD,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACrE;AACA,QAAI,iBAAiB,IAAI,YAAY;AACnC,YAAM,IAAI,gBAAgB,0DAA0D;AAAA,IACtF;AACA,UAAM,OAAgC;AAAA,MACpC,cAAc,IAAI;AAAA,MAClB,mBAAmB,IAAI;AAAA,IACzB;AACA,QAAI,IAAI,eAAe,OAAW,MAAK,aAAa,IAAI;AACxD,QAAI,IAAI,aAAa,OAAW,MAAK,WAAW,IAAI;AACpD,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB;AAAA,MACA,WAAW,YAAY;AAAA,MACvB,EAAE,KAAK;AAAA,IACT;AACA,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,cAAc,IAAI;AAAA,MAClB,YAAY,IAAI;AAAA,MAChB,kBAAkB,IAAI;AAAA,MACtB,YAAY,IAAI;AAAA,MAChB,UAAW,IAAI,YAA+C;AAAA,MAC9D,WAAW,IAAI;AAAA,IACjB;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorysync-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Official JavaScript / TypeScript client for the MemorySync API.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -10,7 +10,8 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.mjs",
12
12
  "require": "./dist/index.js"
13
- }
13
+ },
14
+ "./package.json": "./package.json"
14
15
  },
15
16
  "files": [
16
17
  "dist",