@deepraxis/cli 0.1.0-dev.449ac38 → 0.1.0-dev.48c1ce8

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.
Files changed (3) hide show
  1. package/COMMANDS.md +20 -5
  2. package/dist/praxis.js +718 -48
  3. package/package.json +1 -1
package/COMMANDS.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Generated by `bun run commands`. DO NOT EDIT.
4
4
 
5
- 353 HTTP operations; 355 commands including aliases.
5
+ 368 HTTP operations; 370 commands including aliases.
6
6
 
7
7
  Environment: `PRAXIS_ENV=develop|production` (dev package defaults to `develop`; stable package defaults to `production`). No `--env` option.
8
8
 
@@ -21,15 +21,17 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
21
21
  | `praxis agent archive <agent_id>` | `agent.agents.archive` | POST `/agent/v1/agents/{agent_id}/archive` | |
22
22
  | `praxis agent computer archive <computer_id>` | `agent.computers.archive` | POST `/agent/v1/computers/{computer_id}/archive` | |
23
23
  | `praxis agent computer attachment create` | `agent.computers.attachments.create` | POST `/agent/v1/computers/{computer_id}/attachments` | `--computer`, `--name` |
24
- | `praxis agent computer connect <computer_id>` | `agent.computers.connect` | POST `/agent/v1/computers/{computer_id}/connect` | |
24
+ | `praxis agent computer connect <computer_id>` | `agent.computers.connect` | POST `/agent/v1/computers/{computer_id}/connect` | `--need` |
25
25
  | `praxis agent computer create` | `agent.computers.create` | POST `/agent/v1/computers` | `--name`, `--environment-id` |
26
26
  | `praxis agent computer delete <computer_id>` | `agent.computers.delete` | DELETE `/agent/v1/computers/{computer_id}` | |
27
27
  | `praxis agent computer file get-content` | `agent.computers.files.retrieveContent` | GET `/agent/v1/computers/{computer_id}/files/content` | `--computer`, `--path` |
28
28
  | `praxis agent computer file list` | `agent.computers.files.list` | GET `/agent/v1/computers/{computer_id}/files` | `--computer`, `--path` |
29
29
  | `praxis agent computer get <computer_id>` | `agent.computers.retrieve` | GET `/agent/v1/computers/{computer_id}` | |
30
+ | `praxis agent computer lease delete <lease_id>` | `agent.computers.leases.delete` | DELETE `/agent/v1/computers/{computer_id}/leases/{lease_id}` | `--computer` |
31
+ | `praxis agent computer lease renew create` | `agent.computers.leases.renew.create` | POST `/agent/v1/computers/{computer_id}/leases/{lease_id}/renew` | `--computer`, `--lease` |
30
32
  | `praxis agent computer list` | `agent.computers.list` | GET `/agent/v1/computers` | `--param-limit`, `--page` |
31
33
  | `praxis agent computer update <computer_id>` | `agent.computers.update` | POST `/agent/v1/computers/{computer_id}` | `--name` |
32
- | `praxis agent create` | `agent.agents.create` | POST `/agent/v1/agents` | `--name`, `--description`, `--system`, `--kind`, `--computer-id`, `--subagent-model` |
34
+ | `praxis agent create` | `agent.agents.create` | POST `/agent/v1/agents` | `--name`, `--description`, `--system`, `--kind`, `--computer-id`, `--subagent-model`, `--preset` |
33
35
  | `praxis agent deployment archive <deployment_id>` | `agent.deployments.archive` | POST `/agent/v1/deployments/{deployment_id}/archive` | |
34
36
  | `praxis agent deployment create` | `agent.deployments.create` | POST `/agent/v1/deployments` | `--environment-id`, `--name`, `--description`, `--vault-ids` |
35
37
  | `praxis agent deployment get <deployment_id>` | `agent.deployments.retrieve` | GET `/agent/v1/deployments/{deployment_id}` | |
@@ -40,9 +42,19 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
40
42
  | `praxis agent deployment update <deployment_id>` | `agent.deployments.update` | POST `/agent/v1/deployments/{deployment_id}` | `--description`, `--environment-id`, `--name`, `--vault-ids` |
41
43
  | `praxis agent deployment-run get <deployment_run_id>` | `agent.deploymentRuns.retrieve` | GET `/agent/v1/deployment_runs/{deployment_run_id}` | |
42
44
  | `praxis agent deployment-run list` | `agent.deploymentRuns.list` | GET `/agent/v1/deployment_runs` | `--created-at-gt`, `--created-at-gte`, `--created-at-lt`, `--created-at-lte`, `--deployment-id`, `--has-error`, `--trigger-type`, `--param-limit`, `--page` |
43
- | `praxis agent embed-token create` | `agent.embedTokens.create` | POST `/agent/v1/embed_tokens` | `--agent`, `--param-version`, `--external-user-id`, `--ttl-seconds`, `--budget-cents`, `--allowed-origins` |
45
+ | `praxis agent embed exchange create` | `agent.embed.exchange.create` | POST `/agent/v1/embed/exchange` | `--code` |
46
+ | `praxis agent embed get-appearance` | `agent.embed.retrieveAppearance` | GET `/agent/v1/embed/appearance` | |
47
+ | `praxis agent embed-token anonymous create` | `agent.embedTokens.anonymous.create` | POST `/agent/v1/embed_tokens/anonymous` | `--publishable-key`, `--visitor-secret` |
48
+ | `praxis agent embed-token create` | `agent.embedTokens.create` | POST `/agent/v1/embed_tokens` | `--hosted`, `--agent`, `--param-version`, `--external-user-id`, `--ttl-seconds`, `--budget-cents`, `--allowed-origins` |
44
49
  | `praxis agent embed-token list` | `agent.embedTokens.list` | GET `/agent/v1/embed_tokens` | `--agent-id`, `--external-user-id`, `--param-limit`, `--page` |
45
50
  | `praxis agent embed-token revoke create` | `agent.embedTokens.revoke.create` | POST `/agent/v1/embed_tokens/{id}/revoke` | `--embed-token` |
51
+ | `praxis agent end-user block create` | `agent.agents.endUsers.block.create` | POST `/agent/v1/agents/{agent_id}/end_users/{external_user_id}/block` | `--agent`, `--end-user` |
52
+ | `praxis agent end-user delete <external_user_id>` | `agent.agents.endUsers.delete` | DELETE `/agent/v1/agents/{agent_id}/end_users/{external_user_id}` | `--agent`, `--confirm` |
53
+ | `praxis agent end-user get <external_user_id>` | `agent.agents.endUsers.retrieve` | GET `/agent/v1/agents/{agent_id}/end_users/{external_user_id}` | `--agent` |
54
+ | `praxis agent end-user get-deletion <external_user_id>` | `agent.agents.endUsers.retrieveDeletion` | GET `/agent/v1/agents/{agent_id}/end_users/{external_user_id}/deletion` | `--agent` |
55
+ | `praxis agent end-user list` | `agent.agents.endUsers.list` | GET `/agent/v1/agents/{agent_id}/end_users` | `--agent`, `--param-limit`, `--page`, `--q` |
56
+ | `praxis agent end-user revoke-token create` | `agent.agents.endUsers.revokeTokens.create` | POST `/agent/v1/agents/{agent_id}/end_users/{external_user_id}/revoke_tokens` | `--agent`, `--end-user` |
57
+ | `praxis agent end-user unblock create` | `agent.agents.endUsers.unblock.create` | POST `/agent/v1/agents/{agent_id}/end_users/{external_user_id}/unblock` | `--agent`, `--end-user` |
46
58
  | `praxis agent environment archive <environment_id>` | `agent.environments.archive` | POST `/agent/v1/environments/{environment_id}/archive` | |
47
59
  | `praxis agent environment create` | `agent.environments.create` | POST `/agent/v1/environments` | `--name`, `--description`, `--scope` |
48
60
  | `praxis agent environment get <environment_id>` | `agent.environments.retrieve` | GET `/agent/v1/environments/{environment_id}` | |
@@ -57,6 +69,7 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
57
69
  | `praxis agent session compact <session_id>` | `agent.sessions.compact` | POST `/agent/v1/sessions/{session_id}/compact` | `--instructions` |
58
70
  | `praxis agent session compaction list` | `agent.sessions.compactions.list` | GET `/agent/v1/sessions/{session_id}/compactions` | `--session` |
59
71
  | `praxis agent session create` | `agent.sessions.create` | POST `/agent/v1/sessions` | `--environment-id`, `--title`, `--vault-ids`, `--cwd`, `--computer-id`, `--time-zone`, `--model` |
72
+ | `praxis agent session delete <session_id>` | `agent.sessions.delete` | DELETE `/agent/v1/sessions/{session_id}` | |
60
73
  | `praxis agent session event list` | `agent.sessions.events.list` | GET `/agent/v1/sessions/{session_id}/events` | `--session`, `--created-at-gt`, `--created-at-gte`, `--created-at-lt`, `--created-at-lte`, `--order`, `--types`, `--param-limit`, `--page` |
61
74
  | `praxis agent session event send <session_id>` | `agent.sessions.events.send` | POST `/agent/v1/sessions/{session_id}/events` | |
62
75
  | `praxis agent session event stream` | `agent.sessions.events.stream` | GET `/agent/v1/sessions/{session_id}/events/stream` | `--session`, `--event-deltas` |
@@ -78,7 +91,8 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
78
91
  | `praxis agent session thread stream <thread_id>` | `agent.sessions.threads.stream` | GET `/agent/v1/sessions/{session_id}/threads/{thread_id}/stream` | `--session`, `--query-session-id`, `--event-deltas` |
79
92
  | `praxis agent session update <session_id>` | `agent.sessions.update` | POST `/agent/v1/sessions/{session_id}` | `--title`, `--vault-ids`, `--model` |
80
93
  | `praxis agent toolset list` | `agent.toolsets.list` | GET `/agent/v1/toolsets` | |
81
- | `praxis agent update <agent_id>` | `agent.agents.update` | POST `/agent/v1/agents/{agent_id}` | `--description`, `--name`, `--system`, `--param-version`, `--kind`, `--computer-id`, `--subagent-model` |
94
+ | `praxis agent unarchive create` | `agent.agents.unarchive.create` | POST `/agent/v1/agents/{agent_id}/unarchive` | `--agent` |
95
+ | `praxis agent update <agent_id>` | `agent.agents.update` | POST `/agent/v1/agents/{agent_id}` | `--description`, `--name`, `--system`, `--param-version`, `--kind`, `--computer-id`, `--subagent-model`, `--preset` |
82
96
  | `praxis agent version list` | `agent.agents.versions.list` | GET `/agent/v1/agents/{agent_id}/versions` | `--agent`, `--param-limit`, `--page` |
83
97
  | `praxis application asset upload` | `application.assets.upload.create` | POST `/application/v1/assets/upload` | `--jwt` |
84
98
  | `praxis application subdomain get` | `application.subdomain.retrieve` | GET `/application/v1/subdomain` | |
@@ -101,6 +115,7 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
101
115
  | `praxis application worker secret list` | `application.workers.secrets.list` | GET `/application/v1/workers/{worker_id}/secrets` | `--worker` |
102
116
  | `praxis application worker secret update <name>` | `application.workers.secrets.update` | PUT `/application/v1/workers/{worker_id}/secrets/{name}` | `--worker` |
103
117
  | `praxis application worker update <worker_id>` | `application.workers.update` | PATCH `/application/v1/workers/{worker_id}` | `--name`, `--tags` |
118
+ | `praxis application worker version asset get-manifest` | `application.workers.versions.assets.retrieveManifest` | GET `/application/v1/workers/{worker_id}/versions/{version_id}/assets/manifest` | `--worker`, `--param-version` |
104
119
  | `praxis application worker version create` | `application.workers.versions.create` | POST `/application/v1/workers/{worker_id}/versions` | `--worker`, `--deploy`, `--main-module`, `--compatibility-date`, `--compatibility-flags` |
105
120
  | `praxis application worker version get <version_id>` | `application.workers.versions.retrieve` | GET `/application/v1/workers/{worker_id}/versions/{version_id}` | `--worker` |
106
121
  | `praxis application worker version list` | `application.workers.versions.list` | GET `/application/v1/workers/{worker_id}/versions` | `--worker`, `--param-cursor`, `--param-limit` |
package/dist/praxis.js CHANGED
@@ -11,7 +11,7 @@ var operations = [
11
11
  resource: "agent.agents",
12
12
  method: "list",
13
13
  summary: "List agents",
14
- 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.",
14
+ 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=business for per-session environments. Pass next_page from the response as page to read the next page; a null next_page means the end.",
15
15
  http: "GET",
16
16
  path: "/agent/v1/agents",
17
17
  streaming: "no",
@@ -57,7 +57,7 @@ var operations = [
57
57
  type: "string",
58
58
  enum: [
59
59
  "personal",
60
- "service"
60
+ "business"
61
61
  ],
62
62
  required: false,
63
63
  description: "Filter agents by their immutable kind, including agents created before kind was recorded."
@@ -68,7 +68,7 @@ var operations = [
68
68
  resource: "agent.agents",
69
69
  method: "create",
70
70
  summary: "Create agent",
71
- description: 'Create a reusable agent definition, then pass its returned id to sessions.create to start a conversation. The definition includes model, system prompt, tools, MCP servers and an optional multiagent roster. It is saved as version 1; real updates create new versions. Unlike Anthropic Managed Agents, nonempty skills attachments and custom tool entries return 400; the native skill tool is separate from the skills field. Use tools: [{type: "agent_toolset_20260401"}] for built-in tools including codemode, skill and agent; inspect toolsets.list for names and schemas, and keep bash enabled for native additions. To offer only some tools, set default_config: {enabled: false} and list the tools to keep in configs, e.g. tools: [{type: "agent_toolset_20260401", default_config: {enabled: false}, configs: [{name: "codemode", enabled: true}, {name: "bash", enabled: true, permission_policy: {type: "always_ask"}}]}]; every tool not listed, including todo_write, enter_plan_mode, ask_user_question and goal_read, follows default_config, and the response echoes it. codemode runs through bash, so enabling codemode while bash is disabled returns 400. Optional mcp_toolset entries pair with mcp_servers. model accepts platform model IDs such as deepseek-flash, not only the Claude IDs in the protocol examples. model.settings.reasoning sets default thinking; other extra model controls return 400. Example: {"name":"helper","model":{"id":"deepseek-flash"},"tools":[{"type":"agent_toolset_20260401"}]}.',
71
+ description: 'Create a reusable agent definition, then pass its returned id to sessions.create to start a conversation. The definition includes model, system prompt, tools, MCP servers and an optional multiagent roster. It is saved as version 1; real updates create new versions. Unlike Anthropic Managed Agents, nonempty skills attachments return 400; the native skill tool is separate from the skills field. Use tools: [{type: "agent_toolset_20260401"}] for built-in tools including codemode, skill and agent; inspect toolsets.list for names and schemas, and keep bash enabled for native additions. To offer only some tools, set default_config: {enabled: false} and list the tools to keep in configs, e.g. tools: [{type: "agent_toolset_20260401", default_config: {enabled: false}, configs: [{name: "codemode", enabled: true}, {name: "bash", enabled: true, permission_policy: {type: "always_ask"}}]}]; every tool not listed, including todo_write, enter_plan_mode, ask_user_question and goal_read, follows default_config, and the response echoes it. codemode runs through bash, so enabling codemode while bash is disabled returns 400. Optional mcp_toolset entries pair with mcp_servers. model accepts platform model IDs such as deepseek-flash, not only the Claude IDs in the protocol examples. model.settings.reasoning sets default thinking; other extra model controls return 400. Example: {"name":"helper","model":{"id":"deepseek-flash"},"tools":[{"type":"agent_toolset_20260401"}]}.',
72
72
  http: "POST",
73
73
  path: "/agent/v1/agents",
74
74
  streaming: "no",
@@ -141,10 +141,10 @@ across all toolsets allowed.`
141
141
  type: "string",
142
142
  enum: [
143
143
  "personal",
144
- "service"
144
+ "business"
145
145
  ],
146
146
  required: false,
147
- 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."
147
+ description: "Immutable agent kind. personal requires computer_id; business 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
148
  },
149
149
  {
150
150
  name: "computer_id",
@@ -183,6 +183,17 @@ across all toolsets allowed.`
183
183
  type: "object",
184
184
  required: false,
185
185
  description: "Praxis extension: switchable model ids on /agent/v1 only. The default model must be included. When omitted, only the default model is selectable."
186
+ },
187
+ {
188
+ name: "preset",
189
+ type: "string",
190
+ enum: [
191
+ "minimal",
192
+ "data-editor",
193
+ "full"
194
+ ],
195
+ required: false,
196
+ description: "Optional tool preset. minimal enables read, glob, grep and ask_user_question; data-editor also enables write and edit; full uses the default toolset with always_allow. Explicit tools override matching preset entries. codemode requires bash and is absent from data-editor."
186
197
  }
187
198
  ]
188
199
  }
@@ -215,7 +226,7 @@ across all toolsets allowed.`
215
226
  resource: "agent.agents",
216
227
  method: "update",
217
228
  summary: "Update agent",
218
- description: "Update an agent. Send the current version in the body for optimistic concurrency: a stale version returns 409, and an update that changes nothing keeps the version number. Any real change saves a new version; existing sessions keep the version they were created with. Omitted fields keep their value. multiagent takes null or a coordinator roster; subagent_model keeps its value when omitted and is cleared by null. Archived agents cannot be updated. Unlike Anthropic Managed Agents, nonempty skills attachments and custom tools return 400; use the native skill tool for available runtime skills.",
229
+ description: "Update an agent. Send the current version in the body for optimistic concurrency: a stale version returns 409, and an update that changes nothing keeps the version number. Any real change saves a new version; existing sessions keep the version they were created with. Omitted fields keep their value. multiagent takes null or a coordinator roster; subagent_model keeps its value when omitted and is cleared by null. Archived agents cannot be updated. Unlike Anthropic Managed Agents, nonempty skills attachments return 400; use the native skill tool for available runtime skills.",
219
230
  http: "POST",
220
231
  path: "/agent/v1/agents/{agent_id}",
221
232
  streaming: "no",
@@ -306,10 +317,10 @@ current version; omit to apply the update unconditionally.`
306
317
  type: "string",
307
318
  enum: [
308
319
  "personal",
309
- "service"
320
+ "business"
310
321
  ],
311
322
  required: false,
312
- 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."
323
+ description: "Immutable agent kind. personal requires computer_id; business 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."
313
324
  },
314
325
  {
315
326
  name: "computer_id",
@@ -348,6 +359,17 @@ current version; omit to apply the update unconditionally.`
348
359
  type: "object",
349
360
  required: false,
350
361
  description: "Praxis extension: switchable model ids on /agent/v1 only. The default model must be included. When omitted, only the default model is selectable."
362
+ },
363
+ {
364
+ name: "preset",
365
+ type: "string",
366
+ enum: [
367
+ "minimal",
368
+ "data-editor",
369
+ "full"
370
+ ],
371
+ required: false,
372
+ description: "Optional tool preset. minimal enables read, glob, grep and ask_user_question; data-editor also enables write and edit; full uses the default toolset with always_allow. Explicit tools override matching preset entries. codemode requires bash and is absent from data-editor."
351
373
  }
352
374
  ]
353
375
  }
@@ -369,6 +391,206 @@ current version; omit to apply the update unconditionally.`
369
391
  ],
370
392
  query: []
371
393
  },
394
+ {
395
+ resource: "agent.agents.endUsers",
396
+ method: "list",
397
+ summary: "List End Users",
398
+ description: `List users who have sessions or token issuance history on a business agent.
399
+
400
+ Ordered 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.`,
401
+ http: "GET",
402
+ path: "/agent/v1/agents/{agent_id}/end_users",
403
+ streaming: "no",
404
+ pagination: false,
405
+ pathParams: [
406
+ {
407
+ name: "agent_id",
408
+ sdkName: "agent_id"
409
+ }
410
+ ],
411
+ query: [
412
+ {
413
+ name: "limit",
414
+ type: "integer",
415
+ required: false,
416
+ description: "Maximum users per page; defaults to 20."
417
+ },
418
+ {
419
+ name: "page",
420
+ type: "string",
421
+ required: false,
422
+ description: "next_page from the previous response with the same agent, q and limit."
423
+ },
424
+ {
425
+ name: "q",
426
+ type: "string",
427
+ required: false,
428
+ description: "Case-sensitive literal prefix of external_user_id; omit or use an empty string for all users."
429
+ }
430
+ ]
431
+ },
432
+ {
433
+ resource: "agent.agents.endUsers",
434
+ method: "delete",
435
+ summary: "Delete end-user data",
436
+ description: `Delete a host application's end-user data from one business agent after explicit confirmation.
437
+
438
+ Develop 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.`,
439
+ http: "DELETE",
440
+ path: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
441
+ streaming: "no",
442
+ pagination: false,
443
+ pathParams: [
444
+ {
445
+ name: "agent_id",
446
+ sdkName: "agent_id"
447
+ },
448
+ {
449
+ name: "external_user_id",
450
+ sdkName: "external_user_id"
451
+ }
452
+ ],
453
+ query: [
454
+ {
455
+ name: "confirm",
456
+ type: "string",
457
+ required: true,
458
+ description: "Must exactly equal the external_user_id path parameter to confirm destructive deletion."
459
+ }
460
+ ]
461
+ },
462
+ {
463
+ resource: "agent.agents.endUsers",
464
+ method: "retrieve",
465
+ summary: "Get End User",
466
+ description: `Inspect one end user and their twenty most recently updated sessions.
467
+
468
+ Use 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.`,
469
+ http: "GET",
470
+ path: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
471
+ streaming: "no",
472
+ pagination: false,
473
+ pathParams: [
474
+ {
475
+ name: "agent_id",
476
+ sdkName: "agent_id"
477
+ },
478
+ {
479
+ name: "external_user_id",
480
+ sdkName: "external_user_id"
481
+ }
482
+ ],
483
+ query: []
484
+ },
485
+ {
486
+ resource: "agent.agents.endUsers.block",
487
+ method: "create",
488
+ summary: "Block End User",
489
+ description: `Block token issuance and session creation, then revoke existing tokens for an end user.
490
+
491
+ May 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.`,
492
+ http: "POST",
493
+ path: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/block",
494
+ streaming: "no",
495
+ pagination: false,
496
+ pathParams: [
497
+ {
498
+ name: "agent_id",
499
+ sdkName: "agent_id"
500
+ },
501
+ {
502
+ name: "external_user_id",
503
+ sdkName: "external_user_id"
504
+ }
505
+ ],
506
+ query: []
507
+ },
508
+ {
509
+ resource: "agent.agents.endUsers",
510
+ method: "retrieveDeletion",
511
+ summary: "Get end-user deletion",
512
+ description: `Poll the latest deletion task for an end user, including after the user data has been removed.
513
+
514
+ Use 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.`,
515
+ http: "GET",
516
+ path: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/deletion",
517
+ streaming: "no",
518
+ pagination: false,
519
+ pathParams: [
520
+ {
521
+ name: "agent_id",
522
+ sdkName: "agent_id"
523
+ },
524
+ {
525
+ name: "external_user_id",
526
+ sdkName: "external_user_id"
527
+ }
528
+ ],
529
+ query: []
530
+ },
531
+ {
532
+ resource: "agent.agents.endUsers.revokeTokens",
533
+ method: "create",
534
+ summary: "Revoke End User Tokens",
535
+ description: `Revoke all issued tokens for an end user and terminate their open embed streams.
536
+
537
+ Revokes 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.`,
538
+ http: "POST",
539
+ path: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/revoke_tokens",
540
+ streaming: "no",
541
+ pagination: false,
542
+ pathParams: [
543
+ {
544
+ name: "agent_id",
545
+ sdkName: "agent_id"
546
+ },
547
+ {
548
+ name: "external_user_id",
549
+ sdkName: "external_user_id"
550
+ }
551
+ ],
552
+ query: []
553
+ },
554
+ {
555
+ resource: "agent.agents.endUsers.unblock",
556
+ method: "create",
557
+ summary: "Unblock End User",
558
+ description: `Allow an end user to receive new tokens and create new sessions again.
559
+
560
+ Removes 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.`,
561
+ http: "POST",
562
+ path: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/unblock",
563
+ streaming: "no",
564
+ pagination: false,
565
+ pathParams: [
566
+ {
567
+ name: "agent_id",
568
+ sdkName: "agent_id"
569
+ },
570
+ {
571
+ name: "external_user_id",
572
+ sdkName: "external_user_id"
573
+ }
574
+ ],
575
+ query: []
576
+ },
577
+ {
578
+ resource: "agent.agents.unarchive",
579
+ method: "create",
580
+ summary: "Unarchive Agent",
581
+ description: "Restore an archived agent without creating a configuration version. Already active agents are unchanged. Missing or inaccessible agents return 404. Use the returned agent id to create new sessions.",
582
+ http: "POST",
583
+ path: "/agent/v1/agents/{agent_id}/unarchive",
584
+ streaming: "no",
585
+ pagination: false,
586
+ pathParams: [
587
+ {
588
+ name: "agent_id",
589
+ sdkName: "agent_id"
590
+ }
591
+ ],
592
+ query: []
593
+ },
372
594
  {
373
595
  resource: "agent.agents.versions",
374
596
  method: "list",
@@ -580,7 +802,9 @@ Own-face superset: Managed Agents has no persistent Computer attachment director
580
802
  summary: "Connect computer",
581
803
  description: `Resume the computer and issue a sandbox connection.
582
804
 
583
- Own-face extension: Managed Agents has no persistent Computer connection. Returns the public SDK sandbox_id, envd_access_token and template_id. Archived computers remain accessible; foreign or absent computers return 404. Never cache credentials.`,
805
+ Own-face extension: Managed Agents has no persistent Computer connection. Returns the public SDK sandbox_id, envd_access_token and template_id, plus the machine tier the computer is on now (light or heavy) and the lease that keeps it there (lease_id, lease_expires_at; lease_id is null when no lease exists). Keep the lease while the connection stays open: renew it about every 20 seconds (POST .../leases/{lease_id}/renew) and release it on close (DELETE .../leases/{lease_id}). An unrenewed lease simply expires, and the full machine is reclaimed only after that. Archived computers remain accessible; foreign or absent computers return 404. Never cache credentials.
806
+
807
+ Connect to a computer with a caller-held lease. Omit the body or send {} to request light: the lightweight shell, or the heavy instance while it is running. Send {"need":"heavy"} to request full Linux for interactive programs; files are synchronized before the heavy connection is returned with tier heavy. Heavy running time counts toward the daily budget in seconds. Renew the lease while using the connection and release it with DELETE when finished. If the daily budget is exhausted, 429 COMPUTER_BUDGET_EXHAUSTED allows you to continue with need light.`,
584
808
  http: "POST",
585
809
  path: "/agent/v1/computers/{computer_id}/connect",
586
810
  streaming: "no",
@@ -591,7 +815,22 @@ Own-face extension: Managed Agents has no persistent Computer connection. Return
591
815
  sdkName: "computer_id"
592
816
  }
593
817
  ],
594
- query: []
818
+ query: [],
819
+ body: {
820
+ required: false,
821
+ fields: [
822
+ {
823
+ name: "need",
824
+ type: "string",
825
+ enum: [
826
+ "light",
827
+ "heavy"
828
+ ],
829
+ required: false,
830
+ description: "Defaults to light. light uses the lightweight shell, or the heavy instance while it is running. heavy requests a full Linux computer for interactive programs; heavy running time counts toward the daily budget in seconds."
831
+ }
832
+ ]
833
+ }
595
834
  },
596
835
  {
597
836
  resource: "agent.computers.files",
@@ -645,6 +884,52 @@ Praxis extension: MA only has session-scoped temporary containers and memory_sto
645
884
  }
646
885
  ]
647
886
  },
887
+ {
888
+ resource: "agent.computers.leases",
889
+ method: "delete",
890
+ summary: "Release computer lease",
891
+ description: `Give the lease back when a connection closes so the full machine can be reclaimed without waiting for it to expire.
892
+
893
+ Own-face extension. Idempotent: an unknown or already released lease succeeds as well. Foreign or absent computers return 404.`,
894
+ http: "DELETE",
895
+ path: "/agent/v1/computers/{computer_id}/leases/{lease_id}",
896
+ streaming: "no",
897
+ pagination: false,
898
+ pathParams: [
899
+ {
900
+ name: "computer_id",
901
+ sdkName: "computer_id"
902
+ },
903
+ {
904
+ name: "lease_id",
905
+ sdkName: "lease_id"
906
+ }
907
+ ],
908
+ query: []
909
+ },
910
+ {
911
+ resource: "agent.computers.leases.renew",
912
+ method: "create",
913
+ summary: "Renew computer lease",
914
+ description: `Extend the lease a connection holds so the full machine stays in service while the connection is open.
915
+
916
+ Own-face extension. A lease that is no longer valid (released, expired, or the computer moved to another machine) returns 409 LEASE_STALE; call connect again for a new connection and lease. Foreign or absent computers return 404.`,
917
+ http: "POST",
918
+ path: "/agent/v1/computers/{computer_id}/leases/{lease_id}/renew",
919
+ streaming: "no",
920
+ pagination: false,
921
+ pathParams: [
922
+ {
923
+ name: "computer_id",
924
+ sdkName: "computer_id"
925
+ },
926
+ {
927
+ name: "lease_id",
928
+ sdkName: "lease_id"
929
+ }
930
+ ],
931
+ query: []
932
+ },
648
933
  {
649
934
  resource: "agent.deploymentRuns",
650
935
  method: "list",
@@ -1074,6 +1359,43 @@ null to clear. Maximum 50.`
1074
1359
  ],
1075
1360
  query: []
1076
1361
  },
1362
+ {
1363
+ resource: "agent.embed",
1364
+ method: "retrieveAppearance",
1365
+ summary: "Read chat appearance",
1366
+ 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.",
1367
+ http: "GET",
1368
+ path: "/agent/v1/embed/appearance",
1369
+ streaming: "no",
1370
+ pagination: false,
1371
+ pathParams: [],
1372
+ query: []
1373
+ },
1374
+ {
1375
+ resource: "agent.embed.exchange",
1376
+ method: "create",
1377
+ summary: "Exchange Hosted Code",
1378
+ description: `Redeem a single-use hosted link credential for an end-user token.
1379
+
1380
+ Read 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>"}.`,
1381
+ http: "POST",
1382
+ path: "/agent/v1/embed/exchange",
1383
+ streaming: "no",
1384
+ pagination: false,
1385
+ pathParams: [],
1386
+ query: [],
1387
+ body: {
1388
+ required: true,
1389
+ fields: [
1390
+ {
1391
+ name: "code",
1392
+ type: "string",
1393
+ required: true,
1394
+ description: "Single-use credential from the c fragment parameter of hosted_url returned by embed token creation. Valid for 60 seconds."
1395
+ }
1396
+ ]
1397
+ }
1398
+ },
1077
1399
  {
1078
1400
  resource: "agent.embedTokens",
1079
1401
  method: "list",
@@ -1091,7 +1413,7 @@ Includes expired and revoked grants; returns neither token nor token_id. Sorts b
1091
1413
  name: "agent_id",
1092
1414
  type: "string",
1093
1415
  required: false,
1094
- description: "Filter by service agent identifier (agent_ or agt_ prefix)."
1416
+ description: "Filter by business agent identifier (agent_ or agt_ prefix)."
1095
1417
  },
1096
1418
  {
1097
1419
  name: "external_user_id",
@@ -1117,9 +1439,9 @@ Includes expired and revoked grants; returns neither token nor token_id. Sorts b
1117
1439
  resource: "agent.embedTokens",
1118
1440
  method: "create",
1119
1441
  summary: "Create Embed Token",
1120
- description: `Issue a short-lived credential on your backend for an end user of a service agent.
1442
+ description: `Issue a short-lived credential on your backend for an end user of a business agent.
1121
1443
 
1122
- Requires an active service agent in your organization with an embed policy. Pins the requested version or the latest version and snapshots the policy environment, vaults and resources; metadata comes from the request. Blocked users cannot receive tokens. Keep your API key on the backend and pass only the returned token to the frontend. Every call creates a new grant; issuance is not idempotent. The hosted field is not supported.`,
1444
+ Requires an active business 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.`,
1123
1445
  http: "POST",
1124
1446
  path: "/agent/v1/embed_tokens",
1125
1447
  streaming: "no",
@@ -1129,11 +1451,17 @@ Requires an active service agent in your organization with an embed policy. Pins
1129
1451
  body: {
1130
1452
  required: true,
1131
1453
  fields: [
1454
+ {
1455
+ name: "hosted",
1456
+ type: "boolean",
1457
+ required: false,
1458
+ 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."
1459
+ },
1132
1460
  {
1133
1461
  name: "agent",
1134
1462
  type: "string",
1135
1463
  required: true,
1136
- description: "Service agent ID or identity_number from agent retrieval; it must belong to your organization and be active."
1464
+ description: "Business agent ID or identity_number from agent retrieval; it must belong to your organization and be active."
1137
1465
  },
1138
1466
  {
1139
1467
  name: "version",
@@ -1183,7 +1511,38 @@ Requires an active service agent in your organization with an embed policy. Pins
1183
1511
  name: "metadata",
1184
1512
  type: "object",
1185
1513
  required: false,
1186
- 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."
1514
+ 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."
1515
+ }
1516
+ ]
1517
+ }
1518
+ },
1519
+ {
1520
+ resource: "agent.embedTokens.anonymous",
1521
+ method: "create",
1522
+ summary: "Issue anonymous visitor token",
1523
+ description: `Obtain a short-lived embedding token for a visitor without an account using the agent owner's publishable key.
1524
+
1525
+ No 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"}.`,
1526
+ http: "POST",
1527
+ path: "/agent/v1/embed_tokens/anonymous",
1528
+ streaming: "no",
1529
+ pagination: false,
1530
+ pathParams: [],
1531
+ query: [],
1532
+ body: {
1533
+ required: true,
1534
+ fields: [
1535
+ {
1536
+ name: "publishable_key",
1537
+ type: "string",
1538
+ required: true,
1539
+ description: "Public key created by the business agent owner; safe to include in browser code."
1540
+ },
1541
+ {
1542
+ name: "visitor_secret",
1543
+ type: "string",
1544
+ required: false,
1545
+ description: "Secret returned by a previous anonymous issuance for this key. Omit for a new visitor; an unknown secret creates a new visitor."
1187
1546
  }
1188
1547
  ]
1189
1548
  }
@@ -1618,6 +1977,23 @@ offsets ("+08:00") and unknown names return 400. Never stored in
1618
1977
  ]
1619
1978
  }
1620
1979
  },
1980
+ {
1981
+ resource: "agent.sessions",
1982
+ method: "delete",
1983
+ summary: "Delete session",
1984
+ description: "Delete an idle or terminated session and its event history after saving a deletion snapshot. Supply the session id from creation or listing. Running sessions return 409 INVALID_STATE: interrupt first or wait until idle or terminated. Afterwards retrieval and event listing return 404 and lists omit the session. Example: DELETE /agent/v1/sessions/sesn_example.",
1985
+ http: "DELETE",
1986
+ path: "/agent/v1/sessions/{session_id}",
1987
+ streaming: "no",
1988
+ pagination: false,
1989
+ pathParams: [
1990
+ {
1991
+ name: "session_id",
1992
+ sdkName: "session_id"
1993
+ }
1994
+ ],
1995
+ query: []
1996
+ },
1621
1997
  {
1622
1998
  resource: "agent.sessions",
1623
1999
  method: "retrieve",
@@ -1891,7 +2267,7 @@ Praxis extension available only on /agent/v1, following Claude Agent SDK getCont
1891
2267
  resource: "agent.sessions.events",
1892
2268
  method: "list",
1893
2269
  summary: "List session events",
1894
- description: "Read the event history of a session as a page of events, oldest first by default (order=desc for newest first). Use it after sending a message to collect the reply, to find tool calls that wait for approval (session.status_idle with stop_reason requires_action lists their event_ids), or to audit a run; to follow a running session live use sessions.events.stream instead. Filter by types and by a created_at range on processed_at; pages hold at most 100 events (default 20) and next_page continues. A failed run emits session.error before session.status_terminated. Native history also includes user.steer, user.withdraw, system.notification, session.forked, session.goal_changed and session.goal_verification; these are not accepted by the /anthropic/v1 event-type filter.",
2270
+ description: "Read the event history of a session as a page of events, oldest first by default (order=desc for newest first). Use it after sending a message to collect the reply, to find tool calls that wait for approval or client custom tool results (session.status_idle with stop_reason requires_action lists their event_ids), or to audit a run; to follow a running session live use sessions.events.stream instead. Filter by types and by a created_at range on processed_at; pages hold at most 100 events (default 20) and next_page continues. A failed run emits session.error before session.status_terminated. Native history also includes user.steer, user.withdraw, system.notification, session.forked, session.goal_changed and session.goal_verification; these are not accepted by the /anthropic/v1 event-type filter.",
1895
2271
  http: "GET",
1896
2272
  path: "/agent/v1/sessions/{session_id}/events",
1897
2273
  streaming: "no",
@@ -1962,7 +2338,7 @@ Praxis extension available only on /agent/v1, following Claude Agent SDK getCont
1962
2338
  resource: "agent.sessions.events",
1963
2339
  method: "send",
1964
2340
  summary: "Send session events",
1965
- description: 'Send events to a session: user.message (exactly one nonempty text block), user.interrupt, user.tool_confirmation to allow or deny a pending tool call, user.steer to inject a queued user.message into a turn that is still running, and user.withdraw to retract a queued message. The response only acknowledges the inputs; read replies with sessions.events.list or sessions.events.stream. A message sent while the session waits for tool approval is queued (processed_at null) and runs in order after the approval is resolved. Archived sessions reject new messages. To approve, read a pending agent.tool_use or agent.mcp_tool_use event and send {type: "user.tool_confirmation", tool_use_id: <that event id>, result: "allow"} (or deny); include session_thread_id for a child approval. Native confirmations also accept updated_permissions, answers and annotations, which /anthropic/v1 rejects.',
2341
+ description: 'Attach optional praxis_context={items:[{name,value}]} to user.message for untrusted page context on this turn only (maximum 32 items, 4096 UTF-8 JSON bytes). /anthropic/v1 rejects this field. Send events to a session: user.message (exactly one nonempty text block), user.interrupt, user.tool_confirmation to allow or deny a pending tool call, user.custom_tool_result to return a custom tool result, user.steer to inject a queued user.message into a turn that is still running, and user.withdraw to retract a queued message. The response only acknowledges the inputs; read replies with sessions.events.list or sessions.events.stream. A message sent while the session waits for tool approval is queued (processed_at null) and runs in order after the approval is resolved. Archived sessions reject new messages. To approve, read a pending agent.tool_use or agent.mcp_tool_use event and send {type: "user.tool_confirmation", tool_use_id: <that event id>, result: "allow"} (or deny); include session_thread_id for a child approval. Native confirmations also accept updated_permissions, answers and annotations, which /anthropic/v1 rejects. Both faces accept user.custom_tool_result with custom_tool_use_id from agent.custom_tool_use.id or the requires_action stop_reason.event_ids. Unlike Anthropic, result content accepts only text blocks (omit it for an empty array). Omitted or null is_error means false. The server routes child calls by id; session_thread_id is rejected in this input. Unknown call ids return 400; duplicate results or calls no longer waiting return 409.',
1966
2342
  http: "POST",
1967
2343
  path: "/agent/v1/sessions/{session_id}/events",
1968
2344
  streaming: "no",
@@ -3132,6 +3508,27 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
3132
3508
  ],
3133
3509
  query: []
3134
3510
  },
3511
+ {
3512
+ resource: "application.workers.versions.assets",
3513
+ method: "retrieveManifest",
3514
+ summary: "Get version asset manifest",
3515
+ description: "Read the retained asset paths, content hashes and byte sizes of a version for publication planning. This read creates no session or version. A version without assets returns an empty manifest; unavailable artifacts and foreign resources return 404.",
3516
+ http: "GET",
3517
+ path: "/application/v1/workers/{worker_id}/versions/{version_id}/assets/manifest",
3518
+ streaming: "no",
3519
+ pagination: false,
3520
+ pathParams: [
3521
+ {
3522
+ name: "worker_id",
3523
+ sdkName: "worker_id"
3524
+ },
3525
+ {
3526
+ name: "version_id",
3527
+ sdkName: "version_id"
3528
+ }
3529
+ ],
3530
+ query: []
3531
+ },
3135
3532
  {
3136
3533
  resource: "automation.actions",
3137
3534
  method: "list",
@@ -15126,6 +15523,19 @@ var createClient = (config = {}) => {
15126
15523
  var client = createClient(createConfig({ baseUrl: "https://api.deepraxis.com" }));
15127
15524
 
15128
15525
  // ../../packages/sdk/typescript/src/generated/sdk.gen.ts
15526
+ var unarchiveAgent = (options) => (options.client ?? client).post({
15527
+ security: [{
15528
+ key: "BearerAuth",
15529
+ scheme: "bearer",
15530
+ type: "http"
15531
+ }, {
15532
+ key: "ApiKeyAuth",
15533
+ name: "X-API-Key",
15534
+ type: "apiKey"
15535
+ }],
15536
+ url: "/agent/v1/agents/{agent_id}/unarchive",
15537
+ ...options
15538
+ });
15129
15539
  var deleteRunFeedback = (options) => (options.client ?? client).delete({
15130
15540
  security: [{
15131
15541
  key: "BearerAuth",
@@ -15156,6 +15566,113 @@ var setRunFeedback = (options) => (options.client ?? client).post({
15156
15566
  ...options.headers
15157
15567
  }
15158
15568
  });
15569
+ var listEndUsers = (options) => (options.client ?? client).get({
15570
+ security: [{
15571
+ key: "BearerAuth",
15572
+ scheme: "bearer",
15573
+ type: "http"
15574
+ }, {
15575
+ key: "ApiKeyAuth",
15576
+ name: "X-API-Key",
15577
+ type: "apiKey"
15578
+ }],
15579
+ url: "/agent/v1/agents/{agent_id}/end_users",
15580
+ ...options
15581
+ });
15582
+ var deleteEndUser = (options) => (options.client ?? client).delete({
15583
+ security: [{
15584
+ key: "BearerAuth",
15585
+ scheme: "bearer",
15586
+ type: "http"
15587
+ }, {
15588
+ key: "ApiKeyAuth",
15589
+ name: "X-API-Key",
15590
+ type: "apiKey"
15591
+ }],
15592
+ url: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
15593
+ ...options
15594
+ });
15595
+ var getEndUser = (options) => (options.client ?? client).get({
15596
+ security: [{
15597
+ key: "BearerAuth",
15598
+ scheme: "bearer",
15599
+ type: "http"
15600
+ }, {
15601
+ key: "ApiKeyAuth",
15602
+ name: "X-API-Key",
15603
+ type: "apiKey"
15604
+ }],
15605
+ url: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}",
15606
+ ...options
15607
+ });
15608
+ var getEndUserDeletion = (options) => (options.client ?? client).get({
15609
+ security: [{
15610
+ key: "BearerAuth",
15611
+ scheme: "bearer",
15612
+ type: "http"
15613
+ }, {
15614
+ key: "ApiKeyAuth",
15615
+ name: "X-API-Key",
15616
+ type: "apiKey"
15617
+ }],
15618
+ url: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/deletion",
15619
+ ...options
15620
+ });
15621
+ var revokeEndUserTokens = (options) => (options.client ?? client).post({
15622
+ security: [{
15623
+ key: "BearerAuth",
15624
+ scheme: "bearer",
15625
+ type: "http"
15626
+ }, {
15627
+ key: "ApiKeyAuth",
15628
+ name: "X-API-Key",
15629
+ type: "apiKey"
15630
+ }],
15631
+ url: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/revoke_tokens",
15632
+ ...options
15633
+ });
15634
+ var blockEndUser = (options) => (options.client ?? client).post({
15635
+ security: [{
15636
+ key: "BearerAuth",
15637
+ scheme: "bearer",
15638
+ type: "http"
15639
+ }, {
15640
+ key: "ApiKeyAuth",
15641
+ name: "X-API-Key",
15642
+ type: "apiKey"
15643
+ }],
15644
+ url: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/block",
15645
+ ...options
15646
+ });
15647
+ var unblockEndUser = (options) => (options.client ?? client).post({
15648
+ security: [{
15649
+ key: "BearerAuth",
15650
+ scheme: "bearer",
15651
+ type: "http"
15652
+ }, {
15653
+ key: "ApiKeyAuth",
15654
+ name: "X-API-Key",
15655
+ type: "apiKey"
15656
+ }],
15657
+ url: "/agent/v1/agents/{agent_id}/end_users/{external_user_id}/unblock",
15658
+ ...options
15659
+ });
15660
+ var exchangeEmbedCode = (options) => (options.client ?? client).post({
15661
+ url: "/agent/v1/embed/exchange",
15662
+ ...options,
15663
+ headers: {
15664
+ "Content-Type": "application/json",
15665
+ ...options.headers
15666
+ }
15667
+ });
15668
+ var createAnonymousEmbedToken = (options) => (options.client ?? client).post({
15669
+ url: "/agent/v1/embed_tokens/anonymous",
15670
+ ...options,
15671
+ headers: {
15672
+ "Content-Type": "application/json",
15673
+ ...options.headers
15674
+ }
15675
+ });
15159
15676
  var listEmbedTokens = (options) => (options?.client ?? client).get({
15160
15677
  security: [{
15161
15678
  key: "BearerAuth",
@@ -15340,6 +15857,36 @@ var connectComputer = (options) => (options.client ?? client).post({
15340
15857
  type: "apiKey"
15341
15858
  }],
15342
15859
  url: "/agent/v1/computers/{computer_id}/connect",
15860
+ ...options,
15861
+ headers: {
15862
+ "Content-Type": "application/json",
15863
+ ...options.headers
15864
+ }
15865
+ });
15866
+ var renewComputerLease = (options) => (options.client ?? client).post({
15867
+ security: [{
15868
+ key: "BearerAuth",
15869
+ scheme: "bearer",
15870
+ type: "http"
15871
+ }, {
15872
+ key: "ApiKeyAuth",
15873
+ name: "X-API-Key",
15874
+ type: "apiKey"
15875
+ }],
15876
+ url: "/agent/v1/computers/{computer_id}/leases/{lease_id}/renew",
15877
+ ...options
15878
+ });
15879
+ var releaseComputerLease = (options) => (options.client ?? client).delete({
15880
+ security: [{
15881
+ key: "BearerAuth",
15882
+ scheme: "bearer",
15883
+ type: "http"
15884
+ }, {
15885
+ key: "ApiKeyAuth",
15886
+ name: "X-API-Key",
15887
+ type: "apiKey"
15888
+ }],
15889
+ url: "/agent/v1/computers/{computer_id}/leases/{lease_id}",
15343
15890
  ...options
15344
15891
  });
15345
15892
  var listToolsets = (options) => (options?.client ?? client).get({
@@ -15467,6 +16014,15 @@ var listSessionCompactions = (options) => (options.client ?? client).get({
15467
16014
  url: "/agent/v1/sessions/{session_id}/compactions",
15468
16015
  ...options
15469
16016
  });
16017
+ var getEmbedAppearance = (options) => (options?.client ?? client).get({
16018
+ security: [{
16019
+ key: "BearerAuth",
16020
+ scheme: "bearer",
16021
+ type: "http"
16022
+ }, { name: "Praxis-Publishable-Key", type: "apiKey" }],
16023
+ url: "/agent/v1/embed/appearance",
16024
+ ...options
16025
+ });
15470
16026
  var createAudioSpeech = (options) => (options.client ?? client).post({
15471
16027
  security: [{
15472
16028
  key: "BearerAuth",
@@ -16583,7 +17139,7 @@ var runSandboxCommand = (options) => (options.client ?? client).post({
16583
17139
  ...options.headers
16584
17140
  }
16585
17141
  });
16586
- var agentsList = (options) => (options?.client ?? client).get({
17142
+ var sessionsDelete = (options) => (options.client ?? client).delete({
16587
17143
  security: [{
16588
17144
  key: "BearerAuth",
16589
17145
  scheme: "bearer",
@@ -16593,10 +17149,10 @@ var agentsList = (options) => (options?.client ?? client).get({
16593
17149
  name: "X-API-Key",
16594
17150
  type: "apiKey"
16595
17151
  }],
16596
- url: "/agent/v1/agents",
17152
+ url: "/agent/v1/sessions/{session_id}",
16597
17153
  ...options
16598
17154
  });
16599
- var agentsCreate = (options) => (options.client ?? client).post({
17155
+ var sessionsRetrieve = (options) => (options.client ?? client).get({
16600
17156
  security: [{
16601
17157
  key: "BearerAuth",
16602
17158
  scheme: "bearer",
@@ -16606,14 +17162,27 @@ var agentsCreate = (options) => (options.client ?? client).post({
16606
17162
  name: "X-API-Key",
16607
17163
  type: "apiKey"
16608
17164
  }],
16609
- url: "/agent/v1/agents",
17165
+ url: "/agent/v1/sessions/{session_id}",
17166
+ ...options
17167
+ });
17168
+ var sessionsUpdate = (options) => (options.client ?? client).post({
17169
+ security: [{
17170
+ key: "BearerAuth",
17171
+ scheme: "bearer",
17172
+ type: "http"
17173
+ }, {
17174
+ key: "ApiKeyAuth",
17175
+ name: "X-API-Key",
17176
+ type: "apiKey"
17177
+ }],
17178
+ url: "/agent/v1/sessions/{session_id}",
16610
17179
  ...options,
16611
17180
  headers: {
16612
17181
  "Content-Type": "application/json",
16613
17182
  ...options.headers
16614
17183
  }
16615
17184
  });
16616
- var agentsRetrieve = (options) => (options.client ?? client).get({
17185
+ var agentsList = (options) => (options?.client ?? client).get({
16617
17186
  security: [{
16618
17187
  key: "BearerAuth",
16619
17188
  scheme: "bearer",
@@ -16623,10 +17192,10 @@ var agentsRetrieve = (options) => (options.client ?? client).get({
16623
17192
  name: "X-API-Key",
16624
17193
  type: "apiKey"
16625
17194
  }],
16626
- url: "/agent/v1/agents/{agent_id}",
17195
+ url: "/agent/v1/agents",
16627
17196
  ...options
16628
17197
  });
16629
- var agentsUpdate = (options) => (options.client ?? client).post({
17198
+ var agentsCreate = (options) => (options.client ?? client).post({
16630
17199
  security: [{
16631
17200
  key: "BearerAuth",
16632
17201
  scheme: "bearer",
@@ -16636,14 +17205,14 @@ var agentsUpdate = (options) => (options.client ?? client).post({
16636
17205
  name: "X-API-Key",
16637
17206
  type: "apiKey"
16638
17207
  }],
16639
- url: "/agent/v1/agents/{agent_id}",
17208
+ url: "/agent/v1/agents",
16640
17209
  ...options,
16641
17210
  headers: {
16642
17211
  "Content-Type": "application/json",
16643
17212
  ...options.headers
16644
17213
  }
16645
17214
  });
16646
- var agentsArchive = (options) => (options.client ?? client).post({
17215
+ var agentsRetrieve = (options) => (options.client ?? client).get({
16647
17216
  security: [{
16648
17217
  key: "BearerAuth",
16649
17218
  scheme: "bearer",
@@ -16653,10 +17222,10 @@ var agentsArchive = (options) => (options.client ?? client).post({
16653
17222
  name: "X-API-Key",
16654
17223
  type: "apiKey"
16655
17224
  }],
16656
- url: "/agent/v1/agents/{agent_id}/archive",
17225
+ url: "/agent/v1/agents/{agent_id}",
16657
17226
  ...options
16658
17227
  });
16659
- var agentsVersionsList = (options) => (options.client ?? client).get({
17228
+ var agentsUpdate = (options) => (options.client ?? client).post({
16660
17229
  security: [{
16661
17230
  key: "BearerAuth",
16662
17231
  scheme: "bearer",
@@ -16666,10 +17235,14 @@ var agentsVersionsList = (options) => (options.client ?? client).get({
16666
17235
  name: "X-API-Key",
16667
17236
  type: "apiKey"
16668
17237
  }],
16669
- url: "/agent/v1/agents/{agent_id}/versions",
16670
- ...options
17238
+ url: "/agent/v1/agents/{agent_id}",
17239
+ ...options,
17240
+ headers: {
17241
+ "Content-Type": "application/json",
17242
+ ...options.headers
17243
+ }
16671
17244
  });
16672
- var sessionsList = (options) => (options?.client ?? client).get({
17245
+ var agentsArchive = (options) => (options.client ?? client).post({
16673
17246
  security: [{
16674
17247
  key: "BearerAuth",
16675
17248
  scheme: "bearer",
@@ -16679,10 +17252,10 @@ var sessionsList = (options) => (options?.client ?? client).get({
16679
17252
  name: "X-API-Key",
16680
17253
  type: "apiKey"
16681
17254
  }],
16682
- url: "/agent/v1/sessions",
17255
+ url: "/agent/v1/agents/{agent_id}/archive",
16683
17256
  ...options
16684
17257
  });
16685
- var sessionsCreate = (options) => (options.client ?? client).post({
17258
+ var agentsVersionsList = (options) => (options.client ?? client).get({
16686
17259
  security: [{
16687
17260
  key: "BearerAuth",
16688
17261
  scheme: "bearer",
@@ -16692,14 +17265,10 @@ var sessionsCreate = (options) => (options.client ?? client).post({
16692
17265
  name: "X-API-Key",
16693
17266
  type: "apiKey"
16694
17267
  }],
16695
- url: "/agent/v1/sessions",
16696
- ...options,
16697
- headers: {
16698
- "Content-Type": "application/json",
16699
- ...options.headers
16700
- }
17268
+ url: "/agent/v1/agents/{agent_id}/versions",
17269
+ ...options
16701
17270
  });
16702
- var sessionsRetrieve = (options) => (options.client ?? client).get({
17271
+ var sessionsList = (options) => (options?.client ?? client).get({
16703
17272
  security: [{
16704
17273
  key: "BearerAuth",
16705
17274
  scheme: "bearer",
@@ -16709,10 +17278,10 @@ var sessionsRetrieve = (options) => (options.client ?? client).get({
16709
17278
  name: "X-API-Key",
16710
17279
  type: "apiKey"
16711
17280
  }],
16712
- url: "/agent/v1/sessions/{session_id}",
17281
+ url: "/agent/v1/sessions",
16713
17282
  ...options
16714
17283
  });
16715
- var sessionsUpdate = (options) => (options.client ?? client).post({
17284
+ var sessionsCreate = (options) => (options.client ?? client).post({
16716
17285
  security: [{
16717
17286
  key: "BearerAuth",
16718
17287
  scheme: "bearer",
@@ -16722,7 +17291,7 @@ var sessionsUpdate = (options) => (options.client ?? client).post({
16722
17291
  name: "X-API-Key",
16723
17292
  type: "apiKey"
16724
17293
  }],
16725
- url: "/agent/v1/sessions/{session_id}",
17294
+ url: "/agent/v1/sessions",
16726
17295
  ...options,
16727
17296
  headers: {
16728
17297
  "Content-Type": "application/json",
@@ -17223,6 +17792,15 @@ var applicationCreateVersion = (options) => (options.client ?? client).post({
17223
17792
  ...options.headers
17224
17793
  }
17225
17794
  });
17795
+ var applicationGetVersionAssetManifest = (options) => (options.client ?? client).get({
17796
+ security: [{
17797
+ key: "application-bearerAuth",
17798
+ scheme: "bearer",
17799
+ type: "http"
17800
+ }],
17801
+ url: "/application/v1/workers/{worker_id}/versions/{version_id}/assets/manifest",
17802
+ ...options
17803
+ });
17226
17804
  var applicationGetVersion = (options) => (options.client ?? client).get({
17227
17805
  security: [{
17228
17806
  key: "application-bearerAuth",
@@ -20043,8 +20621,26 @@ function createAgent(transport) {
20043
20621
  agents: {
20044
20622
  archive: bind(transport, agentsArchive),
20045
20623
  create: bind(transport, agentsCreate),
20624
+ endUsers: {
20625
+ block: {
20626
+ create: bind(transport, blockEndUser)
20627
+ },
20628
+ delete: bind(transport, deleteEndUser),
20629
+ list: bind(transport, listEndUsers),
20630
+ retrieve: bind(transport, getEndUser),
20631
+ retrieveDeletion: bind(transport, getEndUserDeletion),
20632
+ revokeTokens: {
20633
+ create: bind(transport, revokeEndUserTokens)
20634
+ },
20635
+ unblock: {
20636
+ create: bind(transport, unblockEndUser)
20637
+ }
20638
+ },
20046
20639
  list: bind(transport, agentsList),
20047
20640
  retrieve: bind(transport, agentsRetrieve),
20641
+ unarchive: {
20642
+ create: bind(transport, unarchiveAgent)
20643
+ },
20048
20644
  update: bind(transport, agentsUpdate),
20049
20645
  versions: {
20050
20646
  list: bind(transport, agentsVersionsList)
@@ -20062,6 +20658,12 @@ function createAgent(transport) {
20062
20658
  list: bind(transport, computersFilesList),
20063
20659
  retrieveContent: bind(transport, computersFilesContent)
20064
20660
  },
20661
+ leases: {
20662
+ delete: bind(transport, releaseComputerLease),
20663
+ renew: {
20664
+ create: bind(transport, renewComputerLease)
20665
+ }
20666
+ },
20065
20667
  list: bind(transport, computersList),
20066
20668
  retrieve: bind(transport, computersRetrieve),
20067
20669
  update: bind(transport, computersUpdate)
@@ -20084,7 +20686,16 @@ function createAgent(transport) {
20084
20686
  },
20085
20687
  update: bind(transport, deploymentsUpdate)
20086
20688
  },
20689
+ embed: {
20690
+ exchange: {
20691
+ create: bind(transport, exchangeEmbedCode)
20692
+ },
20693
+ retrieveAppearance: bind(transport, getEmbedAppearance)
20694
+ },
20087
20695
  embedTokens: {
20696
+ anonymous: {
20697
+ create: bind(transport, createAnonymousEmbedToken)
20698
+ },
20088
20699
  create: bind(transport, createEmbedToken),
20089
20700
  list: bind(transport, listEmbedTokens),
20090
20701
  revoke: {
@@ -20110,6 +20721,7 @@ function createAgent(transport) {
20110
20721
  list: bind(transport, listSessionCompactions)
20111
20722
  },
20112
20723
  create: bind(transport, sessionsCreate),
20724
+ delete: bind(transport, sessionsDelete),
20113
20725
  events: {
20114
20726
  list: bind(transport, sessionsEventsList),
20115
20727
  send: bind(transport, sessionsEventsSend),
@@ -20191,6 +20803,9 @@ function createApplication(transport) {
20191
20803
  },
20192
20804
  update: bind(transport, applicationUpdateWorker),
20193
20805
  versions: {
20806
+ assets: {
20807
+ retrieveManifest: bind(transport, applicationGetVersionAssetManifest)
20808
+ },
20194
20809
  create: bind(transport, applicationCreateVersion),
20195
20810
  list: bindPage(transport, applicationListVersions),
20196
20811
  retrieve: bind(transport, applicationGetVersion)
@@ -21141,6 +21756,10 @@ function base64(bytes) {
21141
21756
  return btoa(chunks.join(""));
21142
21757
  }
21143
21758
  async function publish(client2, input) {
21759
+ const rolloutFields = ["gradual", "gradualRollout", "gradual_rollout", "canary", "rollout", "percentage", "percent", "traffic", "traffic_percentage", "strategy", "versions"];
21760
+ if (Object.keys(input).some((key) => rolloutFields.includes(key) || /percentage|percent|canary|gradual|rollout|灰度/i.test(key))) {
21761
+ throw new PraxisError({ code: "INVALID_PARAMS", message: '平台不支持灰度 (gradual rollout is not supported). Roll back with praxis.application.workers.deployments.create({ path: { worker_id }, body: { strategy: "percentage", versions: [{ version_id: previousVersionId, percentage: 100 }] } }); the previous version artifacts must still be retained.' });
21762
+ }
21144
21763
  const timeout = input.timeout_ms ?? 120000;
21145
21764
  if (!Number.isFinite(timeout) || timeout < 0)
21146
21765
  throw new RangeError("timeout_ms must be non-negative and finite");
@@ -21159,7 +21778,7 @@ async function publish(client2, input) {
21159
21778
  const files = Object.entries(input.files);
21160
21779
  if (files.length > 1e5)
21161
21780
  throw new PraxisError({ code: "LIMIT_EXCEEDED", message: "At most 100000 asset paths can be published" });
21162
- const manifest = {};
21781
+ let manifest = {};
21163
21782
  const contents = new Map;
21164
21783
  for (const [path2, content] of files) {
21165
21784
  const normalized = path2.startsWith("/") ? path2 : `/${path2}`;
@@ -21168,8 +21787,8 @@ async function publish(client2, input) {
21168
21787
  const bytes = typeof content === "string" ? new TextEncoder().encode(content) : new Uint8Array(content);
21169
21788
  if (bytes.length > FILE_BYTES)
21170
21789
  throw new PraxisError({ code: "LIMIT_EXCEEDED", message: `Asset ${normalized} exceeds 25 MiB` });
21171
- const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
21172
- const hash = Array.from(digest.subarray(0, 16), (byte) => byte.toString(16).padStart(2, "0")).join("");
21790
+ const digest2 = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
21791
+ const hash = Array.from(digest2.subarray(0, 16), (byte) => byte.toString(16).padStart(2, "0")).join("");
21173
21792
  manifest[normalized] = { hash, size: bytes.length };
21174
21793
  contents.set(hash, bytes);
21175
21794
  }
@@ -21182,9 +21801,60 @@ async function publish(client2, input) {
21182
21801
  }
21183
21802
  }
21184
21803
  const created = !worker;
21804
+ if (!worker && input.dryRun)
21805
+ throw new PraxisError({ code: "NOT_FOUND", message: "请先创建应用 (create the application before dryRun)" });
21185
21806
  worker ??= await workers.create({ body: { name: input.name, subdomain: { enabled: true } } });
21186
21807
  const path = { worker_id: worker.id };
21808
+ let currentVersion;
21809
+ let currentDeployment;
21810
+ let previous = {};
21811
+ if (worker.praxis?.current_deployment_id) {
21812
+ currentDeployment = await workers.deployments.retrieve({ path: { ...path, deployment_id: worker.praxis.current_deployment_id } });
21813
+ const active = currentDeployment.versions[0];
21814
+ if (!active)
21815
+ throw new PraxisError({ code: "INVALID_RESPONSE", message: "Current deployment has no version" });
21816
+ currentVersion = await workers.versions.retrieve({ path: { ...path, version_id: active.version_id } });
21817
+ previous = (await workers.versions.assets.retrieveManifest({ path: { ...path, version_id: active.version_id } })).manifest;
21818
+ }
21819
+ manifest = {
21820
+ ...Object.fromEntries(Object.entries(previous).filter(([key]) => input.keepExisting || Object.hasOwn(manifest, key))),
21821
+ ...manifest
21822
+ };
21823
+ if (Object.keys(manifest).length > 1e5)
21824
+ throw new PraxisError({ code: "LIMIT_EXCEEDED", message: "At most 100000 asset paths can be published" });
21825
+ const added = Object.keys(manifest).filter((key) => !Object.hasOwn(previous, key));
21826
+ const changed = Object.keys(manifest).filter((key) => previous[key] && (previous[key].hash !== manifest[key].hash || previous[key].size !== manifest[key].size));
21827
+ const removed = Object.keys(previous).filter((key) => !Object.hasOwn(manifest, key));
21828
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(JSON.stringify(manifest))));
21829
+ const manifestHash = Array.from(digest, (byte) => byte.toString(16).padStart(2, "0")).join("");
21830
+ const staticOnly = !["main", "bindings", "compatibility_date", "compatibility_flags", "assets_config"].some((key) => Object.hasOwn(input, key));
21831
+ const unchanged = staticOnly && !!currentVersion && manifestHash === currentVersion.praxis.assets_manifest?.manifest_hash;
21832
+ const hashes = new Set(Object.values(manifest).map((entry) => entry.hash));
21833
+ const currentResult = {
21834
+ url: worker.subdomain.url,
21835
+ worker_id: worker.id,
21836
+ version_id: currentVersion?.id ?? null,
21837
+ deployment_id: currentDeployment?.id ?? null,
21838
+ status: currentDeployment?.praxis.status ?? "draft",
21839
+ created,
21840
+ ...currentVersion ? { version: currentVersion } : {},
21841
+ unchanged,
21842
+ uploaded: 0,
21843
+ reused: hashes.size
21844
+ };
21845
+ if (unchanged && !input.dryRun)
21846
+ return currentResult;
21187
21847
  const session = await workers.assetsUploadSession.create({ path, body: { manifest } });
21848
+ if (input.dryRun) {
21849
+ const missing = new Set(session.buckets.flat());
21850
+ if ([...missing].some((hash) => !hashes.has(hash)))
21851
+ throw new PraxisError({ code: "INVALID_RESPONSE", message: "Upload session requested an unknown hash" });
21852
+ return {
21853
+ ...currentResult,
21854
+ reused: hashes.size - missing.size,
21855
+ plan: { added, changed, removed, upload_hashes: missing.size, existing_hashes: hashes.size - missing.size }
21856
+ };
21857
+ }
21188
21858
  let jwt = session.buckets.length ? null : session.jwt;
21189
21859
  const uploaded = new Set;
21190
21860
  for (const bucket of session.buckets) {
@@ -21255,7 +21925,7 @@ async function publish(client2, input) {
21255
21925
  status: deployment.praxis.status,
21256
21926
  created,
21257
21927
  uploaded: uploaded.size,
21258
- reused: contents.size - uploaded.size
21928
+ reused: hashes.size - uploaded.size
21259
21929
  };
21260
21930
  }
21261
21931
 
@@ -22805,7 +23475,7 @@ function startProgress(ctx, write = (text) => writeOutput({ stderr: text })) {
22805
23475
  }
22806
23476
 
22807
23477
  // src/main.ts
22808
- var version = "0.1.0-dev.449ac38";
23478
+ var version = "0.1.0-dev.48c1ce8";
22809
23479
  var commands = commandTree(operations);
22810
23480
  var manual = [["login"], ["logout"], ["whoami"], ["org", "list"], ["org", "switch"], ["api"], ["skill"]];
22811
23481
  function route(argv) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepraxis/cli",
3
- "version": "0.1.0-dev.449ac38",
3
+ "version": "0.1.0-dev.48c1ce8",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "praxis": "dist/praxis.js"