relmio 0.4.0 → 0.5.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/CHANGELOG.md CHANGED
@@ -7,6 +7,52 @@ checks the registry separately after publication.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## [0.5.0] - 2026-08-15
11
+
12
+ ### Added
13
+
14
+ - Add a **Rotate client credential** action for installed local endpoints that
15
+ shows the replacement capability before activation and preserves the upstream
16
+ Platform key or Codex credential/workspace volumes.
17
+
18
+ ### Changed
19
+
20
+ - Keep System, Light, and Dark appearance controls plus Ko-fi, GitHub stars, and
21
+ the current package version available throughout the local install wizard.
22
+
23
+ ### Fixed
24
+
25
+ - Install operating-system CA certificates in the isolated Codex image so the
26
+ official ChatGPT device-code sign-in can establish its trusted TLS connection.
27
+ - Wrap local safety and error notifications instead of clipping longer text.
28
+
29
+ ### Security
30
+
31
+ - Verify the generated Codex capability with a strict authenticated WebSocket
32
+ upgrade before reporting installation or rotation success.
33
+ - Serialize installation, sign-in, restart, and credential rotation across
34
+ Relmio processes, with attested stale-lock recovery and fail-closed rollback
35
+ that restores the prior verifier and re-attests endpoint readiness.
36
+
37
+ ## [0.4.1] - 2026-08-14
38
+
39
+ ### Changed
40
+
41
+ - Add a manual **Stop sign-in** action while a fresh ChatGPT login is pending,
42
+ then detect and reject results from superseded wizard attempts.
43
+
44
+ ### Fixed
45
+
46
+ - Terminate the OAuth helper process tree when sign-in is stopped or Relmio
47
+ exits, preventing a rejected or abandoned attempt from continuing to hold
48
+ the `localhost:1455` callback port.
49
+
50
+ ### Security
51
+
52
+ - Fail closed when OAuth process cleanup or credential promotion cannot be
53
+ confirmed, blocking another login until Relmio restarts instead of risking
54
+ an ambiguous helper or credential state.
55
+
10
56
  ## [0.4.0] - 2026-08-13
11
57
 
12
58
  ### Added
package/README.md CHANGED
@@ -78,6 +78,11 @@ the private VPS/n8n sidecar and the separate local Docker endpoint paths.
78
78
  > OAuth extension captures that callback, temporarily disable it during local sign-in,
79
79
  > complete the wizard sign-in, and then re-enable it.
80
80
 
81
+ While a fresh local login is pending, **Stop sign-in** terminates the helper
82
+ Relmio started before allowing another attempt. Results from older tabs are
83
+ rejected after a replacement starts. If cleanup cannot be confirmed, retry
84
+ remains disabled; close the wizard and OAuth helper, then restart Relmio.
85
+
81
86
  <figure>
82
87
  <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/examples/hosted-chat-connected.png" alt="Relmio hosted chat showing a connected ChatGPT session and a ready prompt field" width="720">
83
88
  <figcaption>Successful hosted-chat state: the browser extension completed the OAuth handoff and Relmio shows the ChatGPT session as connected.</figcaption>
@@ -96,7 +101,8 @@ On desktop, the local wizard keeps progress and sidecar-only safety notes in a
96
101
  persistent rail beside the active task; its compact fixed-screen shell avoids
97
102
  document scrolling on common laptop screens. On narrow phones, it switches to
98
103
  a horizontal progress strip and keeps task scrolling inside the active panel.
99
- The hosted site keeps the live GitHub star/version control visible.
104
+ Both the hosted site and local wizard keep Ko-fi support, GitHub stars, and the
105
+ current Relmio version visible beside the appearance control.
100
106
 
101
107
  ## Local Docker endpoints
102
108
 
@@ -117,7 +123,15 @@ The OpenAI-compatible `/v1` endpoint is powered only by a Platform API key,
117
123
  which the wizard seeds over stdin into a private, labeled Docker volume; it
118
124
  does not create a host key file. Your app uses a
119
125
  separate Relmio capability that the wizard displays once.
120
- The bearer remains valid until it is rotated. Browser requests
126
+ The bearer remains valid until it is rotated. After installation, use
127
+ **Rotate client credential** on the Ready screen to replace only that local
128
+ capability. Relmio shows the new one-time credential before activation, verifies
129
+ the replacement endpoint, and preserves the upstream Platform API key or Codex
130
+ credential/workspace volumes. If replacement cannot be verified, Relmio attempts
131
+ to restore the previous verifier and re-attest service readiness. It does not
132
+ retain the previous raw client credential to replay it during rollback. If
133
+ rollback cannot be confirmed, it targets only the exact managed service for
134
+ shutdown and reports whether that stopped state could be verified. Browser requests
121
135
  must come from an exact origin entered during setup; wildcards are not allowed,
122
136
  and the capability must never be embedded in a public frontend bundle. Platform
123
137
  requests use that API project's billing, credits, limits, and permissions, not
@@ -77,19 +77,28 @@ Engine.
77
77
 
78
78
  ## Safe updates and credential rotation
79
79
 
80
- Rerun the browser wizard, select the same target and port, and review the plan
81
- again. Relmio verifies the existing marker and Docker resource ownership,
82
- reuses that installation's unique Compose identity, replaces only that managed
83
- service, and generates a new local client capability. Copy the new capability
84
- from the one-time result and update the client; the previous capability no
85
- longer authenticates.
86
-
87
- For `openai-api`, every update requires the current Platform API key again. To
88
- rotate both credentials, supply the replacement Platform key during the update;
89
- Relmio atomically reseeds its private named volume and independently rotates the
90
- local client capability. For `codex-chatgpt`, an update retains the private
91
- Codex home and workspace volumes unless you explicitly delete them, but still
92
- rotates the local capability.
80
+ To replace only the credential used by your local client, select **Rotate client
81
+ credential** on the installed endpoint's Ready screen. Relmio first stages and
82
+ shows the new one-time capability while the previous capability remains active.
83
+ It then updates and validates the managed Compose configuration, recreates only
84
+ the attested service, and verifies the new bearer against `/v1/models` or the
85
+ authenticated Codex WebSocket handshake before reporting success.
86
+
87
+ This client-only rotation preserves the upstream Platform API key in its private
88
+ named volume and preserves the Codex home and workspace volumes. If activation
89
+ or verification fails, Relmio restores the previous verifier and re-attests its
90
+ health and loopback publication. Relmio does not retain the previous raw client
91
+ credential, so rollback does not replay an authenticated request with it. If
92
+ that rollback cannot be confirmed, Relmio attempts to stop only the exact
93
+ managed service and reports whether the stopped state could be verified.
94
+
95
+ Rerun the browser wizard with the same target and port when you need a complete
96
+ managed update. Relmio verifies the marker and Docker resource ownership and
97
+ reuses the installation's unique Compose identity. For `openai-api`, provide the
98
+ current or replacement Platform API key during that full update; Relmio reseeds
99
+ its private named volume independently from the local client capability. A full
100
+ `codex-chatgpt` update retains the private Codex home and workspace volumes unless
101
+ you explicitly delete them.
93
102
 
94
103
  Do not hand-edit the marker, Compose file, credential volume, or verifier. If
95
104
  the marker or resource labels do not attest as one Relmio installation, the
@@ -146,7 +146,7 @@ bypassed.
146
146
  | `ChatGPT sign-in did not finish` appears immediately when refreshing an existing credential | Wizard versions through `0.1.3` attempted to reuse `~/.codex/auth.json`, but the bridge CLI requires an interactive terminal before replacing that file. | Update to `0.1.4` or newer. The wizard signs in through its own new credential file and leaves the Codex app credential untouched. |
147
147
  | The wizard keeps showing `Waiting for browser sign-in` after approval | Older versions waited for the OAuth helper process to close even after its credential file was ready. | Update to `0.1.5` or newer. Confirm the new **Credential updated** time appears before continuing. |
148
148
  | **Credential updated** still shows the old time | The callback reached an old/expired tab, was intercepted, or a different wizard session is open. | Close every old OAuth and wizard tab. Keep one current wizard open, select **Refresh ChatGPT sign-in**, and complete only the newly opened page. |
149
- | The fresh login cannot bind `localhost:1455` or reports the address is in use | Another OAuth helper or extension process already owns the local callback port. | Close other OAuth login tools and stale wizard processes, then retry. On macOS/Linux, inspect without killing anything using `lsof -nP -iTCP:1455 -sTCP:LISTEN`. |
149
+ | The fresh login cannot bind `localhost:1455` or reports the address is in use | Another OAuth helper or extension process already owns the local callback port. | In the active wizard, use **Stop sign-in** before starting another attempt. If retry remains disabled because cleanup could not be confirmed, close the wizard and OAuth helper, confirm the port is free, and restart Relmio. On macOS/Linux, inspect without killing anything using `lsof -nP -iTCP:1455 -sTCP:LISTEN`. |
150
150
  | `SSH connection failed. Check the address, password, firewall, and confirmed fingerprint.` | The TCP connection, password authentication, or confirmed host identity did not succeed. | Copy the full address and port from the provider, confirm root password login is enabled, check the provider firewall, rescan and compare the fingerprint, then test `ssh -p 22 root@YOUR_VPS_IP` from the same computer. |
151
151
  | The VPS accepts only an SSH key or passkey | The current wizard supports live password authentication, not SSH keys. | Use the manual installation path or a provider-approved password-authenticated administrator account. Do not weaken SSH security or upload a private key into the wizard. |
152
152
  | The SSH fingerprint changed | The server was rebuilt, its host keys changed, or the connection may be reaching a different host. | Stop. Verify the address and the new fingerprint through the VPS provider console before confirming it. Never bypass the comparison. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relmio",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Install private local OpenAI API and Codex endpoints with explicit provider credential boundaries, plus the existing isolated n8n sidecar.",
5
5
  "keywords": [
6
6
  "relmio",
@@ -359,7 +359,10 @@ tool_suggest = false
359
359
  export function createCodexDockerfile() {
360
360
  return `FROM node:22-bookworm-slim
361
361
 
362
- RUN npm install --global --ignore-scripts @openai/codex@${CODEX_CLI_VERSION} \\
362
+ RUN apt-get update \\
363
+ && apt-get install --no-install-recommends -y ca-certificates \\
364
+ && rm -rf /var/lib/apt/lists/* \\
365
+ && npm install --global --ignore-scripts @openai/codex@${CODEX_CLI_VERSION} \\
363
366
  && npm cache clean --force \\
364
367
  && mkdir -p /etc/codex /home/node/.codex /workspace \\
365
368
  && chown -R node:node /home/node/.codex /workspace