@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.
- package/README.md +75 -37
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# plori CLI
|
|
2
2
|
|
|
3
|
-
Plori runs AI agents
|
|
4
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
- **Browser login (`plori login`)** stores an OAuth session.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
`n
|
|
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
|
|
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 --
|
|
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`
|
|
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
|
|
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
|
|
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
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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
|
|
4
|
-
"version": "0.
|
|
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.
|
|
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.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
|
}
|