@deepraxis/sdk 0.1.0-dev.9d9e2b6 → 0.1.0-dev.c01abef

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.
@@ -61,7 +61,7 @@ export const operations = [
61
61
  "resource": "agent.agents",
62
62
  "method": "create",
63
63
  "summary": "Create agent",
64
- "description": "Create a reusable agent definition, then pass its returned id to sessions.create to start a conversation. The definition includes model, system prompt, tools, MCP servers and an optional multiagent roster. It is saved as version 1; real updates create new versions. Unlike Anthropic Managed Agents, nonempty skills attachments and custom tool entries return 400; the native skill tool is separate from the skills field. Use tools: [{type: \"agent_toolset_20260401\"}] for built-in tools including codemode, skill and agent; inspect toolsets.list for names and schemas, and keep bash enabled for native additions. To offer only some tools, set default_config: {enabled: false} and list the tools to keep in configs, e.g. tools: [{type: \"agent_toolset_20260401\", default_config: {enabled: false}, configs: [{name: \"codemode\", enabled: true}, {name: \"bash\", enabled: true, permission_policy: {type: \"always_ask\"}}]}]; every tool not listed, including todo_write, enter_plan_mode, ask_user_question and goal_read, follows default_config, and the response echoes it. codemode runs through bash, so enabling codemode while bash is disabled returns 400. Optional mcp_toolset entries pair with mcp_servers. model accepts platform model IDs such as deepseek-flash, not only the Claude IDs in the protocol examples. model.settings.reasoning sets default thinking; other extra model controls return 400. Example: {\"name\":\"helper\",\"model\":{\"id\":\"deepseek-flash\"},\"tools\":[{\"type\":\"agent_toolset_20260401\"}]}.",
64
+ "description": "Create a reusable agent definition, then pass its returned id to sessions.create to start a conversation. The definition includes model, system prompt, tools, MCP servers and an optional multiagent roster. It is saved as version 1; real updates create new versions. Unlike Anthropic Managed Agents, nonempty skills attachments return 400; the native skill tool is separate from the skills field. Use tools: [{type: \"agent_toolset_20260401\"}] for built-in tools including codemode, skill and agent; inspect toolsets.list for names and schemas, and keep bash enabled for native additions. To offer only some tools, set default_config: {enabled: false} and list the tools to keep in configs, e.g. tools: [{type: \"agent_toolset_20260401\", default_config: {enabled: false}, configs: [{name: \"codemode\", enabled: true}, {name: \"bash\", enabled: true, permission_policy: {type: \"always_ask\"}}]}]; every tool not listed, including todo_write, enter_plan_mode, ask_user_question and goal_read, follows default_config, and the response echoes it. codemode runs through bash, so enabling codemode while bash is disabled returns 400. Optional mcp_toolset entries pair with mcp_servers. model accepts platform model IDs such as deepseek-flash, not only the Claude IDs in the protocol examples. model.settings.reasoning sets default thinking; other extra model controls return 400. Example: {\"name\":\"helper\",\"model\":{\"id\":\"deepseek-flash\"},\"tools\":[{\"type\":\"agent_toolset_20260401\"}]}.",
65
65
  "http": "POST",
66
66
  "path": "/agent/v1/agents",
67
67
  "streaming": "no",
@@ -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
  }
@@ -207,7 +239,7 @@ export const operations = [
207
239
  "resource": "agent.agents",
208
240
  "method": "update",
209
241
  "summary": "Update agent",
210
- "description": "Update an agent. Send the current version in the body for optimistic concurrency: a stale version returns 409, and an update that changes nothing keeps the version number. Any real change saves a new version; existing sessions keep the version they were created with. Omitted fields keep their value. multiagent takes null or a coordinator roster; subagent_model keeps its value when omitted and is cleared by null. Archived agents cannot be updated. Unlike Anthropic Managed Agents, nonempty skills attachments and custom tools return 400; use the native skill tool for available runtime skills.",
242
+ "description": "Update an agent. Send the current version in the body for optimistic concurrency: a stale version returns 409, and an update that changes nothing keeps the version number. Any real change saves a new version; existing sessions keep the version they were created with. Omitted fields keep their value. multiagent takes null or a coordinator roster; subagent_model keeps its value when omitted and is cleared by null. Archived agents cannot be updated. Unlike Anthropic Managed Agents, nonempty skills attachments return 400; use the native skill tool for available runtime skills.",
211
243
  "http": "POST",
212
244
  "path": "/agent/v1/agents/{agent_id}",
213
245
  "streaming": "no",
@@ -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
  }
@@ -353,6 +417,192 @@ export const operations = [
353
417
  ],
354
418
  "query": []
355
419
  },
420
+ {
421
+ "resource": "agent.agents.endUsers",
422
+ "method": "list",
423
+ "summary": "List End Users",
424
+ "description": "List users who have sessions or token issuance history on a service agent.\n\nOrdered by last_active_at and external_user_id descending. q is a case-sensitive literal prefix, including underscores. limit is 1–100, default 20. Reuse next_page with the same organization, agent, q and limit. Preemptively blocked users without history do not appear. End-user credentials and inaccessible or personal agents return 404.",
425
+ "http": "GET",
426
+ "path": "/agent/v1/agents/{agent_id}/end_users",
427
+ "streaming": "no",
428
+ "pagination": false,
429
+ "pathParams": [
430
+ {
431
+ "name": "agent_id",
432
+ "sdkName": "agent_id"
433
+ }
434
+ ],
435
+ "query": [
436
+ {
437
+ "name": "limit",
438
+ "type": "integer",
439
+ "required": false,
440
+ "description": "Maximum users per page; defaults to 20."
441
+ },
442
+ {
443
+ "name": "page",
444
+ "type": "string",
445
+ "required": false,
446
+ "description": "next_page from the previous response with the same agent, q and limit."
447
+ },
448
+ {
449
+ "name": "q",
450
+ "type": "string",
451
+ "required": false,
452
+ "description": "Case-sensitive literal prefix of external_user_id; omit or use an empty string for all users."
453
+ }
454
+ ]
455
+ },
456
+ {
457
+ "resource": "agent.agents.endUsers",
458
+ "method": "delete",
459
+ "summary": "Delete end-user data",
460
+ "description": "Delete a host application's end-user data from one service agent after explicit confirmation.\n\nDevelop only. Set confirm to the exact external_user_id; missing or mismatched confirmation returns 400. Returns 202 with a pending task id, not completion. Poll the deletion endpoint. Concurrent requests reuse the unfinished task; retry DELETE after failure to resume it. Tokens are revoked and the user is blocked before a seven-day recovery snapshot is verified. Sessions including child sessions, conversation data, grants and feedback are then removed. A pre-existing block remains; a temporary block is removed on success. Attachment metadata is recorded and File attachments are retained. No charge is introduced by this operation. Example: DELETE /agent/v1/agents/agent_example/end_users/customer_123?confirm=customer_123.",
461
+ "http": "DELETE",
462
+ "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
463
+ "streaming": "no",
464
+ "pagination": false,
465
+ "pathParams": [
466
+ {
467
+ "name": "agent_id",
468
+ "sdkName": "agent_id"
469
+ },
470
+ {
471
+ "name": "external_user_id",
472
+ "sdkName": "external_user_id"
473
+ }
474
+ ],
475
+ "query": [
476
+ {
477
+ "name": "confirm",
478
+ "type": "string",
479
+ "required": true,
480
+ "description": "Must exactly equal the external_user_id path parameter to confirm destructive deletion."
481
+ }
482
+ ]
483
+ },
484
+ {
485
+ "resource": "agent.agents.endUsers",
486
+ "method": "retrieve",
487
+ "summary": "Get End User",
488
+ "description": "Inspect one end user and their twenty most recently updated sessions.\n\nUse external_user_id from listing or your host application. Users without session or issuance history return 404, including preemptively blocked users. End-user credentials and inaccessible or personal agents return 404.",
489
+ "http": "GET",
490
+ "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
491
+ "streaming": "no",
492
+ "pagination": false,
493
+ "pathParams": [
494
+ {
495
+ "name": "agent_id",
496
+ "sdkName": "agent_id"
497
+ },
498
+ {
499
+ "name": "external_user_id",
500
+ "sdkName": "external_user_id"
501
+ }
502
+ ],
503
+ "query": []
504
+ },
505
+ {
506
+ "resource": "agent.agents.endUsers.block",
507
+ "method": "create",
508
+ "summary": "Block End User",
509
+ "description": "Block token issuance and session creation, then revoke existing tokens for an end user.\n\nMay block a user before any history exists; timestamps are then null and counts and cost are zero. Requires an embed policy, otherwise returns 409 with setup guidance. Deduplicates the policy blocklist and retains its 1000-user maximum. If revocation returns 502, the user remains blocked; retry to finish revocation. Repeats keep the user blocked and revoke any remaining grants. End-user credentials and inaccessible or personal agents return 404.",
510
+ "http": "POST",
511
+ "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/block",
512
+ "streaming": "no",
513
+ "pagination": false,
514
+ "pathParams": [
515
+ {
516
+ "name": "agent_id",
517
+ "sdkName": "agent_id"
518
+ },
519
+ {
520
+ "name": "external_user_id",
521
+ "sdkName": "external_user_id"
522
+ }
523
+ ],
524
+ "query": []
525
+ },
526
+ {
527
+ "resource": "agent.agents.endUsers",
528
+ "method": "retrieveDeletion",
529
+ "summary": "Get end-user deletion",
530
+ "description": "Poll the latest deletion task for an end user, including after the user data has been removed.\n\nUse the same agent_id and external_user_id as the confirmed DELETE. Status is pending, snapshotting, deleting, done or failed. Counts are empty until a verified snapshot exists. A failed task remains blocked and resumes when DELETE is retried with matching confirmation. snapshot_key is an operator recovery reference retained for seven days, not a public download URL. End-user credentials, inaccessible or personal agents, and missing tasks return 404. This read does not create a task or charge usage.",
531
+ "http": "GET",
532
+ "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/deletion",
533
+ "streaming": "no",
534
+ "pagination": false,
535
+ "pathParams": [
536
+ {
537
+ "name": "agent_id",
538
+ "sdkName": "agent_id"
539
+ },
540
+ {
541
+ "name": "external_user_id",
542
+ "sdkName": "external_user_id"
543
+ }
544
+ ],
545
+ "query": []
546
+ },
547
+ {
548
+ "resource": "agent.agents.endUsers.revokeTokens",
549
+ "method": "create",
550
+ "summary": "Revoke End User Tokens",
551
+ "description": "Revoke all issued tokens for an end user and terminate their open embed streams.\n\nRevokes credentials before marking grants revoked. Upstream failure returns 502 without changing grant revocation timestamps. Returns the count of newly revoked grants; a repeat without new grants returns zero. Does not block future issuance. End-user credentials and inaccessible or personal agents return 404.",
552
+ "http": "POST",
553
+ "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/revoke_tokens",
554
+ "streaming": "no",
555
+ "pagination": false,
556
+ "pathParams": [
557
+ {
558
+ "name": "agent_id",
559
+ "sdkName": "agent_id"
560
+ },
561
+ {
562
+ "name": "external_user_id",
563
+ "sdkName": "external_user_id"
564
+ }
565
+ ],
566
+ "query": []
567
+ },
568
+ {
569
+ "resource": "agent.agents.endUsers.unblock",
570
+ "method": "create",
571
+ "summary": "Unblock End User",
572
+ "description": "Allow an end user to receive new tokens and create new sessions again.\n\nRemoves the user from the blocklist; previously revoked tokens stay revoked. Idempotent. Requires an embed policy, otherwise returns 409 with setup guidance. Returns null timestamps and zero counts and cost when no session or issuance history exists. End-user credentials and inaccessible or personal agents return 404.",
573
+ "http": "POST",
574
+ "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/unblock",
575
+ "streaming": "no",
576
+ "pagination": false,
577
+ "pathParams": [
578
+ {
579
+ "name": "agent_id",
580
+ "sdkName": "agent_id"
581
+ },
582
+ {
583
+ "name": "external_user_id",
584
+ "sdkName": "external_user_id"
585
+ }
586
+ ],
587
+ "query": []
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
+ },
356
606
  {
357
607
  "resource": "agent.agents.versions",
358
608
  "method": "list",
@@ -548,7 +798,7 @@ export const operations = [
548
798
  "resource": "agent.computers",
549
799
  "method": "connect",
550
800
  "summary": "Connect computer",
551
- "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. 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.",
552
802
  "http": "POST",
553
803
  "path": "/agent/v1/computers/{computer_id}/connect",
554
804
  "streaming": "no",
@@ -559,7 +809,22 @@ export const operations = [
559
809
  "sdkName": "computer_id"
560
810
  }
561
811
  ],
562
- "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
+ }
563
828
  },
564
829
  {
565
830
  "resource": "agent.computers.files",
@@ -609,6 +874,48 @@ export const operations = [
609
874
  }
610
875
  ]
611
876
  },
877
+ {
878
+ "resource": "agent.computers.leases",
879
+ "method": "delete",
880
+ "summary": "Release computer lease",
881
+ "description": "Give the lease back when a connection closes so the full machine can be reclaimed without waiting for it to expire.\n\nOwn-face extension. Idempotent: an unknown or already released lease succeeds as well. Foreign or absent computers return 404.",
882
+ "http": "DELETE",
883
+ "path": "/agent/v1/computers/{computer_id}/leases/{lease_id}",
884
+ "streaming": "no",
885
+ "pagination": false,
886
+ "pathParams": [
887
+ {
888
+ "name": "computer_id",
889
+ "sdkName": "computer_id"
890
+ },
891
+ {
892
+ "name": "lease_id",
893
+ "sdkName": "lease_id"
894
+ }
895
+ ],
896
+ "query": []
897
+ },
898
+ {
899
+ "resource": "agent.computers.leases.renew",
900
+ "method": "create",
901
+ "summary": "Renew computer lease",
902
+ "description": "Extend the lease a connection holds so the full machine stays in service while the connection is open.\n\nOwn-face extension. A lease that is no longer valid (released, expired, or the computer moved to another machine) returns 409 LEASE_STALE; call connect again for a new connection and lease. Foreign or absent computers return 404.",
903
+ "http": "POST",
904
+ "path": "/agent/v1/computers/{computer_id}/leases/{lease_id}/renew",
905
+ "streaming": "no",
906
+ "pagination": false,
907
+ "pathParams": [
908
+ {
909
+ "name": "computer_id",
910
+ "sdkName": "computer_id"
911
+ },
912
+ {
913
+ "name": "lease_id",
914
+ "sdkName": "lease_id"
915
+ }
916
+ ],
917
+ "query": []
918
+ },
612
919
  {
613
920
  "resource": "agent.deploymentRuns",
614
921
  "method": "list",
@@ -1026,6 +1333,41 @@ export const operations = [
1026
1333
  ],
1027
1334
  "query": []
1028
1335
  },
1336
+ {
1337
+ "resource": "agent.embed",
1338
+ "method": "retrieveAppearance",
1339
+ "summary": "Read chat appearance",
1340
+ "description": "Load saved appearance for an iframe or Hosted chat page. Supply an end-user embed token as Bearer authorization, or a console-issued publishable key in Praxis-Publishable-Key before anonymous token issuance. The credential selects the agent; identity_number and agent_id query parameters are rejected with 400. Missing appearance returns an empty object. Kit option names retain camelCase. Responses are private and cacheable for 60 seconds. Component hosts configure Kit in their own code instead.",
1341
+ "http": "GET",
1342
+ "path": "/agent/v1/embed/appearance",
1343
+ "streaming": "no",
1344
+ "pagination": false,
1345
+ "pathParams": [],
1346
+ "query": []
1347
+ },
1348
+ {
1349
+ "resource": "agent.embed.exchange",
1350
+ "method": "create",
1351
+ "summary": "Exchange Hosted Code",
1352
+ "description": "Redeem a single-use hosted link credential for an end-user token.\n\nRead code from the c fragment parameter of hosted_url returned by embed token creation with hosted true, then remove the fragment before exchanging. No Authorization header is required; the code authenticates this request. The code expires after 60 seconds and is consumed atomically on exchange, so concurrent attempts have only one winner. Expired, used and unknown codes return the same 404 body. Keep the token in memory and return to the host website for a fresh link when it expires; exchange cannot refresh it. Requests are IP limited per minute using the anonymous entrypoint budget (default 20). Example body is {\"code\":\"<code from hosted_url>\"}.",
1353
+ "http": "POST",
1354
+ "path": "/agent/v1/embed/exchange",
1355
+ "streaming": "no",
1356
+ "pagination": false,
1357
+ "pathParams": [],
1358
+ "query": [],
1359
+ "body": {
1360
+ "required": true,
1361
+ "fields": [
1362
+ {
1363
+ "name": "code",
1364
+ "type": "string",
1365
+ "required": true,
1366
+ "description": "Single-use credential from the c fragment parameter of hosted_url returned by embed token creation. Valid for 60 seconds."
1367
+ }
1368
+ ]
1369
+ }
1370
+ },
1029
1371
  {
1030
1372
  "resource": "agent.embedTokens",
1031
1373
  "method": "list",
@@ -1067,7 +1409,7 @@ export const operations = [
1067
1409
  "resource": "agent.embedTokens",
1068
1410
  "method": "create",
1069
1411
  "summary": "Create Embed Token",
1070
- "description": "Issue a short-lived credential on your backend for an end user of a service agent.\n\nRequires an active service agent in your organization with an embed policy. Pins the requested version or the latest version and snapshots the policy environment, vaults and resources; metadata comes from the request. Blocked users cannot receive tokens. Keep your API key on the backend and pass only the returned token to the frontend. Every call creates a new grant; issuance is not idempotent. The hosted field is not supported.",
1412
+ "description": "Issue a short-lived credential on your backend for an end user of a service agent.\n\nRequires an active service agent in your organization with an embed policy. Pins the requested version or the latest version and snapshots the policy environment, vaults and resources; metadata comes from the request. Blocked users cannot receive tokens. Keep your API key on the backend and pass only the returned token to the frontend. Every call creates a new grant; issuance is not idempotent. Set hosted to true to also receive hosted_url; redirect the user there within 60 seconds. The agent must have an identity_number. The URL fragment contains a single-use exchange credential, not the token. Omit hosted or set false for ordinary token issuance.",
1071
1413
  "http": "POST",
1072
1414
  "path": "/agent/v1/embed_tokens",
1073
1415
  "streaming": "no",
@@ -1077,6 +1419,12 @@ export const operations = [
1077
1419
  "body": {
1078
1420
  "required": true,
1079
1421
  "fields": [
1422
+ {
1423
+ "name": "hosted",
1424
+ "type": "boolean",
1425
+ "required": false,
1426
+ "description": "Set true to also return a hosted chat URL with a single-use credential valid for 60 seconds. Defaults to false; the agent must have an identity_number."
1427
+ },
1080
1428
  {
1081
1429
  "name": "agent",
1082
1430
  "type": "string",
@@ -1136,6 +1484,35 @@ export const operations = [
1136
1484
  ]
1137
1485
  }
1138
1486
  },
1487
+ {
1488
+ "resource": "agent.embedTokens.anonymous",
1489
+ "method": "create",
1490
+ "summary": "Issue anonymous visitor token",
1491
+ "description": "Obtain a short-lived embedding token for a visitor without an account using the agent owner's publishable key.\n\nNo Authorization header is required. Send the browser Origin allowed by the agent policy. Save a returned visitor_secret and reuse it for refreshes; only new visitors receive one. Unknown secrets create new visitors, and extra fields including visitor_id return 400. Issuance uses the key creator's organization membership, the key session budget and the smaller of the policy TTL maximum and 3600 seconds. IP requests are limited per minute (default 20); UTC daily session and spending caps are checked across the key's primary sessions created that day. Token issuance itself does not create a session or charge usage; subsequent sessions bill the host organization. Example body: {\"publishable_key\":\"pk_praxis_example\"}.",
1492
+ "http": "POST",
1493
+ "path": "/agent/v1/embed_tokens/anonymous",
1494
+ "streaming": "no",
1495
+ "pagination": false,
1496
+ "pathParams": [],
1497
+ "query": [],
1498
+ "body": {
1499
+ "required": true,
1500
+ "fields": [
1501
+ {
1502
+ "name": "publishable_key",
1503
+ "type": "string",
1504
+ "required": true,
1505
+ "description": "Public key created by the service agent owner; safe to include in browser code."
1506
+ },
1507
+ {
1508
+ "name": "visitor_secret",
1509
+ "type": "string",
1510
+ "required": false,
1511
+ "description": "Secret returned by a previous anonymous issuance for this key. Omit for a new visitor; an unknown secret creates a new visitor."
1512
+ }
1513
+ ]
1514
+ }
1515
+ },
1139
1516
  {
1140
1517
  "resource": "agent.embedTokens.revoke",
1141
1518
  "method": "create",
@@ -1432,6 +1809,25 @@ export const operations = [
1432
1809
  "type": "string",
1433
1810
  "required": false,
1434
1811
  "description": "Opaque pagination cursor: pass the next_page value of the previous response unchanged. Omit it for the first page. A cursor from a different query or a malformed one returns 400."
1812
+ },
1813
+ {
1814
+ "name": "external_user_id",
1815
+ "type": "string",
1816
+ "required": false,
1817
+ "description": "Filter by an exact end-user identifier (1–128 characters: A-Z, a-z, 0-9, underscore, dot, colon, at sign or hyphen). Keep this filter unchanged when following page."
1818
+ },
1819
+ {
1820
+ "name": "source",
1821
+ "type": "string",
1822
+ "enum": [
1823
+ "kit",
1824
+ "iframe",
1825
+ "hosted",
1826
+ "api",
1827
+ "automation"
1828
+ ],
1829
+ "required": false,
1830
+ "description": "Filter by session origin: kit, iframe, hosted, api or automation. Keep this filter unchanged when following page."
1435
1831
  }
1436
1832
  ]
1437
1833
  },
@@ -1439,7 +1835,7 @@ export const operations = [
1439
1835
  "resource": "agent.sessions",
1440
1836
  "method": "create",
1441
1837
  "summary": "Create session",
1442
- "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.",
1443
1839
  "http": "POST",
1444
1840
  "path": "/agent/v1/sessions",
1445
1841
  "streaming": "no",
@@ -1459,7 +1855,7 @@ export const operations = [
1459
1855
  "name": "environment_id",
1460
1856
  "type": "string",
1461
1857
  "required": false,
1462
- "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."
1463
1859
  },
1464
1860
  {
1465
1861
  "name": "budget",
@@ -1533,6 +1929,23 @@ export const operations = [
1533
1929
  ]
1534
1930
  }
1535
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
+ },
1536
1949
  {
1537
1950
  "resource": "agent.sessions",
1538
1951
  "method": "retrieve",
@@ -1791,7 +2204,7 @@ export const operations = [
1791
2204
  "resource": "agent.sessions.events",
1792
2205
  "method": "list",
1793
2206
  "summary": "List session events",
1794
- "description": "Read the event history of a session as a page of events, oldest first by default (order=desc for newest first). Use it after sending a message to collect the reply, to find tool calls that wait for approval (session.status_idle with stop_reason requires_action lists their event_ids), or to audit a run; to follow a running session live use sessions.events.stream instead. Filter by types and by a created_at range on processed_at; pages hold at most 100 events (default 20) and next_page continues. A failed run emits session.error before session.status_terminated. Native history also includes user.steer, user.withdraw, system.notification, session.forked, session.goal_changed and session.goal_verification; these are not accepted by the /anthropic/v1 event-type filter.",
2207
+ "description": "Read the event history of a session as a page of events, oldest first by default (order=desc for newest first). Use it after sending a message to collect the reply, to find tool calls that wait for approval or client custom tool results (session.status_idle with stop_reason requires_action lists their event_ids), or to audit a run; to follow a running session live use sessions.events.stream instead. Filter by types and by a created_at range on processed_at; pages hold at most 100 events (default 20) and next_page continues. A failed run emits session.error before session.status_terminated. Native history also includes user.steer, user.withdraw, system.notification, session.forked, session.goal_changed and session.goal_verification; these are not accepted by the /anthropic/v1 event-type filter.",
1795
2208
  "http": "GET",
1796
2209
  "path": "/agent/v1/sessions/{session_id}/events",
1797
2210
  "streaming": "no",
@@ -1862,7 +2275,7 @@ export const operations = [
1862
2275
  "resource": "agent.sessions.events",
1863
2276
  "method": "send",
1864
2277
  "summary": "Send session events",
1865
- "description": "Send events to a session: user.message (exactly one nonempty text block), user.interrupt, user.tool_confirmation to allow or deny a pending tool call, user.steer to inject a queued user.message into a turn that is still running, and user.withdraw to retract a queued message. The response only acknowledges the inputs; read replies with sessions.events.list or sessions.events.stream. A message sent while the session waits for tool approval is queued (processed_at null) and runs in order after the approval is resolved. Archived sessions reject new messages. To approve, read a pending agent.tool_use or agent.mcp_tool_use event and send {type: \"user.tool_confirmation\", tool_use_id: <that event id>, result: \"allow\"} (or deny); include session_thread_id for a child approval. Native confirmations also accept updated_permissions, answers and annotations, which /anthropic/v1 rejects.",
2278
+ "description": "Attach optional praxis_context={items:[{name,value}]} to user.message for untrusted page context on this turn only (maximum 32 items, 4096 UTF-8 JSON bytes). /anthropic/v1 rejects this field. Send events to a session: user.message (exactly one nonempty text block), user.interrupt, user.tool_confirmation to allow or deny a pending tool call, user.custom_tool_result to return a custom tool result, user.steer to inject a queued user.message into a turn that is still running, and user.withdraw to retract a queued message. The response only acknowledges the inputs; read replies with sessions.events.list or sessions.events.stream. A message sent while the session waits for tool approval is queued (processed_at null) and runs in order after the approval is resolved. Archived sessions reject new messages. To approve, read a pending agent.tool_use or agent.mcp_tool_use event and send {type: \"user.tool_confirmation\", tool_use_id: <that event id>, result: \"allow\"} (or deny); include session_thread_id for a child approval. Native confirmations also accept updated_permissions, answers and annotations, which /anthropic/v1 rejects. Both faces accept user.custom_tool_result with custom_tool_use_id from agent.custom_tool_use.id or the requires_action stop_reason.event_ids. Unlike Anthropic, result content accepts only text blocks (omit it for an empty array). Omitted or null is_error means false. The server routes child calls by id; session_thread_id is rejected in this input. Unknown call ids return 400; duplicate results or calls no longer waiting return 409.",
1866
2279
  "http": "POST",
1867
2280
  "path": "/agent/v1/sessions/{session_id}/events",
1868
2281
  "streaming": "no",
@@ -3026,6 +3439,27 @@ export const operations = [
3026
3439
  ],
3027
3440
  "query": []
3028
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
+ },
3029
3463
  {
3030
3464
  "resource": "automation.actions",
3031
3465
  "method": "list",
@@ -6449,7 +6883,7 @@ export const operations = [
6449
6883
  "name": "{column}",
6450
6884
  "type": "string",
6451
6885
  "required": false,
6452
- "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."
6453
6887
  },
6454
6888
  {
6455
6889
  "name": "and",
@@ -6497,7 +6931,7 @@ export const operations = [
6497
6931
  "name": "on_conflict",
6498
6932
  "type": "string",
6499
6933
  "required": false,
6500
- "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."
6501
6935
  },
6502
6936
  {
6503
6937
  "name": "columns",
@@ -6511,7 +6945,7 @@ export const operations = [
6511
6945
  "resource": "database.databases.rest",
6512
6946
  "method": "retrieve",
6513
6947
  "summary": "Select rows",
6514
- "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.",
6515
6949
  "http": "GET",
6516
6950
  "path": "/database/v1/databases/{database_id}/rest/{table}",
6517
6951
  "streaming": "no",
@@ -6537,7 +6971,7 @@ export const operations = [
6537
6971
  "name": "{column}",
6538
6972
  "type": "string",
6539
6973
  "required": false,
6540
- "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."
6541
6975
  },
6542
6976
  {
6543
6977
  "name": "and",
@@ -6585,7 +7019,7 @@ export const operations = [
6585
7019
  "name": "on_conflict",
6586
7020
  "type": "string",
6587
7021
  "required": false,
6588
- "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."
6589
7023
  },
6590
7024
  {
6591
7025
  "name": "columns",
@@ -6599,7 +7033,7 @@ export const operations = [
6599
7033
  "resource": "database.databases.rest",
6600
7034
  "method": "head",
6601
7035
  "summary": "Count rows",
6602
- "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.",
6603
7037
  "http": "HEAD",
6604
7038
  "path": "/database/v1/databases/{database_id}/rest/{table}",
6605
7039
  "streaming": "no",
@@ -6625,7 +7059,7 @@ export const operations = [
6625
7059
  "name": "{column}",
6626
7060
  "type": "string",
6627
7061
  "required": false,
6628
- "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."
6629
7063
  },
6630
7064
  {
6631
7065
  "name": "and",
@@ -6673,7 +7107,7 @@ export const operations = [
6673
7107
  "name": "on_conflict",
6674
7108
  "type": "string",
6675
7109
  "required": false,
6676
- "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."
6677
7111
  },
6678
7112
  {
6679
7113
  "name": "columns",
@@ -6713,7 +7147,7 @@ export const operations = [
6713
7147
  "name": "{column}",
6714
7148
  "type": "string",
6715
7149
  "required": false,
6716
- "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."
6717
7151
  },
6718
7152
  {
6719
7153
  "name": "and",
@@ -6761,7 +7195,7 @@ export const operations = [
6761
7195
  "name": "on_conflict",
6762
7196
  "type": "string",
6763
7197
  "required": false,
6764
- "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."
6765
7199
  },
6766
7200
  {
6767
7201
  "name": "columns",
@@ -6779,7 +7213,7 @@ export const operations = [
6779
7213
  "resource": "database.databases.rest",
6780
7214
  "method": "create",
6781
7215
  "summary": "Insert rows",
6782
- "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.",
6783
7217
  "http": "POST",
6784
7218
  "path": "/database/v1/databases/{database_id}/rest/{table}",
6785
7219
  "streaming": "no",
@@ -6805,7 +7239,7 @@ export const operations = [
6805
7239
  "name": "{column}",
6806
7240
  "type": "string",
6807
7241
  "required": false,
6808
- "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."
6809
7243
  },
6810
7244
  {
6811
7245
  "name": "and",
@@ -6853,7 +7287,7 @@ export const operations = [
6853
7287
  "name": "on_conflict",
6854
7288
  "type": "string",
6855
7289
  "required": false,
6856
- "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."
6857
7291
  },
6858
7292
  {
6859
7293
  "name": "columns",
@@ -6905,7 +7339,7 @@ export const operations = [
6905
7339
  "resource": "database.databases.tables",
6906
7340
  "method": "create",
6907
7341
  "summary": "Create table",
6908
- "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.",
6909
7343
  "http": "POST",
6910
7344
  "path": "/database/v1/databases/{database_id}/tables",
6911
7345
  "streaming": "no",
@@ -7026,7 +7460,7 @@ export const operations = [
7026
7460
  "resource": "database.databases.tables.fields",
7027
7461
  "method": "create",
7028
7462
  "summary": "Add field",
7029
- "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.",
7030
7464
  "http": "POST",
7031
7465
  "path": "/database/v1/databases/{database_id}/tables/{table}/fields",
7032
7466
  "streaming": "no",
@@ -7195,7 +7629,7 @@ export const operations = [
7195
7629
  "resource": "file.files",
7196
7630
  "method": "create",
7197
7631
  "summary": "Upload file",
7198
- "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.",
7199
7633
  "http": "POST",
7200
7634
  "path": "/file/v1/files",
7201
7635
  "streaming": "no",
@@ -7210,7 +7644,7 @@ export const operations = [
7210
7644
  "name": "file",
7211
7645
  "type": "string",
7212
7646
  "required": true,
7213
- "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."
7214
7648
  },
7215
7649
  {
7216
7650
  "name": "purpose",
@@ -7259,7 +7693,7 @@ export const operations = [
7259
7693
  "resource": "file.files",
7260
7694
  "method": "retrieve",
7261
7695
  "summary": "Retrieve file",
7262
- "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.",
7263
7697
  "http": "GET",
7264
7698
  "path": "/file/v1/files/{file_id}",
7265
7699
  "streaming": "no",
@@ -7276,7 +7710,7 @@ export const operations = [
7276
7710
  "resource": "file.files",
7277
7711
  "method": "retrieveContent",
7278
7712
  "summary": "Retrieve file content",
7279
- "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.",
7280
7714
  "http": "GET",
7281
7715
  "path": "/file/v1/files/{file_id}/content",
7282
7716
  "streaming": "no",
@@ -7289,6 +7723,152 @@ export const operations = [
7289
7723
  ],
7290
7724
  "query": []
7291
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
+ },
7292
7872
  {
7293
7873
  "resource": "knowledge.vectorStores",
7294
7874
  "method": "list",
@@ -11378,15 +11958,8 @@ export const operations = [
11378
11958
  {
11379
11959
  "name": "phase",
11380
11960
  "type": "string",
11381
- "enum": [
11382
- "open",
11383
- "awaiting_customer",
11384
- "in_progress",
11385
- "resolved",
11386
- "closed"
11387
- ],
11388
11961
  "required": false,
11389
- "description": "Only feedback in this phase: open, awaiting_customer, in_progress, resolved or closed; see the phase field of a feedback for what each means."
11962
+ "description": "Only feedback in these phases: a comma-separated list of open, awaiting_customer, in_progress, resolved or closed, for example open,in_progress; see the phase field of a feedback for what each means."
11390
11963
  },
11391
11964
  {
11392
11965
  "name": "query",
@@ -11426,7 +11999,7 @@ export const operations = [
11426
11999
  "name": "message",
11427
12000
  "type": "string",
11428
12001
  "required": true,
11429
- "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."
11430
12003
  },
11431
12004
  {
11432
12005
  "name": "contact_email",
@@ -11496,6 +12069,18 @@ export const operations = [
11496
12069
  ]
11497
12070
  }
11498
12071
  },
12072
+ {
12073
+ "resource": "organization.feedback.counts",
12074
+ "method": "list",
12075
+ "summary": "Count your organization's feedback by phase",
12076
+ "description": "How many of your organization's feedback are in each phase, for status tabs. Counts never include another organization's feedback.",
12077
+ "http": "GET",
12078
+ "path": "/organization/v1/feedback/counts",
12079
+ "streaming": "no",
12080
+ "pagination": false,
12081
+ "pathParams": [],
12082
+ "query": []
12083
+ },
11499
12084
  {
11500
12085
  "resource": "organization.feedback",
11501
12086
  "method": "retrieve",