@deepraxis/sdk 0.1.0-dev.95813a3 → 0.1.0-dev.a3beed2

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.
@@ -128,6 +128,27 @@ export const operations = [
128
128
  "required": false,
129
129
  "description": "Tool configurations available to the agent. Maximum of 128 tools\nacross all toolsets allowed."
130
130
  },
131
+ {
132
+ "name": "databases",
133
+ "type": "array",
134
+ "itemType": "object",
135
+ "required": false,
136
+ "description": "Database allowlist for platform resources accessible through service-agent codemode. Only kind=service accepts nonempty bindings; personal agents return 400. At most 20 bindings per resource type, with no duplicate ids. Newly added bindings apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Unbound resources return 404; writes to read_only resources are refused. Other platform APIs return 403, except public API discovery. Invalid bindings and unknown item fields return 400. Omit on create for no bindings."
137
+ },
138
+ {
139
+ "name": "vector_stores",
140
+ "type": "array",
141
+ "itemType": "object",
142
+ "required": false,
143
+ "description": "Knowledge vector store allowlist for platform resources accessible through service-agent codemode. Only kind=service accepts nonempty bindings; personal agents return 400. At most 20 bindings per resource type, with no duplicate ids. Newly added bindings apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Unbound resources return 404; writes to read_only resources are refused. Other platform APIs return 403, except public API discovery. Invalid bindings and unknown item fields return 400. Omit on create for no bindings."
144
+ },
145
+ {
146
+ "name": "files",
147
+ "type": "array",
148
+ "itemType": "object",
149
+ "required": false,
150
+ "description": "File allowlist for platform resources accessible through service-agent codemode. Only kind=service accepts nonempty bindings; personal agents return 400. At most 20 bindings per resource type, with no duplicate ids. Newly added bindings apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Unbound resources return 404; writes to read_only resources are refused. Other platform APIs return 403, except public API discovery. Invalid bindings and unknown item fields return 400. Omit on create for no bindings."
151
+ },
131
152
  {
132
153
  "name": "kind",
133
154
  "type": "string",
@@ -175,6 +196,17 @@ export const operations = [
175
196
  "type": "object",
176
197
  "required": false,
177
198
  "description": "Praxis extension: switchable model ids on /agent/v1 only. The default model must be included. When omitted, only the default model is selectable."
199
+ },
200
+ {
201
+ "name": "preset",
202
+ "type": "string",
203
+ "enum": [
204
+ "minimal",
205
+ "data-editor",
206
+ "full"
207
+ ],
208
+ "required": false,
209
+ "description": "Optional tool preset. minimal enables read, glob, grep and ask_user_question; data-editor also enables write and edit; full uses the default toolset with always_allow. Explicit tools override matching preset entries. codemode requires bash and is absent from data-editor."
178
210
  }
179
211
  ]
180
212
  }
@@ -285,6 +317,27 @@ export const operations = [
285
317
  "required": false,
286
318
  "description": "The agent's current version, used to prevent concurrent overwrites.\nObtain this value from a create or retrieve response. Must be at least 1 if\nspecified. When supplied, the request fails if it does not match the server's\ncurrent version; omit to apply the update unconditionally."
287
319
  },
320
+ {
321
+ "name": "databases",
322
+ "type": "array",
323
+ "itemType": "object",
324
+ "required": false,
325
+ "description": "Replace this resource allowlist; omission preserves it, and null or [] clears it. Additions apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Only service agents accept nonempty bindings."
326
+ },
327
+ {
328
+ "name": "vector_stores",
329
+ "type": "array",
330
+ "itemType": "object",
331
+ "required": false,
332
+ "description": "Replace this resource allowlist; omission preserves it, and null or [] clears it. Additions apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Only service agents accept nonempty bindings."
333
+ },
334
+ {
335
+ "name": "files",
336
+ "type": "array",
337
+ "itemType": "object",
338
+ "required": false,
339
+ "description": "Replace this resource allowlist; omission preserves it, and null or [] clears it. Additions apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Only service agents accept nonempty bindings."
340
+ },
288
341
  {
289
342
  "name": "kind",
290
343
  "type": "string",
@@ -332,6 +385,17 @@ export const operations = [
332
385
  "type": "object",
333
386
  "required": false,
334
387
  "description": "Praxis extension: switchable model ids on /agent/v1 only. The default model must be included. When omitted, only the default model is selectable."
388
+ },
389
+ {
390
+ "name": "preset",
391
+ "type": "string",
392
+ "enum": [
393
+ "minimal",
394
+ "data-editor",
395
+ "full"
396
+ ],
397
+ "required": false,
398
+ "description": "Optional tool preset. minimal enables read, glob, grep and ask_user_question; data-editor also enables write and edit; full uses the default toolset with always_allow. Explicit tools override matching preset entries. codemode requires bash and is absent from data-editor."
335
399
  }
336
400
  ]
337
401
  }
@@ -522,6 +586,23 @@ export const operations = [
522
586
  ],
523
587
  "query": []
524
588
  },
589
+ {
590
+ "resource": "agent.agents.unarchive",
591
+ "method": "create",
592
+ "summary": "Unarchive Agent",
593
+ "description": "Restore an archived agent without creating a configuration version. Already active agents are unchanged. Missing or inaccessible agents return 404. Use the returned agent id to create new sessions.",
594
+ "http": "POST",
595
+ "path": "/agent/v1/agents/{agent_id}/unarchive",
596
+ "streaming": "no",
597
+ "pagination": false,
598
+ "pathParams": [
599
+ {
600
+ "name": "agent_id",
601
+ "sdkName": "agent_id"
602
+ }
603
+ ],
604
+ "query": []
605
+ },
525
606
  {
526
607
  "resource": "agent.agents.versions",
527
608
  "method": "list",
@@ -717,7 +798,7 @@ export const operations = [
717
798
  "resource": "agent.computers",
718
799
  "method": "connect",
719
800
  "summary": "Connect computer",
720
- "description": "Resume the computer and issue a sandbox connection.\n\nOwn-face extension: Managed Agents has no persistent Computer connection. Returns the public SDK sandbox_id, envd_access_token and template_id, plus the machine tier the computer is on now (light or heavy) and the lease that keeps it there (lease_id, lease_expires_at; lease_id is null when no lease exists). Keep the lease while the connection stays open: renew it about every 20 seconds (POST .../leases/{lease_id}/renew) and release it on close (DELETE .../leases/{lease_id}). An unrenewed lease simply expires, and the full machine is reclaimed only after that. Archived computers remain accessible; foreign or absent computers return 404. Never cache credentials.",
801
+ "description": "Resume the computer and issue a sandbox connection.\n\nOwn-face extension: Managed Agents has no persistent Computer connection. Returns the public SDK sandbox_id, envd_access_token and template_id, plus the machine tier the computer is on now (light or heavy) and the lease that keeps it there (lease_id, lease_expires_at; lease_id is null when no lease exists). Keep the lease while the connection stays open: renew it about every 20 seconds (POST .../leases/{lease_id}/renew) and release it on close (DELETE .../leases/{lease_id}). An unrenewed lease simply expires, and the full machine is reclaimed only after that. Archived computers remain accessible; foreign or absent computers return 404. Never cache credentials.\n\nConnect to a computer with a caller-held lease. Omit the body or send {} to request light: the lightweight shell, or the heavy instance while it is running. Send {\"need\":\"heavy\"} to request full Linux for interactive programs; files are synchronized before the heavy connection is returned with tier heavy. Renew the lease while using the connection and release it with DELETE when finished.",
721
802
  "http": "POST",
722
803
  "path": "/agent/v1/computers/{computer_id}/connect",
723
804
  "streaming": "no",
@@ -728,7 +809,22 @@ export const operations = [
728
809
  "sdkName": "computer_id"
729
810
  }
730
811
  ],
731
- "query": []
812
+ "query": [],
813
+ "body": {
814
+ "required": false,
815
+ "fields": [
816
+ {
817
+ "name": "need",
818
+ "type": "string",
819
+ "enum": [
820
+ "light",
821
+ "heavy"
822
+ ],
823
+ "required": false,
824
+ "description": "Defaults to light. light uses the lightweight shell, or the heavy instance while it is running. heavy requests a full Linux computer for interactive programs; heavy running time counts toward the daily budget in seconds."
825
+ }
826
+ ]
827
+ }
732
828
  },
733
829
  {
734
830
  "resource": "agent.computers.files",
@@ -1739,7 +1835,7 @@ export const operations = [
1739
1835
  "resource": "agent.sessions",
1740
1836
  "method": "create",
1741
1837
  "summary": "Create session",
1742
- "description": "Create a session: one conversation with an agent, running on a machine. Pass agent as an agent id (latest version) or {id, version, type:\"agent\"}. Unlike Anthropic Managed Agents, omit environment_id to get a light machine, unless computer_id (explicit, or the agent's default) selects a Computer; pass environment_id for a sandbox recipe. Optional model must be one of the agent's allowed models; optional thinking is {effort: low|medium|high|xhigh|max|none} or null, where null inherits the agent default and then the model default (none requires the model to allow disabling thinking). Selections are saved before initial_events run; invalid ones return 400 invalid_request_error. Inline agent overrides are not supported. Supports vault_ids, up to 50, owned by the current organization and not archived; credential injection is deferred to a later version. Omitted budget defaults to USD 20; null removes the limit, and a limit object uses a positive integer string of USD cents. Up to 500 file resources can be attached. Use initial_events to send a first user.message in this request, or send messages afterwards with sessions.events.send. The returned status can still be idle before initial events run; read agent.message and the subsequent session.status_idle event to confirm completion.",
1838
+ "description": "Create a session: one conversation with an agent. Pass agent as an agent id (latest version) or {id, version, type:\"agent\"}. Unlike Anthropic Managed Agents, omit environment_id to get a light machine, unless computer_id (explicit, or the agent's default) selects a Computer; pass an environment id for a sandbox recipe. For service agents, omission returns environment_id=light; explicit null allocates no machine, so codemode, bash and other machine tools are unavailable. Optional model must be one of the agent's allowed models; optional thinking is {effort: low|medium|high|xhigh|max|none} or null, where null inherits the agent default and then the model default (none requires the model to allow disabling thinking). Selections are saved before initial_events run; invalid ones return 400 invalid_request_error. Inline agent overrides are not supported. Supports vault_ids, up to 50, owned by the current organization and not archived; credential injection is deferred to a later version. Omitted budget defaults to USD 20; null removes the limit, and a limit object uses a positive integer string of USD cents. Up to 500 file resources can be attached. Use initial_events to send a first user.message in this request, or send messages afterwards with sessions.events.send. The returned status can still be idle before initial events run; read agent.message and the subsequent session.status_idle event to confirm completion.",
1743
1839
  "http": "POST",
1744
1840
  "path": "/agent/v1/sessions",
1745
1841
  "streaming": "no",
@@ -1759,7 +1855,7 @@ export const operations = [
1759
1855
  "name": "environment_id",
1760
1856
  "type": "string",
1761
1857
  "required": false,
1762
- "description": "ID of the `environment` defining the container configuration for\nthis session."
1858
+ "description": "Execution environment id from agent.environments.list or agent.environments.create. For a service agent, omission selects the built-in light environment and returns session.environment_id=light; explicit null allocates no machine and makes machine tools, including codemode and bash, unavailable. Personal agents use their selected Computer."
1763
1859
  },
1764
1860
  {
1765
1861
  "name": "budget",
@@ -1833,6 +1929,23 @@ export const operations = [
1833
1929
  ]
1834
1930
  }
1835
1931
  },
1932
+ {
1933
+ "resource": "agent.sessions",
1934
+ "method": "delete",
1935
+ "summary": "Delete session",
1936
+ "description": "Delete an idle or terminated session and its event history after saving a deletion snapshot. Supply the session id from creation or listing. Running sessions return 409 INVALID_STATE: interrupt first or wait until idle or terminated. Afterwards retrieval and event listing return 404 and lists omit the session. Example: DELETE /agent/v1/sessions/sesn_example.",
1937
+ "http": "DELETE",
1938
+ "path": "/agent/v1/sessions/{session_id}",
1939
+ "streaming": "no",
1940
+ "pagination": false,
1941
+ "pathParams": [
1942
+ {
1943
+ "name": "session_id",
1944
+ "sdkName": "session_id"
1945
+ }
1946
+ ],
1947
+ "query": []
1948
+ },
1836
1949
  {
1837
1950
  "resource": "agent.sessions",
1838
1951
  "method": "retrieve",
@@ -3326,6 +3439,27 @@ export const operations = [
3326
3439
  ],
3327
3440
  "query": []
3328
3441
  },
3442
+ {
3443
+ "resource": "application.workers.versions.assets",
3444
+ "method": "retrieveManifest",
3445
+ "summary": "Get version asset manifest",
3446
+ "description": "Read the retained asset paths, content hashes and byte sizes of a version for publication planning. This read creates no session or version. A version without assets returns an empty manifest; unavailable artifacts and foreign resources return 404.",
3447
+ "http": "GET",
3448
+ "path": "/application/v1/workers/{worker_id}/versions/{version_id}/assets/manifest",
3449
+ "streaming": "no",
3450
+ "pagination": false,
3451
+ "pathParams": [
3452
+ {
3453
+ "name": "worker_id",
3454
+ "sdkName": "worker_id"
3455
+ },
3456
+ {
3457
+ "name": "version_id",
3458
+ "sdkName": "version_id"
3459
+ }
3460
+ ],
3461
+ "query": []
3462
+ },
3329
3463
  {
3330
3464
  "resource": "automation.actions",
3331
3465
  "method": "list",
@@ -6749,7 +6883,7 @@ export const operations = [
6749
6883
  "name": "{column}",
6750
6884
  "type": "string",
6751
6885
  "required": false,
6752
- "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. See the filter operator matrix."
6886
+ "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
6753
6887
  },
6754
6888
  {
6755
6889
  "name": "and",
@@ -6797,7 +6931,7 @@ export const operations = [
6797
6931
  "name": "on_conflict",
6798
6932
  "type": "string",
6799
6933
  "required": false,
6800
- "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
6934
+ "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
6801
6935
  },
6802
6936
  {
6803
6937
  "name": "columns",
@@ -6811,7 +6945,7 @@ export const operations = [
6811
6945
  "resource": "database.databases.rest",
6812
6946
  "method": "retrieve",
6813
6947
  "summary": "Select rows",
6814
- "description": "Read matching rows with filters, selected columns and ordering. Returns at most 1000 rows per request, including when limit is omitted. Content-Range reports the actual returned interval and the total when count is requested. PATCH and DELETE are not subject to this read cap. Unlike Supabase, casts, aggregates, spread and join modifiers are unsupported. Each table supports up to 1,000,000 rows. Query budget: 8,000 ms with a shared 3,000,000-row safety ceiling. Create indexes on filtered or sorted fields, or narrow the request when it exceeds its budget. Synchronous SQLite aggregates use candidate-row throughput estimates before execution; deployed Workers freeze clocks during synchronous CPU work, so the timer is not a guaranteed server-side interrupt. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode. Error table: QUERY_CANCELED / PostgREST 57014 is HTTP 500, retryable=false: Query timed out: index filtered or sorted fields, or narrow the range. DATABASE_INVALID_STATE is HTTP 409 for operations on a deleting database. Cleared or nonexistent databases return DATABASE_NOT_FOUND / HTTP 404. The count is an HTTP Content-Range response header, not a JSON property. Praxis SDK/codemode methods return the body only; a page length is not a total unless you know all matches fit in that page.",
6948
+ "description": "Read matching rows with filters, selected columns and ordering. Returns at most 1000 rows per request, including when limit is omitted. Content-Range reports the actual returned interval and the total when count is requested. PATCH and DELETE are not subject to this read cap. Unlike Supabase, casts, aggregates, spread and join modifiers are unsupported. Each table supports up to 1,000,000 rows. Query budget: 8,000 ms with a shared 3,000,000-row safety ceiling. Create indexes on filtered or sorted fields, or narrow the request when it exceeds its budget. Synchronous SQLite aggregates use candidate-row throughput estimates before execution; deployed Workers freeze clocks during synchronous CPU work, so the timer is not a guaranteed server-side interrupt. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode. Error table: QUERY_CANCELED / PostgREST 57014 is HTTP 500, retryable=false: Query timed out: index filtered or sorted fields, or narrow the range. DATABASE_INVALID_STATE is HTTP 409 for operations on a deleting database. Cleared or nonexistent databases return DATABASE_NOT_FOUND / HTTP 404. The count is an HTTP Content-Range response header, not a JSON property. Use praxis.database.count in the SDK or codemode to return { count: number | null }; a page length is not a total unless you know all matches fit in that page.",
6815
6949
  "http": "GET",
6816
6950
  "path": "/database/v1/databases/{database_id}/rest/{table}",
6817
6951
  "streaming": "no",
@@ -6837,7 +6971,7 @@ export const operations = [
6837
6971
  "name": "{column}",
6838
6972
  "type": "string",
6839
6973
  "required": false,
6840
- "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. See the filter operator matrix."
6974
+ "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
6841
6975
  },
6842
6976
  {
6843
6977
  "name": "and",
@@ -6885,7 +7019,7 @@ export const operations = [
6885
7019
  "name": "on_conflict",
6886
7020
  "type": "string",
6887
7021
  "required": false,
6888
- "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
7022
+ "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
6889
7023
  },
6890
7024
  {
6891
7025
  "name": "columns",
@@ -6899,7 +7033,7 @@ export const operations = [
6899
7033
  "resource": "database.databases.rest",
6900
7034
  "method": "head",
6901
7035
  "summary": "Count rows",
6902
- "description": "Inspect the HTTP row count and range without retrieving row data; send Prefer: count=exact for a filtered count. Returns no body and does not fetch or serialize row data. A known count determines the interval using limit/offset or Range with a default and maximum page size of 1000. Without a count preference, or when the selected count mode cannot supply a total, Content-Range is */*. Singular Accept still validates page cardinality. Unlike Supabase, planned and estimated counts do not use PostgreSQL planner estimates. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode. Praxis SDK/codemode methods return only the empty body, not the Content-Range response header; use an HTTP client when you need that header.",
7036
+ "description": "Inspect the HTTP row count and range without retrieving row data; send Prefer: count=exact for a filtered count. Returns no body and does not fetch or serialize row data. A known count determines the interval using limit/offset or Range with a default and maximum page size of 1000. Without a count preference, or when the selected count mode cannot supply a total, Content-Range is */*. Singular Accept still validates page cardinality. Unlike Supabase, planned and estimated counts do not use PostgreSQL planner estimates. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode. Use praxis.database.count in the SDK or codemode to return { count: number | null } from this header without retrieving rows.",
6903
7037
  "http": "HEAD",
6904
7038
  "path": "/database/v1/databases/{database_id}/rest/{table}",
6905
7039
  "streaming": "no",
@@ -6925,7 +7059,7 @@ export const operations = [
6925
7059
  "name": "{column}",
6926
7060
  "type": "string",
6927
7061
  "required": false,
6928
- "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. See the filter operator matrix."
7062
+ "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
6929
7063
  },
6930
7064
  {
6931
7065
  "name": "and",
@@ -6973,7 +7107,7 @@ export const operations = [
6973
7107
  "name": "on_conflict",
6974
7108
  "type": "string",
6975
7109
  "required": false,
6976
- "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
7110
+ "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
6977
7111
  },
6978
7112
  {
6979
7113
  "name": "columns",
@@ -7013,7 +7147,7 @@ export const operations = [
7013
7147
  "name": "{column}",
7014
7148
  "type": "string",
7015
7149
  "required": false,
7016
- "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. See the filter operator matrix."
7150
+ "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
7017
7151
  },
7018
7152
  {
7019
7153
  "name": "and",
@@ -7061,7 +7195,7 @@ export const operations = [
7061
7195
  "name": "on_conflict",
7062
7196
  "type": "string",
7063
7197
  "required": false,
7064
- "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
7198
+ "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
7065
7199
  },
7066
7200
  {
7067
7201
  "name": "columns",
@@ -7079,7 +7213,7 @@ export const operations = [
7079
7213
  "resource": "database.databases.rest",
7080
7214
  "method": "create",
7081
7215
  "summary": "Insert rows",
7082
- "description": "Insert rows into an existing table after defining its fields; at most 500 rows per request. Each request is atomic: any failure rolls back the entire batch. There are no transactions across requests.\nRows are filled to the union of their keys with null; send Prefer: missing=default to use field defaults for missing keys.\nThe default is return=minimal: success returns HTTP 201 with an empty body. Send Prefer: return=representation to return the inserted rows. Unlike Supabase, upsert conflicts can target only id or one unique field, not a composite key. Each table supports up to 1,000,000 rows.",
7216
+ "description": "Insert rows into an existing table after defining its fields; at most 500 rows per request. Each request is atomic: any failure rolls back the entire batch. There are no transactions across requests.\nRows are filled to the union of their keys with null; send Prefer: missing=default to use field defaults for missing keys.\nThe default is return=minimal: success returns HTTP 201 with an empty body. Send Prefer: return=representation to return the inserted rows. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. Unlike Supabase, upsert conflicts can target only id or one unique field, not a composite key. Each table supports up to 1,000,000 rows.",
7083
7217
  "http": "POST",
7084
7218
  "path": "/database/v1/databases/{database_id}/rest/{table}",
7085
7219
  "streaming": "no",
@@ -7105,7 +7239,7 @@ export const operations = [
7105
7239
  "name": "{column}",
7106
7240
  "type": "string",
7107
7241
  "required": false,
7108
- "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. See the filter operator matrix."
7242
+ "description": "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
7109
7243
  },
7110
7244
  {
7111
7245
  "name": "and",
@@ -7153,7 +7287,7 @@ export const operations = [
7153
7287
  "name": "on_conflict",
7154
7288
  "type": "string",
7155
7289
  "required": false,
7156
- "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
7290
+ "description": "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
7157
7291
  },
7158
7292
  {
7159
7293
  "name": "columns",
@@ -7205,7 +7339,7 @@ export const operations = [
7205
7339
  "resource": "database.databases.tables",
7206
7340
  "method": "create",
7207
7341
  "summary": "Create table",
7208
- "description": "Creates a table together with its initial fields in one call and returns it (HTTP 201) with generated tbl_ and fld_ ids. name must match ^[a-z_][a-z0-9_]{0,62}$ and be unused in this database (duplicate: 409 UNIQUE_VIOLATION). fields is required and may be an empty array; fields can also be added later with databaseAddField. Limits: 50 tables per database, 64 fields per table, and 16 indexed or unique fields per table; exceeding one returns 400 LIMIT_EXCEEDED. Every row also has a system id column, which is not declared as a field. Insert data afterwards with databaseInsert. Unlike Supabase, define schema with this table API and the field APIs; PostgreSQL DDL and SQL migration files cannot be submitted. Each table supports up to 1,000,000 rows.",
7342
+ "description": "Creates a table together with its initial fields in one call and returns it (HTTP 201) with generated tbl_ and fld_ ids. name must match ^[a-z_][a-z0-9_]{0,62}$ and be unused in this database (duplicate: 409 UNIQUE_VIOLATION). fields is required and may be an empty array; fields can also be added later with databaseAddField. Limits: 50 tables per database, 64 fields per table, and 16 indexed or unique fields per table; exceeding one returns 400 LIMIT_EXCEEDED. Fields default to indexed:false. Set indexed:true explicitly for fields used in filters or ordering. Only indexed:true or unique:true consumes one of the 16 indexed-or-unique field slots; a field with both consumes one slot. Unique fields still consume a slot even with indexed:false. Existing fields are unchanged. Minimal field example: {\"name\":\"notes\",\"type\":\"string\",\"indexed\":false}. Every row also has a system id column, which is not declared as a field. Insert data afterwards with databaseInsert. Unlike Supabase, define schema with this table API and the field APIs; PostgreSQL DDL and SQL migration files cannot be submitted. Each table supports up to 1,000,000 rows.",
7209
7343
  "http": "POST",
7210
7344
  "path": "/database/v1/databases/{database_id}/tables",
7211
7345
  "streaming": "no",
@@ -7326,7 +7460,7 @@ export const operations = [
7326
7460
  "resource": "database.databases.tables.fields",
7327
7461
  "method": "create",
7328
7462
  "summary": "Add field",
7329
- "description": "Adds one field to an existing table and returns the updated table (HTTP 201). Required inputs are name (lowercase letters, digits and underscores; id and names starting with _ are reserved) and type (string, integer, number, boolean, datetime, json or link); json needs options.schema and link needs options.linked_table_id and options.multiple. Adding a required field to a table that already has rows needs a default, otherwise the call fails with 400 VALIDATION_FAILED; a default is written into every existing row. Scalar fields are indexed by default, while json and link fields cannot be indexed. Limits: 64 fields and 16 indexed or unique fields per table (400 LIMIT_EXCEEDED). Unlike Supabase, schema evolution uses field definitions rather than ALTER TABLE statements or SQL migrations.",
7463
+ "description": "Adds one field to an existing table and returns the updated table (HTTP 201). Required inputs are name (lowercase letters, digits and underscores; id and names starting with _ are reserved) and type (string, integer, number, boolean, datetime, json or link); json needs options.schema and link needs options.linked_table_id and options.multiple. Adding a required field to a table that already has rows needs a default, otherwise the call fails with 400 VALIDATION_FAILED; a default is written into every existing row. Fields default to indexed:false. Set indexed:true explicitly for fields used in filters or ordering. Only indexed:true or unique:true consumes one of the 16 indexed-or-unique field slots; a field with both consumes one slot. Unique fields still consume a slot even with indexed:false. Existing fields are unchanged. Minimal field example: {\"name\":\"notes\",\"type\":\"string\",\"indexed\":false}. JSON and link fields cannot be indexed. Limits: 64 fields and 16 indexed or unique fields per table (400 LIMIT_EXCEEDED). Unlike Supabase, schema evolution uses field definitions rather than ALTER TABLE statements or SQL migrations.",
7330
7464
  "http": "POST",
7331
7465
  "path": "/database/v1/databases/{database_id}/tables/{table}/fields",
7332
7466
  "streaming": "no",
@@ -7495,7 +7629,7 @@ export const operations = [
7495
7629
  "resource": "file.files",
7496
7630
  "method": "create",
7497
7631
  "summary": "Upload file",
7498
- "description": "Upload a file to reuse in conversations or attach to a knowledge base. Unlike OpenAI Files, uploads must be nonempty and at most 104857600 bytes, and only user_data, assistants and vision purposes are accepted. Send file bytes as a multipart file part, not a filename or file ID; in the SDK use a File or Blob, for example new File([\"Return within 23 days.\"], \"policy.txt\", { type: \"text/plain\" }). Content determines the MIME type. Supported uploads include PDF, DOCX/XLSX/PPTX, PNG/JPEG/GIF/WebP, MP3/WAV/FLAC/OGG/M4A, MP4/WebM, and UTF-8 JSON/NDJSON/CSV/Markdown/plain text; empty, unsupported, oversized files and unsupported purposes return 400. OpenAI Uploads chunking is not supported. The purpose vision accepts only PNG, JPEG, GIF and WebP, while conversation images require user_data. The returned ID belongs to your tenant; upload alone does not ingest the file into Knowledge. Knowledge attachment has a lower limit of 100000000 bytes. Optionally set expires_after[anchor]=created_at with expires_after[seconds] (3600–2592000), or praxis[expires_in_seconds] (3600–7776000), never both. Without expiry, the file persists until deleted.",
7632
+ "description": "Upload a file to reuse in conversations or attach to a knowledge base. Unlike OpenAI Files, uploads must be nonempty and at most 100000000 bytes, and only user_data, assistants and vision purposes are accepted. Send file bytes as a multipart file part, not a filename or file ID; in the SDK use a File or Blob, for example new File([\"Return within 23 days.\"], \"policy.txt\", { type: \"text/plain\" }). Content determines the MIME type. Supported uploads include PDF, DOCX/XLSX/PPTX, PNG/JPEG/GIF/WebP, MP3/WAV/FLAC/OGG/M4A, MP4/WebM, and UTF-8 JSON/NDJSON/CSV/Markdown/plain text; empty, unsupported, oversized files and unsupported purposes return 400. Use Uploads for larger files. The purpose vision accepts only PNG, JPEG, GIF and WebP, while conversation images require user_data. The returned ID belongs to your tenant; upload alone does not ingest the file into Knowledge. Knowledge attachment has a lower limit of 100000000 bytes. Optionally set expires_after[anchor]=created_at with expires_after[seconds] (3600–2592000), or praxis[expires_in_seconds] (3600–7776000), never both. Without expiry, the file persists until deleted.",
7499
7633
  "http": "POST",
7500
7634
  "path": "/file/v1/files",
7501
7635
  "streaming": "no",
@@ -7510,7 +7644,7 @@ export const operations = [
7510
7644
  "name": "file",
7511
7645
  "type": "string",
7512
7646
  "required": true,
7513
- "description": "File bytes in one multipart file part, not a filename or file ID. The file must be nonempty and at most 104857600 bytes; its content determines the MIME type."
7647
+ "description": "File bytes in one multipart file part, not a filename or file ID. The file must be nonempty and at most 100000000 bytes; its content determines the MIME type."
7514
7648
  },
7515
7649
  {
7516
7650
  "name": "purpose",
@@ -7559,7 +7693,7 @@ export const operations = [
7559
7693
  "resource": "file.files",
7560
7694
  "method": "retrieve",
7561
7695
  "summary": "Retrieve file",
7562
- "description": "Retrieve metadata for a live file owned by your tenant. Use its file_dp_ ID from upload or list. Missing, deleted, expired and other-tenant files return 404; use the content endpoint to download the bytes.",
7696
+ "description": "Retrieve metadata for a live file owned by your tenant. Use its file- ID from upload or list. Missing, deleted, expired and other-tenant files return 404; use the content endpoint to download the bytes.",
7563
7697
  "http": "GET",
7564
7698
  "path": "/file/v1/files/{file_id}",
7565
7699
  "streaming": "no",
@@ -7576,7 +7710,7 @@ export const operations = [
7576
7710
  "resource": "file.files",
7577
7711
  "method": "retrieveContent",
7578
7712
  "summary": "Retrieve file content",
7579
- "description": "Download the original bytes of a live file owned by your tenant. Supply its file_dp_ ID from upload or list. A single byte Range can return a partial response; a range outside the file returns 416. Missing, deleted, expired and other-tenant files return 404.",
7713
+ "description": "Download the original bytes of a live file owned by your tenant. Supply its file- ID from upload or list. A single byte Range can return a partial response; a range outside the file returns 416. Missing, deleted, expired and other-tenant files return 404.",
7580
7714
  "http": "GET",
7581
7715
  "path": "/file/v1/files/{file_id}/content",
7582
7716
  "streaming": "no",
@@ -7589,6 +7723,152 @@ export const operations = [
7589
7723
  ],
7590
7724
  "query": []
7591
7725
  },
7726
+ {
7727
+ "resource": "file.uploads",
7728
+ "method": "create",
7729
+ "summary": "Create an upload",
7730
+ "description": "Start a multipart upload for a file larger than the 100000000-byte direct-upload limit. Supply the exact byte length, filename, MIME type and purpose. Unlike OpenAI, uploads accept at most 2 GiB (2147483648 bytes) and only user_data, assistants and vision purposes. Add parts of at most 64000000 bytes and complete within one hour. Optional part_size enables fixed-size, retryable parts. expires_after applies to the resulting file (3600–7776000 seconds on this own face); without it the file persists until deleted.",
7731
+ "http": "POST",
7732
+ "path": "/file/v1/uploads",
7733
+ "streaming": "no",
7734
+ "pagination": false,
7735
+ "pathParams": [],
7736
+ "query": [],
7737
+ "body": {
7738
+ "required": true,
7739
+ "fields": [
7740
+ {
7741
+ "name": "bytes",
7742
+ "type": "integer",
7743
+ "required": true,
7744
+ "description": "Exact complete file length in bytes, from 1 through 2147483648 (2 GiB); the sum of completed parts must match."
7745
+ },
7746
+ {
7747
+ "name": "filename",
7748
+ "type": "string",
7749
+ "required": true,
7750
+ "description": "Filename for the resulting file, at most 255 UTF-8 bytes."
7751
+ },
7752
+ {
7753
+ "name": "mime_type",
7754
+ "type": "string",
7755
+ "required": true,
7756
+ "description": "Declared MIME type; validated against the assembled content."
7757
+ },
7758
+ {
7759
+ "name": "purpose",
7760
+ "type": "string",
7761
+ "enum": [
7762
+ "user_data",
7763
+ "assistants",
7764
+ "vision"
7765
+ ],
7766
+ "required": true,
7767
+ "description": "Use user_data for conversation attachments, assistants for assistant files, or vision for PNG, JPEG, GIF and WebP images."
7768
+ },
7769
+ {
7770
+ "name": "expires_after",
7771
+ "type": "object",
7772
+ "required": false,
7773
+ "description": "Optional expiry policy for the resulting file; omission retains the file until deletion."
7774
+ },
7775
+ {
7776
+ "name": "part_size",
7777
+ "type": "integer",
7778
+ "required": false,
7779
+ "description": "Optional fixed part size in bytes, 5242880–64000000. Requires part_number on every part; retries of identical bytes at the same number return the same part. Omit to use arbitrary-sized parts."
7780
+ }
7781
+ ]
7782
+ }
7783
+ },
7784
+ {
7785
+ "resource": "file.uploads",
7786
+ "method": "cancel",
7787
+ "summary": "Cancel an upload",
7788
+ "description": "Cancel an unfinished upload using upload_id from create and release its reserved storage. Further parts and completion are rejected. Cancelling an already cancelled upload returns the same terminal result; a completed upload cannot be cancelled. Delete its resulting file instead.",
7789
+ "http": "POST",
7790
+ "path": "/file/v1/uploads/{upload_id}/cancel",
7791
+ "streaming": "no",
7792
+ "pagination": false,
7793
+ "pathParams": [
7794
+ {
7795
+ "name": "upload_id",
7796
+ "sdkName": "upload_id"
7797
+ }
7798
+ ],
7799
+ "query": []
7800
+ },
7801
+ {
7802
+ "resource": "file.uploads",
7803
+ "method": "complete",
7804
+ "summary": "Complete an upload",
7805
+ "description": "Assemble the uploaded parts into a file. Supply upload_id from create and part_ids from addPart in file byte order; their sizes must total the declared bytes. Optional md5 verifies the assembled content. Retrying identical part_ids and normalized md5 returns the same result; different inputs return 409. Unlike OpenAI, completed can contain a file still processing (status uploaded). Poll files.retrieve using file.id until status processed (own face state active); error, expiry or 404 means processing failed and the file cannot be used.",
7806
+ "http": "POST",
7807
+ "path": "/file/v1/uploads/{upload_id}/complete",
7808
+ "streaming": "no",
7809
+ "pagination": false,
7810
+ "pathParams": [
7811
+ {
7812
+ "name": "upload_id",
7813
+ "sdkName": "upload_id"
7814
+ }
7815
+ ],
7816
+ "query": [],
7817
+ "body": {
7818
+ "required": true,
7819
+ "fields": [
7820
+ {
7821
+ "name": "part_ids",
7822
+ "type": "array",
7823
+ "itemType": "string",
7824
+ "required": true,
7825
+ "description": "All part IDs in concatenation order, without duplicates. Fixed-size uploads require increasing part_number order."
7826
+ },
7827
+ {
7828
+ "name": "md5",
7829
+ "type": "string",
7830
+ "required": false,
7831
+ "description": "Optional whole-file MD5 as 32 hexadecimal characters; verified after assembly."
7832
+ }
7833
+ ]
7834
+ }
7835
+ },
7836
+ {
7837
+ "resource": "file.uploads.parts",
7838
+ "method": "create",
7839
+ "summary": "Add an upload part",
7840
+ "description": "Send one nonempty part as the multipart data field, at most 64000000 bytes. Parts may arrive concurrently in any order. Use upload_id from create. For a fixed-size upload, supply part_number starting at 1 and exactly part_size bytes except for the final remainder; retry the same number with identical bytes to recover its part ID. Without part_size, each request creates a new part and part_number is ignored. Save the returned part IDs for complete.",
7841
+ "http": "POST",
7842
+ "path": "/file/v1/uploads/{upload_id}/parts",
7843
+ "streaming": "no",
7844
+ "pagination": false,
7845
+ "multipart": true,
7846
+ "pathParams": [
7847
+ {
7848
+ "name": "upload_id",
7849
+ "sdkName": "upload_id"
7850
+ }
7851
+ ],
7852
+ "query": [
7853
+ {
7854
+ "name": "part_number",
7855
+ "type": "integer",
7856
+ "required": false,
7857
+ "description": "Required when create set part_size; 1 through ceil(bytes / part_size). Ignored for general uploads."
7858
+ }
7859
+ ],
7860
+ "body": {
7861
+ "required": true,
7862
+ "fields": [
7863
+ {
7864
+ "name": "data",
7865
+ "type": "string",
7866
+ "required": true,
7867
+ "description": "Raw bytes of this part, nonempty and at most 64000000 bytes."
7868
+ }
7869
+ ]
7870
+ }
7871
+ },
7592
7872
  {
7593
7873
  "resource": "knowledge.vectorStores",
7594
7874
  "method": "list",
@@ -11719,7 +11999,7 @@ export const operations = [
11719
11999
  "name": "message",
11720
12000
  "type": "string",
11721
12001
  "required": true,
11722
- "description": "Problem description and original error text; at most 4096 Unicode code points."
12002
+ "description": "Problem description, at most 4096 Unicode code points; may be empty only when contexts.praxis.error.message is a non-empty string."
11723
12003
  },
11724
12004
  {
11725
12005
  "name": "contact_email",