relmio 0.8.1 → 0.9.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,33 @@ checks the registry separately after publication.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## [0.9.0] - 2026-08-28
11
+
12
+ ### Added
13
+
14
+ - Add `relmio assistant`, a dedicated local wizard and isolated companion
15
+ Compose plan for n8n AI Assistant's self-hosted sandbox and optional SearXNG
16
+ web search.
17
+
18
+ ### Changed
19
+
20
+ - Add sourced OpenAI policy context to the GitHub README, npm README, and
21
+ canonical security guide, including the maintainer's Codex for Open Source
22
+ acceptance, while preserving the distinction between supported Codex/ChatGPT
23
+ sign-in patterns and unsupported subscription-to-API conversion, resale,
24
+ account sharing, or safeguard bypass.
25
+
26
+ ### Security
27
+
28
+ - Keep the privileged Docker-in-Docker runner separate from the selected n8n
29
+ network, publish no companion host ports, generate and redact independent
30
+ sandbox secrets, attest ownership-bound random Compose identities and network
31
+ aliases, serialize VPS-sidecar and assistant mutations under one single-use
32
+ plan lock, and retain the strict no-n8n-mutation boundary.
33
+ - Pin every generated AI Assistant companion production image to its reviewed
34
+ immutable tag and OCI index digest, with regression coverage that rejects
35
+ floating or digestless references, including the nested sandbox image.
36
+
10
37
  ## [0.8.1] - 2026-08-26
11
38
 
12
39
  ### Changed
@@ -614,6 +641,7 @@ checks the registry separately after publication.
614
641
  - The sidecar uses an internal-only Docker network endpoint and no published
615
642
  VPS port.
616
643
 
644
+ [0.9.0]: https://github.com/Demonbane18/relmio/compare/v0.8.1...v0.9.0
617
645
  [0.1.7]: https://github.com/Demonbane18/relmio/compare/v0.1.6...v0.1.7
618
646
  [0.1.6]: https://github.com/Demonbane18/relmio/compare/v0.1.5...v0.1.6
619
647
  [0.1.5]: https://github.com/Demonbane18/relmio/compare/v0.1.4...v0.1.5
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/brand/relmio-logo.png" alt="Relmio gateway android logo" width="180">
2
+ <img src="https://cdn.jsdelivr.net/npm/relmio@latest/docs/images/brand/relmio-logo-rounded.svg" alt="Relmio gateway android logo" width="180" height="180">
3
3
  </p>
4
4
 
5
5
  # Relmio
@@ -24,16 +24,61 @@ final confirmation before it writes files or deploys a VPS sidecar.
24
24
  | Codex App Server | Experimental JSON-RPC/WebSocket | ChatGPT sign-in and a high-trust local capability |
25
25
  | Codex Chat Adapter | Experimental `POST /chat` (JSON or opt-in SSE) | ChatGPT sign-in and a bearer for trusted local backends |
26
26
  | n8n sidecar | Private Docker-network `/v1` bridge | A local ChatGPT sign-in file, never a host port |
27
+ | n8n AI Assistant companion | Private sandbox; opt-in SearXNG web search | OpenAI Platform API key entered directly in n8n |
27
28
 
28
29
  ChatGPT sign-in does not become an OpenAI Platform API key. Codex transports
29
30
  are not generic `/v1` services and should never be exposed on a LAN or public
30
31
  network.
31
32
 
33
+ ## n8n AI Assistant companion
34
+
35
+ Run `relmio assistant` for the separate sandbox and optional SearXNG companion.
36
+ Web search is off by default and is bound as an exact boolean to the reviewed
37
+ plan and confirmation; Relmio does not add it silently.
38
+ It uses verified SSH, read-only n8n discovery, and an existing Docker network;
39
+ it never reads ChatGPT/Codex OAuth or changes the existing n8n project.
40
+ ChatGPT/Codex subscription sign-in is not an OpenAI Platform API key. AI
41
+ Assistant is Preview, so review generated workflows before use.
42
+
43
+ This self-hosted path has a privileged Docker-in-Docker runner for
44
+ advanced/local testing and publishes no host ports; n8n recommends Daytona for
45
+ production. In n8n, enter your own Platform API key directly and keep your
46
+ current supported model selection, including `openai/gpt-5.6-sol` while n8n
47
+ continues to accept it. A separately deployed, Platform-key-backed Relmio endpoint
48
+ may be used through n8n's optional custom endpoint form; its private Relmio
49
+ client credential is not an OpenAI-issued API key. The OAuth sidecar remains
50
+ experimental/private/policy-uncertain and is never auto-selected.
51
+
32
52
  The experimental Chat Adapter's SSE stream succeeds only after its
33
53
  `terminal: completed` event. Its local tester stays behind the setup-token-
34
54
  protected wizard and uses a short-lived encrypted credential handoff, never a
35
55
  direct browser-to-adapter request.
36
56
 
57
+ ## OpenAI policy evidence and limits
58
+
59
+ Relmio's maintainer was accepted into OpenAI's [Codex for Open Source
60
+ program](https://learn.chatgpt.com/docs/codex-for-oss-terms) for this project
61
+ in August 2026 and received its limited-duration ChatGPT Pro benefit.
62
+ OpenAI's [advanced Codex configuration](https://learn.chatgpt.com/docs/config-file/config-advanced#oss-mode-local-providers)
63
+ documents custom model providers and OSS mode with Ollama or LM Studio.
64
+ OpenAI Codex Lead Thibault “Tibo” Sottiaux has publicly distinguished supported
65
+ **Sign in with ChatGPT** clients from unsupported subscription-to-API
66
+ conversion, resale, or multi-user sharing ([statement](https://x.com/thsottiaux/status/2090675027670978569)),
67
+ and [confirmed Codex can use open-source models](https://x.com/thsottiaux/status/2067399435009622521).
68
+ OpenAI CEO Sam Altman also [announced ChatGPT-account sign-in for
69
+ OpenClaw](https://x.com/sama/status/2050357911915028689).
70
+
71
+ These sources support specific documented patterns; they are not blanket
72
+ approval, protocol certification, a contractual amendment, or legal advice.
73
+ Program acceptance supports the maintainer and open-source work; it does not
74
+ approve every integration. Relmio never presents ChatGPT credentials as a
75
+ generic `/v1` API key, and its n8n AI Assistant path requires a user-owned
76
+ OpenAI Platform API key. Relmio prohibits account pooling or sharing,
77
+ credential forwarding, subscription-to-API conversion or resale, and
78
+ rate-limit or safeguard bypass. The legacy OAuth sidecar remains
79
+ experimental/private/policy-uncertain. Read the full
80
+ [policy evidence and scope](https://relmio.vercel.app/docs/security#policy-evidence-and-scope).
81
+
37
82
  ## ChatGPT sign-in lifetime
38
83
 
39
84
  ChatGPT/Codex sign-in tokens expire, but the official Codex client refreshes
@@ -61,6 +106,7 @@ Full guides use absolute HTTPS links:
61
106
  - https://relmio.vercel.app/docs/getting-started
62
107
  - https://relmio.vercel.app/docs/local-endpoints
63
108
  - https://relmio.vercel.app/docs/vps-and-n8n
109
+ - https://relmio.vercel.app/docs/ai-assistant
64
110
  - https://relmio.vercel.app/docs/troubleshooting#local-image-build-failed
65
111
  - https://relmio.vercel.app/docs/security
66
112
  - https://relmio.vercel.app/docs/reference
@@ -0,0 +1,230 @@
1
+ # n8n AI Assistant companion
2
+
3
+ `relmio assistant` opens a dedicated local wizard for n8n's self-hosted AI
4
+ Assistant sandbox plus an explicit, optional SearXNG web-search service. It is deliberately separate
5
+ from Relmio's existing OAuth sidecar and never reads a ChatGPT/Codex sign-in.
6
+
7
+ > **Preview:** AI Assistant is Preview. Review every generated workflow before
8
+ > activating it, and use n8n's recommended Daytona sandbox for production.
9
+
10
+ ## What the wizard changes
11
+
12
+ After SSH host-key confirmation, read-only n8n discovery, a selected existing
13
+ Docker network, and final confirmation exactly set to true, Relmio may first
14
+ create `/docker/n8n-openai-oauth` and write its shared mode-0600 Relmio root
15
+ marker. It then creates only the `assistant-sandbox` child there. It uses the
16
+ independent Compose project identity recorded in its strict, mode-0600 assistant
17
+ marker and does not write existing n8n project files.
18
+
19
+ The required sandbox companion has three services:
20
+
21
+ - `relmio-sandbox-certs` bootstraps mTLS certificates once.
22
+ - `relmio-sandbox-api` provides the n8n Sandbox Service API.
23
+ - `relmio-sandbox-runner-1` is a privileged Docker-in-Docker runner on a
24
+ dedicated, non-published Compose bridge. Treat it as equivalent to root on
25
+ the host. The bridge retains egress so the runner can pull n8n's sandbox
26
+ image on first use.
27
+ - `relmio-searxng` provides optional JSON web search only when you opt in during
28
+ the reviewed plan. Web search is **off by default**; Relmio never adds it
29
+ silently.
30
+
31
+ Compose assigns the companion's containers short deterministic names derived
32
+ from the first 16 hexadecimal characters of its recorded installation ID, such
33
+ as `relmio-ai-<generated-id>-api`. The full 128-bit ID remains in ownership
34
+ labels and the managed marker. Existing markers remain valid without migration;
35
+ a later separately confirmed companion update may recreate only its own
36
+ containers to adopt these names. It never renames, recreates, restarts, stops,
37
+ or executes inside n8n.
38
+
39
+ The sandbox API joins the selected existing n8n Docker network. When enabled,
40
+ SearXNG joins it with a separately generated collision-resistant,
41
+ Docker-internal alias. The selection and aliases are stored in the strict,
42
+ versioned managed assistant marker and reused for updates. The result view
43
+ always shows the sandbox URL and shows this additional stable URL only when web
44
+ search is enabled:
45
+
46
+ ```text
47
+ http://relmio-ai-sandbox-<generated-id>:8080
48
+ http://relmio-ai-searxng-<generated-id>:8080 (when enabled)
49
+ ```
50
+
51
+ There are no `ports:` mappings, reverse-proxy routes, or changes to the
52
+ existing n8n Compose file, image, container, or workflows. Relmio never stops,
53
+ restarts, recreates, rebuilds, or executes inside n8n.
54
+
55
+ ## Prerequisites Relmio will not change
56
+
57
+ Before making a plan, Relmio read-only inspects the selected n8n container and
58
+ returns only an allowlisted prerequisite status: whether its
59
+ `N8N_ENABLED_MODULES` setting is missing, configured without `instance-ai`, or
60
+ enabled with `instance-ai`. It never returns the container environment or the
61
+ raw setting value. The wizard refuses installation unless `instance-ai` is
62
+ enabled.
63
+
64
+ Apply the prerequisite through the existing n8n deployment workflow. When the
65
+ variable is missing, use this exact form in the existing n8n service:
66
+
67
+ ```text
68
+ N8N_ENABLED_MODULES=instance-ai
69
+ ```
70
+
71
+ When the variable already contains module entries but lacks `instance-ai`, append
72
+ `instance-ai` as a distinct comma-delimited token while preserving existing
73
+ module entries. Do not replace unknown existing values. For example:
74
+
75
+ ```text
76
+ # Existing service configuration
77
+ N8N_ENABLED_MODULES=module-a,module-b
78
+
79
+ # Preserve existing entries and append the required token
80
+ N8N_ENABLED_MODULES=module-a,module-b,instance-ai
81
+ ```
82
+
83
+ Use your existing Hostinger/deployment workflow; Relmio does not claim a
84
+ provider-specific UI path. Apply the change to the existing n8n service, then
85
+ redeploy or restart n8n, verify that n8n is healthy, reconnect to Relmio, and
86
+ run discovery again before reviewing a new plan.
87
+
88
+ Relmio will not edit the existing n8n Compose file, image, or environment;
89
+ restart or recreate n8n; or exec into n8n to make this prerequisite change.
90
+ It reports only the allowlisted status, never the raw environment value. Plan
91
+ for at least **4 GB RAM** and **2 vCPU** for the n8n and companion workload;
92
+ capacity needs can be higher for real workflows.
93
+
94
+ ## Enter the result values in n8n
95
+
96
+ Relmio generates four separate local 256-bit secrets: the sandbox API key,
97
+ runner registration token, runner API key, and SearXNG secret. It uploads the
98
+ secrets only in the managed mode-0600 `.env` file. The registration, runner,
99
+ and SearXNG secrets are never returned or logged. The sandbox API key is shown
100
+ once in the local result view. Even with web search disabled, the private
101
+ SearXNG secret remains in that `.env`: this lets a later reviewed opt-in start
102
+ only the new SearXNG service without overwriting the running sandbox/runner
103
+ credentials. No SearXNG service, settings file, alias probe, URL, or host port
104
+ is created while it is disabled.
105
+
106
+ In n8n's AI Assistant settings, enter:
107
+
108
+ | Dialog | Value |
109
+ | --- | --- |
110
+ | Sandbox Service URL | The stable generated result URL |
111
+ | Sandbox API key | The one-time result value |
112
+ | SearXNG Instance URL | The stable generated result URL, only when web search was enabled |
113
+
114
+ URLs are stable generated result values; only the sandbox API key is
115
+ one-time-displayed. SearXNG has no user-facing key. When enabled, its generated
116
+ settings explicitly enable the JSON response format n8n needs.
117
+
118
+ The `includeSearxng` choice is an exact boolean in the reviewed plan and final
119
+ confirmation request; missing, string, or otherwise ambiguous values are
120
+ rejected. A managed disabled installation can later enable SearXNG only after
121
+ Relmio re-attests the existing sandbox resources and the missing SearXNG
122
+ resource name, then starts only SearXNG. Disabling an already managed SearXNG
123
+ service would stop or remove it, so Relmio rejects that change and requires a
124
+ separately authorized cleanup path instead.
125
+
126
+ ## Immutable companion image pins
127
+
128
+ Every generated production image reference is the reviewed full
129
+ `tag@sha256:<OCI-index-digest>` value. The API/certificate service, privileged
130
+ runner, and nested sandbox are reviewed as one compatible n8n Sandbox Service
131
+ unit; optional SearXNG is pinned independently. Generated Compose never uses
132
+ `latest`, `stable`, a tag-only reference, a digest-only reference, environment
133
+ interpolation, or user input for these images.
134
+
135
+ The upstream review sources are the [n8n Sandbox Service repository](https://github.com/n8n-io/n8n-sandbox-service), its [API](https://github.com/n8n-io/n8n-sandbox-service/pkgs/container/n8n-sandbox-service-api), [runner](https://github.com/n8n-io/n8n-sandbox-service/pkgs/container/n8n-sandbox-service-runner-dind), and [nested sandbox](https://github.com/n8n-io/n8n-sandbox-service/pkgs/container/n8n-sandbox-service-sandbox) GHCR package pages; and the [SearXNG repository](https://github.com/searxng/searxng) and [GHCR package page](https://github.com/searxng/searxng/pkgs/container/searxng). The n8n setup documentation remains authoritative for product configuration.
136
+
137
+ For a managed companion, an image change is never automatic: update Relmio
138
+ locally, reconnect for host-key confirmation and read-only discovery, review the
139
+ exact companion-only plan, preserve the recorded SearXNG choice unless you
140
+ deliberately change it, and provide final confirmation. Then verify that only
141
+ managed companion resources changed, no host ports were published, and n8n is
142
+ healthy. Roll back only with the full previously reviewed immutable pin set
143
+ through that same separately confirmed managed update; never pull a moving tag
144
+ or mutate n8n directly. The maintainer procedure is in
145
+ [maintenance.md](maintenance.md#updating-or-rolling-back-ai-assistant-companion-images).
146
+
147
+ ## Model routes
148
+
149
+ ### Direct OpenAI provider
150
+
151
+ Choose **OpenAI** in n8n and keep the current supported model selection. If your
152
+ n8n instance continues to accept this selection, preserve it:
153
+
154
+ ```text
155
+ openai/gpt-5.6-sol
156
+ ```
157
+
158
+ Enter your own OpenAI Platform API key directly in n8n. Relmio does not request,
159
+ read, transmit, retain, or configure this model credential.
160
+
161
+ An example model shown in n8n documentation is not a migration requirement.
162
+ Change models only if n8n rejects the current selection or you deliberately
163
+ choose another supported model.
164
+
165
+ ChatGPT/Codex subscription sign-in is not an OpenAI Platform API key. Relmio
166
+ does not offer it as a compliant model provider for AI Assistant.
167
+
168
+ ### Optional: custom OpenAI-compatible endpoint
169
+
170
+ n8n's custom/self-hosted OpenAI-compatible dialog defaults to an Ollama-style
171
+ route with **Base URL**, **API key**, and **Model ID** fields. Use it only if you
172
+ already run a separate, n8n-reachable Relmio OpenAI-compatible endpoint backed
173
+ by a user-owned OpenAI Platform API key.
174
+
175
+ - **Base URL:** that endpoint's `/v1` address.
176
+ - **API key:** that endpoint's private Relmio client credential. It is not an
177
+ OpenAI-issued API key.
178
+ - **Model ID:** a model ID exposed by the Platform-key-backed endpoint.
179
+
180
+ The assistant wizard does not deploy a new remote Platform gateway. Relmio's
181
+ existing ChatGPT/Codex OAuth VPS sidecar may be technically compatible, but is
182
+ experimental/private/policy-uncertain. It is not auto-selected, enabled, or
183
+ described as policy-approved for this configuration.
184
+
185
+ ## Platform account guardrails
186
+
187
+ No setup can guarantee an account is never flagged. For the direct OpenAI
188
+ provider route, use a dedicated OpenAI Platform project/key, keep the key in
189
+ n8n's server-side credential storage, and set project rate/spend limits and
190
+ alerts. Enable usage monitoring, grant least user access, plan rotation/revocation,
191
+ require human review for generated workflows, and keep the provider path free of
192
+ public exposure.
193
+
194
+ Relmio cannot inject per-user safety identifiers or moderation into n8n's
195
+ direct provider path. Configure any controls available in your Platform project
196
+ and n8n instance; this companion cannot make claims about provider enforcement.
197
+
198
+ ## Verification and failure behavior
199
+
200
+ Before start, the companion Compose configuration is validated. After start,
201
+ Relmio verifies sandbox API health, the expected running services for the
202
+ selected web-search option, and
203
+ the absence of every host-published port. Immediately before any companion
204
+ write, it reruns the selected container's read-only network and prerequisite
205
+ discovery. The selected network must still exist and the allowlisted
206
+ `instance-ai` status must still be enabled and match the reviewed plan; a
207
+ changed result consumes that plan without installing.
208
+
209
+ For a new companion or a normal managed update, a post-start safety failure
210
+ stops and removes only the companion project. When adding SearXNG to an
211
+ existing managed sandbox, post-start cleanup removes only the optional SearXNG
212
+ service: the existing sandbox remains and must not be used until an
213
+ administrator verifies its state. If cleanup cannot be confirmed, treat the
214
+ installation as unsafe and do not use the companion until an administrator
215
+ verifies the relevant managed state.
216
+
217
+ The bounded command allowlist refuses an unmanaged assistant directory, symlinked
218
+ assistant paths, and a symlinked or non-directory `/docker/n8n-openai-oauth`
219
+ parent. It accepts Docker names only after validation. Before any update, start,
220
+ or cleanup, Relmio attests that matching project containers, networks, and
221
+ volumes carry the recorded install identity; it never cleans up an unattested
222
+ project. It also checks every predictable generated companion container name,
223
+ the explicit internal network, and the TLS volume regardless of Compose project
224
+ labels: a new install refuses any match, while an update requires the recorded
225
+ identity labels on every match.
226
+
227
+ ## Reference
228
+
229
+ - [n8n: Set up AI Assistant](https://docs.n8n.io/deploy/host-n8n/configure-n8n/set-up-ai-assistant)
230
+ - [n8n: Docker Compose installation](https://docs.n8n.io/deploy/host-n8n/install-options/install-using-docker-compose)
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-labelledby="title">
3
+ <title id="title">Relmio</title>
4
+ <defs>
5
+ <clipPath id="rounded-square">
6
+ <rect width="512" height="512" rx="112" />
7
+ </clipPath>
8
+ <linearGradient id="sage" x1="0" y1="0" x2="1" y2="1">
9
+ <stop offset="0" stop-color="#b0c0a6" />
10
+ <stop offset="1" stop-color="#879f87" />
11
+ </linearGradient>
12
+ <linearGradient id="teal" x1="0" y1="0" x2="0" y2="1">
13
+ <stop offset="0" stop-color="#12938f" />
14
+ <stop offset="1" stop-color="#047c79" />
15
+ </linearGradient>
16
+ </defs>
17
+ <g clip-path="url(#rounded-square)">
18
+ <rect width="512" height="512" fill="url(#sage)" />
19
+ <rect x="126" y="70" width="430" height="560" rx="215" fill="#f6f0e9" />
20
+ <rect x="190" y="218" width="194" height="390" rx="97" fill="url(#teal)" />
21
+ <rect x="190" y="315" width="194" height="293" fill="url(#teal)" />
22
+ <circle cx="242" cy="292" r="20" fill="#f6f0e9" />
23
+ <circle cx="332" cy="292" r="20" fill="#f6f0e9" />
24
+ </g>
25
+ </svg>
@@ -111,6 +111,67 @@ Do not change `openai-oauth@2.0.0` casually. An upgrade requires:
111
111
 
112
112
  Keep the old Docker image until the new one passes.
113
113
 
114
+ ## Updating or rolling back AI Assistant companion images
115
+
116
+ The AI Assistant companion has no automatic remote image upgrade. Relmio never
117
+ edits the existing n8n Compose file, image, or environment, and never directly
118
+ mutates n8n as part of a companion update or rollback.
119
+
120
+ Maintainers must treat the Sandbox Service API, privileged runner, and nested
121
+ sandbox image as one compatibility unit. Before changing
122
+ `ASSISTANT_COMPANION_IMAGES` in `src/domain/assistant-templates.js`:
123
+
124
+ 1. Review the official [n8n Sandbox Service release notes and source](https://github.com/n8n-io/n8n-sandbox-service), its [API](https://github.com/n8n-io/n8n-sandbox-service/pkgs/container/n8n-sandbox-service-api), [runner](https://github.com/n8n-io/n8n-sandbox-service/pkgs/container/n8n-sandbox-service-runner-dind), and [nested sandbox](https://github.com/n8n-io/n8n-sandbox-service/pkgs/container/n8n-sandbox-service-sandbox) package registries, plus the [SearXNG source](https://github.com/searxng/searxng) and [SearXNG package registry](https://github.com/searxng/searxng/pkgs/container/searxng).
125
+ 2. For every candidate, verify the reviewed tag resolves to the intended OCI
126
+ **index** digest and the required Linux platforms. Record a full immutable
127
+ `tag@sha256:<digest>` reference; never substitute `latest`, `stable`, a
128
+ tag-only reference, or a digest-only reference.
129
+ Inspect each numbered or source-revision tag with the same command pattern:
130
+
131
+ ```bash
132
+ docker buildx imagetools inspect \
133
+ ghcr.io/UPSTREAM/IMAGE:REVIEWED_VERSION_TAG
134
+ ```
135
+
136
+ Record the top-level `Digest` and required Linux platform entries from that
137
+ output. Then repeat the inspection with the proposed full
138
+ `tag@sha256:<digest>` reference and require the same top-level digest. This
139
+ is maintainer evidence gathering only; it does not authorize an update to a
140
+ running companion.
141
+ 3. Update only the exact source constants, add or update a generated-Compose
142
+ regression, and run these local release gates from the repository root:
143
+
144
+ ```bash
145
+ node --test \
146
+ --test-name-pattern="immutable|floating|pinned" \
147
+ test/assistant.test.js
148
+ npm run check
149
+ npm audit --audit-level=high
150
+ npm pack --dry-run
151
+ npm --prefix web run lint
152
+ npm --prefix web run typecheck
153
+ npm --prefix web run build:vercel
154
+ npm --prefix web test
155
+ npm --prefix web audit --audit-level=high
156
+ ```
157
+
158
+ Obtain a fresh security review of the exact change set after every fix.
159
+ Release only after all gates pass.
160
+
161
+ For an already managed companion, the administrator updates Relmio locally,
162
+ reconnects and completes host-key confirmation plus read-only discovery, then
163
+ reviews the exact companion-only plan. Keep the recorded SearXNG selection
164
+ unless intentionally changing it, provide the separate final confirmation, and
165
+ then verify that only ownership-labeled companion resources changed, there are
166
+ no host-published ports, and n8n remains healthy. Do not treat a local Relmio
167
+ update as remote-upgrade authorization.
168
+
169
+ To roll back, restore the previously reviewed complete `tag@sha256` set through
170
+ the same locally updated Relmio build and separately confirmed managed update.
171
+ Repeat read-only discovery, exact-plan review, final confirmation, and the
172
+ post-update checks above. Never roll back by pulling a moving tag or by editing,
173
+ restarting, recreating, or otherwise mutating n8n.
174
+
114
175
  ## If n8n is upgraded
115
176
 
116
177
  This project does not alter the n8n image. A normal n8n image update can still
package/docs/security.md CHANGED
@@ -122,6 +122,21 @@ shared, or production service.
122
122
  resource limits; and uses root plus only `CHOWN` long enough to atomically
123
123
  make the stdin-seeded volume entry readable by the non-root gateway.
124
124
 
125
+ ### AI Assistant companion image integrity
126
+
127
+ The generated AI Assistant companion uses reviewed, immutable
128
+ `tag@sha256:<OCI-index-digest>` image references for its API/certificate image,
129
+ privileged runner, nested sandbox image, and optional SearXNG service. The
130
+ Compose format cannot enforce image provenance itself, so the source-level
131
+ regression guard forbids floating or digestless production references,
132
+ including the nested `SANDBOX_RUNNER_DOCKER_SANDBOX_IMAGE` value.
133
+
134
+ There is no automatic remote upgrade. An upgrade or rollback is a separately
135
+ confirmed managed companion update after read-only discovery and exact-plan
136
+ review; it must preserve the no-n8n-mutation boundary, ownership attestation,
137
+ and no-host-port verification. See the exact procedure in
138
+ [maintenance.md](maintenance.md#updating-or-rolling-back-ai-assistant-companion-images).
139
+
125
140
  ### In-wizard Chat Adapter tester
126
141
 
127
142
  The Ready screen's Chat Adapter tester is a deliberately narrow convenience
@@ -222,6 +237,34 @@ The local capabilities have separate consequences:
222
237
  scope of another agreement. Review the current
223
238
  [program terms](https://learn.chatgpt.com/docs/codex-for-oss-terms).
224
239
 
240
+ ### Policy evidence and scope
241
+
242
+ The following sources support the narrow provider and authentication patterns
243
+ that Relmio documents. They are not a blanket approval of Relmio, a substitute
244
+ for the current agreements governing an account, or legal advice.
245
+
246
+ | Evidence | What it supports | What it does not establish |
247
+ | --- | --- | --- |
248
+ | Maintainer acceptance (private OpenAI email, August 2026) and the [Codex for Open Source Program Terms](https://learn.chatgpt.com/docs/codex-for-oss-terms) | Relmio's maintainer was accepted into the program for this project and received a limited-duration ChatGPT Pro benefit covering Codex access. The program is designed to support maintainers of important open-source software. | Program acceptance supports the maintainer and open-source work. It is not an OpenAI security review, product endorsement, or protocol-by-protocol compliance certification. The acceptance email is not published because it contains personal account information. |
249
+ | OpenAI's [Advanced Configuration — OSS mode and local providers](https://learn.chatgpt.com/docs/config-file/config-advanced#oss-mode-local-providers) | Codex supports custom model-provider configuration and an OSS mode with local providers such as Ollama or LM Studio. | It does not authorize turning a ChatGPT subscription credential into a general API credential or bypassing provider restrictions. |
250
+ | [Thibault “Tibo” Sottiaux](https://openai.com/index/openai-to-acquire-astral/), Codex Lead at OpenAI: [open-model statement](https://x.com/thsottiaux/status/2067399435009622521) | The Codex App, CLI, and SDK can run with open-source models rather than only OpenAI models. | Model-provider flexibility does not change authentication, billing, account, or usage-policy requirements. |
251
+ | Tibo: [account-use statement](https://x.com/thsottiaux/status/2090675027670978569) | Using one's own subscription through **Sign in with ChatGPT**, including compatible open-source clients, was distinguished from unsupported conversion of subscription access into API traffic. | It does not approve resale, pooling, forwarding credentials, sharing across users, or subscription-to-API conversion. A social post is not a contractual amendment. |
252
+ | OpenAI CEO Sam Altman: [OpenClaw statement](https://x.com/sama/status/2050357911915028689) | OpenClaw was publicly announced as supporting ChatGPT-account sign-in and subscription use. | Approval of one named integration does not automatically approve unrelated protocols, adapters, deployments, or credential handling. |
253
+
254
+ Relmio applies these distinctions as engineering controls:
255
+
256
+ - Native Codex uses the official Codex App Server lifecycle and preserves its
257
+ protocol instead of exporting a generic OpenAI `/v1` service.
258
+ - The bounded Codex Chat Adapter remains an experimental Relmio-specific
259
+ interface for the same owner; it is not an OpenAI API replacement.
260
+ - The n8n AI Assistant model route uses a user-owned OpenAI Platform project
261
+ and API key entered directly in n8n. Relmio never receives that key.
262
+ - The legacy n8n OAuth sidecar remains explicitly
263
+ experimental/private/policy-uncertain and is not described as approved by
264
+ the sources above.
265
+ - Relmio prohibits account sharing, pooling, resale, subscription-to-API
266
+ conversion, rate-limit or safeguard bypass, and credential forwarding.
267
+
225
268
  This repository does not claim that every possible use of the bridge is
226
269
  permitted. The account owner is responsible for reviewing the current
227
270
  [OpenAI Terms](https://openai.com/policies/terms-of-use/) and usage policies.
@@ -22,6 +22,9 @@ placeholder; it is not an OpenAI Platform API key.
22
22
 
23
23
  ## Follow-on guides
24
24
 
25
+ - [AI Assistant companion](./ai-assistant.md) covers the separate Preview
26
+ sandbox, Docker-in-Docker warning, optional SearXNG search, and the direct
27
+ OpenAI Platform-key model route.
25
28
  - [Configure n8n nodes](./n8n-configuration.md) has copy-ready AI Agent and
26
29
  HTTP Request recipes.
27
30
  - [Beginner manual installation](./manual-install.md) is the auditable fallback
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relmio",
3
- "version": "0.8.1",
3
+ "version": "0.9.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",
package/src/browser.js CHANGED
@@ -26,13 +26,14 @@ function isPrivateWizardUrl(value) {
26
26
  url.hostname === "127.0.0.1" &&
27
27
  url.port !== "" &&
28
28
  Number(url.port) > 0 &&
29
- url.pathname === "/" &&
29
+ (url.pathname === "/" || url.pathname === "/assistant") &&
30
30
  url.username === "" &&
31
31
  url.password === "" &&
32
32
  url.hash === "" &&
33
33
  typeof session === "string" &&
34
34
  /^[A-Za-z0-9_-]{43}$/u.test(session) &&
35
- url.search === `?session=${session}`
35
+ url.search === `?session=${session}` &&
36
+ value === `http://127.0.0.1:${url.port}${url.pathname}?session=${session}`
36
37
  );
37
38
  } catch {
38
39
  return false;
package/src/cli.js CHANGED
@@ -23,9 +23,14 @@ export function isCliEntryPath(entryPath, realpath = realpathSync) {
23
23
  }
24
24
 
25
25
  export function cliMode(argumentsList) {
26
- return argumentsList.length === 1 &&
26
+ if (
27
+ argumentsList.length === 1 &&
27
28
  (argumentsList[0] === "--version" || argumentsList[0] === "-v")
28
- ? "version"
29
+ ) {
30
+ return "version";
31
+ }
32
+ return argumentsList.length === 1 && argumentsList[0] === "assistant"
33
+ ? "assistant"
29
34
  : "wizard";
30
35
  }
31
36
 
@@ -41,8 +46,12 @@ export async function runCli({
41
46
  log = console.log,
42
47
  readPackage = () => readFile(packageJsonUrl, "utf8"),
43
48
  isInteractive = hasInteractiveTerminal,
49
+ startServer = startWizardServer,
50
+ open = openBrowser,
51
+ attachReopen = attachBrowserReopenOnEnter,
44
52
  } = {}) {
45
- if (cliMode(argumentsList) === "version") {
53
+ const mode = cliMode(argumentsList);
54
+ if (mode === "version") {
46
55
  const packageJson = JSON.parse(await readPackage());
47
56
  if (typeof packageJson.version !== "string" || packageJson.version === "") {
48
57
  throw new Error("Relmio package metadata does not contain a version.");
@@ -59,21 +68,25 @@ export async function runCli({
59
68
  }
60
69
 
61
70
  const sessionToken = randomBytes(32).toString("base64url");
62
- const wizard = await startWizardServer({ sessionToken });
63
- const url = `${wizard.origin}/?session=${sessionToken}`;
71
+ const wizard = await startServer({ sessionToken });
72
+ const url = `${wizard.origin}${mode === "assistant" ? "/assistant" : "/"}?session=${sessionToken}`;
64
73
 
65
74
  log("");
66
75
  log("Relmio");
67
76
  log("---------");
68
77
  log(`Local wizard: ${url}`);
69
78
  log("");
70
- log("This creates a separate sidecar and never restarts n8n.");
79
+ log(
80
+ mode === "assistant"
81
+ ? "This creates only the separate AI Assistant companion and never restarts n8n."
82
+ : "This creates a separate sidecar and never restarts n8n.",
83
+ );
71
84
  log("Keep this Terminal window open while using the wizard.");
72
85
  log("Press Control+C to stop.");
73
86
  log("");
74
87
 
75
- openBrowser(url);
76
- const detachBrowserReopen = attachBrowserReopenOnEnter({ url });
88
+ open(url);
89
+ const detachBrowserReopen = attachReopen({ url });
77
90
 
78
91
  let closing = false;
79
92
  async function close() {