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 +28 -0
- package/README.md +47 -1
- package/docs/ai-assistant.md +230 -0
- package/docs/images/brand/relmio-logo-rounded.svg +25 -0
- package/docs/maintenance.md +61 -0
- package/docs/security.md +43 -0
- package/docs/vps-and-n8n.md +3 -0
- package/package.json +1 -1
- package/src/browser.js +3 -2
- package/src/cli.js +21 -8
- package/src/domain/assistant-templates.js +207 -0
- package/src/domain/assistant.js +363 -0
- package/src/domain/safety.js +4 -1
- package/src/services/assistant-installer.js +514 -0
- package/src/services/discovery.js +28 -1
- package/src/services/installer.js +13 -5
- package/src/ui/assistant.css +154 -0
- package/src/ui/assistant.html +351 -0
- package/src/ui/assistant.js +290 -0
- package/src/ui/index.html +1 -1
- package/src/ui/local.html +1 -1
- package/src/ui/relmio-icon-rounded.svg +25 -0
- package/src/web/server.js +255 -24
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.
|
|
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>
|
package/docs/maintenance.md
CHANGED
|
@@ -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.
|
package/docs/vps-and-n8n.md
CHANGED
|
@@ -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
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
|
-
|
|
26
|
+
if (
|
|
27
|
+
argumentsList.length === 1 &&
|
|
27
28
|
(argumentsList[0] === "--version" || argumentsList[0] === "-v")
|
|
28
|
-
|
|
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
|
-
|
|
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
|
|
63
|
-
const url = `${wizard.origin}
|
|
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(
|
|
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
|
-
|
|
76
|
-
const detachBrowserReopen =
|
|
88
|
+
open(url);
|
|
89
|
+
const detachBrowserReopen = attachReopen({ url });
|
|
77
90
|
|
|
78
91
|
let closing = false;
|
|
79
92
|
async function close() {
|