memorysync-sdk 1.7.3 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -807,6 +807,17 @@ interface AddRequest {
807
807
  sessionId?: string;
808
808
  metadata?: Record<string, unknown>;
809
809
  endUserId?: string;
810
+ /**
811
+ * Your own identifier for this record, at most 128 characters.
812
+ *
813
+ * Send it and re-sending the record is recognised rather than stored a second
814
+ * time: the call resolves to an {@link AddSkippedResponse} with reason
815
+ * `already_ingested` and the ids the first write produced. That makes an
816
+ * interrupted write safe to retry without first checking whether it landed.
817
+ * Near-duplicate detection is always on but compares *meaning*, so it is a
818
+ * filter and not a guarantee.
819
+ */
820
+ clientRef?: string;
810
821
  }
811
822
  interface MemoryRecord {
812
823
  id: number;
@@ -832,6 +843,16 @@ interface AddSkippedResponse {
832
843
  type AddResponse = MemoryRecord | AddSkippedResponse;
833
844
  interface BulkAddItem {
834
845
  text: string;
846
+ /**
847
+ * Your own identifier for this record, at most 128 characters.
848
+ *
849
+ * Send it and re-submitting the record is recognised rather than stored a
850
+ * second time: the item comes back `skipped` with reason `already_ingested`
851
+ * and the ids the first submission produced. This is what makes a large import
852
+ * safe to re-run. Near-duplicate detection is always on but compares
853
+ * *meaning*, so it is a filter and not a guarantee.
854
+ */
855
+ clientRef?: string;
835
856
  source?: string;
836
857
  eventType?: string;
837
858
  tags?: string[];
@@ -1093,6 +1114,46 @@ declare class MemorySyncClient {
1093
1114
  bulkAdd(items: BulkAddItem[], opts?: {
1094
1115
  deduplicate?: boolean;
1095
1116
  }): Promise<BulkAddResponse>;
1117
+ /**
1118
+ * Upload a payload and get an import job back, without waiting for it.
1119
+ *
1120
+ * `bulkAdd` accepts fifty records per call because each one runs the extraction
1121
+ * pipeline. For a migration out of another system, upload the whole file here
1122
+ * and poll {@link getImport}.
1123
+ *
1124
+ * `resume` requires `clientRef` on every record and is what makes re-running the
1125
+ * same file safe: records a previous run already stored come back counted as
1126
+ * `alreadyImported` rather than stored again.
1127
+ *
1128
+ * The payload is JSONL, or JSON when `filename` ends in `.json`. The extension
1129
+ * is how the server picks the reader, so it is required.
1130
+ */
1131
+ createImport(req: {
1132
+ file: Blob | Uint8Array | string;
1133
+ filename: string;
1134
+ endUserId?: string;
1135
+ resume?: boolean;
1136
+ continueOnError?: boolean;
1137
+ }): Promise<Record<string, unknown>>;
1138
+ /**
1139
+ * One import job's status, progress and per-outcome counters.
1140
+ *
1141
+ * `progress_percentage` stays below 100 until the job is genuinely finished, so
1142
+ * reaching 100 means done.
1143
+ */
1144
+ getImport(jobId: string): Promise<Record<string, unknown>>;
1145
+ /** Recent import jobs, newest first. */
1146
+ listImports(opts?: {
1147
+ status?: string;
1148
+ limit?: number;
1149
+ }): Promise<Record<string, unknown>>;
1150
+ /**
1151
+ * Ask the worker to stop between batches.
1152
+ *
1153
+ * Records already imported stay imported, and the counters report how far it
1154
+ * reached. Cancelling a finished job is a no-op rather than an error.
1155
+ */
1156
+ cancelImport(jobId: string): Promise<Record<string, unknown>>;
1096
1157
  query(req: QueryRequest): Promise<QueryResponse>;
1097
1158
  get(memoryId: number): Promise<MemoryRecord>;
1098
1159
  update(memoryId: number, req: UpdateRequest): Promise<MemoryRecord>;
package/dist/index.d.ts CHANGED
@@ -807,6 +807,17 @@ interface AddRequest {
807
807
  sessionId?: string;
808
808
  metadata?: Record<string, unknown>;
809
809
  endUserId?: string;
810
+ /**
811
+ * Your own identifier for this record, at most 128 characters.
812
+ *
813
+ * Send it and re-sending the record is recognised rather than stored a second
814
+ * time: the call resolves to an {@link AddSkippedResponse} with reason
815
+ * `already_ingested` and the ids the first write produced. That makes an
816
+ * interrupted write safe to retry without first checking whether it landed.
817
+ * Near-duplicate detection is always on but compares *meaning*, so it is a
818
+ * filter and not a guarantee.
819
+ */
820
+ clientRef?: string;
810
821
  }
811
822
  interface MemoryRecord {
812
823
  id: number;
@@ -832,6 +843,16 @@ interface AddSkippedResponse {
832
843
  type AddResponse = MemoryRecord | AddSkippedResponse;
833
844
  interface BulkAddItem {
834
845
  text: string;
846
+ /**
847
+ * Your own identifier for this record, at most 128 characters.
848
+ *
849
+ * Send it and re-submitting the record is recognised rather than stored a
850
+ * second time: the item comes back `skipped` with reason `already_ingested`
851
+ * and the ids the first submission produced. This is what makes a large import
852
+ * safe to re-run. Near-duplicate detection is always on but compares
853
+ * *meaning*, so it is a filter and not a guarantee.
854
+ */
855
+ clientRef?: string;
835
856
  source?: string;
836
857
  eventType?: string;
837
858
  tags?: string[];
@@ -1093,6 +1114,46 @@ declare class MemorySyncClient {
1093
1114
  bulkAdd(items: BulkAddItem[], opts?: {
1094
1115
  deduplicate?: boolean;
1095
1116
  }): Promise<BulkAddResponse>;
1117
+ /**
1118
+ * Upload a payload and get an import job back, without waiting for it.
1119
+ *
1120
+ * `bulkAdd` accepts fifty records per call because each one runs the extraction
1121
+ * pipeline. For a migration out of another system, upload the whole file here
1122
+ * and poll {@link getImport}.
1123
+ *
1124
+ * `resume` requires `clientRef` on every record and is what makes re-running the
1125
+ * same file safe: records a previous run already stored come back counted as
1126
+ * `alreadyImported` rather than stored again.
1127
+ *
1128
+ * The payload is JSONL, or JSON when `filename` ends in `.json`. The extension
1129
+ * is how the server picks the reader, so it is required.
1130
+ */
1131
+ createImport(req: {
1132
+ file: Blob | Uint8Array | string;
1133
+ filename: string;
1134
+ endUserId?: string;
1135
+ resume?: boolean;
1136
+ continueOnError?: boolean;
1137
+ }): Promise<Record<string, unknown>>;
1138
+ /**
1139
+ * One import job's status, progress and per-outcome counters.
1140
+ *
1141
+ * `progress_percentage` stays below 100 until the job is genuinely finished, so
1142
+ * reaching 100 means done.
1143
+ */
1144
+ getImport(jobId: string): Promise<Record<string, unknown>>;
1145
+ /** Recent import jobs, newest first. */
1146
+ listImports(opts?: {
1147
+ status?: string;
1148
+ limit?: number;
1149
+ }): Promise<Record<string, unknown>>;
1150
+ /**
1151
+ * Ask the worker to stop between batches.
1152
+ *
1153
+ * Records already imported stay imported, and the counters report how far it
1154
+ * reached. Cancelling a finished job is a no-op rather than an error.
1155
+ */
1156
+ cancelImport(jobId: string): Promise<Record<string, unknown>>;
1096
1157
  query(req: QueryRequest): Promise<QueryResponse>;
1097
1158
  get(memoryId: number): Promise<MemoryRecord>;
1098
1159
  update(memoryId: number, req: UpdateRequest): Promise<MemoryRecord>;
package/dist/index.js CHANGED
@@ -576,7 +576,7 @@ var IntegrationsNamespace = class extends Namespace {
576
576
  };
577
577
 
578
578
  // src/control-plane.ts
579
- var SDK_VERSION = "1.7.3";
579
+ var SDK_VERSION = "1.9.0";
580
580
  function safeJson(text) {
581
581
  try {
582
582
  return JSON.parse(text);
@@ -1148,7 +1148,7 @@ function asSkipped(raw, defaultReason) {
1148
1148
  }
1149
1149
  return null;
1150
1150
  }
1151
- var SDK_VERSION2 = "1.7.3";
1151
+ var SDK_VERSION2 = "1.9.0";
1152
1152
  function camelToSnakeKey(key) {
1153
1153
  return key.replace(/([A-Z])/g, "_$1").toLowerCase();
1154
1154
  }
@@ -1315,6 +1315,7 @@ var MemorySyncClient = class {
1315
1315
  if (req.sessionId !== void 0) body.session_id = req.sessionId;
1316
1316
  if (req.metadata !== void 0) body.metadata = req.metadata;
1317
1317
  if (req.endUserId !== void 0) body.end_user_id = req.endUserId;
1318
+ if (req.clientRef !== void 0) body.client_ref = req.clientRef;
1318
1319
  const raw = await this.request("POST", "/memory/add", {
1319
1320
  body,
1320
1321
  endUserOverride: req.endUserId
@@ -1335,6 +1336,7 @@ var MemorySyncClient = class {
1335
1336
  if (i.metadata !== void 0) o.metadata = i.metadata;
1336
1337
  if (i.importance !== void 0) o.importance = i.importance;
1337
1338
  if (i.endUserId !== void 0) o.end_user_id = i.endUserId;
1339
+ if (i.clientRef !== void 0) o.client_ref = i.clientRef;
1338
1340
  return o;
1339
1341
  }),
1340
1342
  deduplicate: opts.deduplicate ?? true
@@ -1364,6 +1366,63 @@ var MemorySyncClient = class {
1364
1366
  }))
1365
1367
  };
1366
1368
  }
1369
+ // ── Bulk import ────────────────────────────────────────────────────
1370
+ /**
1371
+ * Upload a payload and get an import job back, without waiting for it.
1372
+ *
1373
+ * `bulkAdd` accepts fifty records per call because each one runs the extraction
1374
+ * pipeline. For a migration out of another system, upload the whole file here
1375
+ * and poll {@link getImport}.
1376
+ *
1377
+ * `resume` requires `clientRef` on every record and is what makes re-running the
1378
+ * same file safe: records a previous run already stored come back counted as
1379
+ * `alreadyImported` rather than stored again.
1380
+ *
1381
+ * The payload is JSONL, or JSON when `filename` ends in `.json`. The extension
1382
+ * is how the server picks the reader, so it is required.
1383
+ */
1384
+ async createImport(req) {
1385
+ if (!req.filename?.trim()) {
1386
+ throw new ValidationError("filename is required so the server can pick a reader");
1387
+ }
1388
+ const form = new FormData();
1389
+ form.set("resume", req.resume ? "true" : "false");
1390
+ form.set("continue_on_error", req.continueOnError ? "true" : "false");
1391
+ if (req.endUserId !== void 0) form.set("end_user_id", req.endUserId);
1392
+ const blob = req.file instanceof Blob ? req.file : new Blob([req.file], { type: "application/octet-stream" });
1393
+ form.set("file", blob, req.filename);
1394
+ return this.request("POST", "/imports", {
1395
+ form,
1396
+ endUserOverride: req.endUserId
1397
+ });
1398
+ }
1399
+ /**
1400
+ * One import job's status, progress and per-outcome counters.
1401
+ *
1402
+ * `progress_percentage` stays below 100 until the job is genuinely finished, so
1403
+ * reaching 100 means done.
1404
+ */
1405
+ async getImport(jobId) {
1406
+ if (!jobId?.trim()) throw new ValidationError("jobId is required");
1407
+ return this.request("GET", `/imports/${encodeURIComponent(jobId)}`);
1408
+ }
1409
+ /** Recent import jobs, newest first. */
1410
+ async listImports(opts = {}) {
1411
+ return this.request("GET", "/imports", { query: opts });
1412
+ }
1413
+ /**
1414
+ * Ask the worker to stop between batches.
1415
+ *
1416
+ * Records already imported stay imported, and the counters report how far it
1417
+ * reached. Cancelling a finished job is a no-op rather than an error.
1418
+ */
1419
+ async cancelImport(jobId) {
1420
+ if (!jobId?.trim()) throw new ValidationError("jobId is required");
1421
+ return this.request(
1422
+ "POST",
1423
+ `/imports/${encodeURIComponent(jobId)}/cancel`
1424
+ );
1425
+ }
1367
1426
  async query(req) {
1368
1427
  const body = { query: req.query };
1369
1428
  if (req.k !== void 0) body.k = req.k;