@naturali/cli 0.46.1 → 0.47.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.
Files changed (2) hide show
  1. package/dist/index.mjs +7 -575
  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.46.1";
17
+ var version = "0.47.1";
18
18
  //#endregion
19
19
  //#region ../sdk/src/generated/core/bodySerializer.gen.ts
20
20
  const jsonBodySerializer = { bodySerializer: (body) => JSON.stringify(body, (_key, value) => typeof value === "bigint" ? value.toString() : value) };
@@ -1080,7 +1080,7 @@ var Channels = class {
1080
1080
  /**
1081
1081
  * List the channel's conversations
1082
1082
  *
1083
- * A cursor page of the channel's conversations, newest first. A conversation is one contact's dialogue on the channel — the continuity anchor that resumes the same runtime session instead of starting fresh per message — so this is the read path for who has talked to the channel and which actor/session their dialogue resolved to.
1083
+ * A cursor page of the channel's conversations, newest first. A conversation is one address's dialogue on the channel — the continuity anchor that resumes the same runtime session instead of starting fresh per message — so this is the read path for who has talked to the channel and which actor/session their dialogue resolved to.
1084
1084
  * Conversations are created by the inbound path (the WhatsApp webhook, the Discord gateway worker) when a real message arrives; there is no way to create one directly.
1085
1085
  *
1086
1086
  */
@@ -1112,159 +1112,6 @@ var Channels = class {
1112
1112
  });
1113
1113
  }
1114
1114
  };
1115
- var Contacts = class {
1116
- /**
1117
- * List contacts
1118
- *
1119
- * A cursor page of the project's contacts, newest first.
1120
- * `channel` + `identifier` (supplied together) is the identity lookup — "who is this phone number?" — and returns at most one contact, following the merge pointer to whoever holds the identifier today. `external_id` asks the same question from the customer's side of the mapping. Contacts merged away are omitted unless `include_merged` asks for them.
1121
- *
1122
- */
1123
- static listContacts(options) {
1124
- return (options.client ?? client).get({
1125
- url: "/v1/projects/{project_id}/contacts",
1126
- ...options
1127
- });
1128
- }
1129
- /**
1130
- * Create a contact
1131
- *
1132
- * Record a contact the customer already knows about, optionally with the identifiers it is expected to arrive at.
1133
- * Optional by design — the inbound path creates contacts on its own. This is for the embedder who has a user in their own system and wants naturali to agree about who that is before the first message, which is what makes `external_id` (and, through it, a session's `tool_context`) useful. No runtime actor is created here; the contact gets one on first need.
1134
- *
1135
- */
1136
- static createContact(options) {
1137
- return (options.client ?? client).post({
1138
- url: "/v1/projects/{project_id}/contacts",
1139
- ...options,
1140
- headers: {
1141
- "Content-Type": "application/json",
1142
- ...options.headers
1143
- }
1144
- });
1145
- }
1146
- /**
1147
- * Erase a contact
1148
- *
1149
- * **Erasure (C4/LGPD).** Not a soft delete and not reversible: the contact's sessions — with their messages and media — its runtime actor, its memory container and every identifier it was reachable at are removed, along with the merge records that reference it.
1150
- * The upstream deletes happen first, so a failure there aborts before the local pointers are dropped and a retry can still find what is left. A contact that was merged into another cannot be erased directly: its data lives with the survivor, so erase that one.
1151
- *
1152
- */
1153
- static deleteContact(options) {
1154
- return (options.client ?? client).delete({
1155
- url: "/v1/projects/{project_id}/contacts/{contact_id}",
1156
- ...options
1157
- });
1158
- }
1159
- /**
1160
- * Get a contact
1161
- */
1162
- static getContact(options) {
1163
- return (options.client ?? client).get({
1164
- url: "/v1/projects/{project_id}/contacts/{contact_id}",
1165
- ...options
1166
- });
1167
- }
1168
- /**
1169
- * Update a contact
1170
- *
1171
- * Retune the customer-owned fields. At least one is required. Identities are attached and detached through their own sub-resource, because each one is a claim about reachability rather than a property of the record.
1172
- *
1173
- */
1174
- static updateContact(options) {
1175
- return (options.client ?? client).patch({
1176
- url: "/v1/projects/{project_id}/contacts/{contact_id}",
1177
- ...options,
1178
- headers: {
1179
- "Content-Type": "application/json",
1180
- ...options.headers
1181
- }
1182
- });
1183
- }
1184
- /**
1185
- * Attach an identity
1186
- *
1187
- * Attach a `(channel, identifier)` pair — the manual half of what the inbound path does automatically, and the way a customer tells naturali that a number it has never seen belongs to a user it already knows. The identifier must be free (C3).
1188
- *
1189
- */
1190
- static createContactIdentity(options) {
1191
- return (options.client ?? client).post({
1192
- url: "/v1/projects/{project_id}/contacts/{contact_id}/identities",
1193
- ...options,
1194
- headers: {
1195
- "Content-Type": "application/json",
1196
- ...options.headers
1197
- }
1198
- });
1199
- }
1200
- /**
1201
- * Detach an identity
1202
- *
1203
- * Detach an identifier attached in error. Refused with `identity_in_use` once a dialogue hangs off it: dropping an identifier with history is erasure wearing a smaller name, and erasure has its own route that actually removes the messages instead of orphaning them.
1204
- *
1205
- */
1206
- static deleteContactIdentity(options) {
1207
- return (options.client ?? client).delete({
1208
- url: "/v1/projects/{project_id}/contacts/{contact_id}/identities/{identity_id}",
1209
- ...options
1210
- });
1211
- }
1212
- /**
1213
- * List the contact's conversations
1214
- *
1215
- * Every dialogue the contact has, across channels, newest first. The channel-scoped list answers "who has talked to this number?"; this one answers "where has this human talked to us?" — the read that makes a merge visible, since both channels' rows then appear under one contact.
1216
- *
1217
- */
1218
- static listContactConversations(options) {
1219
- return (options.client ?? client).get({
1220
- url: "/v1/projects/{project_id}/contacts/{contact_id}/conversations",
1221
- ...options
1222
- });
1223
- }
1224
- /**
1225
- * Merge another contact into this one
1226
- *
1227
- * Fold `source_contact_id` into this contact — "same human, two identifiers" (C4).
1228
- * What moves: every identity and every conversation, so the survivor's history is the union of both. What is *shared* rather than moved: agent memory — the runtime hangs it off the actor, so the source's actor is re-pointed at the survivor's memory container and both keep answering with one recollection. Existing sessions keep working, which is the point of not rewriting them.
1229
- * The source is not deleted: it stays as a tombstone pointing at the survivor, and the returned merge record lists exactly what moved, so the merge can be audited and reverted.
1230
- *
1231
- */
1232
- static mergeContact(options) {
1233
- return (options.client ?? client).post({
1234
- url: "/v1/projects/{project_id}/contacts/{contact_id}:merge",
1235
- ...options,
1236
- headers: {
1237
- "Content-Type": "application/json",
1238
- ...options.headers
1239
- }
1240
- });
1241
- }
1242
- /**
1243
- * List the contact's merges
1244
- *
1245
- * The contact's merge history, newest first, from both sides: the merges it absorbed and the one that absorbed it. The audit half of C4.
1246
- *
1247
- */
1248
- static listContactMerges(options) {
1249
- return (options.client ?? client).get({
1250
- url: "/v1/projects/{project_id}/contacts/{contact_id}/merges",
1251
- ...options
1252
- });
1253
- }
1254
- /**
1255
- * Revert a merge
1256
- *
1257
- * Undo a merge (C4). Replays the record backwards: the identities and conversations it lists go back to the source, the source's actor is re-pointed at the memory it had before, and the tombstone becomes a contact again. Anything that arrived *after* the merge stays with the survivor — it was never the source's.
1258
- * Only the merge still in force can be reverted; a source that has since been merged somewhere else has to be unwound from the top (`merge_superseded`).
1259
- *
1260
- */
1261
- static revertContactMerge(options) {
1262
- return (options.client ?? client).post({
1263
- url: "/v1/projects/{project_id}/contacts/{contact_id}/merges/{merge_id}:revert",
1264
- ...options
1265
- });
1266
- }
1267
- };
1268
1115
  var Generations = class {
1269
1116
  /**
1270
1117
  * List an agent's generations
@@ -2188,7 +2035,6 @@ var NaturaliClient = class {
2188
2035
  auth;
2189
2036
  boards;
2190
2037
  channels;
2191
- contacts;
2192
2038
  generations;
2193
2039
  knowledge;
2194
2040
  models;
@@ -2215,7 +2061,6 @@ var NaturaliClient = class {
2215
2061
  this.auth = bindResource(Auth, this.http);
2216
2062
  this.boards = bindResource(Boards, this.http);
2217
2063
  this.channels = bindResource(Channels, this.http);
2218
- this.contacts = bindResource(Contacts, this.http);
2219
2064
  this.generations = bindResource(Generations, this.http);
2220
2065
  this.knowledge = bindResource(Knowledge, this.http);
2221
2066
  this.models = bindResource(Models, this.http);
@@ -2237,7 +2082,6 @@ var src_exports = /* @__PURE__ */ __exportAll({
2237
2082
  Auth: () => Auth,
2238
2083
  Boards: () => Boards,
2239
2084
  Channels: () => Channels,
2240
- Contacts: () => Contacts,
2241
2085
  Generations: () => Generations,
2242
2086
  Knowledge: () => Knowledge,
2243
2087
  Models: () => Models,
@@ -3714,15 +3558,14 @@ const routes = {
3714
3558
  "list-channel-conversations": {
3715
3559
  serviceClass: "Channels",
3716
3560
  operationId: "listChannelConversations",
3717
- description: "A cursor page of the channel's conversations, newest first. A conversation is one contact's dialogue on the channel — the continuity anchor that resumes the same runtime session instead of starting fresh per message — so this is the read path for who has talked to the channel and which actor/session their dialogue resolved to. Conversations are created by the inbound path (the WhatsApp webhook, the Discord gateway worker) when a real message arrives; there is no way to create one directly.",
3561
+ description: "A cursor page of the channel's conversations, newest first. A conversation is one address's dialogue on the channel — the continuity anchor that resumes the same runtime session instead of starting fresh per message — so this is the read path for who has talked to the channel and which actor/session their dialogue resolved to. Conversations are created by the inbound path (the WhatsApp webhook, the Discord gateway worker) when a real message arrives; there is no way to create one directly.",
3718
3562
  moduleDocsUrl: "https://docs.naturali.ai/docs/modules/channels",
3719
3563
  httpMethod: "get",
3720
3564
  pathParams: ["project_id", "channel_id"],
3721
3565
  queryParams: [
3722
3566
  "limit",
3723
3567
  "cursor",
3724
- "contact_identifier",
3725
- "contact_id"
3568
+ "identifier"
3726
3569
  ],
3727
3570
  flags: [
3728
3571
  {
@@ -3754,15 +3597,8 @@ const routes = {
3754
3597
  "in": "query"
3755
3598
  },
3756
3599
  {
3757
- "name": "contact_identifier",
3758
- "description": "Filter to one contact's normalized channel identifier (a phone number on WhatsApp; a Discord user id, or `thread:<id>` for a guild thread). Unique within a channel, so at most one row matches.\n",
3759
- "required": false,
3760
- "type": "string",
3761
- "in": "query"
3762
- },
3763
- {
3764
- "name": "contact_id",
3765
- "description": "Filter to one contact — the same question asked of the human rather than of one of their identifiers. A contact with two identities on this channel has a conversation for each.\n",
3600
+ "name": "identifier",
3601
+ "description": "Filter to one address by its bare, channel-native identifier (a phone number on WhatsApp; a Discord user id, or `thread:<id>` for a guild thread) the same value the channel itself reports, not the prefixed form the `identifier` field above returns. At most one row matches.\n",
3766
3602
  "required": false,
3767
3603
  "type": "string",
3768
3604
  "in": "query"
@@ -3855,403 +3691,6 @@ const routes = {
3855
3691
  }
3856
3692
  ]
3857
3693
  },
3858
- "list-contacts": {
3859
- serviceClass: "Contacts",
3860
- operationId: "listContacts",
3861
- description: "A cursor page of the project's contacts, newest first. `channel` + `identifier` (supplied together) is the identity lookup — \"who is this phone number?\" — and returns at most one contact, following the merge pointer to whoever holds the identifier today. `external_id` asks the same question from the customer's side of the mapping. Contacts merged away are omitted unless `include_merged` asks for them.",
3862
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
3863
- httpMethod: "get",
3864
- pathParams: ["project_id"],
3865
- queryParams: [
3866
- "limit",
3867
- "cursor",
3868
- "channel",
3869
- "identifier",
3870
- "external_id",
3871
- "include_merged"
3872
- ],
3873
- flags: [
3874
- {
3875
- "name": "project_id",
3876
- "description": "Project public ID (proj_ prefix).",
3877
- "required": true,
3878
- "type": "string",
3879
- "in": "path"
3880
- },
3881
- {
3882
- "name": "limit",
3883
- "description": "Maximum items per page.",
3884
- "required": false,
3885
- "type": "integer",
3886
- "in": "query"
3887
- },
3888
- {
3889
- "name": "cursor",
3890
- "description": "Opaque pagination cursor from a previous response's next_cursor.",
3891
- "required": false,
3892
- "type": "string",
3893
- "in": "query"
3894
- },
3895
- {
3896
- "name": "channel",
3897
- "description": "Channel kind of the identifier to look up; requires `identifier`.",
3898
- "required": false,
3899
- "type": "string",
3900
- "in": "query"
3901
- },
3902
- {
3903
- "name": "identifier",
3904
- "description": "Normalized channel identifier to look up; requires `channel`.\n",
3905
- "required": false,
3906
- "type": "string",
3907
- "in": "query"
3908
- },
3909
- {
3910
- "name": "external_id",
3911
- "description": "The customer's own reference for the contact.",
3912
- "required": false,
3913
- "type": "string",
3914
- "in": "query"
3915
- },
3916
- {
3917
- "name": "include_merged",
3918
- "description": "Include contacts that were merged into another (tombstones). Off by default, so the page is the set of humans the project knows today.\n",
3919
- "required": false,
3920
- "type": "boolean",
3921
- "in": "query"
3922
- }
3923
- ]
3924
- },
3925
- "create-contact": {
3926
- serviceClass: "Contacts",
3927
- operationId: "createContact",
3928
- description: "Record a contact the customer already knows about, optionally with the identifiers it is expected to arrive at. Optional by design — the inbound path creates contacts on its own. This is for the embedder who has a user in their own system and wants naturali to agree about who that is before the first message, which is what makes `external_id` (and, through it, a session's `tool_context`) useful. No runtime actor is created here; the contact gets one on first need.",
3929
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
3930
- httpMethod: "post",
3931
- pathParams: ["project_id"],
3932
- queryParams: [],
3933
- flags: [
3934
- {
3935
- "name": "project_id",
3936
- "description": "Project public ID (proj_ prefix).",
3937
- "required": true,
3938
- "type": "string",
3939
- "in": "path"
3940
- },
3941
- {
3942
- "name": "display_name",
3943
- "description": "",
3944
- "required": false,
3945
- "type": "string",
3946
- "in": "body"
3947
- },
3948
- {
3949
- "name": "external_id",
3950
- "description": "Unique within the project.",
3951
- "required": false,
3952
- "type": "string",
3953
- "in": "body"
3954
- },
3955
- {
3956
- "name": "metadata",
3957
- "description": "",
3958
- "required": false,
3959
- "type": "object",
3960
- "in": "body"
3961
- },
3962
- {
3963
- "name": "identities",
3964
- "description": "Identifiers to attach at creation; each must be free (C3).",
3965
- "required": false,
3966
- "type": "array",
3967
- "in": "body"
3968
- }
3969
- ]
3970
- },
3971
- "get-contact": {
3972
- serviceClass: "Contacts",
3973
- operationId: "getContact",
3974
- description: "Get a contact",
3975
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
3976
- httpMethod: "get",
3977
- pathParams: ["project_id", "contact_id"],
3978
- queryParams: [],
3979
- flags: [{
3980
- "name": "project_id",
3981
- "description": "Project public ID (proj_ prefix).",
3982
- "required": true,
3983
- "type": "string",
3984
- "in": "path"
3985
- }, {
3986
- "name": "contact_id",
3987
- "description": "Contact public ID (cont_ prefix).",
3988
- "required": true,
3989
- "type": "string",
3990
- "in": "path"
3991
- }]
3992
- },
3993
- "update-contact": {
3994
- serviceClass: "Contacts",
3995
- operationId: "updateContact",
3996
- description: "Retune the customer-owned fields. At least one is required. Identities are attached and detached through their own sub-resource, because each one is a claim about reachability rather than a property of the record.",
3997
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
3998
- httpMethod: "patch",
3999
- pathParams: ["project_id", "contact_id"],
4000
- queryParams: [],
4001
- flags: [
4002
- {
4003
- "name": "project_id",
4004
- "description": "Project public ID (proj_ prefix).",
4005
- "required": true,
4006
- "type": "string",
4007
- "in": "path"
4008
- },
4009
- {
4010
- "name": "contact_id",
4011
- "description": "Contact public ID (cont_ prefix).",
4012
- "required": true,
4013
- "type": "string",
4014
- "in": "path"
4015
- },
4016
- {
4017
- "name": "display_name",
4018
- "description": "",
4019
- "required": false,
4020
- "type": "string",
4021
- "in": "body"
4022
- },
4023
- {
4024
- "name": "external_id",
4025
- "description": "",
4026
- "required": false,
4027
- "type": "string",
4028
- "in": "body"
4029
- },
4030
- {
4031
- "name": "metadata",
4032
- "description": "",
4033
- "required": false,
4034
- "type": "object",
4035
- "in": "body"
4036
- }
4037
- ]
4038
- },
4039
- "delete-contact": {
4040
- serviceClass: "Contacts",
4041
- operationId: "deleteContact",
4042
- description: "**Erasure (C4/LGPD).** Not a soft delete and not reversible: the contact's sessions — with their messages and media — its runtime actor, its memory container and every identifier it was reachable at are removed, along with the merge records that reference it. The upstream deletes happen first, so a failure there aborts before the local pointers are dropped and a retry can still find what is left. A contact that was merged into another cannot be erased directly: its data lives with the survivor, so erase that one.",
4043
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
4044
- httpMethod: "delete",
4045
- pathParams: ["project_id", "contact_id"],
4046
- queryParams: [],
4047
- flags: [{
4048
- "name": "project_id",
4049
- "description": "Project public ID (proj_ prefix).",
4050
- "required": true,
4051
- "type": "string",
4052
- "in": "path"
4053
- }, {
4054
- "name": "contact_id",
4055
- "description": "Contact public ID (cont_ prefix).",
4056
- "required": true,
4057
- "type": "string",
4058
- "in": "path"
4059
- }]
4060
- },
4061
- "create-contact-identity": {
4062
- serviceClass: "Contacts",
4063
- operationId: "createContactIdentity",
4064
- description: "Attach a `(channel, identifier)` pair — the manual half of what the inbound path does automatically, and the way a customer tells naturali that a number it has never seen belongs to a user it already knows. The identifier must be free (C3).",
4065
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
4066
- httpMethod: "post",
4067
- pathParams: ["project_id", "contact_id"],
4068
- queryParams: [],
4069
- flags: [
4070
- {
4071
- "name": "project_id",
4072
- "description": "Project public ID (proj_ prefix).",
4073
- "required": true,
4074
- "type": "string",
4075
- "in": "path"
4076
- },
4077
- {
4078
- "name": "contact_id",
4079
- "description": "Contact public ID (cont_ prefix).",
4080
- "required": true,
4081
- "type": "string",
4082
- "in": "path"
4083
- },
4084
- {
4085
- "name": "channel",
4086
- "description": "",
4087
- "required": true,
4088
- "type": "string",
4089
- "in": "body"
4090
- },
4091
- {
4092
- "name": "identifier",
4093
- "description": "",
4094
- "required": true,
4095
- "type": "string",
4096
- "in": "body"
4097
- },
4098
- {
4099
- "name": "display_name",
4100
- "description": "",
4101
- "required": false,
4102
- "type": "string",
4103
- "in": "body"
4104
- }
4105
- ]
4106
- },
4107
- "delete-contact-identity": {
4108
- serviceClass: "Contacts",
4109
- operationId: "deleteContactIdentity",
4110
- description: "Detach an identifier attached in error. Refused with `identity_in_use` once a dialogue hangs off it: dropping an identifier with history is erasure wearing a smaller name, and erasure has its own route that actually removes the messages instead of orphaning them.",
4111
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
4112
- httpMethod: "delete",
4113
- pathParams: [
4114
- "project_id",
4115
- "contact_id",
4116
- "identity_id"
4117
- ],
4118
- queryParams: [],
4119
- flags: [
4120
- {
4121
- "name": "project_id",
4122
- "description": "Project public ID (proj_ prefix).",
4123
- "required": true,
4124
- "type": "string",
4125
- "in": "path"
4126
- },
4127
- {
4128
- "name": "contact_id",
4129
- "description": "Contact public ID (cont_ prefix).",
4130
- "required": true,
4131
- "type": "string",
4132
- "in": "path"
4133
- },
4134
- {
4135
- "name": "identity_id",
4136
- "description": "Contact identity public ID (cid_ prefix).",
4137
- "required": true,
4138
- "type": "string",
4139
- "in": "path"
4140
- }
4141
- ]
4142
- },
4143
- "list-contact-conversations": {
4144
- serviceClass: "Contacts",
4145
- operationId: "listContactConversations",
4146
- description: "Every dialogue the contact has, across channels, newest first. The channel-scoped list answers \"who has talked to this number?\"; this one answers \"where has this human talked to us?\" — the read that makes a merge visible, since both channels' rows then appear under one contact.",
4147
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
4148
- httpMethod: "get",
4149
- pathParams: ["project_id", "contact_id"],
4150
- queryParams: [],
4151
- flags: [{
4152
- "name": "project_id",
4153
- "description": "Project public ID (proj_ prefix).",
4154
- "required": true,
4155
- "type": "string",
4156
- "in": "path"
4157
- }, {
4158
- "name": "contact_id",
4159
- "description": "Contact public ID (cont_ prefix).",
4160
- "required": true,
4161
- "type": "string",
4162
- "in": "path"
4163
- }]
4164
- },
4165
- "merge-contact": {
4166
- serviceClass: "Contacts",
4167
- operationId: "mergeContact",
4168
- description: "Fold `source_contact_id` into this contact — \"same human, two identifiers\" (C4). What moves: every identity and every conversation, so the survivor's history is the union of both. What is *shared* rather than moved: agent memory — the runtime hangs it off the actor, so the source's actor is re-pointed at the survivor's memory container and both keep answering with one recollection. Existing sessions keep working, which is the point of not rewriting them. The source is not deleted: it stays as a tombstone pointing at the survivor, and the returned merge record lists exactly what moved, so the merge can be audited and reverted.",
4169
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
4170
- httpMethod: "post",
4171
- pathParams: ["project_id", "contact_id"],
4172
- queryParams: [],
4173
- flags: [
4174
- {
4175
- "name": "project_id",
4176
- "description": "Project public ID (proj_ prefix).",
4177
- "required": true,
4178
- "type": "string",
4179
- "in": "path"
4180
- },
4181
- {
4182
- "name": "contact_id",
4183
- "description": "Contact public ID (cont_ prefix).",
4184
- "required": true,
4185
- "type": "string",
4186
- "in": "path"
4187
- },
4188
- {
4189
- "name": "source_contact_id",
4190
- "description": "The contact to fold into this one. It must live in the same project and must not itself already be merged away.\n",
4191
- "required": true,
4192
- "type": "string",
4193
- "in": "body"
4194
- }
4195
- ]
4196
- },
4197
- "list-contact-merges": {
4198
- serviceClass: "Contacts",
4199
- operationId: "listContactMerges",
4200
- description: "The contact's merge history, newest first, from both sides: the merges it absorbed and the one that absorbed it. The audit half of C4.",
4201
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
4202
- httpMethod: "get",
4203
- pathParams: ["project_id", "contact_id"],
4204
- queryParams: [],
4205
- flags: [{
4206
- "name": "project_id",
4207
- "description": "Project public ID (proj_ prefix).",
4208
- "required": true,
4209
- "type": "string",
4210
- "in": "path"
4211
- }, {
4212
- "name": "contact_id",
4213
- "description": "Contact public ID (cont_ prefix).",
4214
- "required": true,
4215
- "type": "string",
4216
- "in": "path"
4217
- }]
4218
- },
4219
- "revert-contact-merge": {
4220
- serviceClass: "Contacts",
4221
- operationId: "revertContactMerge",
4222
- description: "Undo a merge (C4). Replays the record backwards: the identities and conversations it lists go back to the source, the source's actor is re-pointed at the memory it had before, and the tombstone becomes a contact again. Anything that arrived *after* the merge stays with the survivor — it was never the source's. Only the merge still in force can be reverted; a source that has since been merged somewhere else has to be unwound from the top (`merge_superseded`).",
4223
- moduleDocsUrl: "https://docs.naturali.ai/docs/modules/contacts",
4224
- httpMethod: "post",
4225
- pathParams: [
4226
- "project_id",
4227
- "contact_id",
4228
- "merge_id"
4229
- ],
4230
- queryParams: [],
4231
- flags: [
4232
- {
4233
- "name": "project_id",
4234
- "description": "Project public ID (proj_ prefix).",
4235
- "required": true,
4236
- "type": "string",
4237
- "in": "path"
4238
- },
4239
- {
4240
- "name": "contact_id",
4241
- "description": "Contact public ID (cont_ prefix).",
4242
- "required": true,
4243
- "type": "string",
4244
- "in": "path"
4245
- },
4246
- {
4247
- "name": "merge_id",
4248
- "description": "Contact merge public ID (cmrg_ prefix).",
4249
- "required": true,
4250
- "type": "string",
4251
- "in": "path"
4252
- }
4253
- ]
4254
- },
4255
3694
  "list-agent-generations": {
4256
3695
  serviceClass: "Generations",
4257
3696
  operationId: "listAgentGenerations",
@@ -5536,16 +4975,9 @@ const routes = {
5536
4975
  "type": "string",
5537
4976
  "in": "body"
5538
4977
  },
5539
- {
5540
- "name": "contact_id",
5541
- "description": "The contact the session is for (Contacts API, §6). naturali resolves it to the contact's runtime actor — minting one on first need — so a web or in-app session gets the same continuity, memory and history a channel conversation gets, instead of a throwaway identity per session. When the contact has an `external_id` it rides along in `tool_context` as `actor_external_id`, so the customer's own HTTP tools receive the user reference they already key on; an explicit `tool_context` entry still wins. Mutually exclusive with `actor_id`.\n",
5542
- "required": false,
5543
- "type": "string",
5544
- "in": "body"
5545
- },
5546
4978
  {
5547
4979
  "name": "actor_id",
5548
- "description": "Public ID of an existing actor to attach as the user actor. A runtime id showing through the public contract; prefer `contact_id`. Mutually exclusive with it.\n",
4980
+ "description": "Public ID of an existing actor to attach as the user actor a runtime id showing through the public contract.\n",
5549
4981
  "required": false,
5550
4982
  "type": "string",
5551
4983
  "in": "body"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturali/cli",
3
- "version": "0.46.1",
3
+ "version": "0.47.1",
4
4
  "description": "Command-line interface for the naturali.ai API, generated from its OpenAPI specs",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,7 +30,7 @@
30
30
  "tsx": "^4.23.1",
31
31
  "typescript": "~6.0.3",
32
32
  "vitest": "^4.1.10",
33
- "@naturali/sdk": "0.46.1"
33
+ "@naturali/sdk": "0.47.1"
34
34
  },
35
35
  "scripts": {
36
36
  "generate": "tsx scripts/generate.ts",