@stratusagent/cli 0.3.0 → 0.4.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.
- package/README.md +142 -6
- package/dist/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +355 -81
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Stratus Agent CLI — create always-on agents that get smarter over time. Quickly set up Stratus Agent on your machine, create new agents, connect AI providers, and configure channels.
|
|
4
4
|
|
|
5
|
+
<img width="2400" height="1004" alt="image" src="https://github.com/user-attachments/assets/ef16d58f-694c-406e-b201-aee61b093753" />
|
|
6
|
+
|
|
5
7
|
## Install
|
|
6
8
|
|
|
7
9
|
Needs **Node.js 22.13+** — the gateway's session store uses `node:sqlite`, which runs unflagged from 22.13. On the 23.x line that landed separately, in **23.4**, so 23.0–23.3 are too old despite the higher number. Every package declares the range, and the CLI checks it at startup, so an unsupported Node gets a line naming what it needs rather than a missing-builtin error later on.
|
|
@@ -63,6 +65,7 @@ stratus run --provider anthropic --model claude-opus-5 "hello"
|
|
|
63
65
|
stratus run --prompt "use the echo tool" --format json
|
|
64
66
|
stratus serve # stratusd: the whole roster, always on
|
|
65
67
|
stratus serve --idle-timeout 120 --no-events
|
|
68
|
+
stratus serve --approvals remote # ask a human in Slack instead of refusing
|
|
66
69
|
stratus service install # keep stratusd running under launchd/systemd
|
|
67
70
|
stratus service status
|
|
68
71
|
stratus logs -f # what the daemon has been doing
|
|
@@ -89,10 +92,9 @@ riskier is refused, with a line in the log saying which agent wanted what:
|
|
|
89
92
|
09:14:36 — warning: ava: shell.run is gated and nobody is available to approve it (session slack:ava:…)
|
|
90
93
|
```
|
|
91
94
|
|
|
92
|
-
That is the honest
|
|
93
|
-
terminal to prompt on.
|
|
94
|
-
|
|
95
|
-
than assumes.
|
|
95
|
+
That is the honest default behind a service manager, where there is no
|
|
96
|
+
terminal to prompt on. If somebody *is* reachable, `--approvals remote` asks
|
|
97
|
+
them instead — see [Asking a human](#asking-a-human-remote-approval).
|
|
96
98
|
|
|
97
99
|
A tool that declares no risk counts as `gated`, never `safe` — forgetting to
|
|
98
100
|
classify something should cost a prompt, not an unattended command. Every
|
|
@@ -108,7 +110,103 @@ calls face this policy again under their allowlist, and the chain is depth
|
|
|
108
110
|
bounded.
|
|
109
111
|
|
|
110
112
|
`stratus chat` and `stratus run` are unaffected: at a terminal, `--approvals`
|
|
111
|
-
works exactly as before.
|
|
113
|
+
works exactly as before (`always`, `ask`, `never`).
|
|
114
|
+
|
|
115
|
+
### Asking a human: remote approval
|
|
116
|
+
|
|
117
|
+
In `remote` mode a gated call does not fail — the turn parks, the request is
|
|
118
|
+
posted to Slack with **Allow once**, **Always allow**, and **Deny**, and the
|
|
119
|
+
turn resumes on the answer. The question goes to the thread the turn is
|
|
120
|
+
happening in, so whoever is talking to the agent sees it where they already
|
|
121
|
+
are.
|
|
122
|
+
|
|
123
|
+
Turn it on for the daemon with `--approvals remote`, or in
|
|
124
|
+
`~/.stratus/config.json` so the installed service picks it up too:
|
|
125
|
+
|
|
126
|
+
```jsonc
|
|
127
|
+
{
|
|
128
|
+
"approvals": {
|
|
129
|
+
"mode": "remote", // headless (default) or remote
|
|
130
|
+
"timeoutMs": 900000, // unanswered after 15 minutes → denied (max 2147483647)
|
|
131
|
+
"slackApprovers": ["U01OPS"], // who may decide, for every agent
|
|
132
|
+
"slackChannel": "C07OPS", // where to ask when the turn isn't in Slack
|
|
133
|
+
"agents": {
|
|
134
|
+
"ava": { "slackApprovers": ["U01DYLAN"] }
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
An agent inherits the top-level route key by key, so `ava` above asks her own
|
|
141
|
+
approver in the shared `C07OPS` fallback channel. An explicit
|
|
142
|
+
`"slackApprovers": []` on an agent excludes it from the default list — that
|
|
143
|
+
agent's gated calls are then denied outright — while omitting the key
|
|
144
|
+
inherits.
|
|
145
|
+
|
|
146
|
+
**Only a config you chose is allowed to set this block** — `--config`,
|
|
147
|
+
`STRATUS_CONFIG`, or the global `~/.stratus/config.json`. An auto-discovered
|
|
148
|
+
project-local `stratus.config.json` outranks the global one for provider
|
|
149
|
+
settings, but it can be checked into any repository, and appointing the
|
|
150
|
+
people who may authorize an agent's tool calls is not something a clone gets
|
|
151
|
+
to do. Its `approvals` block is ignored, with a warning naming the file.
|
|
152
|
+
|
|
153
|
+
Three things are worth knowing before you turn it on:
|
|
154
|
+
|
|
155
|
+
- **Approvers are people, not places.** Posting into a channel does not make
|
|
156
|
+
everyone in it an approver: each request is bound to the ids configured for
|
|
157
|
+
that agent, and anyone else's click is refused with a notice only they see.
|
|
158
|
+
The request stays open for someone who may actually answer it. This matters
|
|
159
|
+
most for **Always allow**, which widens what the agent may do unattended.
|
|
160
|
+
- **An agent with no approver configured is denied immediately**, not left to
|
|
161
|
+
time out — `remote` with nobody listed behaves exactly like `headless`. If
|
|
162
|
+
no channel can ask for an agent at all (no Slack tokens for it, or
|
|
163
|
+
`@stratusagent/channel-slack` not installed) there is nothing to render the
|
|
164
|
+
request, so its gated calls wait out the timeout instead. The daemon names
|
|
165
|
+
those agents at startup, rather than leaving you to find out at 3am:
|
|
166
|
+
|
|
167
|
+
```text
|
|
168
|
+
approvals: remote — gated calls are parked and asked in Slack (approvers set for ava)
|
|
169
|
+
```
|
|
170
|
+
- **A parked turn survives a restart.** The daemon records what has not run
|
|
171
|
+
before it asks, so an approval outstanding when it stops is finished when
|
|
172
|
+
it starts again — the question is re-asked in Slack, the call runs on the
|
|
173
|
+
answer, and anything queued behind it still runs too. The re-asked request
|
|
174
|
+
keeps the window it started with rather than getting a fresh one, and a
|
|
175
|
+
wait that has already used up its `timeoutMs` is denied instead of
|
|
176
|
+
re-asked: downtime is not a reason to extend a security decision.
|
|
177
|
+
- **A turn that was mid-flight is failed, not left hanging.** Parking is the
|
|
178
|
+
one state a restart can resume from — a turn that stopped anywhere else
|
|
179
|
+
(waiting on the provider, inside a tool, or on an approval asked by an
|
|
180
|
+
agent billed through a Claude subscription, which is deliberately not
|
|
181
|
+
checkpointed) cannot be. Those sessions come back marked `failed`, with a
|
|
182
|
+
reason saying stratusd stopped while they were running and to send the
|
|
183
|
+
message again, rather than claiming to still be running forever. This is
|
|
184
|
+
only for an ungraceful stop: a normal restart denies what is parked and
|
|
185
|
+
finishes the turns those denials release before it exits.
|
|
186
|
+
- **Always allow lasts for the session**, not forever. It stops the same tool
|
|
187
|
+
asking again in the same conversation, and it is forgotten when the daemon
|
|
188
|
+
restarts. A durable per-agent whitelist is a narrower promise (a normalized
|
|
189
|
+
command scope) and ships with the shell tool that needs one.
|
|
190
|
+
|
|
191
|
+
The request shows the tool's **arguments**, not just its name — for anything
|
|
192
|
+
whose danger lives in what it was called with, approving a bare tool name is
|
|
193
|
+
approving something you cannot see. Arguments are escaped (a model-written
|
|
194
|
+
argument cannot mention or broadcast to the workspace through the prompt)
|
|
195
|
+
and truncated with a visible notice when they are long.
|
|
196
|
+
|
|
197
|
+
Requests are also denied — visibly, with a reason — when they expire, when
|
|
198
|
+
the turn is cancelled, when the daemon shuts down, and when a turn reaches a
|
|
199
|
+
gated call while the daemon is already stopping. Every one of those retracts
|
|
200
|
+
the buttons in Slack, so a message never keeps offering a decision with
|
|
201
|
+
nowhere to land.
|
|
202
|
+
|
|
203
|
+
`timeoutMs` is capped at 2147483647 (~24.8 days), the longest timer Node can
|
|
204
|
+
hold. A larger value is rejected at startup rather than accepted: it would
|
|
205
|
+
not wait longer, it would expire every approval almost immediately.
|
|
206
|
+
|
|
207
|
+
Approval buttons need the Slack app's **Interactivity** switched on. Apps
|
|
208
|
+
created from the manifest that `stratus setup` prints already have it; an app
|
|
209
|
+
created before this shipped needs it enabled once, in its App Manifest.
|
|
112
210
|
|
|
113
211
|
## Always on
|
|
114
212
|
|
|
@@ -286,6 +384,44 @@ You are a sharp, warm generalist. Answer first, explain second...
|
|
|
286
384
|
|
|
287
385
|
Agents remember: facts saved with the built-in `memory.remember` tool persist to `~/.stratus/memory.jsonl`, keyed to the agent — so the Ava you talk to tomorrow remembers today, from any directory.
|
|
288
386
|
|
|
387
|
+
**Ids are not labels.** Frontmatter may set `id:` explicitly, and it keys the
|
|
388
|
+
agent's sessions, memory, credentials, Slack tokens, and every per-agent path
|
|
389
|
+
on disk. So it has to stay one path segment, and one ordinary map key: an id
|
|
390
|
+
may not start with a dot or contain a slash, a backslash, a control
|
|
391
|
+
character, or leading or trailing whitespace, and it may not be a name every
|
|
392
|
+
object already answers to (`__proto__`, `constructor`, `toString`). Anything that would leave its directory is rejected when the soul
|
|
393
|
+
loads rather than quietly cleaned up — `id: ../../escape` is refused, not
|
|
394
|
+
rewritten to `escape`.
|
|
395
|
+
|
|
396
|
+
Anything else is yours. An id like `Ava_1` or `team.alpha` is unusual but
|
|
397
|
+
harmless, and it is already keying that agent's sessions and sign-ins, so it
|
|
398
|
+
is left exactly as written. Omit `id:` and one is derived from the name as a
|
|
399
|
+
plain slug (`ava`); a generated agent's id is also capped at 64 characters,
|
|
400
|
+
but a slug derived from a name you chose is used whole, because shortening
|
|
401
|
+
an id moves the agent it belongs to.
|
|
402
|
+
|
|
403
|
+
Creating an agent checks the id against every id the served roster holds,
|
|
404
|
+
not against the filenames on disk: what the roster files *declare* (a soul
|
|
405
|
+
at `renamed.md` can declare `id: ava`), the configured default soul even
|
|
406
|
+
when its file lives elsewhere, and the reserved `stratus`. A new agent gets
|
|
407
|
+
a suffixed id (`ava-3f9c`) rather than one that would collide. Its name
|
|
408
|
+
stays the one you chose.
|
|
409
|
+
|
|
410
|
+
**Two souls cannot share an id.** That is not two agents; it is one agent
|
|
411
|
+
whose memory and sign-ins belong to whichever file sorted first. The roster
|
|
412
|
+
refuses to load and names both files, `stratus serve` will not start,
|
|
413
|
+
`stratus doctor` reports it, and `stratus setup` → Channels offers no
|
|
414
|
+
agents at all — nothing is servable while the roster is ambiguous, so
|
|
415
|
+
connecting a Slack app would configure something that cannot run. Neither
|
|
416
|
+
command offers to clear "unmatched" Slack tokens in that state either: a
|
|
417
|
+
roster that would not load cannot prove which ids are missing, and the
|
|
418
|
+
tokens at risk belong to agents that are perfectly fine. (An unreadable *single* soul still degrades to a
|
|
419
|
+
warning — one broken file never takes the team down. A collision has no
|
|
420
|
+
correct winner, which is the difference.) The built-in `stratus` id is
|
|
421
|
+
reserved: souls claiming it are skipped — including two of them, since
|
|
422
|
+
neither was going to get the id, so their agreeing on it is not a collision
|
|
423
|
+
to refuse over.
|
|
424
|
+
|
|
289
425
|
## Options
|
|
290
426
|
|
|
291
427
|
| Flag | Purpose |
|
|
@@ -295,7 +431,7 @@ Agents remember: facts saved with the built-in `memory.remember` tool persist to
|
|
|
295
431
|
| `--model` | Model for real providers (anthropic default: `claude-opus-5`) |
|
|
296
432
|
| `--base-url` | Override the provider API base URL |
|
|
297
433
|
| `--config <file>` | Load settings from a specific config file |
|
|
298
|
-
| `--approvals` |
|
|
434
|
+
| `--approvals` | `run`/`chat`: tool approval mode — `always`, `ask`, or `never`. `serve`: how the daemon reaches a human — `headless` (refuse gated calls) or `remote` (ask in Slack); overrides the config's `approvals.mode` |
|
|
299
435
|
| `--max-turns` | Max provider turns per run (default 8) |
|
|
300
436
|
| `--format` | `text` or `json` |
|
|
301
437
|
| `--idle-timeout` | `stratus serve`: seconds of provider silence before the watchdog aborts a turn (default 120) |
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type JsonValue, type Session, type StratusEvent } from '@stratusagent/core';
|
|
2
|
-
import { type CredentialProviderName, type RuntimeConfig, type StratusProviderName } from '@stratusagent/state';
|
|
2
|
+
import { type CredentialProviderName, type RuntimeSelection, type RuntimeConfig, type StratusProviderName } from '@stratusagent/state';
|
|
3
3
|
import { type ServiceRunner } from './service.ts';
|
|
4
4
|
export { installService, launchdPlist, readServiceStatus, servicePlatform, serviceUnitPath, startService, stopService, systemdUnit, uninstallService, SERVICE_LABEL, type ServiceRunner, type ServiceStatus, } from './service.ts';
|
|
5
5
|
export { createLogWriter, currentLogPosition, truncateRedirectLogs, formatLogRecord, parseLogLines, readRecentRecords, tailLog, type LogRecord, } from './logs.ts';
|
|
@@ -102,9 +102,12 @@ export interface ParsedLogsCommand {
|
|
|
102
102
|
sessionId?: string;
|
|
103
103
|
format: 'text' | 'json';
|
|
104
104
|
}
|
|
105
|
+
export type ServeApprovalMode = 'headless' | 'remote';
|
|
105
106
|
export interface ParsedServeCommand {
|
|
106
107
|
command: 'serve';
|
|
107
108
|
configPath?: string;
|
|
109
|
+
/** Overrides `approvals.mode` in the config file. */
|
|
110
|
+
approvals?: ServeApprovalMode;
|
|
108
111
|
/** Watchdog idle timeout in milliseconds. 0 disables. */
|
|
109
112
|
idleTimeoutMs?: number;
|
|
110
113
|
events: boolean;
|
|
@@ -119,7 +122,7 @@ export interface DashboardServerHandle {
|
|
|
119
122
|
url: string;
|
|
120
123
|
close: () => Promise<void>;
|
|
121
124
|
}
|
|
122
|
-
export declare const CLI_VERSION = "0.
|
|
125
|
+
export declare const CLI_VERSION = "0.4.0";
|
|
123
126
|
/**
|
|
124
127
|
* The range every package declares in its `engines` field. Two floors, not
|
|
125
128
|
* one: `node:sqlite` was unflagged in 22.13.0 on the LTS line and in 23.4.0
|
|
@@ -141,11 +144,20 @@ export declare const SUPPORTED_NODE_RANGE = ">=22.13 <23 || >=23.4";
|
|
|
141
144
|
* string is a bad reason to refuse to run.
|
|
142
145
|
*/
|
|
143
146
|
export declare const unsupportedNodeMessage: (version: string) => string | undefined;
|
|
144
|
-
declare const HELP_TEXT = "Stratus Agent CLI\n\nUsage:\n stratus setup\n stratus chat\n stratus chat --soul ./examples/souls/ava.md\n stratus run --prompt \"Use the demo tool\"\n stratus run \"Say hello\"\n ANTHROPIC_API_KEY=... stratus run --provider anthropic \"Say hello\"\n stratus run --soul ./examples/souls/ava.md \"Say hello\"\n echo \"Use the echo tool\" | stratus run --stdin\n STRATUS_PROVIDER=openai OPENAI_API_KEY=... stratus run \"Say hello\"\n stratus run --config ./stratus.config.json --provider openai \"Say hello\"\n stratus agents\n stratus doctor\n stratus service install\n stratus service status\n stratus logs -f\n stratus logs --agent ava -n 200\n stratus dashboard\n stratus dashboard --port 4123 --host 0.0.0.0 --no-open\n\nCommands:\n setup Menu-driven onboarding: pick a provider, sign in (Claude\n subscription or API key), create your agent, connect it to\n Slack, and test it \u2014 settings go to ~/.stratus/config.json,\n sign-ins and channel tokens to ~/.stratus/credentials.json\n (0600)\n chat Talk with your agent \u2014 the conversation persists across turns\n and remembered facts accumulate; /exit or Ctrl+C to leave\n run Execute one local Stratus Agent session\n serve Run stratusd, the always-on gateway: durable sessions, the\n whole roster live at once (each agent on its own provider),\n delegation, and a watchdog \u2014 Ctrl+C / SIGTERM drains cleanly\n (--idle-timeout <seconds>, --no-events, --no-log-file
|
|
147
|
+
declare const HELP_TEXT = "Stratus Agent CLI\n\nUsage:\n stratus setup\n stratus chat\n stratus chat --soul ./examples/souls/ava.md\n stratus run --prompt \"Use the demo tool\"\n stratus run \"Say hello\"\n ANTHROPIC_API_KEY=... stratus run --provider anthropic \"Say hello\"\n stratus run --soul ./examples/souls/ava.md \"Say hello\"\n echo \"Use the echo tool\" | stratus run --stdin\n STRATUS_PROVIDER=openai OPENAI_API_KEY=... stratus run \"Say hello\"\n stratus run --config ./stratus.config.json --provider openai \"Say hello\"\n stratus agents\n stratus doctor\n stratus service install\n stratus service status\n stratus logs -f\n stratus logs --agent ava -n 200\n stratus dashboard\n stratus dashboard --port 4123 --host 0.0.0.0 --no-open\n\nCommands:\n setup Menu-driven onboarding: pick a provider, sign in (Claude\n subscription or API key), create your agent, connect it to\n Slack, and test it \u2014 settings go to ~/.stratus/config.json,\n sign-ins and channel tokens to ~/.stratus/credentials.json\n (0600)\n chat Talk with your agent \u2014 the conversation persists across turns\n and remembered facts accumulate; /exit or Ctrl+C to leave\n run Execute one local Stratus Agent session\n serve Run stratusd, the always-on gateway: durable sessions, the\n whole roster live at once (each agent on its own provider),\n delegation, and a watchdog \u2014 Ctrl+C / SIGTERM drains cleanly\n (--idle-timeout <seconds>, --approvals <headless|remote>,\n --no-events, --no-log-file, --config <path>); everything it\n says is also written to ~/.stratus/logs, which\n \"stratus logs\" reads\n service Keep stratusd running under launchd (macOS) or systemd\n (Linux): install, uninstall, status, start, stop.\n Installing starts it now and at every login\n (--no-login installs without the login trigger,\n --config <path> pins the daemon to one config file)\n logs Read the daemon's log from any terminal: -f to follow,\n -n <count> for backlog, --agent / --session to filter,\n --format json for the raw records\n agent new Create an agent identity (generates a human-ish name + avatar theme)\n agents List your agents: who they are, where their souls live, what\n they run on, what they remember (also: stratus agent list)\n doctor Show what a run would use right now \u2014 provider, model, soul \u2014\n and which file or environment variable decided each, then\n flag anything that would surprise you (--format json)\n dashboard Start the local Stratus Agent dashboard and open it in your browser\n help Show this help message\n\nAgent options:\n --name Agent name (omit to have one generated)\n --instructions The agent's persona/instructions\n --format Output format for agent new: text, json, or soul (a ready-to-edit soul file)\n\nOptions:\n --prompt, -p Prompt to send to the local agent loop\n --stdin Read the prompt from stdin\n --provider Provider to use: anthropic, openai, or demo\n --model Model name for real providers (anthropic default: claude-opus-5, openai default: gpt-4.1-mini)\n --base-url Override the provider API base URL\n --soul Run as the agent defined by a soul file (markdown + frontmatter, see examples/souls)\n --config Config file path (run: load settings from it, setup: write it)\n --format Output format: text or json (default: text)\n --no-events Hide event-by-event progress lines in text mode\n --approvals run/chat: tool approval mode \u2014 always, ask, or never (default: always)\n serve: how the daemon reaches a human \u2014 headless (refuse every\n gated call) or remote (ask in Slack). Default headless, or\n the config file's \"approvals.mode\"\n --max-turns Maximum provider turns per run (default: 8)\n --port Dashboard port, defaults to an open local port\n --host Dashboard host (default: 127.0.0.1)\n --no-open Do not open the browser automatically\n --help, -h Show this help message\n\nConfig file:\n The CLI looks for ./stratus.config.json first, then a path from --config / STRATUS_CONFIG,\n then the global ~/.stratus/config.json written by `stratus setup`.\n A \"soul\" key (or STRATUS_SOUL) points at a soul file so every run uses that agent.\n Legacy STRATUSCLAW_* env vars and stratusclaw.config.json are still supported for compatibility.\n\nSoul files:\n A soul file is markdown with frontmatter (name, provider, model, tools, credentials)\n followed by the agent's persona in prose. See examples/souls/ava.md.\n";
|
|
145
148
|
declare const stringifyValue: (value: JsonValue) => string;
|
|
146
149
|
export declare const parseCommand: (argv: string[], env?: CliEnvironment) => ParsedCommand;
|
|
147
150
|
export declare const formatEvent: (event: StratusEvent) => string | null;
|
|
148
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Kept with its historical CLI signature: a parsed run command is a
|
|
153
|
+
* RuntimeSelection plus CLI-only fields the resolver ignores.
|
|
154
|
+
*
|
|
155
|
+
* Those fields are *permitted*, not required. Demanding a whole
|
|
156
|
+
* `ParsedRunCommand` made the type claim the resolver cared about
|
|
157
|
+
* `approvals`, `format`, and `events` — it reads none of them — so every
|
|
158
|
+
* caller with a selection in hand had to invent values to get past it.
|
|
159
|
+
*/
|
|
160
|
+
export declare const resolveRuntimeConfig: (command: RuntimeSelection & Partial<Omit<ParsedRunCommand, keyof RuntimeSelection>>, env?: CliEnvironment) => Promise<RuntimeConfig>;
|
|
149
161
|
/**
|
|
150
162
|
* A saved subscription sign-in silently demoted to per-token billing is the
|
|
151
163
|
* one config surprise that costs money — an API key in the environment
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|