@stratusagent/cli 0.6.0 → 0.8.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 +249 -8
- package/dist/index.d.ts +74 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +715 -100
- package/dist/index.js.map +1 -1
- package/package.json +24 -19
package/README.md
CHANGED
|
@@ -26,6 +26,10 @@ alongside the CLI and `stratus serve` picks it up automatically:
|
|
|
26
26
|
npm install -g @stratusagent/channel-slack
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
You rarely have to type that. Connect an agent in `stratus setup` → **Channels**
|
|
30
|
+
and **Save & finish** offers the install, because storing tokens is already the
|
|
31
|
+
decision to use Slack — see [What Save & finish offers](#what-save--finish-offers).
|
|
32
|
+
|
|
29
33
|
If tokens are stored for an agent but the package isn't installed, `stratus
|
|
30
34
|
serve` says so and starts anyway, serving every other channel.
|
|
31
35
|
|
|
@@ -140,6 +144,47 @@ token, so pass it with `--token` or `STRATUS_GATEWAY_TOKEN`.
|
|
|
140
144
|
- **Channels** — put an agent on Slack without opening a file. Pick the agent, and setup prints the app manifest with their name already filled in, walks you through the two tokens (input hidden), verifies each against Slack before accepting it, and stores them where `stratus serve` looks. The list marks who is connected; picking a connected agent offers to replace their tokens or disconnect.
|
|
141
145
|
- **Always on** — whether the roster keeps answering once you close the terminal. On by default, because an agent you have to remember to start is not always-on, and every Slack app you connected above stays silent until `stratusd` runs. Save & finish installs it (see [Always on](#always-on)); choose *do not run it for me* and setup removes any service it previously installed.
|
|
142
146
|
- **Test run** — say hello with the current settings before saving anything.
|
|
147
|
+
- **Save & finish** — writes everything, offers any optional package your
|
|
148
|
+
choices imply, then installs the always-on service.
|
|
149
|
+
|
|
150
|
+
### What Save & finish offers
|
|
151
|
+
|
|
152
|
+
The CLI ships no transport and no open port, so a fresh machine finishes setup
|
|
153
|
+
missing the packages its own answers just asked for. Setup knows that before
|
|
154
|
+
the daemon does — it stored the Slack tokens itself — so **Save & finish** names
|
|
155
|
+
what is missing and offers to install it:
|
|
156
|
+
|
|
157
|
+
```text
|
|
158
|
+
2 optional packages are not installed:
|
|
159
|
+
@stratusagent/channel-slack
|
|
160
|
+
Slack tokens are stored for 1 agent(s), but nothing connects to Slack without it.
|
|
161
|
+
@stratusagent/control-api @stratusagent/dashboard
|
|
162
|
+
`stratus dashboard` needs it, and it opens an authenticated port on 127.0.0.1.
|
|
163
|
+
|
|
164
|
+
Install now with npm install -g?
|
|
165
|
+
> Install all of them now
|
|
166
|
+
Install the Slack channel only
|
|
167
|
+
Install the Web dashboard only
|
|
168
|
+
Skip
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Three things about it worth knowing:
|
|
172
|
+
|
|
173
|
+
- **It asks, and anything left uninstalled prints its command** — whether you
|
|
174
|
+
skipped the offer entirely or took only one of the two, since choosing one
|
|
175
|
+
group is not a decision about the other. The control API binds a port, and
|
|
176
|
+
installing it is how an operator says they want one open, so this stays a
|
|
177
|
+
question rather than a default.
|
|
178
|
+
- **It runs before the service install**, so the LaunchAgent comes up with
|
|
179
|
+
those packages already present. A package installed *after* a daemon starts
|
|
180
|
+
is invisible to it; that ordering is the whole reason the offer lives here
|
|
181
|
+
rather than in a closing hint.
|
|
182
|
+
- **A failed install never fails setup.** Your config and credentials are
|
|
183
|
+
already written; you get npm's exit code and the command to run yourself.
|
|
184
|
+
|
|
185
|
+
Setup only suggests `stratus dashboard` at the end when it can actually work —
|
|
186
|
+
a machine that skipped or failed that install is not told to run a command that
|
|
187
|
+
would exit with an error.
|
|
143
188
|
|
|
144
189
|
Credentials are stored in `~/.stratus/credentials.json` (owner-read-only) and settings in `~/.stratus/config.json`, so `stratus run` works from any directory afterwards. No env vars to export, no config files to hand-edit.
|
|
145
190
|
|
|
@@ -164,6 +209,8 @@ stratus doctor # what a run would use right now, and why
|
|
|
164
209
|
stratus agent new # create an agent (guided on a terminal)
|
|
165
210
|
stratus agent new --format soul > ava.md
|
|
166
211
|
stratus agents # who's on the team: souls, models, memory
|
|
212
|
+
stratus schedules # what the fleet has scheduled, and where it reports
|
|
213
|
+
stratus schedules cancel <id> # stop the next firing, revoke its destination
|
|
167
214
|
stratus dashboard # local browser dashboard
|
|
168
215
|
```
|
|
169
216
|
|
|
@@ -187,9 +234,13 @@ terminal to prompt on. If somebody *is* reachable, `--approvals remote` asks
|
|
|
187
234
|
them instead — see [Asking a human](#asking-a-human-remote-approval).
|
|
188
235
|
|
|
189
236
|
A tool that declares no risk counts as `gated`, never `safe` — forgetting to
|
|
190
|
-
classify something should cost a prompt, not an unattended command.
|
|
191
|
-
built-in tools (`demo.echo`, `memory.remember`, `
|
|
192
|
-
`
|
|
237
|
+
classify something should cost a prompt, not an unattended command. Most
|
|
238
|
+
built-in tools (`demo.echo`, `memory.remember`, `memory.recall`,
|
|
239
|
+
`memory.forget`, `agent.delegate`, `schedule.list`, `schedule.cancel`) are
|
|
240
|
+
`safe`; the built-in exceptions are `schedule.every`, `schedule.at`, and
|
|
241
|
+
`message.send`, which are `gated` because they act past the end of the turn —
|
|
242
|
+
see [Proactive agents](#proactive-schedules-and-outbound-messages). Anything
|
|
243
|
+
you install is where this starts to bite, which is what the
|
|
193
244
|
[Tools](#tools-what-an-agent-can-actually-do) section below is about.
|
|
194
245
|
|
|
195
246
|
A **shell** is the exception to the whole paragraph, because its risk is in
|
|
@@ -319,7 +370,8 @@ created before this shipped needs it enabled once, in its App Manifest.
|
|
|
319
370
|
|
|
320
371
|
## Tools: what an agent can actually do
|
|
321
372
|
|
|
322
|
-
Out of the box an agent can echo, remember, and
|
|
373
|
+
Out of the box an agent can echo, remember, recall and forget its own
|
|
374
|
+
memories, and delegate. Everything else —
|
|
323
375
|
files, a shell, the web, a browser — arrives as a **plugin**: one package you
|
|
324
376
|
install, list, and enable.
|
|
325
377
|
|
|
@@ -481,6 +533,167 @@ echo every unparseable line back in its error text — which the tool returns.
|
|
|
481
533
|
A command that can be handed a path is a file reader wearing another name, so
|
|
482
534
|
`--file` is now refused in every scope, including ones you add.
|
|
483
535
|
|
|
536
|
+
## Skills: how an agent does a task well
|
|
537
|
+
|
|
538
|
+
Tools are capability; a **skill** is competence — markdown that teaches an
|
|
539
|
+
agent a procedure: the rubric for a code review, the order to check things in,
|
|
540
|
+
the format to answer in. A skill is a directory with a `SKILL.md`:
|
|
541
|
+
|
|
542
|
+
```text
|
|
543
|
+
~/.stratus/skills/
|
|
544
|
+
code-review/
|
|
545
|
+
SKILL.md
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
```markdown
|
|
549
|
+
---
|
|
550
|
+
name: Code Review
|
|
551
|
+
description: Use when reviewing a diff or a pull request.
|
|
552
|
+
---
|
|
553
|
+
|
|
554
|
+
# Code review
|
|
555
|
+
|
|
556
|
+
Lead with the verdict, then findings ordered by severity...
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
The frontmatter is the soul dialect — `name`, `description`, optional
|
|
560
|
+
`version`, and an optional `requires:` list of toolsets the procedure expects
|
|
561
|
+
(`browser.*`) — read **tolerantly**, unlike a soul's: keys other ecosystems
|
|
562
|
+
write (`license`, `allowed-tools`, nested `metadata:`) and YAML's multi-line
|
|
563
|
+
descriptions are skipped rather than refused, so a skill published for
|
|
564
|
+
another agent loads here unmodified. The directory name is the skill's id.
|
|
565
|
+
Plugins can ship skills too, declared in their manifest; those are addressed
|
|
566
|
+
by the package name verbatim (`stratus-plugin-github:pr-review`), and by the
|
|
567
|
+
bare id while no other package claims it.
|
|
568
|
+
|
|
569
|
+
### Installing skills
|
|
570
|
+
|
|
571
|
+
Anything on GitHub laid out as skill directories — including repos published
|
|
572
|
+
to [skills.sh](https://skills.sh) — installs directly:
|
|
573
|
+
|
|
574
|
+
```bash
|
|
575
|
+
stratus skill add owner/skills-repo # a whole repo of skills
|
|
576
|
+
stratus skill add owner/repo --skill hn-search --agent ava
|
|
577
|
+
stratus skill add ./my-skills # a local directory
|
|
578
|
+
stratus skills # what is installed, and who enables it
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
`skill add` takes a GitHub `owner/repo`, any git URL, or a local path; it
|
|
582
|
+
finds skills at the repo root, one level down, and in the `skills/`,
|
|
583
|
+
`.claude/skills/`, and `.agents/skills/` directories the ecosystem uses, then
|
|
584
|
+
copies each **whole directory** into `~/.stratus/skills/`. An id already
|
|
585
|
+
installed is refused per skill (`--force` replaces it), and an unparseable
|
|
586
|
+
skill is reported while the rest still install.
|
|
587
|
+
|
|
588
|
+
**Installed is not enabled.** A skill is markdown, but it is markdown your
|
|
589
|
+
agent will *follow*, so installing a repo grants no agent anything — each
|
|
590
|
+
soul still opts in through `skills:`. Pass `--agent <id>` to do both at once:
|
|
591
|
+
the command appends the installed ids to that soul's list (rendering the file
|
|
592
|
+
through the canonical formatter, like the API's field edits do).
|
|
593
|
+
|
|
594
|
+
An agent gets a skill only when its soul asks — same allowlist shape as
|
|
595
|
+
`tools:`, except that omitting it means **none** (a skill silently changing
|
|
596
|
+
how an agent behaves is worse than an agent that has to be told):
|
|
597
|
+
|
|
598
|
+
```markdown
|
|
599
|
+
---
|
|
600
|
+
name: Ava
|
|
601
|
+
tools: [fs.read, fs.search]
|
|
602
|
+
skills:
|
|
603
|
+
- code-review
|
|
604
|
+
- stratus-plugin-github:*
|
|
605
|
+
---
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
**An enabled skill costs one line per turn, not its body.** Only the name and
|
|
609
|
+
description reach the system prompt; the agent loads the full procedure with
|
|
610
|
+
the built-in `skill.read` tool when the description says it is relevant. That
|
|
611
|
+
is what lets a fleet carry thirty procedures without every turn paying for all
|
|
612
|
+
thirty. `skill.read` is part of the skills mechanism — never list it under
|
|
613
|
+
`tools:`; it appears (and works) for exactly the agents whose soul enables any
|
|
614
|
+
skill, and reads only the skills that soul allows.
|
|
615
|
+
|
|
616
|
+
**Write the description for routing.** It is the only thing the model sees
|
|
617
|
+
before deciding to load the body, so it says *when to reach for this*, not
|
|
618
|
+
what the file contains: "Use when reviewing a diff or a pull request", not "A
|
|
619
|
+
rubric with twelve sections". A skill without a description does not load.
|
|
620
|
+
|
|
621
|
+
A skill whose `requires:` names toolsets the agent's `tools:` does not cover
|
|
622
|
+
is a warning when the daemon loads the roster, never a refusal — a skill is
|
|
623
|
+
prose, and can degrade. `stratus run` and `stratus chat` serve the same skills
|
|
624
|
+
directory the daemon does, so a skill that routes locally routes in Slack.
|
|
625
|
+
|
|
626
|
+
## Proactive: schedules and outbound messages
|
|
627
|
+
|
|
628
|
+
Everything above answers when spoken to. Two toolsets make an always-on
|
|
629
|
+
daemon into agents that act on their own:
|
|
630
|
+
|
|
631
|
+
- **`schedule.every` / `schedule.at`** — recurring (an interval like `"30m"`
|
|
632
|
+
or a five-field cron expression, local time) or one-shot (ISO-8601), with
|
|
633
|
+
the prompt each firing runs and, optionally, the destination its reports
|
|
634
|
+
are pre-authorized to post to.
|
|
635
|
+
- **`schedule.list` / `schedule.cancel`** — an agent's own audit and undo.
|
|
636
|
+
- **`message.send`** — post to a channel or DM outside the current
|
|
637
|
+
conversation: `{ destination: { channel: "slack", to: "C0123456789" }, text }`.
|
|
638
|
+
Without it a scheduled turn works in silence.
|
|
639
|
+
|
|
640
|
+
Souls opt in like any other tool:
|
|
641
|
+
|
|
642
|
+
```markdown
|
|
643
|
+
---
|
|
644
|
+
name: Ava
|
|
645
|
+
tools:
|
|
646
|
+
- schedule.*
|
|
647
|
+
- message.send
|
|
648
|
+
---
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
**The approval belongs to the schedule, not to the firing.** Creating a
|
|
652
|
+
schedule is `gated`: a human approves "every morning, check the repo, report
|
|
653
|
+
to #eng" once — cadence, prompt, and destination together. A `message.send`
|
|
654
|
+
from that schedule's firings *to that destination* then runs unattended, in
|
|
655
|
+
headless mode included: it is the decision already made, not a new one.
|
|
656
|
+
Anywhere else — another channel, a DM, a schedule that declared no
|
|
657
|
+
destination — stays gated exactly as in an inbound turn, so under `headless`
|
|
658
|
+
it is refused and under `remote` it asks in Slack (in the configured
|
|
659
|
+
`approvals.slackChannel`, since a scheduled turn has no thread of its own).
|
|
660
|
+
Note that a plain **Allow once** on `schedule.every` therefore mints
|
|
661
|
+
something durable — the request shows the cadence, prompt, and destination,
|
|
662
|
+
because that is what is being approved.
|
|
663
|
+
|
|
664
|
+
The rest of the shape, briefly:
|
|
665
|
+
|
|
666
|
+
- **Each firing is its own session** (`schedule:<id>:<slot>`), dispatched
|
|
667
|
+
through the same path a channel message takes, marked
|
|
668
|
+
`scheduled: true` in metadata. Continuity across firings is what agent
|
|
669
|
+
memory is for.
|
|
670
|
+
- **Schedules are immutable.** Editing is cancel-plus-create, so the
|
|
671
|
+
approval's scope is exactly the row's lifetime.
|
|
672
|
+
- **A destination is validated at creation** — the agent's Slack app must be
|
|
673
|
+
able to see the conversation and be a member of it — so a schedule that
|
|
674
|
+
could never report is refused while somebody is present to hear why, not
|
|
675
|
+
at 6am. The same membership check runs on every send: no cold-DMing.
|
|
676
|
+
- **Schedules survive restarts** (they live in the daemon's own database),
|
|
677
|
+
a slot is consumed *before* its firing dispatches so a crash mid-firing
|
|
678
|
+
never double-runs it, and a missed window gets at most one late catch-up —
|
|
679
|
+
windows that passed entirely are skipped with a log line.
|
|
680
|
+
- **Two limits hold unattended spend down**: an interval floor (default one
|
|
681
|
+
minute) and a per-agent cap on concurrent scheduled turns (default one —
|
|
682
|
+
a firing that would exceed it waits for the next tick).
|
|
683
|
+
|
|
684
|
+
What the fleet has set is never only the agents' business:
|
|
685
|
+
|
|
686
|
+
```bash
|
|
687
|
+
stratus schedules # every agent's schedules, straight from the daemon's database
|
|
688
|
+
stratus schedules cancel <id> # stop the next firing; the destination grant dies with the row
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
Cancelling — from the CLI, the control API (`DELETE /schedules/:id`), or the
|
|
692
|
+
agent's own `schedule.cancel` — revokes the pre-authorized destination in the
|
|
693
|
+
same stroke, and a running daemon notices without a restart. The daemon log
|
|
694
|
+
records that a schedule was created, fired, or cancelled (ids and
|
|
695
|
+
destinations, never prompt contents beyond the row itself).
|
|
696
|
+
|
|
484
697
|
## Always on
|
|
485
698
|
|
|
486
699
|
`stratus serve` stays a foreground process on purpose — debuggable, and
|
|
@@ -564,7 +777,9 @@ conversation keeps it across daemon restarts.
|
|
|
564
777
|
The log is a **trace, not a second transcript**: it records that a tool ran and
|
|
565
778
|
that a session completed, with the tool's name, the agent, and the session id.
|
|
566
779
|
Prompts, replies, and tool inputs are not written — what was said lives in the
|
|
567
|
-
session store instead.
|
|
780
|
+
session store instead. A memory write or forget also records the **entry id**
|
|
781
|
+
it touched (never the fact itself), so "when did the agent learn this" has an
|
|
782
|
+
answer.
|
|
568
783
|
|
|
569
784
|
One exception worth knowing before you paste a log anywhere. A failed session
|
|
570
785
|
records the **provider's error text verbatim**, and providers routinely quote
|
|
@@ -640,7 +855,7 @@ environment quietly demoting a Claude subscription sign-in to per-token billing.
|
|
|
640
855
|
|
|
641
856
|
## Agents are people
|
|
642
857
|
|
|
643
|
-
An agent's identity lives in a **soul file** — markdown with frontmatter for the structured parts (name, provider, model, tool allowlists) and prose for the personality:
|
|
858
|
+
An agent's identity lives in a **soul file** — markdown with frontmatter for the structured parts (name, provider, model, tool and skill allowlists) and prose for the personality:
|
|
644
859
|
|
|
645
860
|
```markdown
|
|
646
861
|
---
|
|
@@ -649,13 +864,39 @@ provider: anthropic
|
|
|
649
864
|
model: claude-opus-5
|
|
650
865
|
tools:
|
|
651
866
|
- demo.echo
|
|
652
|
-
- memory
|
|
867
|
+
- memory.*
|
|
868
|
+
skills:
|
|
869
|
+
- code-review
|
|
653
870
|
---
|
|
654
871
|
|
|
655
872
|
You are a sharp, warm generalist. Answer first, explain second...
|
|
656
873
|
```
|
|
657
874
|
|
|
658
|
-
Agents remember: facts saved with the built-in `memory.remember` tool persist
|
|
875
|
+
Agents remember: facts saved with the built-in `memory.remember` tool persist
|
|
876
|
+
to `~/.stratus/memory.jsonl`, keyed to the agent — so the Ava you talk to
|
|
877
|
+
tomorrow remembers today, from any directory. Recall is something the agent
|
|
878
|
+
does, not only something done to it: the system prompt carries the most
|
|
879
|
+
recent facts (up to 20, within a byte budget), and everything older is
|
|
880
|
+
reachable through `memory.recall`, a full-text search over the agent's own
|
|
881
|
+
store — plain words in, matching facts out, newest first; a query like `C++`
|
|
882
|
+
or an unmatched quote is a search, never an error. `memory.forget` retires a
|
|
883
|
+
fact by id: it stops reaching prompts and recall, but stays in the file as a
|
|
884
|
+
tombstone line, so you can still see what an agent chose to drop. A single
|
|
885
|
+
fact is capped at 4 KiB — an oversized `memory.remember` is refused outright
|
|
886
|
+
rather than stored truncated.
|
|
887
|
+
|
|
888
|
+
One thing to check on souls written before recall existed: a `tools:`
|
|
889
|
+
allowlist naming exactly `memory.remember` lets the agent keep saving facts
|
|
890
|
+
but not search them, and with the prompt now carrying only the recent slice,
|
|
891
|
+
its older memories are out of reach. Add `memory.recall` and `memory.forget`
|
|
892
|
+
— or just `memory.*`, as the example above does. A soul with no `tools:`
|
|
893
|
+
list is unaffected; omitted means every registered tool.
|
|
894
|
+
|
|
895
|
+
The JSONL is the record and you may edit it: add a line by hand and it is
|
|
896
|
+
recallable; fix a typo and nothing goes stale. Search is served from a
|
|
897
|
+
derived FTS index the CLI writes alongside, `~/.stratus/memory.jsonl.index`
|
|
898
|
+
— safe to delete at any time, it is rebuilt from the JSONL on the next
|
|
899
|
+
recall.
|
|
659
900
|
|
|
660
901
|
**Ids are not labels.** Frontmatter may set `id:` explicitly, and it keys the
|
|
661
902
|
agent's sessions, memory, credentials, Slack tokens, and every per-agent path
|
package/dist/index.d.ts
CHANGED
|
@@ -25,7 +25,31 @@ export interface CliEnvironment {
|
|
|
25
25
|
shutdownSignal?: AbortSignal;
|
|
26
26
|
/** Runs launchctl/systemctl. Injected so tests never touch the real one. */
|
|
27
27
|
serviceRunner?: ServiceRunner;
|
|
28
|
+
/** Reports whether an optional package is installed. Injected so tests do not assert on their own node_modules. */
|
|
29
|
+
packageResolver?: PackageResolver;
|
|
30
|
+
/** Installs optional packages. Injected so tests never run npm. */
|
|
31
|
+
packageInstaller?: PackageInstaller;
|
|
28
32
|
}
|
|
33
|
+
export interface PackageInstallResult {
|
|
34
|
+
ok: boolean;
|
|
35
|
+
/** Why it failed, as a line the operator can act on. Empty on success. */
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
38
|
+
/** Installs optional packages globally. */
|
|
39
|
+
export type PackageInstaller = (packages: string[]) => Promise<PackageInstallResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Whether spawning npm needs a shell on this platform.
|
|
42
|
+
*
|
|
43
|
+
* On Windows npm is `npm.cmd`, a batch file: a bare `npm` does not exist as
|
|
44
|
+
* an executable there (PATHEXT is a shell's job, not spawn's), and naming
|
|
45
|
+
* the `.cmd` directly has thrown EINVAL since the fix for CVE-2024-27980 —
|
|
46
|
+
* both land in the caller's error handler, so a Windows setup would report
|
|
47
|
+
* that it could not install and leave Slack and the dashboard missing.
|
|
48
|
+
*
|
|
49
|
+
* Every package name reaching the shell is a constant in this file, so
|
|
50
|
+
* there is nothing user-supplied here for it to re-parse.
|
|
51
|
+
*/
|
|
52
|
+
export declare const npmNeedsShell: (platform: NodeJS.Platform) => boolean;
|
|
29
53
|
export interface CliRunOptions {
|
|
30
54
|
argv: string[];
|
|
31
55
|
streams?: CliStreams;
|
|
@@ -85,6 +109,20 @@ export interface ParsedChatCommand {
|
|
|
85
109
|
approvals: CliApprovalMode;
|
|
86
110
|
maxTurns?: number;
|
|
87
111
|
}
|
|
112
|
+
export interface ParsedSkillAddCommand {
|
|
113
|
+
command: 'skill-add';
|
|
114
|
+
/** A GitHub `owner/repo`, a git URL, or a local path. */
|
|
115
|
+
source: string;
|
|
116
|
+
/** Install only these ids (repeatable --skill). */
|
|
117
|
+
skillIds?: string[];
|
|
118
|
+
/** Replace an already-installed id instead of refusing it. */
|
|
119
|
+
force?: boolean;
|
|
120
|
+
/** Enable the installed skills in this agent's soul afterwards. */
|
|
121
|
+
agentId?: string;
|
|
122
|
+
}
|
|
123
|
+
export interface ParsedSkillsCommand {
|
|
124
|
+
command: 'skills';
|
|
125
|
+
}
|
|
88
126
|
export interface ParsedAgentsCommand {
|
|
89
127
|
command: 'agents';
|
|
90
128
|
format: 'text' | 'json';
|
|
@@ -97,6 +135,13 @@ export interface ParsedAgentsCommand {
|
|
|
97
135
|
/** Bearer token override, for a gateway whose token file is not local. */
|
|
98
136
|
token?: string;
|
|
99
137
|
}
|
|
138
|
+
export interface ParsedSchedulesCommand {
|
|
139
|
+
command: 'schedules';
|
|
140
|
+
action: 'list' | 'cancel';
|
|
141
|
+
/** cancel only: which schedule. */
|
|
142
|
+
scheduleId?: string;
|
|
143
|
+
format: 'text' | 'json';
|
|
144
|
+
}
|
|
100
145
|
export interface ParsedDoctorCommand {
|
|
101
146
|
command: 'doctor';
|
|
102
147
|
format: 'text' | 'json';
|
|
@@ -141,8 +186,8 @@ export interface ParsedServeCommand {
|
|
|
141
186
|
export interface ParsedHelpCommand {
|
|
142
187
|
command: 'help';
|
|
143
188
|
}
|
|
144
|
-
export type ParsedCommand = ParsedRunCommand | ParsedChatCommand | ParsedDashboardCommand | ParsedSetupCommand | ParsedAgentNewCommand | ParsedAgentsCommand | ParsedDoctorCommand | ParsedLogsCommand | ParsedServiceCommand | ParsedServeCommand | ParsedHelpCommand;
|
|
145
|
-
export declare const CLI_VERSION = "0.
|
|
189
|
+
export type ParsedCommand = ParsedRunCommand | ParsedChatCommand | ParsedDashboardCommand | ParsedSetupCommand | ParsedAgentNewCommand | ParsedAgentsCommand | ParsedSkillAddCommand | ParsedSkillsCommand | ParsedSchedulesCommand | ParsedDoctorCommand | ParsedLogsCommand | ParsedServiceCommand | ParsedServeCommand | ParsedHelpCommand;
|
|
190
|
+
export declare const CLI_VERSION = "0.7.0";
|
|
146
191
|
/**
|
|
147
192
|
* The range every package declares in its `engines` field. Two floors, not
|
|
148
193
|
* one: `node:sqlite` was unflagged in 22.13.0 on the LTS line and in 23.4.0
|
|
@@ -164,10 +209,24 @@ export declare const SUPPORTED_NODE_RANGE = ">=22.13 <23 || >=23.4";
|
|
|
164
209
|
* string is a bad reason to refuse to run.
|
|
165
210
|
*/
|
|
166
211
|
export declare const unsupportedNodeMessage: (version: string) => string | undefined;
|
|
167
|
-
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 agents --gateway http://127.0.0.1:4123\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. With @stratusagent/control-api\n installed it also serves the HTTP + WebSocket control API\n on 127.0.0.1:4123 (--no-api, --api-host, --api-port, or\n the config file's \"api\" block)\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 --gateway <url> asks a running daemon instead of resolving\n locally, authenticating with ~/.stratus/gateway-token\n (override with --token or STRATUS_GATEWAY_TOKEN)\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 Open the web dashboard: finds a running daemon (or starts one),\n mints a single-use sign-in link, and opens your browser at it.\n Needs @stratusagent/control-api and @stratusagent/dashboard\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 for a daemon it starts (default: 4123)\n --host dashboard: host for a daemon it starts (default: 127.0.0.1)\n --no-open Do not open the browser automatically\n --gateway agents: read the roster from a running daemon's control API\n --token Bearer token for --gateway (default: ~/.stratus/gateway-token)\n --no-api serve: do not serve the control API\n --api-host serve: control API interface (default: 127.0.0.1)\n --api-port serve: control API port (default: 4123, 0 for any free port)\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
|
|
212
|
+
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 agents --gateway http://127.0.0.1:4123\n stratus skill add stratuslabs/skill-code-review\n stratus skill add ./my-skills --skill code-review --agent ava\n stratus skills\n stratus schedules\n stratus schedules cancel <id>\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). Save & finish offers to install any optional\n package your answers imply (the Slack channel, the control\n API and dashboard) before it starts the daemon\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. With @stratusagent/control-api\n installed it also serves the HTTP + WebSocket control API\n on 127.0.0.1:4123 (--no-api, --api-host, --api-port, or\n the config file's \"api\" block)\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 skill add Install skills from a GitHub repo (owner/repo or URL) or a\n local path into ~/.stratus/skills \u2014 whole directories, one\n per skill; works with skills published for other agents\n (skills.sh-style repos). Installed is not enabled: a soul\n opts in via skills:, or pass --agent <id> to enable now.\n --skill <id> picks from a multi-skill repo (repeatable),\n --force replaces an already-installed id\n skills List installed skills and which agents enable each\n (also: stratus skill list)\n schedules List every schedule the fleet has set \u2014 cadence, prompt,\n pre-authorized destination, next firing \u2014 straight from the\n daemon's database (--format json). \"stratus schedules\n cancel <id>\" stops the next firing and revokes the\n destination that was approved with it\n (also: stratus schedule list / schedule cancel <id>)\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 --gateway <url> asks a running daemon instead of resolving\n locally, authenticating with ~/.stratus/gateway-token\n (override with --token or STRATUS_GATEWAY_TOKEN)\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 Open the web dashboard: finds a running daemon (or starts one),\n mints a single-use sign-in link, and opens your browser at it.\n Needs @stratusagent/control-api and @stratusagent/dashboard\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 for a daemon it starts (default: 4123)\n --host dashboard: host for a daemon it starts (default: 127.0.0.1)\n --no-open Do not open the browser automatically\n --gateway agents: read the roster from a running daemon's control API\n --token Bearer token for --gateway (default: ~/.stratus/gateway-token)\n --no-api serve: do not serve the control API\n --api-host serve: control API interface (default: 127.0.0.1)\n --api-port serve: control API port (default: 4123, 0 for any free port)\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\nPlugins (tools):\n Capability is optional: install a package, then list it under \"plugins\" in a\n TRUSTED config (--config, STRATUS_CONFIG, or ~/.stratus/config.json), keyed by\n package name. A plugin runs inside this process, so an auto-discovered\n project-local stratus.config.json may not enable one.\n\n \"plugins\": {\n \"@stratusagent/tool-fs\": { \"enabled\": true, \"roots\": [\"~/notes\"],\n \"agents\": { \"ava\": { \"roots\": [\"~/work/ava\"] } } },\n \"@stratusagent/tool-web\": { \"enabled\": true }\n }\n\n Available: @stratusagent/tool-fs (fs.read/list/search/write),\n @stratusagent/tool-shell (shell.run), @stratusagent/tool-web (web.fetch),\n @stratusagent/tool-browser (browser.goto/read/screenshot/act).\n Installing one grants no agent anything \u2014 each soul lists what it may call.\n\nSoul files:\n A soul file is markdown with frontmatter (name, provider, model, tools, skills, credentials)\n followed by the agent's persona in prose. See examples/souls/ava.md.\n \"tools\" takes exact names or a whole toolset: tools: [fs.read, fs.search] or\n tools: [fs.*]. Omitted means every registered tool.\n \"skills\" is the same allowlist shape over installed skills (see stratus\n skills), except omitted means none \u2014 a skill is enabled per agent, never\n by being installed.\n";
|
|
168
213
|
declare const stringifyValue: (value: JsonValue) => string;
|
|
169
214
|
export declare const parseCommand: (argv: string[], env?: CliEnvironment) => ParsedCommand;
|
|
170
215
|
export declare const formatEvent: (event: StratusEvent) => string | null;
|
|
216
|
+
/**
|
|
217
|
+
* The fields worth keeping per event type. Tool inputs and message text
|
|
218
|
+
* are deliberately excluded: the log is a trace of what happened, not a
|
|
219
|
+
* second copy of the transcript.
|
|
220
|
+
*
|
|
221
|
+
* The approval pair is the one place the trace carries a person's id, and
|
|
222
|
+
* it earns it: `always` widens what an agent may do unattended for the rest
|
|
223
|
+
* of the session, and "who decided that" is unanswerable afterwards from
|
|
224
|
+
* anything else. The refusal path is warned about by `onDecision`, but an
|
|
225
|
+
* *approval* produces no warning at all — without these two records a
|
|
226
|
+
* granted permission leaves no trace whatsoever. Still no tool input: what
|
|
227
|
+
* was asked is here, what it was asked with is not.
|
|
228
|
+
*/
|
|
229
|
+
export declare const eventDetail: (event: StratusEvent) => Record<string, unknown> | undefined;
|
|
171
230
|
/**
|
|
172
231
|
* Kept with its historical CLI signature: a parsed run command is a
|
|
173
232
|
* RuntimeSelection plus CLI-only fields the resolver ignores.
|
|
@@ -247,6 +306,16 @@ export declare const runLogs: (command: ParsedLogsCommand, streams: CliStreams,
|
|
|
247
306
|
* foreground process; this only tells the platform how to keep it up.
|
|
248
307
|
*/
|
|
249
308
|
export declare const runService: (command: ParsedServiceCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
|
|
309
|
+
export declare const runSkillAdd: (command: ParsedSkillAddCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
|
|
310
|
+
/**
|
|
311
|
+
* List and cancel what the fleet has scheduled — against the daemon's own
|
|
312
|
+
* database, the way `stratus logs` reads the daemon's own log. WAL makes a
|
|
313
|
+
* second process on the file routine; a running daemon re-reads due rows
|
|
314
|
+
* every tick and the destination grant on every send, so a cancel from
|
|
315
|
+
* here takes effect without asking it anything.
|
|
316
|
+
*/
|
|
317
|
+
export declare const runSchedules: (command: ParsedSchedulesCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
|
|
318
|
+
export declare const runSkills: (streams: CliStreams, env?: CliEnvironment) => Promise<number>;
|
|
250
319
|
export declare const runAgentNew: (command: ParsedAgentNewCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
|
|
251
320
|
/**
|
|
252
321
|
* `stratus dashboard` — open the web UI against a running daemon, starting
|
|
@@ -258,6 +327,8 @@ export declare const runAgentNew: (command: ParsedAgentNewCommand, streams: CliS
|
|
|
258
327
|
* the first time either side gained a rule.
|
|
259
328
|
*/
|
|
260
329
|
export declare const runDashboard: (command: ParsedDashboardCommand, streams: CliStreams, env?: CliEnvironment) => Promise<number>;
|
|
330
|
+
/** Reports whether an optional package is installed. */
|
|
331
|
+
export type PackageResolver = (specifier: string) => boolean;
|
|
261
332
|
/**
|
|
262
333
|
* `stratus serve` — run the gateway (stratusd) in the foreground: load the
|
|
263
334
|
* roster, accept dispatches, print events, and drain cleanly on SIGTERM,
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|