opencami 1.8.3 → 1.8.5
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 +63 -96
- package/dist/client/assets/{CSPContext-DeJH85nm.js → CSPContext-6t3O1emU.js} +1 -1
- package/dist/client/assets/{DirectionContext-CxhRpXkm.js → DirectionContext-C6goXEY_.js} +1 -1
- package/dist/client/assets/_sessionKey-B5Viv43f.js +23 -0
- package/dist/client/assets/agents-BmE6QOwl.js +2 -0
- package/dist/client/assets/agents-screen-pHUzJxX5.js +1 -0
- package/dist/client/assets/bots-BeOkwrXr.js +2 -0
- package/dist/client/assets/{bots-screen-Be3cfGgq.js → bots-screen-B79bAYvf.js} +1 -1
- package/dist/client/assets/{button-D9Plv7hu.js → button-CK8tKQ-Z.js} +1 -1
- package/dist/client/assets/{composite-B2KCZKKL.js → composite-feK0c-xF.js} +1 -1
- package/dist/client/assets/{connect-DuJfnyNK.js → connect-02tmQV_v.js} +1 -1
- package/dist/client/assets/csharp-COcwbKMJ.js +1 -0
- package/dist/client/assets/{dashboard-00GpXm5V.js → dashboard-DQ0zDQKd.js} +1 -1
- package/dist/client/assets/event-BsD1rqGT.js +1 -0
- package/dist/client/assets/file-explorer-screen-Ds7LeJTd.js +1 -0
- package/dist/client/assets/files-e40B1zFy.js +2 -0
- package/dist/client/assets/go-CxLEBnE3.js +1 -0
- package/dist/client/assets/{index-Yo5UhdZV.js → index-lK3yGoTI.js} +1 -1
- package/dist/client/assets/{index-DtGzE-ea.js → index-rljDU_1M.js} +2 -2
- package/dist/client/assets/keyboard-shortcuts-dialog-Bb_GOr9L.js +1 -0
- package/dist/client/assets/main-Dq6jpr6-.js +210 -0
- package/dist/client/assets/{markdown-DtWnt4NA.js → markdown-C7_Aipwd.js} +37 -37
- package/dist/client/assets/memory-C7UG-1le.js +2 -0
- package/dist/client/assets/memory-screen-CUFBWsq5.js +1 -0
- package/dist/client/assets/menu-n6L--M9R.js +1 -0
- package/dist/client/assets/{opencami-logo-Bmge6-FB.js → opencami-logo-zuSBm5Br.js} +1 -1
- package/dist/client/assets/php-Dhbhpdrm.js +1 -0
- package/dist/client/assets/proxy-BU8Bw1Vt.js +9 -0
- package/dist/client/assets/{react-DODKNyyU.js → react-BLyCEWpN.js} +1 -1
- package/dist/client/assets/ruby-NiQIzKut.js +1 -0
- package/dist/client/assets/search-dialog-yB4w5ajo.js +1 -0
- package/dist/client/assets/session-export-dialog-qbZgd2Zo.js +1 -0
- package/dist/client/assets/settings-dialog-CHJbvpgk.js +1 -0
- package/dist/client/assets/skills-DoKPPhNY.js +2 -0
- package/dist/client/assets/{skills-panel-DSiH-DLs.js → skills-panel-BH27r3nC.js} +1 -1
- package/dist/client/assets/styles-CXV5jZiD.css +1 -0
- package/dist/client/assets/{swift-Dg5xB15N.js → swift-D82vCrfD.js} +1 -1
- package/dist/client/assets/switch-BD3a0LRm.js +1 -0
- package/dist/client/assets/tabs-DI1e-kzz.js +1 -0
- package/dist/client/assets/tooltip-BbH3QWvK.js +1 -0
- package/dist/client/assets/use-file-explorer-state-DBfLeAyz.js +12 -0
- package/dist/client/assets/{useBaseUiId-KQTzRPLp.js → useBaseUiId-MgM4ouhx.js} +1 -1
- package/dist/client/assets/{useCompositeItem-BPY2_hF_.js → useCompositeItem-OhltNFdZ.js} +1 -1
- package/dist/client/assets/{useControlled-B5pEEz2V.js → useControlled-BQxTgsOd.js} +1 -1
- package/dist/client/assets/{useMutation-BsQD6FKe.js → useMutation-12DyB3Ox.js} +1 -1
- package/dist/client/assets/useOnFirstRender-7qoaK5sI.js +1 -0
- package/dist/client/assets/{useQuery-CmAJuY2W.js → useQuery-Ctiljcrr.js} +1 -1
- package/dist/server/assets/{_sessionKey-C9o7YfxA.js → _sessionKey-CH8wIyED.js} +3 -3
- package/dist/server/assets/{_tanstack-start-manifest_v-BMCAWon2.js → _tanstack-start-manifest_v-C5HBDfQB.js} +1 -1
- package/dist/server/assets/{index-Bw-bA_2M.js → index-NcNCVGTL.js} +2 -1
- package/dist/server/assets/{router-DCjikH21.js → router-Brzpnz55.js} +234 -56
- package/dist/server/assets/{search-dialog-BnwiXpdA.js → search-dialog-BNhjVvKc.js} +3 -2
- package/dist/server/assets/{settings-dialog-ClKFnZ1x.js → settings-dialog-CWcmfDiV.js} +3 -2
- package/dist/server/server.js +195 -38
- package/package.json +4 -1
- package/dist/client/assets/_sessionKey-CQE0brGK.js +0 -23
- package/dist/client/assets/agents-CMTFd_sG.js +0 -2
- package/dist/client/assets/agents-screen-BNQGEqcW.js +0 -1
- package/dist/client/assets/bots-B6oGzCxP.js +0 -2
- package/dist/client/assets/csharp-K5feNrxe.js +0 -1
- package/dist/client/assets/event-DD8Cz4O9.js +0 -1
- package/dist/client/assets/file-explorer-screen-CxwemBES.js +0 -1
- package/dist/client/assets/files-DyBJVXBu.js +0 -2
- package/dist/client/assets/go-Dn2_MT6a.js +0 -1
- package/dist/client/assets/keyboard-shortcuts-dialog-BZwd-iyV.js +0 -1
- package/dist/client/assets/main-CgwdHc9W.js +0 -210
- package/dist/client/assets/memory-l756yiNq.js +0 -2
- package/dist/client/assets/memory-screen-BQtVRuzE.js +0 -1
- package/dist/client/assets/menu-BsS6CDf_.js +0 -1
- package/dist/client/assets/php-CDn_0X-4.js +0 -1
- package/dist/client/assets/popupStateMapping-D0ZbJR_o.js +0 -1
- package/dist/client/assets/proxy-CYZeDXoy.js +0 -9
- package/dist/client/assets/ruby-FDmvQDUv.js +0 -1
- package/dist/client/assets/search-dialog-DW91SK30.js +0 -1
- package/dist/client/assets/session-export-dialog-CliO9Ob-.js +0 -1
- package/dist/client/assets/settings-dialog-C1u52aju.js +0 -1
- package/dist/client/assets/skills-8T_avaVb.js +0 -2
- package/dist/client/assets/styles-DvaLh0o1.css +0 -1
- package/dist/client/assets/switch-DbgQPO6i.js +0 -1
- package/dist/client/assets/tabs-BsAvZnlD.js +0 -1
- package/dist/client/assets/tooltip-DLmutB5C.js +0 -1
- package/dist/client/assets/use-file-explorer-state-Cg_yDYJl.js +0 -12
package/README.md
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# OpenCami 🦎
|
|
2
2
|
|
|
3
|
-
**Version 1.7.0**
|
|
4
|
-
|
|
5
3
|
A beautiful web client for [OpenClaw](https://github.com/openclaw/openclaw).
|
|
6
4
|
|
|
7
5
|
[](https://www.npmjs.com/package/opencami)
|
|
@@ -9,128 +7,93 @@ A beautiful web client for [OpenClaw](https://github.com/openclaw/openclaw).
|
|
|
9
7
|
|
|
10
8
|

|
|
11
9
|
|
|
12
|
-
##
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
curl -fsSL https://opencami.xyz/install.sh | bash
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Then open `http://localhost:3000` (or your configured host/port).
|
|
10
|
+
## Install
|
|
19
11
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
## Install (curl)
|
|
23
|
-
|
|
24
|
-
The recommended install flow is:
|
|
12
|
+
### Option 1 (recommended)
|
|
25
13
|
|
|
26
14
|
```bash
|
|
27
15
|
curl -fsSL https://opencami.xyz/install.sh | bash
|
|
28
16
|
```
|
|
29
17
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Alternative install:
|
|
18
|
+
### Option 2
|
|
33
19
|
|
|
34
20
|
```bash
|
|
35
21
|
npm install -g opencami
|
|
36
|
-
opencami
|
|
37
22
|
```
|
|
38
23
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
| Flag | Description | Default |
|
|
42
|
-
|------|-------------|---------|
|
|
43
|
-
| `--port` | Port to serve on | `3000` |
|
|
44
|
-
| `--gateway` | OpenClaw gateway URL | `ws://127.0.0.1:18789` |
|
|
45
|
-
| `--host` | Bind address | `localhost` |
|
|
46
|
-
| `--no-open` | Don't open browser | — |
|
|
24
|
+
## Run
|
|
47
25
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## Configuration (OpenCami environment)
|
|
53
|
-
|
|
54
|
-
Set these in your shell, service manager, or container environment.
|
|
55
|
-
|
|
56
|
-
### Required
|
|
26
|
+
### ✅ Recommended (OpenCami runs on the same machine as the OpenClaw Gateway)
|
|
57
27
|
|
|
58
28
|
```bash
|
|
59
|
-
|
|
60
|
-
# pick ONE auth method:
|
|
61
|
-
CLAWDBOT_GATEWAY_TOKEN=...
|
|
62
|
-
# or
|
|
63
|
-
CLAWDBOT_GATEWAY_PASSWORD=...
|
|
29
|
+
opencami --gateway ws://127.0.0.1:18789 --token <GATEWAY_TOKEN>
|
|
64
30
|
```
|
|
65
31
|
|
|
66
|
-
|
|
32
|
+
Then open: `http://localhost:3000`
|
|
67
33
|
|
|
68
|
-
|
|
69
|
-
# Must exactly match the browser origin used to access OpenCami
|
|
70
|
-
# Example: https://openclaw-server.tailXXXX.ts.net:3001
|
|
71
|
-
OPENCAMI_ORIGIN=https://openclaw-server.tailXXXX.ts.net:3001
|
|
72
|
-
```
|
|
34
|
+
### 🌐 Remote access over Tailscale (keep Gateway local)
|
|
73
35
|
|
|
74
|
-
|
|
36
|
+
This is the safest setup: **Gateway stays on loopback**, you access **OpenCami** via `https://<magicdns>:<port>`.
|
|
75
37
|
|
|
76
|
-
|
|
77
|
-
# Enables compatibility fallback if strict device-auth connect fails
|
|
78
|
-
# Default is strict mode (fallback disabled)
|
|
79
|
-
OPENCAMI_DEVICE_AUTH_FALLBACK=true
|
|
80
|
-
|
|
81
|
-
FILES_ROOT=/path/to/workspace
|
|
82
|
-
OPENAI_API_KEY=sk-...
|
|
83
|
-
```
|
|
38
|
+
1) In OpenClaw, allowlist the exact OpenCami URL (**no trailing slash**):
|
|
84
39
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
## Remote Tailnet setup (OpenClaw + OpenCami)
|
|
88
|
-
|
|
89
|
-
If OpenCami loads remotely but you see **"origin not allowed"** or gateway connect failures, configure both sides.
|
|
90
|
-
|
|
91
|
-
### 1) OpenClaw gateway config (`gateway.controlUi.allowedOrigins`)
|
|
92
|
-
|
|
93
|
-
In your OpenClaw config, allow the exact OpenCami browser origin:
|
|
94
|
-
|
|
95
|
-
```json
|
|
40
|
+
```json5
|
|
96
41
|
{
|
|
97
42
|
"gateway": {
|
|
98
|
-
"
|
|
99
|
-
"allowedOrigins": [
|
|
100
|
-
"https://openclaw-server.tailXXXX.ts.net:3001"
|
|
101
|
-
]
|
|
43
|
+
"controlUI": {
|
|
44
|
+
"allowedOrigins": ["https://<magicdns>:3001"]
|
|
102
45
|
}
|
|
103
46
|
}
|
|
104
47
|
}
|
|
105
48
|
```
|
|
106
49
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
Set `OPENCAMI_ORIGIN` to the same exact value:
|
|
50
|
+
2) Restart the gateway:
|
|
110
51
|
|
|
111
52
|
```bash
|
|
112
|
-
|
|
53
|
+
openclaw gateway restart
|
|
113
54
|
```
|
|
114
55
|
|
|
115
|
-
|
|
56
|
+
3) Start OpenCami with the same origin:
|
|
116
57
|
|
|
117
58
|
```bash
|
|
118
|
-
|
|
59
|
+
opencami \
|
|
60
|
+
--gateway ws://127.0.0.1:18789 \
|
|
61
|
+
--token <GATEWAY_TOKEN> \
|
|
62
|
+
--origin https://<magicdns>:3001
|
|
119
63
|
```
|
|
120
64
|
|
|
121
|
-
>
|
|
65
|
+
> ⚠️ Note: `--gateway` must be `ws://` or `wss://` (not `https://`).
|
|
122
66
|
|
|
123
|
-
|
|
67
|
+
## CLI options
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
opencami [--port <n>] [--host <addr>] [--gateway <ws(s)://...>] [--token <token>] [--password <pw>] [--origin <url>] [--no-open]
|
|
124
71
|
|
|
125
|
-
|
|
72
|
+
--port <n> Port to listen on (default: 3000)
|
|
73
|
+
--host <addr> Host to bind to (default: 127.0.0.1)
|
|
74
|
+
--gateway <url> OpenClaw gateway WS URL (default: ws://127.0.0.1:18789)
|
|
75
|
+
--token <token> Gateway token (sets CLAWDBOT_GATEWAY_TOKEN)
|
|
76
|
+
--password <pw> Gateway password (sets CLAWDBOT_GATEWAY_PASSWORD)
|
|
77
|
+
--origin <url> Origin header for backend WS (sets OPENCAMI_ORIGIN)
|
|
78
|
+
--no-open Don't open browser on start
|
|
79
|
+
-h, --help Show help
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Configuration
|
|
126
83
|
|
|
127
|
-
|
|
84
|
+
You can also set env vars instead of flags:
|
|
128
85
|
|
|
129
|
-
|
|
130
|
-
|
|
86
|
+
```bash
|
|
87
|
+
CLAWDBOT_GATEWAY_URL=ws://127.0.0.1:18789
|
|
88
|
+
CLAWDBOT_GATEWAY_TOKEN=...
|
|
89
|
+
OPENCAMI_ORIGIN=https://<magicdns>:3001 # only needed for remote HTTPS
|
|
90
|
+
```
|
|
131
91
|
|
|
132
|
-
|
|
133
|
-
|
|
92
|
+
## Troubleshooting (quick)
|
|
93
|
+
|
|
94
|
+
- **"origin not allowed"** → add the exact URL to `gateway.controlUI.allowedOrigins` *and* pass the same value as `--origin` / `OPENCAMI_ORIGIN` (exact match, no trailing `/`).
|
|
95
|
+
- **Pairing required** → approve the device in OpenClaw (`openclaw devices list/approve`).
|
|
96
|
+
- **Fallback (only if needed):** `OPENCAMI_DEVICE_AUTH_FALLBACK=1`
|
|
134
97
|
|
|
135
98
|
---
|
|
136
99
|
|
|
@@ -152,28 +115,32 @@ Use fallback only when needed for compatibility, and prefer strict mode long-ter
|
|
|
152
115
|
Cause: gateway rejected browser origin.
|
|
153
116
|
|
|
154
117
|
Fix:
|
|
155
|
-
1. Add origin to `gateway.
|
|
156
|
-
2. Set identical `OPENCAMI_ORIGIN` in OpenCami
|
|
118
|
+
1. Add origin to `gateway.controlUI.allowedOrigins` (exact match, no trailing `/`)
|
|
119
|
+
2. Set identical `OPENCAMI_ORIGIN` (or `--origin`) in OpenCami
|
|
157
120
|
3. Restart gateway (`openclaw gateway restart`)
|
|
158
121
|
|
|
159
|
-
### Missing scope `operator.
|
|
122
|
+
### Missing scope `operator.admin`
|
|
160
123
|
|
|
161
|
-
Cause: gateway auth succeeded but
|
|
124
|
+
Cause: gateway auth succeeded but the device was paired with insufficient scopes.
|
|
162
125
|
|
|
163
|
-
Fix:
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
126
|
+
Fix (v1.8.5+): delete the device identity and let OpenCami re-pair automatically:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
rm ~/.opencami/identity/device.json
|
|
130
|
+
# then restart OpenCami — it will re-pair with full scopes
|
|
131
|
+
```
|
|
167
132
|
|
|
168
|
-
### Pairing required / device
|
|
133
|
+
### Pairing required / device pending approval
|
|
169
134
|
|
|
170
|
-
|
|
135
|
+
On first connect, OpenCami registers itself as a device on the gateway. Starting with v1.8.5, this happens automatically with full scopes (`operator.admin`, `operator.approvals`, `operator.pairing`) — no manual config required.
|
|
171
136
|
|
|
137
|
+
If you see a "device pending" error:
|
|
172
138
|
```bash
|
|
173
|
-
|
|
139
|
+
openclaw devices list # find the pending device
|
|
140
|
+
openclaw devices approve <deviceId>
|
|
174
141
|
```
|
|
175
142
|
|
|
176
|
-
|
|
143
|
+
After approval, OpenCami reconnects and stores a `deviceToken` for future sessions (no shared token needed).
|
|
177
144
|
|
|
178
145
|
### Can’t connect to gateway at all
|
|
179
146
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as t}from"./main-
|
|
1
|
+
import{r as t}from"./main-Dq6jpr6-.js";const e=t.createContext(void 0),o={disableStyleElements:!1};function s(){return t.useContext(e)??o}export{s as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l}from"./main-
|
|
1
|
+
import{r as l}from"./main-Dq6jpr6-.js";const E=["top","right","bottom","left"],p=Math.min,h=Math.max,L=Math.round,k=Math.floor,q=t=>({x:t,y:t}),x={left:"right",right:"left",bottom:"top",top:"bottom"},d={start:"end",end:"start"};function R(t,e,n){return h(t,p(e,n))}function T(t,e){return typeof t=="function"?t(e):t}function m(t){return t.split("-")[0]}function g(t){return t.split("-")[1]}function b(t){return t==="x"?"y":"x"}function A(t){return t==="y"?"height":"width"}const P=new Set(["top","bottom"]);function y(t){return P.has(m(t))?"y":"x"}function M(t){return b(y(t))}function v(t,e,n){n===void 0&&(n=!1);const s=g(t),i=M(t),o=A(i);let r=i==="x"?s===(n?"end":"start")?"right":"left":s==="start"?"bottom":"top";return e.reference[o]>e.floating[o]&&(r=a(r)),[r,a(r)]}function z(t){const e=a(t);return[c(t),e,c(e)]}function c(t){return t.replace(/start|end/g,e=>d[e])}const u=["left","right"],f=["right","left"],O=["top","bottom"],S=["bottom","top"];function C(t,e,n){switch(t){case"top":case"bottom":return n?e?f:u:e?u:f;case"left":case"right":return e?O:S;default:return[]}}function B(t,e,n,s){const i=g(t);let o=C(m(t),n==="start",s);return i&&(o=o.map(r=>r+"-"+i),e&&(o=o.concat(o.map(c)))),o}function a(t){return t.replace(/left|right|bottom|top/g,e=>x[e])}function w(t){return{top:0,right:0,bottom:0,left:0,...t}}function F(t){return typeof t!="number"?w(t):{top:t,right:t,bottom:t,left:t}}function G(t){const{x:e,y:n,width:s,height:i}=t;return{width:s,height:i,top:n,left:e,right:e+s,bottom:n+i,x:e,y:n}}const j=l.createContext(void 0);function H(){return l.useContext(j)?.direction??"ltr"}export{y as a,a as b,z as c,B as d,T as e,k as f,m as g,v as h,g as i,h as j,M as k,F as l,p as m,G as n,A as o,R as p,b as q,L as r,E as s,q as t,H as u};
|