@naturali/cli 0.127.11 → 0.129.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +342 -165
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -14,7 +14,7 @@ var __exportAll = (all, no_symbols) => {
14
14
  };
15
15
  //#endregion
16
16
  //#region package.json
17
- var version = "0.127.11";
17
+ var version = "0.129.0";
18
18
  //#endregion
19
19
  //#region ../sdk/src/generated/core/bodySerializer.gen.ts
20
20
  const serializeFormDataPair = (data, key, value) => {
@@ -3041,7 +3041,7 @@ var Knowledge = class {
3041
3041
  /**
3042
3042
  * Search knowledge
3043
3043
  *
3044
- * Searches across documents and memory entries using hybrid retrieval — a vector query and a full-text query per source, fused by reciprocal rank — or by file paths, document IDs, memory IDs, or tags. At least one of `query`, `tags`, `document_paths`, `document_ids`, or `memory_ids` must be provided.
3044
+ * Searches across documents and memories using hybrid retrieval — a vector query and a full-text query per source, fused by reciprocal rank — or by file paths, document IDs, memory store IDs, or tags. At least one of `query`, `tags`, `document_paths`, `document_ids`, or `memory_store_ids` must be provided.
3045
3045
  */
3046
3046
  static searchKnowledge(options) {
3047
3047
  return (options.client ?? client).post({
@@ -3058,7 +3058,7 @@ var Memories = class {
3058
3058
  /**
3059
3059
  * List memories
3060
3060
  *
3061
- * Returns a list of memory configurations for a project
3061
+ * Returns all memories in a memory store
3062
3062
  */
3063
3063
  static listMemories(options) {
3064
3064
  return (options.client ?? client).get({
@@ -3069,7 +3069,7 @@ var Memories = class {
3069
3069
  /**
3070
3070
  * Create a memory
3071
3071
  *
3072
- * Creates a new memory configuration in a project
3072
+ * Writes a fact to the specified memory store through the standard write algorithm: the content is embedded (or matched to text the store already holds), compared against the most similar currently-valid memory, and resolved to exactly one of three outcomes — `skipped` at or above `duplicate_threshold`, `superseded` at or above `supersede_threshold`, `created` below it. Every call records one assertion, whatever the outcome.
3073
3073
  */
3074
3074
  static createMemory(options) {
3075
3075
  return (options.client ?? client).post({
@@ -3084,7 +3084,7 @@ var Memories = class {
3084
3084
  /**
3085
3085
  * Delete a memory
3086
3086
  *
3087
- * Deletes a memory configuration
3087
+ * Deletes a memory
3088
3088
  */
3089
3089
  static deleteMemory(options) {
3090
3090
  return (options.client ?? client).delete({
@@ -3095,7 +3095,7 @@ var Memories = class {
3095
3095
  /**
3096
3096
  * Get a memory
3097
3097
  *
3098
- * Returns a single memory configuration by ID
3098
+ * Returns a single memory by ID
3099
3099
  */
3100
3100
  static getMemory(options) {
3101
3101
  return (options.client ?? client).get({
@@ -3106,7 +3106,7 @@ var Memories = class {
3106
3106
  /**
3107
3107
  * Update a memory
3108
3108
  *
3109
- * Updates an existing memory configuration
3109
+ * Updates an existing memory. Regenerates the embedding if content changes.
3110
3110
  */
3111
3111
  static updateMemory(options) {
3112
3112
  return (options.client ?? client).put({
@@ -3119,6 +3119,17 @@ var Memories = class {
3119
3119
  });
3120
3120
  }
3121
3121
  /**
3122
+ * List a memory's assertions
3123
+ *
3124
+ * Returns every write that resolved into this memory, oldest first: the one that created it, the duplicates it absorbed, and the assertion that superseded another memory in its favour. A superseded memory keeps its own assertions, so the chain can be walked in both directions.
3125
+ */
3126
+ static listMemoryAssertions(options) {
3127
+ return (options.client ?? client).get({
3128
+ url: "/v1/projects/{project_id}/memories/{memory_id}/assertions",
3129
+ ...options
3130
+ });
3131
+ }
3132
+ /**
3122
3133
  * Get memory tags
3123
3134
  *
3124
3135
  * Returns all tags attached to the memory
@@ -3160,26 +3171,26 @@ var Memories = class {
3160
3171
  });
3161
3172
  }
3162
3173
  };
3163
- var MemoryEntries = class {
3174
+ var MemoryStores = class {
3164
3175
  /**
3165
- * List memory entries
3176
+ * List memory stores
3166
3177
  *
3167
- * Returns all entries in a memory container
3178
+ * Returns a list of memory store configurations for a project
3168
3179
  */
3169
- static listMemoryEntries(options) {
3180
+ static listMemoryStores(options) {
3170
3181
  return (options.client ?? client).get({
3171
- url: "/v1/projects/{project_id}/memory-entries",
3182
+ url: "/v1/projects/{project_id}/memory-stores",
3172
3183
  ...options
3173
3184
  });
3174
3185
  }
3175
3186
  /**
3176
- * Create a memory entry
3187
+ * Create a memory store
3177
3188
  *
3178
- * Creates a new entry in the specified memory container. Automatically generates an embedding for semantic search, and skips the write when an existing entry is a near-duplicate (see `duplicate_threshold`). A merely similar fact is stored as its own entry: this path has no agent context and therefore no model to consolidate two facts into one.
3189
+ * Creates a new memory store configuration in a project
3179
3190
  */
3180
- static createMemoryEntry(options) {
3191
+ static createMemoryStore(options) {
3181
3192
  return (options.client ?? client).post({
3182
- url: "/v1/projects/{project_id}/memory-entries",
3193
+ url: "/v1/projects/{project_id}/memory-stores",
3183
3194
  ...options,
3184
3195
  headers: {
3185
3196
  "Content-Type": "application/json",
@@ -3188,35 +3199,35 @@ var MemoryEntries = class {
3188
3199
  });
3189
3200
  }
3190
3201
  /**
3191
- * Delete a memory entry
3202
+ * Delete a memory store
3192
3203
  *
3193
- * Deletes a memory entry
3204
+ * Deletes a memory store configuration
3194
3205
  */
3195
- static deleteMemoryEntry(options) {
3206
+ static deleteMemoryStore(options) {
3196
3207
  return (options.client ?? client).delete({
3197
- url: "/v1/projects/{project_id}/memory-entries/{entry_id}",
3208
+ url: "/v1/projects/{project_id}/memory-stores/{memory_store_id}",
3198
3209
  ...options
3199
3210
  });
3200
3211
  }
3201
3212
  /**
3202
- * Get a memory entry
3213
+ * Get a memory store
3203
3214
  *
3204
- * Returns a single memory entry by ID
3215
+ * Returns a single memory store configuration by ID
3205
3216
  */
3206
- static getMemoryEntry(options) {
3217
+ static getMemoryStore(options) {
3207
3218
  return (options.client ?? client).get({
3208
- url: "/v1/projects/{project_id}/memory-entries/{entry_id}",
3219
+ url: "/v1/projects/{project_id}/memory-stores/{memory_store_id}",
3209
3220
  ...options
3210
3221
  });
3211
3222
  }
3212
3223
  /**
3213
- * Update a memory entry
3224
+ * Update a memory store
3214
3225
  *
3215
- * Updates an existing memory entry. Regenerates the embedding if content changes.
3226
+ * Updates an existing memory store configuration
3216
3227
  */
3217
- static updateMemoryEntry(options) {
3228
+ static updateMemoryStore(options) {
3218
3229
  return (options.client ?? client).put({
3219
- url: "/v1/projects/{project_id}/memory-entries/{entry_id}",
3230
+ url: "/v1/projects/{project_id}/memory-stores/{memory_store_id}",
3220
3231
  ...options,
3221
3232
  headers: {
3222
3233
  "Content-Type": "application/json",
@@ -3225,24 +3236,35 @@ var MemoryEntries = class {
3225
3236
  });
3226
3237
  }
3227
3238
  /**
3228
- * Get memory entry tags
3239
+ * List a memory store's write assertions
3229
3240
  *
3230
- * Returns all tags attached to the memory entry
3241
+ * Returns the store's write ledger, newest first: one row per write attempt, skips included. This is how "which write path is filling this store?" is asked — a question no column on a memory row could answer, because a skipped write produced no memory at all.
3231
3242
  */
3232
- static getMemoryEntryTags(options) {
3243
+ static listMemoryStoreAssertions(options) {
3233
3244
  return (options.client ?? client).get({
3234
- url: "/v1/projects/{project_id}/memory-entries/{entry_id}/tags",
3245
+ url: "/v1/projects/{project_id}/memory-stores/{memory_store_id}/assertions",
3235
3246
  ...options
3236
3247
  });
3237
3248
  }
3238
3249
  /**
3239
- * Merge memory entry tags
3250
+ * Get memory store tags
3240
3251
  *
3241
- * Merges provided tags into the memory entry's existing tags (existing tags are preserved unless overridden)
3252
+ * Returns all tags attached to the memory store
3242
3253
  */
3243
- static mergeMemoryEntryTags(options) {
3254
+ static getMemoryStoreTags(options) {
3255
+ return (options.client ?? client).get({
3256
+ url: "/v1/projects/{project_id}/memory-stores/{memory_store_id}/tags",
3257
+ ...options
3258
+ });
3259
+ }
3260
+ /**
3261
+ * Merge memory store tags
3262
+ *
3263
+ * Merges provided tags into the memory store's existing tags (existing tags are preserved unless overridden)
3264
+ */
3265
+ static mergeMemoryStoreTags(options) {
3244
3266
  return (options.client ?? client).patch({
3245
- url: "/v1/projects/{project_id}/memory-entries/{entry_id}/tags",
3267
+ url: "/v1/projects/{project_id}/memory-stores/{memory_store_id}/tags",
3246
3268
  ...options,
3247
3269
  headers: {
3248
3270
  "Content-Type": "application/json",
@@ -3251,13 +3273,13 @@ var MemoryEntries = class {
3251
3273
  });
3252
3274
  }
3253
3275
  /**
3254
- * Replace memory entry tags
3276
+ * Replace memory store tags
3255
3277
  *
3256
- * Replaces all tags on the memory entry with the provided tags (not merged)
3278
+ * Replaces all tags on the memory store with the provided tags (not merged)
3257
3279
  */
3258
- static replaceMemoryEntryTags(options) {
3280
+ static replaceMemoryStoreTags(options) {
3259
3281
  return (options.client ?? client).put({
3260
- url: "/v1/projects/{project_id}/memory-entries/{entry_id}/tags",
3282
+ url: "/v1/projects/{project_id}/memory-stores/{memory_store_id}/tags",
3261
3283
  ...options,
3262
3284
  headers: {
3263
3285
  "Content-Type": "application/json",
@@ -3844,7 +3866,7 @@ var Quotas = class {
3844
3866
  *
3845
3867
  * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`; `storage_bytes` is valid for `scope: project` only. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
3846
3868
  *
3847
- * `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory-entry create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.
3869
+ * `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.
3848
3870
  */
3849
3871
  static createQuota(options) {
3850
3872
  return (options.client ?? client).post({
@@ -4900,7 +4922,7 @@ var NaturaliClient = class {
4900
4922
  ingestionRules;
4901
4923
  knowledge;
4902
4924
  memories;
4903
- memoryEntries;
4925
+ memoryStores;
4904
4926
  modelRoutes;
4905
4927
  quotas;
4906
4928
  models;
@@ -4950,7 +4972,7 @@ var NaturaliClient = class {
4950
4972
  this.ingestionRules = bindResource(IngestionRules, this.http);
4951
4973
  this.knowledge = bindResource(Knowledge, this.http);
4952
4974
  this.memories = bindResource(Memories, this.http);
4953
- this.memoryEntries = bindResource(MemoryEntries, this.http);
4975
+ this.memoryStores = bindResource(MemoryStores, this.http);
4954
4976
  this.modelRoutes = bindResource(ModelRoutes, this.http);
4955
4977
  this.quotas = bindResource(Quotas, this.http);
4956
4978
  this.models = bindResource(Models, this.http);
@@ -4995,7 +5017,7 @@ var src_exports = /* @__PURE__ */ __exportAll({
4995
5017
  IngestionRules: () => IngestionRules,
4996
5018
  Knowledge: () => Knowledge,
4997
5019
  Memories: () => Memories,
4998
- MemoryEntries: () => MemoryEntries,
5020
+ MemoryStores: () => MemoryStores,
4999
5021
  ModelRoutes: () => ModelRoutes,
5000
5022
  Models: () => Models,
5001
5023
  NaturaliClient: () => NaturaliClient,
@@ -6916,14 +6938,14 @@ const routes = {
6916
6938
  },
6917
6939
  {
6918
6940
  "name": "extract",
6919
- "description": "Per-turn override of the agent's `knowledge_config.extraction` default. Omit to follow the agent's stored config. Set `false` to suppress automatic memory extraction for this turn (e.g. an operational or tool-listing turn that would only add noise to a curated memory). Set `true` to force extraction on for this turn even when the agent does not enable it by default, provided the agent has a `write_memory_id`. Has no effect on streaming or `requires_action` turns, which never extract.",
6941
+ "description": "Per-turn override of the agent's `knowledge_config.extraction` default. Omit to follow the agent's stored config. Set `false` to suppress automatic memory store extraction for this turn (e.g. an operational or tool-listing turn that would only add noise to a curated memory store). Set `true` to force extraction on for this turn even when the agent does not enable it by default, provided the agent has a `write_memory_store_id`. Has no effect on streaming or `requires_action` turns, which never extract.",
6920
6942
  "required": false,
6921
6943
  "type": "boolean",
6922
6944
  "in": "body"
6923
6945
  },
6924
6946
  {
6925
6947
  "name": "knowledge_config",
6926
- "description": "Per-generation knowledge retrieval override. Array filters (memory_ids, document_ids, document_paths) are unioned with the agent's stored knowledge_config; `tags` pairs are merged with the override winning per key; scalar fields (min_score, limit) use the per-generation value when present.",
6948
+ "description": "Per-generation knowledge retrieval override. Array filters (memory_store_ids, document_ids, document_paths) are unioned with the agent's stored knowledge_config; `tags` pairs are merged with the override winning per key; scalar fields (min_score, limit) use the per-generation value when present.",
6927
6949
  "required": false,
6928
6950
  "type": "object",
6929
6951
  "in": "body"
@@ -12286,7 +12308,7 @@ const routes = {
12286
12308
  "search-knowledge": {
12287
12309
  serviceClass: "Knowledge",
12288
12310
  operationId: "searchKnowledge",
12289
- description: "Searches across documents and memory entries using hybrid retrieval — a vector query and a full-text query per source, fused by reciprocal rank — or by file paths, document IDs, memory IDs, or tags. At least one of `query`, `tags`, `document_paths`, `document_ids`, or `memory_ids` must be provided.",
12311
+ description: "Searches across documents and memories using hybrid retrieval — a vector query and a full-text query per source, fused by reciprocal rank — or by file paths, document IDs, memory store IDs, or tags. At least one of `query`, `tags`, `document_paths`, `document_ids`, or `memory_store_ids` must be provided.",
12290
12312
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/knowledge",
12291
12313
  httpMethod: "post",
12292
12314
  pathParams: ["project_id"],
@@ -12329,7 +12351,7 @@ const routes = {
12329
12351
  },
12330
12352
  {
12331
12353
  "name": "recency_half_life_days",
12332
- "description": "Half-life, in days, of a recency decay applied to **memory** results after fusion: a result's `score` is multiplied by `2 ^ (-age_in_days / recency_half_life_days)`, where age is measured from its `updated_at`. Document results are never decayed. `0` — the default, and the default of the deployment's `KNOWLEDGE_RECENCY_HALF_LIFE_DAYS` — disables the blend entirely; it is a switch, not a lower bound, and sending `0` turns off a deployment-wide decay for this one request. Accepts fractions (`0.5` is twelve hours). How many ranks a given half-life costs depends on `rrf_k`. Only applies when `query` is provided.",
12354
+ "description": "Half-life, in days, of a recency decay applied to **memory store** results after fusion: a result's `score` is multiplied by `2 ^ (-age_in_days / recency_half_life_days)`, where age is measured from its `updated_at`. Document results are never decayed. `0` — the default, and the default of the deployment's `KNOWLEDGE_RECENCY_HALF_LIFE_DAYS` — disables the blend entirely; it is a switch, not a lower bound, and sending `0` turns off a deployment-wide decay for this one request. Accepts fractions (`0.5` is twelve hours). How many ranks a given half-life costs depends on `rrf_k`. Only applies when `query` is provided.",
12333
12355
  "required": false,
12334
12356
  "type": "number",
12335
12357
  "in": "body"
@@ -12342,8 +12364,8 @@ const routes = {
12342
12364
  "in": "body"
12343
12365
  },
12344
12366
  {
12345
- "name": "memory_ids",
12346
- "description": "Search entries within these specific memories",
12367
+ "name": "memory_store_ids",
12368
+ "description": "Search memories within these specific memory stores",
12347
12369
  "required": false,
12348
12370
  "type": "array",
12349
12371
  "in": "body"
@@ -12364,7 +12386,7 @@ const routes = {
12364
12386
  },
12365
12387
  {
12366
12388
  "name": "tags",
12367
- "description": "Filter results to documents and memory entries whose `tags` contain every one of these key-value pairs (exact, case-sensitive match). The only filter that scopes both stores, so passing it alone searches both. For memory it matches at entry granularity: an entry is returned when its parent memory's tags match or its own do.",
12389
+ "description": "Filter results to documents and memories whose `tags` contain every one of these key-value pairs (exact, case-sensitive match). The only filter that scopes both stores, so passing it alone searches both. For memories it matches at memory granularity: a memory is returned when its parent memory store's tags match or its own do.",
12368
12390
  "required": false,
12369
12391
  "type": "string",
12370
12392
  "in": "body"
@@ -12374,14 +12396,16 @@ const routes = {
12374
12396
  "list-memories": {
12375
12397
  serviceClass: "Memories",
12376
12398
  operationId: "listMemories",
12377
- description: "Returns a list of memory configurations for a project",
12399
+ description: "Returns all memories in a memory store",
12378
12400
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memories",
12379
12401
  httpMethod: "get",
12380
12402
  pathParams: ["project_id"],
12381
12403
  queryParams: [
12404
+ "memory_store_id",
12382
12405
  "tags",
12383
12406
  "limit",
12384
- "offset"
12407
+ "offset",
12408
+ "include_invalidated"
12385
12409
  ],
12386
12410
  flags: [
12387
12411
  {
@@ -12391,6 +12415,13 @@ const routes = {
12391
12415
  "type": "string",
12392
12416
  "in": "path"
12393
12417
  },
12418
+ {
12419
+ "name": "memory_store_id",
12420
+ "description": "Memory store to list memories from (mstore_...)",
12421
+ "required": true,
12422
+ "type": "string",
12423
+ "in": "query"
12424
+ },
12394
12425
  {
12395
12426
  "name": "tags",
12396
12427
  "description": "Filter by tag pairs, written `key:value` (split on the first colon, so a value may contain colons). Repeat the parameter for several pairs; **all** must be present with exactly that value.\n",
@@ -12411,13 +12442,20 @@ const routes = {
12411
12442
  "required": false,
12412
12443
  "type": "integer",
12413
12444
  "in": "query"
12445
+ },
12446
+ {
12447
+ "name": "include_invalidated",
12448
+ "description": "Include invalidated (superseded) memories. They are excluded by default; set this to audit the supersede history.",
12449
+ "required": false,
12450
+ "type": "boolean",
12451
+ "in": "query"
12414
12452
  }
12415
12453
  ]
12416
12454
  },
12417
12455
  "create-memory": {
12418
12456
  serviceClass: "Memories",
12419
12457
  operationId: "createMemory",
12420
- description: "Creates a new memory configuration in a project",
12458
+ description: "Writes a fact to the specified memory store through the standard write algorithm: the content is embedded (or matched to text the store already holds), compared against the most similar currently-valid memory, and resolved to exactly one of three outcomes — `skipped` at or above `duplicate_threshold`, `superseded` at or above `supersede_threshold`, `created` below it. Every call records one assertion, whatever the outcome.",
12421
12459
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memories",
12422
12460
  httpMethod: "post",
12423
12461
  pathParams: ["project_id"],
@@ -12431,32 +12469,67 @@ const routes = {
12431
12469
  "in": "path"
12432
12470
  },
12433
12471
  {
12434
- "name": "name",
12435
- "description": "Memory name",
12472
+ "name": "memory_store_id",
12473
+ "description": "Memory store to add the memory to (mstore_...)",
12436
12474
  "required": true,
12437
12475
  "type": "string",
12438
12476
  "in": "body"
12439
12477
  },
12440
12478
  {
12441
- "name": "description",
12442
- "description": "Optional description",
12479
+ "name": "content",
12480
+ "description": "The text content of the memory",
12481
+ "required": true,
12482
+ "type": "string",
12483
+ "in": "body"
12484
+ },
12485
+ {
12486
+ "name": "source_type",
12487
+ "description": "Whether there is a source to point at. `conversation` requires `source_id`; `manual` rejects it.",
12488
+ "required": false,
12489
+ "type": "string",
12490
+ "in": "body"
12491
+ },
12492
+ {
12493
+ "name": "source_id",
12494
+ "description": "The conversation this fact was learned in. Required when `source_type` is `conversation`, and rejected otherwise.",
12443
12495
  "required": false,
12444
12496
  "type": "string",
12445
12497
  "in": "body"
12446
12498
  },
12447
12499
  {
12448
12500
  "name": "tags",
12449
- "description": "Optional key-value tags. Scopes the memory in knowledge search, where every requested pair must match exactly.",
12501
+ "description": "Per-memory key-value tags, used for memory-granularity filtering by `tags` in search-knowledge.",
12450
12502
  "required": false,
12451
12503
  "type": "string",
12452
12504
  "in": "body"
12505
+ },
12506
+ {
12507
+ "name": "metadata",
12508
+ "description": "Arbitrary structured metadata attached to the memory",
12509
+ "required": false,
12510
+ "type": "object",
12511
+ "in": "body"
12512
+ },
12513
+ {
12514
+ "name": "duplicate_threshold",
12515
+ "description": "Cosine similarity at or above which the incoming content is a duplicate of an existing memory and the write is skipped. Overrides the store's `duplicate_threshold` for this call; falls back to the store's value, then to `0.95`.",
12516
+ "required": false,
12517
+ "type": "number",
12518
+ "in": "body"
12519
+ },
12520
+ {
12521
+ "name": "supersede_threshold",
12522
+ "description": "Cosine similarity at or above which the incoming content restates a fact that has changed: the top match is invalidated and a new memory replaces it. Overrides the store's `supersede_threshold` for this call; falls back to the store's value, then to `0.90`. The effective pair must satisfy `supersede_threshold < duplicate_threshold`, and the check runs against the effective pair — so overriding only one value cannot invert it against the store's other one.",
12523
+ "required": false,
12524
+ "type": "number",
12525
+ "in": "body"
12453
12526
  }
12454
12527
  ]
12455
12528
  },
12456
12529
  "get-memory": {
12457
12530
  serviceClass: "Memories",
12458
12531
  operationId: "getMemory",
12459
- description: "Returns a single memory configuration by ID",
12532
+ description: "Returns a single memory by ID",
12460
12533
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memories",
12461
12534
  httpMethod: "get",
12462
12535
  pathParams: ["project_id", "memory_id"],
@@ -12478,7 +12551,7 @@ const routes = {
12478
12551
  "update-memory": {
12479
12552
  serviceClass: "Memories",
12480
12553
  operationId: "updateMemory",
12481
- description: "Updates an existing memory configuration",
12554
+ description: "Updates an existing memory. Regenerates the embedding if content changes.",
12482
12555
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memories",
12483
12556
  httpMethod: "put",
12484
12557
  pathParams: ["project_id", "memory_id"],
@@ -12499,24 +12572,24 @@ const routes = {
12499
12572
  "in": "path"
12500
12573
  },
12501
12574
  {
12502
- "name": "name",
12503
- "description": "Memory name",
12575
+ "name": "content",
12576
+ "description": "Updated text content",
12504
12577
  "required": false,
12505
12578
  "type": "string",
12506
12579
  "in": "body"
12507
12580
  },
12508
12581
  {
12509
- "name": "description",
12510
- "description": "Optional description",
12582
+ "name": "tags",
12583
+ "description": "Replaces the memory's tags. Pass null or an empty object to clear.",
12511
12584
  "required": false,
12512
12585
  "type": "string",
12513
12586
  "in": "body"
12514
12587
  },
12515
12588
  {
12516
- "name": "tags",
12517
- "description": "Optional key-value tags. Replaces the stored bag; `null` clears it.",
12589
+ "name": "metadata",
12590
+ "description": "Replaces the memory's metadata. Pass null to clear.",
12518
12591
  "required": false,
12519
- "type": "string",
12592
+ "type": "object",
12520
12593
  "in": "body"
12521
12594
  }
12522
12595
  ]
@@ -12524,7 +12597,7 @@ const routes = {
12524
12597
  "delete-memory": {
12525
12598
  serviceClass: "Memories",
12526
12599
  operationId: "deleteMemory",
12527
- description: "Deletes a memory configuration",
12600
+ description: "Deletes a memory",
12528
12601
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memories",
12529
12602
  httpMethod: "delete",
12530
12603
  pathParams: ["project_id", "memory_id"],
@@ -12543,6 +12616,45 @@ const routes = {
12543
12616
  "in": "path"
12544
12617
  }]
12545
12618
  },
12619
+ "list-memory-assertions": {
12620
+ serviceClass: "Memories",
12621
+ operationId: "listMemoryAssertions",
12622
+ description: "Returns every write that resolved into this memory, oldest first: the one that created it, the duplicates it absorbed, and the assertion that superseded another memory in its favour. A superseded memory keeps its own assertions, so the chain can be walked in both directions.",
12623
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memories",
12624
+ httpMethod: "get",
12625
+ pathParams: ["project_id", "memory_id"],
12626
+ queryParams: ["limit", "offset"],
12627
+ flags: [
12628
+ {
12629
+ "name": "project_id",
12630
+ "description": "Project public ID (proj_ prefix).",
12631
+ "required": true,
12632
+ "type": "string",
12633
+ "in": "path"
12634
+ },
12635
+ {
12636
+ "name": "memory_id",
12637
+ "description": "",
12638
+ "required": true,
12639
+ "type": "string",
12640
+ "in": "path"
12641
+ },
12642
+ {
12643
+ "name": "limit",
12644
+ "description": "Maximum number of results to return",
12645
+ "required": false,
12646
+ "type": "integer",
12647
+ "in": "query"
12648
+ },
12649
+ {
12650
+ "name": "offset",
12651
+ "description": "Number of results to skip",
12652
+ "required": false,
12653
+ "type": "integer",
12654
+ "in": "query"
12655
+ }
12656
+ ]
12657
+ },
12546
12658
  "get-memory-tags": {
12547
12659
  serviceClass: "Memories",
12548
12660
  operationId: "getMemoryTags",
@@ -12609,19 +12721,17 @@ const routes = {
12609
12721
  "in": "path"
12610
12722
  }]
12611
12723
  },
12612
- "list-memory-entries": {
12613
- serviceClass: "MemoryEntries",
12614
- operationId: "listMemoryEntries",
12615
- description: "Returns all entries in a memory container",
12616
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
12724
+ "list-memory-stores": {
12725
+ serviceClass: "MemoryStores",
12726
+ operationId: "listMemoryStores",
12727
+ description: "Returns a list of memory store configurations for a project",
12728
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12617
12729
  httpMethod: "get",
12618
12730
  pathParams: ["project_id"],
12619
12731
  queryParams: [
12620
- "memory_id",
12621
12732
  "tags",
12622
12733
  "limit",
12623
- "offset",
12624
- "include_invalidated"
12734
+ "offset"
12625
12735
  ],
12626
12736
  flags: [
12627
12737
  {
@@ -12631,13 +12741,6 @@ const routes = {
12631
12741
  "type": "string",
12632
12742
  "in": "path"
12633
12743
  },
12634
- {
12635
- "name": "memory_id",
12636
- "description": "Memory container to list entries from (mem_...)",
12637
- "required": true,
12638
- "type": "string",
12639
- "in": "query"
12640
- },
12641
12744
  {
12642
12745
  "name": "tags",
12643
12746
  "description": "Filter by tag pairs, written `key:value` (split on the first colon, so a value may contain colons). Repeat the parameter for several pairs; **all** must be present with exactly that value.\n",
@@ -12658,21 +12761,14 @@ const routes = {
12658
12761
  "required": false,
12659
12762
  "type": "integer",
12660
12763
  "in": "query"
12661
- },
12662
- {
12663
- "name": "include_invalidated",
12664
- "description": "Include invalidated (superseded) entries. They are excluded by default; set this to audit the supersede history.",
12665
- "required": false,
12666
- "type": "boolean",
12667
- "in": "query"
12668
12764
  }
12669
12765
  ]
12670
12766
  },
12671
- "create-memory-entry": {
12672
- serviceClass: "MemoryEntries",
12673
- operationId: "createMemoryEntry",
12674
- description: "Creates a new entry in the specified memory container. Automatically generates an embedding for semantic search, and skips the write when an existing entry is a near-duplicate (see `duplicate_threshold`). A merely similar fact is stored as its own entry: this path has no agent context and therefore no model to consolidate two facts into one.",
12675
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
12767
+ "create-memory-store": {
12768
+ serviceClass: "MemoryStores",
12769
+ operationId: "createMemoryStore",
12770
+ description: "Creates a new memory store configuration in a project",
12771
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12676
12772
  httpMethod: "post",
12677
12773
  pathParams: ["project_id"],
12678
12774
  queryParams: [],
@@ -12685,56 +12781,49 @@ const routes = {
12685
12781
  "in": "path"
12686
12782
  },
12687
12783
  {
12688
- "name": "memory_id",
12689
- "description": "Memory container to add the entry to (mem_...)",
12690
- "required": true,
12691
- "type": "string",
12692
- "in": "body"
12693
- },
12694
- {
12695
- "name": "content",
12696
- "description": "The text content of the memory entry",
12784
+ "name": "name",
12785
+ "description": "Memory store name",
12697
12786
  "required": true,
12698
12787
  "type": "string",
12699
12788
  "in": "body"
12700
12789
  },
12701
12790
  {
12702
- "name": "source_type",
12703
- "description": "How this entry was created",
12791
+ "name": "description",
12792
+ "description": "Optional description",
12704
12793
  "required": false,
12705
12794
  "type": "string",
12706
12795
  "in": "body"
12707
12796
  },
12708
12797
  {
12709
12798
  "name": "tags",
12710
- "description": "Per-entry key-value tags, used for entry-granularity filtering by `tags` in search-knowledge.",
12799
+ "description": "Optional key-value tags. Scopes the memory store in knowledge search, where every requested pair must match exactly.",
12711
12800
  "required": false,
12712
12801
  "type": "string",
12713
12802
  "in": "body"
12714
12803
  },
12715
12804
  {
12716
- "name": "metadata",
12717
- "description": "Arbitrary structured metadata attached to the entry",
12805
+ "name": "duplicate_threshold",
12806
+ "description": "The store's dedup policy: cosine similarity at or above which an incoming fact is already known and the write is skipped. `null` (the default) uses the algorithm constant `0.95`. A single `POST /v1/projects/{project_id}/memories` call may override it; the agent tool and the post-turn rule never can.",
12718
12807
  "required": false,
12719
- "type": "object",
12808
+ "type": "number",
12720
12809
  "in": "body"
12721
12810
  },
12722
12811
  {
12723
- "name": "duplicate_threshold",
12724
- "description": "Cosine similarity score at or above which the incoming content is considered a duplicate of an existing entry and skipped (default 0.95). Below it the entry is always created.",
12812
+ "name": "supersede_threshold",
12813
+ "description": "Cosine similarity at or above which an incoming fact restates a known one that has changed: the matched memory is invalidated and replaced. `null` (the default) uses the algorithm constant `0.90`. Must be lower than the effective `duplicate_threshold`, or the write is rejected with `400 VALIDATION_FAILED` — equal makes `superseded` unreachable and inverted swallows `skipped`.",
12725
12814
  "required": false,
12726
12815
  "type": "number",
12727
12816
  "in": "body"
12728
12817
  }
12729
12818
  ]
12730
12819
  },
12731
- "get-memory-entry": {
12732
- serviceClass: "MemoryEntries",
12733
- operationId: "getMemoryEntry",
12734
- description: "Returns a single memory entry by ID",
12735
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
12820
+ "get-memory-store": {
12821
+ serviceClass: "MemoryStores",
12822
+ operationId: "getMemoryStore",
12823
+ description: "Returns a single memory store configuration by ID",
12824
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12736
12825
  httpMethod: "get",
12737
- pathParams: ["project_id", "entry_id"],
12826
+ pathParams: ["project_id", "memory_store_id"],
12738
12827
  queryParams: [],
12739
12828
  flags: [{
12740
12829
  "name": "project_id",
@@ -12743,20 +12832,20 @@ const routes = {
12743
12832
  "type": "string",
12744
12833
  "in": "path"
12745
12834
  }, {
12746
- "name": "entry_id",
12835
+ "name": "memory_store_id",
12747
12836
  "description": "",
12748
12837
  "required": true,
12749
12838
  "type": "string",
12750
12839
  "in": "path"
12751
12840
  }]
12752
12841
  },
12753
- "update-memory-entry": {
12754
- serviceClass: "MemoryEntries",
12755
- operationId: "updateMemoryEntry",
12756
- description: "Updates an existing memory entry. Regenerates the embedding if content changes.",
12757
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
12842
+ "update-memory-store": {
12843
+ serviceClass: "MemoryStores",
12844
+ operationId: "updateMemoryStore",
12845
+ description: "Updates an existing memory store configuration",
12846
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12758
12847
  httpMethod: "put",
12759
- pathParams: ["project_id", "entry_id"],
12848
+ pathParams: ["project_id", "memory_store_id"],
12760
12849
  queryParams: [],
12761
12850
  flags: [
12762
12851
  {
@@ -12767,42 +12856,56 @@ const routes = {
12767
12856
  "in": "path"
12768
12857
  },
12769
12858
  {
12770
- "name": "entry_id",
12859
+ "name": "memory_store_id",
12771
12860
  "description": "",
12772
12861
  "required": true,
12773
12862
  "type": "string",
12774
12863
  "in": "path"
12775
12864
  },
12776
12865
  {
12777
- "name": "content",
12778
- "description": "Updated text content",
12866
+ "name": "name",
12867
+ "description": "Memory store name",
12868
+ "required": false,
12869
+ "type": "string",
12870
+ "in": "body"
12871
+ },
12872
+ {
12873
+ "name": "description",
12874
+ "description": "Optional description",
12779
12875
  "required": false,
12780
12876
  "type": "string",
12781
12877
  "in": "body"
12782
12878
  },
12783
12879
  {
12784
12880
  "name": "tags",
12785
- "description": "Replaces the entry's tags. Pass null or an empty object to clear.",
12881
+ "description": "Optional key-value tags. Replaces the stored bag; `null` clears it.",
12786
12882
  "required": false,
12787
12883
  "type": "string",
12788
12884
  "in": "body"
12789
12885
  },
12790
12886
  {
12791
- "name": "metadata",
12792
- "description": "Replaces the entry's metadata. Pass null to clear.",
12887
+ "name": "duplicate_threshold",
12888
+ "description": "The store's dedup policy: cosine similarity at or above which an incoming fact is already known and the write is skipped. `null` (the default) uses the algorithm constant `0.95`. A single `POST /v1/projects/{project_id}/memories` call may override it; the agent tool and the post-turn rule never can.",
12793
12889
  "required": false,
12794
- "type": "object",
12890
+ "type": "number",
12891
+ "in": "body"
12892
+ },
12893
+ {
12894
+ "name": "supersede_threshold",
12895
+ "description": "Cosine similarity at or above which an incoming fact restates a known one that has changed: the matched memory is invalidated and replaced. `null` (the default) uses the algorithm constant `0.90`. Must be lower than the effective `duplicate_threshold`, or the write is rejected with `400 VALIDATION_FAILED` — equal makes `superseded` unreachable and inverted swallows `skipped`.",
12896
+ "required": false,
12897
+ "type": "number",
12795
12898
  "in": "body"
12796
12899
  }
12797
12900
  ]
12798
12901
  },
12799
- "delete-memory-entry": {
12800
- serviceClass: "MemoryEntries",
12801
- operationId: "deleteMemoryEntry",
12802
- description: "Deletes a memory entry",
12803
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
12902
+ "delete-memory-store": {
12903
+ serviceClass: "MemoryStores",
12904
+ operationId: "deleteMemoryStore",
12905
+ description: "Deletes a memory store configuration",
12906
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12804
12907
  httpMethod: "delete",
12805
- pathParams: ["project_id", "entry_id"],
12908
+ pathParams: ["project_id", "memory_store_id"],
12806
12909
  queryParams: [],
12807
12910
  flags: [{
12808
12911
  "name": "project_id",
@@ -12811,20 +12914,94 @@ const routes = {
12811
12914
  "type": "string",
12812
12915
  "in": "path"
12813
12916
  }, {
12814
- "name": "entry_id",
12917
+ "name": "memory_store_id",
12815
12918
  "description": "",
12816
12919
  "required": true,
12817
12920
  "type": "string",
12818
12921
  "in": "path"
12819
12922
  }]
12820
12923
  },
12821
- "get-memory-entry-tags": {
12822
- serviceClass: "MemoryEntries",
12823
- operationId: "getMemoryEntryTags",
12824
- description: "Returns all tags attached to the memory entry",
12825
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
12924
+ "list-memory-store-assertions": {
12925
+ serviceClass: "MemoryStores",
12926
+ operationId: "listMemoryStoreAssertions",
12927
+ description: "Returns the store's write ledger, newest first: one row per write attempt, skips included. This is how \"which write path is filling this store?\" is asked — a question no column on a memory row could answer, because a skipped write produced no memory at all.",
12928
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12826
12929
  httpMethod: "get",
12827
- pathParams: ["project_id", "entry_id"],
12930
+ pathParams: ["project_id", "memory_store_id"],
12931
+ queryParams: [
12932
+ "mechanism",
12933
+ "outcome",
12934
+ "generation_id",
12935
+ "since",
12936
+ "limit",
12937
+ "offset"
12938
+ ],
12939
+ flags: [
12940
+ {
12941
+ "name": "project_id",
12942
+ "description": "Project public ID (proj_ prefix).",
12943
+ "required": true,
12944
+ "type": "string",
12945
+ "in": "path"
12946
+ },
12947
+ {
12948
+ "name": "memory_store_id",
12949
+ "description": "",
12950
+ "required": true,
12951
+ "type": "string",
12952
+ "in": "path"
12953
+ },
12954
+ {
12955
+ "name": "mechanism",
12956
+ "description": "Only assertions that came through this door.",
12957
+ "required": false,
12958
+ "type": "string",
12959
+ "in": "query"
12960
+ },
12961
+ {
12962
+ "name": "outcome",
12963
+ "description": "Only assertions that resolved this way.",
12964
+ "required": false,
12965
+ "type": "string",
12966
+ "in": "query"
12967
+ },
12968
+ {
12969
+ "name": "generation_id",
12970
+ "description": "Only assertions made during this generation. A generation that does not exist matches nothing rather than widening to the whole store.",
12971
+ "required": false,
12972
+ "type": "string",
12973
+ "in": "query"
12974
+ },
12975
+ {
12976
+ "name": "since",
12977
+ "description": "Only assertions recorded at or after this instant.",
12978
+ "required": false,
12979
+ "type": "string",
12980
+ "in": "query"
12981
+ },
12982
+ {
12983
+ "name": "limit",
12984
+ "description": "Maximum number of results to return",
12985
+ "required": false,
12986
+ "type": "integer",
12987
+ "in": "query"
12988
+ },
12989
+ {
12990
+ "name": "offset",
12991
+ "description": "Number of results to skip",
12992
+ "required": false,
12993
+ "type": "integer",
12994
+ "in": "query"
12995
+ }
12996
+ ]
12997
+ },
12998
+ "get-memory-store-tags": {
12999
+ serviceClass: "MemoryStores",
13000
+ operationId: "getMemoryStoreTags",
13001
+ description: "Returns all tags attached to the memory store",
13002
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
13003
+ httpMethod: "get",
13004
+ pathParams: ["project_id", "memory_store_id"],
12828
13005
  queryParams: [],
12829
13006
  flags: [{
12830
13007
  "name": "project_id",
@@ -12833,20 +13010,20 @@ const routes = {
12833
13010
  "type": "string",
12834
13011
  "in": "path"
12835
13012
  }, {
12836
- "name": "entry_id",
12837
- "description": "Memory entry ID",
13013
+ "name": "memory_store_id",
13014
+ "description": "Memory store ID",
12838
13015
  "required": true,
12839
13016
  "type": "string",
12840
13017
  "in": "path"
12841
13018
  }]
12842
13019
  },
12843
- "replace-memory-entry-tags": {
12844
- serviceClass: "MemoryEntries",
12845
- operationId: "replaceMemoryEntryTags",
12846
- description: "Replaces all tags on the memory entry with the provided tags (not merged)",
12847
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
13020
+ "replace-memory-store-tags": {
13021
+ serviceClass: "MemoryStores",
13022
+ operationId: "replaceMemoryStoreTags",
13023
+ description: "Replaces all tags on the memory store with the provided tags (not merged)",
13024
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12848
13025
  httpMethod: "put",
12849
- pathParams: ["project_id", "entry_id"],
13026
+ pathParams: ["project_id", "memory_store_id"],
12850
13027
  queryParams: [],
12851
13028
  flags: [{
12852
13029
  "name": "project_id",
@@ -12855,20 +13032,20 @@ const routes = {
12855
13032
  "type": "string",
12856
13033
  "in": "path"
12857
13034
  }, {
12858
- "name": "entry_id",
12859
- "description": "Memory entry ID",
13035
+ "name": "memory_store_id",
13036
+ "description": "Memory store ID",
12860
13037
  "required": true,
12861
13038
  "type": "string",
12862
13039
  "in": "path"
12863
13040
  }]
12864
13041
  },
12865
- "merge-memory-entry-tags": {
12866
- serviceClass: "MemoryEntries",
12867
- operationId: "mergeMemoryEntryTags",
12868
- description: "Merges provided tags into the memory entry's existing tags (existing tags are preserved unless overridden)",
12869
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-entries",
13042
+ "merge-memory-store-tags": {
13043
+ serviceClass: "MemoryStores",
13044
+ operationId: "mergeMemoryStoreTags",
13045
+ description: "Merges provided tags into the memory store's existing tags (existing tags are preserved unless overridden)",
13046
+ moduleDocsUrl: "https://docs.naturali.ai/docs/modules/memory-stores",
12870
13047
  httpMethod: "patch",
12871
- pathParams: ["project_id", "entry_id"],
13048
+ pathParams: ["project_id", "memory_store_id"],
12872
13049
  queryParams: [],
12873
13050
  flags: [{
12874
13051
  "name": "project_id",
@@ -12877,8 +13054,8 @@ const routes = {
12877
13054
  "type": "string",
12878
13055
  "in": "path"
12879
13056
  }, {
12880
- "name": "entry_id",
12881
- "description": "Memory entry ID",
13057
+ "name": "memory_store_id",
13058
+ "description": "Memory store ID",
12882
13059
  "required": true,
12883
13060
  "type": "string",
12884
13061
  "in": "path"
@@ -14466,7 +14643,7 @@ const routes = {
14466
14643
  "create-quota": {
14467
14644
  serviceClass: "Quotas",
14468
14645
  operationId: "createQuota",
14469
- description: "Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`; `storage_bytes` is valid for `scope: project` only. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409. `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory-entry create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.",
14646
+ description: "Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`; `storage_bytes` is valid for `scope: project` only. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409. `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.",
14470
14647
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/quotas",
14471
14648
  httpMethod: "post",
14472
14649
  pathParams: ["project_id"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturali/cli",
3
- "version": "0.127.11",
3
+ "version": "0.129.0",
4
4
  "description": "Command-line interface for the naturali.ai API, generated from its OpenAPI specs",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,7 +24,7 @@
24
24
  "commander": "^15.0.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@naturali/sdk": "0.127.11",
27
+ "@naturali/sdk": "0.129.0",
28
28
  "@ttoss/openapi-codegen": "^0.3.0",
29
29
  "@types/node": "^26.5.1",
30
30
  "tsdown": "^0.23.0",