@deepraxis/cli 0.1.0-dev.ce6682e → 0.1.0-dev.d23f787
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMMANDS.md +7 -4
- package/dist/praxis.js +82 -23
- 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
|
-
|
|
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,7 +21,7 @@ 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` |
|
|
@@ -31,7 +31,7 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
|
|
|
31
31
|
| `praxis agent computer lease renew create` | `agent.computers.leases.renew.create` | POST `/agent/v1/computers/{computer_id}/leases/{lease_id}/renew` | `--computer`, `--lease` |
|
|
32
32
|
| `praxis agent computer list` | `agent.computers.list` | GET `/agent/v1/computers` | `--param-limit`, `--page` |
|
|
33
33
|
| `praxis agent computer update <computer_id>` | `agent.computers.update` | POST `/agent/v1/computers/{computer_id}` | `--name` |
|
|
34
|
-
| `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` |
|
|
35
35
|
| `praxis agent deployment archive <deployment_id>` | `agent.deployments.archive` | POST `/agent/v1/deployments/{deployment_id}/archive` | |
|
|
36
36
|
| `praxis agent deployment create` | `agent.deployments.create` | POST `/agent/v1/deployments` | `--environment-id`, `--name`, `--description`, `--vault-ids` |
|
|
37
37
|
| `praxis agent deployment get <deployment_id>` | `agent.deployments.retrieve` | GET `/agent/v1/deployments/{deployment_id}` | |
|
|
@@ -69,6 +69,7 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
|
|
|
69
69
|
| `praxis agent session compact <session_id>` | `agent.sessions.compact` | POST `/agent/v1/sessions/{session_id}/compact` | `--instructions` |
|
|
70
70
|
| `praxis agent session compaction list` | `agent.sessions.compactions.list` | GET `/agent/v1/sessions/{session_id}/compactions` | `--session` |
|
|
71
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}` | |
|
|
72
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` |
|
|
73
74
|
| `praxis agent session event send <session_id>` | `agent.sessions.events.send` | POST `/agent/v1/sessions/{session_id}/events` | |
|
|
74
75
|
| `praxis agent session event stream` | `agent.sessions.events.stream` | GET `/agent/v1/sessions/{session_id}/events/stream` | `--session`, `--event-deltas` |
|
|
@@ -90,7 +91,8 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
|
|
|
90
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` |
|
|
91
92
|
| `praxis agent session update <session_id>` | `agent.sessions.update` | POST `/agent/v1/sessions/{session_id}` | `--title`, `--vault-ids`, `--model` |
|
|
92
93
|
| `praxis agent toolset list` | `agent.toolsets.list` | GET `/agent/v1/toolsets` | |
|
|
93
|
-
| `praxis agent
|
|
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` |
|
|
94
96
|
| `praxis agent version list` | `agent.agents.versions.list` | GET `/agent/v1/agents/{agent_id}/versions` | `--agent`, `--param-limit`, `--page` |
|
|
95
97
|
| `praxis application asset upload` | `application.assets.upload.create` | POST `/application/v1/assets/upload` | `--jwt` |
|
|
96
98
|
| `praxis application subdomain get` | `application.subdomain.retrieve` | GET `/application/v1/subdomain` | |
|
|
@@ -113,6 +115,7 @@ Handwritten commands: `login`, `logout`, `whoami`, `org list`, `org switch <orga
|
|
|
113
115
|
| `praxis application worker secret list` | `application.workers.secrets.list` | GET `/application/v1/workers/{worker_id}/secrets` | `--worker` |
|
|
114
116
|
| `praxis application worker secret update <name>` | `application.workers.secrets.update` | PUT `/application/v1/workers/{worker_id}/secrets/{name}` | `--worker` |
|
|
115
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` |
|
|
116
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` |
|
|
117
120
|
| `praxis application worker version get <version_id>` | `application.workers.versions.retrieve` | GET `/application/v1/workers/{worker_id}/versions/{version_id}` | `--worker` |
|
|
118
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
|
@@ -136,6 +136,27 @@ var operations = [
|
|
|
136
136
|
description: `Tool configurations available to the agent. Maximum of 128 tools
|
|
137
137
|
across all toolsets allowed.`
|
|
138
138
|
},
|
|
139
|
+
{
|
|
140
|
+
name: "databases",
|
|
141
|
+
type: "array",
|
|
142
|
+
itemType: "object",
|
|
143
|
+
required: false,
|
|
144
|
+
description: "Database allowlist for platform resources accessible through service-agent codemode. Only kind=service accepts nonempty bindings; personal agents return 400. At most 20 bindings per resource type, with no duplicate ids. Newly added bindings apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Unbound resources return 404; writes to read_only resources are refused. Other platform APIs return 403, except public API discovery. Invalid bindings and unknown item fields return 400. Omit on create for no bindings."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "vector_stores",
|
|
148
|
+
type: "array",
|
|
149
|
+
itemType: "object",
|
|
150
|
+
required: false,
|
|
151
|
+
description: "Knowledge vector store allowlist for platform resources accessible through service-agent codemode. Only kind=service accepts nonempty bindings; personal agents return 400. At most 20 bindings per resource type, with no duplicate ids. Newly added bindings apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Unbound resources return 404; writes to read_only resources are refused. Other platform APIs return 403, except public API discovery. Invalid bindings and unknown item fields return 400. Omit on create for no bindings."
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: "files",
|
|
155
|
+
type: "array",
|
|
156
|
+
itemType: "object",
|
|
157
|
+
required: false,
|
|
158
|
+
description: "File allowlist for platform resources accessible through service-agent codemode. Only kind=service accepts nonempty bindings; personal agents return 400. At most 20 bindings per resource type, with no duplicate ids. Newly added bindings apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Unbound resources return 404; writes to read_only resources are refused. Other platform APIs return 403, except public API discovery. Invalid bindings and unknown item fields return 400. Omit on create for no bindings."
|
|
159
|
+
},
|
|
139
160
|
{
|
|
140
161
|
name: "kind",
|
|
141
162
|
type: "string",
|
|
@@ -312,6 +333,27 @@ Obtain this value from a create or retrieve response. Must be at least 1 if
|
|
|
312
333
|
specified. When supplied, the request fails if it does not match the server's
|
|
313
334
|
current version; omit to apply the update unconditionally.`
|
|
314
335
|
},
|
|
336
|
+
{
|
|
337
|
+
name: "databases",
|
|
338
|
+
type: "array",
|
|
339
|
+
itemType: "object",
|
|
340
|
+
required: false,
|
|
341
|
+
description: "Replace this resource allowlist; omission preserves it, and null or [] clears it. Additions apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Only service agents accept nonempty bindings."
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
name: "vector_stores",
|
|
345
|
+
type: "array",
|
|
346
|
+
itemType: "object",
|
|
347
|
+
required: false,
|
|
348
|
+
description: "Replace this resource allowlist; omission preserves it, and null or [] clears it. Additions apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Only service agents accept nonempty bindings."
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
name: "files",
|
|
352
|
+
type: "array",
|
|
353
|
+
itemType: "object",
|
|
354
|
+
required: false,
|
|
355
|
+
description: "Replace this resource allowlist; omission preserves it, and null or [] clears it. Additions apply only to new sessions; disabling or removing a binding immediately revokes access in running sessions. Only service agents accept nonempty bindings."
|
|
356
|
+
},
|
|
315
357
|
{
|
|
316
358
|
name: "kind",
|
|
317
359
|
type: "string",
|
|
@@ -804,7 +846,7 @@ Own-face superset: Managed Agents has no persistent Computer attachment director
|
|
|
804
846
|
|
|
805
847
|
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
848
|
|
|
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.
|
|
849
|
+
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. Renew the lease while using the connection and release it with DELETE when finished.`,
|
|
808
850
|
http: "POST",
|
|
809
851
|
path: "/agent/v1/computers/{computer_id}/connect",
|
|
810
852
|
streaming: "no",
|
|
@@ -1877,7 +1919,7 @@ owning account only.`
|
|
|
1877
1919
|
resource: "agent.sessions",
|
|
1878
1920
|
method: "create",
|
|
1879
1921
|
summary: "Create session",
|
|
1880
|
-
description: `Create a session: one conversation with an agent
|
|
1922
|
+
description: `Create a session: one conversation with an agent. Pass agent as an agent id (latest version) or {id, version, type:"agent"}. Unlike Anthropic Managed Agents, omit environment_id to get a light machine, unless computer_id (explicit, or the agent's default) selects a Computer; pass an environment id for a sandbox recipe. For service agents, omission returns environment_id=light; explicit null allocates no machine, so codemode, bash and other machine tools are unavailable. Optional model must be one of the agent's allowed models; optional thinking is {effort: low|medium|high|xhigh|max|none} or null, where null inherits the agent default and then the model default (none requires the model to allow disabling thinking). Selections are saved before initial_events run; invalid ones return 400 invalid_request_error. Inline agent overrides are not supported. Supports vault_ids, up to 50, owned by the current organization and not archived; credential injection is deferred to a later version. Omitted budget defaults to USD 20; null removes the limit, and a limit object uses a positive integer string of USD cents. Up to 500 file resources can be attached. Use initial_events to send a first user.message in this request, or send messages afterwards with sessions.events.send. The returned status can still be idle before initial events run; read agent.message and the subsequent session.status_idle event to confirm completion.`,
|
|
1881
1923
|
http: "POST",
|
|
1882
1924
|
path: "/agent/v1/sessions",
|
|
1883
1925
|
streaming: "no",
|
|
@@ -1897,7 +1939,7 @@ owning account only.`
|
|
|
1897
1939
|
name: "environment_id",
|
|
1898
1940
|
type: "string",
|
|
1899
1941
|
required: false,
|
|
1900
|
-
description: "
|
|
1942
|
+
description: "Execution environment id from agent.environments.list or agent.environments.create. For a service agent, omission selects the built-in light environment and returns session.environment_id=light; explicit null allocates no machine and makes machine tools, including codemode and bash, unavailable. Personal agents use their selected Computer."
|
|
1901
1943
|
},
|
|
1902
1944
|
{
|
|
1903
1945
|
name: "budget",
|
|
@@ -6952,7 +6994,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
6952
6994
|
name: "{column}",
|
|
6953
6995
|
type: "string",
|
|
6954
6996
|
required: false,
|
|
6955
|
-
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns.
|
|
6997
|
+
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
|
|
6956
6998
|
},
|
|
6957
6999
|
{
|
|
6958
7000
|
name: "and",
|
|
@@ -7000,7 +7042,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7000
7042
|
name: "on_conflict",
|
|
7001
7043
|
type: "string",
|
|
7002
7044
|
required: false,
|
|
7003
|
-
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7045
|
+
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7004
7046
|
},
|
|
7005
7047
|
{
|
|
7006
7048
|
name: "columns",
|
|
@@ -7014,7 +7056,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7014
7056
|
resource: "database.databases.rest",
|
|
7015
7057
|
method: "retrieve",
|
|
7016
7058
|
summary: "Select rows",
|
|
7017
|
-
description: "Read matching rows with filters, selected columns and ordering. Returns at most 1000 rows per request, including when limit is omitted. Content-Range reports the actual returned interval and the total when count is requested. PATCH and DELETE are not subject to this read cap. Unlike Supabase, casts, aggregates, spread and join modifiers are unsupported. Each table supports up to 1,000,000 rows. Query budget: 8,000 ms with a shared 3,000,000-row safety ceiling. Create indexes on filtered or sorted fields, or narrow the request when it exceeds its budget. Synchronous SQLite aggregates use candidate-row throughput estimates before execution; deployed Workers freeze clocks during synchronous CPU work, so the timer is not a guaranteed server-side interrupt. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode. Error table: QUERY_CANCELED / PostgREST 57014 is HTTP 500, retryable=false: Query timed out: index filtered or sorted fields, or narrow the range. DATABASE_INVALID_STATE is HTTP 409 for operations on a deleting database. Cleared or nonexistent databases return DATABASE_NOT_FOUND / HTTP 404. The count is an HTTP Content-Range response header, not a JSON property.
|
|
7059
|
+
description: "Read matching rows with filters, selected columns and ordering. Returns at most 1000 rows per request, including when limit is omitted. Content-Range reports the actual returned interval and the total when count is requested. PATCH and DELETE are not subject to this read cap. Unlike Supabase, casts, aggregates, spread and join modifiers are unsupported. Each table supports up to 1,000,000 rows. Query budget: 8,000 ms with a shared 3,000,000-row safety ceiling. Create indexes on filtered or sorted fields, or narrow the request when it exceeds its budget. Synchronous SQLite aggregates use candidate-row throughput estimates before execution; deployed Workers freeze clocks during synchronous CPU work, so the timer is not a guaranteed server-side interrupt. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode. Error table: QUERY_CANCELED / PostgREST 57014 is HTTP 500, retryable=false: Query timed out: index filtered or sorted fields, or narrow the range. DATABASE_INVALID_STATE is HTTP 409 for operations on a deleting database. Cleared or nonexistent databases return DATABASE_NOT_FOUND / HTTP 404. The count is an HTTP Content-Range response header, not a JSON property. Use praxis.database.count in the SDK or codemode to return { count: number | null }; a page length is not a total unless you know all matches fit in that page.",
|
|
7018
7060
|
http: "GET",
|
|
7019
7061
|
path: "/database/v1/databases/{database_id}/rest/{table}",
|
|
7020
7062
|
streaming: "no",
|
|
@@ -7040,7 +7082,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7040
7082
|
name: "{column}",
|
|
7041
7083
|
type: "string",
|
|
7042
7084
|
required: false,
|
|
7043
|
-
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns.
|
|
7085
|
+
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
|
|
7044
7086
|
},
|
|
7045
7087
|
{
|
|
7046
7088
|
name: "and",
|
|
@@ -7088,7 +7130,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7088
7130
|
name: "on_conflict",
|
|
7089
7131
|
type: "string",
|
|
7090
7132
|
required: false,
|
|
7091
|
-
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7133
|
+
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7092
7134
|
},
|
|
7093
7135
|
{
|
|
7094
7136
|
name: "columns",
|
|
@@ -7102,7 +7144,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7102
7144
|
resource: "database.databases.rest",
|
|
7103
7145
|
method: "head",
|
|
7104
7146
|
summary: "Count rows",
|
|
7105
|
-
description: "Inspect the HTTP row count and range without retrieving row data; send Prefer: count=exact for a filtered count. Returns no body and does not fetch or serialize row data. A known count determines the interval using limit/offset or Range with a default and maximum page size of 1000. Without a count preference, or when the selected count mode cannot supply a total, Content-Range is */*. Singular Accept still validates page cardinality. Unlike Supabase, planned and estimated counts do not use PostgreSQL planner estimates. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode.
|
|
7147
|
+
description: "Inspect the HTTP row count and range without retrieving row data; send Prefer: count=exact for a filtered count. Returns no body and does not fetch or serialize row data. A known count determines the interval using limit/offset or Range with a default and maximum page size of 1000. Without a count preference, or when the selected count mode cannot supply a total, Content-Range is */*. Singular Accept still validates page cardinality. Unlike Supabase, planned and estimated counts do not use PostgreSQL planner estimates. Count preferences: without filters, exact, planned and estimated all use SQLite's exact b-tree count. With filters, exact counts within budget; planned skips counting and reports an unknown total (Content-Range: 0-24/*); estimated attempts exact counting only when the preflight budget allows it, otherwise reports an unknown total. Preference-Applied echoes the requested count mode. Use praxis.database.count in the SDK or codemode to return { count: number | null } from this header without retrieving rows.",
|
|
7106
7148
|
http: "HEAD",
|
|
7107
7149
|
path: "/database/v1/databases/{database_id}/rest/{table}",
|
|
7108
7150
|
streaming: "no",
|
|
@@ -7128,7 +7170,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7128
7170
|
name: "{column}",
|
|
7129
7171
|
type: "string",
|
|
7130
7172
|
required: false,
|
|
7131
|
-
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns.
|
|
7173
|
+
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
|
|
7132
7174
|
},
|
|
7133
7175
|
{
|
|
7134
7176
|
name: "and",
|
|
@@ -7176,7 +7218,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7176
7218
|
name: "on_conflict",
|
|
7177
7219
|
type: "string",
|
|
7178
7220
|
required: false,
|
|
7179
|
-
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7221
|
+
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7180
7222
|
},
|
|
7181
7223
|
{
|
|
7182
7224
|
name: "columns",
|
|
@@ -7216,7 +7258,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7216
7258
|
name: "{column}",
|
|
7217
7259
|
type: "string",
|
|
7218
7260
|
required: false,
|
|
7219
|
-
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns.
|
|
7261
|
+
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
|
|
7220
7262
|
},
|
|
7221
7263
|
{
|
|
7222
7264
|
name: "and",
|
|
@@ -7264,7 +7306,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7264
7306
|
name: "on_conflict",
|
|
7265
7307
|
type: "string",
|
|
7266
7308
|
required: false,
|
|
7267
|
-
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7309
|
+
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7268
7310
|
},
|
|
7269
7311
|
{
|
|
7270
7312
|
name: "columns",
|
|
@@ -7284,7 +7326,7 @@ Own-face extension. Use a readable session and a run_id from its events. Each su
|
|
|
7284
7326
|
summary: "Insert rows",
|
|
7285
7327
|
description: `Insert rows into an existing table after defining its fields; at most 500 rows per request. Each request is atomic: any failure rolls back the entire batch. There are no transactions across requests.
|
|
7286
7328
|
Rows are filled to the union of their keys with null; send Prefer: missing=default to use field defaults for missing keys.
|
|
7287
|
-
The default is return=minimal: success returns HTTP 201 with an empty body. Send Prefer: return=representation to return the inserted rows. Unlike Supabase, upsert conflicts can target only id or one unique field, not a composite key. Each table supports up to 1,000,000 rows.`,
|
|
7329
|
+
The default is return=minimal: success returns HTTP 201 with an empty body. Send Prefer: return=representation to return the inserted rows. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. Unlike Supabase, upsert conflicts can target only id or one unique field, not a composite key. Each table supports up to 1,000,000 rows.`,
|
|
7288
7330
|
http: "POST",
|
|
7289
7331
|
path: "/database/v1/databases/{database_id}/rest/{table}",
|
|
7290
7332
|
streaming: "no",
|
|
@@ -7310,7 +7352,7 @@ The default is return=minimal: success returns HTTP 201 with an empty body. Send
|
|
|
7310
7352
|
name: "{column}",
|
|
7311
7353
|
type: "string",
|
|
7312
7354
|
required: false,
|
|
7313
|
-
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns.
|
|
7355
|
+
description: "Horizontal filter: replace {column} with a field name or JSON path, e.g. title=eq.summary. Repeat for more columns. Supported operators: eq (equal), neq (not equal; ne is not supported), gt/gte/lt/lte (comparisons), like (case-sensitive text pattern), ilike (case-insensitive text pattern), in (membership), is (null/boolean test), cs (contains), cd (contained by), and ov (array overlap). For like/ilike, * or % matches any sequence and _ matches one character, e.g. title=ilike.*spring*; URL-encode a literal % as %25. Use days=in.(1,2,3), title=is.null, active=is.true or active=is.false; is.not_null and is.unknown are also accepted (unknown means null). Negate a condition with not., e.g. title=not.eq.draft. Multiple filters are ANDed; use or=(title.eq.a,title.eq.b), and=(days.gte.1,days.lte.3), not.or=(...) or not.and=(...), with nested and(...) and or(...) groups as needed. cs/cd accept JSON objects or arrays on JSON fields; cs also accepts a JSON scalar. For array values or multi-link fields, use cs.{a,b}, cd.{a,b} or ov.{a,b}. JSON paths use -> for JSON and ->> for text, e.g. attributes->>has_onsen=eq.true or attributes->tags=cs.[1,2]; chain -> segments and end with ->> for text. Dot paths such as attributes.has_onsen are unsupported. Full-text, regex, range operators and any/all modifiers are unsupported."
|
|
7314
7356
|
},
|
|
7315
7357
|
{
|
|
7316
7358
|
name: "and",
|
|
@@ -7358,7 +7400,7 @@ The default is return=minimal: success returns HTTP 201 with an empty body. Send
|
|
|
7358
7400
|
name: "on_conflict",
|
|
7359
7401
|
type: "string",
|
|
7360
7402
|
required: false,
|
|
7361
|
-
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7403
|
+
description: "POST upsert: id or one unique field with resolution=merge-duplicates|ignore-duplicates. With resolution=merge-duplicates, a conflicting row keeps columns omitted from the request; supplied values replace the whole field value (including JSON objects), and explicit null clears a nullable field. With resolution=ignore-duplicates, a conflicting row is left unchanged. Without a conflict, both modes insert a new row using field defaults for omitted fields. In a batch, a key present in another row is filled with null when omitted in this row unless missing=default is set; that null can overwrite a value during merge. With missing=default, omitted keys stay omitted for conflict merges (existing values are preserved); new rows use defaults, or null when no default exists. Explicit null never invokes a default. POST accepts an optional client id matching [A-Za-z0-9_-]{1,64}; omitted ids are generated. PATCH cannot change id."
|
|
7362
7404
|
},
|
|
7363
7405
|
{
|
|
7364
7406
|
name: "columns",
|
|
@@ -7410,7 +7452,7 @@ The default is return=minimal: success returns HTTP 201 with an empty body. Send
|
|
|
7410
7452
|
resource: "database.databases.tables",
|
|
7411
7453
|
method: "create",
|
|
7412
7454
|
summary: "Create table",
|
|
7413
|
-
description:
|
|
7455
|
+
description: 'Creates a table together with its initial fields in one call and returns it (HTTP 201) with generated tbl_ and fld_ ids. name must match ^[a-z_][a-z0-9_]{0,62}$ and be unused in this database (duplicate: 409 UNIQUE_VIOLATION). fields is required and may be an empty array; fields can also be added later with databaseAddField. Limits: 50 tables per database, 64 fields per table, and 16 indexed or unique fields per table; exceeding one returns 400 LIMIT_EXCEEDED. Fields default to indexed:false. Set indexed:true explicitly for fields used in filters or ordering. Only indexed:true or unique:true consumes one of the 16 indexed-or-unique field slots; a field with both consumes one slot. Unique fields still consume a slot even with indexed:false. Existing fields are unchanged. Minimal field example: {"name":"notes","type":"string","indexed":false}. Every row also has a system id column, which is not declared as a field. Insert data afterwards with databaseInsert. Unlike Supabase, define schema with this table API and the field APIs; PostgreSQL DDL and SQL migration files cannot be submitted. Each table supports up to 1,000,000 rows.',
|
|
7414
7456
|
http: "POST",
|
|
7415
7457
|
path: "/database/v1/databases/{database_id}/tables",
|
|
7416
7458
|
streaming: "no",
|
|
@@ -7531,7 +7573,7 @@ The default is return=minimal: success returns HTTP 201 with an empty body. Send
|
|
|
7531
7573
|
resource: "database.databases.tables.fields",
|
|
7532
7574
|
method: "create",
|
|
7533
7575
|
summary: "Add field",
|
|
7534
|
-
description:
|
|
7576
|
+
description: 'Adds one field to an existing table and returns the updated table (HTTP 201). Required inputs are name (lowercase letters, digits and underscores; id and names starting with _ are reserved) and type (string, integer, number, boolean, datetime, json or link); json needs options.schema and link needs options.linked_table_id and options.multiple. Adding a required field to a table that already has rows needs a default, otherwise the call fails with 400 VALIDATION_FAILED; a default is written into every existing row. Fields default to indexed:false. Set indexed:true explicitly for fields used in filters or ordering. Only indexed:true or unique:true consumes one of the 16 indexed-or-unique field slots; a field with both consumes one slot. Unique fields still consume a slot even with indexed:false. Existing fields are unchanged. Minimal field example: {"name":"notes","type":"string","indexed":false}. JSON and link fields cannot be indexed. Limits: 64 fields and 16 indexed or unique fields per table (400 LIMIT_EXCEEDED). Unlike Supabase, schema evolution uses field definitions rather than ALTER TABLE statements or SQL migrations.',
|
|
7535
7577
|
http: "POST",
|
|
7536
7578
|
path: "/database/v1/databases/{database_id}/tables/{table}/fields",
|
|
7537
7579
|
streaming: "no",
|
|
@@ -21722,9 +21764,13 @@ class Transport {
|
|
|
21722
21764
|
};
|
|
21723
21765
|
}
|
|
21724
21766
|
async request(operation, options = {}) {
|
|
21767
|
+
return (await this.requestWithResponse(operation, options)).data;
|
|
21768
|
+
}
|
|
21769
|
+
async requestWithResponse(operation, options = {}) {
|
|
21725
21770
|
const scope = this.scope(options, false);
|
|
21726
21771
|
try {
|
|
21727
|
-
|
|
21772
|
+
const result = await abortable(operation(scope.options), scope.signal);
|
|
21773
|
+
return { data: result.data, response: result.response };
|
|
21728
21774
|
} finally {
|
|
21729
21775
|
scope.close();
|
|
21730
21776
|
}
|
|
@@ -21929,12 +21975,25 @@ async function publish(client2, input) {
|
|
|
21929
21975
|
};
|
|
21930
21976
|
}
|
|
21931
21977
|
|
|
21978
|
+
// ../../packages/sdk/typescript/src/helpers/database-count.ts
|
|
21979
|
+
async function count(transport, input) {
|
|
21980
|
+
const { response } = await transport.requestWithResponse(databaseHead, {
|
|
21981
|
+
path: { database_id: input.database_id, table: input.table },
|
|
21982
|
+
query: input.filters,
|
|
21983
|
+
headers: { Prefer: `count=${input.count ?? "exact"}` }
|
|
21984
|
+
});
|
|
21985
|
+
const total = response.headers.get("Content-Range")?.split("/")[1];
|
|
21986
|
+
return { count: total === undefined || total === "*" ? null : Number(total) };
|
|
21987
|
+
}
|
|
21988
|
+
|
|
21932
21989
|
// ../../packages/sdk/typescript/src/core/client.ts
|
|
21933
21990
|
class Praxis {
|
|
21934
21991
|
constructor(options) {
|
|
21935
21992
|
const transport = new Transport(options);
|
|
21936
21993
|
for (const [name, create] of Object.entries(resourceFactories)) {
|
|
21937
21994
|
const resource = create(transport);
|
|
21995
|
+
if (name === "database")
|
|
21996
|
+
Object.assign(resource, { count: (input) => count(transport, input) });
|
|
21938
21997
|
if (name === "application")
|
|
21939
21998
|
Object.assign(resource, { publish: (input) => publish(this, input) });
|
|
21940
21999
|
Object.defineProperty(this, name, { value: resource, enumerable: true });
|
|
@@ -23066,7 +23125,7 @@ function plain(value) {
|
|
|
23066
23125
|
}
|
|
23067
23126
|
|
|
23068
23127
|
// src/output/human.ts
|
|
23069
|
-
var
|
|
23128
|
+
var count3 = (n, noun) => `${n} ${noun}${n === 1 ? "" : "s"}`;
|
|
23070
23129
|
function identity(result, ctx) {
|
|
23071
23130
|
const op = "op" in result ? result.op : undefined;
|
|
23072
23131
|
const split = op?.lastIndexOf(".") ?? -1;
|
|
@@ -23154,7 +23213,7 @@ function objectView(data, resource, id, ctx, paint) {
|
|
|
23154
23213
|
return v.map(scalar).map(plain).join(", ");
|
|
23155
23214
|
folded = true;
|
|
23156
23215
|
const preview = v.slice(0, 3).map((item) => record(item).id ?? record(item).name).filter((x) => x !== undefined).map((x) => plain(scalar(x)));
|
|
23157
|
-
return `${
|
|
23216
|
+
return `${count3(v.length, "item")}${preview.length ? ` (${preview.join(", ")})` : ""}`;
|
|
23158
23217
|
}
|
|
23159
23218
|
if (v !== null && typeof v === "object") {
|
|
23160
23219
|
if (depth >= 1) {
|
|
@@ -23195,7 +23254,7 @@ function renderHuman(result, ctx) {
|
|
|
23195
23254
|
return {
|
|
23196
23255
|
stdout: result.items.length ? table(result.items, ctx, out) : out.dim(`No ${plain(resource)}${/(s|x|ch|sh)$/.test(resource) ? "es" : "s"}.`) + `
|
|
23197
23256
|
`,
|
|
23198
|
-
stderr: err.dim(`${result.total !== undefined ? `${result.items.length} of ${result.total} items` :
|
|
23257
|
+
stderr: err.dim(`${result.total !== undefined ? `${result.items.length} of ${result.total} items` : count3(result.items.length, "item")}${result.nextCursor ? ` · next: ${ctx.nextCommand ?? "praxis --help"}` : ""}`) + `
|
|
23199
23258
|
`
|
|
23200
23259
|
};
|
|
23201
23260
|
case "object": {
|
|
@@ -23475,7 +23534,7 @@ function startProgress(ctx, write = (text) => writeOutput({ stderr: text })) {
|
|
|
23475
23534
|
}
|
|
23476
23535
|
|
|
23477
23536
|
// src/main.ts
|
|
23478
|
-
var version = "0.1.0-dev.
|
|
23537
|
+
var version = "0.1.0-dev.d23f787";
|
|
23479
23538
|
var commands = commandTree(operations);
|
|
23480
23539
|
var manual = [["login"], ["logout"], ["whoami"], ["org", "list"], ["org", "switch"], ["api"], ["skill"]];
|
|
23481
23540
|
function route(argv) {
|