@formthefog/stratus 2026.2.19 → 2026.2.24

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.
@@ -0,0 +1,28 @@
1
+ name: Publish to npm
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ environment: npm-publish
12
+ permissions:
13
+ contents: read
14
+ id-token: write
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - uses: actions/setup-node@v4
20
+ with:
21
+ node-version: '20'
22
+ registry-url: 'https://registry.npmjs.org'
23
+
24
+ - run: npm install -g npm@latest
25
+
26
+ - run: npm ci
27
+
28
+ - run: npm publish --provenance --access public
package/README.md CHANGED
@@ -16,6 +16,8 @@ Integrate Stratus V3 (X1-AC), a state-of-the-art action-conditioned JEPA (Joint-
16
16
  - **Secure**: API key authentication with automatic validation
17
17
  - **Opt-in Tools**: Tools are optional and require explicit allowlisting
18
18
 
19
+ > See [SECURITY.md](./SECURITY.md) for a full accounting of credentials accessed, network calls made, and files written.
20
+
19
21
  ## Support
20
22
 
21
23
  - **Documentation**: [https://stratus.run/docs](https://stratus.run/docs)
@@ -28,6 +30,19 @@ Integrate Stratus V3 (X1-AC), a state-of-the-art action-conditioned JEPA (Joint-
28
30
 
29
31
  > **Note:** This plugin does NOT have an automatic postinstall script. You must run setup manually.
30
32
 
33
+ **Before you begin**, export your Stratus API key. Get one at [stratus.run](https://stratus.run).
34
+
35
+ ```bash
36
+ export STRATUS_API_KEY=stratus_sk_your_key_here
37
+ ```
38
+
39
+ To persist it across sessions, add it to your shell config:
40
+
41
+ ```bash
42
+ echo 'export STRATUS_API_KEY=stratus_sk_your_key_here' >> ~/.zshrc
43
+ source ~/.zshrc
44
+ ```
45
+
31
46
  ```bash
32
47
  # 1. Install the plugin
33
48
  openclaw plugins install @formthefog/stratus
@@ -52,6 +67,54 @@ openclaw plugins install @formthefog/stratus
52
67
 
53
68
  ---
54
69
 
70
+ ## Using the API directly
71
+
72
+ Stratus is drop-in compatible with OpenAI and Anthropic SDKs. Just change the `baseURL` and use your `STRATUS_API_KEY`.
73
+
74
+ **OpenAI SDK (TypeScript)**
75
+ ```typescript
76
+ import OpenAI from 'openai';
77
+
78
+ const client = new OpenAI({
79
+ baseURL: 'https://api.stratus.run/v1',
80
+ apiKey: process.env.STRATUS_API_KEY
81
+ });
82
+
83
+ const response = await client.chat.completions.create({
84
+ model: 'stratus-x1ac-base-claude-sonnet-4-5',
85
+ messages: [{ role: 'user', content: 'Plan a route through 20 cities' }]
86
+ });
87
+ ```
88
+
89
+ **Anthropic SDK (TypeScript)**
90
+ ```typescript
91
+ import Anthropic from '@anthropic-ai/sdk';
92
+
93
+ const client = new Anthropic({
94
+ baseURL: 'https://api.stratus.run/v1',
95
+ apiKey: process.env.STRATUS_API_KEY
96
+ });
97
+
98
+ const response = await client.messages.create({
99
+ model: 'stratus-x1ac-base-claude-sonnet-4-5',
100
+ max_tokens: 1024,
101
+ messages: [{ role: 'user', content: 'Plan a route through 20 cities' }]
102
+ });
103
+ ```
104
+
105
+ **cURL**
106
+ ```bash
107
+ curl https://api.stratus.run/v1/chat/completions \
108
+ -H "Content-Type: application/json" \
109
+ -H "Authorization: Bearer $STRATUS_API_KEY" \
110
+ -d '{
111
+ "model": "stratus-x1ac-base-claude-sonnet-4-5",
112
+ "messages": [{ "role": "user", "content": "Plan a route through 20 cities" }]
113
+ }'
114
+ ```
115
+
116
+ ---
117
+
55
118
  ## Available Commands
56
119
 
57
120
  Use these slash commands in any OpenClaw chat (TUI, Telegram, Discord, etc.):
@@ -154,7 +217,7 @@ Edit `~/.openclaw/openclaw.json`:
154
217
  "stratus": {
155
218
  "enabled": true,
156
219
  "apiKey": "${STRATUS_API_KEY}",
157
- "baseUrl": "https://dev.api.stratus.run",
220
+ "baseUrl": "https://api.stratus.run",
158
221
  "provider": {
159
222
  "enabled": true,
160
223
  "defaultModel": "stratus-x1ac-base-claude-sonnet-4-5"
package/SECURITY.md ADDED
@@ -0,0 +1,74 @@
1
+ # Security Policy
2
+
3
+ ## What This Plugin Does
4
+
5
+ `@formthefog/stratus` is an OpenClaw plugin that integrates the Stratus X1 world model API. This document provides a transparent accounting of all security-relevant behavior.
6
+
7
+ ---
8
+
9
+ ## Credentials
10
+
11
+ **What is accessed:**
12
+ - `STRATUS_API_KEY` — read from environment or OpenClaw config (`plugins.stratus.apiKey`)
13
+
14
+ **What is validated:**
15
+ - Key must be present before any network call is made
16
+ - Key must match the format `stratus_sk_*` — requests with malformed keys are rejected locally, no network call is made
17
+
18
+ **What is written to disk:**
19
+ - During setup, the API key is stored in `~/.openclaw/agents/main/agent/auth-profiles.json`
20
+ - This is the standard OpenClaw credential store, equivalent in scope to `~/.aws/credentials` or `~/.npmrc`
21
+ - A timestamped backup of any existing file is created before writing
22
+ - The key is never logged, printed, or written anywhere else by this plugin
23
+
24
+ **What is never accessed:**
25
+ - `~/.ssh` or any SSH keys or known_hosts — nothing in this plugin reads or touches SSH paths
26
+ - Other environment variables beyond `STRATUS_API_KEY`, `STRATUS_BASE_URL`, and `SHELL`
27
+ - Browser storage, keychains, or system credential managers
28
+
29
+ ---
30
+
31
+ ## Network
32
+
33
+ **Outbound endpoints:**
34
+ | Endpoint | When | What is sent |
35
+ |---|---|---|
36
+ | `https://api.stratus.run/v1/embeddings` | `stratus_embeddings` tool call | `Authorization: Bearer <key>`, text input |
37
+ | `https://api.stratus.run/v1/rollout` | `stratus_rollout` tool call | `Authorization: Bearer <key>`, goal + state |
38
+
39
+ **What is never done:**
40
+ - No calls to any endpoint other than `api.stratus.run`
41
+ - No telemetry, analytics, or usage reporting
42
+ - No data is sent to third parties
43
+ - All connections are HTTPS-only
44
+
45
+ Data handling is governed by the [Stratus privacy policy](https://stratus.run/privacy).
46
+
47
+ ---
48
+
49
+ ## File System
50
+
51
+ **Files read during setup/verify:**
52
+ - `~/.openclaw/openclaw.json` — OpenClaw's own config, to add the Stratus provider entry
53
+ - `~/.openclaw/agents/main/agent/auth-profiles.json` — OpenClaw's own auth store, to add Stratus credentials
54
+ - `~/Library/LaunchAgents/ai.openclaw.gateway.plist` — macOS only, if the user explicitly opts in during `install.sh`
55
+
56
+ **Files written during setup:**
57
+ - Same paths as above, plus timestamped `.backup-*` copies before any modification
58
+ - Optionally appends `export STRATUS_API_KEY=...` to `~/.zshrc` / `~/.bashrc` / `~/.bash_profile` — only when the user explicitly answers `y` at the prompt
59
+
60
+ **What is never touched:**
61
+ - No files outside `~/.openclaw/`, the shell config the user selects, or the LaunchAgent plist
62
+ - No `/etc/`, `/usr/`, `/Library/` (system paths)
63
+ - No other dotfiles or home directory contents
64
+
65
+ ---
66
+
67
+ ## Reporting a Vulnerability
68
+
69
+ If you discover a security issue, please report it privately:
70
+
71
+ - Email: security@stratus.run
72
+ - GitHub: [open a private security advisory](https://github.com/formthefog/openclaw-stratus-x1-plugin/security/advisories/new)
73
+
74
+ Please do not open a public issue for security vulnerabilities. We aim to respond within 72 hours.
@@ -37,7 +37,7 @@ vim ~/.openclaw/agents/main/agent/auth-profiles.json
37
37
  "profiles": [
38
38
  {
39
39
  "provider": "stratus",
40
- "baseUrl": "https://dev.api.stratus.run/v1",
40
+ "baseUrl": "https://api.stratus.run/v1",
41
41
  "apiKey": "stratus_sk_your_actual_key_here"
42
42
  }
43
43
  ]
@@ -53,7 +53,7 @@ openclaw gateway restart
53
53
  4. Verify auth is working with manual curl:
54
54
 
55
55
  ```bash
56
- curl https://dev.api.stratus.run/v1/chat/completions \
56
+ curl https://api.stratus.run/v1/chat/completions \
57
57
  -H "Content-Type: application/json" \
58
58
  -H "Authorization: Bearer stratus_sk_your_actual_key_here" \
59
59
  -d '{
@@ -200,7 +200,7 @@ When Stratus integration isn't working:
200
200
  4. **Test with curl**: Use manual curl command (see above)
201
201
  5. **Check gateway logs**: `openclaw gateway logs`
202
202
  6. **Restart gateway**: `openclaw gateway restart`
203
- 7. **Verify endpoint**: Should be `https://dev.api.stratus.run/v1`
203
+ 7. **Verify endpoint**: Should be `https://api.stratus.run/v1`
204
204
 
205
205
  ---
206
206
 
package/index.ts CHANGED
@@ -7,7 +7,7 @@ import { setupStratus } from "./src/setup.js";
7
7
 
8
8
  const PROVIDER_ID = "stratus";
9
9
  const PROVIDER_LABEL = "Stratus";
10
- const DEFAULT_BASE_URL = "https://dev.api.stratus.run/v1";
10
+ const DEFAULT_BASE_URL = "https://api.stratus.run/v1";
11
11
 
12
12
  function buildModelDefinition(params: {
13
13
  id: string;
package/install.sh CHANGED
@@ -79,7 +79,7 @@ echo " 🔧 Updating OpenClaw configuration..."
79
79
 
80
80
  # Add models.providers.stratus if not present
81
81
  if ! jq -e '.models.providers.stratus' "$OPENCLAW_CONFIG" > /dev/null 2>&1; then
82
- jq --arg baseUrl "https://dev.api.stratus.run/v1" \
82
+ jq --arg baseUrl "https://api.stratus.run/v1" \
83
83
  '.models.providers.stratus = {
84
84
  baseUrl: $baseUrl,
85
85
  api: "openai-completions",
@@ -156,7 +156,7 @@ if [[ -n "$SHELL_CONFIG" ]] && [[ "$EXISTING_KEY" != "$API_KEY" ]]; then
156
156
 
157
157
  # Stratus X1 configuration for OpenClaw
158
158
  export STRATUS_API_KEY=$API_KEY
159
- export STRATUS_BASE_URL=https://dev.api.stratus.run/v1
159
+ export STRATUS_BASE_URL=https://api.stratus.run/v1
160
160
  EOF
161
161
  echo " ✓ Added to $SHELL_CONFIG"
162
162
  echo " 💡 Run: source $SHELL_CONFIG"
@@ -179,8 +179,8 @@ if [[ "$OS" == "Darwin" ]] && [[ -f "$LAUNCHD_PLIST" ]]; then
179
179
  /usr/libexec/PlistBuddy -c "Add :EnvironmentVariables:STRATUS_API_KEY string $API_KEY" "$LAUNCHD_PLIST" 2>/dev/null || \
180
180
  /usr/libexec/PlistBuddy -c "Set :EnvironmentVariables:STRATUS_API_KEY $API_KEY" "$LAUNCHD_PLIST"
181
181
 
182
- /usr/libexec/PlistBuddy -c "Add :EnvironmentVariables:STRATUS_BASE_URL string https://dev.api.stratus.run/v1" "$LAUNCHD_PLIST" 2>/dev/null || \
183
- /usr/libexec/PlistBuddy -c "Set :EnvironmentVariables:STRATUS_BASE_URL https://dev.api.stratus.run/v1" "$LAUNCHD_PLIST"
182
+ /usr/libexec/PlistBuddy -c "Add :EnvironmentVariables:STRATUS_BASE_URL string https://api.stratus.run/v1" "$LAUNCHD_PLIST" 2>/dev/null || \
183
+ /usr/libexec/PlistBuddy -c "Set :EnvironmentVariables:STRATUS_BASE_URL https://api.stratus.run/v1" "$LAUNCHD_PLIST"
184
184
 
185
185
  echo " ✓ Updated LaunchAgent plist"
186
186
  echo " 💡 Restart gateway: openclaw gateway stop && openclaw gateway install"
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "baseUrl": {
20
20
  "type": "string",
21
- "default": "https://dev.api.stratus.run",
21
+ "default": "https://api.stratus.run",
22
22
  "description": "Stratus API base URL"
23
23
  },
24
24
  "provider": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formthefog/stratus",
3
- "version": "2026.2.19",
3
+ "version": "2026.2.24",
4
4
  "description": "Stratus API integration for OpenClaw - action-conditioned JEPA for autonomous agent planning",
5
5
  "keywords": [
6
6
  "agent",
@@ -156,7 +156,7 @@ const response = await openai.chat.completions.create({
156
156
  model: "stratus-x1ac-base-gpt-4o",
157
157
  messages: [...]
158
158
  }, {
159
- baseURL: "https://dev.api.stratus.run/v1"
159
+ baseURL: "https://api.stratus.run/v1"
160
160
  });
161
161
  ```
162
162
 
package/src/client.ts CHANGED
@@ -13,8 +13,8 @@ import type {
13
13
  * - STRATUS_API_KEY: User's Stratus API key (optional, can use config instead)
14
14
  *
15
15
  * Network Endpoints:
16
- * - https://dev.api.stratus.run/v1/embeddings (POST)
17
- * - https://dev.api.stratus.run/v1/rollout (POST)
16
+ * - https://api.stratus.run/v1/embeddings (POST)
17
+ * - https://api.stratus.run/v1/rollout (POST)
18
18
  *
19
19
  * Data Transmitted:
20
20
  * - Authorization header: Bearer token (Stratus API key)
@@ -80,7 +80,7 @@ export class StratusClient {
80
80
 
81
81
  export function createStratusClient(config: StratusPluginConfig | undefined): StratusClient {
82
82
  const apiKey = config?.apiKey || process.env.STRATUS_API_KEY;
83
- const baseUrl = config?.baseUrl || "https://dev.api.stratus.run";
83
+ const baseUrl = config?.baseUrl || "https://api.stratus.run";
84
84
 
85
85
  if (!apiKey) {
86
86
  throw new Error(
package/src/config.ts CHANGED
@@ -10,7 +10,7 @@ export const StratusConfigSchema: OpenClawPluginConfigSchema = {
10
10
 
11
11
  const enabled = typeof raw.enabled === "boolean" ? raw.enabled : true;
12
12
  const apiKey = typeof raw.apiKey === "string" ? raw.apiKey : process.env.STRATUS_API_KEY;
13
- const baseUrl = typeof raw.baseUrl === "string" ? raw.baseUrl : "https://dev.api.stratus.run";
13
+ const baseUrl = typeof raw.baseUrl === "string" ? raw.baseUrl : "https://api.stratus.run";
14
14
 
15
15
  const provider =
16
16
  raw.provider && typeof raw.provider === "object" && !Array.isArray(raw.provider)
@@ -58,7 +58,7 @@ export const StratusConfigSchema: OpenClawPluginConfigSchema = {
58
58
  uiHints: {
59
59
  enabled: { label: "Enabled" },
60
60
  apiKey: { label: "API Key", sensitive: true },
61
- baseUrl: { label: "Base URL", placeholder: "https://dev.api.stratus.run" },
61
+ baseUrl: { label: "Base URL", placeholder: "https://api.stratus.run" },
62
62
  "provider.enabled": { label: "Provider Enabled" },
63
63
  "provider.defaultModel": {
64
64
  label: "Default Model",
package/src/setup.ts CHANGED
@@ -75,7 +75,7 @@ export async function setupStratus(prompter?: any): Promise<SetupResult> {
75
75
  }
76
76
  if (!config.models.providers.stratus) {
77
77
  config.models.providers.stratus = {
78
- baseUrl: "https://dev.api.stratus.run/v1",
78
+ baseUrl: "https://api.stratus.run/v1",
79
79
  api: "openai-completions",
80
80
  models: [
81
81
  {