@plori/cli 0.4.2 → 0.5.0

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 (2) hide show
  1. package/README.md +267 -71
  2. package/package.json +7 -7
package/README.md CHANGED
@@ -1,11 +1,13 @@
1
1
  # plori CLI
2
2
 
3
- `plori` drives your hosted agents (each one a persistent cloud environment with
4
- its own disk, tools, and memory) from a terminal or a script. It is the CLI+skills
5
- counterpart to the remote MCP server at `https://api.plori.ai/mcp`: same
6
- account, same agents, same REST API underneath, and the commands mirror the
7
- MCP tool names (create_agent → `create`, invoke_agent → `run`,
8
- get_run_result → `result`, …).
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
- session there when needed.
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
- control-plane, e.g. a local `uat-server`.
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 session in your terminal: the recent history, a
79
- prompt, streaming output, and the approval queue in one place. It is the same
80
- session the web app shows, so a turn you send here appears in an open browser
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
- the disk, and the files are the agent's own cloud environment. Nothing on your
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 mate # the agent's most recent session
90
- plori attach mate --session <id> # a specific session of that agent
91
- plori attach mate --history 50 # replay 50 turns instead of the default 20
92
- plori attach mate --read-only # tail it, no prompt
93
- plori attach mate --verbose # also print reasoning and tool results
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 session id, so a session id
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 control-plane, like every
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 sessions), `/new`
114
- (start one), `/model <slug>` (change the model), `/web` (print this session's
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 standing approval when the request
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 session
125
- instead, so `plori attach mate | tee session.log` writes a plain transcript
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 session's web
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 mate # open the live session (interactive)
135
- plori create mate # get-or-create an agent named "mate"
136
- plori run mate "clone repo X and run the tests"
137
- plori run mate "long job" --no-wait # returns a run id immediately
138
- plori result mate <run-id> --wait # wait for it later
139
- plori run mate "build it" --follow # stream the turn live (tools on stderr)
140
- echo "summarize this" | plori run mate - # message from stdin
141
- plori watch --agent mate # one JSON line per run ending
142
- plori inbox # what ended, and what waits on you
143
- plori schedule mate "daily report" --in 86400
144
- plori inputs mate # runs paused on a human question
145
- plori answer <run-id> <tool-call-id> --approve
146
- plori answer <run-id> <tool-call-id> --approve --always-allow # + stop asking for this tool
147
- plori credits && plori disk
148
-
149
- plori workflows list # all your workflows
150
- plori workflows list --agent mate # one agent's (use "none" for unassigned)
151
- plori workflows create "rss digest" --trigger cron --cron "0 9 * * *"
152
- plori workflows run "rss digest" # run it now (real fire, billed)
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
- The reply text of `plori run` is the only thing written to stdout (tool
167
- narration streams to stderr), so a calling agent can pipe it directly. Prefer
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 # returns the run id at once
179
- plori watch --agent mate # one JSON line per ending; run it in the background
180
- plori inbox # what ended since you last acknowledged
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 inputs <agent>` lists
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 inputs --json`); answering it with
219
- `--always-allow` also grants a standing consent so the agent stops asking for
220
- that tool. That is the human's call to make, not the calling agent's; on a row
221
- without a `consent_tool` the flag grants nothing.
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 control plane could not be reached |
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 result --wait` (bounded by `--wait-seconds`) and
248
- `plori watch` all report these codes. Waiting goes through the session socket,
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`/`result`/`watch`/`inbox`/`inputs`/`answer`, which either parse as JSON or
260
- stream JSON lines. If you only want to follow one session's output,
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 the new group's limit in cache-weighted tokens. The default
332
+ is 2,000,000. To share an existing group's limit, use `--task-group <id>` without
333
+ `--max-tokens`.
334
+
335
+ The command prints the worker ID and a `worker status` command on stderr. It
336
+ also prints a generated idempotency key if you omit `--idempotency-key`.
337
+ Retry with the same key and task if a request is interrupted.
338
+
339
+ `--wait` waits for the run. A completed run returns its reply and the worker's `save_state`.
340
+ Run completion does not mean the files are saved or merged. `--wait-seconds`
341
+ sets the run wait limit; it defaults to `--timeout`. Use `worker status --wait`
342
+ to wait again. Follow the advanced procedure below to review and merge the changes.
343
+
344
+ ### Advanced: prepare copies and merge changes
345
+
346
+ Create a Workspace. Every Workspace has its own agent. `--manager ID` is the id
347
+ of an existing agent to use as the Workspace's agent. Without it, the command
348
+ creates a new one. The Workspace's agent does not run until it receives a
349
+ message:
350
+
351
+ ```sh
352
+ plori workspace create project --idempotency-key project-create-1
353
+ plori workspace get "$WORKSPACE_ID"
354
+ plori advanced copy list "$WORKSPACE_ID"
355
+ plori advanced copy checkpoint "$WORKSPACE_ID" "$COPY_ID" --idempotency-key checkpoint-1
356
+ plori advanced operation wait "$WORKSPACE_ID" "$OPERATION_ID" --timeout 120
357
+ plori advanced copy clone "$WORKSPACE_ID" --base-revision "$REVISION_ID" --idempotency-key clone-1
358
+ ```
359
+
360
+ Use IDs from the returned JSON. `advanced copy clone` makes a writable copy from a
361
+ revision, and `advanced copy checkpoint` saves a copy as a new revision.
362
+ `advanced independent-agent list` lists every agent of the account, including the agents
363
+ that `advanced independent-agent create` made. `plori advanced agent list` leaves those out.
364
+ A clone or checkpoint can return `provisioning`.
365
+ Wait for that operation to become `ready` before using its result. List commands
366
+ for copies, revisions and changesets accept `--cursor` and `--limit`. Continue
367
+ with the returned `next_cursor`.
368
+
369
+ Start a worker on a ready copy:
370
+
371
+ ```sh
372
+ plori advanced task-group create "$WORKSPACE_ID" --max-tokens 2000000 --idempotency-key task-1
373
+ plori advanced worker spawn "$WORKSPACE_ID" 'Update the selected files' --name worker-1 \
374
+ --copy "$WORKER_COPY_ID" --task-group "$GROUP_ID" --idempotency-key worker-1
375
+ plori worker status "$WORKSPACE_ID" "$REQUEST_ID" --wait --wait-seconds 600
376
+ ```
377
+
378
+ `--max-tokens` is the group's shared limit in cache-weighted tokens. It must
379
+ be positive. Starting a worker reserves one full context window plus output
380
+ from this limit, so 2,000,000 tokens covers one worker. Raise the limit when
381
+ several workers share the group.
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 limit 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": "plori (plori.ai): a cloud AI agent with its own persistent environment - durable disk, real CLI tools, and memory. The official plori CLI.",
4
- "version": "0.4.2",
3
+ "description": "Plori runs AI agents in Workspaces.",
4
+ "version": "0.5.0",
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.4.2",
30
- "@plori/cli-darwin-x64": "0.4.2",
31
- "@plori/cli-linux-x64": "0.4.2",
32
- "@plori/cli-linux-arm64": "0.4.2",
33
- "@plori/cli-win32-x64": "0.4.2"
29
+ "@plori/cli-darwin-arm64": "0.5.0",
30
+ "@plori/cli-darwin-x64": "0.5.0",
31
+ "@plori/cli-linux-x64": "0.5.0",
32
+ "@plori/cli-linux-arm64": "0.5.0",
33
+ "@plori/cli-win32-x64": "0.5.0"
34
34
  }
35
35
  }