memorysync-sdk 1.1.0 → 1.1.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.d.mts CHANGED
@@ -161,6 +161,7 @@ interface AuditEventQuery {
161
161
  source?: string;
162
162
  ingestMethod?: string;
163
163
  search?: string;
164
+ includeStats?: boolean;
164
165
  }
165
166
  interface AuditActor {
166
167
  id: string;
package/dist/index.d.ts CHANGED
@@ -161,6 +161,7 @@ interface AuditEventQuery {
161
161
  source?: string;
162
162
  ingestMethod?: string;
163
163
  search?: string;
164
+ includeStats?: boolean;
164
165
  }
165
166
  interface AuditActor {
166
167
  id: string;
package/dist/index.js CHANGED
@@ -74,7 +74,7 @@ var ServerError = class extends MemorySyncError {
74
74
  };
75
75
 
76
76
  // src/control-plane.ts
77
- var SDK_VERSION = "1.1.0";
77
+ var SDK_VERSION = "1.1.1";
78
78
  function safeJson(text) {
79
79
  try {
80
80
  return JSON.parse(text);
@@ -144,7 +144,22 @@ function positiveId(value, name) {
144
144
  }
145
145
  }
146
146
  function nonEmpty(value, name) {
147
- if (!value.trim()) throw new ValidationError(`${name} must not be empty`);
147
+ if (typeof value !== "string" || !value.trim()) throw new ValidationError(`${name} must not be empty`);
148
+ }
149
+ function boundedInteger(value, name, minimum, maximum) {
150
+ if (!Number.isInteger(value) || value < minimum || value > maximum) {
151
+ throw new ValidationError(`${name} must be an integer between ${minimum} and ${maximum}`);
152
+ }
153
+ }
154
+ function nonNegativeInteger(value, name) {
155
+ if (!Number.isInteger(value) || value < 0) {
156
+ throw new ValidationError(`${name} must be a non-negative integer`);
157
+ }
158
+ }
159
+ function nonEmptyStrings(values, name) {
160
+ if (!Array.isArray(values) || values.length === 0 || values.some((value) => typeof value !== "string" || !value.trim())) {
161
+ throw new ValidationError(`${name} must contain at least one non-empty string`);
162
+ }
148
163
  }
149
164
  function webhookRetryConfig(config) {
150
165
  const wire = {};
@@ -167,9 +182,11 @@ function webhookSignatureConfig(config) {
167
182
  function validateWebhook(name, url, events) {
168
183
  nonEmpty(name, "name");
169
184
  if (name.length > 128) throw new ValidationError("name may contain at most 128 characters");
170
- if (!Array.isArray(events) || events.length === 0 || events.some((event) => !event.trim())) {
171
- throw new ValidationError("events must contain at least one non-empty event type");
172
- }
185
+ nonEmptyStrings(events, "events");
186
+ validateWebhookUrl(url);
187
+ }
188
+ function validateWebhookUrl(url) {
189
+ nonEmpty(url, "url");
173
190
  let parsed;
174
191
  try {
175
192
  parsed = new URL(url);
@@ -323,10 +340,11 @@ var ControlPlaneClient = class {
323
340
  return this.request("POST", `/auth/sessions/${sessionId}/revoke`, options);
324
341
  }
325
342
  async listAuditEvents(query = {}, options = {}) {
326
- if (query.limit !== void 0) positiveId(query.limit, "limit");
327
- if (query.cursor !== void 0) positiveId(query.cursor, "cursor");
328
- if (query.skip !== void 0 && (!Number.isInteger(query.skip) || query.skip < 0)) {
329
- throw new ValidationError("skip must be a non-negative integer");
343
+ if (query.limit !== void 0) boundedInteger(query.limit, "limit", 1, 200);
344
+ if (query.cursor !== void 0) nonNegativeInteger(query.cursor, "cursor");
345
+ if (query.skip !== void 0) nonNegativeInteger(query.skip, "skip");
346
+ if (query.sortDirection !== void 0 && query.sortDirection !== "asc" && query.sortDirection !== "desc") {
347
+ throw new ValidationError("sortDirection must be 'asc' or 'desc'");
330
348
  }
331
349
  const path = "/admin/audit-logs" + queryString({
332
350
  limit: query.limit,
@@ -347,7 +365,8 @@ var ControlPlaneClient = class {
347
365
  success: query.success,
348
366
  source: query.source,
349
367
  ingest_method: query.ingestMethod,
350
- search: query.search
368
+ search: query.search,
369
+ include_stats: query.includeStats
351
370
  });
352
371
  const raw = await this.request("GET", path, options);
353
372
  return {
@@ -358,6 +377,7 @@ var ControlPlaneClient = class {
358
377
  };
359
378
  }
360
379
  async listIntegrations(query = {}, options = {}) {
380
+ if (query.category !== void 0) nonEmpty(query.category, "category");
361
381
  const path = "/api/v1/integrations/catalog" + queryString({ category: query.category });
362
382
  return this.request("GET", path, options);
363
383
  }
@@ -388,12 +408,20 @@ var ControlPlaneClient = class {
388
408
  throw new ValidationError("description may contain at most 500 characters");
389
409
  }
390
410
  if (request.projectId !== void 0) nonEmpty(request.projectId, "projectId");
411
+ if (options.projectId !== void 0) nonEmpty(options.projectId, "projectId override");
412
+ if (request.projectId && options.projectId && request.projectId.trim() !== options.projectId.trim()) {
413
+ throw new ValidationError("request projectId and options projectId must match");
414
+ }
391
415
  const body = { name: request.name, url: request.url, events: request.events };
392
416
  if (request.description !== void 0) body.description = request.description;
393
417
  if (request.retryConfig !== void 0) body.retry_config = webhookRetryConfig(request.retryConfig);
394
418
  if (request.signatureConfig !== void 0) body.signature_config = webhookSignatureConfig(request.signatureConfig);
395
419
  if (request.projectId !== void 0) body.project_id = request.projectId;
396
- return this.request("POST", "/org/webhooks", { ...options, body });
420
+ return this.request("POST", "/org/webhooks", {
421
+ ...options,
422
+ projectId: options.projectId ?? request.projectId,
423
+ body
424
+ });
397
425
  }
398
426
  async listWebhooks(options = {}) {
399
427
  return this.request("GET", "/org/webhooks", options);
@@ -407,7 +435,7 @@ var ControlPlaneClient = class {
407
435
  body.name = request.name;
408
436
  }
409
437
  if (request.url !== void 0) {
410
- validateWebhook("update", request.url, ["validation"]);
438
+ validateWebhookUrl(request.url);
411
439
  body.url = request.url;
412
440
  }
413
441
  if (request.description !== void 0) {
@@ -417,9 +445,7 @@ var ControlPlaneClient = class {
417
445
  body.description = request.description;
418
446
  }
419
447
  if (request.events !== void 0) {
420
- if (request.events.length === 0 || request.events.some((event) => !event.trim())) {
421
- throw new ValidationError("events must contain at least one non-empty event type");
422
- }
448
+ nonEmptyStrings(request.events, "events");
423
449
  body.events = request.events;
424
450
  }
425
451
  if (request.retryConfig !== void 0) body.retry_config = webhookRetryConfig(request.retryConfig);
@@ -450,9 +476,7 @@ var ControlPlaneClient = class {
450
476
  if (request.limit !== void 0 && (!Number.isInteger(request.limit) || request.limit < 1 || request.limit > 1e3)) {
451
477
  throw new ValidationError("limit must be an integer between 1 and 1000");
452
478
  }
453
- if (request.statuses !== void 0 && (request.statuses.length === 0 || request.statuses.some((status) => !status.trim()))) {
454
- throw new ValidationError("statuses must contain at least one non-empty status");
455
- }
479
+ if (request.statuses !== void 0) nonEmptyStrings(request.statuses, "statuses");
456
480
  const body = {};
457
481
  if (request.sinceMinutes !== void 0) body.since_minutes = request.sinceMinutes;
458
482
  if (request.statuses !== void 0) body.statuses = request.statuses;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/control-plane.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\nimport {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nexport {\r\n AuthError,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\ntype ErrorOpts = ErrorOptions;\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.1.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\r\nexport * from \"./control-plane\";\r\n","export interface ErrorOptions {\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\r\n constructor(message: string, options: ErrorOptions = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = options.statusCode;\r\n this.response = options.response;\r\n this.requestId = options.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n\r\n constructor(message: string, retryAfterSeconds: number, options?: ErrorOptions) {\r\n super(message, options);\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, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n","import {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nconst SDK_VERSION = \"1.1.0\";\r\n\r\nexport interface ControlPlaneConfig {\r\n baseUrl: string;\r\n accessToken?: string;\r\n projectId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface ControlPlaneRequestOptions {\r\n projectId?: string;\r\n}\r\n\r\nexport interface LoginRequest {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport interface LoginResponse {\r\n tokens: {\r\n accessToken: string;\r\n refreshToken: string;\r\n tokenType: string;\r\n };\r\n session: {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n };\r\n mfaRequired: boolean;\r\n mfaSetupRequired: boolean;\r\n}\r\n\r\nexport type ApiKeyTestStatus = \"active\" | \"revoked\" | \"expired\" | string;\r\nexport interface BulkRevokeApiKeysRequest {\r\n keyIds: number[];\r\n}\r\n\r\nexport interface BulkRevokeApiKeyResult {\r\n keyId: number;\r\n status: \"revoked\" | \"already_revoked\" | \"not_found\" | \"forbidden\";\r\n}\r\n\r\nexport interface BulkRevokeApiKeysResponse {\r\n revoked: number;\r\n alreadyRevoked: number;\r\n notFound: number;\r\n results: BulkRevokeApiKeyResult[];\r\n}\r\n\r\nexport interface ApiKeyTestResponse {\r\n keyId: number;\r\n valid: boolean;\r\n status: ApiKeyTestStatus;\r\n environment: string;\r\n rateLimitTier: string;\r\n scopes: string[];\r\n projectId: string | null;\r\n lastUsedAt: string | null;\r\n expiresAt: string | null;\r\n expired: boolean;\r\n serverTime: string;\r\n}\r\n\r\nexport interface PlanLimits {\r\n addRequests: number | null;\r\n retrievalRequests: number | null;\r\n}\r\n\r\nexport interface Plan {\r\n id: string;\r\n name: string;\r\n priceCents?: number | null;\r\n priceLabel: string;\r\n description?: string;\r\n limits: PlanLimits;\r\n features?: string[];\r\n ctaLabel?: string;\r\n isEnterprise?: boolean;\r\n}\r\n\r\nexport interface CurrentPlanResponse {\r\n plan: Plan;\r\n status: string;\r\n billingPeriodStart: string | null;\r\n billingPeriodEnd: string | null;\r\n nextResetAt?: string | null;\r\n planLimitAdd?: number | null;\r\n planLimitRetrieval?: number | null;\r\n paymentFailed: boolean;\r\n paymentStatus?: string;\r\n scheduledPlanId: string | null;\r\n cancelAtPeriodEnd: boolean;\r\n}\r\nexport interface TeamMember {\r\n id: string;\r\n name: string;\r\n email: string;\r\n role: string;\r\n status: string;\r\n lastActive?: string | null;\r\n mfaEnabled: boolean;\r\n authMethod: string;\r\n loginProvider?: string;\r\n devices?: number;\r\n sessions: number;\r\n isScimManaged?: boolean;\r\n}\r\n\r\nexport interface Session {\r\n id: number;\r\n isCurrent: boolean;\r\n sessionType: string;\r\n sessionName: string;\r\n userAgent: string;\r\n ip: string;\r\n location: string | null;\r\n geo: Record<string, unknown> | null;\r\n createdAt: string;\r\n lastActivityAt: string;\r\n expiresAt: string;\r\n}\r\n\r\nexport interface SessionListResponse {\r\n sessions: Session[];\r\n currentSessionId: number | null;\r\n}\r\n\r\nexport type AuditSortDirection = \"asc\" | \"desc\";\r\n\r\nexport interface AuditEventQuery {\r\n limit?: number;\r\n cursor?: number;\r\n skip?: number;\r\n sortDirection?: AuditSortDirection;\r\n tenantId?: string;\r\n actor?: string;\r\n actorEmail?: string;\r\n ip?: string;\r\n action?: string;\r\n resourceType?: string;\r\n resourceId?: string;\r\n severity?: string;\r\n category?: string;\r\n start?: string;\r\n end?: string;\r\n success?: boolean;\r\n source?: string;\r\n ingestMethod?: string;\r\n search?: string;\r\n}\r\n\r\nexport interface AuditActor {\r\n id: string;\r\n email: string | null;\r\n name: string | null;\r\n type: string;\r\n}\r\n\r\nexport interface AuditResource {\r\n type: string;\r\n id: string;\r\n label: string | null;\r\n}\r\nexport interface AuditEvent {\r\n id: number;\r\n eventId: string;\r\n timestamp: string;\r\n category: string;\r\n actor: AuditActor;\r\n action: string;\r\n resource: AuditResource;\r\n severity: string;\r\n success: boolean;\r\n metadata?: Record<string, unknown> | null;\r\n}\r\n\r\nexport interface AuditEventListResponse {\r\n events: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n}\r\n\r\nexport interface IntegrationQuery {\r\n category?: string;\r\n}\r\n\r\nexport interface Integration {\r\n id: string;\r\n name: string;\r\n description: string;\r\n category: string;\r\n features: string[];\r\n authType: string;\r\n isConfigured: boolean;\r\n isConnected: boolean;\r\n comingSoon: boolean;\r\n}\r\n\r\nexport interface CreateOrganizationRequest {\r\n name: string;\r\n domain?: string;\r\n}\r\n\r\nexport interface OrganizationMembership {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n}\r\n\r\nexport interface OrganizationSettingsQuery {\r\n tenantId?: string;\r\n}\r\n\r\nexport interface OrganizationSettings {\r\n tenantId: string;\r\n tenantName: string;\r\n tenantSlug: string;\r\n description: string | null;\r\n plan: string;\r\n status: string;\r\n createdAt: string;\r\n contactEmail: string | null;\r\n customDomain: string | null;\r\n customDomainVerified: boolean;\r\n logoUrl: string | null;\r\n totalMemories: number;\r\n activeUsers: number;\r\n organizationName: string;\r\n scheduledDeletionAt: string | null;\r\n mfaEnrolled: boolean;\r\n passwordEnabled: boolean;\r\n}\r\nexport interface Project {\r\n id: string;\r\n name: string;\r\n tenantId: string;\r\n isDefault: boolean;\r\n memoryCount: number;\r\n archivedAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface WebhookRetryConfig {\r\n enabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n}\r\n\r\nexport interface WebhookSignatureConfig {\r\n algorithm?: \"hmac-sha256\" | \"hmac-sha512\";\r\n headerName?: string;\r\n timestampHeader?: string;\r\n toleranceSeconds?: number;\r\n}\r\n\r\nexport interface CreateWebhookRequest {\r\n name: string;\r\n url: string;\r\n events: string[];\r\n description?: string;\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n projectId?: string;\r\n}\r\n\r\nexport interface UpdateWebhookRequest {\r\n name?: string;\r\n url?: string;\r\n description?: string;\r\n events?: string[];\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n}\r\n\r\nexport interface Webhook {\r\n id: number;\r\n name: string;\r\n url: string;\r\n description: string | null;\r\n secretPrefix: string;\r\n events: string[];\r\n enabled: boolean;\r\n signatureAlgorithm: string;\r\n signatureHeader?: string;\r\n timestampHeader?: string;\r\n signatureTolerance?: number;\r\n retryEnabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n totalDeliveries?: number;\r\n successfulDeliveries?: number;\r\n failedDeliveries?: number;\r\n consecutiveFailures?: number;\r\n successRate?: number;\r\n lastTriggeredAt?: string | null;\r\n lastSuccessAt?: string | null;\r\n lastFailureAt?: string | null;\r\n lastError?: string | null;\r\n lastStatusCode?: number | null;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n createdByName?: string | null;\r\n projectId: string | null;\r\n}\r\n\r\nexport interface CreatedWebhook extends Webhook {\r\n secret: string;\r\n}\r\n\r\nexport interface WebhookListResponse {\r\n endpoints: Webhook[];\r\n totalEndpoints: number;\r\n activeEndpoints: number;\r\n totalDeliveries: number;\r\n avgSuccessRate: number;\r\n failingEndpoints: number;\r\n}\r\n\r\nexport interface TestWebhookRequest {\r\n eventType?: string;\r\n}\r\n\r\nexport interface TestWebhookResponse {\r\n deliveryId: number;\r\n eventId: string;\r\n eventType: string;\r\n endpointId: number;\r\n status: string;\r\n payload: Record<string, unknown>;\r\n message: string;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesRequest {\r\n sinceMinutes?: number;\r\n statuses?: string[];\r\n limit?: number;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesResponse {\r\n endpointId: number;\r\n eligible: number;\r\n replayed: number;\r\n skipped: number;\r\n deliveryIds: number[];\r\n}\r\n\r\nexport interface WebhookDeliveryQuery {\r\n page?: number;\r\n pageSize?: number;\r\n status?: string;\r\n}\r\nexport interface WebhookDelivery {\r\n id: number;\r\n endpointId: number;\r\n eventType: string;\r\n eventId: string;\r\n status: string;\r\n payload?: Record<string, unknown>;\r\n payloadHash: string;\r\n signature?: string | null;\r\n statusCode: number | null;\r\n responseBody?: string | null;\r\n errorMessage?: string | null;\r\n latencyMs: number | null;\r\n attemptNumber: number;\r\n maxAttempts: number;\r\n nextRetryAt?: string | null;\r\n createdAt: string;\r\n completedAt: string | null;\r\n}\r\n\r\nexport interface WebhookDeliveryListResponse {\r\n deliveries: WebhookDelivery[];\r\n total: number;\r\n page: number;\r\n pageSize: number;\r\n}\r\n\r\ntype QueryValue = string | number | boolean | null | undefined;\r\ntype WireObject = Record<string, unknown>;\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 value = body as Record<string, unknown>;\r\n if (typeof value.detail === \"string\") return value.detail;\r\n if (value.error && typeof value.error === \"object\") {\r\n const error = value.error as Record<string, unknown>;\r\n if (typeof error.message === \"string\") return error.message;\r\n }\r\n if (Array.isArray(value.detail) && value.detail.length > 0) {\r\n const first = value.detail[0];\r\n if (first && typeof first === \"object\" && typeof (first as Record<string, unknown>).msg === \"string\") {\r\n return (first as Record<string, unknown>).msg as string;\r\n }\r\n }\r\n return undefined;\r\n}\r\nfunction extractBodyRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const value = body as Record<string, unknown>;\r\n if (typeof value.retry_after === \"number\") return value.retry_after;\r\n if (value.error && typeof value.error === \"object\") {\r\n const retryAfter = (value.error as Record<string, unknown>).retry_after;\r\n if (typeof retryAfter === \"number\") return retryAfter;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction parseRetryAfter(value: string | null): number | undefined {\r\n if (!value) return undefined;\r\n const seconds = Number(value);\r\n if (Number.isFinite(seconds) && seconds >= 0) return seconds;\r\n const date = Date.parse(value);\r\n if (Number.isNaN(date)) return undefined;\r\n return Math.max(0, Math.ceil((date - Date.now()) / 1000));\r\n}\r\n\r\nfunction snakeToCamel(key: string): string {\r\n return key.replace(/_([a-z0-9])/g, (_, character: string) => character.toUpperCase());\r\n}\r\n\r\nconst OPAQUE_RESPONSE_KEYS = new Set([\"payload\", \"metadata\", \"geo\", \"configuration\"]);\r\n\r\nfunction normalizeResponse(value: unknown): unknown {\r\n if (Array.isArray(value)) return value.map(normalizeResponse);\r\n if (!value || typeof value !== \"object\") return value;\r\n const normalized: Record<string, unknown> = {};\r\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\r\n const camelKey = snakeToCamel(key);\r\n normalized[camelKey] = OPAQUE_RESPONSE_KEYS.has(camelKey) ? item : normalizeResponse(item);\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction queryString(values: Record<string, QueryValue>): string {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(values)) {\r\n if (value !== undefined && value !== null) params.set(key, String(value));\r\n }\r\n const encoded = params.toString();\r\n return encoded ? `?${encoded}` : \"\";\r\n}\r\n\r\nfunction positiveId(value: number, name: string): void {\r\n if (!Number.isInteger(value) || value <= 0) {\r\n throw new ValidationError(`${name} must be a positive integer`);\r\n }\r\n}\r\n\r\nfunction nonEmpty(value: string, name: string): void {\r\n if (!value.trim()) throw new ValidationError(`${name} must not be empty`);\r\n}\r\nfunction webhookRetryConfig(config: WebhookRetryConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.enabled !== undefined) wire.enabled = config.enabled;\r\n if (config.maxRetries !== undefined) wire.max_retries = config.maxRetries;\r\n if (config.initialDelaySeconds !== undefined) wire.initial_delay_seconds = config.initialDelaySeconds;\r\n if (config.maxDelaySeconds !== undefined) wire.max_delay_seconds = config.maxDelaySeconds;\r\n if (config.backoffMultiplier !== undefined) wire.backoff_multiplier = config.backoffMultiplier;\r\n if (config.retryStatusCodes !== undefined) wire.retry_status_codes = config.retryStatusCodes;\r\n return wire;\r\n}\r\n\r\nfunction webhookSignatureConfig(config: WebhookSignatureConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.algorithm !== undefined) wire.algorithm = config.algorithm;\r\n if (config.headerName !== undefined) wire.header_name = config.headerName;\r\n if (config.timestampHeader !== undefined) wire.timestamp_header = config.timestampHeader;\r\n if (config.toleranceSeconds !== undefined) wire.tolerance_seconds = config.toleranceSeconds;\r\n return wire;\r\n}\r\n\r\nfunction validateWebhook(name: string, url: string, events: string[]): void {\r\n nonEmpty(name, \"name\");\r\n if (name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n if (!Array.isArray(events) || events.length === 0 || events.some((event) => !event.trim())) {\r\n throw new ValidationError(\"events must contain at least one non-empty event type\");\r\n }\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(url);\r\n } catch {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.username || parsed.password) throw new ValidationError(\"url must not contain credentials\");\r\n}\r\n\r\ninterface RequestOptions extends ControlPlaneRequestOptions {\r\n body?: unknown;\r\n auth?: boolean;\r\n}\r\n\r\nexport class ControlPlaneClient {\r\n private readonly baseUrl: string;\r\n private readonly accessToken?: string;\r\n private readonly projectId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n constructor(config: ControlPlaneConfig) {\r\n if (!config.baseUrl?.trim()) throw new ValidationError(\"baseUrl is required\");\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(config.baseUrl);\r\n } catch {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (config.accessToken !== undefined && !config.accessToken.trim()) {\r\n throw new ValidationError(\"accessToken must not be empty when provided\");\r\n }\r\n if (config.projectId !== undefined && !config.projectId.trim()) {\r\n throw new ValidationError(\"projectId must not be empty when provided\");\r\n }\r\n if (config.timeoutMs !== undefined && (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)) {\r\n throw new ValidationError(\"timeoutMs must be greater than zero\");\r\n }\r\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\r\n this.accessToken = config.accessToken?.trim();\r\n this.projectId = config.projectId?.trim();\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const implementation = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!implementation) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = implementation;\r\n }\r\n\r\n private async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\r\n const requiresAuth = options.auth !== false;\r\n if (requiresAuth && !this.accessToken) {\r\n throw new AuthError(\"accessToken is required for this operation\");\r\n }\r\n if (options.projectId !== undefined && !options.projectId.trim()) {\r\n throw new ValidationError(\"projectId override must not be empty\");\r\n }\r\n const headers: Record<string, string> = {\r\n Accept: \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n };\r\n if (requiresAuth) headers.Authorization = `Bearer ${this.accessToken}`;\r\n const selectedProject = options.projectId?.trim() ?? this.projectId;\r\n if (selectedProject) headers[\"X-Project-ID\"] = selectedProject;\r\n if (options.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\r\n\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\r\n method,\r\n headers,\r\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\r\n signal: controller.signal,\r\n });\r\n const requestId = response.headers.get(\"X-Request-ID\") ?? undefined;\r\n if (response.status === 204) return undefined as T;\r\n const text = await response.text();\r\n const parsedBody = text ? safeJson(text) : null;\r\n if (!response.ok) {\r\n this.throwForStatus(response.status, parsedBody, requestId, response.headers.get(\"Retry-After\"));\r\n }\r\n return normalizeResponse(parsedBody) as T;\r\n } catch (error) {\r\n if (error instanceof MemorySyncError) throw error;\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new MemorySyncError(`Network error: ${message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n private throwForStatus(\r\n status: number,\r\n body: unknown,\r\n requestId: string | undefined,\r\n retryAfterHeader: string | null,\r\n ): never {\r\n const detail = extractDetail(body);\r\n const options: ErrorOptions = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", options);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", options);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", options);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", options);\r\n }\r\n if (status === 429) {\r\n const retryAfter = parseRetryAfter(retryAfterHeader) ?? extractBodyRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, options);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, options);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, options);\r\n }\r\n\r\n async bulkRevokeApiKeys(\r\n request: BulkRevokeApiKeysRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<BulkRevokeApiKeysResponse> {\r\n if (!Array.isArray(request.keyIds) || request.keyIds.length < 1 || request.keyIds.length > 100) {\r\n throw new ValidationError(\"keyIds must contain between 1 and 100 entries\");\r\n }\r\n request.keyIds.forEach((id) => positiveId(id, \"keyIds entry\"));\r\n return this.request(\"POST\", \"/org/api-keys/bulk-revoke\", {\r\n ...options,\r\n body: { key_ids: request.keyIds },\r\n });\r\n }\r\n\r\n async testApiKey(keyId: number, options: ControlPlaneRequestOptions = {}): Promise<ApiKeyTestResponse> {\r\n positiveId(keyId, \"keyId\");\r\n return this.request(\"POST\", `/org/api-keys/${keyId}/test`, options);\r\n }\r\n\r\n async login(request: LoginRequest, options: ControlPlaneRequestOptions = {}): Promise<LoginResponse> {\r\n nonEmpty(request.email, \"email\");\r\n nonEmpty(request.password, \"password\");\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(request.email)) {\r\n throw new ValidationError(\"email must be a valid email address\");\r\n }\r\n return this.request(\"POST\", \"/auth/login\", {\r\n ...options,\r\n auth: false,\r\n body: { email: request.email, password: request.password },\r\n });\r\n }\r\n\r\n async getCurrentPlan(options: ControlPlaneRequestOptions = {}): Promise<CurrentPlanResponse> {\r\n return this.request(\"GET\", \"/org/billing/current-plan\", options);\r\n }\r\n async listTeamMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.request(\"GET\", \"/admin/team/members\", options);\r\n }\r\n\r\n async suspendTeamMember(\r\n memberId: number,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TeamMember> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"PATCH\", `/admin/team/members/${memberId}`, {\r\n ...options,\r\n body: { status: \"suspended\" },\r\n });\r\n }\r\n\r\n async removeTeamMember(memberId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"DELETE\", `/admin/team/members/${memberId}`, options);\r\n }\r\n\r\n async listSessions(options: ControlPlaneRequestOptions = {}): Promise<SessionListResponse> {\r\n return this.request(\"GET\", \"/auth/sessions\", options);\r\n }\r\n\r\n async revokeSession(sessionId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(sessionId, \"sessionId\");\r\n return this.request(\"POST\", `/auth/sessions/${sessionId}/revoke`, options);\r\n }\r\n\r\n async listAuditEvents(\r\n query: AuditEventQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<AuditEventListResponse> {\r\n if (query.limit !== undefined) positiveId(query.limit, \"limit\");\r\n if (query.cursor !== undefined) positiveId(query.cursor, \"cursor\");\r\n if (query.skip !== undefined && (!Number.isInteger(query.skip) || query.skip < 0)) {\r\n throw new ValidationError(\"skip must be a non-negative integer\");\r\n }\r\n const path = \"/admin/audit-logs\" + queryString({\r\n limit: query.limit,\r\n cursor: query.cursor,\r\n skip: query.skip,\r\n sort: query.sortDirection,\r\n tenant_id: query.tenantId,\r\n actor: query.actor,\r\n actor_email: query.actorEmail,\r\n ip: query.ip,\r\n action: query.action,\r\n resource_type: query.resourceType,\r\n resource_id: query.resourceId,\r\n severity: query.severity,\r\n category: query.category,\r\n start: query.start,\r\n end: query.end,\r\n success: query.success,\r\n source: query.source,\r\n ingest_method: query.ingestMethod,\r\n search: query.search,\r\n });\r\n const raw = await this.request<{\r\n logs: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n }>(\"GET\", path, options);\r\n return {\r\n events: raw.logs ?? [],\r\n nextCursor: raw.nextCursor ?? null,\r\n stats: raw.stats ?? null,\r\n sort: raw.sort ?? query.sortDirection ?? \"desc\",\r\n };\r\n }\r\n async listIntegrations(\r\n query: IntegrationQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Integration[]> {\r\n const path = \"/api/v1/integrations/catalog\" + queryString({ category: query.category });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async createOrganization(\r\n request: CreateOrganizationRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationMembership> {\r\n nonEmpty(request.name, \"name\");\r\n if (request.domain !== undefined) nonEmpty(request.domain, \"domain\");\r\n const body: WireObject = { name: request.name };\r\n if (request.domain !== undefined) body.domain = request.domain;\r\n return this.request(\"POST\", \"/organizations\", { ...options, body });\r\n }\r\n\r\n async listOrganizations(options: ControlPlaneRequestOptions = {}): Promise<OrganizationMembership[]> {\r\n return this.request(\"GET\", \"/organizations\", options);\r\n }\r\n\r\n async listOrganizationMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.listTeamMembers(options);\r\n }\r\n\r\n async getOrganizationSettings(\r\n query: OrganizationSettingsQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationSettings> {\r\n if (query.tenantId !== undefined) nonEmpty(query.tenantId, \"tenantId\");\r\n const path = \"/admin/tenant-settings\" + queryString({ tenant_id: query.tenantId });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async listProjects(options: ControlPlaneRequestOptions = {}): Promise<Project[]> {\r\n return this.request(\"GET\", \"/org/projects\", options);\r\n }\r\n\r\n async createWebhook(\r\n request: CreateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<CreatedWebhook> {\r\n validateWebhook(request.name, request.url, request.events);\r\n if (request.description !== undefined && request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n if (request.projectId !== undefined) nonEmpty(request.projectId, \"projectId\");\r\n const body: WireObject = { name: request.name, url: request.url, events: request.events };\r\n if (request.description !== undefined) body.description = request.description;\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (request.projectId !== undefined) body.project_id = request.projectId;\r\n return this.request(\"POST\", \"/org/webhooks\", { ...options, body });\r\n }\r\n async listWebhooks(options: ControlPlaneRequestOptions = {}): Promise<WebhookListResponse> {\r\n return this.request(\"GET\", \"/org/webhooks\", options);\r\n }\r\n\r\n async updateWebhook(\r\n endpointId: number,\r\n request: UpdateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Webhook> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.name !== undefined) {\r\n nonEmpty(request.name, \"name\");\r\n if (request.name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n body.name = request.name;\r\n }\r\n if (request.url !== undefined) {\r\n validateWebhook(\"update\", request.url, [\"validation\"]);\r\n body.url = request.url;\r\n }\r\n if (request.description !== undefined) {\r\n if (request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n body.description = request.description;\r\n }\r\n if (request.events !== undefined) {\r\n if (request.events.length === 0 || request.events.some((event) => !event.trim())) {\r\n throw new ValidationError(\"events must contain at least one non-empty event type\");\r\n }\r\n body.events = request.events;\r\n }\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"updateWebhook requires at least one editable field\");\r\n }\r\n return this.request(\"PATCH\", `/org/webhooks/${endpointId}`, { ...options, body });\r\n }\r\n\r\n async deleteWebhook(endpointId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(endpointId, \"endpointId\");\r\n return this.request(\"DELETE\", `/org/webhooks/${endpointId}`, options);\r\n }\r\n\r\n async testWebhook(\r\n endpointId: number,\r\n request: TestWebhookRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TestWebhookResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.eventType !== undefined) {\r\n nonEmpty(request.eventType, \"eventType\");\r\n body.event_type = request.eventType;\r\n }\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/test`, { ...options, body });\r\n }\r\n async replayWebhookDeliveries(\r\n endpointId: number,\r\n request: ReplayWebhookDeliveriesRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<ReplayWebhookDeliveriesResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (request.sinceMinutes !== undefined &&\r\n (!Number.isInteger(request.sinceMinutes) || request.sinceMinutes < 1 || request.sinceMinutes > 10_080)) {\r\n throw new ValidationError(\"sinceMinutes must be an integer between 1 and 10080\");\r\n }\r\n if (request.limit !== undefined &&\r\n (!Number.isInteger(request.limit) || request.limit < 1 || request.limit > 1_000)) {\r\n throw new ValidationError(\"limit must be an integer between 1 and 1000\");\r\n }\r\n if (request.statuses !== undefined &&\r\n (request.statuses.length === 0 || request.statuses.some((status) => !status.trim()))) {\r\n throw new ValidationError(\"statuses must contain at least one non-empty status\");\r\n }\r\n const body: WireObject = {};\r\n if (request.sinceMinutes !== undefined) body.since_minutes = request.sinceMinutes;\r\n if (request.statuses !== undefined) body.statuses = request.statuses;\r\n if (request.limit !== undefined) body.limit = request.limit;\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/replay`, { ...options, body });\r\n }\r\n\r\n async listWebhookDeliveries(\r\n endpointId: number,\r\n query: WebhookDeliveryQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<WebhookDeliveryListResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (query.page !== undefined) positiveId(query.page, \"page\");\r\n if (query.pageSize !== undefined &&\r\n (!Number.isInteger(query.pageSize) || query.pageSize < 1 || query.pageSize > 100)) {\r\n throw new ValidationError(\"pageSize must be an integer between 1 and 100\");\r\n }\r\n if (query.status !== undefined) nonEmpty(query.status, \"status\");\r\n const path = `/org/webhooks/${endpointId}/deliveries` + queryString({\r\n page: query.page,\r\n page_size: query.pageSize,\r\n status_filter: query.status,\r\n });\r\n return this.request(\"GET\", path, options);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAKzC,YAAY,SAAiB,UAAwB,CAAC,GAAG;AACvD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,QAAQ;AACxB,SAAK,YAAY,QAAQ;AAAA,EAC3B;AACF;AAEO,IAAM,YAAN,cAAwB,gBAAgB;AAAA,EAC7C,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,gBAAgB;AAAA,EACnD,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,gBAAgB;AAAA,EACjD,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AACO,IAAM,iBAAN,cAA6B,gBAAgB;AAAA,EAGlD,YAAY,SAAiB,mBAA2B,SAAwB;AAC9E,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AACZ,SAAK,oBAAoB;AAAA,EAC3B;AACF;AAEO,IAAM,cAAN,cAA0B,gBAAgB;AAAA,EAC/C,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;;;AC7CA,IAAM,cAAc;AAuYpB,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,QAAQ;AACd,MAAI,OAAO,MAAM,WAAW,SAAU,QAAO,MAAM;AACnD,MAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UAAU;AAClD,UAAM,QAAQ,MAAM;AACpB,QAAI,OAAO,MAAM,YAAY,SAAU,QAAO,MAAM;AAAA,EACtD;AACA,MAAI,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,GAAG;AAC1D,UAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,QAAI,SAAS,OAAO,UAAU,YAAY,OAAQ,MAAkC,QAAQ,UAAU;AACpG,aAAQ,MAAkC;AAAA,IAC5C;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,sBAAsB,MAAuB;AACpD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,QAAQ;AACd,MAAI,OAAO,MAAM,gBAAgB,SAAU,QAAO,MAAM;AACxD,MAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UAAU;AAClD,UAAM,aAAc,MAAM,MAAkC;AAC5D,QAAI,OAAO,eAAe,SAAU,QAAO;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA0C;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,OAAO,SAAS,OAAO,KAAK,WAAW,EAAG,QAAO;AACrD,QAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,MAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,IAAI,KAAK,GAAI,CAAC;AAC1D;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,QAAQ,gBAAgB,CAAC,GAAG,cAAsB,UAAU,YAAY,CAAC;AACtF;AAEA,IAAM,uBAAuB,oBAAI,IAAI,CAAC,WAAW,YAAY,OAAO,eAAe,CAAC;AAEpF,SAAS,kBAAkB,OAAyB;AAClD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,iBAAiB;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC1E,UAAM,WAAW,aAAa,GAAG;AACjC,eAAW,QAAQ,IAAI,qBAAqB,IAAI,QAAQ,IAAI,OAAO,kBAAkB,IAAI;AAAA,EAC3F;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAA4C;AAC/D,QAAM,SAAS,IAAI,gBAAgB;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EAC1E;AACA,QAAM,UAAU,OAAO,SAAS;AAChC,SAAO,UAAU,IAAI,OAAO,KAAK;AACnC;AAEA,SAAS,WAAW,OAAe,MAAoB;AACrD,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,UAAM,IAAI,gBAAgB,GAAG,IAAI,6BAA6B;AAAA,EAChE;AACF;AAEA,SAAS,SAAS,OAAe,MAAoB;AACnD,MAAI,CAAC,MAAM,KAAK,EAAG,OAAM,IAAI,gBAAgB,GAAG,IAAI,oBAAoB;AAC1E;AACA,SAAS,mBAAmB,QAAwC;AAClE,QAAM,OAAmB,CAAC;AAC1B,MAAI,OAAO,YAAY,OAAW,MAAK,UAAU,OAAO;AACxD,MAAI,OAAO,eAAe,OAAW,MAAK,cAAc,OAAO;AAC/D,MAAI,OAAO,wBAAwB,OAAW,MAAK,wBAAwB,OAAO;AAClF,MAAI,OAAO,oBAAoB,OAAW,MAAK,oBAAoB,OAAO;AAC1E,MAAI,OAAO,sBAAsB,OAAW,MAAK,qBAAqB,OAAO;AAC7E,MAAI,OAAO,qBAAqB,OAAW,MAAK,qBAAqB,OAAO;AAC5E,SAAO;AACT;AAEA,SAAS,uBAAuB,QAA4C;AAC1E,QAAM,OAAmB,CAAC;AAC1B,MAAI,OAAO,cAAc,OAAW,MAAK,YAAY,OAAO;AAC5D,MAAI,OAAO,eAAe,OAAW,MAAK,cAAc,OAAO;AAC/D,MAAI,OAAO,oBAAoB,OAAW,MAAK,mBAAmB,OAAO;AACzE,MAAI,OAAO,qBAAqB,OAAW,MAAK,oBAAoB,OAAO;AAC3E,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAc,KAAa,QAAwB;AAC1E,WAAS,MAAM,MAAM;AACrB,MAAI,KAAK,SAAS,IAAK,OAAM,IAAI,gBAAgB,yCAAyC;AAC1F,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,KAAK,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG;AAC1F,UAAM,IAAI,gBAAgB,uDAAuD;AAAA,EACnF;AACA,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,GAAG;AAAA,EACtB,QAAQ;AACN,UAAM,IAAI,gBAAgB,uCAAuC;AAAA,EACnE;AACA,MAAI,OAAO,aAAa,WAAW,OAAO,aAAa,UAAU;AAC/D,UAAM,IAAI,gBAAgB,uCAAuC;AAAA,EACnE;AACA,MAAI,OAAO,YAAY,OAAO,SAAU,OAAM,IAAI,gBAAgB,kCAAkC;AACtG;AAOO,IAAM,qBAAN,MAAyB;AAAA,EAM9B,YAAY,QAA4B;AACtC,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,OAAM,IAAI,gBAAgB,qBAAqB;AAC5E,QAAI;AACJ,QAAI;AACF,eAAS,IAAI,IAAI,OAAO,OAAO;AAAA,IACjC,QAAQ;AACN,YAAM,IAAI,gBAAgB,+CAA+C;AAAA,IAC3E;AACA,QAAI,OAAO,aAAa,WAAW,OAAO,aAAa,UAAU;AAC/D,YAAM,IAAI,gBAAgB,+CAA+C;AAAA,IAC3E;AACA,QAAI,OAAO,gBAAgB,UAAa,CAAC,OAAO,YAAY,KAAK,GAAG;AAClE,YAAM,IAAI,gBAAgB,6CAA6C;AAAA,IACzE;AACA,QAAI,OAAO,cAAc,UAAa,CAAC,OAAO,UAAU,KAAK,GAAG;AAC9D,YAAM,IAAI,gBAAgB,2CAA2C;AAAA,IACvE;AACA,QAAI,OAAO,cAAc,WAAc,CAAC,OAAO,SAAS,OAAO,SAAS,KAAK,OAAO,aAAa,IAAI;AACnG,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACjE;AACA,SAAK,UAAU,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AAChD,SAAK,cAAc,OAAO,aAAa,KAAK;AAC5C,SAAK,YAAY,OAAO,WAAW,KAAK;AACxC,SAAK,YAAY,OAAO,aAAa;AACrC,UAAM,iBAAiB,OAAO,UAAU,OAAO,UAAU,cAAc,QAAQ;AAC/E,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,4EAA4E;AAAA,IAC9F;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAc,QAAW,QAAgB,MAAc,UAA0B,CAAC,GAAe;AAC/F,UAAM,eAAe,QAAQ,SAAS;AACtC,QAAI,gBAAgB,CAAC,KAAK,aAAa;AACrC,YAAM,IAAI,UAAU,4CAA4C;AAAA,IAClE;AACA,QAAI,QAAQ,cAAc,UAAa,CAAC,QAAQ,UAAU,KAAK,GAAG;AAChE,YAAM,IAAI,gBAAgB,sCAAsC;AAAA,IAClE;AACA,UAAM,UAAkC;AAAA,MACtC,QAAQ;AAAA,MACR,cAAc,qBAAqB,WAAW;AAAA,IAChD;AACA,QAAI,aAAc,SAAQ,gBAAgB,UAAU,KAAK,WAAW;AACpE,UAAM,kBAAkB,QAAQ,WAAW,KAAK,KAAK,KAAK;AAC1D,QAAI,gBAAiB,SAAQ,cAAc,IAAI;AAC/C,QAAI,QAAQ,SAAS,OAAW,SAAQ,cAAc,IAAI;AAE1D,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,QAC9D;AAAA,QACA;AAAA,QACA,MAAM,QAAQ,SAAS,SAAY,SAAY,KAAK,UAAU,QAAQ,IAAI;AAAA,QAC1E,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,YAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAI,SAAS,WAAW,IAAK,QAAO;AACpC,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,aAAa,OAAO,SAAS,IAAI,IAAI;AAC3C,UAAI,CAAC,SAAS,IAAI;AAChB,aAAK,eAAe,SAAS,QAAQ,YAAY,WAAW,SAAS,QAAQ,IAAI,aAAa,CAAC;AAAA,MACjG;AACA,aAAO,kBAAkB,UAAU;AAAA,IACrC,SAAS,OAAO;AACd,UAAI,iBAAiB,gBAAiB,OAAM;AAC5C,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,cAAM,IAAI,gBAAgB,2BAA2B,KAAK,SAAS,IAAI;AAAA,MACzE;AACA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,IAAI,gBAAgB,kBAAkB,OAAO,EAAE;AAAA,IACvD,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EACQ,eACN,QACA,MACA,WACA,kBACO;AACP,UAAM,SAAS,cAAc,IAAI;AACjC,UAAM,UAAwB,EAAE,YAAY,QAAQ,UAAU,MAAM,UAAU;AAC9E,QAAI,WAAW,IAAK,OAAM,IAAI,UAAU,UAAU,mBAAmB,OAAO;AAC5E,QAAI,WAAW,IAAK,OAAM,IAAI,UAAU,UAAU,aAAa,OAAO;AACtE,QAAI,WAAW,IAAK,OAAM,IAAI,cAAc,UAAU,aAAa,OAAO;AAC1E,QAAI,WAAW,OAAO,WAAW,OAAO,WAAW,KAAK;AACtD,YAAM,IAAI,gBAAgB,UAAU,oBAAoB,OAAO;AAAA,IACjE;AACA,QAAI,WAAW,KAAK;AAClB,YAAM,aAAa,gBAAgB,gBAAgB,KAAK,sBAAsB,IAAI;AAClF,YAAM,IAAI,eAAe,UAAU,gBAAgB,YAAY,OAAO;AAAA,IACxE;AACA,QAAI,UAAU,IAAK,OAAM,IAAI,YAAY,UAAU,iBAAiB,MAAM,KAAK,OAAO;AACtF,UAAM,IAAI,gBAAgB,UAAU,qBAAqB,MAAM,IAAI,OAAO;AAAA,EAC5E;AAAA,EAEA,MAAM,kBACJ,SACA,UAAsC,CAAC,GACH;AACpC,QAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,OAAO,SAAS,KAAK,QAAQ,OAAO,SAAS,KAAK;AAC9F,YAAM,IAAI,gBAAgB,+CAA+C;AAAA,IAC3E;AACA,YAAQ,OAAO,QAAQ,CAAC,OAAO,WAAW,IAAI,cAAc,CAAC;AAC7D,WAAO,KAAK,QAAQ,QAAQ,6BAA6B;AAAA,MACvD,GAAG;AAAA,MACH,MAAM,EAAE,SAAS,QAAQ,OAAO;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,OAAe,UAAsC,CAAC,GAAgC;AACrG,eAAW,OAAO,OAAO;AACzB,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,KAAK,SAAS,OAAO;AAAA,EACpE;AAAA,EAEA,MAAM,MAAM,SAAuB,UAAsC,CAAC,GAA2B;AACnG,aAAS,QAAQ,OAAO,OAAO;AAC/B,aAAS,QAAQ,UAAU,UAAU;AACrC,QAAI,CAAC,6BAA6B,KAAK,QAAQ,KAAK,GAAG;AACrD,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACjE;AACA,WAAO,KAAK,QAAQ,QAAQ,eAAe;AAAA,MACzC,GAAG;AAAA,MACH,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,QAAQ,OAAO,UAAU,QAAQ,SAAS;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,UAAsC,CAAC,GAAiC;AAC3F,WAAO,KAAK,QAAQ,OAAO,6BAA6B,OAAO;AAAA,EACjE;AAAA,EACA,MAAM,gBAAgB,UAAsC,CAAC,GAA0B;AACrF,WAAO,KAAK,QAAQ,OAAO,uBAAuB,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAM,kBACJ,UACA,UAAsC,CAAC,GAClB;AACrB,eAAW,UAAU,UAAU;AAC/B,WAAO,KAAK,QAAQ,SAAS,uBAAuB,QAAQ,IAAI;AAAA,MAC9D,GAAG;AAAA,MACH,MAAM,EAAE,QAAQ,YAAY;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,UAAkB,UAAsC,CAAC,GAAkB;AAChG,eAAW,UAAU,UAAU;AAC/B,WAAO,KAAK,QAAQ,UAAU,uBAAuB,QAAQ,IAAI,OAAO;AAAA,EAC1E;AAAA,EAEA,MAAM,aAAa,UAAsC,CAAC,GAAiC;AACzF,WAAO,KAAK,QAAQ,OAAO,kBAAkB,OAAO;AAAA,EACtD;AAAA,EAEA,MAAM,cAAc,WAAmB,UAAsC,CAAC,GAAkB;AAC9F,eAAW,WAAW,WAAW;AACjC,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,SAAS,WAAW,OAAO;AAAA,EAC3E;AAAA,EAEA,MAAM,gBACJ,QAAyB,CAAC,GAC1B,UAAsC,CAAC,GACN;AACjC,QAAI,MAAM,UAAU,OAAW,YAAW,MAAM,OAAO,OAAO;AAC9D,QAAI,MAAM,WAAW,OAAW,YAAW,MAAM,QAAQ,QAAQ;AACjE,QAAI,MAAM,SAAS,WAAc,CAAC,OAAO,UAAU,MAAM,IAAI,KAAK,MAAM,OAAO,IAAI;AACjF,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACjE;AACA,UAAM,OAAO,sBAAsB,YAAY;AAAA,MAC7C,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,IAAI,MAAM;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,eAAe,MAAM;AAAA,MACrB,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,KAAK,MAAM;AAAA,MACX,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,eAAe,MAAM;AAAA,MACrB,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,UAAM,MAAM,MAAM,KAAK,QAKpB,OAAO,MAAM,OAAO;AACvB,WAAO;AAAA,MACL,QAAQ,IAAI,QAAQ,CAAC;AAAA,MACrB,YAAY,IAAI,cAAc;AAAA,MAC9B,OAAO,IAAI,SAAS;AAAA,MACpB,MAAM,IAAI,QAAQ,MAAM,iBAAiB;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,MAAM,iBACJ,QAA0B,CAAC,GAC3B,UAAsC,CAAC,GACf;AACxB,UAAM,OAAO,iCAAiC,YAAY,EAAE,UAAU,MAAM,SAAS,CAAC;AACtF,WAAO,KAAK,QAAQ,OAAO,MAAM,OAAO;AAAA,EAC1C;AAAA,EAEA,MAAM,mBACJ,SACA,UAAsC,CAAC,GACN;AACjC,aAAS,QAAQ,MAAM,MAAM;AAC7B,QAAI,QAAQ,WAAW,OAAW,UAAS,QAAQ,QAAQ,QAAQ;AACnE,UAAM,OAAmB,EAAE,MAAM,QAAQ,KAAK;AAC9C,QAAI,QAAQ,WAAW,OAAW,MAAK,SAAS,QAAQ;AACxD,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACpE;AAAA,EAEA,MAAM,kBAAkB,UAAsC,CAAC,GAAsC;AACnG,WAAO,KAAK,QAAQ,OAAO,kBAAkB,OAAO;AAAA,EACtD;AAAA,EAEA,MAAM,wBAAwB,UAAsC,CAAC,GAA0B;AAC7F,WAAO,KAAK,gBAAgB,OAAO;AAAA,EACrC;AAAA,EAEA,MAAM,wBACJ,QAAmC,CAAC,GACpC,UAAsC,CAAC,GACR;AAC/B,QAAI,MAAM,aAAa,OAAW,UAAS,MAAM,UAAU,UAAU;AACrE,UAAM,OAAO,2BAA2B,YAAY,EAAE,WAAW,MAAM,SAAS,CAAC;AACjF,WAAO,KAAK,QAAQ,OAAO,MAAM,OAAO;AAAA,EAC1C;AAAA,EAEA,MAAM,aAAa,UAAsC,CAAC,GAAuB;AAC/E,WAAO,KAAK,QAAQ,OAAO,iBAAiB,OAAO;AAAA,EACrD;AAAA,EAEA,MAAM,cACJ,SACA,UAAsC,CAAC,GACd;AACzB,oBAAgB,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM;AACzD,QAAI,QAAQ,gBAAgB,UAAa,QAAQ,YAAY,SAAS,KAAK;AACzE,YAAM,IAAI,gBAAgB,gDAAgD;AAAA,IAC5E;AACA,QAAI,QAAQ,cAAc,OAAW,UAAS,QAAQ,WAAW,WAAW;AAC5E,UAAM,OAAmB,EAAE,MAAM,QAAQ,MAAM,KAAK,QAAQ,KAAK,QAAQ,QAAQ,OAAO;AACxF,QAAI,QAAQ,gBAAgB,OAAW,MAAK,cAAc,QAAQ;AAClE,QAAI,QAAQ,gBAAgB,OAAW,MAAK,eAAe,mBAAmB,QAAQ,WAAW;AACjG,QAAI,QAAQ,oBAAoB,OAAW,MAAK,mBAAmB,uBAAuB,QAAQ,eAAe;AACjH,QAAI,QAAQ,cAAc,OAAW,MAAK,aAAa,QAAQ;AAC/D,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACnE;AAAA,EACA,MAAM,aAAa,UAAsC,CAAC,GAAiC;AACzF,WAAO,KAAK,QAAQ,OAAO,iBAAiB,OAAO;AAAA,EACrD;AAAA,EAEA,MAAM,cACJ,YACA,SACA,UAAsC,CAAC,GACrB;AAClB,eAAW,YAAY,YAAY;AACnC,UAAM,OAAmB,CAAC;AAC1B,QAAI,QAAQ,SAAS,QAAW;AAC9B,eAAS,QAAQ,MAAM,MAAM;AAC7B,UAAI,QAAQ,KAAK,SAAS,IAAK,OAAM,IAAI,gBAAgB,yCAAyC;AAClG,WAAK,OAAO,QAAQ;AAAA,IACtB;AACA,QAAI,QAAQ,QAAQ,QAAW;AAC7B,sBAAgB,UAAU,QAAQ,KAAK,CAAC,YAAY,CAAC;AACrD,WAAK,MAAM,QAAQ;AAAA,IACrB;AACA,QAAI,QAAQ,gBAAgB,QAAW;AACrC,UAAI,QAAQ,YAAY,SAAS,KAAK;AACpC,cAAM,IAAI,gBAAgB,gDAAgD;AAAA,MAC5E;AACA,WAAK,cAAc,QAAQ;AAAA,IAC7B;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,UAAI,QAAQ,OAAO,WAAW,KAAK,QAAQ,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG;AAChF,cAAM,IAAI,gBAAgB,uDAAuD;AAAA,MACnF;AACA,WAAK,SAAS,QAAQ;AAAA,IACxB;AACA,QAAI,QAAQ,gBAAgB,OAAW,MAAK,eAAe,mBAAmB,QAAQ,WAAW;AACjG,QAAI,QAAQ,oBAAoB,OAAW,MAAK,mBAAmB,uBAAuB,QAAQ,eAAe;AACjH,QAAI,OAAO,KAAK,IAAI,EAAE,WAAW,GAAG;AAClC,YAAM,IAAI,gBAAgB,oDAAoD;AAAA,IAChF;AACA,WAAO,KAAK,QAAQ,SAAS,iBAAiB,UAAU,IAAI,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,MAAM,cAAc,YAAoB,UAAsC,CAAC,GAAkB;AAC/F,eAAW,YAAY,YAAY;AACnC,WAAO,KAAK,QAAQ,UAAU,iBAAiB,UAAU,IAAI,OAAO;AAAA,EACtE;AAAA,EAEA,MAAM,YACJ,YACA,UAA8B,CAAC,GAC/B,UAAsC,CAAC,GACT;AAC9B,eAAW,YAAY,YAAY;AACnC,UAAM,OAAmB,CAAC;AAC1B,QAAI,QAAQ,cAAc,QAAW;AACnC,eAAS,QAAQ,WAAW,WAAW;AACvC,WAAK,aAAa,QAAQ;AAAA,IAC5B;AACA,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,UAAU,SAAS,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACtF;AAAA,EACA,MAAM,wBACJ,YACA,UAA0C,CAAC,GAC3C,UAAsC,CAAC,GACG;AAC1C,eAAW,YAAY,YAAY;AACnC,QAAI,QAAQ,iBAAiB,WAC1B,CAAC,OAAO,UAAU,QAAQ,YAAY,KAAK,QAAQ,eAAe,KAAK,QAAQ,eAAe,QAAS;AACxG,YAAM,IAAI,gBAAgB,qDAAqD;AAAA,IACjF;AACA,QAAI,QAAQ,UAAU,WACnB,CAAC,OAAO,UAAU,QAAQ,KAAK,KAAK,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,MAAQ;AAClF,YAAM,IAAI,gBAAgB,6CAA6C;AAAA,IACzE;AACA,QAAI,QAAQ,aAAa,WACtB,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,KAAK,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,IAAI;AACtF,YAAM,IAAI,gBAAgB,qDAAqD;AAAA,IACjF;AACA,UAAM,OAAmB,CAAC;AAC1B,QAAI,QAAQ,iBAAiB,OAAW,MAAK,gBAAgB,QAAQ;AACrE,QAAI,QAAQ,aAAa,OAAW,MAAK,WAAW,QAAQ;AAC5D,QAAI,QAAQ,UAAU,OAAW,MAAK,QAAQ,QAAQ;AACtD,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,UAAU,WAAW,EAAE,GAAG,SAAS,KAAK,CAAC;AAAA,EACxF;AAAA,EAEA,MAAM,sBACJ,YACA,QAA8B,CAAC,GAC/B,UAAsC,CAAC,GACD;AACtC,eAAW,YAAY,YAAY;AACnC,QAAI,MAAM,SAAS,OAAW,YAAW,MAAM,MAAM,MAAM;AAC3D,QAAI,MAAM,aAAa,WACpB,CAAC,OAAO,UAAU,MAAM,QAAQ,KAAK,MAAM,WAAW,KAAK,MAAM,WAAW,MAAM;AACnF,YAAM,IAAI,gBAAgB,+CAA+C;AAAA,IAC3E;AACA,QAAI,MAAM,WAAW,OAAW,UAAS,MAAM,QAAQ,QAAQ;AAC/D,UAAM,OAAO,iBAAiB,UAAU,gBAAgB,YAAY;AAAA,MAClE,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM;AAAA,IACvB,CAAC;AACD,WAAO,KAAK,QAAQ,OAAO,MAAM,OAAO;AAAA,EAC1C;AACF;;;AFtrBA,IAAMA,eAAc;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,SAASC,UAAS,MAAuB;AACvC,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,eAAc,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,qBAAqBF,YAAW;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,OAAOC,UAAS,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,SAASC,eAAc,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":["SDK_VERSION","safeJson","extractDetail"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/control-plane.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\nimport {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nexport {\r\n AuthError,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\ntype ErrorOpts = ErrorOptions;\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.1.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\r\nexport * from \"./control-plane\";\r\n","export interface ErrorOptions {\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\r\n constructor(message: string, options: ErrorOptions = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = options.statusCode;\r\n this.response = options.response;\r\n this.requestId = options.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n\r\n constructor(message: string, retryAfterSeconds: number, options?: ErrorOptions) {\r\n super(message, options);\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, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n","import {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nconst SDK_VERSION = \"1.1.1\";\r\n\r\nexport interface ControlPlaneConfig {\r\n baseUrl: string;\r\n accessToken?: string;\r\n projectId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface ControlPlaneRequestOptions {\r\n projectId?: string;\r\n}\r\n\r\nexport interface LoginRequest {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport interface LoginResponse {\r\n tokens: {\r\n accessToken: string;\r\n refreshToken: string;\r\n tokenType: string;\r\n };\r\n session: {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n };\r\n mfaRequired: boolean;\r\n mfaSetupRequired: boolean;\r\n}\r\n\r\nexport type ApiKeyTestStatus = \"active\" | \"revoked\" | \"expired\" | string;\r\nexport interface BulkRevokeApiKeysRequest {\r\n keyIds: number[];\r\n}\r\n\r\nexport interface BulkRevokeApiKeyResult {\r\n keyId: number;\r\n status: \"revoked\" | \"already_revoked\" | \"not_found\" | \"forbidden\";\r\n}\r\n\r\nexport interface BulkRevokeApiKeysResponse {\r\n revoked: number;\r\n alreadyRevoked: number;\r\n notFound: number;\r\n results: BulkRevokeApiKeyResult[];\r\n}\r\n\r\nexport interface ApiKeyTestResponse {\r\n keyId: number;\r\n valid: boolean;\r\n status: ApiKeyTestStatus;\r\n environment: string;\r\n rateLimitTier: string;\r\n scopes: string[];\r\n projectId: string | null;\r\n lastUsedAt: string | null;\r\n expiresAt: string | null;\r\n expired: boolean;\r\n serverTime: string;\r\n}\r\n\r\nexport interface PlanLimits {\r\n addRequests: number | null;\r\n retrievalRequests: number | null;\r\n}\r\n\r\nexport interface Plan {\r\n id: string;\r\n name: string;\r\n priceCents?: number | null;\r\n priceLabel: string;\r\n description?: string;\r\n limits: PlanLimits;\r\n features?: string[];\r\n ctaLabel?: string;\r\n isEnterprise?: boolean;\r\n}\r\n\r\nexport interface CurrentPlanResponse {\r\n plan: Plan;\r\n status: string;\r\n billingPeriodStart: string | null;\r\n billingPeriodEnd: string | null;\r\n nextResetAt?: string | null;\r\n planLimitAdd?: number | null;\r\n planLimitRetrieval?: number | null;\r\n paymentFailed: boolean;\r\n paymentStatus?: string;\r\n scheduledPlanId: string | null;\r\n cancelAtPeriodEnd: boolean;\r\n}\r\nexport interface TeamMember {\r\n id: string;\r\n name: string;\r\n email: string;\r\n role: string;\r\n status: string;\r\n lastActive?: string | null;\r\n mfaEnabled: boolean;\r\n authMethod: string;\r\n loginProvider?: string;\r\n devices?: number;\r\n sessions: number;\r\n isScimManaged?: boolean;\r\n}\r\n\r\nexport interface Session {\r\n id: number;\r\n isCurrent: boolean;\r\n sessionType: string;\r\n sessionName: string;\r\n userAgent: string;\r\n ip: string;\r\n location: string | null;\r\n geo: Record<string, unknown> | null;\r\n createdAt: string;\r\n lastActivityAt: string;\r\n expiresAt: string;\r\n}\r\n\r\nexport interface SessionListResponse {\r\n sessions: Session[];\r\n currentSessionId: number | null;\r\n}\r\n\r\nexport type AuditSortDirection = \"asc\" | \"desc\";\r\n\r\nexport interface AuditEventQuery {\r\n limit?: number;\r\n cursor?: number;\r\n skip?: number;\r\n sortDirection?: AuditSortDirection;\r\n tenantId?: string;\r\n actor?: string;\r\n actorEmail?: string;\r\n ip?: string;\r\n action?: string;\r\n resourceType?: string;\r\n resourceId?: string;\r\n severity?: string;\r\n category?: string;\r\n start?: string;\r\n end?: string;\r\n success?: boolean;\r\n source?: string;\r\n ingestMethod?: string;\r\n search?: string;\r\n includeStats?: boolean;\r\n}\r\n\r\nexport interface AuditActor {\r\n id: string;\r\n email: string | null;\r\n name: string | null;\r\n type: string;\r\n}\r\n\r\nexport interface AuditResource {\r\n type: string;\r\n id: string;\r\n label: string | null;\r\n}\r\nexport interface AuditEvent {\r\n id: number;\r\n eventId: string;\r\n timestamp: string;\r\n category: string;\r\n actor: AuditActor;\r\n action: string;\r\n resource: AuditResource;\r\n severity: string;\r\n success: boolean;\r\n metadata?: Record<string, unknown> | null;\r\n}\r\n\r\nexport interface AuditEventListResponse {\r\n events: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n}\r\n\r\nexport interface IntegrationQuery {\r\n category?: string;\r\n}\r\n\r\nexport interface Integration {\r\n id: string;\r\n name: string;\r\n description: string;\r\n category: string;\r\n features: string[];\r\n authType: string;\r\n isConfigured: boolean;\r\n isConnected: boolean;\r\n comingSoon: boolean;\r\n}\r\n\r\nexport interface CreateOrganizationRequest {\r\n name: string;\r\n domain?: string;\r\n}\r\n\r\nexport interface OrganizationMembership {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n}\r\n\r\nexport interface OrganizationSettingsQuery {\r\n tenantId?: string;\r\n}\r\n\r\nexport interface OrganizationSettings {\r\n tenantId: string;\r\n tenantName: string;\r\n tenantSlug: string;\r\n description: string | null;\r\n plan: string;\r\n status: string;\r\n createdAt: string;\r\n contactEmail: string | null;\r\n customDomain: string | null;\r\n customDomainVerified: boolean;\r\n logoUrl: string | null;\r\n totalMemories: number;\r\n activeUsers: number;\r\n organizationName: string;\r\n scheduledDeletionAt: string | null;\r\n mfaEnrolled: boolean;\r\n passwordEnabled: boolean;\r\n}\r\nexport interface Project {\r\n id: string;\r\n name: string;\r\n tenantId: string;\r\n isDefault: boolean;\r\n memoryCount: number;\r\n archivedAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface WebhookRetryConfig {\r\n enabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n}\r\n\r\nexport interface WebhookSignatureConfig {\r\n algorithm?: \"hmac-sha256\" | \"hmac-sha512\";\r\n headerName?: string;\r\n timestampHeader?: string;\r\n toleranceSeconds?: number;\r\n}\r\n\r\nexport interface CreateWebhookRequest {\r\n name: string;\r\n url: string;\r\n events: string[];\r\n description?: string;\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n projectId?: string;\r\n}\r\n\r\nexport interface UpdateWebhookRequest {\r\n name?: string;\r\n url?: string;\r\n description?: string;\r\n events?: string[];\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n}\r\n\r\nexport interface Webhook {\r\n id: number;\r\n name: string;\r\n url: string;\r\n description: string | null;\r\n secretPrefix: string;\r\n events: string[];\r\n enabled: boolean;\r\n signatureAlgorithm: string;\r\n signatureHeader?: string;\r\n timestampHeader?: string;\r\n signatureTolerance?: number;\r\n retryEnabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n totalDeliveries?: number;\r\n successfulDeliveries?: number;\r\n failedDeliveries?: number;\r\n consecutiveFailures?: number;\r\n successRate?: number;\r\n lastTriggeredAt?: string | null;\r\n lastSuccessAt?: string | null;\r\n lastFailureAt?: string | null;\r\n lastError?: string | null;\r\n lastStatusCode?: number | null;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n createdByName?: string | null;\r\n projectId: string | null;\r\n}\r\n\r\nexport interface CreatedWebhook extends Webhook {\r\n secret: string;\r\n}\r\n\r\nexport interface WebhookListResponse {\r\n endpoints: Webhook[];\r\n totalEndpoints: number;\r\n activeEndpoints: number;\r\n totalDeliveries: number;\r\n avgSuccessRate: number;\r\n failingEndpoints: number;\r\n}\r\n\r\nexport interface TestWebhookRequest {\r\n eventType?: string;\r\n}\r\n\r\nexport interface TestWebhookResponse {\r\n deliveryId: number;\r\n eventId: string;\r\n eventType: string;\r\n endpointId: number;\r\n status: string;\r\n payload: Record<string, unknown>;\r\n message: string;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesRequest {\r\n sinceMinutes?: number;\r\n statuses?: string[];\r\n limit?: number;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesResponse {\r\n endpointId: number;\r\n eligible: number;\r\n replayed: number;\r\n skipped: number;\r\n deliveryIds: number[];\r\n}\r\n\r\nexport interface WebhookDeliveryQuery {\r\n page?: number;\r\n pageSize?: number;\r\n status?: string;\r\n}\r\nexport interface WebhookDelivery {\r\n id: number;\r\n endpointId: number;\r\n eventType: string;\r\n eventId: string;\r\n status: string;\r\n payload?: Record<string, unknown>;\r\n payloadHash: string;\r\n signature?: string | null;\r\n statusCode: number | null;\r\n responseBody?: string | null;\r\n errorMessage?: string | null;\r\n latencyMs: number | null;\r\n attemptNumber: number;\r\n maxAttempts: number;\r\n nextRetryAt?: string | null;\r\n createdAt: string;\r\n completedAt: string | null;\r\n}\r\n\r\nexport interface WebhookDeliveryListResponse {\r\n deliveries: WebhookDelivery[];\r\n total: number;\r\n page: number;\r\n pageSize: number;\r\n}\r\n\r\ntype QueryValue = string | number | boolean | null | undefined;\r\ntype WireObject = Record<string, unknown>;\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 value = body as Record<string, unknown>;\r\n if (typeof value.detail === \"string\") return value.detail;\r\n if (value.error && typeof value.error === \"object\") {\r\n const error = value.error as Record<string, unknown>;\r\n if (typeof error.message === \"string\") return error.message;\r\n }\r\n if (Array.isArray(value.detail) && value.detail.length > 0) {\r\n const first = value.detail[0];\r\n if (first && typeof first === \"object\" && typeof (first as Record<string, unknown>).msg === \"string\") {\r\n return (first as Record<string, unknown>).msg as string;\r\n }\r\n }\r\n return undefined;\r\n}\r\nfunction extractBodyRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const value = body as Record<string, unknown>;\r\n if (typeof value.retry_after === \"number\") return value.retry_after;\r\n if (value.error && typeof value.error === \"object\") {\r\n const retryAfter = (value.error as Record<string, unknown>).retry_after;\r\n if (typeof retryAfter === \"number\") return retryAfter;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction parseRetryAfter(value: string | null): number | undefined {\r\n if (!value) return undefined;\r\n const seconds = Number(value);\r\n if (Number.isFinite(seconds) && seconds >= 0) return seconds;\r\n const date = Date.parse(value);\r\n if (Number.isNaN(date)) return undefined;\r\n return Math.max(0, Math.ceil((date - Date.now()) / 1000));\r\n}\r\n\r\nfunction snakeToCamel(key: string): string {\r\n return key.replace(/_([a-z0-9])/g, (_, character: string) => character.toUpperCase());\r\n}\r\n\r\nconst OPAQUE_RESPONSE_KEYS = new Set([\"payload\", \"metadata\", \"geo\", \"configuration\"]);\r\n\r\nfunction normalizeResponse(value: unknown): unknown {\r\n if (Array.isArray(value)) return value.map(normalizeResponse);\r\n if (!value || typeof value !== \"object\") return value;\r\n const normalized: Record<string, unknown> = {};\r\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\r\n const camelKey = snakeToCamel(key);\r\n normalized[camelKey] = OPAQUE_RESPONSE_KEYS.has(camelKey) ? item : normalizeResponse(item);\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction queryString(values: Record<string, QueryValue>): string {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(values)) {\r\n if (value !== undefined && value !== null) params.set(key, String(value));\r\n }\r\n const encoded = params.toString();\r\n return encoded ? `?${encoded}` : \"\";\r\n}\r\n\r\nfunction positiveId(value: number, name: string): void {\r\n if (!Number.isInteger(value) || value <= 0) {\r\n throw new ValidationError(`${name} must be a positive integer`);\r\n }\r\n}\r\n\r\nfunction nonEmpty(value: string, name: string): void {\r\n if (typeof value !== \"string\" || !value.trim()) throw new ValidationError(`${name} must not be empty`);\r\n}\r\n\r\nfunction boundedInteger(value: number, name: string, minimum: number, maximum: number): void {\r\n if (!Number.isInteger(value) || value < minimum || value > maximum) {\r\n throw new ValidationError(`${name} must be an integer between ${minimum} and ${maximum}`);\r\n }\r\n}\r\n\r\nfunction nonNegativeInteger(value: number, name: string): void {\r\n if (!Number.isInteger(value) || value < 0) {\r\n throw new ValidationError(`${name} must be a non-negative integer`);\r\n }\r\n}\r\n\r\nfunction nonEmptyStrings(values: string[], name: string): void {\r\n if (!Array.isArray(values) || values.length === 0 ||\r\n values.some((value) => typeof value !== \"string\" || !value.trim())) {\r\n throw new ValidationError(`${name} must contain at least one non-empty string`);\r\n }\r\n}\r\nfunction webhookRetryConfig(config: WebhookRetryConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.enabled !== undefined) wire.enabled = config.enabled;\r\n if (config.maxRetries !== undefined) wire.max_retries = config.maxRetries;\r\n if (config.initialDelaySeconds !== undefined) wire.initial_delay_seconds = config.initialDelaySeconds;\r\n if (config.maxDelaySeconds !== undefined) wire.max_delay_seconds = config.maxDelaySeconds;\r\n if (config.backoffMultiplier !== undefined) wire.backoff_multiplier = config.backoffMultiplier;\r\n if (config.retryStatusCodes !== undefined) wire.retry_status_codes = config.retryStatusCodes;\r\n return wire;\r\n}\r\n\r\nfunction webhookSignatureConfig(config: WebhookSignatureConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.algorithm !== undefined) wire.algorithm = config.algorithm;\r\n if (config.headerName !== undefined) wire.header_name = config.headerName;\r\n if (config.timestampHeader !== undefined) wire.timestamp_header = config.timestampHeader;\r\n if (config.toleranceSeconds !== undefined) wire.tolerance_seconds = config.toleranceSeconds;\r\n return wire;\r\n}\r\n\r\nfunction validateWebhook(name: string, url: string, events: string[]): void {\r\n nonEmpty(name, \"name\");\r\n if (name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n nonEmptyStrings(events, \"events\");\r\n validateWebhookUrl(url);\r\n}\r\n\r\nfunction validateWebhookUrl(url: string): void {\r\n nonEmpty(url, \"url\");\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(url);\r\n } catch {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.username || parsed.password) throw new ValidationError(\"url must not contain credentials\");\r\n}\r\n\r\ninterface RequestOptions extends ControlPlaneRequestOptions {\r\n body?: unknown;\r\n auth?: boolean;\r\n}\r\n\r\nexport class ControlPlaneClient {\r\n private readonly baseUrl: string;\r\n private readonly accessToken?: string;\r\n private readonly projectId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n constructor(config: ControlPlaneConfig) {\r\n if (!config.baseUrl?.trim()) throw new ValidationError(\"baseUrl is required\");\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(config.baseUrl);\r\n } catch {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (config.accessToken !== undefined && !config.accessToken.trim()) {\r\n throw new ValidationError(\"accessToken must not be empty when provided\");\r\n }\r\n if (config.projectId !== undefined && !config.projectId.trim()) {\r\n throw new ValidationError(\"projectId must not be empty when provided\");\r\n }\r\n if (config.timeoutMs !== undefined && (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)) {\r\n throw new ValidationError(\"timeoutMs must be greater than zero\");\r\n }\r\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\r\n this.accessToken = config.accessToken?.trim();\r\n this.projectId = config.projectId?.trim();\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const implementation = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!implementation) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = implementation;\r\n }\r\n\r\n private async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\r\n const requiresAuth = options.auth !== false;\r\n if (requiresAuth && !this.accessToken) {\r\n throw new AuthError(\"accessToken is required for this operation\");\r\n }\r\n if (options.projectId !== undefined && !options.projectId.trim()) {\r\n throw new ValidationError(\"projectId override must not be empty\");\r\n }\r\n const headers: Record<string, string> = {\r\n Accept: \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n };\r\n if (requiresAuth) headers.Authorization = `Bearer ${this.accessToken}`;\r\n const selectedProject = options.projectId?.trim() ?? this.projectId;\r\n if (selectedProject) headers[\"X-Project-ID\"] = selectedProject;\r\n if (options.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\r\n\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\r\n method,\r\n headers,\r\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\r\n signal: controller.signal,\r\n });\r\n const requestId = response.headers.get(\"X-Request-ID\") ?? undefined;\r\n if (response.status === 204) return undefined as T;\r\n const text = await response.text();\r\n const parsedBody = text ? safeJson(text) : null;\r\n if (!response.ok) {\r\n this.throwForStatus(response.status, parsedBody, requestId, response.headers.get(\"Retry-After\"));\r\n }\r\n return normalizeResponse(parsedBody) as T;\r\n } catch (error) {\r\n if (error instanceof MemorySyncError) throw error;\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new MemorySyncError(`Network error: ${message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n private throwForStatus(\r\n status: number,\r\n body: unknown,\r\n requestId: string | undefined,\r\n retryAfterHeader: string | null,\r\n ): never {\r\n const detail = extractDetail(body);\r\n const options: ErrorOptions = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", options);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", options);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", options);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", options);\r\n }\r\n if (status === 429) {\r\n const retryAfter = parseRetryAfter(retryAfterHeader) ?? extractBodyRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, options);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, options);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, options);\r\n }\r\n\r\n async bulkRevokeApiKeys(\r\n request: BulkRevokeApiKeysRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<BulkRevokeApiKeysResponse> {\r\n if (!Array.isArray(request.keyIds) || request.keyIds.length < 1 || request.keyIds.length > 100) {\r\n throw new ValidationError(\"keyIds must contain between 1 and 100 entries\");\r\n }\r\n request.keyIds.forEach((id) => positiveId(id, \"keyIds entry\"));\r\n return this.request(\"POST\", \"/org/api-keys/bulk-revoke\", {\r\n ...options,\r\n body: { key_ids: request.keyIds },\r\n });\r\n }\r\n\r\n async testApiKey(keyId: number, options: ControlPlaneRequestOptions = {}): Promise<ApiKeyTestResponse> {\r\n positiveId(keyId, \"keyId\");\r\n return this.request(\"POST\", `/org/api-keys/${keyId}/test`, options);\r\n }\r\n\r\n async login(request: LoginRequest, options: ControlPlaneRequestOptions = {}): Promise<LoginResponse> {\r\n nonEmpty(request.email, \"email\");\r\n nonEmpty(request.password, \"password\");\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(request.email)) {\r\n throw new ValidationError(\"email must be a valid email address\");\r\n }\r\n return this.request(\"POST\", \"/auth/login\", {\r\n ...options,\r\n auth: false,\r\n body: { email: request.email, password: request.password },\r\n });\r\n }\r\n\r\n async getCurrentPlan(options: ControlPlaneRequestOptions = {}): Promise<CurrentPlanResponse> {\r\n return this.request(\"GET\", \"/org/billing/current-plan\", options);\r\n }\r\n async listTeamMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.request(\"GET\", \"/admin/team/members\", options);\r\n }\r\n\r\n async suspendTeamMember(\r\n memberId: number,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TeamMember> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"PATCH\", `/admin/team/members/${memberId}`, {\r\n ...options,\r\n body: { status: \"suspended\" },\r\n });\r\n }\r\n\r\n async removeTeamMember(memberId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"DELETE\", `/admin/team/members/${memberId}`, options);\r\n }\r\n\r\n async listSessions(options: ControlPlaneRequestOptions = {}): Promise<SessionListResponse> {\r\n return this.request(\"GET\", \"/auth/sessions\", options);\r\n }\r\n\r\n async revokeSession(sessionId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(sessionId, \"sessionId\");\r\n return this.request(\"POST\", `/auth/sessions/${sessionId}/revoke`, options);\r\n }\r\n\r\n async listAuditEvents(\r\n query: AuditEventQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<AuditEventListResponse> {\r\n if (query.limit !== undefined) boundedInteger(query.limit, \"limit\", 1, 200);\r\n if (query.cursor !== undefined) nonNegativeInteger(query.cursor, \"cursor\");\r\n if (query.skip !== undefined) nonNegativeInteger(query.skip, \"skip\");\r\n if (query.sortDirection !== undefined && query.sortDirection !== \"asc\" && query.sortDirection !== \"desc\") {\r\n throw new ValidationError(\"sortDirection must be 'asc' or 'desc'\");\r\n }\r\n const path = \"/admin/audit-logs\" + queryString({\r\n limit: query.limit,\r\n cursor: query.cursor,\r\n skip: query.skip,\r\n sort: query.sortDirection,\r\n tenant_id: query.tenantId,\r\n actor: query.actor,\r\n actor_email: query.actorEmail,\r\n ip: query.ip,\r\n action: query.action,\r\n resource_type: query.resourceType,\r\n resource_id: query.resourceId,\r\n severity: query.severity,\r\n category: query.category,\r\n start: query.start,\r\n end: query.end,\r\n success: query.success,\r\n source: query.source,\r\n ingest_method: query.ingestMethod,\r\n search: query.search,\r\n include_stats: query.includeStats,\r\n });\r\n const raw = await this.request<{\r\n logs: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n }>(\"GET\", path, options);\r\n return {\r\n events: raw.logs ?? [],\r\n nextCursor: raw.nextCursor ?? null,\r\n stats: raw.stats ?? null,\r\n sort: raw.sort ?? query.sortDirection ?? \"desc\",\r\n };\r\n }\r\n async listIntegrations(\r\n query: IntegrationQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Integration[]> {\r\n if (query.category !== undefined) nonEmpty(query.category, \"category\");\r\n const path = \"/api/v1/integrations/catalog\" + queryString({ category: query.category });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async createOrganization(\r\n request: CreateOrganizationRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationMembership> {\r\n nonEmpty(request.name, \"name\");\r\n if (request.domain !== undefined) nonEmpty(request.domain, \"domain\");\r\n const body: WireObject = { name: request.name };\r\n if (request.domain !== undefined) body.domain = request.domain;\r\n return this.request(\"POST\", \"/organizations\", { ...options, body });\r\n }\r\n\r\n async listOrganizations(options: ControlPlaneRequestOptions = {}): Promise<OrganizationMembership[]> {\r\n return this.request(\"GET\", \"/organizations\", options);\r\n }\r\n\r\n async listOrganizationMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.listTeamMembers(options);\r\n }\r\n\r\n async getOrganizationSettings(\r\n query: OrganizationSettingsQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationSettings> {\r\n if (query.tenantId !== undefined) nonEmpty(query.tenantId, \"tenantId\");\r\n const path = \"/admin/tenant-settings\" + queryString({ tenant_id: query.tenantId });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async listProjects(options: ControlPlaneRequestOptions = {}): Promise<Project[]> {\r\n return this.request(\"GET\", \"/org/projects\", options);\r\n }\r\n\r\n async createWebhook(\r\n request: CreateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<CreatedWebhook> {\r\n validateWebhook(request.name, request.url, request.events);\r\n if (request.description !== undefined && request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n if (request.projectId !== undefined) nonEmpty(request.projectId, \"projectId\");\r\n if (options.projectId !== undefined) nonEmpty(options.projectId, \"projectId override\");\r\n if (request.projectId && options.projectId && request.projectId.trim() !== options.projectId.trim()) {\r\n throw new ValidationError(\"request projectId and options projectId must match\");\r\n }\r\n const body: WireObject = { name: request.name, url: request.url, events: request.events };\r\n if (request.description !== undefined) body.description = request.description;\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (request.projectId !== undefined) body.project_id = request.projectId;\r\n return this.request(\"POST\", \"/org/webhooks\", {\r\n ...options,\r\n projectId: options.projectId ?? request.projectId,\r\n body,\r\n });\r\n }\r\n async listWebhooks(options: ControlPlaneRequestOptions = {}): Promise<WebhookListResponse> {\r\n return this.request(\"GET\", \"/org/webhooks\", options);\r\n }\r\n\r\n async updateWebhook(\r\n endpointId: number,\r\n request: UpdateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Webhook> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.name !== undefined) {\r\n nonEmpty(request.name, \"name\");\r\n if (request.name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n body.name = request.name;\r\n }\r\n if (request.url !== undefined) {\r\n validateWebhookUrl(request.url);\r\n body.url = request.url;\r\n }\r\n if (request.description !== undefined) {\r\n if (request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n body.description = request.description;\r\n }\r\n if (request.events !== undefined) {\r\n nonEmptyStrings(request.events, \"events\");\r\n body.events = request.events;\r\n }\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"updateWebhook requires at least one editable field\");\r\n }\r\n return this.request(\"PATCH\", `/org/webhooks/${endpointId}`, { ...options, body });\r\n }\r\n\r\n async deleteWebhook(endpointId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(endpointId, \"endpointId\");\r\n return this.request(\"DELETE\", `/org/webhooks/${endpointId}`, options);\r\n }\r\n\r\n async testWebhook(\r\n endpointId: number,\r\n request: TestWebhookRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TestWebhookResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.eventType !== undefined) {\r\n nonEmpty(request.eventType, \"eventType\");\r\n body.event_type = request.eventType;\r\n }\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/test`, { ...options, body });\r\n }\r\n async replayWebhookDeliveries(\r\n endpointId: number,\r\n request: ReplayWebhookDeliveriesRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<ReplayWebhookDeliveriesResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (request.sinceMinutes !== undefined &&\r\n (!Number.isInteger(request.sinceMinutes) || request.sinceMinutes < 1 || request.sinceMinutes > 10_080)) {\r\n throw new ValidationError(\"sinceMinutes must be an integer between 1 and 10080\");\r\n }\r\n if (request.limit !== undefined &&\r\n (!Number.isInteger(request.limit) || request.limit < 1 || request.limit > 1_000)) {\r\n throw new ValidationError(\"limit must be an integer between 1 and 1000\");\r\n }\r\n if (request.statuses !== undefined) nonEmptyStrings(request.statuses, \"statuses\");\r\n const body: WireObject = {};\r\n if (request.sinceMinutes !== undefined) body.since_minutes = request.sinceMinutes;\r\n if (request.statuses !== undefined) body.statuses = request.statuses;\r\n if (request.limit !== undefined) body.limit = request.limit;\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/replay`, { ...options, body });\r\n }\r\n\r\n async listWebhookDeliveries(\r\n endpointId: number,\r\n query: WebhookDeliveryQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<WebhookDeliveryListResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (query.page !== undefined) positiveId(query.page, \"page\");\r\n if (query.pageSize !== undefined &&\r\n (!Number.isInteger(query.pageSize) || query.pageSize < 1 || query.pageSize > 100)) {\r\n throw new ValidationError(\"pageSize must be an integer between 1 and 100\");\r\n }\r\n if (query.status !== undefined) nonEmpty(query.status, \"status\");\r\n const path = `/org/webhooks/${endpointId}/deliveries` + queryString({\r\n page: query.page,\r\n page_size: query.pageSize,\r\n status_filter: query.status,\r\n });\r\n return this.request(\"GET\", path, options);\r\n }\r\n}\r\n"],"mappings":"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","names":["SDK_VERSION","safeJson","extractDetail"]}
package/dist/index.mjs CHANGED
@@ -41,7 +41,7 @@ var ServerError = class extends MemorySyncError {
41
41
  };
42
42
 
43
43
  // src/control-plane.ts
44
- var SDK_VERSION = "1.1.0";
44
+ var SDK_VERSION = "1.1.1";
45
45
  function safeJson(text) {
46
46
  try {
47
47
  return JSON.parse(text);
@@ -111,7 +111,22 @@ function positiveId(value, name) {
111
111
  }
112
112
  }
113
113
  function nonEmpty(value, name) {
114
- if (!value.trim()) throw new ValidationError(`${name} must not be empty`);
114
+ if (typeof value !== "string" || !value.trim()) throw new ValidationError(`${name} must not be empty`);
115
+ }
116
+ function boundedInteger(value, name, minimum, maximum) {
117
+ if (!Number.isInteger(value) || value < minimum || value > maximum) {
118
+ throw new ValidationError(`${name} must be an integer between ${minimum} and ${maximum}`);
119
+ }
120
+ }
121
+ function nonNegativeInteger(value, name) {
122
+ if (!Number.isInteger(value) || value < 0) {
123
+ throw new ValidationError(`${name} must be a non-negative integer`);
124
+ }
125
+ }
126
+ function nonEmptyStrings(values, name) {
127
+ if (!Array.isArray(values) || values.length === 0 || values.some((value) => typeof value !== "string" || !value.trim())) {
128
+ throw new ValidationError(`${name} must contain at least one non-empty string`);
129
+ }
115
130
  }
116
131
  function webhookRetryConfig(config) {
117
132
  const wire = {};
@@ -134,9 +149,11 @@ function webhookSignatureConfig(config) {
134
149
  function validateWebhook(name, url, events) {
135
150
  nonEmpty(name, "name");
136
151
  if (name.length > 128) throw new ValidationError("name may contain at most 128 characters");
137
- if (!Array.isArray(events) || events.length === 0 || events.some((event) => !event.trim())) {
138
- throw new ValidationError("events must contain at least one non-empty event type");
139
- }
152
+ nonEmptyStrings(events, "events");
153
+ validateWebhookUrl(url);
154
+ }
155
+ function validateWebhookUrl(url) {
156
+ nonEmpty(url, "url");
140
157
  let parsed;
141
158
  try {
142
159
  parsed = new URL(url);
@@ -290,10 +307,11 @@ var ControlPlaneClient = class {
290
307
  return this.request("POST", `/auth/sessions/${sessionId}/revoke`, options);
291
308
  }
292
309
  async listAuditEvents(query = {}, options = {}) {
293
- if (query.limit !== void 0) positiveId(query.limit, "limit");
294
- if (query.cursor !== void 0) positiveId(query.cursor, "cursor");
295
- if (query.skip !== void 0 && (!Number.isInteger(query.skip) || query.skip < 0)) {
296
- throw new ValidationError("skip must be a non-negative integer");
310
+ if (query.limit !== void 0) boundedInteger(query.limit, "limit", 1, 200);
311
+ if (query.cursor !== void 0) nonNegativeInteger(query.cursor, "cursor");
312
+ if (query.skip !== void 0) nonNegativeInteger(query.skip, "skip");
313
+ if (query.sortDirection !== void 0 && query.sortDirection !== "asc" && query.sortDirection !== "desc") {
314
+ throw new ValidationError("sortDirection must be 'asc' or 'desc'");
297
315
  }
298
316
  const path = "/admin/audit-logs" + queryString({
299
317
  limit: query.limit,
@@ -314,7 +332,8 @@ var ControlPlaneClient = class {
314
332
  success: query.success,
315
333
  source: query.source,
316
334
  ingest_method: query.ingestMethod,
317
- search: query.search
335
+ search: query.search,
336
+ include_stats: query.includeStats
318
337
  });
319
338
  const raw = await this.request("GET", path, options);
320
339
  return {
@@ -325,6 +344,7 @@ var ControlPlaneClient = class {
325
344
  };
326
345
  }
327
346
  async listIntegrations(query = {}, options = {}) {
347
+ if (query.category !== void 0) nonEmpty(query.category, "category");
328
348
  const path = "/api/v1/integrations/catalog" + queryString({ category: query.category });
329
349
  return this.request("GET", path, options);
330
350
  }
@@ -355,12 +375,20 @@ var ControlPlaneClient = class {
355
375
  throw new ValidationError("description may contain at most 500 characters");
356
376
  }
357
377
  if (request.projectId !== void 0) nonEmpty(request.projectId, "projectId");
378
+ if (options.projectId !== void 0) nonEmpty(options.projectId, "projectId override");
379
+ if (request.projectId && options.projectId && request.projectId.trim() !== options.projectId.trim()) {
380
+ throw new ValidationError("request projectId and options projectId must match");
381
+ }
358
382
  const body = { name: request.name, url: request.url, events: request.events };
359
383
  if (request.description !== void 0) body.description = request.description;
360
384
  if (request.retryConfig !== void 0) body.retry_config = webhookRetryConfig(request.retryConfig);
361
385
  if (request.signatureConfig !== void 0) body.signature_config = webhookSignatureConfig(request.signatureConfig);
362
386
  if (request.projectId !== void 0) body.project_id = request.projectId;
363
- return this.request("POST", "/org/webhooks", { ...options, body });
387
+ return this.request("POST", "/org/webhooks", {
388
+ ...options,
389
+ projectId: options.projectId ?? request.projectId,
390
+ body
391
+ });
364
392
  }
365
393
  async listWebhooks(options = {}) {
366
394
  return this.request("GET", "/org/webhooks", options);
@@ -374,7 +402,7 @@ var ControlPlaneClient = class {
374
402
  body.name = request.name;
375
403
  }
376
404
  if (request.url !== void 0) {
377
- validateWebhook("update", request.url, ["validation"]);
405
+ validateWebhookUrl(request.url);
378
406
  body.url = request.url;
379
407
  }
380
408
  if (request.description !== void 0) {
@@ -384,9 +412,7 @@ var ControlPlaneClient = class {
384
412
  body.description = request.description;
385
413
  }
386
414
  if (request.events !== void 0) {
387
- if (request.events.length === 0 || request.events.some((event) => !event.trim())) {
388
- throw new ValidationError("events must contain at least one non-empty event type");
389
- }
415
+ nonEmptyStrings(request.events, "events");
390
416
  body.events = request.events;
391
417
  }
392
418
  if (request.retryConfig !== void 0) body.retry_config = webhookRetryConfig(request.retryConfig);
@@ -417,9 +443,7 @@ var ControlPlaneClient = class {
417
443
  if (request.limit !== void 0 && (!Number.isInteger(request.limit) || request.limit < 1 || request.limit > 1e3)) {
418
444
  throw new ValidationError("limit must be an integer between 1 and 1000");
419
445
  }
420
- if (request.statuses !== void 0 && (request.statuses.length === 0 || request.statuses.some((status) => !status.trim()))) {
421
- throw new ValidationError("statuses must contain at least one non-empty status");
422
- }
446
+ if (request.statuses !== void 0) nonEmptyStrings(request.statuses, "statuses");
423
447
  const body = {};
424
448
  if (request.sinceMinutes !== void 0) body.since_minutes = request.sinceMinutes;
425
449
  if (request.statuses !== void 0) body.statuses = request.statuses;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/control-plane.ts","../src/index.ts"],"sourcesContent":["export interface ErrorOptions {\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\r\n constructor(message: string, options: ErrorOptions = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = options.statusCode;\r\n this.response = options.response;\r\n this.requestId = options.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n\r\n constructor(message: string, retryAfterSeconds: number, options?: ErrorOptions) {\r\n super(message, options);\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, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n","import {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nconst SDK_VERSION = \"1.1.0\";\r\n\r\nexport interface ControlPlaneConfig {\r\n baseUrl: string;\r\n accessToken?: string;\r\n projectId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface ControlPlaneRequestOptions {\r\n projectId?: string;\r\n}\r\n\r\nexport interface LoginRequest {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport interface LoginResponse {\r\n tokens: {\r\n accessToken: string;\r\n refreshToken: string;\r\n tokenType: string;\r\n };\r\n session: {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n };\r\n mfaRequired: boolean;\r\n mfaSetupRequired: boolean;\r\n}\r\n\r\nexport type ApiKeyTestStatus = \"active\" | \"revoked\" | \"expired\" | string;\r\nexport interface BulkRevokeApiKeysRequest {\r\n keyIds: number[];\r\n}\r\n\r\nexport interface BulkRevokeApiKeyResult {\r\n keyId: number;\r\n status: \"revoked\" | \"already_revoked\" | \"not_found\" | \"forbidden\";\r\n}\r\n\r\nexport interface BulkRevokeApiKeysResponse {\r\n revoked: number;\r\n alreadyRevoked: number;\r\n notFound: number;\r\n results: BulkRevokeApiKeyResult[];\r\n}\r\n\r\nexport interface ApiKeyTestResponse {\r\n keyId: number;\r\n valid: boolean;\r\n status: ApiKeyTestStatus;\r\n environment: string;\r\n rateLimitTier: string;\r\n scopes: string[];\r\n projectId: string | null;\r\n lastUsedAt: string | null;\r\n expiresAt: string | null;\r\n expired: boolean;\r\n serverTime: string;\r\n}\r\n\r\nexport interface PlanLimits {\r\n addRequests: number | null;\r\n retrievalRequests: number | null;\r\n}\r\n\r\nexport interface Plan {\r\n id: string;\r\n name: string;\r\n priceCents?: number | null;\r\n priceLabel: string;\r\n description?: string;\r\n limits: PlanLimits;\r\n features?: string[];\r\n ctaLabel?: string;\r\n isEnterprise?: boolean;\r\n}\r\n\r\nexport interface CurrentPlanResponse {\r\n plan: Plan;\r\n status: string;\r\n billingPeriodStart: string | null;\r\n billingPeriodEnd: string | null;\r\n nextResetAt?: string | null;\r\n planLimitAdd?: number | null;\r\n planLimitRetrieval?: number | null;\r\n paymentFailed: boolean;\r\n paymentStatus?: string;\r\n scheduledPlanId: string | null;\r\n cancelAtPeriodEnd: boolean;\r\n}\r\nexport interface TeamMember {\r\n id: string;\r\n name: string;\r\n email: string;\r\n role: string;\r\n status: string;\r\n lastActive?: string | null;\r\n mfaEnabled: boolean;\r\n authMethod: string;\r\n loginProvider?: string;\r\n devices?: number;\r\n sessions: number;\r\n isScimManaged?: boolean;\r\n}\r\n\r\nexport interface Session {\r\n id: number;\r\n isCurrent: boolean;\r\n sessionType: string;\r\n sessionName: string;\r\n userAgent: string;\r\n ip: string;\r\n location: string | null;\r\n geo: Record<string, unknown> | null;\r\n createdAt: string;\r\n lastActivityAt: string;\r\n expiresAt: string;\r\n}\r\n\r\nexport interface SessionListResponse {\r\n sessions: Session[];\r\n currentSessionId: number | null;\r\n}\r\n\r\nexport type AuditSortDirection = \"asc\" | \"desc\";\r\n\r\nexport interface AuditEventQuery {\r\n limit?: number;\r\n cursor?: number;\r\n skip?: number;\r\n sortDirection?: AuditSortDirection;\r\n tenantId?: string;\r\n actor?: string;\r\n actorEmail?: string;\r\n ip?: string;\r\n action?: string;\r\n resourceType?: string;\r\n resourceId?: string;\r\n severity?: string;\r\n category?: string;\r\n start?: string;\r\n end?: string;\r\n success?: boolean;\r\n source?: string;\r\n ingestMethod?: string;\r\n search?: string;\r\n}\r\n\r\nexport interface AuditActor {\r\n id: string;\r\n email: string | null;\r\n name: string | null;\r\n type: string;\r\n}\r\n\r\nexport interface AuditResource {\r\n type: string;\r\n id: string;\r\n label: string | null;\r\n}\r\nexport interface AuditEvent {\r\n id: number;\r\n eventId: string;\r\n timestamp: string;\r\n category: string;\r\n actor: AuditActor;\r\n action: string;\r\n resource: AuditResource;\r\n severity: string;\r\n success: boolean;\r\n metadata?: Record<string, unknown> | null;\r\n}\r\n\r\nexport interface AuditEventListResponse {\r\n events: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n}\r\n\r\nexport interface IntegrationQuery {\r\n category?: string;\r\n}\r\n\r\nexport interface Integration {\r\n id: string;\r\n name: string;\r\n description: string;\r\n category: string;\r\n features: string[];\r\n authType: string;\r\n isConfigured: boolean;\r\n isConnected: boolean;\r\n comingSoon: boolean;\r\n}\r\n\r\nexport interface CreateOrganizationRequest {\r\n name: string;\r\n domain?: string;\r\n}\r\n\r\nexport interface OrganizationMembership {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n}\r\n\r\nexport interface OrganizationSettingsQuery {\r\n tenantId?: string;\r\n}\r\n\r\nexport interface OrganizationSettings {\r\n tenantId: string;\r\n tenantName: string;\r\n tenantSlug: string;\r\n description: string | null;\r\n plan: string;\r\n status: string;\r\n createdAt: string;\r\n contactEmail: string | null;\r\n customDomain: string | null;\r\n customDomainVerified: boolean;\r\n logoUrl: string | null;\r\n totalMemories: number;\r\n activeUsers: number;\r\n organizationName: string;\r\n scheduledDeletionAt: string | null;\r\n mfaEnrolled: boolean;\r\n passwordEnabled: boolean;\r\n}\r\nexport interface Project {\r\n id: string;\r\n name: string;\r\n tenantId: string;\r\n isDefault: boolean;\r\n memoryCount: number;\r\n archivedAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface WebhookRetryConfig {\r\n enabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n}\r\n\r\nexport interface WebhookSignatureConfig {\r\n algorithm?: \"hmac-sha256\" | \"hmac-sha512\";\r\n headerName?: string;\r\n timestampHeader?: string;\r\n toleranceSeconds?: number;\r\n}\r\n\r\nexport interface CreateWebhookRequest {\r\n name: string;\r\n url: string;\r\n events: string[];\r\n description?: string;\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n projectId?: string;\r\n}\r\n\r\nexport interface UpdateWebhookRequest {\r\n name?: string;\r\n url?: string;\r\n description?: string;\r\n events?: string[];\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n}\r\n\r\nexport interface Webhook {\r\n id: number;\r\n name: string;\r\n url: string;\r\n description: string | null;\r\n secretPrefix: string;\r\n events: string[];\r\n enabled: boolean;\r\n signatureAlgorithm: string;\r\n signatureHeader?: string;\r\n timestampHeader?: string;\r\n signatureTolerance?: number;\r\n retryEnabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n totalDeliveries?: number;\r\n successfulDeliveries?: number;\r\n failedDeliveries?: number;\r\n consecutiveFailures?: number;\r\n successRate?: number;\r\n lastTriggeredAt?: string | null;\r\n lastSuccessAt?: string | null;\r\n lastFailureAt?: string | null;\r\n lastError?: string | null;\r\n lastStatusCode?: number | null;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n createdByName?: string | null;\r\n projectId: string | null;\r\n}\r\n\r\nexport interface CreatedWebhook extends Webhook {\r\n secret: string;\r\n}\r\n\r\nexport interface WebhookListResponse {\r\n endpoints: Webhook[];\r\n totalEndpoints: number;\r\n activeEndpoints: number;\r\n totalDeliveries: number;\r\n avgSuccessRate: number;\r\n failingEndpoints: number;\r\n}\r\n\r\nexport interface TestWebhookRequest {\r\n eventType?: string;\r\n}\r\n\r\nexport interface TestWebhookResponse {\r\n deliveryId: number;\r\n eventId: string;\r\n eventType: string;\r\n endpointId: number;\r\n status: string;\r\n payload: Record<string, unknown>;\r\n message: string;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesRequest {\r\n sinceMinutes?: number;\r\n statuses?: string[];\r\n limit?: number;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesResponse {\r\n endpointId: number;\r\n eligible: number;\r\n replayed: number;\r\n skipped: number;\r\n deliveryIds: number[];\r\n}\r\n\r\nexport interface WebhookDeliveryQuery {\r\n page?: number;\r\n pageSize?: number;\r\n status?: string;\r\n}\r\nexport interface WebhookDelivery {\r\n id: number;\r\n endpointId: number;\r\n eventType: string;\r\n eventId: string;\r\n status: string;\r\n payload?: Record<string, unknown>;\r\n payloadHash: string;\r\n signature?: string | null;\r\n statusCode: number | null;\r\n responseBody?: string | null;\r\n errorMessage?: string | null;\r\n latencyMs: number | null;\r\n attemptNumber: number;\r\n maxAttempts: number;\r\n nextRetryAt?: string | null;\r\n createdAt: string;\r\n completedAt: string | null;\r\n}\r\n\r\nexport interface WebhookDeliveryListResponse {\r\n deliveries: WebhookDelivery[];\r\n total: number;\r\n page: number;\r\n pageSize: number;\r\n}\r\n\r\ntype QueryValue = string | number | boolean | null | undefined;\r\ntype WireObject = Record<string, unknown>;\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 value = body as Record<string, unknown>;\r\n if (typeof value.detail === \"string\") return value.detail;\r\n if (value.error && typeof value.error === \"object\") {\r\n const error = value.error as Record<string, unknown>;\r\n if (typeof error.message === \"string\") return error.message;\r\n }\r\n if (Array.isArray(value.detail) && value.detail.length > 0) {\r\n const first = value.detail[0];\r\n if (first && typeof first === \"object\" && typeof (first as Record<string, unknown>).msg === \"string\") {\r\n return (first as Record<string, unknown>).msg as string;\r\n }\r\n }\r\n return undefined;\r\n}\r\nfunction extractBodyRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const value = body as Record<string, unknown>;\r\n if (typeof value.retry_after === \"number\") return value.retry_after;\r\n if (value.error && typeof value.error === \"object\") {\r\n const retryAfter = (value.error as Record<string, unknown>).retry_after;\r\n if (typeof retryAfter === \"number\") return retryAfter;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction parseRetryAfter(value: string | null): number | undefined {\r\n if (!value) return undefined;\r\n const seconds = Number(value);\r\n if (Number.isFinite(seconds) && seconds >= 0) return seconds;\r\n const date = Date.parse(value);\r\n if (Number.isNaN(date)) return undefined;\r\n return Math.max(0, Math.ceil((date - Date.now()) / 1000));\r\n}\r\n\r\nfunction snakeToCamel(key: string): string {\r\n return key.replace(/_([a-z0-9])/g, (_, character: string) => character.toUpperCase());\r\n}\r\n\r\nconst OPAQUE_RESPONSE_KEYS = new Set([\"payload\", \"metadata\", \"geo\", \"configuration\"]);\r\n\r\nfunction normalizeResponse(value: unknown): unknown {\r\n if (Array.isArray(value)) return value.map(normalizeResponse);\r\n if (!value || typeof value !== \"object\") return value;\r\n const normalized: Record<string, unknown> = {};\r\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\r\n const camelKey = snakeToCamel(key);\r\n normalized[camelKey] = OPAQUE_RESPONSE_KEYS.has(camelKey) ? item : normalizeResponse(item);\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction queryString(values: Record<string, QueryValue>): string {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(values)) {\r\n if (value !== undefined && value !== null) params.set(key, String(value));\r\n }\r\n const encoded = params.toString();\r\n return encoded ? `?${encoded}` : \"\";\r\n}\r\n\r\nfunction positiveId(value: number, name: string): void {\r\n if (!Number.isInteger(value) || value <= 0) {\r\n throw new ValidationError(`${name} must be a positive integer`);\r\n }\r\n}\r\n\r\nfunction nonEmpty(value: string, name: string): void {\r\n if (!value.trim()) throw new ValidationError(`${name} must not be empty`);\r\n}\r\nfunction webhookRetryConfig(config: WebhookRetryConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.enabled !== undefined) wire.enabled = config.enabled;\r\n if (config.maxRetries !== undefined) wire.max_retries = config.maxRetries;\r\n if (config.initialDelaySeconds !== undefined) wire.initial_delay_seconds = config.initialDelaySeconds;\r\n if (config.maxDelaySeconds !== undefined) wire.max_delay_seconds = config.maxDelaySeconds;\r\n if (config.backoffMultiplier !== undefined) wire.backoff_multiplier = config.backoffMultiplier;\r\n if (config.retryStatusCodes !== undefined) wire.retry_status_codes = config.retryStatusCodes;\r\n return wire;\r\n}\r\n\r\nfunction webhookSignatureConfig(config: WebhookSignatureConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.algorithm !== undefined) wire.algorithm = config.algorithm;\r\n if (config.headerName !== undefined) wire.header_name = config.headerName;\r\n if (config.timestampHeader !== undefined) wire.timestamp_header = config.timestampHeader;\r\n if (config.toleranceSeconds !== undefined) wire.tolerance_seconds = config.toleranceSeconds;\r\n return wire;\r\n}\r\n\r\nfunction validateWebhook(name: string, url: string, events: string[]): void {\r\n nonEmpty(name, \"name\");\r\n if (name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n if (!Array.isArray(events) || events.length === 0 || events.some((event) => !event.trim())) {\r\n throw new ValidationError(\"events must contain at least one non-empty event type\");\r\n }\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(url);\r\n } catch {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.username || parsed.password) throw new ValidationError(\"url must not contain credentials\");\r\n}\r\n\r\ninterface RequestOptions extends ControlPlaneRequestOptions {\r\n body?: unknown;\r\n auth?: boolean;\r\n}\r\n\r\nexport class ControlPlaneClient {\r\n private readonly baseUrl: string;\r\n private readonly accessToken?: string;\r\n private readonly projectId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n constructor(config: ControlPlaneConfig) {\r\n if (!config.baseUrl?.trim()) throw new ValidationError(\"baseUrl is required\");\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(config.baseUrl);\r\n } catch {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (config.accessToken !== undefined && !config.accessToken.trim()) {\r\n throw new ValidationError(\"accessToken must not be empty when provided\");\r\n }\r\n if (config.projectId !== undefined && !config.projectId.trim()) {\r\n throw new ValidationError(\"projectId must not be empty when provided\");\r\n }\r\n if (config.timeoutMs !== undefined && (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)) {\r\n throw new ValidationError(\"timeoutMs must be greater than zero\");\r\n }\r\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\r\n this.accessToken = config.accessToken?.trim();\r\n this.projectId = config.projectId?.trim();\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const implementation = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!implementation) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = implementation;\r\n }\r\n\r\n private async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\r\n const requiresAuth = options.auth !== false;\r\n if (requiresAuth && !this.accessToken) {\r\n throw new AuthError(\"accessToken is required for this operation\");\r\n }\r\n if (options.projectId !== undefined && !options.projectId.trim()) {\r\n throw new ValidationError(\"projectId override must not be empty\");\r\n }\r\n const headers: Record<string, string> = {\r\n Accept: \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n };\r\n if (requiresAuth) headers.Authorization = `Bearer ${this.accessToken}`;\r\n const selectedProject = options.projectId?.trim() ?? this.projectId;\r\n if (selectedProject) headers[\"X-Project-ID\"] = selectedProject;\r\n if (options.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\r\n\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\r\n method,\r\n headers,\r\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\r\n signal: controller.signal,\r\n });\r\n const requestId = response.headers.get(\"X-Request-ID\") ?? undefined;\r\n if (response.status === 204) return undefined as T;\r\n const text = await response.text();\r\n const parsedBody = text ? safeJson(text) : null;\r\n if (!response.ok) {\r\n this.throwForStatus(response.status, parsedBody, requestId, response.headers.get(\"Retry-After\"));\r\n }\r\n return normalizeResponse(parsedBody) as T;\r\n } catch (error) {\r\n if (error instanceof MemorySyncError) throw error;\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new MemorySyncError(`Network error: ${message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n private throwForStatus(\r\n status: number,\r\n body: unknown,\r\n requestId: string | undefined,\r\n retryAfterHeader: string | null,\r\n ): never {\r\n const detail = extractDetail(body);\r\n const options: ErrorOptions = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", options);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", options);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", options);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", options);\r\n }\r\n if (status === 429) {\r\n const retryAfter = parseRetryAfter(retryAfterHeader) ?? extractBodyRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, options);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, options);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, options);\r\n }\r\n\r\n async bulkRevokeApiKeys(\r\n request: BulkRevokeApiKeysRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<BulkRevokeApiKeysResponse> {\r\n if (!Array.isArray(request.keyIds) || request.keyIds.length < 1 || request.keyIds.length > 100) {\r\n throw new ValidationError(\"keyIds must contain between 1 and 100 entries\");\r\n }\r\n request.keyIds.forEach((id) => positiveId(id, \"keyIds entry\"));\r\n return this.request(\"POST\", \"/org/api-keys/bulk-revoke\", {\r\n ...options,\r\n body: { key_ids: request.keyIds },\r\n });\r\n }\r\n\r\n async testApiKey(keyId: number, options: ControlPlaneRequestOptions = {}): Promise<ApiKeyTestResponse> {\r\n positiveId(keyId, \"keyId\");\r\n return this.request(\"POST\", `/org/api-keys/${keyId}/test`, options);\r\n }\r\n\r\n async login(request: LoginRequest, options: ControlPlaneRequestOptions = {}): Promise<LoginResponse> {\r\n nonEmpty(request.email, \"email\");\r\n nonEmpty(request.password, \"password\");\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(request.email)) {\r\n throw new ValidationError(\"email must be a valid email address\");\r\n }\r\n return this.request(\"POST\", \"/auth/login\", {\r\n ...options,\r\n auth: false,\r\n body: { email: request.email, password: request.password },\r\n });\r\n }\r\n\r\n async getCurrentPlan(options: ControlPlaneRequestOptions = {}): Promise<CurrentPlanResponse> {\r\n return this.request(\"GET\", \"/org/billing/current-plan\", options);\r\n }\r\n async listTeamMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.request(\"GET\", \"/admin/team/members\", options);\r\n }\r\n\r\n async suspendTeamMember(\r\n memberId: number,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TeamMember> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"PATCH\", `/admin/team/members/${memberId}`, {\r\n ...options,\r\n body: { status: \"suspended\" },\r\n });\r\n }\r\n\r\n async removeTeamMember(memberId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"DELETE\", `/admin/team/members/${memberId}`, options);\r\n }\r\n\r\n async listSessions(options: ControlPlaneRequestOptions = {}): Promise<SessionListResponse> {\r\n return this.request(\"GET\", \"/auth/sessions\", options);\r\n }\r\n\r\n async revokeSession(sessionId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(sessionId, \"sessionId\");\r\n return this.request(\"POST\", `/auth/sessions/${sessionId}/revoke`, options);\r\n }\r\n\r\n async listAuditEvents(\r\n query: AuditEventQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<AuditEventListResponse> {\r\n if (query.limit !== undefined) positiveId(query.limit, \"limit\");\r\n if (query.cursor !== undefined) positiveId(query.cursor, \"cursor\");\r\n if (query.skip !== undefined && (!Number.isInteger(query.skip) || query.skip < 0)) {\r\n throw new ValidationError(\"skip must be a non-negative integer\");\r\n }\r\n const path = \"/admin/audit-logs\" + queryString({\r\n limit: query.limit,\r\n cursor: query.cursor,\r\n skip: query.skip,\r\n sort: query.sortDirection,\r\n tenant_id: query.tenantId,\r\n actor: query.actor,\r\n actor_email: query.actorEmail,\r\n ip: query.ip,\r\n action: query.action,\r\n resource_type: query.resourceType,\r\n resource_id: query.resourceId,\r\n severity: query.severity,\r\n category: query.category,\r\n start: query.start,\r\n end: query.end,\r\n success: query.success,\r\n source: query.source,\r\n ingest_method: query.ingestMethod,\r\n search: query.search,\r\n });\r\n const raw = await this.request<{\r\n logs: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n }>(\"GET\", path, options);\r\n return {\r\n events: raw.logs ?? [],\r\n nextCursor: raw.nextCursor ?? null,\r\n stats: raw.stats ?? null,\r\n sort: raw.sort ?? query.sortDirection ?? \"desc\",\r\n };\r\n }\r\n async listIntegrations(\r\n query: IntegrationQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Integration[]> {\r\n const path = \"/api/v1/integrations/catalog\" + queryString({ category: query.category });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async createOrganization(\r\n request: CreateOrganizationRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationMembership> {\r\n nonEmpty(request.name, \"name\");\r\n if (request.domain !== undefined) nonEmpty(request.domain, \"domain\");\r\n const body: WireObject = { name: request.name };\r\n if (request.domain !== undefined) body.domain = request.domain;\r\n return this.request(\"POST\", \"/organizations\", { ...options, body });\r\n }\r\n\r\n async listOrganizations(options: ControlPlaneRequestOptions = {}): Promise<OrganizationMembership[]> {\r\n return this.request(\"GET\", \"/organizations\", options);\r\n }\r\n\r\n async listOrganizationMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.listTeamMembers(options);\r\n }\r\n\r\n async getOrganizationSettings(\r\n query: OrganizationSettingsQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationSettings> {\r\n if (query.tenantId !== undefined) nonEmpty(query.tenantId, \"tenantId\");\r\n const path = \"/admin/tenant-settings\" + queryString({ tenant_id: query.tenantId });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async listProjects(options: ControlPlaneRequestOptions = {}): Promise<Project[]> {\r\n return this.request(\"GET\", \"/org/projects\", options);\r\n }\r\n\r\n async createWebhook(\r\n request: CreateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<CreatedWebhook> {\r\n validateWebhook(request.name, request.url, request.events);\r\n if (request.description !== undefined && request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n if (request.projectId !== undefined) nonEmpty(request.projectId, \"projectId\");\r\n const body: WireObject = { name: request.name, url: request.url, events: request.events };\r\n if (request.description !== undefined) body.description = request.description;\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (request.projectId !== undefined) body.project_id = request.projectId;\r\n return this.request(\"POST\", \"/org/webhooks\", { ...options, body });\r\n }\r\n async listWebhooks(options: ControlPlaneRequestOptions = {}): Promise<WebhookListResponse> {\r\n return this.request(\"GET\", \"/org/webhooks\", options);\r\n }\r\n\r\n async updateWebhook(\r\n endpointId: number,\r\n request: UpdateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Webhook> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.name !== undefined) {\r\n nonEmpty(request.name, \"name\");\r\n if (request.name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n body.name = request.name;\r\n }\r\n if (request.url !== undefined) {\r\n validateWebhook(\"update\", request.url, [\"validation\"]);\r\n body.url = request.url;\r\n }\r\n if (request.description !== undefined) {\r\n if (request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n body.description = request.description;\r\n }\r\n if (request.events !== undefined) {\r\n if (request.events.length === 0 || request.events.some((event) => !event.trim())) {\r\n throw new ValidationError(\"events must contain at least one non-empty event type\");\r\n }\r\n body.events = request.events;\r\n }\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"updateWebhook requires at least one editable field\");\r\n }\r\n return this.request(\"PATCH\", `/org/webhooks/${endpointId}`, { ...options, body });\r\n }\r\n\r\n async deleteWebhook(endpointId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(endpointId, \"endpointId\");\r\n return this.request(\"DELETE\", `/org/webhooks/${endpointId}`, options);\r\n }\r\n\r\n async testWebhook(\r\n endpointId: number,\r\n request: TestWebhookRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TestWebhookResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.eventType !== undefined) {\r\n nonEmpty(request.eventType, \"eventType\");\r\n body.event_type = request.eventType;\r\n }\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/test`, { ...options, body });\r\n }\r\n async replayWebhookDeliveries(\r\n endpointId: number,\r\n request: ReplayWebhookDeliveriesRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<ReplayWebhookDeliveriesResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (request.sinceMinutes !== undefined &&\r\n (!Number.isInteger(request.sinceMinutes) || request.sinceMinutes < 1 || request.sinceMinutes > 10_080)) {\r\n throw new ValidationError(\"sinceMinutes must be an integer between 1 and 10080\");\r\n }\r\n if (request.limit !== undefined &&\r\n (!Number.isInteger(request.limit) || request.limit < 1 || request.limit > 1_000)) {\r\n throw new ValidationError(\"limit must be an integer between 1 and 1000\");\r\n }\r\n if (request.statuses !== undefined &&\r\n (request.statuses.length === 0 || request.statuses.some((status) => !status.trim()))) {\r\n throw new ValidationError(\"statuses must contain at least one non-empty status\");\r\n }\r\n const body: WireObject = {};\r\n if (request.sinceMinutes !== undefined) body.since_minutes = request.sinceMinutes;\r\n if (request.statuses !== undefined) body.statuses = request.statuses;\r\n if (request.limit !== undefined) body.limit = request.limit;\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/replay`, { ...options, body });\r\n }\r\n\r\n async listWebhookDeliveries(\r\n endpointId: number,\r\n query: WebhookDeliveryQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<WebhookDeliveryListResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (query.page !== undefined) positiveId(query.page, \"page\");\r\n if (query.pageSize !== undefined &&\r\n (!Number.isInteger(query.pageSize) || query.pageSize < 1 || query.pageSize > 100)) {\r\n throw new ValidationError(\"pageSize must be an integer between 1 and 100\");\r\n }\r\n if (query.status !== undefined) nonEmpty(query.status, \"status\");\r\n const path = `/org/webhooks/${endpointId}/deliveries` + queryString({\r\n page: query.page,\r\n page_size: query.pageSize,\r\n status_filter: query.status,\r\n });\r\n return this.request(\"GET\", path, options);\r\n }\r\n}\r\n","/**\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\nimport {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nexport {\r\n AuthError,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\ntype ErrorOpts = ErrorOptions;\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.1.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\r\nexport * from \"./control-plane\";\r\n"],"mappings":"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","names":["SDK_VERSION","safeJson","extractDetail"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/control-plane.ts","../src/index.ts"],"sourcesContent":["export interface ErrorOptions {\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\r\n constructor(message: string, options: ErrorOptions = {}) {\r\n super(message);\r\n this.name = \"MemorySyncError\";\r\n this.statusCode = options.statusCode;\r\n this.response = options.response;\r\n this.requestId = options.requestId;\r\n }\r\n}\r\n\r\nexport class AuthError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"AuthError\";\r\n }\r\n}\r\n\r\nexport class ValidationError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends MemorySyncError {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\nexport class RateLimitError extends MemorySyncError {\r\n readonly retryAfterSeconds: number;\r\n\r\n constructor(message: string, retryAfterSeconds: number, options?: ErrorOptions) {\r\n super(message, options);\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, options?: ErrorOptions) {\r\n super(message, options);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n","import {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nconst SDK_VERSION = \"1.1.1\";\r\n\r\nexport interface ControlPlaneConfig {\r\n baseUrl: string;\r\n accessToken?: string;\r\n projectId?: string;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n}\r\n\r\nexport interface ControlPlaneRequestOptions {\r\n projectId?: string;\r\n}\r\n\r\nexport interface LoginRequest {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport interface LoginResponse {\r\n tokens: {\r\n accessToken: string;\r\n refreshToken: string;\r\n tokenType: string;\r\n };\r\n session: {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n };\r\n mfaRequired: boolean;\r\n mfaSetupRequired: boolean;\r\n}\r\n\r\nexport type ApiKeyTestStatus = \"active\" | \"revoked\" | \"expired\" | string;\r\nexport interface BulkRevokeApiKeysRequest {\r\n keyIds: number[];\r\n}\r\n\r\nexport interface BulkRevokeApiKeyResult {\r\n keyId: number;\r\n status: \"revoked\" | \"already_revoked\" | \"not_found\" | \"forbidden\";\r\n}\r\n\r\nexport interface BulkRevokeApiKeysResponse {\r\n revoked: number;\r\n alreadyRevoked: number;\r\n notFound: number;\r\n results: BulkRevokeApiKeyResult[];\r\n}\r\n\r\nexport interface ApiKeyTestResponse {\r\n keyId: number;\r\n valid: boolean;\r\n status: ApiKeyTestStatus;\r\n environment: string;\r\n rateLimitTier: string;\r\n scopes: string[];\r\n projectId: string | null;\r\n lastUsedAt: string | null;\r\n expiresAt: string | null;\r\n expired: boolean;\r\n serverTime: string;\r\n}\r\n\r\nexport interface PlanLimits {\r\n addRequests: number | null;\r\n retrievalRequests: number | null;\r\n}\r\n\r\nexport interface Plan {\r\n id: string;\r\n name: string;\r\n priceCents?: number | null;\r\n priceLabel: string;\r\n description?: string;\r\n limits: PlanLimits;\r\n features?: string[];\r\n ctaLabel?: string;\r\n isEnterprise?: boolean;\r\n}\r\n\r\nexport interface CurrentPlanResponse {\r\n plan: Plan;\r\n status: string;\r\n billingPeriodStart: string | null;\r\n billingPeriodEnd: string | null;\r\n nextResetAt?: string | null;\r\n planLimitAdd?: number | null;\r\n planLimitRetrieval?: number | null;\r\n paymentFailed: boolean;\r\n paymentStatus?: string;\r\n scheduledPlanId: string | null;\r\n cancelAtPeriodEnd: boolean;\r\n}\r\nexport interface TeamMember {\r\n id: string;\r\n name: string;\r\n email: string;\r\n role: string;\r\n status: string;\r\n lastActive?: string | null;\r\n mfaEnabled: boolean;\r\n authMethod: string;\r\n loginProvider?: string;\r\n devices?: number;\r\n sessions: number;\r\n isScimManaged?: boolean;\r\n}\r\n\r\nexport interface Session {\r\n id: number;\r\n isCurrent: boolean;\r\n sessionType: string;\r\n sessionName: string;\r\n userAgent: string;\r\n ip: string;\r\n location: string | null;\r\n geo: Record<string, unknown> | null;\r\n createdAt: string;\r\n lastActivityAt: string;\r\n expiresAt: string;\r\n}\r\n\r\nexport interface SessionListResponse {\r\n sessions: Session[];\r\n currentSessionId: number | null;\r\n}\r\n\r\nexport type AuditSortDirection = \"asc\" | \"desc\";\r\n\r\nexport interface AuditEventQuery {\r\n limit?: number;\r\n cursor?: number;\r\n skip?: number;\r\n sortDirection?: AuditSortDirection;\r\n tenantId?: string;\r\n actor?: string;\r\n actorEmail?: string;\r\n ip?: string;\r\n action?: string;\r\n resourceType?: string;\r\n resourceId?: string;\r\n severity?: string;\r\n category?: string;\r\n start?: string;\r\n end?: string;\r\n success?: boolean;\r\n source?: string;\r\n ingestMethod?: string;\r\n search?: string;\r\n includeStats?: boolean;\r\n}\r\n\r\nexport interface AuditActor {\r\n id: string;\r\n email: string | null;\r\n name: string | null;\r\n type: string;\r\n}\r\n\r\nexport interface AuditResource {\r\n type: string;\r\n id: string;\r\n label: string | null;\r\n}\r\nexport interface AuditEvent {\r\n id: number;\r\n eventId: string;\r\n timestamp: string;\r\n category: string;\r\n actor: AuditActor;\r\n action: string;\r\n resource: AuditResource;\r\n severity: string;\r\n success: boolean;\r\n metadata?: Record<string, unknown> | null;\r\n}\r\n\r\nexport interface AuditEventListResponse {\r\n events: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n}\r\n\r\nexport interface IntegrationQuery {\r\n category?: string;\r\n}\r\n\r\nexport interface Integration {\r\n id: string;\r\n name: string;\r\n description: string;\r\n category: string;\r\n features: string[];\r\n authType: string;\r\n isConfigured: boolean;\r\n isConnected: boolean;\r\n comingSoon: boolean;\r\n}\r\n\r\nexport interface CreateOrganizationRequest {\r\n name: string;\r\n domain?: string;\r\n}\r\n\r\nexport interface OrganizationMembership {\r\n userId: number;\r\n organizationId: number;\r\n role: string;\r\n}\r\n\r\nexport interface OrganizationSettingsQuery {\r\n tenantId?: string;\r\n}\r\n\r\nexport interface OrganizationSettings {\r\n tenantId: string;\r\n tenantName: string;\r\n tenantSlug: string;\r\n description: string | null;\r\n plan: string;\r\n status: string;\r\n createdAt: string;\r\n contactEmail: string | null;\r\n customDomain: string | null;\r\n customDomainVerified: boolean;\r\n logoUrl: string | null;\r\n totalMemories: number;\r\n activeUsers: number;\r\n organizationName: string;\r\n scheduledDeletionAt: string | null;\r\n mfaEnrolled: boolean;\r\n passwordEnabled: boolean;\r\n}\r\nexport interface Project {\r\n id: string;\r\n name: string;\r\n tenantId: string;\r\n isDefault: boolean;\r\n memoryCount: number;\r\n archivedAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface WebhookRetryConfig {\r\n enabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n}\r\n\r\nexport interface WebhookSignatureConfig {\r\n algorithm?: \"hmac-sha256\" | \"hmac-sha512\";\r\n headerName?: string;\r\n timestampHeader?: string;\r\n toleranceSeconds?: number;\r\n}\r\n\r\nexport interface CreateWebhookRequest {\r\n name: string;\r\n url: string;\r\n events: string[];\r\n description?: string;\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n projectId?: string;\r\n}\r\n\r\nexport interface UpdateWebhookRequest {\r\n name?: string;\r\n url?: string;\r\n description?: string;\r\n events?: string[];\r\n retryConfig?: WebhookRetryConfig;\r\n signatureConfig?: WebhookSignatureConfig;\r\n}\r\n\r\nexport interface Webhook {\r\n id: number;\r\n name: string;\r\n url: string;\r\n description: string | null;\r\n secretPrefix: string;\r\n events: string[];\r\n enabled: boolean;\r\n signatureAlgorithm: string;\r\n signatureHeader?: string;\r\n timestampHeader?: string;\r\n signatureTolerance?: number;\r\n retryEnabled?: boolean;\r\n maxRetries?: number;\r\n initialDelaySeconds?: number;\r\n maxDelaySeconds?: number;\r\n backoffMultiplier?: number;\r\n retryStatusCodes?: string[];\r\n totalDeliveries?: number;\r\n successfulDeliveries?: number;\r\n failedDeliveries?: number;\r\n consecutiveFailures?: number;\r\n successRate?: number;\r\n lastTriggeredAt?: string | null;\r\n lastSuccessAt?: string | null;\r\n lastFailureAt?: string | null;\r\n lastError?: string | null;\r\n lastStatusCode?: number | null;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n createdByName?: string | null;\r\n projectId: string | null;\r\n}\r\n\r\nexport interface CreatedWebhook extends Webhook {\r\n secret: string;\r\n}\r\n\r\nexport interface WebhookListResponse {\r\n endpoints: Webhook[];\r\n totalEndpoints: number;\r\n activeEndpoints: number;\r\n totalDeliveries: number;\r\n avgSuccessRate: number;\r\n failingEndpoints: number;\r\n}\r\n\r\nexport interface TestWebhookRequest {\r\n eventType?: string;\r\n}\r\n\r\nexport interface TestWebhookResponse {\r\n deliveryId: number;\r\n eventId: string;\r\n eventType: string;\r\n endpointId: number;\r\n status: string;\r\n payload: Record<string, unknown>;\r\n message: string;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesRequest {\r\n sinceMinutes?: number;\r\n statuses?: string[];\r\n limit?: number;\r\n}\r\n\r\nexport interface ReplayWebhookDeliveriesResponse {\r\n endpointId: number;\r\n eligible: number;\r\n replayed: number;\r\n skipped: number;\r\n deliveryIds: number[];\r\n}\r\n\r\nexport interface WebhookDeliveryQuery {\r\n page?: number;\r\n pageSize?: number;\r\n status?: string;\r\n}\r\nexport interface WebhookDelivery {\r\n id: number;\r\n endpointId: number;\r\n eventType: string;\r\n eventId: string;\r\n status: string;\r\n payload?: Record<string, unknown>;\r\n payloadHash: string;\r\n signature?: string | null;\r\n statusCode: number | null;\r\n responseBody?: string | null;\r\n errorMessage?: string | null;\r\n latencyMs: number | null;\r\n attemptNumber: number;\r\n maxAttempts: number;\r\n nextRetryAt?: string | null;\r\n createdAt: string;\r\n completedAt: string | null;\r\n}\r\n\r\nexport interface WebhookDeliveryListResponse {\r\n deliveries: WebhookDelivery[];\r\n total: number;\r\n page: number;\r\n pageSize: number;\r\n}\r\n\r\ntype QueryValue = string | number | boolean | null | undefined;\r\ntype WireObject = Record<string, unknown>;\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 value = body as Record<string, unknown>;\r\n if (typeof value.detail === \"string\") return value.detail;\r\n if (value.error && typeof value.error === \"object\") {\r\n const error = value.error as Record<string, unknown>;\r\n if (typeof error.message === \"string\") return error.message;\r\n }\r\n if (Array.isArray(value.detail) && value.detail.length > 0) {\r\n const first = value.detail[0];\r\n if (first && typeof first === \"object\" && typeof (first as Record<string, unknown>).msg === \"string\") {\r\n return (first as Record<string, unknown>).msg as string;\r\n }\r\n }\r\n return undefined;\r\n}\r\nfunction extractBodyRetryAfter(body: unknown): number {\r\n if (!body || typeof body !== \"object\") return 0;\r\n const value = body as Record<string, unknown>;\r\n if (typeof value.retry_after === \"number\") return value.retry_after;\r\n if (value.error && typeof value.error === \"object\") {\r\n const retryAfter = (value.error as Record<string, unknown>).retry_after;\r\n if (typeof retryAfter === \"number\") return retryAfter;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction parseRetryAfter(value: string | null): number | undefined {\r\n if (!value) return undefined;\r\n const seconds = Number(value);\r\n if (Number.isFinite(seconds) && seconds >= 0) return seconds;\r\n const date = Date.parse(value);\r\n if (Number.isNaN(date)) return undefined;\r\n return Math.max(0, Math.ceil((date - Date.now()) / 1000));\r\n}\r\n\r\nfunction snakeToCamel(key: string): string {\r\n return key.replace(/_([a-z0-9])/g, (_, character: string) => character.toUpperCase());\r\n}\r\n\r\nconst OPAQUE_RESPONSE_KEYS = new Set([\"payload\", \"metadata\", \"geo\", \"configuration\"]);\r\n\r\nfunction normalizeResponse(value: unknown): unknown {\r\n if (Array.isArray(value)) return value.map(normalizeResponse);\r\n if (!value || typeof value !== \"object\") return value;\r\n const normalized: Record<string, unknown> = {};\r\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\r\n const camelKey = snakeToCamel(key);\r\n normalized[camelKey] = OPAQUE_RESPONSE_KEYS.has(camelKey) ? item : normalizeResponse(item);\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction queryString(values: Record<string, QueryValue>): string {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(values)) {\r\n if (value !== undefined && value !== null) params.set(key, String(value));\r\n }\r\n const encoded = params.toString();\r\n return encoded ? `?${encoded}` : \"\";\r\n}\r\n\r\nfunction positiveId(value: number, name: string): void {\r\n if (!Number.isInteger(value) || value <= 0) {\r\n throw new ValidationError(`${name} must be a positive integer`);\r\n }\r\n}\r\n\r\nfunction nonEmpty(value: string, name: string): void {\r\n if (typeof value !== \"string\" || !value.trim()) throw new ValidationError(`${name} must not be empty`);\r\n}\r\n\r\nfunction boundedInteger(value: number, name: string, minimum: number, maximum: number): void {\r\n if (!Number.isInteger(value) || value < minimum || value > maximum) {\r\n throw new ValidationError(`${name} must be an integer between ${minimum} and ${maximum}`);\r\n }\r\n}\r\n\r\nfunction nonNegativeInteger(value: number, name: string): void {\r\n if (!Number.isInteger(value) || value < 0) {\r\n throw new ValidationError(`${name} must be a non-negative integer`);\r\n }\r\n}\r\n\r\nfunction nonEmptyStrings(values: string[], name: string): void {\r\n if (!Array.isArray(values) || values.length === 0 ||\r\n values.some((value) => typeof value !== \"string\" || !value.trim())) {\r\n throw new ValidationError(`${name} must contain at least one non-empty string`);\r\n }\r\n}\r\nfunction webhookRetryConfig(config: WebhookRetryConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.enabled !== undefined) wire.enabled = config.enabled;\r\n if (config.maxRetries !== undefined) wire.max_retries = config.maxRetries;\r\n if (config.initialDelaySeconds !== undefined) wire.initial_delay_seconds = config.initialDelaySeconds;\r\n if (config.maxDelaySeconds !== undefined) wire.max_delay_seconds = config.maxDelaySeconds;\r\n if (config.backoffMultiplier !== undefined) wire.backoff_multiplier = config.backoffMultiplier;\r\n if (config.retryStatusCodes !== undefined) wire.retry_status_codes = config.retryStatusCodes;\r\n return wire;\r\n}\r\n\r\nfunction webhookSignatureConfig(config: WebhookSignatureConfig): WireObject {\r\n const wire: WireObject = {};\r\n if (config.algorithm !== undefined) wire.algorithm = config.algorithm;\r\n if (config.headerName !== undefined) wire.header_name = config.headerName;\r\n if (config.timestampHeader !== undefined) wire.timestamp_header = config.timestampHeader;\r\n if (config.toleranceSeconds !== undefined) wire.tolerance_seconds = config.toleranceSeconds;\r\n return wire;\r\n}\r\n\r\nfunction validateWebhook(name: string, url: string, events: string[]): void {\r\n nonEmpty(name, \"name\");\r\n if (name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n nonEmptyStrings(events, \"events\");\r\n validateWebhookUrl(url);\r\n}\r\n\r\nfunction validateWebhookUrl(url: string): void {\r\n nonEmpty(url, \"url\");\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(url);\r\n } catch {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"url must be a valid HTTP or HTTPS URL\");\r\n }\r\n if (parsed.username || parsed.password) throw new ValidationError(\"url must not contain credentials\");\r\n}\r\n\r\ninterface RequestOptions extends ControlPlaneRequestOptions {\r\n body?: unknown;\r\n auth?: boolean;\r\n}\r\n\r\nexport class ControlPlaneClient {\r\n private readonly baseUrl: string;\r\n private readonly accessToken?: string;\r\n private readonly projectId?: string;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: typeof fetch;\r\n constructor(config: ControlPlaneConfig) {\r\n if (!config.baseUrl?.trim()) throw new ValidationError(\"baseUrl is required\");\r\n let parsed: URL;\r\n try {\r\n parsed = new URL(config.baseUrl);\r\n } catch {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\r\n throw new ValidationError(\"baseUrl must be an absolute HTTP or HTTPS URL\");\r\n }\r\n if (config.accessToken !== undefined && !config.accessToken.trim()) {\r\n throw new ValidationError(\"accessToken must not be empty when provided\");\r\n }\r\n if (config.projectId !== undefined && !config.projectId.trim()) {\r\n throw new ValidationError(\"projectId must not be empty when provided\");\r\n }\r\n if (config.timeoutMs !== undefined && (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)) {\r\n throw new ValidationError(\"timeoutMs must be greater than zero\");\r\n }\r\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\r\n this.accessToken = config.accessToken?.trim();\r\n this.projectId = config.projectId?.trim();\r\n this.timeoutMs = config.timeoutMs ?? 30_000;\r\n const implementation = config.fetch ?? (typeof fetch !== \"undefined\" ? fetch : undefined);\r\n if (!implementation) {\r\n throw new Error(\"No fetch implementation available. Pass `fetch` in config or use Node 18+.\");\r\n }\r\n this.fetchImpl = implementation;\r\n }\r\n\r\n private async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\r\n const requiresAuth = options.auth !== false;\r\n if (requiresAuth && !this.accessToken) {\r\n throw new AuthError(\"accessToken is required for this operation\");\r\n }\r\n if (options.projectId !== undefined && !options.projectId.trim()) {\r\n throw new ValidationError(\"projectId override must not be empty\");\r\n }\r\n const headers: Record<string, string> = {\r\n Accept: \"application/json\",\r\n \"User-Agent\": `memorysync-sdk-js/${SDK_VERSION}`,\r\n };\r\n if (requiresAuth) headers.Authorization = `Bearer ${this.accessToken}`;\r\n const selectedProject = options.projectId?.trim() ?? this.projectId;\r\n if (selectedProject) headers[\"X-Project-ID\"] = selectedProject;\r\n if (options.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\r\n\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\r\n try {\r\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\r\n method,\r\n headers,\r\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\r\n signal: controller.signal,\r\n });\r\n const requestId = response.headers.get(\"X-Request-ID\") ?? undefined;\r\n if (response.status === 204) return undefined as T;\r\n const text = await response.text();\r\n const parsedBody = text ? safeJson(text) : null;\r\n if (!response.ok) {\r\n this.throwForStatus(response.status, parsedBody, requestId, response.headers.get(\"Retry-After\"));\r\n }\r\n return normalizeResponse(parsedBody) as T;\r\n } catch (error) {\r\n if (error instanceof MemorySyncError) throw error;\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n throw new MemorySyncError(`Request timed out after ${this.timeoutMs}ms`);\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new MemorySyncError(`Network error: ${message}`);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n private throwForStatus(\r\n status: number,\r\n body: unknown,\r\n requestId: string | undefined,\r\n retryAfterHeader: string | null,\r\n ): never {\r\n const detail = extractDetail(body);\r\n const options: ErrorOptions = { statusCode: status, response: body, requestId };\r\n if (status === 401) throw new AuthError(detail || \"Unauthenticated\", options);\r\n if (status === 403) throw new AuthError(detail || \"Forbidden\", options);\r\n if (status === 404) throw new NotFoundError(detail || \"Not found\", options);\r\n if (status === 400 || status === 409 || status === 422) {\r\n throw new ValidationError(detail || \"Validation error\", options);\r\n }\r\n if (status === 429) {\r\n const retryAfter = parseRetryAfter(retryAfterHeader) ?? extractBodyRetryAfter(body);\r\n throw new RateLimitError(detail || \"Rate limited\", retryAfter, options);\r\n }\r\n if (status >= 500) throw new ServerError(detail || `Server error (${status})`, options);\r\n throw new MemorySyncError(detail || `Unexpected status ${status}`, options);\r\n }\r\n\r\n async bulkRevokeApiKeys(\r\n request: BulkRevokeApiKeysRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<BulkRevokeApiKeysResponse> {\r\n if (!Array.isArray(request.keyIds) || request.keyIds.length < 1 || request.keyIds.length > 100) {\r\n throw new ValidationError(\"keyIds must contain between 1 and 100 entries\");\r\n }\r\n request.keyIds.forEach((id) => positiveId(id, \"keyIds entry\"));\r\n return this.request(\"POST\", \"/org/api-keys/bulk-revoke\", {\r\n ...options,\r\n body: { key_ids: request.keyIds },\r\n });\r\n }\r\n\r\n async testApiKey(keyId: number, options: ControlPlaneRequestOptions = {}): Promise<ApiKeyTestResponse> {\r\n positiveId(keyId, \"keyId\");\r\n return this.request(\"POST\", `/org/api-keys/${keyId}/test`, options);\r\n }\r\n\r\n async login(request: LoginRequest, options: ControlPlaneRequestOptions = {}): Promise<LoginResponse> {\r\n nonEmpty(request.email, \"email\");\r\n nonEmpty(request.password, \"password\");\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(request.email)) {\r\n throw new ValidationError(\"email must be a valid email address\");\r\n }\r\n return this.request(\"POST\", \"/auth/login\", {\r\n ...options,\r\n auth: false,\r\n body: { email: request.email, password: request.password },\r\n });\r\n }\r\n\r\n async getCurrentPlan(options: ControlPlaneRequestOptions = {}): Promise<CurrentPlanResponse> {\r\n return this.request(\"GET\", \"/org/billing/current-plan\", options);\r\n }\r\n async listTeamMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.request(\"GET\", \"/admin/team/members\", options);\r\n }\r\n\r\n async suspendTeamMember(\r\n memberId: number,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TeamMember> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"PATCH\", `/admin/team/members/${memberId}`, {\r\n ...options,\r\n body: { status: \"suspended\" },\r\n });\r\n }\r\n\r\n async removeTeamMember(memberId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(memberId, \"memberId\");\r\n return this.request(\"DELETE\", `/admin/team/members/${memberId}`, options);\r\n }\r\n\r\n async listSessions(options: ControlPlaneRequestOptions = {}): Promise<SessionListResponse> {\r\n return this.request(\"GET\", \"/auth/sessions\", options);\r\n }\r\n\r\n async revokeSession(sessionId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(sessionId, \"sessionId\");\r\n return this.request(\"POST\", `/auth/sessions/${sessionId}/revoke`, options);\r\n }\r\n\r\n async listAuditEvents(\r\n query: AuditEventQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<AuditEventListResponse> {\r\n if (query.limit !== undefined) boundedInteger(query.limit, \"limit\", 1, 200);\r\n if (query.cursor !== undefined) nonNegativeInteger(query.cursor, \"cursor\");\r\n if (query.skip !== undefined) nonNegativeInteger(query.skip, \"skip\");\r\n if (query.sortDirection !== undefined && query.sortDirection !== \"asc\" && query.sortDirection !== \"desc\") {\r\n throw new ValidationError(\"sortDirection must be 'asc' or 'desc'\");\r\n }\r\n const path = \"/admin/audit-logs\" + queryString({\r\n limit: query.limit,\r\n cursor: query.cursor,\r\n skip: query.skip,\r\n sort: query.sortDirection,\r\n tenant_id: query.tenantId,\r\n actor: query.actor,\r\n actor_email: query.actorEmail,\r\n ip: query.ip,\r\n action: query.action,\r\n resource_type: query.resourceType,\r\n resource_id: query.resourceId,\r\n severity: query.severity,\r\n category: query.category,\r\n start: query.start,\r\n end: query.end,\r\n success: query.success,\r\n source: query.source,\r\n ingest_method: query.ingestMethod,\r\n search: query.search,\r\n include_stats: query.includeStats,\r\n });\r\n const raw = await this.request<{\r\n logs: AuditEvent[];\r\n nextCursor: number | null;\r\n stats?: Record<string, unknown> | null;\r\n sort: AuditSortDirection;\r\n }>(\"GET\", path, options);\r\n return {\r\n events: raw.logs ?? [],\r\n nextCursor: raw.nextCursor ?? null,\r\n stats: raw.stats ?? null,\r\n sort: raw.sort ?? query.sortDirection ?? \"desc\",\r\n };\r\n }\r\n async listIntegrations(\r\n query: IntegrationQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Integration[]> {\r\n if (query.category !== undefined) nonEmpty(query.category, \"category\");\r\n const path = \"/api/v1/integrations/catalog\" + queryString({ category: query.category });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async createOrganization(\r\n request: CreateOrganizationRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationMembership> {\r\n nonEmpty(request.name, \"name\");\r\n if (request.domain !== undefined) nonEmpty(request.domain, \"domain\");\r\n const body: WireObject = { name: request.name };\r\n if (request.domain !== undefined) body.domain = request.domain;\r\n return this.request(\"POST\", \"/organizations\", { ...options, body });\r\n }\r\n\r\n async listOrganizations(options: ControlPlaneRequestOptions = {}): Promise<OrganizationMembership[]> {\r\n return this.request(\"GET\", \"/organizations\", options);\r\n }\r\n\r\n async listOrganizationMembers(options: ControlPlaneRequestOptions = {}): Promise<TeamMember[]> {\r\n return this.listTeamMembers(options);\r\n }\r\n\r\n async getOrganizationSettings(\r\n query: OrganizationSettingsQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<OrganizationSettings> {\r\n if (query.tenantId !== undefined) nonEmpty(query.tenantId, \"tenantId\");\r\n const path = \"/admin/tenant-settings\" + queryString({ tenant_id: query.tenantId });\r\n return this.request(\"GET\", path, options);\r\n }\r\n\r\n async listProjects(options: ControlPlaneRequestOptions = {}): Promise<Project[]> {\r\n return this.request(\"GET\", \"/org/projects\", options);\r\n }\r\n\r\n async createWebhook(\r\n request: CreateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<CreatedWebhook> {\r\n validateWebhook(request.name, request.url, request.events);\r\n if (request.description !== undefined && request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n if (request.projectId !== undefined) nonEmpty(request.projectId, \"projectId\");\r\n if (options.projectId !== undefined) nonEmpty(options.projectId, \"projectId override\");\r\n if (request.projectId && options.projectId && request.projectId.trim() !== options.projectId.trim()) {\r\n throw new ValidationError(\"request projectId and options projectId must match\");\r\n }\r\n const body: WireObject = { name: request.name, url: request.url, events: request.events };\r\n if (request.description !== undefined) body.description = request.description;\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (request.projectId !== undefined) body.project_id = request.projectId;\r\n return this.request(\"POST\", \"/org/webhooks\", {\r\n ...options,\r\n projectId: options.projectId ?? request.projectId,\r\n body,\r\n });\r\n }\r\n async listWebhooks(options: ControlPlaneRequestOptions = {}): Promise<WebhookListResponse> {\r\n return this.request(\"GET\", \"/org/webhooks\", options);\r\n }\r\n\r\n async updateWebhook(\r\n endpointId: number,\r\n request: UpdateWebhookRequest,\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<Webhook> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.name !== undefined) {\r\n nonEmpty(request.name, \"name\");\r\n if (request.name.length > 128) throw new ValidationError(\"name may contain at most 128 characters\");\r\n body.name = request.name;\r\n }\r\n if (request.url !== undefined) {\r\n validateWebhookUrl(request.url);\r\n body.url = request.url;\r\n }\r\n if (request.description !== undefined) {\r\n if (request.description.length > 500) {\r\n throw new ValidationError(\"description may contain at most 500 characters\");\r\n }\r\n body.description = request.description;\r\n }\r\n if (request.events !== undefined) {\r\n nonEmptyStrings(request.events, \"events\");\r\n body.events = request.events;\r\n }\r\n if (request.retryConfig !== undefined) body.retry_config = webhookRetryConfig(request.retryConfig);\r\n if (request.signatureConfig !== undefined) body.signature_config = webhookSignatureConfig(request.signatureConfig);\r\n if (Object.keys(body).length === 0) {\r\n throw new ValidationError(\"updateWebhook requires at least one editable field\");\r\n }\r\n return this.request(\"PATCH\", `/org/webhooks/${endpointId}`, { ...options, body });\r\n }\r\n\r\n async deleteWebhook(endpointId: number, options: ControlPlaneRequestOptions = {}): Promise<void> {\r\n positiveId(endpointId, \"endpointId\");\r\n return this.request(\"DELETE\", `/org/webhooks/${endpointId}`, options);\r\n }\r\n\r\n async testWebhook(\r\n endpointId: number,\r\n request: TestWebhookRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<TestWebhookResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n const body: WireObject = {};\r\n if (request.eventType !== undefined) {\r\n nonEmpty(request.eventType, \"eventType\");\r\n body.event_type = request.eventType;\r\n }\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/test`, { ...options, body });\r\n }\r\n async replayWebhookDeliveries(\r\n endpointId: number,\r\n request: ReplayWebhookDeliveriesRequest = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<ReplayWebhookDeliveriesResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (request.sinceMinutes !== undefined &&\r\n (!Number.isInteger(request.sinceMinutes) || request.sinceMinutes < 1 || request.sinceMinutes > 10_080)) {\r\n throw new ValidationError(\"sinceMinutes must be an integer between 1 and 10080\");\r\n }\r\n if (request.limit !== undefined &&\r\n (!Number.isInteger(request.limit) || request.limit < 1 || request.limit > 1_000)) {\r\n throw new ValidationError(\"limit must be an integer between 1 and 1000\");\r\n }\r\n if (request.statuses !== undefined) nonEmptyStrings(request.statuses, \"statuses\");\r\n const body: WireObject = {};\r\n if (request.sinceMinutes !== undefined) body.since_minutes = request.sinceMinutes;\r\n if (request.statuses !== undefined) body.statuses = request.statuses;\r\n if (request.limit !== undefined) body.limit = request.limit;\r\n return this.request(\"POST\", `/org/webhooks/${endpointId}/replay`, { ...options, body });\r\n }\r\n\r\n async listWebhookDeliveries(\r\n endpointId: number,\r\n query: WebhookDeliveryQuery = {},\r\n options: ControlPlaneRequestOptions = {},\r\n ): Promise<WebhookDeliveryListResponse> {\r\n positiveId(endpointId, \"endpointId\");\r\n if (query.page !== undefined) positiveId(query.page, \"page\");\r\n if (query.pageSize !== undefined &&\r\n (!Number.isInteger(query.pageSize) || query.pageSize < 1 || query.pageSize > 100)) {\r\n throw new ValidationError(\"pageSize must be an integer between 1 and 100\");\r\n }\r\n if (query.status !== undefined) nonEmpty(query.status, \"status\");\r\n const path = `/org/webhooks/${endpointId}/deliveries` + queryString({\r\n page: query.page,\r\n page_size: query.pageSize,\r\n status_filter: query.status,\r\n });\r\n return this.request(\"GET\", path, options);\r\n }\r\n}\r\n","/**\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\nimport {\r\n AuthError,\r\n ErrorOptions,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\nexport {\r\n AuthError,\r\n MemorySyncError,\r\n NotFoundError,\r\n RateLimitError,\r\n ServerError,\r\n ValidationError,\r\n} from \"./errors\";\r\n\r\ntype ErrorOpts = ErrorOptions;\r\n\r\n// ───────────────────────────────────────────────────────────────────────\r\n// Internals\r\n// ───────────────────────────────────────────────────────────────────────\r\n\r\nconst SDK_VERSION = \"1.1.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\r\nexport * from \"./control-plane\";\r\n"],"mappings":"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","names":["SDK_VERSION","safeJson","extractDetail"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorysync-sdk",
3
- "version": "1.1.0",
3
+ "version": "1.1.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",