@plori/cli 0.5.1 → 0.6.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.
Files changed (2) hide show
  1. package/README.md +75 -37
  2. package/package.json +7 -7
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # plori CLI
2
2
 
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.
3
+ Plori runs AI agents that collaborate on one product in the cloud. Code,
4
+ research, content: each works on its own copy, and Plori merges their changes
5
+ back.
5
6
 
6
7
  `plori` manages hosted agents and Workspaces from a terminal or script. It uses
7
8
  the public HTTP API directly with your account credentials. MCP is not required.
@@ -77,22 +78,26 @@ API server, e.g. a local `uat-server`.
77
78
 
78
79
  ### Which sign-in can approve actions
79
80
 
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.
81
+ Both sign-in methods give the CLI the authority of the account owner:
82
+
83
+ - **Browser login (`plori login`)** stores an OAuth session.
84
+ - **API key (`plori login --key` or `PLORI_API_KEY`)** uses a key that you
85
+ create in the web app.
86
+
87
+ With either sign-in, the CLI can do these things in the runs that you start:
88
+
89
+ - approve an action
90
+ - give a saved approval (`--always-allow`)
91
+ - answer a secret question
92
+
93
+ Saved approvals apply to these runs. With either sign-in, `plori workflows run`
94
+ can also run a workflow that is not active, and `plori schedules create`
95
+ activates a schedule immediately.
96
+
97
+ A run that an MCP client started has stricter rules. In that run, the CLI can
98
+ deny an approval request or answer a question. It cannot approve an action or
99
+ give a saved approval. Approve the action in the web app. The refusal for an
100
+ approval includes the web address to open.
96
101
 
97
102
  ## First Workspace
98
103
 
@@ -106,7 +111,9 @@ plori workspace run mate "Research this topic and save the result to work/report
106
111
 
107
112
  Creation prints an idempotency key. Reuse it with `--idempotency-key` when you
108
113
  retry the same request. A name can identify more than one Workspace. Use its ID
109
- from `plori workspace list` if names are duplicated.
114
+ from `plori workspace list` if names are duplicated. The list includes your own
115
+ and shared Workspaces, with `ACCOUNT` and `ROLE` columns. JSON includes
116
+ `account` (`user_id`, `email`) and `role` (`owner`, `member` or `viewer`).
110
117
 
111
118
  For commands that take an agent, set `AGENT_ID` to the creation response's
112
119
  `default_manager_agent_id`. The Workspace name is not an agent name.
@@ -157,9 +164,9 @@ Approvals and input requests are answered where they appear: `y` or `n` for an
157
164
  approval, `a` to answer yes and grant saved approval when the request
158
165
  carries a consent tool, a line for a value, and a no-echo read for a secret,
159
166
  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.
167
+ In a run that an MCP client started, the server refuses `y` and `a` as described in
168
+ [Which sign-in can approve actions](#which-sign-in-can-approve-actions).
169
+ `n`, plain answers and secret answers work with either credential.
163
170
 
164
171
  The prompt needs a terminal on both ends. With `--read-only`, or when either
165
172
  stdin or stdout is redirected, attach drops the prompt and tails the conversation
@@ -180,19 +187,26 @@ plori workspace run mate "build it" --follow # stream the turn live (tools on s
180
187
  echo "summarize this" | plori workspace run mate - # message from stdin
181
188
  plori account watch --agent "$AGENT_ID" # one JSON line per run ending
182
189
  plori account inbox # what ended, and what waits on you
183
- plori schedules create "$AGENT_ID" "daily report" --in 86400
190
+ plori schedules create mate "daily report" --in 86400
191
+ plori schedules list mate
192
+ plori schedules cancel mate <schedule-id>
184
193
  plori input list "$AGENT_ID" # runs paused on an approval or a question
185
194
  plori input answer <run-id> <tool-call-id> --approve
186
195
  plori input answer <run-id> <tool-call-id> --approve --always-allow # + stop asking for this tool
187
196
  plori account balance && plori account disk
188
197
 
189
198
  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
199
+ plori workflow list --workspace mate
200
+ plori workflow create "rss digest" --workspace mate --trigger cron --cron "0 9 * * *"
201
+ plori workflow run "rss digest" --workspace mate # run it now (real fire, billed)
202
+ plori workflow execution "rss digest" <exec-id> --workspace mate # poll one run
194
203
  ```
195
204
 
205
+ Use `plori input answer <run-id> <tool-call-id> --value -` to read an answer from stdin.
206
+
207
+ Schedules take a Workspace name or UUID. `plori workflow create` requires `--workspace`.
208
+ Build the draft with `plori workspace run mate "Build the steps for workflow <id>"`.
209
+
196
210
  Agents are addressed by name or UUID. Every command accepts `--json`; when
197
211
  stdout is not a TTY the output is JSON automatically, so scripts and agents
198
212
  can parse without flags. `plori conversation attach` is the one exception: it is a live
@@ -206,6 +220,21 @@ the exit codes are listed under [Agent-driven use](#agent-driven-use).
206
220
  `plori workspace run` prints the reply in a terminal and a JSON result when piped.
207
221
  Tool progress goes to stderr. Reuse the Workspace for later tasks.
208
222
 
223
+ An idle conversation starts a run. If it is running, the server accepts plain text as
224
+ steering or queues it. The CLI prints the receipt and exits `0`, including with
225
+ `--follow`. It does not wait for the running or paused run to end. The receipt
226
+ contains `status` (`steering` or `queued`), `steer_id` and `run_id`, plus the
227
+ conversation and Workspace ids. That `run_id` identifies the running or paused
228
+ run, not a result for this message. Use `plori runs list "$AGENT_ID"` to find a
229
+ later queued turn. There is no lookup from `steer_id` to that later run.
230
+
231
+ If the paused run has exactly one ordinary question assigned to you, the message
232
+ answers it. Otherwise it queues, with `pending_inputs` identifying the request
233
+ and assignee. Sending a message does not cancel a pending request.
234
+ `409 conversation_busy` still applies to attachments or run options in a busy
235
+ conversation, and to working-copy conflicts. Send attachments and options when
236
+ idle.
237
+
209
238
  ### Start a run and keep working
210
239
 
211
240
  A local agent (a Claude Code or Codex shell, an orchestrator) does not have to
@@ -256,8 +285,8 @@ them per agent. An approval that gates an outward-facing write carries a
256
285
  `consent_tool` (visible in `plori input list --json`); answering it with
257
286
  `--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
287
  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.
288
+ `--always-allow` work with either sign-in, except in a run that an MCP client
289
+ started: the server refuses them there and the owner approves in the web app.
261
290
 
262
291
  ### Machine-readable streams
263
292
 
@@ -273,7 +302,7 @@ tools return: `run_id`, `status`, `session_id`, `url`, `pending_inputs`.
273
302
 
274
303
  | code | meaning |
275
304
  | ---- | ------- |
276
- | 0 | the command succeeded; a run that was waited for completed |
305
+ | 0 | the command succeeded. A waited run completed, or the server accepted a message as steering or queued |
277
306
  | 1 | API or runtime failure |
278
307
  | 2 | usage error |
279
308
  | 3 | missing, rejected, or expired credentials |
@@ -330,7 +359,8 @@ retry when its storage is ready.
330
359
 
331
360
  `--max-tokens` sets a token figure that is recorded on the new group, in
332
361
  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
362
+ calls. The account's credit balance limits spend. A member can also have a
363
+ monthly spend cap that refuses new run starts with `402`. To add the worker to
334
364
  an existing group, use `--task-group <id>` without `--max-tokens`.
335
365
 
336
366
  The command prints the worker ID and a `worker status` command on stderr. It
@@ -416,18 +446,26 @@ capability API and is not implemented by this command.
416
446
  JSON configuration and resolutions accept inline JSON or
417
447
  `@file` (`@-` reads stdin).
418
448
 
449
+ Plori merges a finished worker's saved changes into the Workspace files
450
+ automatically when they merge cleanly. This includes workers started through the
451
+ CLI, MCP or REST. The manager resolves conflicts. Failed or stopped workers keep
452
+ their saved revisions without an automatic merge. The same applies while a
453
+ worker waits for input. The manager can still submit those saved revisions.
454
+
455
+ Use the changeset commands below for conflicts or saved work that did not land.
419
456
  Submit a changeset with `--base-revision`, `--incoming-revision` and
420
457
  `--current-revision`. The optional `--incoming-save-operation` identifies the
421
458
  selected save receipt. Automated clients preserve this identity when unchanged
422
- content reuses an earlier revision.
459
+ content reuses an earlier revision. A clean changeset merges automatically.
423
460
 
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
461
+ For conflicts, the manager submits the same saved revision and resolves the
462
+ conflicts. To resolve them yourself, write the copy that `changeset get` returns
463
+ as `integration_working_copy_id`. Use ETag checks. Then use
429
464
  `changeset resolve --generation N --resolutions @resolutions.json` with records
430
465
  such as `[{"path":"notes.txt","expected_etag":17,"summary":"Reviewed merge"}]`.
466
+ Read the resolved comparison before accepting it. Its current revision is the
467
+ Workspace revision that the comparison used. `changeset accept` requires that
468
+ comparison-current ID and accepts repeated `--evidence` flags.
431
469
  Resolve, accept and reject each require their own stable idempotency key.
432
470
 
433
471
  List workers and task groups, read charged costs, and inspect retention:
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@plori/cli",
3
- "description": "Plori runs AI agents in Workspaces.",
4
- "version": "0.5.1",
3
+ "description": "Plori runs AI agents that collaborate on one product in the cloud.",
4
+ "version": "0.6.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.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"
29
+ "@plori/cli-darwin-arm64": "0.6.1",
30
+ "@plori/cli-darwin-x64": "0.6.1",
31
+ "@plori/cli-linux-x64": "0.6.1",
32
+ "@plori/cli-linux-arm64": "0.6.1",
33
+ "@plori/cli-win32-x64": "0.6.1"
34
34
  }
35
35
  }