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.
Files changed (82) hide show
  1. package/README.md +63 -96
  2. package/dist/client/assets/{CSPContext-DeJH85nm.js → CSPContext-6t3O1emU.js} +1 -1
  3. package/dist/client/assets/{DirectionContext-CxhRpXkm.js → DirectionContext-C6goXEY_.js} +1 -1
  4. package/dist/client/assets/_sessionKey-B5Viv43f.js +23 -0
  5. package/dist/client/assets/agents-BmE6QOwl.js +2 -0
  6. package/dist/client/assets/agents-screen-pHUzJxX5.js +1 -0
  7. package/dist/client/assets/bots-BeOkwrXr.js +2 -0
  8. package/dist/client/assets/{bots-screen-Be3cfGgq.js → bots-screen-B79bAYvf.js} +1 -1
  9. package/dist/client/assets/{button-D9Plv7hu.js → button-CK8tKQ-Z.js} +1 -1
  10. package/dist/client/assets/{composite-B2KCZKKL.js → composite-feK0c-xF.js} +1 -1
  11. package/dist/client/assets/{connect-DuJfnyNK.js → connect-02tmQV_v.js} +1 -1
  12. package/dist/client/assets/csharp-COcwbKMJ.js +1 -0
  13. package/dist/client/assets/{dashboard-00GpXm5V.js → dashboard-DQ0zDQKd.js} +1 -1
  14. package/dist/client/assets/event-BsD1rqGT.js +1 -0
  15. package/dist/client/assets/file-explorer-screen-Ds7LeJTd.js +1 -0
  16. package/dist/client/assets/files-e40B1zFy.js +2 -0
  17. package/dist/client/assets/go-CxLEBnE3.js +1 -0
  18. package/dist/client/assets/{index-Yo5UhdZV.js → index-lK3yGoTI.js} +1 -1
  19. package/dist/client/assets/{index-DtGzE-ea.js → index-rljDU_1M.js} +2 -2
  20. package/dist/client/assets/keyboard-shortcuts-dialog-Bb_GOr9L.js +1 -0
  21. package/dist/client/assets/main-Dq6jpr6-.js +210 -0
  22. package/dist/client/assets/{markdown-DtWnt4NA.js → markdown-C7_Aipwd.js} +37 -37
  23. package/dist/client/assets/memory-C7UG-1le.js +2 -0
  24. package/dist/client/assets/memory-screen-CUFBWsq5.js +1 -0
  25. package/dist/client/assets/menu-n6L--M9R.js +1 -0
  26. package/dist/client/assets/{opencami-logo-Bmge6-FB.js → opencami-logo-zuSBm5Br.js} +1 -1
  27. package/dist/client/assets/php-Dhbhpdrm.js +1 -0
  28. package/dist/client/assets/proxy-BU8Bw1Vt.js +9 -0
  29. package/dist/client/assets/{react-DODKNyyU.js → react-BLyCEWpN.js} +1 -1
  30. package/dist/client/assets/ruby-NiQIzKut.js +1 -0
  31. package/dist/client/assets/search-dialog-yB4w5ajo.js +1 -0
  32. package/dist/client/assets/session-export-dialog-qbZgd2Zo.js +1 -0
  33. package/dist/client/assets/settings-dialog-CHJbvpgk.js +1 -0
  34. package/dist/client/assets/skills-DoKPPhNY.js +2 -0
  35. package/dist/client/assets/{skills-panel-DSiH-DLs.js → skills-panel-BH27r3nC.js} +1 -1
  36. package/dist/client/assets/styles-CXV5jZiD.css +1 -0
  37. package/dist/client/assets/{swift-Dg5xB15N.js → swift-D82vCrfD.js} +1 -1
  38. package/dist/client/assets/switch-BD3a0LRm.js +1 -0
  39. package/dist/client/assets/tabs-DI1e-kzz.js +1 -0
  40. package/dist/client/assets/tooltip-BbH3QWvK.js +1 -0
  41. package/dist/client/assets/use-file-explorer-state-DBfLeAyz.js +12 -0
  42. package/dist/client/assets/{useBaseUiId-KQTzRPLp.js → useBaseUiId-MgM4ouhx.js} +1 -1
  43. package/dist/client/assets/{useCompositeItem-BPY2_hF_.js → useCompositeItem-OhltNFdZ.js} +1 -1
  44. package/dist/client/assets/{useControlled-B5pEEz2V.js → useControlled-BQxTgsOd.js} +1 -1
  45. package/dist/client/assets/{useMutation-BsQD6FKe.js → useMutation-12DyB3Ox.js} +1 -1
  46. package/dist/client/assets/useOnFirstRender-7qoaK5sI.js +1 -0
  47. package/dist/client/assets/{useQuery-CmAJuY2W.js → useQuery-Ctiljcrr.js} +1 -1
  48. package/dist/server/assets/{_sessionKey-C9o7YfxA.js → _sessionKey-CH8wIyED.js} +3 -3
  49. package/dist/server/assets/{_tanstack-start-manifest_v-BMCAWon2.js → _tanstack-start-manifest_v-C5HBDfQB.js} +1 -1
  50. package/dist/server/assets/{index-Bw-bA_2M.js → index-NcNCVGTL.js} +2 -1
  51. package/dist/server/assets/{router-DCjikH21.js → router-Brzpnz55.js} +234 -56
  52. package/dist/server/assets/{search-dialog-BnwiXpdA.js → search-dialog-BNhjVvKc.js} +3 -2
  53. package/dist/server/assets/{settings-dialog-ClKFnZ1x.js → settings-dialog-CWcmfDiV.js} +3 -2
  54. package/dist/server/server.js +195 -38
  55. package/package.json +4 -1
  56. package/dist/client/assets/_sessionKey-CQE0brGK.js +0 -23
  57. package/dist/client/assets/agents-CMTFd_sG.js +0 -2
  58. package/dist/client/assets/agents-screen-BNQGEqcW.js +0 -1
  59. package/dist/client/assets/bots-B6oGzCxP.js +0 -2
  60. package/dist/client/assets/csharp-K5feNrxe.js +0 -1
  61. package/dist/client/assets/event-DD8Cz4O9.js +0 -1
  62. package/dist/client/assets/file-explorer-screen-CxwemBES.js +0 -1
  63. package/dist/client/assets/files-DyBJVXBu.js +0 -2
  64. package/dist/client/assets/go-Dn2_MT6a.js +0 -1
  65. package/dist/client/assets/keyboard-shortcuts-dialog-BZwd-iyV.js +0 -1
  66. package/dist/client/assets/main-CgwdHc9W.js +0 -210
  67. package/dist/client/assets/memory-l756yiNq.js +0 -2
  68. package/dist/client/assets/memory-screen-BQtVRuzE.js +0 -1
  69. package/dist/client/assets/menu-BsS6CDf_.js +0 -1
  70. package/dist/client/assets/php-CDn_0X-4.js +0 -1
  71. package/dist/client/assets/popupStateMapping-D0ZbJR_o.js +0 -1
  72. package/dist/client/assets/proxy-CYZeDXoy.js +0 -9
  73. package/dist/client/assets/ruby-FDmvQDUv.js +0 -1
  74. package/dist/client/assets/search-dialog-DW91SK30.js +0 -1
  75. package/dist/client/assets/session-export-dialog-CliO9Ob-.js +0 -1
  76. package/dist/client/assets/settings-dialog-C1u52aju.js +0 -1
  77. package/dist/client/assets/skills-8T_avaVb.js +0 -2
  78. package/dist/client/assets/styles-DvaLh0o1.css +0 -1
  79. package/dist/client/assets/switch-DbgQPO6i.js +0 -1
  80. package/dist/client/assets/tabs-BsAvZnlD.js +0 -1
  81. package/dist/client/assets/tooltip-DLmutB5C.js +0 -1
  82. 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
  [![npm](https://img.shields.io/npm/v/opencami)](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
  ![OpenCami Chat Interface](docs/screenshots/opencami-chat.jpg)
11
9
 
12
- ## Quick Start
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
- This installs OpenCami and prints next-step instructions for required environment variables.
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
- CLI options:
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
- > Note: `--gateway` sets `OPENCLAW_GATEWAY` internally. For predictable deployments, set `CLAWDBOT_GATEWAY_URL` explicitly in environment.
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
- CLAWDBOT_GATEWAY_URL=ws://127.0.0.1:18789
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
- ### Required for remote Tailnet / origin allowlist setups
32
+ Then open: `http://localhost:3000`
67
33
 
68
- ```bash
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
- ### Optional
36
+ This is the safest setup: **Gateway stays on loopback**, you access **OpenCami** via `https://<magicdns>:<port>`.
75
37
 
76
- ```bash
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
- "controlUi": {
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
- ### 2) OpenCami server env (`OPENCAMI_ORIGIN`)
108
-
109
- Set `OPENCAMI_ORIGIN` to the same exact value:
50
+ 2) Restart the gateway:
110
51
 
111
52
  ```bash
112
- OPENCAMI_ORIGIN=https://openclaw-server.tailXXXX.ts.net:3001
53
+ openclaw gateway restart
113
54
  ```
114
55
 
115
- ### 3) Restart gateway
56
+ 3) Start OpenCami with the same origin:
116
57
 
117
58
  ```bash
118
- openclaw gateway restart
59
+ opencami \
60
+ --gateway ws://127.0.0.1:18789 \
61
+ --token <GATEWAY_TOKEN> \
62
+ --origin https://<magicdns>:3001
119
63
  ```
120
64
 
121
- > If you access OpenCami via multiple hostnames/ports, each distinct origin must be listed in `allowedOrigins`.
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
- ## Device auth notes (strict vs fallback)
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
- OpenCami uses strict device-auth-compatible connect params by default.
84
+ You can also set env vars instead of flags:
128
85
 
129
- - **Strict mode (default):** `OPENCAMI_DEVICE_AUTH_FALLBACK` unset/false
130
- - **Fallback mode (compatibility):** set `OPENCAMI_DEVICE_AUTH_FALLBACK=true`
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
- Fallback mode retries connect without device identity metadata if strict handshake fails.
133
- Use fallback only when needed for compatibility, and prefer strict mode long-term.
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.controlUi.allowedOrigins`
156
- 2. Set identical `OPENCAMI_ORIGIN` in OpenCami env
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.read`
122
+ ### Missing scope `operator.admin`
160
123
 
161
- Cause: gateway auth succeeded but token/permissions did not include required operator scope.
124
+ Cause: gateway auth succeeded but the device was paired with insufficient scopes.
162
125
 
163
- Fix:
164
- - Use a token/password with operator access
165
- - Verify gateway auth/scopes in OpenClaw
166
- - Reconnect after updating credentials
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 auth connect issues
133
+ ### Pairing required / device pending approval
169
134
 
170
- If strict connect fails in your deployment:
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
- OPENCAMI_DEVICE_AUTH_FALLBACK=true
139
+ openclaw devices list # find the pending device
140
+ openclaw devices approve <deviceId>
174
141
  ```
175
142
 
176
- Then restart OpenCami and retry. Keep this as a compatibility fallback, not the default.
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-CgwdHc9W.js";const e=t.createContext(void 0),o={disableStyleElements:!1};function s(){return t.useContext(e)??o}export{s as u};
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-CgwdHc9W.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};
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};