@vectros-ai/mcp-server 0.18.0 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -42,7 +42,7 @@ module.exports = __toCommonJS(index_exports);
42
42
  // src/server.ts
43
43
  var import_server = require("@modelcontextprotocol/sdk/server/index.js");
44
44
 
45
- // node_modules/@vectros-ai/sdk/dist/index.mjs
45
+ // ../../node_modules/@vectros-ai/sdk/dist/index.mjs
46
46
  var __defProp2 = Object.defineProperty;
47
47
  var __export2 = (target, all) => {
48
48
  for (var name in all)
@@ -57,9 +57,11 @@ __export2(api_exports, {
57
57
  BatchWriteRequest: () => BatchWriteRequest,
58
58
  BatchWriteResult: () => BatchWriteResult,
59
59
  ChatMessage: () => ChatMessage,
60
+ ChatRequest: () => ChatRequest,
60
61
  ConflictError: () => ConflictError,
61
62
  ContentDeltaEvent: () => ContentDeltaEvent,
62
63
  ContentTooLargeError: () => ContentTooLargeError,
64
+ DocumentAskRequest: () => DocumentAskRequest,
63
65
  DocumentContextEvent: () => DocumentContextEvent,
64
66
  DocumentLookupRequest: () => DocumentLookupRequest,
65
67
  DocumentPatchRequest: () => DocumentPatchRequest,
@@ -90,8 +92,10 @@ __export2(api_exports, {
90
92
  NotImplementedError: () => NotImplementedError,
91
93
  PaymentRequiredError: () => PaymentRequiredError,
92
94
  PingResponse: () => PingResponse,
95
+ RagRequest: () => RagRequest,
93
96
  RagSearch: () => RagSearch,
94
97
  ReadAccessLogResponse: () => ReadAccessLogResponse,
98
+ ReasoningDeltaEvent: () => ReasoningDeltaEvent,
95
99
  RecordLookupRequest: () => RecordLookupRequest,
96
100
  RecordRequest: () => RecordRequest,
97
101
  RecordResponse: () => RecordResponse,
@@ -447,7 +451,33 @@ var ListUsersRequestOrder = {
447
451
  Asc: "asc",
448
452
  Desc: "desc"
449
453
  };
454
+ var ChatRequest;
455
+ ((ChatRequest2) => {
456
+ ChatRequest2.Reasoning = {
457
+ Omit: "omit",
458
+ Stream: "stream"
459
+ };
460
+ })(ChatRequest || (ChatRequest = {}));
461
+ var DocumentAskRequest;
462
+ ((DocumentAskRequest2) => {
463
+ DocumentAskRequest2.Reasoning = {
464
+ Omit: "omit",
465
+ Stream: "stream"
466
+ };
467
+ })(DocumentAskRequest || (DocumentAskRequest = {}));
468
+ var RagRequest;
469
+ ((RagRequest2) => {
470
+ RagRequest2.Reasoning = {
471
+ Omit: "omit",
472
+ Stream: "stream"
473
+ };
474
+ })(RagRequest || (RagRequest = {}));
450
475
  var inference_exports = {};
476
+ __export2(inference_exports, {
477
+ ChatRequest: () => ChatRequest,
478
+ DocumentAskRequest: () => DocumentAskRequest,
479
+ RagRequest: () => RagRequest
480
+ });
451
481
  var BatchWriteRequest;
452
482
  ((BatchWriteRequest2) => {
453
483
  BatchWriteRequest2.Atomicity = {
@@ -720,6 +750,12 @@ var ReadAccessLogResponse;
720
750
  Rag: "rag"
721
751
  };
722
752
  })(ReadAccessLogResponse || (ReadAccessLogResponse = {}));
753
+ var ReasoningDeltaEvent;
754
+ ((ReasoningDeltaEvent2) => {
755
+ ReasoningDeltaEvent2.Event = {
756
+ ReasoningDelta: "reasoning_delta"
757
+ };
758
+ })(ReasoningDeltaEvent || (ReasoningDeltaEvent = {}));
723
759
  var RecordRequest;
724
760
  ((RecordRequest2) => {
725
761
  RecordRequest2.Status = {
@@ -2472,7 +2508,7 @@ var AuthClient = class {
2472
2508
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/auth/jwks");
2473
2509
  }
2474
2510
  /**
2475
- * Returns a page of per-subject PHI read-access rows: who read which subject's PHI, when, against which record, and whether any sensitive value was actually revealed in plaintext. Metadata only — never the PHI itself. This is the disclosure-accounting surface from which a covered entity derives its HIPAA §164.528 accounting of disclosures. Provide at least one query axis: a subject (`subjectType` + `subjectId`) within a `contextId` for the primary accounting query; `resourceId` within a `contextId` for 'who read this record'; `callerKeyId` for 'what did this credential read' (account-wide forensic); or `contextId` alone to enumerate a whole context. `from`/`to` bound the time window. Results are scoped to your account, derived from your token — never from input. Requires the `access-log:r` scope.
2511
+ * Returns a page of per-subject PHI read-access rows: who read which subject's PHI, when, against which record, and whether any sensitive value was actually revealed in plaintext. Metadata only — never the PHI itself. Rows exist only where read-access logging is enabled. Provide at least one query axis: a subject (`subjectType` + `subjectId`) within a `contextId` for the primary accounting query; `resourceId` within a `contextId` for 'who read this record'; `callerKeyId` for 'what did this credential read' (account-wide forensic); or `contextId` alone to enumerate a whole context. `from`/`to` bound the time window. Results are scoped to your account, derived from your token — never from input. Requires the `access-log:r` scope.
2476
2512
  *
2477
2513
  * @param {Vectros.GetAccessLogRequest} request
2478
2514
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -2614,7 +2650,7 @@ var AuthClient = class {
2614
2650
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/admin/keys/scoped");
2615
2651
  }
2616
2652
  /**
2617
- * Creates a scoped API key (an `ssk_*` secret) that inherits its permissions from an existing access profile in your account. The call is idempotent on the combination of tenant, context, user, and key name: re-issuing the same request returns the existing key WITHOUT re-disclosing its raw secret. The raw key is returned ONLY in this response — store it securely, as it cannot be retrieved again. Requires the `keys:c` scope. If you use a scoped credential, `keys:c` alone is not sufficient: because the minted key is durably bound to the profile you name, the profile's effective scopes may not exceed your own, and you may only mint against a profile whose `identityOverrides` values your own identity holds. Minting a key bound to your OWN principal needs nothing further; minting one bound to a DIFFERENT principal additionally requires the `delegate-mint` capability (`granted_capabilities`) on your credential — without it the request is refused. A root API key (`sk_`) is exempt from all three bounds. The profile you name must be `active` AND the user you name must not be `SUSPENDED`: either is refused with `409`, and no root exemption applies to that. Both refusals stop ISSUANCE only. Suspending the profile additionally stops credentials already bound to it, within about five minutes; suspending the user does not stop their existing keys at all. A `PENDING` user is fine.
2653
+ * Creates a scoped API key (an `ssk_*` secret) that inherits its permissions from an existing access profile in your account. The call is idempotent on the combination of tenant, context, user, and key name: re-issuing the same request returns the existing key WITHOUT re-disclosing its raw secret. The raw key is returned ONLY in this response — store it securely, as it cannot be retrieved again. Requires the `keys:c` scope. If you use a scoped credential, `keys:c` alone is not sufficient: because the minted key is durably bound to the profile you name, the profile's effective scopes may not exceed your own, and you may only mint against a profile whose `identityOverrides` values your own identity holds. Minting a key bound to your OWN principal needs nothing further; minting one bound to a DIFFERENT principal additionally requires the `delegate-mint` capability (`granted_capabilities`) on your credential — without it the request is refused. A root API key (`sk_`) is exempt from all three bounds. The profile you name must be `active` AND the user you name must not be `SUSPENDED`: either is refused with `409`, and no root exemption applies to that. Both refusals stop ISSUANCE only. Suspending the profile or the user additionally stops credentials already bound to it, within about five minutes. A `PENDING` user is fine.
2618
2654
  *
2619
2655
  * @param {Vectros.CreateScopedKeyRequest} request
2620
2656
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -2957,6 +2993,7 @@ var AuthClient = class {
2957
2993
  * @throws {@link Vectros.BadRequestError}
2958
2994
  * @throws {@link Vectros.ForbiddenError}
2959
2995
  * @throws {@link Vectros.NotFoundError}
2996
+ * @throws {@link Vectros.ConflictError}
2960
2997
  * @throws {@link Vectros.TooManyRequestsError}
2961
2998
  *
2962
2999
  * @example
@@ -3009,6 +3046,8 @@ var AuthClient = class {
3009
3046
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
3010
3047
  case 404:
3011
3048
  throw new NotFoundError(_response.error.body, _response.rawResponse);
3049
+ case 409:
3050
+ throw new ConflictError(_response.error.body, _response.rawResponse);
3012
3051
  case 429:
3013
3052
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
3014
3053
  default:
@@ -3092,6 +3131,8 @@ var AuthClient = class {
3092
3131
  * @throws {@link Vectros.BadRequestError}
3093
3132
  * @throws {@link Vectros.PaymentRequiredError}
3094
3133
  * @throws {@link Vectros.ForbiddenError}
3134
+ * @throws {@link Vectros.NotFoundError}
3135
+ * @throws {@link Vectros.ConflictError}
3095
3136
  * @throws {@link Vectros.TooManyRequestsError}
3096
3137
  *
3097
3138
  * @example
@@ -3144,6 +3185,10 @@ var AuthClient = class {
3144
3185
  throw new PaymentRequiredError(_response.error.body, _response.rawResponse);
3145
3186
  case 403:
3146
3187
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
3188
+ case 404:
3189
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
3190
+ case 409:
3191
+ throw new ConflictError(_response.error.body, _response.rawResponse);
3147
3192
  case 429:
3148
3193
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
3149
3194
  default:
@@ -3232,6 +3277,7 @@ var AuthClient = class {
3232
3277
  * @throws {@link Vectros.BadRequestError}
3233
3278
  * @throws {@link Vectros.ForbiddenError}
3234
3279
  * @throws {@link Vectros.NotFoundError}
3280
+ * @throws {@link Vectros.ConflictError}
3235
3281
  * @throws {@link Vectros.TooManyRequestsError}
3236
3282
  *
3237
3283
  * @example
@@ -3288,6 +3334,8 @@ var AuthClient = class {
3288
3334
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
3289
3335
  case 404:
3290
3336
  throw new NotFoundError(_response.error.body, _response.rawResponse);
3337
+ case 409:
3338
+ throw new ConflictError(_response.error.body, _response.rawResponse);
3291
3339
  case 429:
3292
3340
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
3293
3341
  default:
@@ -3378,6 +3426,7 @@ var AuthClient = class {
3378
3426
  * @throws {@link Vectros.BadRequestError}
3379
3427
  * @throws {@link Vectros.ForbiddenError}
3380
3428
  * @throws {@link Vectros.NotFoundError}
3429
+ * @throws {@link Vectros.ConflictError}
3381
3430
  * @throws {@link Vectros.TooManyRequestsError}
3382
3431
  *
3383
3432
  * @example
@@ -3428,6 +3477,8 @@ var AuthClient = class {
3428
3477
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
3429
3478
  case 404:
3430
3479
  throw new NotFoundError(_response.error.body, _response.rawResponse);
3480
+ case 409:
3481
+ throw new ConflictError(_response.error.body, _response.rawResponse);
3431
3482
  case 429:
3432
3483
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
3433
3484
  default:
@@ -3574,13 +3625,14 @@ var AuthClient = class {
3574
3625
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/app-contexts/{contextId}");
3575
3626
  }
3576
3627
  /**
3577
- * Updates an app context. This is a partial update: any field you omit (or send as null) keeps its existing value. The `contextId` is immutable and is taken from the URL path, so any `contextId` in the request body is ignored. Patchable fields: `name`, `description`, `companyName`; the per-principal metering trio (`meteringAxis`, `principalBurstLimit`, `principalUsageCap` — only takes effect for a partner with the corresponding account-level feature enabled); `readAccessLogDefault` (the PHI read-access-logging context default); and `identityProjectionClaims` (requires the platform provisioning capability on top of the ordinary scope below — see its own field description). Requires the `app-contexts:u` scope.
3628
+ * Updates an app context. This is a partial update: any field you omit (or send as null) keeps its existing value. The `contextId` is immutable and is taken from the URL path, so any `contextId` in the request body is ignored. Patchable fields: `name`, `description`, `companyName`; the per-principal metering trio (`meteringAxis`, `principalBurstLimit`, `principalUsageCap` — only takes effect for an account with the corresponding feature enabled); `readAccessLogDefault` (the PHI read-access-logging context default); and `identityProjectionClaims` (requires the platform provisioning capability on top of the ordinary scope below — see its own field description). Requires the `app-contexts:u` scope.
3578
3629
  *
3579
3630
  * @param {Vectros.UpdateAppContextRequest} request
3580
3631
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
3581
3632
  *
3582
3633
  * @throws {@link Vectros.ForbiddenError}
3583
3634
  * @throws {@link Vectros.NotFoundError}
3635
+ * @throws {@link Vectros.ConflictError}
3584
3636
  * @throws {@link Vectros.TooManyRequestsError}
3585
3637
  *
3586
3638
  * @example
@@ -3629,6 +3681,8 @@ var AuthClient = class {
3629
3681
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
3630
3682
  case 404:
3631
3683
  throw new NotFoundError(_response.error.body, _response.rawResponse);
3684
+ case 409:
3685
+ throw new ConflictError(_response.error.body, _response.rawResponse);
3632
3686
  case 429:
3633
3687
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
3634
3688
  default:
@@ -3785,6 +3839,7 @@ var AuthClient = class {
3785
3839
  *
3786
3840
  * @throws {@link Vectros.ForbiddenError}
3787
3841
  * @throws {@link Vectros.NotFoundError}
3842
+ * @throws {@link Vectros.ConflictError}
3788
3843
  * @throws {@link Vectros.TooManyRequestsError}
3789
3844
  *
3790
3845
  * @example
@@ -3837,6 +3892,8 @@ var AuthClient = class {
3837
3892
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
3838
3893
  case 404:
3839
3894
  throw new NotFoundError(_response.error.body, _response.rawResponse);
3895
+ case 409:
3896
+ throw new ConflictError(_response.error.body, _response.rawResponse);
3840
3897
  case 429:
3841
3898
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
3842
3899
  default:
@@ -3862,6 +3919,7 @@ var AuthClient = class {
3862
3919
  *
3863
3920
  * @throws {@link Vectros.ForbiddenError}
3864
3921
  * @throws {@link Vectros.NotFoundError}
3922
+ * @throws {@link Vectros.ConflictError}
3865
3923
  * @throws {@link Vectros.TooManyRequestsError}
3866
3924
  *
3867
3925
  * @example
@@ -3904,6 +3962,8 @@ var AuthClient = class {
3904
3962
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
3905
3963
  case 404:
3906
3964
  throw new NotFoundError(_response.error.body, _response.rawResponse);
3965
+ case 409:
3966
+ throw new ConflictError(_response.error.body, _response.rawResponse);
3907
3967
  case 429:
3908
3968
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
3909
3969
  default:
@@ -4177,7 +4237,7 @@ var AuthClient = class {
4177
4237
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/auth/issuers/{issuerId}");
4178
4238
  }
4179
4239
  /**
4180
- * Updates the mutable fields of a registered issuer: `subClaim`, `emailClaim`, `userinfoUri`, `capturedClaims`, `restrictedToDomain` (a new non-blank value must already be a VERIFIED domain for your account; an empty string clears it back to domain-less; see `IssuerUpdateRequest.restrictedToDomain` for the full semantics), `status` (`active`/`suspended` — a registration awaiting verification (`pending_verification`) accepts no status change until it is verified; a suspended issuer's tokens are rejected identically to an unregistered issuer at exchange time), and `selfSignupPolicies`. Fields omitted from the body are left unchanged (partial update). `issuer`, `jwksUri`, `audience`, and `contextId` are trust-anchor / routing-pin fields and are immutable via this route — supplying a value that differs from the current registration is rejected with 400; supplying the current value back is a no-op. Rotating a trust anchor requires deleting and re-registering the issuer, which is itself refused while any user is bound through it. **`subClaim` is identity-determining, not merely cosmetic**: it names which verified JWT claim is read as the federated user's identifier, so changing it on an issuer that already has bound users would silently re-identify (or, under self-signup, orphan) every one of them — changing it is therefore refused once any user has bound through this issuer, the same guard `DELETE` already applies, and is only free before the first real login. Requires a root API key or the bootstrap's provisioning capability, gated identically to every other operation on this surface. A credential confined to one app context may only update an issuer registered in that context; naming one registered in another context returns 404, identically to a nonexistent issuerId. A root API key may update any issuer.
4240
+ * Updates the mutable fields of a registered issuer: `subClaim`, `emailClaim`, `userinfoUri`, `capturedClaims`, `restrictedToDomain` (a new non-blank value must already be a VERIFIED domain for your account; an empty string clears it where permitted; see `IssuerUpdateRequest.restrictedToDomain` for the full semantics), `status` (`active`/`suspended` — a registration awaiting verification (`pending_verification`) accepts no status change until it is verified; a suspended issuer's tokens are rejected identically to an unregistered issuer at exchange time), and `selfSignupPolicies`. Fields omitted from the body are left unchanged (partial update). `issuer`, `jwksUri`, `audience`, and `contextId` are trust-anchor / routing-pin fields and are immutable via this route — supplying a value that differs from the current registration is rejected with 400; supplying the current value back is a no-op. Rotating a trust anchor requires deleting and re-registering the issuer, which is itself refused while any user is bound through it. **`subClaim` is identity-determining, not merely cosmetic**: it names which verified JWT claim is read as the federated user's identifier, so changing it on an issuer that already has bound users would silently re-identify (or, under self-signup, orphan) every one of them — changing it is therefore refused once any user has bound through this issuer, the same guard `DELETE` already applies, and is only free before the first real login. Requires a root API key or the bootstrap's provisioning capability, gated identically to every other operation on this surface. A credential confined to one app context may only update an issuer registered in that context; naming one registered in another context returns 404, identically to a nonexistent issuerId. A root API key may update any issuer.
4181
4241
  *
4182
4242
  * @param {Vectros.IssuerUpdateRequest} request
4183
4243
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -4185,6 +4245,7 @@ var AuthClient = class {
4185
4245
  * @throws {@link Vectros.BadRequestError}
4186
4246
  * @throws {@link Vectros.ForbiddenError}
4187
4247
  * @throws {@link Vectros.NotFoundError}
4248
+ * @throws {@link Vectros.ConflictError}
4188
4249
  * @throws {@link Vectros.TooManyRequestsError}
4189
4250
  *
4190
4251
  * @example
@@ -4231,6 +4292,8 @@ var AuthClient = class {
4231
4292
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
4232
4293
  case 404:
4233
4294
  throw new NotFoundError(_response.error.body, _response.rawResponse);
4295
+ case 409:
4296
+ throw new ConflictError(_response.error.body, _response.rawResponse);
4234
4297
  case 429:
4235
4298
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
4236
4299
  default:
@@ -4244,7 +4307,7 @@ var AuthClient = class {
4244
4307
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/v1/auth/issuers/{issuerId}");
4245
4308
  }
4246
4309
  /**
4247
- * Deregisters a trusted third-party IdP issuer. Requires a root API key or the bootstrap's provisioning capability. A credential confined to one app context may only deregister an issuer registered in that context; naming one registered in another context returns 404, identically to a nonexistent issuerId. A root API key may deregister any issuer. Refused if any user account was ever created or matched via this issuer (by a prior self-signup or accepted invite, through `POST /v1/auth/token/exchange`) — that access cannot be silently orphaned. This is unconditional on the affected users' `status`: suspending them first does not lift the refusal. **A bound registration cannot be replaced, self-service, within its own app context**: registering a replacement issuer under a different issuerId in the SAME context also fails, because the context's one-active-issuer claim is released only when THIS registration is deleted. Two real options: suspend this issuer (stops new exchanges immediately) and register a replacement under a DIFFERENT app context — note that targets a different context, so this context's existing users/roles/access profiles are not carried over; or contact your platform operator, who can force-release this registration so a replacement may be registered in the SAME context under a new issuerId. **The operator path is not a lighter-weight alternative to the first — it PERMANENTLY RETIRES this issuerId and leaves every bound user unable to ever exchange through it again; it does not preserve continuity for them any better than registering under a different context does.** An issuer that has never been used for an exchange (no bound users yet) can always be deregistered.
4310
+ * Deregisters a trusted third-party IdP issuer. Requires a root API key or the bootstrap's provisioning capability. A credential confined to one app context may only deregister an issuer registered in that context; naming one registered in another context returns 404, identically to a nonexistent issuerId. A root API key may deregister any issuer. Refused if any user account was ever created or matched via this issuer (by a prior self-signup or accepted invite, through `POST /v1/auth/token/exchange`) — that access cannot be silently orphaned. This is unconditional on the affected users' `status`: suspending them first does not lift the refusal. **A bound registration cannot be replaced, self-service, within its own app context**: registering a replacement issuer under a different issuerId in the SAME context also fails, because the context's one-active-issuer claim is released only when THIS registration is deleted. Two real options: suspend this issuer (stops new exchanges immediately) and register a replacement under a DIFFERENT app context — note that targets a different context, so this context's existing users/roles/access profiles are not carried over; or contact support, who can force-release this registration so a replacement may be registered in the SAME context under a new issuerId. **The support path is not a lighter-weight alternative to the first — it PERMANENTLY RETIRES this issuerId and leaves every bound user unable to ever exchange through it again; it does not preserve continuity for them any better than registering under a different context does.** An issuer that has never been used for an exchange (no bound users yet) can always be deregistered.
4248
4311
  *
4249
4312
  * @param {Vectros.DeleteIssuerRequest} request
4250
4313
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -4370,7 +4433,7 @@ var AuthClient = class {
4370
4433
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/auth/issuers");
4371
4434
  }
4372
4435
  /**
4373
- * Registers a trusted third-party IdP issuer that BYO-IdP token exchange (`POST /v1/auth/token/exchange`) may accept a `subject_token` from. Requires a root API key or the CLI bootstrap's provisioning capability — never an ordinary partner-grantable scope. A credential authorized only via the provisioning capability may register only against the app context it is bound to; naming a different one returns 403. A root API key is unaffected and may register against any of its contexts. A registration without `restrictedToDomain` is created `pending_verification` with a one-time challenge (`verificationClaim`, `verificationNonce`, `verificationExpiresAt`) and accepts no token until you prove you control the issuer with `POST /v1/auth/issuers/{issuerId}/verify`; it claims no `(issuer, audience)` pair until then, so registering never reveals whether another tenant holds one. A registration scoped to an already-verified domain with `restrictedToDomain` is `active` at once. Idempotent by `issuerId` within your tenant. If `issuerId` collides with a registration owned by a different app context than the one you're confined to, the request fails with 400 rather than returning that context's configuration. An app context may have at most one active issuer — deregister the existing one first if you need to replace it. One issuer MAY serve several contexts today, each via its own registration row with a distinct `audience`. Optionally name `restrictedToDomain` to scope this registration's (issuer, audience) uniqueness to a specific VERIFIED domain rather than the bare pair — see that field's own description. A domain-scoped registration proves control of the DOMAIN, not of the issuer itself: it routes only tokens carrying that domain's `hd` claim.
4436
+ * Registers a trusted third-party IdP issuer that BYO-IdP token exchange (`POST /v1/auth/token/exchange`) may accept a `subject_token` from. Requires a root API key or the CLI bootstrap's provisioning capability — never an ordinary grantable scope. A credential authorized only via the provisioning capability may register only against the app context it is bound to; naming a different one returns 403. A root API key is unaffected and may register against any of its contexts. A registration without `restrictedToDomain` is created `pending_verification` with a one-time challenge (`verificationClaim`, `verificationNonce`, `verificationExpiresAt`) and accepts no token until you prove you control the issuer with `POST /v1/auth/issuers/{issuerId}/verify`; it claims no `(issuer, audience)` pair until then, so registering never reveals whether another tenant holds one. A registration scoped to an already-verified domain with `restrictedToDomain` is `active` at once. Idempotent by `issuerId` within your tenant. If `issuerId` collides with a registration owned by a different app context than the one you're confined to, the request fails with 400 rather than returning that context's configuration. An app context may have at most one active issuer — deregister the existing one first if you need to replace it. One issuer MAY serve several contexts, each via its own registration row with a distinct `audience`. Optionally name `restrictedToDomain` to scope this registration's (issuer, audience) uniqueness to a specific VERIFIED domain rather than the bare pair — see that field's own description. A domain-scoped registration proves control of the DOMAIN, not of the issuer itself: it routes only tokens carrying that domain's `hd` claim.
4374
4437
  *
4375
4438
  * @param {Vectros.IssuerRequest} request
4376
4439
  * @param {AuthClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -4779,6 +4842,7 @@ var AuthClient = class {
4779
4842
  * @throws {@link Vectros.BadRequestError}
4780
4843
  * @throws {@link Vectros.ForbiddenError}
4781
4844
  * @throws {@link Vectros.NotFoundError}
4845
+ * @throws {@link Vectros.ConflictError}
4782
4846
  * @throws {@link Vectros.TooManyRequestsError}
4783
4847
  *
4784
4848
  * @example
@@ -4826,6 +4890,8 @@ var AuthClient = class {
4826
4890
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
4827
4891
  case 404:
4828
4892
  throw new NotFoundError(_response.error.body, _response.rawResponse);
4893
+ case 409:
4894
+ throw new ConflictError(_response.error.body, _response.rawResponse);
4829
4895
  case 429:
4830
4896
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
4831
4897
  default:
@@ -4925,6 +4991,7 @@ var AuthClient = class {
4925
4991
  * @throws {@link Vectros.UnauthorizedError}
4926
4992
  * @throws {@link Vectros.ForbiddenError}
4927
4993
  * @throws {@link Vectros.NotFoundError}
4994
+ * @throws {@link Vectros.ContentTooLargeError}
4928
4995
  * @throws {@link Vectros.TooManyRequestsError}
4929
4996
  *
4930
4997
  * @example
@@ -4969,6 +5036,8 @@ var AuthClient = class {
4969
5036
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
4970
5037
  case 404:
4971
5038
  throw new NotFoundError(_response.error.body, _response.rawResponse);
5039
+ case 413:
5040
+ throw new ContentTooLargeError(_response.error.body, _response.rawResponse);
4972
5041
  case 429:
4973
5042
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
4974
5043
  default:
@@ -4987,7 +5056,7 @@ var ComplianceClient = class {
4987
5056
  this._options = normalizeClientOptionsWithAuth(options);
4988
5057
  }
4989
5058
  /**
4990
- * Submits a right-to-erasure request for a single end-subject (a user, or an identity entity in any namespace). Erasure removes exactly the data the subject solely owns across the declared contexts, plus its identity and lookup rows when all contexts are covered. It never touches another account's data and never cascades into another subject's data. The request is asynchronous: it returns 202 with a `requestId`; poll `GET /v1/erasure-requests/{id}` until the job completes to obtain the completion certificate. Requires a root API key — a scoped credential is rejected with 403.
5059
+ * Submits an erasure request for a single end-subject (a user, or an identity entity in any namespace). Erasure deletes the records, documents, folders and record schemas the subject solely owns across the declared contexts (and, for a user, its access profiles there), plus its identity and lookup rows when all contexts are covered. Rows co-owned with another owner scope or principal are kept; read-access log entries are not erased. The request is asynchronous: it returns 202 with a `requestId`; poll `GET /v1/erasure-requests/{id}` until the job completes to obtain the completion certificate. Requires a root API key — a scoped credential is rejected with 403.
4991
5060
  *
4992
5061
  * @param {Vectros.ErasureRequest} request
4993
5062
  * @param {ComplianceClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -5050,7 +5119,7 @@ var ComplianceClient = class {
5050
5119
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/v1/erasure-requests");
5051
5120
  }
5052
5121
  /**
5053
- * Polls an erasure request by id. While the job is still running this returns its status only; once it completes, the response also includes the verifiable completion certificate (which contexts were swept, per-context deletion counts, whether the identity was kept, and reports of dangling references and shared rows left intact). Requires a root API key.
5122
+ * Polls an erasure request by id. While the job is still running this returns its status only; once it completes, the response also includes the completion certificate (which contexts were swept, per-context deletion counts, whether the identity was kept, and reports of dangling references and shared rows left intact). Requires a root API key.
5054
5123
  *
5055
5124
  * @param {Vectros.GetErasureRequestRequest} request
5056
5125
  * @param {ComplianceClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -5108,7 +5177,7 @@ var ComplianceClient = class {
5108
5177
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/erasure-requests/{id}");
5109
5178
  }
5110
5179
  /**
5111
- * Submits an asynchronous job to export your account's data, or a single end-subject's data, across the requested contexts. The request returns 202 with an `exportJobId`; poll `GET /v1/admin/export/{id}` until the job completes to obtain a short-lived presigned download URL and a manifest describing the payload. Requires a root API key — a scoped credential is rejected with 403.
5180
+ * Reserved: with a root API key this operation answers `501` and starts no job. The request and response shapes are published so that integrations can be written against them: a request names the contexts, or a single end-subject, to export, and the response carries an `exportJobId` that `GET /v1/admin/export/{id}` reports on. Requires a root API key — a scoped credential is rejected with 403.
5112
5181
  *
5113
5182
  * @param {Vectros.ExportRequest} request
5114
5183
  * @param {ComplianceClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -5169,7 +5238,7 @@ var ComplianceClient = class {
5169
5238
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/v1/admin/export");
5170
5239
  }
5171
5240
  /**
5172
- * Polls an export job by id. While the job is still running this returns its status only; once it completes, the response also includes a short-lived presigned download URL and a manifest (format version and per-context counts). Requires a root API key.
5241
+ * Reserved: with a root API key this operation answers `501`. Its response shape is the one the export operation above refers to: the job status, and a short-lived presigned download URL and a manifest (format version and per-context counts) for a completed job. Requires a root API key.
5173
5242
  *
5174
5243
  * @param {Vectros.GetExportRequest} request
5175
5244
  * @param {ComplianceClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -5300,6 +5369,8 @@ var DocumentsClient = class {
5300
5369
  *
5301
5370
  * @throws {@link Vectros.BadRequestError}
5302
5371
  * @throws {@link Vectros.ForbiddenError}
5372
+ * @throws {@link Vectros.NotFoundError}
5373
+ * @throws {@link Vectros.ConflictError}
5303
5374
  * @throws {@link Vectros.TooManyRequestsError}
5304
5375
  *
5305
5376
  * @example
@@ -5351,6 +5422,10 @@ var DocumentsClient = class {
5351
5422
  throw new BadRequestError(_response.error.body, _response.rawResponse);
5352
5423
  case 403:
5353
5424
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
5425
+ case 404:
5426
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
5427
+ case 409:
5428
+ throw new ConflictError(_response.error.body, _response.rawResponse);
5354
5429
  case 429:
5355
5430
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
5356
5431
  default:
@@ -5498,6 +5573,7 @@ var DocumentsClient = class {
5498
5573
  * @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
5499
5574
  *
5500
5575
  * @throws {@link Vectros.NotFoundError}
5576
+ * @throws {@link Vectros.ConflictError}
5501
5577
  * @throws {@link Vectros.TooManyRequestsError}
5502
5578
  *
5503
5579
  * @example
@@ -5537,6 +5613,8 @@ var DocumentsClient = class {
5537
5613
  switch (_response.error.statusCode) {
5538
5614
  case 404:
5539
5615
  throw new NotFoundError(_response.error.body, _response.rawResponse);
5616
+ case 409:
5617
+ throw new ConflictError(_response.error.body, _response.rawResponse);
5540
5618
  case 429:
5541
5619
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
5542
5620
  default:
@@ -5829,7 +5907,7 @@ var DocumentsClient = class {
5829
5907
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/documents/{id}/download");
5830
5908
  }
5831
5909
  /**
5832
- * Returns the document's full text body when it is retained: always available for text-ingested documents, and for file-uploaded documents unless they were uploaded with `storeText=false` (which discards the extracted text once indexing completes — the original file remains available via `GET /{id}/download`). Returns 404 when the document does not exist, its text was not retained, or extraction has not yet completed. Requires the `documents:r` scope.
5910
+ * Returns the document's full text body when it is retained: retained for text-ingested documents, and for file-uploaded documents unless they were uploaded with `storeText=false` (which discards the extracted text once indexing completes — the original file remains available via `GET /v1/documents/{id}/download`). Returns 404 when the document does not exist, its text was not retained, or extraction has not yet completed. Requires the `documents:r` scope.
5833
5911
  *
5834
5912
  * @param {Vectros.GetDocumentTextRequest} request
5835
5913
  * @param {DocumentsClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -5949,6 +6027,7 @@ var DocumentsClient = class {
5949
6027
  *
5950
6028
  * @throws {@link Vectros.BadRequestError}
5951
6029
  * @throws {@link Vectros.ForbiddenError}
6030
+ * @throws {@link Vectros.ConflictError}
5952
6031
  * @throws {@link Vectros.TooManyRequestsError}
5953
6032
  *
5954
6033
  * @example
@@ -5998,6 +6077,8 @@ var DocumentsClient = class {
5998
6077
  throw new BadRequestError(_response.error.body, _response.rawResponse);
5999
6078
  case 403:
6000
6079
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
6080
+ case 409:
6081
+ throw new ConflictError(_response.error.body, _response.rawResponse);
6001
6082
  case 429:
6002
6083
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
6003
6084
  default:
@@ -6081,6 +6162,8 @@ var FoldersClient = class {
6081
6162
  *
6082
6163
  * @throws {@link Vectros.BadRequestError}
6083
6164
  * @throws {@link Vectros.ForbiddenError}
6165
+ * @throws {@link Vectros.NotFoundError}
6166
+ * @throws {@link Vectros.ConflictError}
6084
6167
  * @throws {@link Vectros.TooManyRequestsError}
6085
6168
  *
6086
6169
  * @example
@@ -6130,6 +6213,10 @@ var FoldersClient = class {
6130
6213
  throw new BadRequestError(_response.error.body, _response.rawResponse);
6131
6214
  case 403:
6132
6215
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
6216
+ case 404:
6217
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
6218
+ case 409:
6219
+ throw new ConflictError(_response.error.body, _response.rawResponse);
6133
6220
  case 429:
6134
6221
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
6135
6222
  default:
@@ -6205,6 +6292,7 @@ var FoldersClient = class {
6205
6292
  *
6206
6293
  * @throws {@link Vectros.ForbiddenError}
6207
6294
  * @throws {@link Vectros.NotFoundError}
6295
+ * @throws {@link Vectros.ConflictError}
6208
6296
  * @throws {@link Vectros.TooManyRequestsError}
6209
6297
  *
6210
6298
  * @example
@@ -6252,6 +6340,8 @@ var FoldersClient = class {
6252
6340
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
6253
6341
  case 404:
6254
6342
  throw new NotFoundError(_response.error.body, _response.rawResponse);
6343
+ case 409:
6344
+ throw new ConflictError(_response.error.body, _response.rawResponse);
6255
6345
  case 429:
6256
6346
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
6257
6347
  default:
@@ -6272,6 +6362,7 @@ var FoldersClient = class {
6272
6362
  *
6273
6363
  * @throws {@link Vectros.BadRequestError}
6274
6364
  * @throws {@link Vectros.NotFoundError}
6365
+ * @throws {@link Vectros.ConflictError}
6275
6366
  * @throws {@link Vectros.TooManyRequestsError}
6276
6367
  *
6277
6368
  * @example
@@ -6313,6 +6404,8 @@ var FoldersClient = class {
6313
6404
  throw new BadRequestError(_response.error.body, _response.rawResponse);
6314
6405
  case 404:
6315
6406
  throw new NotFoundError(_response.error.body, _response.rawResponse);
6407
+ case 409:
6408
+ throw new ConflictError(_response.error.body, _response.rawResponse);
6316
6409
  case 429:
6317
6410
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
6318
6411
  default:
@@ -6326,7 +6419,7 @@ var FoldersClient = class {
6326
6419
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/v1/folders/{id}");
6327
6420
  }
6328
6421
  /**
6329
- * Partially updates a folder using an RFC 7386 JSON Merge Patch. The `name`, `description`, and ownership fields (`userId`, `scopes`) are applied when present and left unchanged when omitted; sending any of these as null is rejected, because clearing a field is not supported in this release (omit it instead). `slug` and `parentFolderId` are immutable — a folder cannot be re-slugged or moved via the API — and the request is rejected if either is present. Pass `expectedVersion` for optimistic concurrency (you get a 409 if the folder changed since you last read it). Requires the `folders:u` scope.
6422
+ * Partially updates a folder using an RFC 7386 JSON Merge Patch. The `name`, `description`, and ownership fields (`userId`, `scopes`) are applied when present and left unchanged when omitted; sending any of these as null is rejected, because clearing a field is not supported (omit it instead). `slug` and `parentFolderId` are immutable — a folder cannot be re-slugged or moved via the API — and the request is rejected if either is present. Pass `expectedVersion` for optimistic concurrency (you get a 409 if the folder changed since you last read it). Requires the `folders:u` scope.
6330
6423
  *
6331
6424
  * @param {Vectros.PatchFolderRequest} request
6332
6425
  * @param {FoldersClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -6549,6 +6642,8 @@ var IdentityClient = class {
6549
6642
  *
6550
6643
  * @throws {@link Vectros.BadRequestError}
6551
6644
  * @throws {@link Vectros.ForbiddenError}
6645
+ * @throws {@link Vectros.NotFoundError}
6646
+ * @throws {@link Vectros.ConflictError}
6552
6647
  * @throws {@link Vectros.TooManyRequestsError}
6553
6648
  *
6554
6649
  * @example
@@ -6601,6 +6696,10 @@ var IdentityClient = class {
6601
6696
  throw new BadRequestError(_response.error.body, _response.rawResponse);
6602
6697
  case 403:
6603
6698
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
6699
+ case 404:
6700
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
6701
+ case 409:
6702
+ throw new ConflictError(_response.error.body, _response.rawResponse);
6604
6703
  case 429:
6605
6704
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
6606
6705
  default:
@@ -6681,6 +6780,7 @@ var IdentityClient = class {
6681
6780
  *
6682
6781
  * @throws {@link Vectros.BadRequestError}
6683
6782
  * @throws {@link Vectros.NotFoundError}
6783
+ * @throws {@link Vectros.ConflictError}
6684
6784
  * @throws {@link Vectros.TooManyRequestsError}
6685
6785
  *
6686
6786
  * @example
@@ -6733,6 +6833,8 @@ var IdentityClient = class {
6733
6833
  throw new BadRequestError(_response.error.body, _response.rawResponse);
6734
6834
  case 404:
6735
6835
  throw new NotFoundError(_response.error.body, _response.rawResponse);
6836
+ case 409:
6837
+ throw new ConflictError(_response.error.body, _response.rawResponse);
6736
6838
  case 429:
6737
6839
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
6738
6840
  default:
@@ -6752,6 +6854,7 @@ var IdentityClient = class {
6752
6854
  * @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration.
6753
6855
  *
6754
6856
  * @throws {@link Vectros.NotFoundError}
6857
+ * @throws {@link Vectros.ConflictError}
6755
6858
  * @throws {@link Vectros.TooManyRequestsError}
6756
6859
  *
6757
6860
  * @example
@@ -6796,6 +6899,8 @@ var IdentityClient = class {
6796
6899
  switch (_response.error.statusCode) {
6797
6900
  case 404:
6798
6901
  throw new NotFoundError(_response.error.body, _response.rawResponse);
6902
+ case 409:
6903
+ throw new ConflictError(_response.error.body, _response.rawResponse);
6799
6904
  case 429:
6800
6905
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
6801
6906
  default:
@@ -7019,6 +7124,7 @@ var IdentityClient = class {
7019
7124
  *
7020
7125
  * @throws {@link Vectros.ForbiddenError}
7021
7126
  * @throws {@link Vectros.NotFoundError}
7127
+ * @throws {@link Vectros.ConflictError}
7022
7128
  * @throws {@link Vectros.TooManyRequestsError}
7023
7129
  *
7024
7130
  * @example
@@ -7070,6 +7176,8 @@ var IdentityClient = class {
7070
7176
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
7071
7177
  case 404:
7072
7178
  throw new NotFoundError(_response.error.body, _response.rawResponse);
7179
+ case 409:
7180
+ throw new ConflictError(_response.error.body, _response.rawResponse);
7073
7181
  case 429:
7074
7182
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
7075
7183
  default:
@@ -7090,6 +7198,7 @@ var IdentityClient = class {
7090
7198
  *
7091
7199
  * @throws {@link Vectros.ForbiddenError}
7092
7200
  * @throws {@link Vectros.NotFoundError}
7201
+ * @throws {@link Vectros.ConflictError}
7093
7202
  * @throws {@link Vectros.TooManyRequestsError}
7094
7203
  *
7095
7204
  * @example
@@ -7134,6 +7243,8 @@ var IdentityClient = class {
7134
7243
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
7135
7244
  case 404:
7136
7245
  throw new NotFoundError(_response.error.body, _response.rawResponse);
7246
+ case 409:
7247
+ throw new ConflictError(_response.error.body, _response.rawResponse);
7137
7248
  case 429:
7138
7249
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
7139
7250
  default:
@@ -7198,7 +7309,7 @@ var IdentityClient = class {
7198
7309
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/namespaces");
7199
7310
  }
7200
7311
  /**
7201
- * Registers a new scope namespace and declares whether its values resolve to identity entities (`entityBacked`). Also requires `specificityRank`, an explicit, account-unique position in the specificity order used to break recordType schema-resolution ties. Requires a root API key or one of the CLI bootstrap's two provisioning capabilities — never an ordinary partner-grantable scope. A bootstrap credential's registration is confined to its own app context UNLESS it additionally holds the tenant-wide namespace-provisioning capability and `contextId` is omitted, in which case it may register a TENANT-WIDE namespace (visible to every context). `org` and `client` are reserved names, registered the same way as any other namespace.
7312
+ * Registers a new scope namespace and declares whether its values resolve to identity entities (`entityBacked`). Also requires `specificityRank`, an explicit, account-unique position in the specificity order used to break recordType schema-resolution ties. Requires a root API key or one of the CLI bootstrap's two provisioning capabilities — never an ordinary grantable scope. A bootstrap credential's registration is confined to its own app context UNLESS it additionally holds the tenant-wide namespace-provisioning capability and `contextId` is omitted, in which case it may register a TENANT-WIDE namespace (visible to every context). `org` and `client` are reserved names, registered the same way as any other namespace.
7202
7313
  *
7203
7314
  * @param {Vectros.RegisterNamespaceRequest} request
7204
7315
  * @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -7340,6 +7451,7 @@ var IdentityClient = class {
7340
7451
  *
7341
7452
  * @throws {@link Vectros.BadRequestError}
7342
7453
  * @throws {@link Vectros.ForbiddenError}
7454
+ * @throws {@link Vectros.ConflictError}
7343
7455
  * @throws {@link Vectros.TooManyRequestsError}
7344
7456
  *
7345
7457
  * @example
@@ -7389,6 +7501,8 @@ var IdentityClient = class {
7389
7501
  throw new BadRequestError(_response.error.body, _response.rawResponse);
7390
7502
  case 403:
7391
7503
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
7504
+ case 409:
7505
+ throw new ConflictError(_response.error.body, _response.rawResponse);
7392
7506
  case 429:
7393
7507
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
7394
7508
  default:
@@ -7457,13 +7571,14 @@ var IdentityClient = class {
7457
7571
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/users/{id}");
7458
7572
  }
7459
7573
  /**
7460
- * Updates mutable fields on an existing user (such as email, status, payload, or schema binding). The `type` field is immutable after creation, and `email` cannot be changed while an invitation to that user is still outstanding — revoke the invitation, or invite the new address instead. This endpoint also activates an invited user: a PUT that moves a PENDING user to ACTIVE and carries `inviteToken`, `externalSubject`, and `emailVerifiedAttestation=true` completes the invitation. **`externalSubject` set this way is NOT an authentication binding and does not enable sign-in anywhere** — not the Vectros DevPortal/Admin App/web apps, and not `/v1/auth/token/exchange` either; both are granted only by the invitee authenticating themselves. If the invitee needs dev-portal/web-app access, send them the invitation link and let them accept it directly. If the invitee needs to sign in via token exchange, have them redeem `inviteToken` themselves at `/v1/auth/token/exchange` with their own credential — Vectros verifies it there and computes its own value for this field from the verified credential. The value you send here is stored exactly as-is, with no normalization, and does NOT automatically match or deduplicate against what a later token-exchange sign-in computes for the same real-world identity. Call this endpoint directly only if you run your own backend and want Vectros to record which of your own users a given account corresponds to — treat this field as informational for that purpose, not as a way to pre-authorize sign-in. Requires the `users:u` scope.
7574
+ * Updates mutable fields on an existing user (such as email, status, payload, or schema binding). The `type` field is immutable after creation, and `email` cannot be changed while an invitation to that user is still outstanding — revoke the invitation, or invite the new address instead. This endpoint also activates an invited user: a PUT that moves a PENDING user to ACTIVE and carries `inviteToken`, `externalSubject`, and `emailVerifiedAttestation=true` completes the invitation. **`externalSubject` set this way is NOT an authentication binding and does not enable sign-in anywhere** — not the Vectros DevPortal/Admin App/web apps, and not `/v1/auth/token/exchange` either; both are granted only by the invitee authenticating themselves. A subject stored through `PUT /v1/users/{id}` does not make the person a member of your account: it is ignored for the tenant claims in sign-in tokens, the developer portal's memberships list and tenant switching, and an ownership transfer. To give such a person access, delete the user and invite them again; accepting the invitation binds the subject and counts it. If the invitee needs dev-portal/web-app access, send them the invitation link and let them accept it directly. If the invitee needs to sign in via token exchange, have them redeem `inviteToken` themselves at `/v1/auth/token/exchange` with their own credential — Vectros verifies it there and computes its own value for this field from the verified credential. The value you send here is stored exactly as-is, with no normalization, and does NOT automatically match or deduplicate against what a later token-exchange sign-in computes for the same real-world identity. Call this endpoint directly only if you run your own backend and want Vectros to record which of your own users a given account corresponds to — treat this field as informational for that purpose, not as a way to pre-authorize sign-in. Requires the `users:u` scope.
7461
7575
  *
7462
7576
  * @param {Vectros.UpdateUserRequest} request
7463
7577
  * @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration.
7464
7578
  *
7465
7579
  * @throws {@link Vectros.BadRequestError}
7466
7580
  * @throws {@link Vectros.NotFoundError}
7581
+ * @throws {@link Vectros.ConflictError}
7467
7582
  * @throws {@link Vectros.TooManyRequestsError}
7468
7583
  *
7469
7584
  * @example
@@ -7511,6 +7626,8 @@ var IdentityClient = class {
7511
7626
  throw new BadRequestError(_response.error.body, _response.rawResponse);
7512
7627
  case 404:
7513
7628
  throw new NotFoundError(_response.error.body, _response.rawResponse);
7629
+ case 409:
7630
+ throw new ConflictError(_response.error.body, _response.rawResponse);
7514
7631
  case 429:
7515
7632
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
7516
7633
  default:
@@ -7772,7 +7889,7 @@ var InferenceClient = class {
7772
7889
  this._options = normalizeClientOptionsWithAuth(options);
7773
7890
  }
7774
7891
  /**
7775
- * Returns every inference model available to you, including each model's context window, the plan tiers it's available on, and the exact credit rates charged per 1K input and output tokens. Use this to populate model pickers and to validate a request before calling `/v1/chat`, `/v1/rag`, or `/v1/documents/{id}/ask`.
7892
+ * Returns the whole platform model catalog, whatever your plan: `availableOn` names each model's plan tiers. Each entry also carries the context window and the credit rates per 1K input and output tokens: `regionPricing.base` for global-region requests, `regionPricing.us` for default requests, and `longContext` for prompts over its threshold. A model reached through a `providerAlias` is not listed. Use this to populate model pickers and to validate a request before calling `/v1/chat`, `/v1/rag`, or `/v1/documents/{id}/ask`.
7776
7893
  *
7777
7894
  * @param {InferenceClient.RequestOptions} requestOptions - Request-specific configuration.
7778
7895
  *
@@ -7816,7 +7933,7 @@ var InferenceClient = class {
7816
7933
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/v1/models");
7817
7934
  }
7818
7935
  /**
7819
- * Streams a model response as Server-Sent Events (SSE). Send the full conversation history in the `messages` array; a message with role `system` is extracted and used as the system prompt. Token cost is debited from your pre-paid inference balance (in cents), and a small per-call flat fee is debited from your monthly platform credit allowance. Requires the `inference:r` scope.
7936
+ * Streams a model response as Server-Sent Events (SSE). Send the full conversation history in the `messages` array; a message with role `system` is extracted and used as the system prompt. On a pre-paid account, token cost is debited from your inference balance; usage-billed accounts accrue it for post-billing. A request routed through your own `providerAlias` incurs no Vectros token cost. A small per-call flat fee is charged to your monthly credit allowance, except when the call fails on the server side. Requires the `inference:r` scope.
7820
7937
  */
7821
7938
  chatInference(request, requestOptions) {
7822
7939
  return HttpResponsePromise.fromPromise(this.__chatInference(request, requestOptions));
@@ -7869,8 +7986,14 @@ var InferenceClient = class {
7869
7986
  throw new PaymentRequiredError(_response.error.body, _response.rawResponse);
7870
7987
  case 403:
7871
7988
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
7989
+ case 404:
7990
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
7991
+ case 413:
7992
+ throw new ContentTooLargeError(_response.error.body, _response.rawResponse);
7872
7993
  case 429:
7873
7994
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
7995
+ case 503:
7996
+ throw new ServiceUnavailableError(_response.error.body, _response.rawResponse);
7874
7997
  default:
7875
7998
  throw new VectrosError({
7876
7999
  statusCode: _response.error.statusCode,
@@ -7944,6 +8067,8 @@ var InferenceClient = class {
7944
8067
  throw new ContentTooLargeError(_response.error.body, _response.rawResponse);
7945
8068
  case 429:
7946
8069
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
8070
+ case 503:
8071
+ throw new ServiceUnavailableError(_response.error.body, _response.rawResponse);
7947
8072
  default:
7948
8073
  throw new VectrosError({
7949
8074
  statusCode: _response.error.statusCode,
@@ -8008,10 +8133,16 @@ var InferenceClient = class {
8008
8133
  throw new PaymentRequiredError(_response.error.body, _response.rawResponse);
8009
8134
  case 403:
8010
8135
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
8136
+ case 404:
8137
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
8138
+ case 413:
8139
+ throw new ContentTooLargeError(_response.error.body, _response.rawResponse);
8011
8140
  case 429:
8012
8141
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
8013
8142
  case 500:
8014
8143
  throw new InternalServerError(_response.error.body, _response.rawResponse);
8144
+ case 503:
8145
+ throw new ServiceUnavailableError(_response.error.body, _response.rawResponse);
8015
8146
  default:
8016
8147
  throw new VectrosError({
8017
8148
  statusCode: _response.error.statusCode,
@@ -8089,7 +8220,7 @@ var RecordsClient = class {
8089
8220
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/v1/records/batch-get");
8090
8221
  }
8091
8222
  /**
8092
- * Reserved endpoint for batch lookup and reference resolution. The published response shape correlates results to each input and carries a per-item status envelope. It currently returns 501 (not implemented). The documented 200 response schema is the stable shape this endpoint will use once available. Requires the `records:r` scope.
8223
+ * Reserved endpoint for batch lookup and reference resolution. With the `records:r` scope it answers 501 (not implemented). The published response shape correlates results to each input and carries a per-item status envelope. Requires the `records:r` scope.
8093
8224
  *
8094
8225
  * @param {Vectros.BatchLookupRequest} request
8095
8226
  * @param {RecordsClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -8150,7 +8281,7 @@ var RecordsClient = class {
8150
8281
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/v1/records/lookup/batch");
8151
8282
  }
8152
8283
  /**
8153
- * Writes up to 50 records (or 50 with `atomicity: all_or_nothing`) in a single request. Each item in `items` has exactly the same shape, and goes through exactly the same validation, authorization and idempotency rules, as the body of a single `POST /v1/records` — including schema validation, `externalId` idempotency, unique-field enforcement, and the `records:c:<type>` scope check, which is applied per item against that item's own record type. A batch is not a way to write a type your credential could not write one at a time.
8284
+ * Writes up to 50 records per request in `best_effort` mode and up to 50 with `atomicity: all_or_nothing`, in a single request. Each item in `items` has exactly the same shape, and goes through exactly the same validation, authorization and idempotency rules, as the body of a single `POST /v1/records` — including schema validation, `externalId` idempotency, unique-field enforcement, and the `records:c:<type>` scope check, which is applied per item against that item's own record type. A batch is not a way to write a type your credential could not write one at a time.
8154
8285
  *
8155
8286
  * `atomicity` selects how the batch commits. `best_effort` (the default) writes each item independently: some can succeed while others fail, and each item's own outcome is reported. `all_or_nothing` commits every item in one transaction — if any item fails, no record is created or updated at all, and every item that was itself fine reports `not_committed` while the ones that failed report why. Because the transaction is bounded by the number of underlying storage rows rather than by the number of records, a large `all_or_nothing` batch can be refused as too large to commit atomically even when it is within the item limit; the error says so, and nothing is written when it happens.
8156
8287
  *
@@ -8289,6 +8420,8 @@ var RecordsClient = class {
8289
8420
  *
8290
8421
  * @throws {@link Vectros.BadRequestError}
8291
8422
  * @throws {@link Vectros.ForbiddenError}
8423
+ * @throws {@link Vectros.NotFoundError}
8424
+ * @throws {@link Vectros.ConflictError}
8292
8425
  * @throws {@link Vectros.TooManyRequestsError}
8293
8426
  *
8294
8427
  * @example
@@ -8345,6 +8478,10 @@ var RecordsClient = class {
8345
8478
  throw new BadRequestError(_response.error.body, _response.rawResponse);
8346
8479
  case 403:
8347
8480
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
8481
+ case 404:
8482
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
8483
+ case 409:
8484
+ throw new ConflictError(_response.error.body, _response.rawResponse);
8348
8485
  case 429:
8349
8486
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
8350
8487
  default:
@@ -8493,6 +8630,7 @@ var RecordsClient = class {
8493
8630
  * @param {RecordsClient.RequestOptions} requestOptions - Request-specific configuration.
8494
8631
  *
8495
8632
  * @throws {@link Vectros.NotFoundError}
8633
+ * @throws {@link Vectros.ConflictError}
8496
8634
  * @throws {@link Vectros.TooManyRequestsError}
8497
8635
  *
8498
8636
  * @example
@@ -8532,6 +8670,8 @@ var RecordsClient = class {
8532
8670
  switch (_response.error.statusCode) {
8533
8671
  case 404:
8534
8672
  throw new NotFoundError(_response.error.body, _response.rawResponse);
8673
+ case 409:
8674
+ throw new ConflictError(_response.error.body, _response.rawResponse);
8535
8675
  case 429:
8536
8676
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
8537
8677
  default:
@@ -8545,7 +8685,7 @@ var RecordsClient = class {
8545
8685
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/v1/records/{id}");
8546
8686
  }
8547
8687
  /**
8548
- * Partially updates a record using an RFC 7386 JSON Merge Patch. The `payload` object is deep-merged into the existing payload: keys you send overwrite (recursing into nested objects), a key set to null is deleted, and keys you omit are left unchanged — so you can change a single field without re-sending the rest (unlike the full-replacement PUT). Top-level fields (`status`, `folderId`, `userId`, `scopes`) are set when present and left unchanged when omitted; sending a top-level field as null is rejected (clearing a top-level field is not supported in this release — omit it instead). `typeName`, `schemaId`, `externalId`, and `indexMode` are immutable and rejected if present. The merged result is validated against the schema. Pass `expectedVersion` to make the patch conditional (optimistic concurrency, 409 on conflict). Requires the `records:u:<type>` scope.
8688
+ * Partially updates a record using an RFC 7386 JSON Merge Patch. The `payload` object is deep-merged into the existing payload: keys you send overwrite (recursing into nested objects), a key set to null is deleted, and keys you omit are left unchanged — so you can change a single field without re-sending the rest (unlike the full-replacement PUT). Top-level fields (`status`, `folderId`, `userId`, `scopes`) are set when present and left unchanged when omitted; sending a top-level field as null is rejected (clearing a top-level field is not supported — omit it instead). `typeName`, `schemaId`, `externalId`, and `indexMode` are immutable and rejected if present. The merged result is validated against the schema. Pass `expectedVersion` to make the patch conditional (optimistic concurrency, 409 on conflict). Requires the `records:u:<type>` scope.
8549
8689
  *
8550
8690
  * @param {Vectros.PatchRecordRequest} request
8551
8691
  * @param {RecordsClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -8974,6 +9114,8 @@ var SchemasClient = class {
8974
9114
  *
8975
9115
  * @throws {@link Vectros.BadRequestError}
8976
9116
  * @throws {@link Vectros.ForbiddenError}
9117
+ * @throws {@link Vectros.NotFoundError}
9118
+ * @throws {@link Vectros.ConflictError}
8977
9119
  * @throws {@link Vectros.TooManyRequestsError}
8978
9120
  *
8979
9121
  * @example
@@ -9043,6 +9185,10 @@ var SchemasClient = class {
9043
9185
  throw new BadRequestError(_response.error.body, _response.rawResponse);
9044
9186
  case 403:
9045
9187
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
9188
+ case 404:
9189
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
9190
+ case 409:
9191
+ throw new ConflictError(_response.error.body, _response.rawResponse);
9046
9192
  case 429:
9047
9193
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
9048
9194
  default:
@@ -9186,7 +9332,7 @@ var SchemasClient = class {
9186
9332
  return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/v1/schemas/{id}");
9187
9333
  }
9188
9334
  /**
9189
- * Permanently deletes a record schema. The request is refused with 409 if records of this type still exist — delete those records first, since every record must reference a live schema. The same applies to documents bound to this schema (for a schema declaring the `document` surface) — delete those documents first. A lineage base (a schema other schemas declare `basedOn`) also cannot be deleted while any such variant still exists — delete the variant schema(s) first. It is likewise refused while any trigger rule fires off this schema — delete those trigger rules first. Requires the `schemas:d` scope.
9335
+ * Permanently deletes a record schema. The request is refused with 409 if records of this type still exist — delete those records first, since every record must reference a live schema. The same applies to documents bound to this schema (for a schema declaring the `document` surface) — delete those documents first. A lineage base (a schema other schemas declare `basedOn`) also cannot be deleted while any such variant still exists — delete the variant schema(s) first. It is likewise refused while any trigger rule fires off this schema — delete those trigger rules first — and, for a schema declaring the `user` or `entity` surface, while any user or entity bound to it still exists. Requires the `schemas:d` scope.
9190
9336
  *
9191
9337
  * @param {Vectros.DeleteSchemaRequest} request
9192
9338
  * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration.
@@ -9313,7 +9459,7 @@ var ScriptsClient = class {
9313
9459
  this._options = normalizeClientOptionsWithAuth(options);
9314
9460
  }
9315
9461
  /**
9316
- * Runs a script you previously pushed to `POST /v1/scripts`, under your own credential, and returns what it returned. Every write the script makes is buffered and committed as ONE transaction after the script finishes: either all of them land or none do, and the response is sent only after they have committed — so everything in `result` is committed state or the script's own computation over it. On any failure the body is the standard error envelope and nothing the script staged is committed: its rows are written only when the transaction commits, and a document body or a large payload is DECIDED at that point and WRITTEN to storage only after the commit, so an aborted execution leaves nothing behind. The one residual sits after a successful commit, outside this response: if storing a body fails then, the row exists and the body does not until the platform's repair lands — so a `200` guarantees the rows, and a document's text should be read before it is relied on.
9462
+ * Runs a script you previously pushed to `POST /v1/scripts`, under your own credential, and returns what it returned. Every write the script makes is buffered and committed as ONE transaction after the script finishes: either all of them land or none do, and the response is sent only after they have committed — so everything in `result` is committed state or the script's own computation over it. On any failure the body is the standard error envelope and nothing the script staged is committed: its rows are written only when the transaction commits, and a document body or a large payload is DECIDED at that point and WRITTEN to storage only after the commit, so an aborted execution leaves nothing behind. The one residual sits after a successful commit, outside this response: if storing a body fails then, the row exists and the body may not — so a `200` guarantees the rows, and a document's text should be read before it is relied on.
9317
9463
  *
9318
9464
  * **Permission.** Requires the `scripts:x` scope — the permission to *execute* — separate from the `scripts:c` permission to push scripts. Bare `scripts:x` grants every script in the context; `scripts:x:<name>` grants exactly that script name, every version of it. Execution discloses no source, so `scripts:r` is not needed. Inside the script, every read and write is enforced by your credential's data scopes exactly as the equivalent REST call would be — `scripts:x` alone can read and write nothing.
9319
9465
  *
@@ -9927,6 +10073,8 @@ var TriggersClient = class {
9927
10073
  *
9928
10074
  * @throws {@link Vectros.BadRequestError}
9929
10075
  * @throws {@link Vectros.ForbiddenError}
10076
+ * @throws {@link Vectros.NotFoundError}
10077
+ * @throws {@link Vectros.ConflictError}
9930
10078
  * @throws {@link Vectros.TooManyRequestsError}
9931
10079
  *
9932
10080
  * @example
@@ -9984,6 +10132,10 @@ var TriggersClient = class {
9984
10132
  throw new BadRequestError(_response.error.body, _response.rawResponse);
9985
10133
  case 403:
9986
10134
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
10135
+ case 404:
10136
+ throw new NotFoundError(_response.error.body, _response.rawResponse);
10137
+ case 409:
10138
+ throw new ConflictError(_response.error.body, _response.rawResponse);
9987
10139
  case 429:
9988
10140
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
9989
10141
  default:
@@ -10060,6 +10212,7 @@ var TriggersClient = class {
10060
10212
  * @throws {@link Vectros.BadRequestError}
10061
10213
  * @throws {@link Vectros.ForbiddenError}
10062
10214
  * @throws {@link Vectros.NotFoundError}
10215
+ * @throws {@link Vectros.ConflictError}
10063
10216
  * @throws {@link Vectros.TooManyRequestsError}
10064
10217
  *
10065
10218
  * @example
@@ -10117,6 +10270,8 @@ var TriggersClient = class {
10117
10270
  throw new ForbiddenError(_response.error.body, _response.rawResponse);
10118
10271
  case 404:
10119
10272
  throw new NotFoundError(_response.error.body, _response.rawResponse);
10273
+ case 409:
10274
+ throw new ConflictError(_response.error.body, _response.rawResponse);
10120
10275
  case 429:
10121
10276
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
10122
10277
  default:
@@ -10136,6 +10291,7 @@ var TriggersClient = class {
10136
10291
  * @param {TriggersClient.RequestOptions} requestOptions - Request-specific configuration.
10137
10292
  *
10138
10293
  * @throws {@link Vectros.NotFoundError}
10294
+ * @throws {@link Vectros.ConflictError}
10139
10295
  * @throws {@link Vectros.TooManyRequestsError}
10140
10296
  *
10141
10297
  * @example
@@ -10175,6 +10331,8 @@ var TriggersClient = class {
10175
10331
  switch (_response.error.statusCode) {
10176
10332
  case 404:
10177
10333
  throw new NotFoundError(_response.error.body, _response.rawResponse);
10334
+ case 409:
10335
+ throw new ConflictError(_response.error.body, _response.rawResponse);
10178
10336
  case 429:
10179
10337
  throw new TooManyRequestsError(_response.error.body, _response.rawResponse);
10180
10338
  default:
@@ -10292,7 +10450,7 @@ function warnOnSuboptimalKey(key, log) {
10292
10450
  if (key.prefix === "sk") {
10293
10451
  log.warn(
10294
10452
  { prefix: key.prefix, env: key.env },
10295
- 'wildcard-scope key (sk_*) on a desktop MCP server is overly broad. For production, prefer a scoped ssk_* key bound to a narrowed AccessProfile. See the Vectros scoped-token documentation ("Recommended AccessProfile for MCP").'
10453
+ 'wildcard-scope key (sk_*) on a desktop MCP server is overly broad. For production, prefer a scoped ssk_* key bound to a narrowed AccessProfile: `npx -y @vectros-ai/cli bootstrap` mints one, and the "Recommended credential" section of this package\'s README describes it.'
10296
10454
  );
10297
10455
  } else if (key.prefix === "st") {
10298
10456
  log.warn(
@@ -10304,8 +10462,8 @@ function warnOnSuboptimalKey(key, log) {
10304
10462
 
10305
10463
  // src/build-info.ts
10306
10464
  var BUILD_INFO = {
10307
- mcpServer: true ? "0.18.0" : "dev",
10308
- sdk: true ? "0.46.0" : "dev"
10465
+ mcpServer: true ? "0.18.2" : "dev",
10466
+ sdk: true ? "0.48.0" : "dev"
10309
10467
  };
10310
10468
 
10311
10469
  // src/log.ts
@@ -11281,7 +11439,7 @@ var inputSchema7 = {
11281
11439
  ),
11282
11440
  status: import_zod7.z.string().optional().describe("Set the record lifecycle status (e.g. ARCHIVED) \u2014 archive/workflow without physical deletion."),
11283
11441
  expectedVersion: import_zod7.z.number().int().optional().describe(
11284
- "Optimistic concurrency: the version you last read. If the record changed since, the update is refused as a conflict (re-read and retry). Omit for last-write-wins."
11442
+ "Optimistic concurrency: the version you last read. If the record changed since, the update is refused as a conflict (re-read and retry). Omit it to update whatever version is current: an update that meets another change to the same record at the same moment is still refused as a conflict."
11285
11443
  )
11286
11444
  };
11287
11445
  var recordUpdate = ({ client, log }) => ({
@@ -11351,7 +11509,7 @@ var import_zod10 = require("zod");
11351
11509
  // src/tools/provider-alias.ts
11352
11510
  var import_zod9 = require("zod");
11353
11511
  var providerAliasInput = import_zod9.z.string().min(1, "providerAlias must be non-empty when supplied").optional().describe(
11354
- "Route THIS call through your own model provider instead of the platform-hosted default, by the alias of a provider config your account has activated. It works only after your account has set up that provider and signed the platform's risk-acceptance waiver; without both, the platform refuses the call with a 403, which is returned to you as written. A call served by your own provider leaves the platform-hosted Bedrock path, and Vectros's AWS BAA boundary. Omit it (the default) to use the platform-hosted path. When set, `model` names the model on your provider's own id space, and falls back to that provider config's default model when omitted."
11512
+ "Route THIS call through your own model provider instead of the platform-hosted default, by the alias of a provider config your account has activated. It works only after your account has set up that provider and signed the platform's risk-acceptance waiver; without both, the platform refuses the call with a 403, which is returned to you as written. When the waiver is the cause, the 403 carries an `errorCode` that says which case it is: `WAIVER_NOT_SIGNED` (the waiver has not been signed), `WAIVER_TEXT_CHANGED` (it was signed, but its text changed afterwards, so the earlier signature no longer counts), or `WAIVER_REVOKED` (an owner revoked it). An account owner resolves each in the developer portal (Model Providers); retrying the call does not help. If your account has accepted the Business Associate Agreement with Vectros in the developer portal, an account owner must also have attested that provider config in the developer portal (Model Providers); until then the platform refuses the call with a 403 that says it needs a BAA-holder attestation. A call served by your own provider leaves the Vectros perimeter. Omit it (the default) to use the platform-hosted path. When set, `model` names the model on your provider's own id space, and falls back to that provider config's default model when omitted."
11355
11513
  );
11356
11514
 
11357
11515
  // src/tools/rag_ask.ts
@@ -11363,7 +11521,7 @@ var inputSchema9 = {
11363
11521
  'System prompt that overrides the default for the generation step \u2014 e.g. "answer only from the provided context, cite sources, be concise". Default: a generic answer-from-context instruction.'
11364
11522
  ),
11365
11523
  model: import_zod10.z.string().optional().describe(
11366
- "Inference model alias (e.g. claude-haiku-4-5, claude-sonnet-5, claude-opus-5-5). Default = tier-appropriate Haiku. See GET /v1/models for the catalog the calling key can reach. When `providerAlias` is set, this instead names the model on that provider's own id space."
11524
+ "Inference model alias (e.g. claude-haiku-5-5, claude-sonnet-5-5, claude-opus-5-5). Omit it to use the platform default, which GET /v1/models reports as `defaultModel`; that endpoint also lists the catalog the calling key can reach. When `providerAlias` is set, this instead names the model on that provider's own id space."
11367
11525
  ),
11368
11526
  providerAlias: providerAliasInput,
11369
11527
  search: import_zod10.z.object({
@@ -11394,13 +11552,17 @@ var inputSchema9 = {
11394
11552
  createdBefore: import_zod10.z.string().optional().describe("Same creation-time basis as createdAfter, bounding at/before this ISO 8601 UTC value."),
11395
11553
  requireComplete: import_zod10.z.boolean().optional().describe("Fail closed (503) on a degraded search backend instead of grounding on partial results. Default false.")
11396
11554
  }).optional().describe("Retrieval params + scoping. Default mode HYBRID, limit " + SEARCH_MCP_DEFAULT_LIMIT + "."),
11397
- maxTokens: import_zod10.z.number().int().min(1).optional().describe("Max output tokens."),
11398
- temperature: import_zod10.z.number().min(0).max(1).optional().describe("Sampling temperature (0.0\u20131.0). Default 0.3 \u2014 lower favors deterministic, retrieval-grounded answers.")
11555
+ maxTokens: import_zod10.z.number().int().min(1).optional().describe(
11556
+ "Max output tokens. claude-haiku-5-5, claude-sonnet-5, claude-sonnet-5-5 and claude-opus-5-5 can reason before they answer; when they do, the reasoning counts against this limit, so a small value can return little or no text. Leave headroom: 1024 or more for a short answer."
11557
+ ),
11558
+ temperature: import_zod10.z.number().min(0).max(1).optional().describe(
11559
+ "Sampling temperature (0.0\u20131.0). Default 0.3 \u2014 lower favors deterministic, retrieval-grounded answers. The platform ignores it for claude-haiku-5-5, claude-sonnet-5, claude-sonnet-5-5 and claude-opus-5-5, which sample at their own default; it applies to models that accept a temperature, such as claude-haiku-4-5."
11560
+ )
11399
11561
  };
11400
11562
  var ragAsk = ({ client, log }) => ({
11401
11563
  name: "rag_ask",
11402
11564
  title: "RAG ask (corpus-wide)",
11403
- description: "Ask a question grounded against your tenant's indexed content. Vectros performs a hybrid search, injects the top-K passages into the prompt, and streams a model answer back. Scope retrieval with `search` (ownership \u2014 `scope` for one ownership dimension or `scopeFilters` for several at once, e.g. one client within one org \u2014 folder, type, metadata filters, date window) to ground on a subset \u2014 e.g. one patient or one folder \u2014 and steer generation with `instructions` / `temperature`. The full answer is returned as a single response; progress notifications keep the call alive during the 30-45s generation window. Calls without `providerAlias` are served by platform-hosted AWS Bedrock. A call that sets `providerAlias` goes to your own model provider, outside Vectros's AWS BAA boundary.",
11565
+ description: "Ask a question grounded against your tenant's indexed content. Vectros performs a hybrid search, injects the top-K passages into the prompt, and streams a model answer back. Scope retrieval with `search` (ownership \u2014 `scope` for one ownership dimension or `scopeFilters` for several at once, e.g. one client within one org \u2014 folder, type, metadata filters, date window) to ground on a subset \u2014 e.g. one patient or one folder \u2014 and steer generation with `instructions` (and `temperature`, for the models that accept one). The full answer is returned as a single response; progress notifications keep the call alive during the 30-45s generation window. Calls without `providerAlias` are served by platform-hosted AWS Bedrock. A call that sets `providerAlias` goes to your own model provider, outside Vectros's AWS BAA boundary.",
11404
11566
  inputSchema: inputSchema9,
11405
11567
  // NOT a pure read: this call reserves an atomic hold against the caller's prepaid inference
11406
11568
  // balance before generation starts, then debits it on completion — a real financial side
@@ -11502,10 +11664,12 @@ var inputSchema10 = {
11502
11664
  documentId: import_zod11.z.string().min(1, "documentId is required").describe("ID of the document to ask against."),
11503
11665
  prompt: import_zod11.z.string().min(1, "prompt is required").describe("Question to ask about the document."),
11504
11666
  model: import_zod11.z.string().optional().describe(
11505
- "Inference model alias. Default = tier-appropriate Haiku. See GET /v1/models for the catalog the calling key can reach. When `providerAlias` is set, this instead names the model on that provider's own id space."
11667
+ "Inference model alias. Omit it to use the platform default, which GET /v1/models reports as `defaultModel`; that endpoint also lists the catalog the calling key can reach. When `providerAlias` is set, this instead names the model on that provider's own id space."
11506
11668
  ),
11507
11669
  providerAlias: providerAliasInput,
11508
- maxTokens: import_zod11.z.number().int().min(1).optional().describe("Max output tokens.")
11670
+ maxTokens: import_zod11.z.number().int().min(1).optional().describe(
11671
+ "Max output tokens. claude-haiku-5-5, claude-sonnet-5, claude-sonnet-5-5 and claude-opus-5-5 can reason before they answer; when they do, the reasoning counts against this limit, so a small value can return little or no text. Leave headroom: 1024 or more for a short answer."
11672
+ )
11509
11673
  };
11510
11674
  var documentAsk = ({ client, log }) => ({
11511
11675
  name: "document_ask",
@@ -11856,7 +12020,7 @@ var inputSchema14 = {
11856
12020
  'Reassign scope ownership as `namespace:value` entries, at most 2 (e.g. ["org:<uuid>", "group:eng-team"]) \u2014 the COMPLETE new parent set. `org`/`client` are reserved namespace names, registered like any other. Omit to leave ownership unchanged; `[]` clears it (private to the owning user).'
11857
12021
  ),
11858
12022
  expectedVersion: import_zod15.z.number().int().optional().describe(
11859
- "Optimistic concurrency: the version you last read. If the document changed since, the update is refused as a conflict (re-read and retry). Omit for last-write-wins."
12023
+ "Optimistic concurrency: the version you last read. If the document changed since, the update is refused as a conflict (re-read and retry). Omit it to update whatever version is current: an update that meets another change to the same document at the same moment is still refused as a conflict."
11860
12024
  )
11861
12025
  };
11862
12026
  var documentUpdate = ({ client, log }) => ({
@@ -12010,10 +12174,8 @@ var folderCreate = ({ client, log }) => ({
12010
12174
  // freshly-proved-free value, so the idempotency check running after that derivation can never
12011
12175
  // match on the default path. `slug` is optional, so this is annotated for the less-safe default —
12012
12176
  // the same standard applied to record_create/document_ingest/record_batch_write's identical
12013
- // optional-dedupe-key shape. (A prior version of this annotation claimed unconditional
12014
- // idempotency, reasoning that the derived slug made this tool "genuinely structurally different"
12015
- // from the optional-externalId tools — that reasoning was wrong: the derivation is unconditional,
12016
- // but it is unconditionally NON-colliding by construction, which is the opposite property.)
12177
+ // optional-dedupe-key shape. (The slug derivation being unconditional does not make the tool
12178
+ // idempotent: it is unconditionally NON-colliding by construction, which is the opposite property.)
12017
12179
  annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
12018
12180
  handler: async (args) => {
12019
12181
  try {
@@ -12048,7 +12210,7 @@ var inputSchema18 = {
12048
12210
  'Reassign scope ownership as `namespace:value` entries, at most 2 (e.g. ["org:<uuid>", "group:eng-team"]) \u2014 the COMPLETE new parent set. `org`/`client` are reserved namespace names, registered like any other. Omit to leave ownership unchanged; `[]` clears it (private to the owning user).'
12049
12211
  ),
12050
12212
  expectedVersion: import_zod19.z.number().int().optional().describe(
12051
- "Optimistic concurrency: the version you last read. If the folder changed since, the update is refused as a conflict (re-read and retry). Omit for last-write-wins."
12213
+ "Optimistic concurrency: the version you last read. If the folder changed since, the update is refused as a conflict (re-read and retry). Omit it to update whatever version is current: an update that meets another change to the same folder at the same moment is still refused as a conflict."
12052
12214
  )
12053
12215
  };
12054
12216
  var folderUpdate = ({ client, log }) => ({
@@ -12093,7 +12255,7 @@ var inputSchema19 = {
12093
12255
  var folderDelete = ({ client, log }) => ({
12094
12256
  name: "folder_delete",
12095
12257
  title: "Delete a folder",
12096
- description: 'Permanently delete a folder by id. The folder must be EMPTY first \u2014 it must contain no documents, no records, and no sub-folders \u2014 and a non-empty folder is refused, which is the most common way this call fails. Use record_query with this folderId, and document_query, to see what is in it. Clearing it differs by content type: a document can be moved out (document_update with a different folderId) or deleted. A RECORD can also be re-filed into another folder \u2014 the API supports it \u2014 but THIS SERVER does not expose that yet: record_update has no folderId argument, so from here your only option is record_delete (needs records:d). Do NOT read that as "the record cannot be moved" and delete partner data on that basis: if the record should be kept, move it with the Vectros API/SDK directly rather than deleting it here. A sub-folder cannot be re-parented at all, so nested folders have to be emptied and deleted innermost-first. Note the emptiness check counts everything in the folder, INCLUDING items your credential cannot read \u2014 so a refusal you cannot account for from what you can list is expected behaviour, not a bug, and retrying will not clear it. Requires the key to allow folders:d \u2014 a key without it gets a permission error. Protected folders (e.g. a context root) cannot be deleted at all, however empty.',
12258
+ description: 'Permanently delete a folder by id. The folder must be EMPTY first \u2014 it must contain no documents, no records, and no sub-folders \u2014 and a non-empty folder is refused, which is the most common way this call fails. Use record_query with this folderId, and document_query, to see what is in it. Clearing it differs by content type: a document can be moved out (document_update with a different folderId) or deleted. A RECORD can also be re-filed into another folder \u2014 the API supports it \u2014 but THIS SERVER does not expose that yet: record_update has no folderId argument, so from here your only option is record_delete (needs records:d). Do NOT read that as "the record cannot be moved" and delete the record on that basis: if the record should be kept, tell the user to move it with the Vectros API/SDK directly rather than deleting it here. A sub-folder cannot be re-parented at all, so nested folders have to be emptied and deleted innermost-first. Note the emptiness check counts everything in the folder, INCLUDING items your credential cannot read \u2014 so a refusal you cannot account for from what you can list is expected behaviour, not a bug, and retrying will not clear it. Requires the key to allow folders:d \u2014 a key without it gets a permission error. Protected folders (e.g. a context root) cannot be deleted at all, however empty.',
12097
12259
  inputSchema: inputSchema19,
12098
12260
  // Deletes. Idempotent in the standard REST sense: the end state ("this id no longer
12099
12261
  // resolves") is the same whether this is the first delete or a repeat of one.
@@ -12119,7 +12281,7 @@ var inputSchema20 = {
12119
12281
  var currentIdentity = ({ log, apiKey, environment }) => ({
12120
12282
  name: "current_identity",
12121
12283
  title: "Current identity (tenant + principal scope)",
12122
- description: "Describe the credential the MCP server is operating under. Returns tenantId, environment (staging|production), principalType (root_key|scoped_key|token), principalKeyId, principalLabel, and (for scoped credentials) allowedActions plus dataScope \u2014 the credential's verb+ownership reach as { userId, scopes[] }, where each scope is a `namespace:value` string (e.g. \"org:<uuid>\"). Note: this does not yet include granted_capabilities (member-lifecycle / forensic-read / context-directory-read / delegate-mint, as of API 0.40.0, joined by delegate-principal-stamp in 0.42.0) \u2014 a separate reach dimension a scope clause can carry that /v1/ping does not report yet, so allowedActions+dataScope may understate a credential's true reach. Also reports mcpServerVersion (this server's own package version) and sdkVersion (the bundled @vectros-ai/sdk version) so a caller can tell what build it's talking to. Use this when the user asks 'what can you do here?', 'what tenant am I in?', or 'what version is this?'. Calls GET /v1/ping under the hood.",
12284
+ description: "Describe the credential the MCP server is operating under. Returns tenantId, environment (staging|production), principalType (root_key|scoped_key|token), principalKeyId, principalLabel, and (for scoped credentials) allowedActions plus dataScope \u2014 the credential's verb+ownership reach as { userId, scopes[] }, where each scope is a `namespace:value` string (e.g. \"org:<uuid>\"). Note: this does not include granted_capabilities (member-lifecycle / forensic-read / context-directory-read / delegate-mint, as of API 0.40.0, joined by delegate-principal-stamp in 0.42.0 and trigger-control-plane-grant in 0.44.0) \u2014 a separate reach dimension a scope clause can carry that /v1/ping does not report, so allowedActions+dataScope may understate a credential's true reach. Also reports mcpServerVersion (this server's own package version) and sdkVersion (the bundled @vectros-ai/sdk version) so a caller can tell what build it's talking to. Use this when the user asks 'what can you do here?', 'what tenant am I in?', or 'what version is this?'. Calls GET /v1/ping under the hood.",
12123
12285
  inputSchema: inputSchema20,
12124
12286
  // A pure read (/v1/ping) — never creates, modifies, or deletes anything server-side.
12125
12287
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
@@ -12643,7 +12805,7 @@ var identityResource = ({ log, apiKey, environment }) => ({
12643
12805
  name: "identity",
12644
12806
  uri: "vectros://identity",
12645
12807
  title: "Current identity (tenant + principal scope)",
12646
- description: "The tenant + principal scope the MCP server is authenticated as. Returns the same payload as the `current_identity` tool: status, tenantId, environment, principalType, principalKeyId, principalLabel, (for scoped credentials) allowedActions + dataScope ({ userId, scopes[] }). Note: this does not yet include granted_capabilities (member-lifecycle / forensic-read / context-directory-read / delegate-mint, as of API 0.40.0, joined by delegate-principal-stamp in 0.42.0) \u2014 a separate reach dimension a scope clause can carry that /v1/ping does not report yet, so allowedActions+dataScope may understate a credential's true reach. Also reports mcpServerVersion and sdkVersion (this build's own version and the bundled @vectros-ai/sdk version). The /v1/ping backing call ships the extended shape today; the version fields are always client-derived.",
12808
+ description: "The tenant + principal scope the MCP server is authenticated as. Returns the same payload as the `current_identity` tool: status, tenantId, environment, principalType, principalKeyId, principalLabel, (for scoped credentials) allowedActions + dataScope ({ userId, scopes[] }). Note: this does not include granted_capabilities (member-lifecycle / forensic-read / context-directory-read / delegate-mint, as of API 0.40.0, joined by delegate-principal-stamp in 0.42.0 and trigger-control-plane-grant in 0.44.0) \u2014 a separate reach dimension a scope clause can carry that /v1/ping does not report, so allowedActions+dataScope may understate a credential's true reach. Also reports mcpServerVersion and sdkVersion (this build's own version and the bundled @vectros-ai/sdk version). The /v1/ping backing call ships the extended shape today; the version fields are always client-derived.",
12647
12809
  mimeType: "application/json",
12648
12810
  read: async () => {
12649
12811
  const identity = await resolveIdentity({ log, apiKey, environment });