@plori/cli 0.4.3 → 0.5.1
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/README.md +267 -71
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
# plori CLI
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
Plori runs AI agents in Workspaces. Several agents can work on one project at
|
|
4
|
+
once, and Plori merges their changes back into the Workspace.
|
|
5
|
+
|
|
6
|
+
`plori` manages hosted agents and Workspaces from a terminal or script. It uses
|
|
7
|
+
the public HTTP API directly with your account credentials. MCP is not required.
|
|
8
|
+
`plori workspace create` creates a Workspace and its agent. `plori workspace run` sends
|
|
9
|
+
that agent a task on the Workspace files. To run several workers in one Workspace, use the
|
|
10
|
+
[Workspace coordination](#workspace-coordination) commands.
|
|
9
11
|
|
|
10
12
|
## Install
|
|
11
13
|
|
|
@@ -59,7 +61,7 @@ The browser flow requests `openid offline_access mcp`. Its public OAuth client
|
|
|
59
61
|
id, short-lived access token, rotating refresh token, expiry, and scopes are
|
|
60
62
|
stored in `~/.config/plori/config.json` (or
|
|
61
63
|
`$XDG_CONFIG_HOME/plori/config.json`) with mode `0600`; the CLI refreshes the
|
|
62
|
-
|
|
64
|
+
credentials when needed.
|
|
63
65
|
|
|
64
66
|
For CI or another headless environment, keep using an API key created at
|
|
65
67
|
<https://plori.ai/dashboard/settings>:
|
|
@@ -71,34 +73,70 @@ export PLORI_API_KEY=plori_sk_…
|
|
|
71
73
|
```
|
|
72
74
|
|
|
73
75
|
`PLORI_BASE_URL` (or `--base-url`) points the CLI at a non-production
|
|
74
|
-
|
|
76
|
+
API server, e.g. a local `uat-server`.
|
|
77
|
+
|
|
78
|
+
### Which sign-in can approve actions
|
|
79
|
+
|
|
80
|
+
The server treats the two credentials differently:
|
|
81
|
+
|
|
82
|
+
- **Browser login (`plori login`)** stores an OAuth session. It can deny an
|
|
83
|
+
approval request and answer a plain question. A run that you start with it
|
|
84
|
+
pauses before each action outside the agent's environment, such as a git
|
|
85
|
+
push, a deploy or an email. You approve each action in the web app. Saved
|
|
86
|
+
approvals do not apply to that run. It cannot approve an action, grant saved approval
|
|
87
|
+
(`--always-allow`), answer a secret question, or run or activate a workflow
|
|
88
|
+
that is not active. The server refuses these requests. Each refusal, except
|
|
89
|
+
the one for saved approval, includes the web address where the account
|
|
90
|
+
owner decides. A schedule created with this sign-in waits until the owner
|
|
91
|
+
confirms it at its `confirm_url` in the web app.
|
|
92
|
+
- **API key (`plori login --key` or `PLORI_API_KEY`)** is the owner's own
|
|
93
|
+
credential. With it, `input answer --approve` and `--always-allow` work from the
|
|
94
|
+
terminal, `schedules create` activates the schedule at once, and `workflow run` can run
|
|
95
|
+
a workflow that is not active.
|
|
96
|
+
|
|
97
|
+
## First Workspace
|
|
98
|
+
|
|
99
|
+
Start with a Workspace:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
plori login
|
|
103
|
+
plori workspace create mate
|
|
104
|
+
plori workspace run mate "Research this topic and save the result to work/report.md"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Creation prints an idempotency key. Reuse it with `--idempotency-key` when you
|
|
108
|
+
retry the same request. A name can identify more than one Workspace. Use its ID
|
|
109
|
+
from `plori workspace list` if names are duplicated.
|
|
110
|
+
|
|
111
|
+
For commands that take an agent, set `AGENT_ID` to the creation response's
|
|
112
|
+
`default_manager_agent_id`. The Workspace name is not an agent name.
|
|
75
113
|
|
|
76
114
|
## Attach
|
|
77
115
|
|
|
78
|
-
`plori attach` opens a live
|
|
79
|
-
prompt, streaming output, and
|
|
80
|
-
|
|
116
|
+
`plori conversation attach` opens a live conversation in your terminal: the recent history, a
|
|
117
|
+
prompt, streaming output, and pending requests in one place. It is the same
|
|
118
|
+
conversation the web app shows, so a turn you send here appears in an open browser
|
|
81
119
|
tab as it streams.
|
|
82
120
|
|
|
83
|
-
**The terminal does not give the agent access to your local files.** The shell
|
|
84
|
-
|
|
121
|
+
**The terminal does not give the agent access to your local files.** The shell
|
|
122
|
+
and the Workspace files are in the agent's own cloud environment. Nothing on your
|
|
85
123
|
machine is uploaded, and nothing the agent writes lands in the directory you
|
|
86
124
|
ran the command from.
|
|
87
125
|
|
|
88
126
|
```sh
|
|
89
|
-
plori attach
|
|
90
|
-
plori attach
|
|
91
|
-
plori attach
|
|
92
|
-
plori attach
|
|
93
|
-
plori attach
|
|
127
|
+
plori conversation attach "$AGENT_ID" # the agent's most recent conversation
|
|
128
|
+
plori conversation attach "$AGENT_ID" --session <id> # a specific conversation of that agent
|
|
129
|
+
plori conversation attach "$AGENT_ID" --history 50 # replay 50 turns instead of the default 20
|
|
130
|
+
plori conversation attach "$AGENT_ID" --read-only # tail it, no prompt
|
|
131
|
+
plori conversation attach "$AGENT_ID" --verbose # also print reasoning and tool results
|
|
94
132
|
```
|
|
95
133
|
|
|
96
|
-
The argument is an agent name, an agent id, or a
|
|
134
|
+
The argument is an agent name, an agent id, or a conversation id, so a conversation id
|
|
97
135
|
copied out of the web app works on its own. With no stored credentials, attach
|
|
98
136
|
runs the browser sign-in inline and continues once it completes. `--history 0`
|
|
99
137
|
replays nothing; `--history all` replays everything one request can carry,
|
|
100
138
|
which stops at the newest 20,000 stored events. `--base-url` (or
|
|
101
|
-
`PLORI_BASE_URL`) points attach at a non-production
|
|
139
|
+
`PLORI_BASE_URL`) points attach at a non-production API server, like every
|
|
102
140
|
other command.
|
|
103
141
|
|
|
104
142
|
While attached:
|
|
@@ -110,63 +148,63 @@ While attached:
|
|
|
110
148
|
leave.
|
|
111
149
|
- `Ctrl-D` on an empty line, or `/exit` (`/quit`), detaches only. The run keeps
|
|
112
150
|
going on the server, and attaching again picks it up where it is.
|
|
113
|
-
- The slash commands are `/sessions` (list this agent's
|
|
114
|
-
(start one), `/model <slug>` (change the model), `/web` (print this
|
|
151
|
+
- The slash commands are `/sessions` (list this agent's conversations), `/new`
|
|
152
|
+
(start one), `/model <slug>` (change the model), `/web` (print this conversation's
|
|
115
153
|
web address), `/exit`, and `/help`. Anything else that starts with `/` comes
|
|
116
154
|
back as unknown.
|
|
117
155
|
|
|
118
156
|
Approvals and input requests are answered where they appear: `y` or `n` for an
|
|
119
|
-
approval, `a` to answer yes and grant
|
|
157
|
+
approval, `a` to answer yes and grant saved approval when the request
|
|
120
158
|
carries a consent tool, a line for a value, and a no-echo read for a secret,
|
|
121
159
|
which is never printed to the screen and never reaches your shell history.
|
|
160
|
+
After a browser login, the server refuses `y`, `a` and secret answers as
|
|
161
|
+
described in [Which sign-in can approve actions](#which-sign-in-can-approve-actions).
|
|
162
|
+
`n` and plain answers work with either credential.
|
|
122
163
|
|
|
123
164
|
The prompt needs a terminal on both ends. With `--read-only`, or when either
|
|
124
|
-
stdin or stdout is redirected, attach drops the prompt and tails the
|
|
125
|
-
instead, so `plori attach
|
|
165
|
+
stdin or stdout is redirected, attach drops the prompt and tails the conversation
|
|
166
|
+
instead, so `plori conversation attach "$AGENT_ID" | tee session.log` writes a plain transcript
|
|
126
167
|
with no prompt, no echoed keys, and no redraw escape codes. A tail cannot
|
|
127
|
-
answer, so a request that arrives during one is printed with the
|
|
168
|
+
answer, so a request that arrives during one is printed with the conversation's web
|
|
128
169
|
address to answer it at, and a secret is refused rather than read where it
|
|
129
170
|
would echo.
|
|
130
171
|
|
|
131
172
|
## Use
|
|
132
173
|
|
|
133
174
|
```sh
|
|
134
|
-
plori attach
|
|
135
|
-
plori
|
|
136
|
-
plori run mate "
|
|
137
|
-
plori
|
|
138
|
-
plori
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
plori
|
|
142
|
-
plori
|
|
143
|
-
plori
|
|
144
|
-
plori
|
|
145
|
-
plori answer <run-id> <tool-call-id> --approve
|
|
146
|
-
plori
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
plori
|
|
150
|
-
plori
|
|
151
|
-
plori
|
|
152
|
-
plori
|
|
153
|
-
plori workflows execution "rss digest" <exec-id> # poll one run
|
|
175
|
+
plori conversation attach "$AGENT_ID" # open the live conversation (interactive)
|
|
176
|
+
plori workspace run mate "clone repo X and run the tests"
|
|
177
|
+
plori workspace run mate "long job" --no-wait # returns a run id immediately
|
|
178
|
+
plori runs status "$AGENT_ID" <run-id> --wait # wait for it later
|
|
179
|
+
plori workspace run mate "build it" --follow # stream the turn live (tools on stderr)
|
|
180
|
+
echo "summarize this" | plori workspace run mate - # message from stdin
|
|
181
|
+
plori account watch --agent "$AGENT_ID" # one JSON line per run ending
|
|
182
|
+
plori account inbox # what ended, and what waits on you
|
|
183
|
+
plori schedules create "$AGENT_ID" "daily report" --in 86400
|
|
184
|
+
plori input list "$AGENT_ID" # runs paused on an approval or a question
|
|
185
|
+
plori input answer <run-id> <tool-call-id> --approve
|
|
186
|
+
plori input answer <run-id> <tool-call-id> --approve --always-allow # + stop asking for this tool
|
|
187
|
+
plori account balance && plori account disk
|
|
188
|
+
|
|
189
|
+
plori workflow list # all your workflows
|
|
190
|
+
plori workflow list --agent "$AGENT_ID" # one agent's (use "none" for unassigned)
|
|
191
|
+
plori workflow create "rss digest" --trigger cron --cron "0 9 * * *"
|
|
192
|
+
plori workflow run "rss digest" # run it now (real fire, billed)
|
|
193
|
+
plori workflow execution "rss digest" <exec-id> # poll one run
|
|
154
194
|
```
|
|
155
195
|
|
|
156
196
|
Agents are addressed by name or UUID. Every command accepts `--json`; when
|
|
157
197
|
stdout is not a TTY the output is JSON automatically, so scripts and agents
|
|
158
|
-
can parse without flags. `plori attach` is the one exception: it is a live
|
|
198
|
+
can parse without flags. `plori conversation attach` is the one exception: it is a live
|
|
159
199
|
stream rather than a single result, so it always writes plain text, and a
|
|
160
|
-
redirected stream turns it into a read-only tail. `plori watch` is the other:
|
|
200
|
+
redirected stream turns it into a read-only tail. `plori account watch` is the other:
|
|
161
201
|
its output is a stream of JSON lines in every mode. Errors go to stderr, and
|
|
162
202
|
the exit codes are listed under [Agent-driven use](#agent-driven-use).
|
|
163
203
|
|
|
164
204
|
## Agent-driven use
|
|
165
205
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
one long-lived agent (`create` returns the existing agent for a reused name)
|
|
169
|
-
over creating new ones.
|
|
206
|
+
`plori workspace run` prints the reply in a terminal and a JSON result when piped.
|
|
207
|
+
Tool progress goes to stderr. Reuse the Workspace for later tasks.
|
|
170
208
|
|
|
171
209
|
### Start a run and keep working
|
|
172
210
|
|
|
@@ -175,12 +213,12 @@ wait out a run. Start it, go on to something else, and let the CLI report the
|
|
|
175
213
|
ending:
|
|
176
214
|
|
|
177
215
|
```sh
|
|
178
|
-
plori run mate "long job" --no-wait
|
|
179
|
-
plori watch --agent
|
|
180
|
-
plori inbox
|
|
216
|
+
plori workspace run mate "long job" --no-wait # returns the run id at once
|
|
217
|
+
plori account watch --agent "$AGENT_ID" # one JSON line per ending; run it in the background
|
|
218
|
+
plori account inbox # what ended since you last acknowledged
|
|
181
219
|
```
|
|
182
220
|
|
|
183
|
-
`plori watch` holds a connection to the run-event feed and prints one JSON
|
|
221
|
+
`plori account watch` holds a connection to the run-event feed and prints one JSON
|
|
184
222
|
object per line, unchanged, until you stop it with Ctrl-C or SIGTERM (exit 0).
|
|
185
223
|
A dropped connection is reopened with a delay that starts at one second and
|
|
186
224
|
doubles to thirty, and the reconnect asks for everything after the last line it
|
|
@@ -204,25 +242,26 @@ event of every selected run in a `data` field. The flags:
|
|
|
204
242
|
|
|
205
243
|
### Catch up in one shot
|
|
206
244
|
|
|
207
|
-
`plori inbox` is the same information without a long-lived process: the runs
|
|
245
|
+
`plori account inbox` is the same information without a long-lived process: the runs
|
|
208
246
|
that ended since your last acknowledgement, plus everything waiting on a human.
|
|
209
|
-
`plori inbox --ack <run-id>` moves the watermark to that run's ending, so the
|
|
247
|
+
`plori account inbox --ack <run-id>` moves the watermark to that run's ending, so the
|
|
210
248
|
next inbox starts after it. The watermark is local and per account, stored next
|
|
211
249
|
to your credentials in `~/.config/plori/inbox.json`.
|
|
212
250
|
|
|
213
251
|
### Answer what is waiting
|
|
214
252
|
|
|
215
253
|
A run that pauses on a human approval reports `status: "awaiting_input"` and
|
|
216
|
-
carries the rows to answer in its `pending_inputs`; `plori
|
|
254
|
+
carries the rows to answer in its `pending_inputs`; `plori input list <agent>` lists
|
|
217
255
|
them per agent. An approval that gates an outward-facing write carries a
|
|
218
|
-
`consent_tool` (visible in `plori
|
|
219
|
-
`--always-allow` also
|
|
220
|
-
|
|
221
|
-
|
|
256
|
+
`consent_tool` (visible in `plori input list --json`); answering it with
|
|
257
|
+
`--always-allow` also lets the agent use that tool without asking again. That is the human's call to make, not the calling agent's; on a row
|
|
258
|
+
without a `consent_tool` the flag grants nothing. `--approve` and
|
|
259
|
+
`--always-allow` need an API-key sign-in. After a browser login, the server
|
|
260
|
+
refuses them and the owner approves in the web app.
|
|
222
261
|
|
|
223
262
|
### Machine-readable streams
|
|
224
263
|
|
|
225
|
-
`plori run --jsonl` replaces the rendered stream with one JSON object per line
|
|
264
|
+
`plori workspace run --jsonl` replaces the rendered stream with one JSON object per line
|
|
226
265
|
(`message_delta`, `tool_call`, `tool_result`, `step`, `awaiting_input`, `done`,
|
|
227
266
|
`error`), and ends with the run result on one more line, tagged
|
|
228
267
|
`"type":"result"`.
|
|
@@ -238,14 +277,14 @@ tools return: `run_id`, `status`, `session_id`, `url`, `pending_inputs`.
|
|
|
238
277
|
| 1 | API or runtime failure |
|
|
239
278
|
| 2 | usage error |
|
|
240
279
|
| 3 | missing, rejected, or expired credentials |
|
|
241
|
-
| 4 | the
|
|
280
|
+
| 4 | the API server could not be reached |
|
|
242
281
|
| 10 | the run is waiting on a human answer |
|
|
243
282
|
| 20 | the run ended in error |
|
|
244
283
|
| 30 | the run was cancelled |
|
|
245
284
|
| 40 | the wait ran out with the run still going |
|
|
246
285
|
|
|
247
|
-
`plori run`, `plori
|
|
248
|
-
`plori watch` all report these codes. Waiting goes through the
|
|
286
|
+
`plori workspace run`, `plori runs status --wait` (bounded by `--wait-seconds`) and
|
|
287
|
+
`plori account watch` all report these codes. Waiting goes through the conversation socket,
|
|
249
288
|
so exit 4 means the CLI could not watch the run, not that the run failed: the
|
|
250
289
|
run keeps going on the server either way.
|
|
251
290
|
Exit 3 and exit 4 also print one JSON object on stdout,
|
|
@@ -254,11 +293,168 @@ reading the stream sees why it stopped.
|
|
|
254
293
|
|
|
255
294
|
### What not to use
|
|
256
295
|
|
|
257
|
-
`plori attach` is for a human at a terminal: it takes over the keyboard and
|
|
296
|
+
`plori conversation attach` is for a human at a terminal: it takes over the keyboard and
|
|
258
297
|
expects someone to answer approvals. A calling agent should stay on
|
|
259
|
-
`run
|
|
260
|
-
stream JSON lines. If you only want to follow one
|
|
261
|
-
`plori attach --read-only` is the scriptable form, and redirecting either stdin
|
|
298
|
+
`workspace run`, `runs status`, `account watch`, `account inbox`, `input list` and `input answer`, which either parse as JSON or
|
|
299
|
+
stream JSON lines. If you only want to follow one conversation's output,
|
|
300
|
+
`plori conversation attach --read-only` is the scriptable form, and redirecting either stdin
|
|
262
301
|
or stdout already selects it.
|
|
263
302
|
|
|
264
303
|
Wire-level acceptance cases live in the godog UAT suite at [`uat/`](../uat/) (`make uat`).
|
|
304
|
+
|
|
305
|
+
## Workspace coordination
|
|
306
|
+
|
|
307
|
+
These commands coordinate workers in a Workspace. See the
|
|
308
|
+
[Workspace guide](https://plori.ai/docs/workspaces) for the task flow and recovery limits.
|
|
309
|
+
|
|
310
|
+
Use `workspace`, `worker` and `changeset` for Workspace work. `plori advanced help`
|
|
311
|
+
lists the storage and agent commands. Advanced storage commands take exact IDs.
|
|
312
|
+
Workspace commands and worker start/list/status/stop also accept a unique Workspace name.
|
|
313
|
+
There is no implicit active Workspace.
|
|
314
|
+
|
|
315
|
+
For older agents, see [agents created before Workspaces](https://plori.ai/docs/workspaces#what-about-agents-created-before-workspaces).
|
|
316
|
+
|
|
317
|
+
### Start one worker
|
|
318
|
+
|
|
319
|
+
After you sign in, create a Workspace and give a worker a task:
|
|
320
|
+
|
|
321
|
+
```sh
|
|
322
|
+
plori workspace create project
|
|
323
|
+
plori worker start project 'Update the selected files' --wait
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
`worker start` makes a copy of the latest saved revision, creates a task group,
|
|
327
|
+
and starts the worker. It waits for the copy to be ready, for up to 600 seconds.
|
|
328
|
+
Use `--timeout` to change that limit. If the Workspace has no saved revision yet,
|
|
329
|
+
retry when its storage is ready.
|
|
330
|
+
|
|
331
|
+
`--max-tokens` sets a token figure that is recorded on the new group, in
|
|
332
|
+
cache-weighted tokens. The default is 2,000,000. The figure does not limit model
|
|
333
|
+
calls; the account's credit balance is the only spend limit. To add the worker to
|
|
334
|
+
an existing group, use `--task-group <id>` without `--max-tokens`.
|
|
335
|
+
|
|
336
|
+
The command prints the worker ID and a `worker status` command on stderr. It
|
|
337
|
+
also prints a generated idempotency key if you omit `--idempotency-key`.
|
|
338
|
+
Retry with the same key and task if a request is interrupted.
|
|
339
|
+
|
|
340
|
+
`--wait` waits for the run. A completed run returns its reply and the worker's `save_state`.
|
|
341
|
+
Run completion does not mean the files are saved or merged. `--wait-seconds`
|
|
342
|
+
sets the run wait limit; it defaults to `--timeout`. Use `worker status --wait`
|
|
343
|
+
to wait again. Follow the advanced procedure below to review and merge the changes.
|
|
344
|
+
|
|
345
|
+
### Advanced: prepare copies and merge changes
|
|
346
|
+
|
|
347
|
+
Create a Workspace. Every Workspace has its own agent. `--manager ID` is the id
|
|
348
|
+
of an existing agent to use as the Workspace's agent. Without it, the command
|
|
349
|
+
creates a new one. The Workspace's agent does not run until it receives a
|
|
350
|
+
message:
|
|
351
|
+
|
|
352
|
+
```sh
|
|
353
|
+
plori workspace create project --idempotency-key project-create-1
|
|
354
|
+
plori workspace get "$WORKSPACE_ID"
|
|
355
|
+
plori advanced copy list "$WORKSPACE_ID"
|
|
356
|
+
plori advanced copy checkpoint "$WORKSPACE_ID" "$COPY_ID" --idempotency-key checkpoint-1
|
|
357
|
+
plori advanced operation wait "$WORKSPACE_ID" "$OPERATION_ID" --timeout 120
|
|
358
|
+
plori advanced copy clone "$WORKSPACE_ID" --base-revision "$REVISION_ID" --idempotency-key clone-1
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Use IDs from the returned JSON. `advanced copy clone` makes a writable copy from a
|
|
362
|
+
revision, and `advanced copy checkpoint` saves a copy as a new revision.
|
|
363
|
+
`advanced independent-agent list` lists every agent of the account, including the agents
|
|
364
|
+
that `advanced independent-agent create` made. `plori advanced agent list` leaves those out.
|
|
365
|
+
A clone or checkpoint can return `provisioning`.
|
|
366
|
+
Wait for that operation to become `ready` before using its result. List commands
|
|
367
|
+
for copies, revisions and changesets accept `--cursor` and `--limit`. Continue
|
|
368
|
+
with the returned `next_cursor`.
|
|
369
|
+
|
|
370
|
+
Start a worker on a ready copy:
|
|
371
|
+
|
|
372
|
+
```sh
|
|
373
|
+
plori advanced task-group create "$WORKSPACE_ID" --max-tokens 2000000 --idempotency-key task-1
|
|
374
|
+
plori advanced worker spawn "$WORKSPACE_ID" 'Update the selected files' --name worker-1 \
|
|
375
|
+
--copy "$WORKER_COPY_ID" --task-group "$GROUP_ID" --idempotency-key worker-1
|
|
376
|
+
plori worker status "$WORKSPACE_ID" "$REQUEST_ID" --wait --wait-seconds 600
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
`--max-tokens` is a token figure recorded on the group, in cache-weighted tokens.
|
|
380
|
+
It must be positive. It does not limit model calls. A stopped group refuses new
|
|
381
|
+
model calls and starts no new workers.
|
|
382
|
+
Spawn returns a request. Status returns the run result when it is available,
|
|
383
|
+
with the worker's save and review state. A finished run does not mean its files
|
|
384
|
+
are saved. `--executor` is the id of an existing agent to run as the worker.
|
|
385
|
+
`--name` starts a new agent as the worker. To give a worker more work, run `advanced worker spawn`
|
|
386
|
+
again with the same `--executor` and `--session` and a ready copy. The original
|
|
387
|
+
copy can be reused after it is released. A new clone does not continue the
|
|
388
|
+
earlier work exactly. If the run pauses for an approval or a question, reply
|
|
389
|
+
with `input answer` and follow the run it returns with `runs status`. Worker status does
|
|
390
|
+
not include a web URL.
|
|
391
|
+
|
|
392
|
+
Advanced storage mutations require `--idempotency-key`. Workspace creation, runs and worker starts
|
|
393
|
+
generate a key when you omit it. Reuse the
|
|
394
|
+
same key and request when retrying. Do not reuse a key for changed input.
|
|
395
|
+
Optional worker callbacks use `--callback-url`. Prefer the
|
|
396
|
+
`PLORI_WORKER_CALLBACK_SECRET` environment variable over `--callback-secret`,
|
|
397
|
+
which can appear in process listings. Callback fields require the server's
|
|
398
|
+
Workspace worker callback support.
|
|
399
|
+
|
|
400
|
+
Read and write a selected copy without starting a run:
|
|
401
|
+
|
|
402
|
+
```sh
|
|
403
|
+
plori advanced workspace-files read "$WORKSPACE_ID" /notes.txt --copy "$COPY_ID"
|
|
404
|
+
plori advanced workspace-files write "$WORKSPACE_ID" /notes.txt --copy "$COPY_ID" \
|
|
405
|
+
--file ./notes.txt --if-match "$ETAG"
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
Read JSON includes the ETag. Use `--if-match 0` only to create a missing file.
|
|
409
|
+
A stale version fails instead of overwriting another edit. `--file -` reads stdin.
|
|
410
|
+
`--revision` selects an immutable revision for list/stat/read. The text API
|
|
411
|
+
refuses binary files. Use `advanced workspace-files read-bytes` with `--revision` for
|
|
412
|
+
immutable media. It returns base64 JSON and the ETag, including
|
|
413
|
+
in a terminal, with an 8 MiB limit. Mutable-copy binary download uses a separate
|
|
414
|
+
capability API and is not implemented by this command.
|
|
415
|
+
|
|
416
|
+
JSON configuration and resolutions accept inline JSON or
|
|
417
|
+
`@file` (`@-` reads stdin).
|
|
418
|
+
|
|
419
|
+
Submit a changeset with `--base-revision`, `--incoming-revision` and
|
|
420
|
+
`--current-revision`. The optional `--incoming-save-operation` identifies the
|
|
421
|
+
selected save receipt. Automated clients preserve this identity when unchanged
|
|
422
|
+
content reuses an earlier revision.
|
|
423
|
+
|
|
424
|
+
Read the comparison before accepting. Its current revision is the Workspace
|
|
425
|
+
revision that the comparison used. `changeset accept` requires that
|
|
426
|
+
comparison-current ID and accepts repeated `--evidence` flags.
|
|
427
|
+
For conflicts, write the copy that `changeset get` returns as
|
|
428
|
+
`integration_working_copy_id`, with ETag checks, then use
|
|
429
|
+
`changeset resolve --generation N --resolutions @resolutions.json` with records
|
|
430
|
+
such as `[{"path":"notes.txt","expected_etag":17,"summary":"Reviewed merge"}]`.
|
|
431
|
+
Resolve, accept and reject each require their own stable idempotency key.
|
|
432
|
+
|
|
433
|
+
List workers and task groups, read charged costs, and inspect retention:
|
|
434
|
+
|
|
435
|
+
```sh
|
|
436
|
+
plori worker list "$WORKSPACE_ID" --task-group "$GROUP_ID" --limit 25
|
|
437
|
+
plori advanced task-group list "$WORKSPACE_ID"
|
|
438
|
+
plori workspace costs "$WORKSPACE_ID" --from 2026-09-01T00:00:00Z
|
|
439
|
+
plori advanced task-group costs "$GROUP_ID"
|
|
440
|
+
plori advanced workspace retention "$WORKSPACE_ID" --view pins
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
Cost output is the API JSON. A null or missing amount is unknown, not zero, and a
|
|
444
|
+
task group's token figure is not a cost. `resources` is one page of observations. Continue
|
|
445
|
+
it with `--resource-cursor`. An expired retention state means the item can be
|
|
446
|
+
removed, not that it is already deleted. `advanced workspace pin` keeps a copy or changeset
|
|
447
|
+
until `--expires-at` and needs `--kind`, `--resource` and `--idempotency-key`.
|
|
448
|
+
Pins work only when the Workspace's retention policy sets a pin limit. `advanced workspace unpin`
|
|
449
|
+
releases a pin. `advanced workspace update --retention-profile p --retention-version n`
|
|
450
|
+
moves the Workspace to Plori's current retention policy for new copies and
|
|
451
|
+
revisions. `p` and `n` must name that current policy.
|
|
452
|
+
|
|
453
|
+
`advanced agent stop` and `advanced task-group stop` stop running work and keep history and files.
|
|
454
|
+
`advanced agent retire` stops an agent from getting new work. Workspace deletion permanently
|
|
455
|
+
erases its history and files. Copy/revision deletion removes the selected
|
|
456
|
+
resource. Retirement and deletion require `--yes` in scripts, or interactive
|
|
457
|
+
confirmation. An accepted deletion starts cleanup. It does not prove physical
|
|
458
|
+
erasure. Existing exit codes also apply to waited worker runs: 10 for an
|
|
459
|
+
approval or a question, 20 for run error, 30 for cancellation and 40 for
|
|
460
|
+
timeout.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plori/cli",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "0.
|
|
3
|
+
"description": "Plori runs AI agents in Workspaces.",
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://plori.ai",
|
|
7
7
|
"repository": {
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"node": ">=18"
|
|
27
27
|
},
|
|
28
28
|
"optionalDependencies": {
|
|
29
|
-
"@plori/cli-darwin-arm64": "0.
|
|
30
|
-
"@plori/cli-darwin-x64": "0.
|
|
31
|
-
"@plori/cli-linux-x64": "0.
|
|
32
|
-
"@plori/cli-linux-arm64": "0.
|
|
33
|
-
"@plori/cli-win32-x64": "0.
|
|
29
|
+
"@plori/cli-darwin-arm64": "0.5.1",
|
|
30
|
+
"@plori/cli-darwin-x64": "0.5.1",
|
|
31
|
+
"@plori/cli-linux-x64": "0.5.1",
|
|
32
|
+
"@plori/cli-linux-arm64": "0.5.1",
|
|
33
|
+
"@plori/cli-win32-x64": "0.5.1"
|
|
34
34
|
}
|
|
35
35
|
}
|