@stratusagent/agents 0.12.0 → 0.12.2
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/package.json +2 -2
- package/skills/stratus/SKILL.md +5 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stratusagent/agents",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"node": ">=22.13 <23 || >=23.4"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@stratusagent/core": "0.12.
|
|
21
|
+
"@stratusagent/core": "0.12.2"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/node": "^24.6.0",
|
package/skills/stratus/SKILL.md
CHANGED
|
@@ -58,7 +58,7 @@ A project-local `stratus.config.json` ships inside repositories, so it is **untr
|
|
|
58
58
|
|
|
59
59
|
When a setting "isn't taking", these say why:
|
|
60
60
|
|
|
61
|
-
- `stratus doctor` shows what `stratus run` and `stratus chat` would use, and which file or variable decided each value.
|
|
61
|
+
- `stratus doctor` shows what `stratus run` and `stratus chat` would use, and which file or variable decided each value. When a daemon is running it also asks it what it warned about at start, and says when the config has changed since then (a restart applies it).
|
|
62
62
|
- `stratus agents` shows what each agent on the roster runs on.
|
|
63
63
|
- `stratus plugins` shows what the config's approvals mode does with each tool. `stratus serve --approvals` overrides that mode. A daemon in `remote` logs an `approvals: remote` line at startup, so a `stratus logs` with no such line since the last start means `headless`.
|
|
64
64
|
|
|
@@ -114,12 +114,12 @@ When a stored key "isn't found", check in this order:
|
|
|
114
114
|
- `stratus setup` → Plugins installs, enables, and asks for settings like roots in one step.
|
|
115
115
|
- Enabled is not granted: your soul's `tools:` must also cover a plugin's tools. `stratus plugins` walks the whole chain for each tool (installed, enabled, granted to which agents, and what approvals do with a call), so it answers "why can't you use X" in one command.
|
|
116
116
|
- **Risk.** Every tool is `safe`, `gated`, or `dangerous`. The daemon runs `safe` tools unattended, among them `memory.*`, `skill.read`, `credential.request`, `agent.delegate`, `schedule.list`, `schedule.cancel`, and `fs.read`, `fs.list`, and `fs.search`. Gated tools include:
|
|
117
|
-
- `web.fetch`, `fs.write`, `shell.run`, `browser.*`, and `mcp.*`;
|
|
117
|
+
- `web.fetch`, `fs.write`, `fs.move`, `shell.run`, `browser.*`, and `mcp.*`;
|
|
118
118
|
- `schedule.every`, `schedule.at`, `message.send`, and `message.read` (which reads a channel your Slack app is in, never a DM, and labels what it returns `external`);
|
|
119
119
|
- every third-party tool, `web.search` included.
|
|
120
120
|
- What happens to a gated call depends on the approvals mode. Under `headless` (the default) it is refused. Under `remote` the people in `approvals.slackApprovers` are asked in Slack (or through the control API's `/approvals`) with **Allow once**, **Always allow**, and **Deny**. Under `remote` with nobody to ask, it is refused too.
|
|
121
|
-
- Either way, what was already approved still runs unattended. For `shell.run` that is a command scope plus a built-in safe list
|
|
122
|
-
- The exception is `approvals.externalContent: "gate"`, set for every agent or per agent under `approvals.agents.<id>`. Once your conversation has read external content (`web.fetch`, `browser.*`, `web.search`, or an `mcp.*` tool), no grant applies for the rest of it: every gated call is asked or, headless, refused, and **Always allow** is not offered. `safe` tools, the built-in
|
|
121
|
+
- Either way, what was already approved still runs unattended. For `shell.run` that is a command scope plus a short built-in safe list (`pwd`, `whoami`, and `uname`; not `ls`, and no `git` command, not even `git status`, since git runs programs a repository names), plus `grep`, `head`, `tail`, `wc`, `sort`, and `uniq` as filters that are never handed a path. **Always allow** on a git command keeps that scope. A pipeline runs unattended when every stage would on its own (with a `git log` scope approved, `git log | grep fix | head -n 20`); `||`, `;`, `&`, redirection, and `$( )` still mean asking. For `browser.act` and `web.fetch` it is an approved site (a `web.fetch` redirect to another site is reported as `redirectedTo`, not followed), and for other gated tools a standing grant.
|
|
122
|
+
- The exception is `approvals.externalContent: "gate"`, set for every agent or per agent under `approvals.agents.<id>`. Once your conversation has read external content (`web.fetch`, `browser.*`, `web.search`, or an `mcp.*` tool), no grant applies for the rest of it: every gated call is asked or, headless, refused, and **Always allow** is not offered. `safe` tools, the built-in safe list (`pwd`, `whoami`, `uname`, and the stdin filters), and a schedule's pre-authorized destination still run. Your next conversation starts with its grants again.
|
|
123
123
|
- **Always allow** writes one of those to `agents/<id>/whitelist.json`, except for a tool that names a destination, such as `message.send`, where it lasts for the conversation. A `dangerous` call is never offered it.
|
|
124
124
|
- `stratus grants <id>` lists the grants, and `stratus grants revoke <id> --tool|--scope|--origin` takes one back. There is no command to add one: a headless daemon asks nobody, so it never creates a grant, and a call nobody has approved yet needs `remote` mode first.
|
|
125
125
|
|
|
@@ -142,7 +142,7 @@ When a stored key "isn't found", check in this order:
|
|
|
142
142
|
- With several agents in one thread, an untagged reply goes to whoever spoke last. Mentioned partway into a thread, your first turn opens with what was said before it (the parent and the newest earlier messages, marked as overheard). Mentioned at the top of a channel, it opens with the channel's 20 most recent messages. Both need the Slack app's history scopes. Without them you hear the thread from the mention onward only. A stranger or another bot among those earlier messages lowers the conversation's trust as if they had spoken to you.
|
|
143
143
|
- **Answering only when mentioned**, never to thread replies, has three causes, and they are worth checking in this order:
|
|
144
144
|
1. `listens: mentions` in your soul.
|
|
145
|
-
2. Another agent spoke last in that thread.
|
|
145
|
+
2. Another agent spoke last in that thread. That includes an agent on another daemon or machine, and any other app's bot that posted there.
|
|
146
146
|
3. The app is missing the history scopes (`channels:history`, `groups:history`, `mpim:history`) and their `message.*` events, which means adding them and reinstalling the app.
|
|
147
147
|
|
|
148
148
|
Not answering at all also happens when the daemon is down, the app was removed from the channel, or `admit: "principals"` turned the person away.
|