@deepraxis/sdk 0.1.1-dev.d25d171 → 0.1.1-dev.ea219e1

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.
@@ -4,7 +4,7 @@ export const operations = [
4
4
  "resource": "agent.agents",
5
5
  "method": "list",
6
6
  "summary": "List agents",
7
- "description": "List the agents of the workspace behind your API key, newest first, in pages of at most 100 (default 20). Use it to find an agent id before creating a session; to read one agent use agents.retrieve, to see its history use agents.versions.list. Archived agents are hidden unless include_archived is true. Filter kind=personal for durable-computer agents or kind=service for per-session environments. Pass next_page from the response as page to read the next page; a null next_page means the end.",
7
+ "description": "List the agents of the workspace behind your API key, newest first, in pages of at most 100 (default 20). Use it to find an agent id before creating a session; to read one agent use agents.retrieve, to see its history use agents.versions.list. Archived agents are hidden unless include_archived is true. Filter kind=general or kind=personal for durable-computer agents or kind=service for per-session environments. Pass next_page from the response as page to read the next page; a null next_page means the end.",
8
8
  "http": "GET",
9
9
  "path": "/agent/v1/agents",
10
10
  "streaming": "no",
@@ -49,6 +49,7 @@ export const operations = [
49
49
  "name": "kind",
50
50
  "type": "string",
51
51
  "enum": [
52
+ "general",
52
53
  "personal",
53
54
  "service"
54
55
  ],
@@ -106,7 +107,7 @@ export const operations = [
106
107
  "name": "multiagent",
107
108
  "type": "object",
108
109
  "required": false,
109
- "description": "A coordinator topology: the session's primary thread orchestrates\nwork by spawning session threads, each running an agent drawn from the `agents`\nroster."
110
+ "description": "Coordinator roster. A bare string agent id is equivalent to {type: \"agent\", id}; omitting its version pins the referenced agent's current saved version when this roster is saved. {type: \"self\"} refers to this agent. Specify a concrete version to pin it explicitly."
110
111
  },
111
112
  {
112
113
  "name": "skills",
@@ -133,17 +134,18 @@ export const operations = [
133
134
  "type": "array",
134
135
  "itemType": "object",
135
136
  "required": false,
136
- "description": "Platform resources and services this service agent's codemode may reach, as one list of typed bindings. Only kind=service accepts a nonempty list; personal agents return 400. There are two kinds. A resource binding names one resource with id and access: database (id db_..., read_only or read_write), vector_store (id vs_..., read_only or read_write), file (id file- plus 24 letters or digits, as the File API returns it; read_only), media_library (any id without ':' or whitespace, read_only or read_write), model (a model catalog id, invoke), workflow and script (id <namespace>/<name>, invoke). A service binding opens a whole service and carries only enabled: search or browser. At most 20 bindings per type, no repeated type and id, and each service type at most once. A session is authorized by the agent version it runs: newly added bindings apply only to new sessions, and a version saved with apply=false changes no access until it is applied. Applying a version that disables, removes or downgrades a binding revokes it immediately in running sessions on older versions. A resource that is not bound returns 404, a service that is not opened returns 403, and a write to a resource bound read_only returns 403 BINDING_READ_ONLY. Unknown types, fields on the wrong kind (id, access or instructions on a service binding), wrong access and malformed ids return 400. The former databases, vector_stores and files fields are removed and return 400. Omit on create for no bindings."
137
+ "description": "Platform resources and services this service agent's codemode may reach, as one list of typed bindings. Only kind=service accepts a nonempty list; general and personal agents return 400. There are two kinds. A resource binding names one resource with id and access: database (id db_..., read_only or read_write), vector_store (id vs_..., read_only or read_write), file (id file- plus 24 letters or digits, as the File API returns it; read_only), media_library (any id without ':' or whitespace, read_only or read_write), model (a model catalog id, invoke), workflow and script (id <namespace>/<name>, invoke). A service binding opens a whole service and carries only enabled: search or browser. At most 20 bindings per type, no repeated type and id, and each service type at most once. A session is authorized by the agent version it runs: newly added bindings apply only to new sessions, and a version saved with apply=false changes no access until it is applied. Applying a version that disables, removes or downgrades a binding revokes it immediately in running sessions on older versions. A resource that is not bound returns 404, a service that is not opened returns 403, and a write to a resource bound read_only returns 403 BINDING_READ_ONLY. Unknown types, fields on the wrong kind (id, access or instructions on a service binding), wrong access and malformed ids return 400. The former databases, vector_stores and files fields are removed and return 400. Omit on create for no bindings. Saving checks added or changed database, vector_store, media_library and file bindings in the organization: unknown or deleted ids return 400. If an owner is unavailable or takes more than 3 seconds, saving succeeds with verified=false for the affected bindings. Unchanged bindings keep their previous verification result and are not rechecked. workflow and script ids are not verified at save time."
137
138
  },
138
139
  {
139
140
  "name": "kind",
140
141
  "type": "string",
141
142
  "enum": [
143
+ "general",
142
144
  "personal",
143
145
  "service"
144
146
  ],
145
147
  "required": false,
146
- "description": "Immutable agent kind. personal requires computer_id; service cannot bind a computer. Omit on create to infer from computer_id. On update, the same kind is ignored; changing kind or crossing its computer binding returns 400 invalid_request_error."
148
+ "description": "Immutable agent kind. general and personal require computer_id; service cannot bind a computer. Omit on create to infer from computer_id (general with a computer, service without). On update, the same kind is ignored; changing kind or crossing its computer binding returns 400 invalid_request_error."
147
149
  },
148
150
  {
149
151
  "name": "computer_id",
@@ -157,6 +159,12 @@ export const operations = [
157
159
  "required": false,
158
160
  "description": "Praxis extension: default subagent model ID, pinned in the agent revision. Call model overrides this; otherwise it overrides the roster member model or the parent model for built-ins. Null clears the default. /agent/v1 only."
159
161
  },
162
+ {
163
+ "name": "image_model",
164
+ "type": "string",
165
+ "required": false,
166
+ "description": "Model used by the imagine image tool; defaults to gpt-image-2 when unset. Only models that can generate images are accepted. Omit to preserve; null clears the configured model. /agent/v1 only."
167
+ },
160
168
  {
161
169
  "name": "subagents",
162
170
  "type": "array",
@@ -187,7 +195,7 @@ export const operations = [
187
195
  "name": "avatar",
188
196
  "type": "string",
189
197
  "required": false,
190
- "description": "Avatar image of the agent: an absolute https URL of at most 2048 characters, without credentials; any other value returns 400 avatar must be an https URL. It is the default picture in agent lists, the agent detail, the chat header and embedded chat when the embed appearance sets none. Saved with the agent version like other configuration, so apply=false keeps the previous avatar in effect until that version is applied. Omit on create for no avatar; on update, omit to keep it and send null to clear it. Both personal and service agents accept it. /agent/v1 only; /anthropic neither accepts nor returns it."
198
+ "description": "Avatar image of the agent: an absolute https URL of at most 2048 characters, without credentials; any other value returns 400 avatar must be an https URL. It is the default picture in agent lists, the agent detail, the chat header and embedded chat when the embed appearance sets none. Saved with the agent version like other configuration, so apply=false keeps the previous avatar in effect until that version is applied. Omit on create for no avatar; on update, omit to keep it and send null to clear it. General, personal and service agents accept it. /agent/v1 only; /anthropic neither accepts nor returns it."
191
199
  },
192
200
  {
193
201
  "name": "environment_id",
@@ -220,7 +228,7 @@ export const operations = [
220
228
  "resource": "agent.agents",
221
229
  "method": "retrieve",
222
230
  "summary": "Get agent",
223
- "description": "Read one agent by id. The top level is the latest saved version, the editable head whose version you send back for optimistic concurrency; after a save with apply false it differs from active_version, and new sessions use active_version, which you read with version=active. With version, read a specific saved version. The response lists every native tool with its resolved configuration in one agent_toolset_20260401 entry, so it can be sent back unchanged to agents.update. Use agents.versions.list to enumerate versions.",
231
+ "description": "Read the agent configuration currently effective for new sessions. By default, version equals active_version and latest_version identifies the newest saved version, including an unapplied save. Use latest_version for optimistic concurrency when updating. Pass version as a positive integer to read that saved version; version=active is equivalent to omission. The response lists every native tool with its resolved configuration in one agent_toolset_20260401 entry, so tools can be sent back unchanged to agents.update. Use agents.versions.list to enumerate saved versions.",
224
232
  "http": "GET",
225
233
  "path": "/agent/v1/agents/{agent_id}",
226
234
  "streaming": "no",
@@ -237,7 +245,7 @@ export const operations = [
237
245
  "name": "version",
238
246
  "type": "number",
239
247
  "required": false,
240
- "description": "Agent version to read; omit for the latest saved version. An integer of at least 1 (versions are listed by agents.versions.list), or the string active for the version new sessions use."
248
+ "description": "Agent version to read. Omit, or send active, for the currently effective version used by new sessions. Send an integer of at least 1 from agents.versions.list to read that saved version. The default response also includes latest_version, the newest saved version number."
241
249
  }
242
250
  ]
243
251
  },
@@ -245,7 +253,7 @@ export const operations = [
245
253
  "resource": "agent.agents",
246
254
  "method": "update",
247
255
  "summary": "Update agent",
248
- "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. apply defaults to true and moves active_version to the new version, or to the latest when configuration is unchanged; apply false saves without applying. version_note optionally records up to 280 characters on a newly created version; null means no note, and a note sent when the request changes nothing else returns 400 because a note is stored only with a new version. Existing sessions and tokens keep their version. 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. tools: [] removes every tool, while tools: null returns 400 (tools cannot be null; send [] to remove every tool). On update, omit skills to keep them, send an array to replace them, or send [] or null to clear them. skills attaches uploaded custom skills as [{type: \"custom\", skill_id, version?}] (skill_id from skills.create or skills.list; at most 20, no repeated skill_id). Omit version, or send \"latest\", to use the skill's newest version when a session starts. type anthropic returns 400.",
256
+ "description": "Save configuration changes as a new immutable version. Send latest_version from a default retrieve or update response as the request version for optimistic concurrency; a stale value returns 409. apply defaults to true and makes the new version effective; apply false saves without changing active_version. The response contains the effective configuration, with version equal to active_version and latest_version naming the newest saved version. An unchanged configuration, including a note-only update, is a no-op returning 200 and the current effective version without creating or activating a version. version_note records up to 280 characters only when a configuration change creates a new version; null is equivalent to omission. Use agents.versions.apply to activate an existing saved version. Existing sessions and tokens keep their version. 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. tools: [] removes every tool, while tools: null returns 400 (tools cannot be null; send [] to remove every tool). On update, omit skills to keep them, send an array to replace them, or send [] or null to clear them. skills attaches uploaded custom skills as [{type: \"custom\", skill_id, version?}] (skill_id from skills.create or skills.list; at most 20, no repeated skill_id). Omit version, or send \"latest\", to use the skill's newest version when a session starts. type anthropic returns 400.",
249
257
  "http": "POST",
250
258
  "path": "/agent/v1/agents/{agent_id}",
251
259
  "streaming": "no",
@@ -290,7 +298,7 @@ export const operations = [
290
298
  "name": "multiagent",
291
299
  "type": "object",
292
300
  "required": false,
293
- "description": "A coordinator topology: the session's primary thread orchestrates\nwork by spawning session threads, each running an agent drawn from the `agents`\nroster."
301
+ "description": "Coordinator roster. A bare string agent id is equivalent to {type: \"agent\", id}; omitting its version pins the referenced agent's current saved version when this roster is saved. {type: \"self\"} refers to this agent. Specify a concrete version to pin it explicitly."
294
302
  },
295
303
  {
296
304
  "name": "name",
@@ -322,19 +330,19 @@ export const operations = [
322
330
  "name": "version",
323
331
  "type": "number",
324
332
  "required": false,
325
- "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."
333
+ "description": "Newest saved version used for optimistic concurrency. Obtain latest_version from the default retrieve or update response, or version from versions.list. A stale value returns 409; omit for an unconditional update."
326
334
  },
327
335
  {
328
336
  "name": "apply",
329
337
  "type": "boolean",
330
338
  "required": false,
331
- "description": "Defaults to true: apply the newly saved version, or the latest version when configuration is unchanged. Set false to save without changing active_version. Unlike Managed Agents, saving and applying can be separate."
339
+ "description": "Defaults to true: apply a newly saved configuration version. Set false to save without changing active_version. An unchanged configuration is a no-op, including note-only updates; use versions.apply to activate a saved version."
332
340
  },
333
341
  {
334
342
  "name": "version_note",
335
343
  "type": "string",
336
344
  "required": false,
337
- "description": "Optional change explanation stored as note on the new immutable version, up to 280 characters. Omission or null stores no note. A note sent when nothing else changes returns 400 (nothing to save), because a note is stored only with a new version."
345
+ "description": "Optional change explanation, at most 280 characters. Recorded only when a configuration change creates a new immutable version. A note-only update is a no-op returning 200 and the current effective version. Null is equivalent to omission."
338
346
  },
339
347
  {
340
348
  "name": "bindings",
@@ -347,11 +355,12 @@ export const operations = [
347
355
  "name": "kind",
348
356
  "type": "string",
349
357
  "enum": [
358
+ "general",
350
359
  "personal",
351
360
  "service"
352
361
  ],
353
362
  "required": false,
354
- "description": "Immutable agent kind. personal requires computer_id; service cannot bind a computer. Omit on create to infer from computer_id. On update, the same kind is ignored; changing kind or crossing its computer binding returns 400 invalid_request_error."
363
+ "description": "Immutable agent kind. general and personal require computer_id; service cannot bind a computer. Omit on create to infer from computer_id (general with a computer, service without). On update, the same kind is ignored; changing kind or crossing its computer binding returns 400 invalid_request_error."
355
364
  },
356
365
  {
357
366
  "name": "computer_id",
@@ -365,6 +374,12 @@ export const operations = [
365
374
  "required": false,
366
375
  "description": "Praxis extension: default subagent model ID, pinned in the agent revision. Call model overrides this; otherwise it overrides the roster member model or the parent model for built-ins. Null clears the default. /agent/v1 only."
367
376
  },
377
+ {
378
+ "name": "image_model",
379
+ "type": "string",
380
+ "required": false,
381
+ "description": "Model used by the imagine image tool; defaults to gpt-image-2 when unset. Only models that can generate images are accepted. Omit to preserve; null clears the configured model. /agent/v1 only."
382
+ },
368
383
  {
369
384
  "name": "subagents",
370
385
  "type": "array",
@@ -395,7 +410,7 @@ export const operations = [
395
410
  "name": "avatar",
396
411
  "type": "string",
397
412
  "required": false,
398
- "description": "Avatar image of the agent: an absolute https URL of at most 2048 characters, without credentials; any other value returns 400 avatar must be an https URL. It is the default picture in agent lists, the agent detail, the chat header and embedded chat when the embed appearance sets none. Saved with the agent version like other configuration, so apply=false keeps the previous avatar in effect until that version is applied. Omit on create for no avatar; on update, omit to keep it and send null to clear it. Both personal and service agents accept it. /agent/v1 only; /anthropic neither accepts nor returns it."
413
+ "description": "Avatar image of the agent: an absolute https URL of at most 2048 characters, without credentials; any other value returns 400 avatar must be an https URL. It is the default picture in agent lists, the agent detail, the chat header and embedded chat when the embed appearance sets none. Saved with the agent version like other configuration, so apply=false keeps the previous avatar in effect until that version is applied. Omit on create for no avatar; on update, omit to keep it and send null to clear it. General, personal and service agents accept it. /agent/v1 only; /anthropic neither accepts nor returns it."
399
414
  },
400
415
  {
401
416
  "name": "environment_id",
@@ -424,6 +439,24 @@ export const operations = [
424
439
  ]
425
440
  }
426
441
  },
442
+ {
443
+ "resource": "agent.agents",
444
+ "method": "retrieveAppearance",
445
+ "summary": "Get agent appearance",
446
+ "description": "Read the saved chat appearance of a service agent.\n\nAgent Kit calls this from the page with a customer access token of this agent; your API key and console members can read it too. A token of another agent returns 404. The body is the same as the embed appearance read; a missing appearance returns the agent's own name and avatar only. Responses are private and cacheable for 60 seconds.",
447
+ "http": "GET",
448
+ "path": "/agent/v1/agents/{agent_id}/appearance",
449
+ "streaming": "no",
450
+ "pagination": false,
451
+ "pathParams": [
452
+ {
453
+ "name": "agent_id",
454
+ "sdkName": "agent_id",
455
+ "description": "Service agent id from agent creation or listing; with a customer access token, the agent the token was issued for."
456
+ }
457
+ ],
458
+ "query": []
459
+ },
427
460
  {
428
461
  "resource": "agent.agents",
429
462
  "method": "archive",
@@ -442,6 +475,59 @@ export const operations = [
442
475
  ],
443
476
  "query": []
444
477
  },
478
+ {
479
+ "resource": "agent.agents.customers",
480
+ "method": "list",
481
+ "summary": "List customers",
482
+ "description": "List the customers of a service agent, identified and anonymous, most recently seen first.\n\nCall this from your backend with your API key, or from the console. Customers follow Shopify Admin customers (list, retrieve, block, sign-out and data deletion of the people who use your storefront), so that experience applies. The list includes customers who signed in but have not started a session yet, and customers recorded under your own ids by embed tokens before customer sign-in existed; an id first seen that way is identified unless it starts with anon_. Unlike Shopify, a customer can be anonymous: a visitor admitted with the publishable key gets an anon_ id, and when it later signs in with anonymous_access_token it is merged: merged_into names the identified customer, and its sessions count toward that customer. Filter with q (a case-sensitive customer id prefix), type (identified or anonymous) and blocked (true or false). limit is 1 to 100, default 20; reuse next_page with the same filters and limit. A customer access token gets 404. Example: GET /agent/v1/agents/agent_example/customers?type=identified&blocked=false&limit=50.",
483
+ "http": "GET",
484
+ "path": "/agent/v1/agents/{agent_id}/customers",
485
+ "streaming": "no",
486
+ "pagination": false,
487
+ "pathParams": [
488
+ {
489
+ "name": "agent_id",
490
+ "sdkName": "agent_id",
491
+ "description": "Active service agent id from agent creation or listing."
492
+ }
493
+ ],
494
+ "query": [
495
+ {
496
+ "name": "limit",
497
+ "type": "integer",
498
+ "required": false,
499
+ "description": "Maximum customers per page, 1 to 100; defaults to 20."
500
+ },
501
+ {
502
+ "name": "page",
503
+ "type": "string",
504
+ "required": false,
505
+ "description": "next_page from the previous response with the same q, type, blocked and limit."
506
+ },
507
+ {
508
+ "name": "q",
509
+ "type": "string",
510
+ "required": false,
511
+ "description": "Case-sensitive literal prefix of the customer id; omit for all customers."
512
+ },
513
+ {
514
+ "name": "type",
515
+ "type": "string",
516
+ "enum": [
517
+ "identified",
518
+ "anonymous"
519
+ ],
520
+ "required": false,
521
+ "description": "Only identified or only anonymous customers; omit for both."
522
+ },
523
+ {
524
+ "name": "blocked",
525
+ "type": "boolean",
526
+ "required": false,
527
+ "description": "true for blocked customers only, false for customers who are not blocked; omit for both."
528
+ }
529
+ ]
530
+ },
445
531
  {
446
532
  "resource": "agent.agents.customers.auth.accessTokens",
447
533
  "method": "create",
@@ -591,61 +677,24 @@ export const operations = [
591
677
  }
592
678
  },
593
679
  {
594
- "resource": "agent.agents.endUsers",
595
- "method": "list",
596
- "summary": "List End Users",
597
- "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.",
598
- "http": "GET",
599
- "path": "/agent/v1/agents/{agent_id}/end_users",
600
- "streaming": "no",
601
- "pagination": false,
602
- "pathParams": [
603
- {
604
- "name": "agent_id",
605
- "sdkName": "agent_id",
606
- "description": "Active service agent identifier from agent creation or listing."
607
- }
608
- ],
609
- "query": [
610
- {
611
- "name": "limit",
612
- "type": "integer",
613
- "required": false,
614
- "description": "Maximum users per page; defaults to 20."
615
- },
616
- {
617
- "name": "page",
618
- "type": "string",
619
- "required": false,
620
- "description": "next_page from the previous response with the same agent, q and limit."
621
- },
622
- {
623
- "name": "q",
624
- "type": "string",
625
- "required": false,
626
- "description": "Case-sensitive literal prefix of external_user_id; omit or use an empty string for all users."
627
- }
628
- ]
629
- },
630
- {
631
- "resource": "agent.agents.endUsers",
680
+ "resource": "agent.agents.customers",
632
681
  "method": "delete",
633
- "summary": "Delete end-user data",
634
- "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.",
682
+ "summary": "Delete customer data",
683
+ "description": "Delete a customer's data from one service agent after explicit confirmation.\n\nDevelop only. Set confirm to the exact customer id; a missing or different confirm returns 400 naming the value to send. Returns 202 with a pending task id; poll the deletion endpoint. Concurrent requests reuse the unfinished task; retry DELETE after failure to resume it. Tokens are revoked and the customer is blocked before a seven-day recovery snapshot is verified; sessions including child sessions, conversation data, grants and feedback are then removed. A block that existed before stays; a temporary block is removed on success. File attachments are retained. Example: DELETE /agent/v1/agents/agent_example/customers/cus_8f2a91?confirm=cus_8f2a91.",
635
684
  "http": "DELETE",
636
- "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
685
+ "path": "/agent/v1/agents/{agent_id}/customers/{customer_id}",
637
686
  "streaming": "no",
638
687
  "pagination": false,
639
688
  "pathParams": [
640
689
  {
641
690
  "name": "agent_id",
642
691
  "sdkName": "agent_id",
643
- "description": "Active service agent identifier from agent creation or listing."
692
+ "description": "Active service agent id from agent creation or listing."
644
693
  },
645
694
  {
646
- "name": "external_user_id",
647
- "sdkName": "external_user_id",
648
- "description": "Host user identifier supplied at issuance or from end-user listing."
695
+ "name": "customer_id",
696
+ "sdkName": "customer_id",
697
+ "description": "Customer id from customer listing, or your own customer_id."
649
698
  }
650
699
  ],
651
700
  "query": [
@@ -653,121 +702,121 @@ export const operations = [
653
702
  "name": "confirm",
654
703
  "type": "string",
655
704
  "required": true,
656
- "description": "Must exactly equal the external_user_id path parameter to confirm destructive deletion."
705
+ "description": "Must equal the customer_id path parameter exactly, confirming the destructive deletion."
657
706
  }
658
707
  ]
659
708
  },
660
709
  {
661
- "resource": "agent.agents.endUsers",
710
+ "resource": "agent.agents.customers",
662
711
  "method": "retrieve",
663
- "summary": "Get End User",
664
- "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.",
712
+ "summary": "Get customer",
713
+ "description": "Retrieve one customer of a service agent with its twenty most recently updated sessions.\n\nUse the customer id from the list or your own customer_id. An unknown customer returns 404 CUSTOMER_NOT_FOUND, and so does a customer access token. Unlike Shopify, an identified customer's session_count, cost and recent_sessions include the sessions of anonymous customers merged into it; the merged anonymous customer still shows its own sessions and its merged_into.",
665
714
  "http": "GET",
666
- "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
715
+ "path": "/agent/v1/agents/{agent_id}/customers/{customer_id}",
667
716
  "streaming": "no",
668
717
  "pagination": false,
669
718
  "pathParams": [
670
719
  {
671
720
  "name": "agent_id",
672
721
  "sdkName": "agent_id",
673
- "description": "Active service agent identifier from agent creation or listing."
722
+ "description": "Active service agent id from agent creation or listing."
674
723
  },
675
724
  {
676
- "name": "external_user_id",
677
- "sdkName": "external_user_id",
678
- "description": "Host user identifier supplied at issuance or from end-user listing."
725
+ "name": "customer_id",
726
+ "sdkName": "customer_id",
727
+ "description": "Customer id from customer listing, or your own customer_id."
679
728
  }
680
729
  ],
681
730
  "query": []
682
731
  },
683
732
  {
684
- "resource": "agent.agents.endUsers.block",
733
+ "resource": "agent.agents.customers.block",
685
734
  "method": "create",
686
- "summary": "Block End User",
687
- "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.",
735
+ "summary": "Block customer",
736
+ "description": "Block a customer and end every sign-in it has on this agent.\n\nBlocks the customer, then ends every live sign-in the way logout does: each access token is revoked and its open event streams close. From then on grant_codes, access_tokens, renew and new sessions for this customer return CUSTOMER_BLOCKED until you unblock it. Idempotent: a repeat keeps the first block time and revokes whatever is still live. If credential revocation fails the request returns 502 and the customer stays blocked; retry to finish. An unknown customer returns 404 CUSTOMER_NOT_FOUND.",
688
737
  "http": "POST",
689
- "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/block",
738
+ "path": "/agent/v1/agents/{agent_id}/customers/{customer_id}/block",
690
739
  "streaming": "no",
691
740
  "pagination": false,
692
741
  "pathParams": [
693
742
  {
694
743
  "name": "agent_id",
695
744
  "sdkName": "agent_id",
696
- "description": "Active service agent identifier from agent creation or listing."
745
+ "description": "Active service agent id from agent creation or listing."
697
746
  },
698
747
  {
699
- "name": "external_user_id",
700
- "sdkName": "external_user_id",
701
- "description": "Host user identifier supplied at issuance or from end-user listing."
748
+ "name": "customer_id",
749
+ "sdkName": "customer_id",
750
+ "description": "Customer id from customer listing, or your own customer_id."
702
751
  }
703
752
  ],
704
753
  "query": []
705
754
  },
706
755
  {
707
- "resource": "agent.agents.endUsers",
756
+ "resource": "agent.agents.customers",
708
757
  "method": "retrieveDeletion",
709
- "summary": "Get end-user deletion",
710
- "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.",
758
+ "summary": "Get customer deletion",
759
+ "description": "Poll the latest deletion task of a customer, including after its data has been removed.\n\nUse the same agent_id and customer id as the confirmed DELETE. Status is pending, snapshotting, deleting, done or failed. Counts are empty until a verified snapshot exists. snapshot_key is an operator recovery reference retained for seven days, not a download URL. A customer access token and a missing task return 404.",
711
760
  "http": "GET",
712
- "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/deletion",
761
+ "path": "/agent/v1/agents/{agent_id}/customers/{customer_id}/deletion",
713
762
  "streaming": "no",
714
763
  "pagination": false,
715
764
  "pathParams": [
716
765
  {
717
766
  "name": "agent_id",
718
767
  "sdkName": "agent_id",
719
- "description": "Active service agent identifier from agent creation or listing."
768
+ "description": "Active service agent id from agent creation or listing."
720
769
  },
721
770
  {
722
- "name": "external_user_id",
723
- "sdkName": "external_user_id",
724
- "description": "Host user identifier supplied at issuance or from end-user listing."
771
+ "name": "customer_id",
772
+ "sdkName": "customer_id",
773
+ "description": "Customer id from customer listing, or your own customer_id."
725
774
  }
726
775
  ],
727
776
  "query": []
728
777
  },
729
778
  {
730
- "resource": "agent.agents.endUsers.revokeTokens",
779
+ "resource": "agent.agents.customers.revokeTokens",
731
780
  "method": "create",
732
- "summary": "Revoke End User Tokens",
733
- "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.",
781
+ "summary": "Revoke customer tokens",
782
+ "description": "Sign a customer out everywhere without blocking it.\n\nEnds every live sign-in of the customer, revoking each access token and closing its open event streams; the customer can sign in again right away. Returns the number of access tokens this request revoked; a repeat returns 0. Credential revocation failure returns 502; retry to finish. An unknown customer returns 404 CUSTOMER_NOT_FOUND.",
734
783
  "http": "POST",
735
- "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/revoke_tokens",
784
+ "path": "/agent/v1/agents/{agent_id}/customers/{customer_id}/revoke_tokens",
736
785
  "streaming": "no",
737
786
  "pagination": false,
738
787
  "pathParams": [
739
788
  {
740
789
  "name": "agent_id",
741
790
  "sdkName": "agent_id",
742
- "description": "Active service agent identifier from agent creation or listing."
791
+ "description": "Active service agent id from agent creation or listing."
743
792
  },
744
793
  {
745
- "name": "external_user_id",
746
- "sdkName": "external_user_id",
747
- "description": "Host user identifier supplied at issuance or from end-user listing."
794
+ "name": "customer_id",
795
+ "sdkName": "customer_id",
796
+ "description": "Customer id from customer listing, or your own customer_id."
748
797
  }
749
798
  ],
750
799
  "query": []
751
800
  },
752
801
  {
753
- "resource": "agent.agents.endUsers.unblock",
802
+ "resource": "agent.agents.customers.unblock",
754
803
  "method": "create",
755
- "summary": "Unblock End User",
756
- "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.",
804
+ "summary": "Unblock customer",
805
+ "description": "Allow a blocked customer to sign in and start sessions again.\n\nIdempotent. Access tokens revoked while the customer was blocked stay revoked; sign the customer in again with a new grant code. An unknown customer returns 404 CUSTOMER_NOT_FOUND.",
757
806
  "http": "POST",
758
- "path": "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/unblock",
807
+ "path": "/agent/v1/agents/{agent_id}/customers/{customer_id}/unblock",
759
808
  "streaming": "no",
760
809
  "pagination": false,
761
810
  "pathParams": [
762
811
  {
763
812
  "name": "agent_id",
764
813
  "sdkName": "agent_id",
765
- "description": "Active service agent identifier from agent creation or listing."
814
+ "description": "Active service agent id from agent creation or listing."
766
815
  },
767
816
  {
768
- "name": "external_user_id",
769
- "sdkName": "external_user_id",
770
- "description": "Host user identifier supplied at issuance or from end-user listing."
817
+ "name": "customer_id",
818
+ "sdkName": "customer_id",
819
+ "description": "Customer id from customer listing, or your own customer_id."
771
820
  }
772
821
  ],
773
822
  "query": []
@@ -794,7 +843,7 @@ export const operations = [
794
843
  "resource": "agent.agents.versions",
795
844
  "method": "list",
796
845
  "summary": "List agent versions",
797
- "description": "List the saved versions of one agent, in pages of at most 100 (default 20). Each item is the full agent definition at that version, so you can compare what changed between versions. active is true only for the item that new sessions use; active_version on each item is the agent-level value, kept for compatibility. Use agents.retrieve with version to read a single one; agent_id comes from agents.list or agents.create.",
846
+ "description": "List the saved versions of one agent in ascending version number, oldest first, in pages of at most 100 (default 20). Each item is the full agent definition at that saved version, so you can compare configurations. active is true only for the item new sessions use. active_version on every item is the same agent-level currently effective version; it is not that item's version. Use agents.retrieve with version to read a single saved version; agent_id comes from agents.list or agents.create. Pass next_page as page to continue.",
798
847
  "http": "GET",
799
848
  "path": "/agent/v1/agents/{agent_id}/versions",
800
849
  "streaming": "no",
@@ -825,7 +874,7 @@ export const operations = [
825
874
  "resource": "agent.agents.versions",
826
875
  "method": "apply",
827
876
  "summary": "Apply Agent Version",
828
- "description": "Apply a version from agents.versions.list by its version number. This idempotent operation changes active_version without creating a version; existing sessions and tokens keep their version. The response is the latest saved agent with its current active_version. Missing versions return 404 Agent version not found; archived agents return 409 Agent is archived. For example, POST /agent/v1/agents/{agent_id}/versions/2/apply with no body.",
877
+ "description": "Apply a saved version from agents.versions.list for new sessions and newly issued tokens, without creating a version. Existing sessions and tokens retain their version. The response contains the effective configuration with version equal to active_version and latest_version naming the newest saved version. Missing versions return 404; archived agents return 409. For example, POST /agent/v1/agents/{agent_id}/versions/2/apply with no body.",
829
878
  "http": "POST",
830
879
  "path": "/agent/v1/agents/{agent_id}/versions/{version}/apply",
831
880
  "streaming": "no",
@@ -874,7 +923,7 @@ export const operations = [
874
923
  "resource": "agent.computers",
875
924
  "method": "create",
876
925
  "summary": "Create Computer",
877
- "description": "Create a durable computer: a named machine whose files outlive sessions, for personal agents.\n\nPraxis extension: MA only has session-scoped temporary containers and memory_stores, not durable browsable computers. Archived files remain readable, but new sessions cannot bind them. environment_id is an optional recipe reference; computers start with a light sandbox and expose the public SDK sandbox_id. Lists include archived computers.",
926
+ "description": "Create a durable computer: a named machine whose files outlive sessions, for general and personal agents.\n\nPraxis extension: MA only has session-scoped temporary containers and memory_stores, not durable browsable computers. Archived files remain readable, but new sessions cannot bind them. environment_id is an optional recipe reference; computers start with a light sandbox and expose the public SDK sandbox_id. Lists include archived computers.",
878
927
  "http": "POST",
879
928
  "path": "/agent/v1/computers",
880
929
  "streaming": "no",
@@ -1300,7 +1349,7 @@ export const operations = [
1300
1349
  "resource": "agent.deployments",
1301
1350
  "method": "create",
1302
1351
  "summary": "Create deployment",
1303
- "description": "Freeze session parameters as a deployment; this operation does not open a session. Pass an agent id or versioned reference, a name, 1–50 user.message initial events and an environment_id from environments.list. Unlike Anthropic Managed Agents, /agent/v1 also accepts agent_with_overrides (model, permission_mode and cwd) and target=computer for personal agents, with environment_id omitted. Cron schedules use five POSIX fields and an IANA timezone. File resources are accepted. Supports vault_ids, up to 50, owned by the current organization and not archived; credential injection is deferred to a later version. Active schedules run every minute when due; session creation errors pause the deployment. Unsupported tools, mcp_servers, system and skills overrides return 400.",
1352
+ "description": "Freeze session parameters as a deployment; this operation does not open a session. Pass an agent id or versioned reference, a name, 1–50 user.message initial events and an environment_id from environments.list. Unlike Anthropic Managed Agents, /agent/v1 also accepts agent_with_overrides (model, permission_mode and cwd) and target=computer for general and personal agents, with environment_id omitted. Cron schedules use five POSIX fields and an IANA timezone. File resources are accepted. Supports vault_ids, up to 50, owned by the current organization and not archived; credential injection is deferred to a later version. Active schedules run every minute when due; session creation errors pause the deployment. Unsupported tools, mcp_servers, system and skills overrides return 400.",
1304
1353
  "http": "POST",
1305
1354
  "path": "/agent/v1/deployments",
1306
1355
  "streaming": "no",
@@ -1377,7 +1426,7 @@ export const operations = [
1377
1426
  "name": "target",
1378
1427
  "type": "object",
1379
1428
  "required": false,
1380
- "description": "Execution target. environment (default) requires an existing, unarchived environment_id. computer is available only for personal agents and permits environment_id to be omitted."
1429
+ "description": "Execution target. environment (default) requires an existing, unarchived environment_id. computer is available only for general and personal agents and permits environment_id to be omitted."
1381
1430
  }
1382
1431
  ]
1383
1432
  }
@@ -1487,7 +1536,7 @@ export const operations = [
1487
1536
  "name": "target",
1488
1537
  "type": "object",
1489
1538
  "required": false,
1490
- "description": "Execution target. environment (default) requires an existing, unarchived environment_id. computer is available only for personal agents and permits environment_id to be omitted."
1539
+ "description": "Execution target. environment (default) requires an existing, unarchived environment_id. computer is available only for general and personal agents and permits environment_id to be omitted."
1491
1540
  }
1492
1541
  ]
1493
1542
  }
@@ -1564,204 +1613,6 @@ export const operations = [
1564
1613
  ],
1565
1614
  "query": []
1566
1615
  },
1567
- {
1568
- "resource": "agent.embed",
1569
- "method": "retrieveAppearance",
1570
- "summary": "Read chat appearance",
1571
- "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.",
1572
- "http": "GET",
1573
- "path": "/agent/v1/embed/appearance",
1574
- "streaming": "no",
1575
- "pagination": false,
1576
- "pathParams": [],
1577
- "query": []
1578
- },
1579
- {
1580
- "resource": "agent.embed.exchange",
1581
- "method": "create",
1582
- "summary": "Exchange Hosted Code",
1583
- "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>\"}.",
1584
- "http": "POST",
1585
- "path": "/agent/v1/embed/exchange",
1586
- "streaming": "no",
1587
- "pagination": false,
1588
- "pathParams": [],
1589
- "query": [],
1590
- "body": {
1591
- "required": true,
1592
- "fields": [
1593
- {
1594
- "name": "code",
1595
- "type": "string",
1596
- "required": true,
1597
- "description": "Single-use credential from the c fragment parameter of hosted_url returned by embed token creation. Valid for 60 seconds."
1598
- }
1599
- ]
1600
- }
1601
- },
1602
- {
1603
- "resource": "agent.embedTokens",
1604
- "method": "list",
1605
- "summary": "List Embed Tokens",
1606
- "description": "List embed token issuance records in your organization.\n\nIncludes expired and revoked grants; returns neither token nor token_id. Sorts by created_at, then grant id, both descending. agent_id accepts agent_ or agt_; external_user_id matches exactly. limit is 1–100 (default 20). Reuse next_page as page with the same filters and organization; a mismatch returns 400. End-user credentials return 404.",
1607
- "http": "GET",
1608
- "path": "/agent/v1/embed_tokens",
1609
- "streaming": "no",
1610
- "pagination": false,
1611
- "pathParams": [],
1612
- "query": [
1613
- {
1614
- "name": "agent_id",
1615
- "type": "string",
1616
- "required": false,
1617
- "description": "Filter by service agent identifier (agent_ or agt_ prefix)."
1618
- },
1619
- {
1620
- "name": "external_user_id",
1621
- "type": "string",
1622
- "required": false,
1623
- "description": "Exact host user identifier supplied at issuance."
1624
- },
1625
- {
1626
- "name": "limit",
1627
- "type": "integer",
1628
- "required": false,
1629
- "description": "Maximum records per page; defaults to 20."
1630
- },
1631
- {
1632
- "name": "page",
1633
- "type": "string",
1634
- "required": false,
1635
- "description": "next_page from a previous response with the same filters."
1636
- }
1637
- ]
1638
- },
1639
- {
1640
- "resource": "agent.embedTokens",
1641
- "method": "create",
1642
- "summary": "Create Embed Token",
1643
- "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.",
1644
- "http": "POST",
1645
- "path": "/agent/v1/embed_tokens",
1646
- "streaming": "no",
1647
- "pagination": false,
1648
- "pathParams": [],
1649
- "query": [],
1650
- "body": {
1651
- "required": true,
1652
- "fields": [
1653
- {
1654
- "name": "hosted",
1655
- "type": "boolean",
1656
- "required": false,
1657
- "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."
1658
- },
1659
- {
1660
- "name": "agent",
1661
- "type": "string",
1662
- "required": true,
1663
- "description": "Service agent ID or identity_number from agent retrieval; it must belong to your organization and be active."
1664
- },
1665
- {
1666
- "name": "version",
1667
- "type": "integer",
1668
- "required": false,
1669
- "description": "Existing agent version to pin. Omit to pin the latest version at issuance."
1670
- },
1671
- {
1672
- "name": "external_user_id",
1673
- "type": "string",
1674
- "required": true,
1675
- "description": "Your application's stable end-user identifier, scoped to this organization and agent."
1676
- },
1677
- {
1678
- "name": "ttl_seconds",
1679
- "type": "integer",
1680
- "required": false,
1681
- "description": "Token lifetime in seconds. Defaults to the embed policy TTL and cannot exceed its maximum or 3600 seconds."
1682
- },
1683
- {
1684
- "name": "budget_cents",
1685
- "type": "integer",
1686
- "required": false,
1687
- "description": "Session budget in cents. Defaults to the embed policy session budget and cannot exceed its maximum."
1688
- },
1689
- {
1690
- "name": "system_message",
1691
- "type": "array",
1692
- "itemType": "object",
1693
- "required": false,
1694
- "description": "Optional host context as text blocks, limited to 8192 UTF-8 bytes in total."
1695
- },
1696
- {
1697
- "name": "agent_override",
1698
- "type": "object",
1699
- "required": false,
1700
- "description": "Optional system prompt override, accepted only when the embed policy allows agent overrides."
1701
- },
1702
- {
1703
- "name": "allowed_origins",
1704
- "type": "array",
1705
- "itemType": "string",
1706
- "required": false,
1707
- "description": "Optional subset of the policy origin entries, compared exactly. Omit to snapshot every policy origin."
1708
- },
1709
- {
1710
- "name": "metadata",
1711
- "type": "object",
1712
- "required": false,
1713
- "description": "Host metadata preserved verbatim; at most 16 keys of 1–64 characters and string values of at most 512 characters. Defaults to an empty object."
1714
- }
1715
- ]
1716
- }
1717
- },
1718
- {
1719
- "resource": "agent.embedTokens.anonymous",
1720
- "method": "create",
1721
- "summary": "Issue anonymous visitor token",
1722
- "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\"}.",
1723
- "http": "POST",
1724
- "path": "/agent/v1/embed_tokens/anonymous",
1725
- "streaming": "no",
1726
- "pagination": false,
1727
- "pathParams": [],
1728
- "query": [],
1729
- "body": {
1730
- "required": true,
1731
- "fields": [
1732
- {
1733
- "name": "publishable_key",
1734
- "type": "string",
1735
- "required": true,
1736
- "description": "Public key created by the service agent owner; safe to include in browser code."
1737
- },
1738
- {
1739
- "name": "visitor_secret",
1740
- "type": "string",
1741
- "required": false,
1742
- "description": "Secret returned by a previous anonymous issuance for this key. Omit for a new visitor; an unknown secret creates a new visitor."
1743
- }
1744
- ]
1745
- }
1746
- },
1747
- {
1748
- "resource": "agent.embedTokens.revoke",
1749
- "method": "create",
1750
- "summary": "Revoke Embed Token",
1751
- "description": "Revoke an embed token and close its open event streams.\n\nUse an id from issuance or listing. Revokes the credential before setting revoked_at; upstream failure leaves it unset. Streams receive session.error (EMBED_TOKEN_REVOKED), then close immediately; other credentials are unaffected. Idempotent; repeats return the original revoked record without another revocation or audit. Missing or foreign grants and end-user credentials return 404.",
1752
- "http": "POST",
1753
- "path": "/agent/v1/embed_tokens/{id}/revoke",
1754
- "streaming": "no",
1755
- "pagination": false,
1756
- "pathParams": [
1757
- {
1758
- "name": "id",
1759
- "sdkName": "id",
1760
- "description": "Grant id returned by issuance or listing."
1761
- }
1762
- ],
1763
- "query": []
1764
- },
1765
1616
  {
1766
1617
  "resource": "agent.environments",
1767
1618
  "method": "list",
@@ -2050,7 +1901,7 @@ export const operations = [
2050
1901
  "resource": "agent.sessions",
2051
1902
  "method": "create",
2052
1903
  "summary": "Create session",
2053
- "description": "Create a session: one conversation with an agent. Pass agent as an agent id or {type:\"agent\", id, version?}; an id alone, or an object without version, pins the agent's active_version (the version chosen with agents.versions.apply, not necessarily the newest saved one). Unlike Anthropic Managed Agents, omit environment_id to use the default environment saved in the agent version (light for a new agent), unless computer_id (explicit, or the agent's default) selects a Computer; pass an environment id for a sandbox recipe. For service agents, 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. Unlike Anthropic Managed Agents, the only inline agent override is system ({type:\"agent_with_overrides\", id, system}); to change the model, tools, MCP servers or skills, save a version instead. Supports vault_ids, up to 50, owned by the current organization and not archived; credential injection is deferred to a later version. budget is {type:\"limit\", max_list_cost:{amount, currency:\"USD\"}} where amount is a positive integer string of US cents (\"2000\" is USD 20.00); omitted budget defaults to \"2000\" and null removes the limit. 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.",
1904
+ "description": "Create a session: one conversation with an agent. Pass agent as an agent id or {type:\"agent\", id, version?}; an id alone, or an object without version, pins the agent's active_version (the version chosen with agents.versions.apply, not necessarily the newest saved one). Unlike Anthropic Managed Agents, omit environment_id to use the default environment saved in the agent version (light for a new agent), unless computer_id (explicit, or the agent's default) selects a Computer; pass an environment id for a sandbox recipe. For service agents, 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. Unlike Anthropic Managed Agents, the only inline agent override is system ({type:\"agent_with_overrides\", id, system}); to change the model, tools, MCP servers or skills, save a version instead. Supports vault_ids, up to 50, owned by the current organization and not archived; credential injection is deferred to a later version. budget is {type:\"limit\", max_list_cost:{amount, currency:\"USD\"}} where amount is a positive decimal string of US dollars with at most 2 decimal places (\"20.00\" is USD 20.00); omitted budget defaults to \"20.00\" and null removes the limit. 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.",
2054
1905
  "http": "POST",
2055
1906
  "path": "/agent/v1/sessions",
2056
1907
  "streaming": "no",
@@ -2339,7 +2190,7 @@ export const operations = [
2339
2190
  "resource": "agent.sessions",
2340
2191
  "method": "compact",
2341
2192
  "summary": "Compact Session (Extension)",
2342
- "description": "Request session context compaction and retrieve an operation receipt.\n\nAvailable only on /agent/v1. The body may be omitted or {}. Optional instructions must be a string and is forwarded unchanged. Idempotency-Key is forwarded unchanged; a UUID is generated when absent. Returns { type: session_compaction, id, status, reason? }, where id is the operation ID. queued/running return 202; skipped/succeeded/failed return 200. Non-string instructions return 400 invalid_request_error. Missing or inaccessible managed sessions return 404 not_found_error.",
2193
+ "description": "Request session context compaction and retrieve an operation receipt.\n\nAvailable only on /agent/v1. The body may be omitted or {}. Optional instructions must be a string and is forwarded unchanged. Idempotency-Key is forwarded unchanged; a UUID is generated when absent. Returns { type: session_compaction, id, status, reason? }, where id is the operation ID. queued/running return 202; skipped/succeeded/failed/cancelled return 200. Non-string instructions return 400 invalid_request_error. Missing or inaccessible managed sessions return 404 not_found_error.",
2343
2194
  "http": "POST",
2344
2195
  "path": "/agent/v1/sessions/{session_id}/compact",
2345
2196
  "streaming": "no",
@@ -2391,7 +2242,7 @@ export const operations = [
2391
2242
  "resource": "agent.sessions.compactions",
2392
2243
  "method": "list",
2393
2244
  "summary": "List Session Compactions (Extension)",
2394
- "description": "Read session compaction history and summaries.\n\nAvailable only on /agent/v1. Returns { data: [...] }. Each entry contains type, id, event_id, trigger, status, model, compacted_message_count, input_tokens_before, input_tokens_after, summary, error and created_at, as recorded by the service. Missing or inaccessible managed sessions return 404 not_found_error.",
2245
+ "description": "Read session compaction history and summaries.\n\nAvailable only on /agent/v1. Returns { data: [...], active }. active is the queued or running compaction ({ type: session_compaction, id, status, trigger: manual|auto|idle }), or null when none; manual work takes precedence. Each data entry contains type, id, event_id, trigger, status, model, compacted_message_count, input_tokens_before, input_tokens_after, summary, error and created_at, as recorded by the service. Missing or inaccessible managed sessions return 404 not_found_error.",
2395
2246
  "http": "GET",
2396
2247
  "path": "/agent/v1/sessions/{session_id}/compactions",
2397
2248
  "streaming": "no",
@@ -2603,9 +2454,9 @@ export const operations = [
2603
2454
  "query": [
2604
2455
  {
2605
2456
  "name": "limit",
2606
- "type": "number",
2457
+ "type": "integer",
2607
2458
  "required": false,
2608
- "description": "Number of items per page."
2459
+ "description": "Number of resources per page, from 1 to 100; defaults to 100."
2609
2460
  },
2610
2461
  {
2611
2462
  "name": "page",
@@ -3965,7 +3816,7 @@ export const operations = [
3965
3816
  "resource": "automation.actions",
3966
3817
  "method": "list",
3967
3818
  "summary": "List actions",
3968
- "description": "Discover callable Actions and their ns/name references without executing them. Combine each returned namespace and name as ns/name; Action calls use the current revision and do not accept @version or @tag. Filter by name or description; results include seven-day statistics and revision summaries without implementation source. Archived actions are excluded by default.",
3819
+ "description": "Discover callable Actions and their ns/name references without executing them. Combine each returned namespace and name as ns/name; Action calls use the current revision and do not accept @version or @tag. Filter by name or description; results include seven-day statistics and revision summaries without implementation source. Archived actions are excluded by default. List items carry no input contract: get the action and read current_revision.input_schema. Call it with call(\"ns/name\", input) in a script or call: ns/name with with: in a workflow.",
3969
3820
  "http": "GET",
3970
3821
  "path": "/automation/v1/actions",
3971
3822
  "streaming": "no",
@@ -4134,7 +3985,7 @@ export const operations = [
4134
3985
  "resource": "automation.actions",
4135
3986
  "method": "retrieve",
4136
3987
  "summary": "Get an Action with its current input and output JSON Schemas",
4137
- "description": "Read the Action and its full current implementation, with input and output JSON Schemas at current_revision.input_schema and current_revision.output_schema. To read a built-in Action, use ns=praxis and name=<bare name>, for example name=ocr; invoke it in a script with call(\"ocr\", input). The response ETag is the current revision ID for conditional updates.",
3988
+ "description": "Read the Action and its full current implementation, with input and output JSON Schemas at current_revision.input_schema and current_revision.output_schema. To read a built-in Action, use ns=praxis and name=<bare name>, for example name=ocr; invoke it in a script with call(\"ocr\", input) or in a workflow step with call: ocr and with:. Input that breaks the contract returns INPUT_INVALID, with the fields in errors[]. The response ETag is the current revision ID for conditional updates.",
4138
3989
  "http": "GET",
4139
3990
  "path": "/automation/v1/actions/{ns}/{name}",
4140
3991
  "streaming": "no",
@@ -4550,6 +4401,177 @@ export const operations = [
4550
4401
  "fields": []
4551
4402
  }
4552
4403
  },
4404
+ {
4405
+ "resource": "automation.humanTasks",
4406
+ "method": "list",
4407
+ "summary": "List human tasks",
4408
+ "description": "List the human tasks that praxis/approval workflow steps opened, newest first. By default it returns only open tasks assigned to the caller: their approval inbox. scope=all lists every task of the organization, and status and run_id narrow the list. Use a returned id with retrieve for details and respond to decide. Read-only: listing never changes a task.",
4409
+ "http": "GET",
4410
+ "path": "/automation/v1/human-tasks",
4411
+ "streaming": "no",
4412
+ "pagination": true,
4413
+ "pathParams": [],
4414
+ "query": [
4415
+ {
4416
+ "name": "limit",
4417
+ "type": "integer",
4418
+ "required": false,
4419
+ "description": "Page size, 1–100, default 50."
4420
+ },
4421
+ {
4422
+ "name": "cursor",
4423
+ "type": "string",
4424
+ "required": false,
4425
+ "description": "The next_cursor of the previous page; omit for the first page."
4426
+ },
4427
+ {
4428
+ "name": "status",
4429
+ "type": "array",
4430
+ "itemType": "string",
4431
+ "enum": [
4432
+ "open",
4433
+ "completed",
4434
+ "expired",
4435
+ "cancelled"
4436
+ ],
4437
+ "required": false,
4438
+ "description": "Filter by status, comma-separated: open, completed, expired, cancelled. Defaults to open."
4439
+ },
4440
+ {
4441
+ "name": "run_id",
4442
+ "type": "string",
4443
+ "required": false,
4444
+ "description": "Only tasks opened by this run (run_)."
4445
+ },
4446
+ {
4447
+ "name": "scope",
4448
+ "type": "string",
4449
+ "enum": [
4450
+ "assigned",
4451
+ "all"
4452
+ ],
4453
+ "required": false,
4454
+ "description": "assigned (default) lists only tasks assigned to the caller; all lists every task of the organization."
4455
+ }
4456
+ ]
4457
+ },
4458
+ {
4459
+ "resource": "automation.humanTasks",
4460
+ "method": "retrieve",
4461
+ "summary": "Retrieve a human task",
4462
+ "description": "Read one human task - title, Markdown body, context, actions, form, assignees, mode, due time, responses and outcome - so an assignee can choose an action and fill the form. Read-only; the Console approval page /automation/tasks/{id} reads the same resource.",
4463
+ "http": "GET",
4464
+ "path": "/automation/v1/human-tasks/{id}",
4465
+ "streaming": "no",
4466
+ "pagination": false,
4467
+ "pathParams": [
4468
+ {
4469
+ "name": "id",
4470
+ "sdkName": "id",
4471
+ "description": "Human task ID (htask_), from the list or the run's waits."
4472
+ }
4473
+ ],
4474
+ "query": []
4475
+ },
4476
+ {
4477
+ "resource": "automation.humanTasks",
4478
+ "method": "cancel",
4479
+ "summary": "Cancel a human task",
4480
+ "description": "Cancel an open human task; only the person who started the run or an organization API key may cancel. The task becomes cancelled and the waiting workflow step raises a runtime error with code HUMAN_TASK_CANCELLED, which try/catch can catch. Open tasks are cancelled automatically when their run ends, so this call is not needed then.",
4481
+ "http": "POST",
4482
+ "path": "/automation/v1/human-tasks/{id}/cancel",
4483
+ "streaming": "no",
4484
+ "pagination": false,
4485
+ "pathParams": [
4486
+ {
4487
+ "name": "id",
4488
+ "sdkName": "id",
4489
+ "description": "Human task ID (htask_)."
4490
+ }
4491
+ ],
4492
+ "query": [],
4493
+ "body": {
4494
+ "required": false,
4495
+ "fields": [
4496
+ {
4497
+ "name": "reason",
4498
+ "type": "string",
4499
+ "required": false,
4500
+ "description": "Optional cancellation reason, at most 500 characters."
4501
+ }
4502
+ ]
4503
+ }
4504
+ },
4505
+ {
4506
+ "resource": "automation.humanTasks",
4507
+ "method": "delegate",
4508
+ "summary": "Delegate a human task",
4509
+ "description": "An assignee who has not responded hands their place to another user (to_user), replacing their entry in assignees.users in place, so sequential order is kept. The new user cannot already be an assignee, nor the initiator unless self-approval is allowed. The task must still be open.",
4510
+ "http": "POST",
4511
+ "path": "/automation/v1/human-tasks/{id}/delegate",
4512
+ "streaming": "no",
4513
+ "pagination": false,
4514
+ "pathParams": [
4515
+ {
4516
+ "name": "id",
4517
+ "sdkName": "id",
4518
+ "description": "Human task ID (htask_)."
4519
+ }
4520
+ ],
4521
+ "query": [],
4522
+ "body": {
4523
+ "required": true,
4524
+ "fields": [
4525
+ {
4526
+ "name": "to_user",
4527
+ "type": "string",
4528
+ "required": true,
4529
+ "description": "User ID taking over; cannot already be an assignee, nor the initiator unless self-approval is allowed."
4530
+ }
4531
+ ]
4532
+ }
4533
+ },
4534
+ {
4535
+ "resource": "automation.humanTasks",
4536
+ "method": "respond",
4537
+ "summary": "Respond to a human task",
4538
+ "description": "Submit an action (action_id), form values (values) and a comment as the calling user. Depending on the task's mode the response either decides it (status becomes completed, outcome is set, and the waiting workflow resumes with outcome as the step output) or is recorded while other assignees are awaited. When two assignees respond at once, exactly one decides and the other gets TASK_CLOSED. An agent may respond only if the workflow set allow_agent_decision. Send an Idempotency-Key to retry safely.",
4539
+ "http": "POST",
4540
+ "path": "/automation/v1/human-tasks/{id}/respond",
4541
+ "streaming": "no",
4542
+ "pagination": false,
4543
+ "pathParams": [
4544
+ {
4545
+ "name": "id",
4546
+ "sdkName": "id",
4547
+ "description": "Human task ID (htask_)."
4548
+ }
4549
+ ],
4550
+ "query": [],
4551
+ "body": {
4552
+ "required": true,
4553
+ "fields": [
4554
+ {
4555
+ "name": "action_id",
4556
+ "type": "string",
4557
+ "required": true,
4558
+ "description": "The chosen action ID from the task's actions, for example approve."
4559
+ },
4560
+ {
4561
+ "name": "values",
4562
+ "type": "object",
4563
+ "required": false,
4564
+ "description": "Any JSON object whose keys are strings and whose values are any JSON value."
4565
+ },
4566
+ {
4567
+ "name": "comment",
4568
+ "type": "string",
4569
+ "required": false,
4570
+ "description": "Comment of at most 4000 characters; required when the action has require_comment true."
4571
+ }
4572
+ ]
4573
+ }
4574
+ },
4553
4575
  {
4554
4576
  "resource": "automation.resolve",
4555
4577
  "method": "retrieve",
@@ -4730,7 +4752,7 @@ export const operations = [
4730
4752
  "resource": "automation.runs",
4731
4753
  "method": "create",
4732
4754
  "summary": "Run a published target or execute draft source",
4733
- "description": "Execute a published script or workflow with target, or test unpublished code directly with source and language (ts for TypeScript, yaml for workflow YAML), without first saving or publishing a definition. Minimal script: `export default async ({ file_id }: { file_id: string }) => { const result = await call(\"ocr\", { document: { type: \"file\", file_id } }); return result; }`; send it as source with language=\"ts\", input={\"file_id\":\"<uploaded file ID>\"} and wait=0, using a PDF or image already uploaded to your account. To call a platform API directly in the same script, use the praxis SDK object, for example `praxis.model.ocr.create({ body: { model: \"glm-ocr\", document: { type: \"file\", file_id } } })`; Action IDs are strings passed to call(), not SDK methods such as praxis.ocr(...). praxis, call, invoke, console and codemode are module-scope bindings, not on globalThis, and need no import; invoke(\"namespace/name\", input) starts a child run. target and source are mutually exclusive; target accepts ns/name@version, @tag or @range and defaults to latest when @ is omitted. Source/input validation precedes run creation, so a separate validate call is optional. input defaults to {} and must match the input schema and fit within 1 MiB. wait is 0–60 seconds (default 0): a terminal run returns 200, otherwise 202. Use the returned id with praxis.automation.runs.retrieve and inspect status, output and error; acceptance does not mean successful completion. For long-running, background or batch work, use wait: 0 and poll the run, or split work into child runs or a workflow; wait only controls the response wait and does not extend execution limits. Actions time out after 30 s (run-sandbox after 10 min); scripts have a 5 min wall-clock limit and a 30 s CPU limit; workflows default to 24 h and allow up to 7 days. Each run can start at most 100 child runs, with at most 20 active at once; nesting depth is limited to 10. Idempotency-Key is scoped to tenant, method and path for 24 hours, excluding wait from the fingerprint; replay returns the current run with Idempotent-Replayed: true, changed contents return 422 and an in-flight request returns 409. New non-deterministic run IDs contain 78 characters, compared with 46 for legacy random IDs; treat IDs as opaque strings. Historical and deterministic IDs remain valid; same-millisecond order is not guaranteed.",
4755
+ "description": "Execute a published script or workflow with target, or test unpublished code directly with source and language (ts for TypeScript, yaml for workflow YAML), without first saving or publishing a definition. Minimal script: `export default async ({ file_id }: { file_id: string }) => { const result = await call(\"ocr\", { document: { type: \"file\", file_id } }); return result; }`; send it as source with language=\"ts\", input={\"file_id\":\"<uploaded file ID>\"} and wait=0, using a PDF or image already uploaded to your account. To call a platform API directly in the same script, use the praxis SDK object, for example `praxis.model.ocr.create({ body: { model: \"glm-ocr\", document: { type: \"file\", file_id } } })`; Action IDs are strings passed to call(), not SDK methods such as praxis.ocr(...). praxis, call, invoke, console and codemode are module-scope bindings, not on globalThis, and need no import; invoke(\"namespace/name\", input) starts a child run. target and source are mutually exclusive; target accepts ns/name@version, @tag or @range and defaults to latest when @ is omitted. Source/input validation precedes run creation, so a separate validate call is optional. input defaults to {} and must match the input schema and fit within 1 MiB. wait is 0–60 seconds (default 0): a terminal run returns 200, otherwise 202. Use the returned id with praxis.automation.runs.retrieve and inspect status, output and error; acceptance does not mean successful completion. For long-running, background or batch work, use wait: 0 and poll the run, or split work into child runs or a workflow; wait only controls the response wait and does not extend execution limits. Actions time out after 30 s (run-sandbox after 10 min); scripts have a 5 min wall-clock limit and a 30 s CPU limit; workflows default to 24 h and allow up to 30 days. Each run can start at most 100 child runs, with at most 20 active at once; nesting depth is limited to 10. Idempotency-Key is scoped to tenant, method and path for 24 hours, excluding wait from the fingerprint; replay returns the current run with Idempotent-Replayed: true, changed contents return 422 and an in-flight request returns 409. With language=yaml, source is a workflow YAML: the run input is . in the first step, and the shape is described in create workflow. Error details are in errors[] (pointer, detail, hint). New non-deterministic run IDs contain 78 characters, compared with 46 for legacy random IDs; treat IDs as opaque strings. Historical and deterministic IDs remain valid; same-millisecond order is not guaranteed.",
4734
4756
  "http": "POST",
4735
4757
  "path": "/automation/v1/runs",
4736
4758
  "streaming": "no",
@@ -5222,7 +5244,7 @@ export const operations = [
5222
5244
  "resource": "automation.scripts",
5223
5245
  "method": "create",
5224
5246
  "summary": "Create a script",
5225
- "description": "Save a TypeScript script as an editable draft for later reuse; this does not publish or start a run. Choose your own namespace without registering it first; praxis is reserved for built-in Actions. Scripts and workflows share names within the tenant; a duplicate returns NAME_TAKEN. The draft is a source string with a default-exported function, for example `export default async (input: {name: string}) => ({greeting: \"Hello, \" + input.name});`. Scripts provide praxis, call, invoke, console and codemode as module-scope bindings, not on globalThis, with no import needed: praxis.<domain>.<resource>.<method>(...) calls a platform API, call(\"ocr\", input) calls a built-in Action, and invoke(\"namespace/name\", input) starts a child run. Action IDs are strings (bare names for built-ins, namespace/name for your own Actions); praxis.ocr(...) does not exist. To test it, pass that source and language=ts to praxis.automation.runs.create without publishing. To publish later, use the returned draft.revision as expected_draft_revision.",
5247
+ "description": "Save a TypeScript script as an editable draft for later reuse; this does not publish or start a run. Choose your own namespace without registering it first; praxis is reserved for built-in Actions. Scripts and workflows share names within the tenant; a duplicate returns NAME_TAKEN. The draft is a source string with a default-exported function, for example `export default async (input: {name: string}) => ({greeting: \"Hello, \" + input.name});`. Scripts provide praxis, call, invoke, console and codemode as module-scope bindings, not on globalThis, with no import needed: praxis.<domain>.<resource>.<method>(...) calls a platform API, call(\"ocr\", input) calls a built-in Action, and invoke(\"namespace/name\", input) starts a child run. Action IDs are strings (bare names for built-ins, namespace/name for your own Actions); praxis.ocr(...) does not exist. The return value is limited to 1 MiB: write large results to a file with call(\"write-file\", ...) and return the file ID. A call error carries errors[] (pointer, detail, hint); String(e) is only the summary. To test it, pass that source and language=ts to praxis.automation.runs.create without publishing. To publish later, use the returned draft.revision as expected_draft_revision.",
5226
5248
  "http": "POST",
5227
5249
  "path": "/automation/v1/scripts",
5228
5250
  "streaming": "no",
@@ -6171,7 +6193,7 @@ export const operations = [
6171
6193
  "resource": "automation.validate",
6172
6194
  "method": "create",
6173
6195
  "summary": "Validate a definition",
6174
- "description": "Check source without executing it when you need diagnostics, inferred schemas or references. This is optional before praxis.automation.runs.create, which also validates source before execution. Actions, scripts and workflows are supported; results include validity without saving. Invalid source is reported with valid=false. Script/action output schemas are inferred from return types: Promise unwrapping, Record, intersections and Date. Unknown types yield an empty schema and a warning in warnings. Source diagnostics use /source or /implementation/source with 1-based line/column. For kind=action the same admission checks as action creation apply (no external imports, platform operations only as direct call(praxis/<api>.<op>, input) calls, no agent or automation calls), so source that validates is not rejected at creation.",
6196
+ "description": "Check source without executing it when you need diagnostics, inferred schemas or references. This is optional before praxis.automation.runs.create, which also validates source before execution. Actions, scripts and workflows are supported; results include validity without saving. Invalid source is reported with valid=false. Script/action output schemas are inferred from return types: Promise unwrapping, Record, intersections and Date. Unknown types yield an empty schema and a warning in warnings. Source diagnostics use /source or /implementation/source with 1-based line/column. For kind=action the same admission checks as action creation apply (no external imports, platform operations only as direct call(praxis/<api>.<op>, input) calls, no agent or automation calls), so source that validates is not rejected at creation. For kind=workflow the YAML needs document (dsl, namespace, name, version) and do; each problem is one entry in errors[] (pointer, detail, hint), so read the first one. A listen outside the supported subset (to.all, inside a fork) and emit are not reported here and fail with DEFINITION_INVALID only when a run is created. Workflow syntax reference: https://deepraxis.com/docs/developers/automation/reference/workflow-syntax.",
6175
6197
  "http": "POST",
6176
6198
  "path": "/automation/v1/validate",
6177
6199
  "streaming": "no",
@@ -6278,7 +6300,7 @@ export const operations = [
6278
6300
  "resource": "automation.workflows",
6279
6301
  "method": "create",
6280
6302
  "summary": "Create a workflow",
6281
- "description": "Save a YAML workflow as an editable draft without publishing or starting a run. Choose your own namespace without registering it first; praxis is reserved for built-in Actions. To test the draft, send its source and language=yaml to praxis.automation.runs.create. Scripts and workflows share names within the tenant; a duplicate returns NAME_TAKEN. run.workflow accepts ns/name@range or {namespace, name, version, input}; run.script uses the same reference shape as a platform extension. Object namespace, name and version are required; version accepts an exact version, dist-tag or range, locked at publication. Object input defaults to {} and supports expressions; string references retain task-level with. run.await defaults to true and returns the child output. With false, the child uses detach and the task immediately returns {run_id}; parent cancellation does not cascade. Inline script.code returns DEFINITION_INVALID with a detail asking you to save a script and reference it first. raise.error retains its type URI, status, title and detail in the run error.",
6303
+ "description": "Workflow syntax reference: https://deepraxis.com/docs/developers/automation/reference/workflow-syntax. Save a YAML workflow as an editable draft; this does not validate, publish or run it, so check it with validate (kind=workflow) first. Minimal draft: document with dsl (\"1.0.3\"), namespace, name and version, plus a do list of steps, for example document: {dsl: \"1.0.3\", namespace: demo, name: add, version: \"1.0.0\"} and do: [{first: {call: demo/add-one, with: {n: \"${ .n }\"}}}]. call: <ns/name> calls an Action directly (bare name for built-ins such as ocr) and with is the Action input; the input contract is at current_revision.input_schema in the get-action response. run: starts a saved script or child workflow. The run input is . in the first step, and expressions are jq written as a whole ${ ... } string. Limits: Action 30 s (run-sandbox 10 min), workflow 24 h by default and 30 days at most, payload 1 MiB. Test the draft by sending its source and language=yaml to praxis.automation.runs.create. Guide: /docs/developers/automation/guides/write-workflow. Error details are in the errors[] of the response (pointer, detail, hint). Choose your own namespace without registering it first; praxis is reserved for built-in Actions. Scripts and workflows share names within the tenant; a duplicate returns NAME_TAKEN. run.workflow accepts ns/name@range or {namespace, name, version, input}; run.script uses the same reference shape as a platform extension. Object namespace, name and version are required; version accepts an exact version, dist-tag or range, locked at publication. Object input defaults to {} and supports expressions; string references retain task-level with. run.await defaults to true and returns the child output. With false, the child uses detach and the task immediately returns {run_id}; parent cancellation does not cascade. Inline script.code returns DEFINITION_INVALID with a detail asking you to save a script and reference it first. raise.error retains its type URI, status, title and detail in the run error.",
6282
6304
  "http": "POST",
6283
6305
  "path": "/automation/v1/workflows",
6284
6306
  "streaming": "no",
@@ -6348,7 +6370,7 @@ export const operations = [
6348
6370
  "resource": "automation.workflows",
6349
6371
  "method": "update",
6350
6372
  "summary": "Update a workflow draft",
6351
- "description": "Update description, labels or draft with the current draft revision in If-Match. Even metadata-only updates create a new draft revision.",
6373
+ "description": "Update description, labels or draft with the current draft revision in If-Match, taken from draft.revision in the get-workflow response. Even metadata-only updates create a new draft revision. A mismatch returns 412 PRECONDITION_FAILED; read the draft again, merge and retry. The draft is not validated here, so check it with validate (kind=workflow) before publishing. Error details are in errors[]. See the workflow syntax reference at https://deepraxis.com/docs/developers/automation/reference/workflow-syntax.",
6352
6374
  "http": "PATCH",
6353
6375
  "path": "/automation/v1/workflows/{ns}/{name}",
6354
6376
  "streaming": "no",
@@ -6586,7 +6608,7 @@ export const operations = [
6586
6608
  "publish"
6587
6609
  ],
6588
6610
  "summary": "Publish a workflow version",
6589
- "description": "Publish a saved definition from its draft or an ad hoc run as a reusable version for named runs or triggers, validating the definition and locking dependencies. To test unpublished code, use praxis.automation.runs.create with source and language instead. Use draft.revision from create or retrieve as expected_draft_revision. The draft must match expected_draft_revision; an ad hoc run requires from_run and expected_source_sha256. The same version and contents return the existing version; different contents return VERSION_EXISTS, prereleases require an explicit tag (not latest, URL-safe characters only, not a version or range; violations return TAG_REQUIRED or TAG_INVALID with the complete rules in hint), and invalid definitions return DEFINITION_INVALID. Stable releases automatically advance latest only above the highest existing stable version; workflows becoming latest synchronize their declared schedule. String and object run.workflow/run.script references share version resolution and dependency locking. Publishing removes +build metadata from the version number.",
6611
+ "description": "Publish a saved definition from its draft or an ad hoc run as a reusable version for named runs or triggers, validating the definition and locking dependencies. To test unpublished code, use praxis.automation.runs.create with source and language instead. Use draft.revision from create or retrieve as expected_draft_revision. The draft must match expected_draft_revision; an ad hoc run requires from_run and expected_source_sha256. The same version and contents return the existing version; different contents return VERSION_EXISTS, prereleases require an explicit tag (not latest, URL-safe characters only, not a version or range; violations return TAG_REQUIRED or TAG_INVALID with the complete rules in hint), and invalid definitions return DEFINITION_INVALID. Stable releases automatically advance latest only above the highest existing stable version; workflows becoming latest synchronize their declared schedule. String and object run.workflow/run.script references share version resolution and dependency locking. Publishing removes +build metadata from the version number. For a workflow, document namespace, name and version must equal the publish target, otherwise DEFINITION_IDENTITY_MISMATCH; where a DEFINITION_INVALID failure sits is listed in errors[] (pointer, detail, hint).",
6590
6612
  "http": "POST",
6591
6613
  "path": "/automation/v1/workflows/{ns}/{name}/versions",
6592
6614
  "streaming": "no",
@@ -8270,7 +8292,7 @@ export const operations = [
8270
8292
  "resource": "file.files",
8271
8293
  "method": "create",
8272
8294
  "summary": "Upload file",
8273
- "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.",
8295
+ "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 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–7776000). Without expiry, the file persists until deleted.",
8274
8296
  "http": "POST",
8275
8297
  "path": "/file/v1/files",
8276
8298
  "streaming": "no",
@@ -8292,23 +8314,16 @@ export const operations = [
8292
8314
  "type": "string",
8293
8315
  "enum": [
8294
8316
  "user_data",
8295
- "assistants",
8296
8317
  "vision"
8297
8318
  ],
8298
8319
  "required": true,
8299
- "description": "Purpose label stored with the file: user_data, assistants or vision. The vision purpose accepts only PNG, JPEG, GIF and WebP images. Conversation image references require user_data."
8320
+ "description": "Purpose label stored with the file: user_data or vision. The vision purpose accepts only PNG, JPEG, GIF and WebP images. Conversation image references require user_data."
8300
8321
  },
8301
8322
  {
8302
8323
  "name": "expires_after",
8303
8324
  "type": "object",
8304
8325
  "required": false,
8305
8326
  "description": "Optional expiry relative to created_at. Files without an expiry persist until deleted."
8306
- },
8307
- {
8308
- "name": "praxis",
8309
- "type": "object",
8310
- "required": false,
8311
- "description": "Own-face extensions. Use at most one expiry setting."
8312
8327
  }
8313
8328
  ]
8314
8329
  }
@@ -8371,7 +8386,7 @@ export const operations = [
8371
8386
  "resource": "file.uploads",
8372
8387
  "method": "create",
8373
8388
  "summary": "Create an upload",
8374
- "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.",
8389
+ "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 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.",
8375
8390
  "http": "POST",
8376
8391
  "path": "/file/v1/uploads",
8377
8392
  "streaming": "no",
@@ -8404,11 +8419,10 @@ export const operations = [
8404
8419
  "type": "string",
8405
8420
  "enum": [
8406
8421
  "user_data",
8407
- "assistants",
8408
8422
  "vision"
8409
8423
  ],
8410
8424
  "required": true,
8411
- "description": "Use user_data for conversation attachments, assistants for assistant files, or vision for PNG, JPEG, GIF and WebP images."
8425
+ "description": "Use user_data for conversation attachments, or vision for PNG, JPEG, GIF and WebP images."
8412
8426
  },
8413
8427
  {
8414
8428
  "name": "expires_after",
@@ -9588,7 +9602,7 @@ export const operations = [
9588
9602
  "name": "overwrite",
9589
9603
  "type": "boolean",
9590
9604
  "required": false,
9591
- "description": "Allow replacing an existing public_id, preserving its asset_id and increasing its version. False returns the existing resource without replacing it; defaults to true."
9605
+ "description": "Allow replacing an existing public_id, preserving its asset_id and increasing its version. Only the latest version is deliverable; old version URLs return 404. Create a new public_id to retain old deliveries. False returns the existing resource without replacing it; defaults to true."
9592
9606
  },
9593
9607
  {
9594
9608
  "name": "tags",
@@ -9646,7 +9660,8 @@ export const operations = [
9646
9660
  {
9647
9661
  "name": "file_id",
9648
9662
  "type": "string",
9649
- "required": true
9663
+ "required": true,
9664
+ "description": "File ID to copy into this library; passed as the upload source instead of file bytes. This creates an independent public copy readable without authentication. Deleting the source File does not delete this asset; do not import confidential content."
9650
9665
  },
9651
9666
  {
9652
9667
  "name": "public_id",
@@ -9700,7 +9715,7 @@ export const operations = [
9700
9715
  "name": "overwrite",
9701
9716
  "type": "boolean",
9702
9717
  "required": false,
9703
- "description": "Allow replacing an existing public_id, preserving its asset_id and increasing its version. False returns the existing resource without replacing it; defaults to true."
9718
+ "description": "Allow replacing an existing public_id, preserving its asset_id and increasing its version. Only the latest version is deliverable; old version URLs return 404. Create a new public_id to retain old deliveries. False returns the existing resource without replacing it; defaults to true."
9704
9719
  },
9705
9720
  {
9706
9721
  "name": "tags",
@@ -10217,7 +10232,7 @@ export const operations = [
10217
10232
  "name": "expression",
10218
10233
  "type": "string",
10219
10234
  "required": false,
10220
- "description": "Asset filter expression supporting field comparisons, AND, OR, NOT, parentheses and suffix wildcards. An empty expression matches all assets."
10235
+ "description": "Asset filter expression supporting field comparisons, AND, OR, NOT, parentheses and suffix wildcards. An empty expression matches all assets. For business metadata use context.sku=KETTLE-RED AND context.revision=2; request with_field: [\"context\"] to include context."
10221
10236
  },
10222
10237
  {
10223
10238
  "name": "sort_by",
@@ -10363,6 +10378,70 @@ export const operations = [
10363
10378
  ]
10364
10379
  }
10365
10380
  },
10381
+ {
10382
+ "resource": "meta.docs",
10383
+ "method": "search",
10384
+ "summary": "Search platform documentation",
10385
+ "description": "Find guides and references by keyword before reading them with praxis.meta.docs.retrieve. Public; no API key required. Matches documentation titles, headings and page text without case sensitivity; all query words must occur. q is required; limit defaults to 20 and accepts 1–50. lang defaults to zh or use en for English. Returns paths, page titles, canonical URLs and short matching snippets; no matches returns an empty array.",
10386
+ "http": "GET",
10387
+ "path": "/meta/v1/docs/search",
10388
+ "streaming": "no",
10389
+ "pagination": false,
10390
+ "pathParams": [],
10391
+ "query": [
10392
+ {
10393
+ "name": "q",
10394
+ "type": "string",
10395
+ "required": true,
10396
+ "description": "Keywords describing the syntax or guide needed, for example export or workflow."
10397
+ },
10398
+ {
10399
+ "name": "limit",
10400
+ "type": "integer",
10401
+ "required": false,
10402
+ "description": "Maximum number of matching pages returned; integer 1–50, default 20."
10403
+ },
10404
+ {
10405
+ "name": "lang",
10406
+ "type": "string",
10407
+ "enum": [
10408
+ "zh",
10409
+ "en"
10410
+ ],
10411
+ "required": false,
10412
+ "description": "Documentation language: zh for Chinese (default), en for English."
10413
+ }
10414
+ ]
10415
+ },
10416
+ {
10417
+ "resource": "meta.docs",
10418
+ "method": "retrieve",
10419
+ "summary": "Read documentation Markdown",
10420
+ "description": "Read a platform guide or reference before implementing an unfamiliar capability. Public; no API key required. Take path from praxis.meta.docs.search, or use developers/automation/guides/write-workflow. Append #heading-id to path to read only that section, including its subsections. Encode the hash as %23 over HTTP; SDK callers pass it in the path string. lang defaults to zh; en selects the English page. Unknown pages or anchors return DOC_NOT_FOUND; search again for a valid path.",
10421
+ "http": "GET",
10422
+ "path": "/meta/v1/docs/{path}",
10423
+ "streaming": "no",
10424
+ "pagination": false,
10425
+ "pathParams": [
10426
+ {
10427
+ "name": "path",
10428
+ "sdkName": "path",
10429
+ "description": "Slash-separated documentation path from docs.search; optionally append #heading-id to select a section."
10430
+ }
10431
+ ],
10432
+ "query": [
10433
+ {
10434
+ "name": "lang",
10435
+ "type": "string",
10436
+ "enum": [
10437
+ "zh",
10438
+ "en"
10439
+ ],
10440
+ "required": false,
10441
+ "description": "Documentation language: zh for Chinese (default), en for English."
10442
+ }
10443
+ ]
10444
+ },
10366
10445
  {
10367
10446
  "resource": "meta.health",
10368
10447
  "method": "retrieve",