@managoat/fountain-sdk 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,20 @@ server releases.
11
11
 
12
12
  ---
13
13
 
14
+ ## [2.1.0] — 2026-09-13
15
+
16
+ ### Added
17
+
18
+ - Wire types for inference credential sets (ADR 0053): the four operations
19
+ under `/api/account/inference-credential-sets`, the per-set credential write
20
+ and clear, `inference_credential_id` on the conversation-create request,
21
+ `inference_credential_id` and `allowed_inference_credential_ids` on the
22
+ agent, and the owner-authenticated principal credential write under
23
+ `/api/claimable-users/:id/inference-credentials/:provider`.
24
+
25
+ Generated types only. No hand-written client method changes, so nothing an
26
+ existing caller uses moves.
27
+
14
28
  ## [2.0.0] - 2026-09-13
15
29
 
16
30
  ### Breaking changes
@@ -124,6 +124,75 @@ export interface paths {
124
124
  patch?: never;
125
125
  trace?: never;
126
126
  };
127
+ "/api/account/inference-credential-sets": {
128
+ parameters: {
129
+ query?: never;
130
+ header?: never;
131
+ path?: never;
132
+ cookie?: never;
133
+ };
134
+ /**
135
+ * List inference credential sets
136
+ * @description The default set first, then by name. Values are never returned.
137
+ */
138
+ get: operations["FountainWeb.InferenceCredentialSetController.index"];
139
+ put?: never;
140
+ /**
141
+ * Create an inference credential set
142
+ * @description Creates an empty set. The first set an account has is its default, whoever asked for it; every later one is not until it is promoted.
143
+ */
144
+ post: operations["FountainWeb.InferenceCredentialSetController.create"];
145
+ delete?: never;
146
+ options?: never;
147
+ head?: never;
148
+ patch?: never;
149
+ trace?: never;
150
+ };
151
+ "/api/account/inference-credential-sets/{id}": {
152
+ parameters: {
153
+ query?: never;
154
+ header?: never;
155
+ path?: never;
156
+ cookie?: never;
157
+ };
158
+ get?: never;
159
+ put?: never;
160
+ post?: never;
161
+ /**
162
+ * Delete an inference credential set
163
+ * @description Refused for the default set: something has to answer which credential runs this account. Promote another first. Deleting a set removes its credentials; conversations bound to that source refuse to resume with inference_source_changed.
164
+ */
165
+ delete: operations["FountainWeb.InferenceCredentialSetController.delete"];
166
+ options?: never;
167
+ head?: never;
168
+ /**
169
+ * Rename an inference credential set, or make it the default
170
+ * @description Omitting a field leaves it alone. `is_default: false` is refused: a set stops being the default when another becomes it, never on its own, because an account with no default has nothing to read a credential from.
171
+ */
172
+ patch: operations["FountainWeb.InferenceCredentialSetController.update"];
173
+ trace?: never;
174
+ };
175
+ "/api/account/inference-credential-sets/{id}/credentials/{provider}": {
176
+ parameters: {
177
+ query?: never;
178
+ header?: never;
179
+ path?: never;
180
+ cookie?: never;
181
+ };
182
+ get?: never;
183
+ /**
184
+ * Set a provider credential inside a named set
185
+ * @description The same validate-then-store path as PUT /inference-credentials/:provider, against a set the caller names instead of the account's default (ADR 0053 decision 1). This is what puts a second subscription's key somewhere an agent can point at.
186
+ */
187
+ put: operations["FountainWeb.InferenceCredentialController.update_in_set"];
188
+ post?: never;
189
+ /** Clear a provider credential inside a named set */
190
+ delete: operations["FountainWeb.InferenceCredentialController.delete_in_set"];
191
+ options?: never;
192
+ head?: never;
193
+ patch?: never;
194
+ trace?: never;
195
+ };
127
196
  "/api/account/inference-credentials": {
128
197
  parameters: {
129
198
  query?: never;
@@ -1015,6 +1084,27 @@ export interface paths {
1015
1084
  patch?: never;
1016
1085
  trace?: never;
1017
1086
  };
1087
+ "/api/claimable-users/{id}/inference-credentials/{provider}": {
1088
+ parameters: {
1089
+ query?: never;
1090
+ header?: never;
1091
+ path?: never;
1092
+ cookie?: never;
1093
+ };
1094
+ get?: never;
1095
+ /**
1096
+ * Set a provider credential on a principal
1097
+ * @description Stores the credential encrypted under the principal's own tenant key. A principal is a first-class tenant and a `principal`-scoped key cannot write account state. Only the current owner may write: the opening application before claim, and the claiming account afterward. Expired and released grants refuse writes. The principal's own credential gains nothing from this route.
1098
+ */
1099
+ put: operations["FountainWeb.ClaimableUserController.put_inference_credential"];
1100
+ post?: never;
1101
+ /** Clear a provider credential on a principal */
1102
+ delete: operations["FountainWeb.ClaimableUserController.delete_inference_credential"];
1103
+ options?: never;
1104
+ head?: never;
1105
+ patch?: never;
1106
+ trace?: never;
1107
+ };
1018
1108
  "/api/connection-providers": {
1019
1109
  parameters: {
1020
1110
  query?: never;
@@ -2726,6 +2816,8 @@ export interface components {
2726
2816
  readonly acp?: boolean;
2727
2817
  /** @description Environments a conversation may launch this agent under instead of its own (environment_id on create). Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
2728
2818
  allowed_environment_ids?: string[] | null;
2819
+ /** @description Credential sets a conversation may launch this agent on instead of the agent's (inference_credential_id on create). Same shape as allowed_vault_ids: null (default) allows any set the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own set always passes. */
2820
+ allowed_inference_credential_ids?: string[] | null;
2729
2821
  /** @description Vaults a conversation may attach to this agent. null (default) allows any vault the tenant owns; an empty list forbids attaching any vault; a non-empty list is an allowlist. Vault values override the agent's environment on key collision, so this scopes who can override reviewed config. */
2730
2822
  allowed_vault_ids?: string[] | null;
2731
2823
  /**
@@ -2740,6 +2832,11 @@ export interface components {
2740
2832
  environment_id?: string | null;
2741
2833
  /** Format: uuid */
2742
2834
  id: string;
2835
+ /**
2836
+ * Format: uuid
2837
+ * @description The credential set this agent's conversations run on. null (default) is the account's default set, which is what every agent had before an account could hold more than one.
2838
+ */
2839
+ inference_credential_id?: string | null;
2743
2840
  /** Format: date-time */
2744
2841
  inserted_at?: string;
2745
2842
  mcp_servers?: {
@@ -2796,11 +2893,18 @@ export interface components {
2796
2893
  AgentRequest: {
2797
2894
  /** @description Environments a conversation may launch this agent under instead of its own. Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
2798
2895
  allowed_environment_ids?: string[] | null;
2896
+ /** @description Credential sets a conversation may launch this agent on instead of the agent's (inference_credential_id on create). Same shape as allowed_vault_ids: null (default) allows any set the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own set always passes. */
2897
+ allowed_inference_credential_ids?: string[] | null;
2799
2898
  /** @description Vaults a conversation may attach to this agent. null (default) allows any vault the tenant owns; an empty list forbids attaching any vault; a non-empty list is an allowlist. */
2800
2899
  allowed_vault_ids?: string[] | null;
2801
2900
  description?: string;
2802
2901
  /** Format: uuid */
2803
2902
  environment_id?: string | null;
2903
+ /**
2904
+ * Format: uuid
2905
+ * @description The credential set this agent's conversations run on. null (default) is the account's default set, which is what every agent had before an account could hold more than one.
2906
+ */
2907
+ inference_credential_id?: string | null;
2804
2908
  mcp_servers?: {
2805
2909
  [key: string]: unknown;
2806
2910
  };
@@ -2851,11 +2955,18 @@ export interface components {
2851
2955
  AgentUpdate: {
2852
2956
  /** @description Environments a conversation may launch this agent under instead of its own (environment_id on create). Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
2853
2957
  allowed_environment_ids?: string[] | null;
2958
+ /** @description Credential sets a conversation may launch this agent on instead of the agent's (inference_credential_id on create). Same shape as allowed_vault_ids: null (default) allows any set the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own set always passes. */
2959
+ allowed_inference_credential_ids?: string[] | null;
2854
2960
  /** @description Vaults a conversation may attach to this agent. null (default) allows any vault the tenant owns; an empty list forbids attaching any vault; a non-empty list is an allowlist. */
2855
2961
  allowed_vault_ids?: string[] | null;
2856
2962
  description?: string;
2857
2963
  /** Format: uuid */
2858
2964
  environment_id?: string | null;
2965
+ /**
2966
+ * Format: uuid
2967
+ * @description The credential set this agent's conversations run on. null (default) is the account's default set, which is what every agent had before an account could hold more than one.
2968
+ */
2969
+ inference_credential_id?: string | null;
2859
2970
  mcp_servers?: {
2860
2971
  [key: string]: unknown;
2861
2972
  };
@@ -3736,6 +3847,11 @@ export interface components {
3736
3847
  fresh?: boolean | null;
3737
3848
  /** @description Optional images to attach to the initial prompt. They require that prompt: images with no opening text are refused with 422 invalid_prompt, and an image whose media_type is unsupported or whose decoded bytes are empty or over the 10MB ceiling is refused with 422 invalid_images. Both refusals happen before a sandbox is reserved. */
3738
3849
  images?: components["schemas"]["ImageInput"][] | null;
3850
+ /**
3851
+ * Format: uuid
3852
+ * @description Optional credential set to run on instead of the agent's; the conversation stays pinned to it across wakes. Must be owned by the caller (404 inference_credential_not_found otherwise) and satisfy the agent's allowed_inference_credential_ids when that allowlist is set (422 inference_credential_not_allowed). An unusable selected set is 422 inference_credential_unusable. The resolved source and revision stay bound across wakes; replacing or deleting the source returns 409 inference_source_changed. Not part of sandbox identity, but a shared Codex sandbox requires the same resolved source and revision (409 codex_inference_conflict otherwise).
3853
+ */
3854
+ inference_credential_id?: string | null;
3739
3855
  /** @description Key/value strings to stamp on the conversation. At most 32 entries; a key is at most 64 bytes and a value at most 256 bytes, and a 422 names the offending key under `errors.labels`. With channel_id, a resume merges these into the conversation it hands back rather than dropping them. */
3740
3856
  labels?: {
3741
3857
  [key: string]: string;
@@ -3833,6 +3949,14 @@ export interface components {
3833
3949
  ConversationTreeResponse: {
3834
3950
  data: components["schemas"]["ConversationTreeNode"][];
3835
3951
  };
3952
+ /** CredentialSetDeletionError */
3953
+ CredentialSetDeletionError: {
3954
+ /** @enum {string} */
3955
+ error: "credential_set_is_default";
3956
+ message: string;
3957
+ /** @enum {string} */
3958
+ reason: "is_default";
3959
+ };
3836
3960
  /**
3837
3961
  * CreditsCheckoutRequest
3838
3962
  * @example {
@@ -3928,8 +4052,6 @@ export interface components {
3928
4052
  Environment: {
3929
4053
  /** @description Agents referencing this environment — 0 means safe to delete. */
3930
4054
  agent_count?: number;
3931
- /** @description Environments a conversation may launch this agent under instead of its own (environment_id on create). Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
3932
- allowed_environment_ids?: string[] | null;
3933
4055
  env_vars?: {
3934
4056
  [key: string]: string;
3935
4057
  };
@@ -4091,6 +4213,44 @@ export interface components {
4091
4213
  InferenceCredentialResponse: {
4092
4214
  data: components["schemas"]["InferenceCredentialStatus"];
4093
4215
  };
4216
+ /**
4217
+ * InferenceCredentialSet
4218
+ * @description One named set of a tenant's inference credentials. An account holds one or more and exactly one is the default; an agent or a launch may name another. Values are never returned — `providers` reports only which of them this set holds.
4219
+ */
4220
+ InferenceCredentialSet: {
4221
+ /** Format: uuid */
4222
+ id: string;
4223
+ /** Format: date-time */
4224
+ inserted_at: string;
4225
+ /** @description The set every surface reads unless something names another. Exactly one per account, and it cannot be deleted. */
4226
+ is_default: boolean;
4227
+ name: string;
4228
+ /** @description The credentials this set holds, by name. Never the values. */
4229
+ providers: ("anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key")[];
4230
+ /** Format: date-time */
4231
+ updated_at: string;
4232
+ };
4233
+ /** InferenceCredentialSetCreateRequest */
4234
+ InferenceCredentialSetCreateRequest: {
4235
+ /** @description Unique within the account. */
4236
+ name: string;
4237
+ };
4238
+ /** InferenceCredentialSetListResponse */
4239
+ InferenceCredentialSetListResponse: {
4240
+ data: components["schemas"]["InferenceCredentialSet"][];
4241
+ };
4242
+ /** InferenceCredentialSetResponse */
4243
+ InferenceCredentialSetResponse: {
4244
+ data: components["schemas"]["InferenceCredentialSet"];
4245
+ };
4246
+ /**
4247
+ * InferenceCredentialSetUpdateRequest
4248
+ * @description Rename a set, make it the default, or both. Omitting a field leaves it alone. `is_default: false` is refused: a set stops being the default when another becomes it, never on its own.
4249
+ */
4250
+ InferenceCredentialSetUpdateRequest: {
4251
+ is_default?: boolean;
4252
+ name?: string;
4253
+ };
4094
4254
  /**
4095
4255
  * InferenceCredentialStatus
4096
4256
  * @description Whether a provider credential is set for the tenant. Values are write-only — the API never returns a credential, truncated or otherwise.
@@ -5879,7 +6039,7 @@ export interface operations {
5879
6039
  };
5880
6040
  };
5881
6041
  };
5882
- "FountainWeb.InferenceCredentialController.index": {
6042
+ "FountainWeb.InferenceCredentialSetController.index": {
5883
6043
  parameters: {
5884
6044
  query?: never;
5885
6045
  header?: never;
@@ -5888,13 +6048,13 @@ export interface operations {
5888
6048
  };
5889
6049
  requestBody?: never;
5890
6050
  responses: {
5891
- /** @description Provider status */
6051
+ /** @description Credential sets */
5892
6052
  200: {
5893
6053
  headers: {
5894
6054
  [name: string]: unknown;
5895
6055
  };
5896
6056
  content: {
5897
- "application/json": components["schemas"]["InferenceCredentialListResponse"];
6057
+ "application/json": components["schemas"]["InferenceCredentialSetListResponse"];
5898
6058
  };
5899
6059
  };
5900
6060
  /** @description Unauthorized */
@@ -5935,29 +6095,27 @@ export interface operations {
5935
6095
  };
5936
6096
  };
5937
6097
  };
5938
- "FountainWeb.InferenceCredentialController.update": {
6098
+ "FountainWeb.InferenceCredentialSetController.create": {
5939
6099
  parameters: {
5940
6100
  query?: never;
5941
6101
  header?: never;
5942
- path: {
5943
- provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
5944
- };
6102
+ path?: never;
5945
6103
  cookie?: never;
5946
6104
  };
5947
- /** @description Credential */
6105
+ /** @description Credential set */
5948
6106
  requestBody?: {
5949
6107
  content: {
5950
- "application/json": components["schemas"]["InferenceCredentialRequest"];
6108
+ "application/json": components["schemas"]["InferenceCredentialSetCreateRequest"];
5951
6109
  };
5952
6110
  };
5953
6111
  responses: {
5954
- /** @description Provider status */
5955
- 200: {
6112
+ /** @description Credential set */
6113
+ 201: {
5956
6114
  headers: {
5957
6115
  [name: string]: unknown;
5958
6116
  };
5959
6117
  content: {
5960
- "application/json": components["schemas"]["InferenceCredentialResponse"];
6118
+ "application/json": components["schemas"]["InferenceCredentialSetResponse"];
5961
6119
  };
5962
6120
  };
5963
6121
  /** @description Unauthorized */
@@ -5987,7 +6145,7 @@ export interface operations {
5987
6145
  "application/json": components["schemas"]["NegotiationError"];
5988
6146
  };
5989
6147
  };
5990
- /** @description Rejected credential, blank value, or unknown provider */
6148
+ /** @description Invalid or duplicate name */
5991
6149
  422: {
5992
6150
  headers: {
5993
6151
  [name: string]: unknown;
@@ -6005,38 +6163,20 @@ export interface operations {
6005
6163
  "application/json": components["schemas"]["Error"];
6006
6164
  };
6007
6165
  };
6008
- /** @description Provider unreachable */
6009
- 502: {
6010
- headers: {
6011
- [name: string]: unknown;
6012
- };
6013
- content: {
6014
- "application/json": components["schemas"]["Error"];
6015
- };
6016
- };
6017
- /** @description Provider timed out */
6018
- 504: {
6019
- headers: {
6020
- [name: string]: unknown;
6021
- };
6022
- content: {
6023
- "application/json": components["schemas"]["Error"];
6024
- };
6025
- };
6026
6166
  };
6027
6167
  };
6028
- "FountainWeb.InferenceCredentialController.delete": {
6168
+ "FountainWeb.InferenceCredentialSetController.delete": {
6029
6169
  parameters: {
6030
6170
  query?: never;
6031
6171
  header?: never;
6032
6172
  path: {
6033
- provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
6173
+ id: string;
6034
6174
  };
6035
6175
  cookie?: never;
6036
6176
  };
6037
6177
  requestBody?: never;
6038
6178
  responses: {
6039
- /** @description Cleared */
6179
+ /** @description Deleted */
6040
6180
  204: {
6041
6181
  headers: {
6042
6182
  [name: string]: unknown;
@@ -6061,6 +6201,15 @@ export interface operations {
6061
6201
  "application/json": components["schemas"]["Error"];
6062
6202
  };
6063
6203
  };
6204
+ /** @description No such set */
6205
+ 404: {
6206
+ headers: {
6207
+ [name: string]: unknown;
6208
+ };
6209
+ content: {
6210
+ "application/json": components["schemas"]["Error"];
6211
+ };
6212
+ };
6064
6213
  /** @description No acceptable representation */
6065
6214
  406: {
6066
6215
  headers: {
@@ -6070,13 +6219,13 @@ export interface operations {
6070
6219
  "application/json": components["schemas"]["NegotiationError"];
6071
6220
  };
6072
6221
  };
6073
- /** @description Unknown provider */
6222
+ /** @description The default set cannot be deleted */
6074
6223
  422: {
6075
6224
  headers: {
6076
6225
  [name: string]: unknown;
6077
6226
  };
6078
6227
  content: {
6079
- "application/json": components["schemas"]["Error"];
6228
+ "application/json": components["schemas"]["CredentialSetDeletionError"];
6080
6229
  };
6081
6230
  };
6082
6231
  /** @description Too Many Requests */
@@ -6090,22 +6239,29 @@ export interface operations {
6090
6239
  };
6091
6240
  };
6092
6241
  };
6093
- "FountainWeb.OnboardingController.show": {
6242
+ "FountainWeb.InferenceCredentialSetController.update": {
6094
6243
  parameters: {
6095
6244
  query?: never;
6096
6245
  header?: never;
6097
- path?: never;
6246
+ path: {
6247
+ id: string;
6248
+ };
6098
6249
  cookie?: never;
6099
6250
  };
6100
- requestBody?: never;
6251
+ /** @description Changes */
6252
+ requestBody?: {
6253
+ content: {
6254
+ "application/json": components["schemas"]["InferenceCredentialSetUpdateRequest"];
6255
+ };
6256
+ };
6101
6257
  responses: {
6102
- /** @description Onboarding state */
6258
+ /** @description Credential set */
6103
6259
  200: {
6104
6260
  headers: {
6105
6261
  [name: string]: unknown;
6106
6262
  };
6107
6263
  content: {
6108
- "application/json": components["schemas"]["OnboardingResponse"];
6264
+ "application/json": components["schemas"]["InferenceCredentialSetResponse"];
6109
6265
  };
6110
6266
  };
6111
6267
  /** @description Unauthorized */
@@ -6126,6 +6282,15 @@ export interface operations {
6126
6282
  "application/json": components["schemas"]["Error"];
6127
6283
  };
6128
6284
  };
6285
+ /** @description No such set */
6286
+ 404: {
6287
+ headers: {
6288
+ [name: string]: unknown;
6289
+ };
6290
+ content: {
6291
+ "application/json": components["schemas"]["Error"];
6292
+ };
6293
+ };
6129
6294
  /** @description No acceptable representation */
6130
6295
  406: {
6131
6296
  headers: {
@@ -6135,6 +6300,15 @@ export interface operations {
6135
6300
  "application/json": components["schemas"]["NegotiationError"];
6136
6301
  };
6137
6302
  };
6303
+ /** @description Invalid or duplicate name */
6304
+ 422: {
6305
+ headers: {
6306
+ [name: string]: unknown;
6307
+ };
6308
+ content: {
6309
+ "application/json": components["schemas"]["Error"];
6310
+ };
6311
+ };
6138
6312
  /** @description Too Many Requests */
6139
6313
  429: {
6140
6314
  headers: {
@@ -6146,22 +6320,30 @@ export interface operations {
6146
6320
  };
6147
6321
  };
6148
6322
  };
6149
- "FountainWeb.OnboardingController.complete": {
6323
+ "FountainWeb.InferenceCredentialController.update_in_set": {
6150
6324
  parameters: {
6151
6325
  query?: never;
6152
6326
  header?: never;
6153
- path?: never;
6327
+ path: {
6328
+ id: string;
6329
+ provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
6330
+ };
6154
6331
  cookie?: never;
6155
6332
  };
6156
- requestBody?: never;
6333
+ /** @description Credential */
6334
+ requestBody?: {
6335
+ content: {
6336
+ "application/json": components["schemas"]["InferenceCredentialRequest"];
6337
+ };
6338
+ };
6157
6339
  responses: {
6158
- /** @description Onboarding state */
6340
+ /** @description Provider status for the set */
6159
6341
  200: {
6160
6342
  headers: {
6161
6343
  [name: string]: unknown;
6162
6344
  };
6163
6345
  content: {
6164
- "application/json": components["schemas"]["OnboardingResponse"];
6346
+ "application/json": components["schemas"]["InferenceCredentialResponse"];
6165
6347
  };
6166
6348
  };
6167
6349
  /** @description Unauthorized */
@@ -6182,6 +6364,15 @@ export interface operations {
6182
6364
  "application/json": components["schemas"]["Error"];
6183
6365
  };
6184
6366
  };
6367
+ /** @description No such set */
6368
+ 404: {
6369
+ headers: {
6370
+ [name: string]: unknown;
6371
+ };
6372
+ content: {
6373
+ "application/json": components["schemas"]["Error"];
6374
+ };
6375
+ };
6185
6376
  /** @description No acceptable representation */
6186
6377
  406: {
6187
6378
  headers: {
@@ -6191,6 +6382,15 @@ export interface operations {
6191
6382
  "application/json": components["schemas"]["NegotiationError"];
6192
6383
  };
6193
6384
  };
6385
+ /** @description Rejected credential, blank value, or unknown provider */
6386
+ 422: {
6387
+ headers: {
6388
+ [name: string]: unknown;
6389
+ };
6390
+ content: {
6391
+ "application/json": components["schemas"]["Error"];
6392
+ };
6393
+ };
6194
6394
  /** @description Too Many Requests */
6195
6395
  429: {
6196
6396
  headers: {
@@ -6200,28 +6400,44 @@ export interface operations {
6200
6400
  "application/json": components["schemas"]["Error"];
6201
6401
  };
6202
6402
  };
6403
+ /** @description Provider unreachable */
6404
+ 502: {
6405
+ headers: {
6406
+ [name: string]: unknown;
6407
+ };
6408
+ content: {
6409
+ "application/json": components["schemas"]["Error"];
6410
+ };
6411
+ };
6412
+ /** @description Provider timed out */
6413
+ 504: {
6414
+ headers: {
6415
+ [name: string]: unknown;
6416
+ };
6417
+ content: {
6418
+ "application/json": components["schemas"]["Error"];
6419
+ };
6420
+ };
6203
6421
  };
6204
6422
  };
6205
- "FountainWeb.AdminController.index_audit": {
6423
+ "FountainWeb.InferenceCredentialController.delete_in_set": {
6206
6424
  parameters: {
6207
- query?: {
6208
- /** @description 1..500, default 100. */
6209
- limit?: number;
6210
- };
6425
+ query?: never;
6211
6426
  header?: never;
6212
- path?: never;
6427
+ path: {
6428
+ id: string;
6429
+ provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
6430
+ };
6213
6431
  cookie?: never;
6214
6432
  };
6215
6433
  requestBody?: never;
6216
6434
  responses: {
6217
- /** @description Audit events */
6218
- 200: {
6435
+ /** @description Cleared */
6436
+ 204: {
6219
6437
  headers: {
6220
6438
  [name: string]: unknown;
6221
6439
  };
6222
- content: {
6223
- "application/json": components["schemas"]["AdminAuditListResponse"];
6224
- };
6440
+ content?: never;
6225
6441
  };
6226
6442
  /** @description Unauthorized */
6227
6443
  401: {
@@ -6232,7 +6448,407 @@ export interface operations {
6232
6448
  "application/json": components["schemas"]["Error"];
6233
6449
  };
6234
6450
  };
6235
- /** @description Admin required */
6451
+ /** @description Insufficient scope */
6452
+ 403: {
6453
+ headers: {
6454
+ [name: string]: unknown;
6455
+ };
6456
+ content: {
6457
+ "application/json": components["schemas"]["Error"];
6458
+ };
6459
+ };
6460
+ /** @description No such set */
6461
+ 404: {
6462
+ headers: {
6463
+ [name: string]: unknown;
6464
+ };
6465
+ content: {
6466
+ "application/json": components["schemas"]["Error"];
6467
+ };
6468
+ };
6469
+ /** @description No acceptable representation */
6470
+ 406: {
6471
+ headers: {
6472
+ [name: string]: unknown;
6473
+ };
6474
+ content: {
6475
+ "application/json": components["schemas"]["NegotiationError"];
6476
+ };
6477
+ };
6478
+ /** @description Unknown provider */
6479
+ 422: {
6480
+ headers: {
6481
+ [name: string]: unknown;
6482
+ };
6483
+ content: {
6484
+ "application/json": components["schemas"]["Error"];
6485
+ };
6486
+ };
6487
+ /** @description Too Many Requests */
6488
+ 429: {
6489
+ headers: {
6490
+ [name: string]: unknown;
6491
+ };
6492
+ content: {
6493
+ "application/json": components["schemas"]["Error"];
6494
+ };
6495
+ };
6496
+ };
6497
+ };
6498
+ "FountainWeb.InferenceCredentialController.index": {
6499
+ parameters: {
6500
+ query?: never;
6501
+ header?: never;
6502
+ path?: never;
6503
+ cookie?: never;
6504
+ };
6505
+ requestBody?: never;
6506
+ responses: {
6507
+ /** @description Provider status */
6508
+ 200: {
6509
+ headers: {
6510
+ [name: string]: unknown;
6511
+ };
6512
+ content: {
6513
+ "application/json": components["schemas"]["InferenceCredentialListResponse"];
6514
+ };
6515
+ };
6516
+ /** @description Unauthorized */
6517
+ 401: {
6518
+ headers: {
6519
+ [name: string]: unknown;
6520
+ };
6521
+ content: {
6522
+ "application/json": components["schemas"]["Error"];
6523
+ };
6524
+ };
6525
+ /** @description Insufficient scope */
6526
+ 403: {
6527
+ headers: {
6528
+ [name: string]: unknown;
6529
+ };
6530
+ content: {
6531
+ "application/json": components["schemas"]["Error"];
6532
+ };
6533
+ };
6534
+ /** @description No acceptable representation */
6535
+ 406: {
6536
+ headers: {
6537
+ [name: string]: unknown;
6538
+ };
6539
+ content: {
6540
+ "application/json": components["schemas"]["NegotiationError"];
6541
+ };
6542
+ };
6543
+ /** @description Too Many Requests */
6544
+ 429: {
6545
+ headers: {
6546
+ [name: string]: unknown;
6547
+ };
6548
+ content: {
6549
+ "application/json": components["schemas"]["Error"];
6550
+ };
6551
+ };
6552
+ };
6553
+ };
6554
+ "FountainWeb.InferenceCredentialController.update": {
6555
+ parameters: {
6556
+ query?: never;
6557
+ header?: never;
6558
+ path: {
6559
+ provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
6560
+ };
6561
+ cookie?: never;
6562
+ };
6563
+ /** @description Credential */
6564
+ requestBody?: {
6565
+ content: {
6566
+ "application/json": components["schemas"]["InferenceCredentialRequest"];
6567
+ };
6568
+ };
6569
+ responses: {
6570
+ /** @description Provider status */
6571
+ 200: {
6572
+ headers: {
6573
+ [name: string]: unknown;
6574
+ };
6575
+ content: {
6576
+ "application/json": components["schemas"]["InferenceCredentialResponse"];
6577
+ };
6578
+ };
6579
+ /** @description Unauthorized */
6580
+ 401: {
6581
+ headers: {
6582
+ [name: string]: unknown;
6583
+ };
6584
+ content: {
6585
+ "application/json": components["schemas"]["Error"];
6586
+ };
6587
+ };
6588
+ /** @description Insufficient scope */
6589
+ 403: {
6590
+ headers: {
6591
+ [name: string]: unknown;
6592
+ };
6593
+ content: {
6594
+ "application/json": components["schemas"]["Error"];
6595
+ };
6596
+ };
6597
+ /** @description No acceptable representation */
6598
+ 406: {
6599
+ headers: {
6600
+ [name: string]: unknown;
6601
+ };
6602
+ content: {
6603
+ "application/json": components["schemas"]["NegotiationError"];
6604
+ };
6605
+ };
6606
+ /** @description Rejected credential, blank value, or unknown provider */
6607
+ 422: {
6608
+ headers: {
6609
+ [name: string]: unknown;
6610
+ };
6611
+ content: {
6612
+ "application/json": components["schemas"]["Error"];
6613
+ };
6614
+ };
6615
+ /** @description Too Many Requests */
6616
+ 429: {
6617
+ headers: {
6618
+ [name: string]: unknown;
6619
+ };
6620
+ content: {
6621
+ "application/json": components["schemas"]["Error"];
6622
+ };
6623
+ };
6624
+ /** @description Provider unreachable */
6625
+ 502: {
6626
+ headers: {
6627
+ [name: string]: unknown;
6628
+ };
6629
+ content: {
6630
+ "application/json": components["schemas"]["Error"];
6631
+ };
6632
+ };
6633
+ /** @description Provider timed out */
6634
+ 504: {
6635
+ headers: {
6636
+ [name: string]: unknown;
6637
+ };
6638
+ content: {
6639
+ "application/json": components["schemas"]["Error"];
6640
+ };
6641
+ };
6642
+ };
6643
+ };
6644
+ "FountainWeb.InferenceCredentialController.delete": {
6645
+ parameters: {
6646
+ query?: never;
6647
+ header?: never;
6648
+ path: {
6649
+ provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
6650
+ };
6651
+ cookie?: never;
6652
+ };
6653
+ requestBody?: never;
6654
+ responses: {
6655
+ /** @description Cleared */
6656
+ 204: {
6657
+ headers: {
6658
+ [name: string]: unknown;
6659
+ };
6660
+ content?: never;
6661
+ };
6662
+ /** @description Unauthorized */
6663
+ 401: {
6664
+ headers: {
6665
+ [name: string]: unknown;
6666
+ };
6667
+ content: {
6668
+ "application/json": components["schemas"]["Error"];
6669
+ };
6670
+ };
6671
+ /** @description Insufficient scope */
6672
+ 403: {
6673
+ headers: {
6674
+ [name: string]: unknown;
6675
+ };
6676
+ content: {
6677
+ "application/json": components["schemas"]["Error"];
6678
+ };
6679
+ };
6680
+ /** @description No acceptable representation */
6681
+ 406: {
6682
+ headers: {
6683
+ [name: string]: unknown;
6684
+ };
6685
+ content: {
6686
+ "application/json": components["schemas"]["NegotiationError"];
6687
+ };
6688
+ };
6689
+ /** @description Unknown provider */
6690
+ 422: {
6691
+ headers: {
6692
+ [name: string]: unknown;
6693
+ };
6694
+ content: {
6695
+ "application/json": components["schemas"]["Error"];
6696
+ };
6697
+ };
6698
+ /** @description Too Many Requests */
6699
+ 429: {
6700
+ headers: {
6701
+ [name: string]: unknown;
6702
+ };
6703
+ content: {
6704
+ "application/json": components["schemas"]["Error"];
6705
+ };
6706
+ };
6707
+ };
6708
+ };
6709
+ "FountainWeb.OnboardingController.show": {
6710
+ parameters: {
6711
+ query?: never;
6712
+ header?: never;
6713
+ path?: never;
6714
+ cookie?: never;
6715
+ };
6716
+ requestBody?: never;
6717
+ responses: {
6718
+ /** @description Onboarding state */
6719
+ 200: {
6720
+ headers: {
6721
+ [name: string]: unknown;
6722
+ };
6723
+ content: {
6724
+ "application/json": components["schemas"]["OnboardingResponse"];
6725
+ };
6726
+ };
6727
+ /** @description Unauthorized */
6728
+ 401: {
6729
+ headers: {
6730
+ [name: string]: unknown;
6731
+ };
6732
+ content: {
6733
+ "application/json": components["schemas"]["Error"];
6734
+ };
6735
+ };
6736
+ /** @description Insufficient scope */
6737
+ 403: {
6738
+ headers: {
6739
+ [name: string]: unknown;
6740
+ };
6741
+ content: {
6742
+ "application/json": components["schemas"]["Error"];
6743
+ };
6744
+ };
6745
+ /** @description No acceptable representation */
6746
+ 406: {
6747
+ headers: {
6748
+ [name: string]: unknown;
6749
+ };
6750
+ content: {
6751
+ "application/json": components["schemas"]["NegotiationError"];
6752
+ };
6753
+ };
6754
+ /** @description Too Many Requests */
6755
+ 429: {
6756
+ headers: {
6757
+ [name: string]: unknown;
6758
+ };
6759
+ content: {
6760
+ "application/json": components["schemas"]["Error"];
6761
+ };
6762
+ };
6763
+ };
6764
+ };
6765
+ "FountainWeb.OnboardingController.complete": {
6766
+ parameters: {
6767
+ query?: never;
6768
+ header?: never;
6769
+ path?: never;
6770
+ cookie?: never;
6771
+ };
6772
+ requestBody?: never;
6773
+ responses: {
6774
+ /** @description Onboarding state */
6775
+ 200: {
6776
+ headers: {
6777
+ [name: string]: unknown;
6778
+ };
6779
+ content: {
6780
+ "application/json": components["schemas"]["OnboardingResponse"];
6781
+ };
6782
+ };
6783
+ /** @description Unauthorized */
6784
+ 401: {
6785
+ headers: {
6786
+ [name: string]: unknown;
6787
+ };
6788
+ content: {
6789
+ "application/json": components["schemas"]["Error"];
6790
+ };
6791
+ };
6792
+ /** @description Insufficient scope */
6793
+ 403: {
6794
+ headers: {
6795
+ [name: string]: unknown;
6796
+ };
6797
+ content: {
6798
+ "application/json": components["schemas"]["Error"];
6799
+ };
6800
+ };
6801
+ /** @description No acceptable representation */
6802
+ 406: {
6803
+ headers: {
6804
+ [name: string]: unknown;
6805
+ };
6806
+ content: {
6807
+ "application/json": components["schemas"]["NegotiationError"];
6808
+ };
6809
+ };
6810
+ /** @description Too Many Requests */
6811
+ 429: {
6812
+ headers: {
6813
+ [name: string]: unknown;
6814
+ };
6815
+ content: {
6816
+ "application/json": components["schemas"]["Error"];
6817
+ };
6818
+ };
6819
+ };
6820
+ };
6821
+ "FountainWeb.AdminController.index_audit": {
6822
+ parameters: {
6823
+ query?: {
6824
+ /** @description 1..500, default 100. */
6825
+ limit?: number;
6826
+ };
6827
+ header?: never;
6828
+ path?: never;
6829
+ cookie?: never;
6830
+ };
6831
+ requestBody?: never;
6832
+ responses: {
6833
+ /** @description Audit events */
6834
+ 200: {
6835
+ headers: {
6836
+ [name: string]: unknown;
6837
+ };
6838
+ content: {
6839
+ "application/json": components["schemas"]["AdminAuditListResponse"];
6840
+ };
6841
+ };
6842
+ /** @description Unauthorized */
6843
+ 401: {
6844
+ headers: {
6845
+ [name: string]: unknown;
6846
+ };
6847
+ content: {
6848
+ "application/json": components["schemas"]["Error"];
6849
+ };
6850
+ };
6851
+ /** @description Admin required */
6236
6852
  403: {
6237
6853
  headers: {
6238
6854
  [name: string]: unknown;
@@ -9757,6 +10373,163 @@ export interface operations {
9757
10373
  };
9758
10374
  };
9759
10375
  };
10376
+ "FountainWeb.ClaimableUserController.put_inference_credential": {
10377
+ parameters: {
10378
+ query?: never;
10379
+ header?: never;
10380
+ path: {
10381
+ /** @description The grant's id. */
10382
+ id: string;
10383
+ provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
10384
+ };
10385
+ cookie?: never;
10386
+ };
10387
+ /** @description Credential */
10388
+ requestBody?: {
10389
+ content: {
10390
+ "application/json": components["schemas"]["InferenceCredentialRequest"];
10391
+ };
10392
+ };
10393
+ responses: {
10394
+ /** @description Stored */
10395
+ 204: {
10396
+ headers: {
10397
+ [name: string]: unknown;
10398
+ };
10399
+ content?: never;
10400
+ };
10401
+ /** @description Missing or invalid key */
10402
+ 401: {
10403
+ headers: {
10404
+ [name: string]: unknown;
10405
+ };
10406
+ content: {
10407
+ "application/json": components["schemas"]["Error"];
10408
+ };
10409
+ };
10410
+ /** @description Not a full-scope key */
10411
+ 403: {
10412
+ headers: {
10413
+ [name: string]: unknown;
10414
+ };
10415
+ content: {
10416
+ "application/json": components["schemas"]["Error"];
10417
+ };
10418
+ };
10419
+ /** @description No such grant */
10420
+ 404: {
10421
+ headers: {
10422
+ [name: string]: unknown;
10423
+ };
10424
+ content: {
10425
+ "application/json": components["schemas"]["Error"];
10426
+ };
10427
+ };
10428
+ /** @description No acceptable representation */
10429
+ 406: {
10430
+ headers: {
10431
+ [name: string]: unknown;
10432
+ };
10433
+ content: {
10434
+ "application/json": components["schemas"]["NegotiationError"];
10435
+ };
10436
+ };
10437
+ /** @description Blank value or unknown provider */
10438
+ 422: {
10439
+ headers: {
10440
+ [name: string]: unknown;
10441
+ };
10442
+ content: {
10443
+ "application/json": components["schemas"]["Error"];
10444
+ };
10445
+ };
10446
+ /** @description Too Many Requests */
10447
+ 429: {
10448
+ headers: {
10449
+ [name: string]: unknown;
10450
+ };
10451
+ content: {
10452
+ "application/json": components["schemas"]["Error"];
10453
+ };
10454
+ };
10455
+ };
10456
+ };
10457
+ "FountainWeb.ClaimableUserController.delete_inference_credential": {
10458
+ parameters: {
10459
+ query?: never;
10460
+ header?: never;
10461
+ path: {
10462
+ /** @description The grant's id. */
10463
+ id: string;
10464
+ provider: "anthropic_api_key" | "claude_code_oauth_token" | "openai_api_key" | "gemini_api_key";
10465
+ };
10466
+ cookie?: never;
10467
+ };
10468
+ requestBody?: never;
10469
+ responses: {
10470
+ /** @description Cleared */
10471
+ 204: {
10472
+ headers: {
10473
+ [name: string]: unknown;
10474
+ };
10475
+ content?: never;
10476
+ };
10477
+ /** @description Missing or invalid key */
10478
+ 401: {
10479
+ headers: {
10480
+ [name: string]: unknown;
10481
+ };
10482
+ content: {
10483
+ "application/json": components["schemas"]["Error"];
10484
+ };
10485
+ };
10486
+ /** @description Not a full-scope key */
10487
+ 403: {
10488
+ headers: {
10489
+ [name: string]: unknown;
10490
+ };
10491
+ content: {
10492
+ "application/json": components["schemas"]["Error"];
10493
+ };
10494
+ };
10495
+ /** @description No such grant */
10496
+ 404: {
10497
+ headers: {
10498
+ [name: string]: unknown;
10499
+ };
10500
+ content: {
10501
+ "application/json": components["schemas"]["Error"];
10502
+ };
10503
+ };
10504
+ /** @description No acceptable representation */
10505
+ 406: {
10506
+ headers: {
10507
+ [name: string]: unknown;
10508
+ };
10509
+ content: {
10510
+ "application/json": components["schemas"]["NegotiationError"];
10511
+ };
10512
+ };
10513
+ /** @description Unknown provider */
10514
+ 422: {
10515
+ headers: {
10516
+ [name: string]: unknown;
10517
+ };
10518
+ content: {
10519
+ "application/json": components["schemas"]["Error"];
10520
+ };
10521
+ };
10522
+ /** @description Too Many Requests */
10523
+ 429: {
10524
+ headers: {
10525
+ [name: string]: unknown;
10526
+ };
10527
+ content: {
10528
+ "application/json": components["schemas"]["Error"];
10529
+ };
10530
+ };
10531
+ };
10532
+ };
9760
10533
  "FountainWeb.ConnectionProviderController.index": {
9761
10534
  parameters: {
9762
10535
  query?: never;
@@ -10645,7 +11418,7 @@ export interface operations {
10645
11418
  "application/json": components["schemas"]["NegotiationError"];
10646
11419
  };
10647
11420
  };
10648
- /** @description Conflicting state */
11421
+ /** @description Conflicting state, changed inference source, or incompatible Codex sandbox credential */
10649
11422
  409: {
10650
11423
  headers: {
10651
11424
  [name: string]: unknown;
package/dist/http.d.ts CHANGED
@@ -15,7 +15,7 @@ export interface RequestOptions {
15
15
  * this string is already what Fountain's request logs are keyed on. The
16
16
  * version half is asserted against `package.json` by a test.
17
17
  */
18
- export declare const USER_AGENT = "fountain-sdk-js/2.0.0";
18
+ export declare const USER_AGENT = "fountain-sdk-js/2.1.0";
19
19
  export declare class HttpClient {
20
20
  readonly config: ResolvedConfig;
21
21
  private readonly fetchImpl;
package/dist/http.js CHANGED
@@ -5,7 +5,7 @@ import { AuthError, ConnectionError, FountainError, errorForStatus } from "./err
5
5
  * this string is already what Fountain's request logs are keyed on. The
6
6
  * version half is asserted against `package.json` by a test.
7
7
  */
8
- export const USER_AGENT = "fountain-sdk-js/2.0.0";
8
+ export const USER_AGENT = "fountain-sdk-js/2.1.0";
9
9
  /**
10
10
  * The thin layer everything else is built on: one bearer token, JSON in and
11
11
  * out, and errors that say which call failed. `Fountain#api` exposes it
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@managoat/fountain-sdk",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Run a coding agent on a real computer, with your repos and your credentials, in one call.",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {