relmio 0.3.0 → 0.4.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 +51 -0
- package/README.md +126 -36
- package/docs/architecture.md +57 -0
- package/docs/images/examples/gpt-56-model-selector.png +0 -0
- package/docs/images/examples/n8n-openai-credential-connected.png +0 -0
- package/docs/images/examples/telegram-model-results.png +0 -0
- package/docs/images/examples/telegram-n8n-workflow-execution.png +0 -0
- package/docs/images/setup/00-install-methods.png +0 -0
- package/docs/images/setup/01-local-sign-in-ready.png +0 -0
- package/docs/images/setup/02-vps-identity-confirmed.png +0 -0
- package/docs/images/setup/03-n8n-detected.png +0 -0
- package/docs/images/setup/04-install-plan.png +0 -0
- package/docs/images/setup/05-bridge-ready.png +0 -0
- package/docs/local-endpoints-spec.md +370 -0
- package/docs/local-endpoints.md +374 -0
- package/docs/npm-publish.md +121 -201
- package/docs/security.md +92 -3
- package/package.json +2 -2
- package/src/domain/local-endpoints.js +460 -0
- package/src/gateway/openai.js +834 -0
- package/src/infrastructure/local-process.js +375 -0
- package/src/services/codex-login.js +711 -0
- package/src/services/local-installer.js +1120 -0
- package/src/ui/app.js +4 -0
- package/src/ui/index.html +119 -108
- package/src/ui/local.css +262 -0
- package/src/ui/local.html +442 -0
- package/src/ui/local.js +550 -0
- package/src/ui/styles.css +577 -278
- package/src/web/server.js +247 -12
package/docs/npm-publish.md
CHANGED
|
@@ -1,85 +1,84 @@
|
|
|
1
1
|
# Publish and synchronize the npm package
|
|
2
2
|
|
|
3
|
-
This guide is for the package maintainer. Run
|
|
4
|
-
|
|
3
|
+
This guide is for the package maintainer. Run commands on a clean local
|
|
4
|
+
release worktree, never on the VPS. The repository and its reviewed release
|
|
5
|
+
commit are the source of truth.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
`package.json`, `CHANGELOG.md`, or the Git repository after a publish.
|
|
11
|
-
|
|
12
|
-
The first `relmio` publication is a one-time bootstrap with a narrowly scoped
|
|
13
|
-
local access token because npm requires the package to exist before a trusted
|
|
14
|
-
publisher can be attached. After that bootstrap, releases use the
|
|
15
|
-
repository's `.github/workflows/publish.yml` OIDC workflow and no long-lived
|
|
16
|
-
npm token.
|
|
7
|
+
Relmio is already configured as an npm trusted-publishing package. Every npm
|
|
8
|
+
release must come from the repository's `.github/workflows/publish.yml`
|
|
9
|
+
workflow using GitHub OIDC. Do not create, store, request, or use a local npm
|
|
10
|
+
access token for a Relmio release.
|
|
17
11
|
|
|
18
12
|
## Version contract
|
|
19
13
|
|
|
20
|
-
Every release
|
|
14
|
+
Every release uses one semantic version in all of these places:
|
|
21
15
|
|
|
22
16
|
- `package.json`;
|
|
23
17
|
- the top-level and root-package entries in `package-lock.json`;
|
|
24
18
|
- the newest numbered release in `CHANGELOG.md`;
|
|
25
19
|
- the Git tag `v<version>`;
|
|
20
|
+
- the GitHub release;
|
|
26
21
|
- the version published to npm.
|
|
27
22
|
|
|
28
|
-
Check
|
|
23
|
+
Check local metadata with:
|
|
29
24
|
|
|
30
25
|
```bash
|
|
31
26
|
npm run release:check
|
|
32
27
|
```
|
|
33
28
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
registry's current `latest` version. The post-publish commands below perform
|
|
37
|
-
the authoritative equality check.
|
|
29
|
+
The README badge can be cached. Post-release registry queries are the
|
|
30
|
+
authoritative publication check.
|
|
38
31
|
|
|
39
|
-
##
|
|
32
|
+
## Trusted publisher contract
|
|
40
33
|
|
|
41
|
-
|
|
42
|
-
2. Configure an npm-supported second factor for package publishing. Depending
|
|
43
|
-
on the account, npm may approve with a passkey/security key or request an
|
|
44
|
-
authenticator one-time code.
|
|
45
|
-
3. Create one granular access token that can create and publish only the new
|
|
46
|
-
package. Keep it in the ignored local `NPM_CREATE_ACCESS_TOKEN` environment
|
|
47
|
-
variable and revoke it after trusted publishing is configured.
|
|
34
|
+
The npm package's **Trusted Publisher** configuration must remain:
|
|
48
35
|
|
|
49
|
-
|
|
50
|
-
|
|
36
|
+
| Field | Value |
|
|
37
|
+
|---|---|
|
|
38
|
+
| Publisher | GitHub Actions |
|
|
39
|
+
| Organization or user | `Demonbane18` |
|
|
40
|
+
| Repository | `relmio` |
|
|
41
|
+
| Workflow filename | `publish.yml` |
|
|
42
|
+
| Environment name | `npm` |
|
|
43
|
+
| Allowed action | Allow npm publish |
|
|
44
|
+
|
|
45
|
+
The workflow runs on a GitHub-hosted runner with `id-token: write` and the
|
|
46
|
+
protected `npm` environment. npm exchanges that workload identity for a
|
|
47
|
+
short-lived publishing credential and generates provenance for the public
|
|
48
|
+
package. The workflow contains no long-lived npm secret.
|
|
49
|
+
|
|
50
|
+
If this trusted-publisher configuration is missing or differs, stop. Repair it
|
|
51
|
+
through npm's package settings and review the repository environment policy
|
|
52
|
+
before attempting a release. Never substitute `npm login`, an `.npmrc` token,
|
|
53
|
+
an environment token, or a personal automation token.
|
|
51
54
|
|
|
52
55
|
## Prepare a release
|
|
53
56
|
|
|
54
|
-
Start from
|
|
55
|
-
version.
|
|
57
|
+
Start from an isolated release branch and a clean worktree. Do not retag or
|
|
58
|
+
reuse an already published version.
|
|
56
59
|
|
|
57
60
|
### 1. Check the current state
|
|
58
61
|
|
|
59
62
|
```bash
|
|
60
63
|
git status --short --branch
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
git tag --sort=-version:refname | head
|
|
65
|
+
npm view relmio version --registry=https://registry.npmjs.org
|
|
63
66
|
```
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
name has no published version yet. Confirm the exact package name is still
|
|
68
|
-
available, then continue only from the reviewed rebrand commit.
|
|
68
|
+
Inspect the complete diff since the previous published tag. The worktree must
|
|
69
|
+
contain only reviewed release changes.
|
|
69
70
|
|
|
70
|
-
### 2.
|
|
71
|
+
### 2. Update version metadata without creating a tag
|
|
71
72
|
|
|
72
|
-
For a
|
|
73
|
+
For a compatible patch:
|
|
73
74
|
|
|
74
75
|
```bash
|
|
75
76
|
npm version patch --no-git-tag-version
|
|
76
77
|
```
|
|
77
78
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
Add a matching release heading and user-visible changes to `CHANGELOG.md`.
|
|
82
|
-
Then run:
|
|
79
|
+
For Relmio's pre-1.0 series, use a minor bump for a meaningful new capability
|
|
80
|
+
or workflow. Update the dated `CHANGELOG.md` entry, keep `## Unreleased` above
|
|
81
|
+
it, and run:
|
|
83
82
|
|
|
84
83
|
```bash
|
|
85
84
|
npm run release:check
|
|
@@ -92,194 +91,115 @@ npm ci --ignore-scripts
|
|
|
92
91
|
npm run check
|
|
93
92
|
npm audit --audit-level=high
|
|
94
93
|
npm run package:build -- .release
|
|
94
|
+
npm pack --dry-run
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
- OAuth files or tokens;
|
|
103
|
-
- SSH keys, passwords, or real VPS details;
|
|
104
|
-
- browser session URLs;
|
|
105
|
-
- test recordings or unredacted screenshots;
|
|
106
|
-
- unrelated local build artifacts.
|
|
107
|
-
|
|
108
|
-
Documentation images must be sanitized previews. Remember that `docs/**` is
|
|
109
|
-
part of the npm package.
|
|
97
|
+
Review the emitted tarball file list. It must not contain credentials, local
|
|
98
|
+
environment files, SSH material, real infrastructure details, browser session
|
|
99
|
+
URLs, unredacted recordings, or unrelated build artifacts. The package builder
|
|
100
|
+
must stage `npm/README.md` as the tarball's root `README.md` without modifying
|
|
101
|
+
the full GitHub guide.
|
|
110
102
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
commits. If history contains sensitive data, keep the repository private and
|
|
115
|
-
perform a reviewed, coordinated history rewrite before the first public
|
|
116
|
-
release.
|
|
103
|
+
When `web/**` changed, also run the web lint, typecheck, tests, production
|
|
104
|
+
Vercel build, and the approved browser QA. When installer or package-manager
|
|
105
|
+
surfaces changed, run their platform-focused tests and artifact checks.
|
|
117
106
|
|
|
118
|
-
### 4.
|
|
107
|
+
### 4. Open the release pull request
|
|
119
108
|
|
|
120
|
-
|
|
109
|
+
Commit only the intended release files and push the release branch. The pull
|
|
110
|
+
request must record:
|
|
121
111
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
git diff --cached --stat
|
|
128
|
-
git commit -m "release: v${RELEASE_VERSION}"
|
|
129
|
-
git push
|
|
130
|
-
```
|
|
112
|
+
- the previous release tag and intended version;
|
|
113
|
+
- the provider/security boundary for changed behavior;
|
|
114
|
+
- root, web, installer, package, audit, and browser results as applicable;
|
|
115
|
+
- npm, Vercel, Homebrew, WinGet, and installer applicability;
|
|
116
|
+
- every known skip or unresolved risk.
|
|
131
117
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
remaining commands assume that branch is named `main`; substitute the actual
|
|
135
|
-
default branch if it differs.
|
|
118
|
+
Wait for required review, CI, package-manager validation, and Vercel preview
|
|
119
|
+
checks. Do not bypass branch protection. Merge only the reviewed head commit.
|
|
136
120
|
|
|
137
|
-
##
|
|
121
|
+
## Tag and publish the exact merged commit
|
|
138
122
|
|
|
139
|
-
|
|
140
|
-
|
|
123
|
+
After the default-branch CI and production deployment are green, resolve the
|
|
124
|
+
exact merged commit:
|
|
141
125
|
|
|
142
126
|
```bash
|
|
143
|
-
git
|
|
144
|
-
git
|
|
145
|
-
|
|
146
|
-
RELEASE_COMMIT="$(git rev-parse HEAD)"
|
|
147
|
-
npm run release:check
|
|
127
|
+
git fetch origin
|
|
128
|
+
RELEASE_COMMIT="$(git rev-parse origin/main)"
|
|
129
|
+
git show -s --format='%H%n%s' "$RELEASE_COMMIT"
|
|
148
130
|
```
|
|
149
131
|
|
|
150
|
-
|
|
151
|
-
|
|
132
|
+
Confirm that commit contains the reviewed package version and changelog. Create
|
|
133
|
+
an annotated tag on that exact commit, push it, and verify the remote tag
|
|
134
|
+
target before creating the GitHub release:
|
|
152
135
|
|
|
153
136
|
```bash
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
137
|
+
RELEASE_VERSION="$(node -p "require('./package.json').version")"
|
|
138
|
+
git tag -a "v${RELEASE_VERSION}" "$RELEASE_COMMIT" -m "v${RELEASE_VERSION}"
|
|
139
|
+
git push origin "v${RELEASE_VERSION}"
|
|
140
|
+
git ls-remote origin "refs/tags/v${RELEASE_VERSION}^{}"
|
|
157
141
|
```
|
|
158
142
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
143
|
+
Create the GitHub release from that tag with curated notes copied from the
|
|
144
|
+
matching changelog entry. Publishing the GitHub release triggers
|
|
145
|
+
`.github/workflows/publish.yml`; that workflow:
|
|
162
146
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
npm whoami --registry=https://registry.npmjs.org
|
|
171
|
-
LOCAL_VERSION="$(node -p "require('./package.json').version")"
|
|
172
|
-
npm publish ".release/relmio-${LOCAL_VERSION}.tgz" \
|
|
173
|
-
--ignore-scripts \
|
|
174
|
-
--access public \
|
|
175
|
-
--registry=https://registry.npmjs.org
|
|
176
|
-
```
|
|
147
|
+
1. checks out the immutable release tag;
|
|
148
|
+
2. runs the full release gate and audit;
|
|
149
|
+
3. builds the reviewed tarball;
|
|
150
|
+
4. skips safely if that immutable version already exists;
|
|
151
|
+
5. otherwise publishes through npm trusted publishing;
|
|
152
|
+
6. builds and attaches verified Windows release artifacts;
|
|
153
|
+
7. generates a Homebrew formula candidate from the published npm tarball.
|
|
177
154
|
|
|
178
|
-
|
|
179
|
-
argument, or Git. npm may still require its configured publishing second
|
|
180
|
-
factor.
|
|
155
|
+
Never run `npm publish` locally. Never recreate or move a published tag.
|
|
181
156
|
|
|
182
|
-
Verify
|
|
157
|
+
## Verify delivered surfaces
|
|
158
|
+
|
|
159
|
+
After the workflow succeeds:
|
|
183
160
|
|
|
184
161
|
```bash
|
|
185
162
|
LOCAL_VERSION="$(node -p "require('./package.json').version")"
|
|
186
163
|
PUBLISHED_VERSION="$(npm view relmio version \
|
|
187
164
|
--registry=https://registry.npmjs.org)"
|
|
188
165
|
test "$LOCAL_VERSION" = "$PUBLISHED_VERSION"
|
|
189
|
-
npm view "relmio@${LOCAL_VERSION}"
|
|
166
|
+
npm view "relmio@${LOCAL_VERSION}" \
|
|
167
|
+
version dist.integrity dist.tarball \
|
|
190
168
|
--registry=https://registry.npmjs.org
|
|
191
169
|
```
|
|
192
170
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
## Switch future releases to trusted publishing
|
|
196
|
-
|
|
197
|
-
Do this only after the first `relmio` version exists on npm and the
|
|
198
|
-
`publish.yml` workflow is present on the GitHub default branch.
|
|
199
|
-
|
|
200
|
-
On the npm package's **Trusted Publisher** form, use:
|
|
201
|
-
|
|
202
|
-
| Field | Value |
|
|
203
|
-
|---|---|
|
|
204
|
-
| Publisher | GitHub Actions |
|
|
205
|
-
| Organization or user | `Demonbane18` |
|
|
206
|
-
| Repository | `relmio` |
|
|
207
|
-
| Workflow filename | `publish.yml` |
|
|
208
|
-
| Environment name | `npm` |
|
|
209
|
-
| Allowed action | Allow npm publish |
|
|
210
|
-
|
|
211
|
-
The environment must match `environment: npm` in the workflow. Add approval
|
|
212
|
-
rules to the GitHub `npm` environment if a maintainer should explicitly
|
|
213
|
-
approve each registry write.
|
|
214
|
-
|
|
215
|
-
The workflow uses a GitHub-hosted runner, `id-token: write`, Node.js `22.14.0`,
|
|
216
|
-
and npm `11.13.0`, which is separate from the application's reviewed npm
|
|
217
|
-
`10.9.8` development runtime. npm exchanges the GitHub OIDC identity for a
|
|
218
|
-
short-lived publishing credential and automatically generates provenance for
|
|
219
|
-
public packages.
|
|
220
|
-
|
|
221
|
-
After one trusted publish is verified:
|
|
222
|
-
|
|
223
|
-
1. change package publishing access to require 2FA and disallow tokens;
|
|
224
|
-
2. revoke `NPM_CREATE_ACCESS_TOKEN` and any older automation tokens;
|
|
225
|
-
3. keep normal development on npm `10.9.8`;
|
|
226
|
-
4. create future GitHub releases from reviewed `v<version>` tags to trigger
|
|
227
|
-
the trusted workflow.
|
|
228
|
-
|
|
229
|
-
The workflow safely skips a version already present on npm. This lets the
|
|
230
|
-
GitHub release for the token-bootstrapped `v0.2.0` tag be created without a
|
|
231
|
-
duplicate publish attempt.
|
|
232
|
-
|
|
233
|
-
## Tag the published release
|
|
234
|
-
|
|
235
|
-
For the initial token-bootstrap release, create the tag on the exact published
|
|
236
|
-
commit:
|
|
237
|
-
|
|
238
|
-
```bash
|
|
239
|
-
RELEASE_VERSION="$(node -p "require('./package.json').version")"
|
|
240
|
-
: "${RELEASE_COMMIT:?Run the publish steps above in this terminal first}"
|
|
241
|
-
test "$RELEASE_COMMIT" = "$(git rev-parse HEAD)"
|
|
242
|
-
git tag -a "v${RELEASE_VERSION}" "$RELEASE_COMMIT" -m "v${RELEASE_VERSION}"
|
|
243
|
-
git push origin "v${RELEASE_VERSION}"
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
The tag CI run validates that `v<version>` matches the package, lockfile, and
|
|
247
|
-
changelog. For later OIDC releases, push the reviewed tag first and create the
|
|
248
|
-
GitHub release from it; publishing the GitHub release triggers the trusted
|
|
249
|
-
workflow. Copy the matching changelog entry into the release notes.
|
|
250
|
-
|
|
251
|
-
## Verify as a package user
|
|
252
|
-
|
|
253
|
-
In a separate terminal, check the version and launch the exact release:
|
|
254
|
-
|
|
255
|
-
```bash
|
|
256
|
-
npm view relmio version
|
|
257
|
-
npx --yes --ignore-scripts relmio@PUBLISHED_VERSION
|
|
258
|
-
```
|
|
171
|
+
Also verify:
|
|
259
172
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
173
|
+
- the GitHub release tag targets the reviewed merged commit;
|
|
174
|
+
- npm renders the registry-safe README and the package has provenance;
|
|
175
|
+
- the Vercel production deployment corresponds to the merged commit;
|
|
176
|
+
- hosted `install.sh`, `install.ps1`, and `install.cmd` still byte-match their
|
|
177
|
+
tested repository sources and invoke `relmio@latest`;
|
|
178
|
+
- Windows assets are attached to the GitHub release;
|
|
179
|
+
- Homebrew points to the exact npm tarball version and SHA-256;
|
|
180
|
+
- WinGet remains described as pending until its upstream catalog is actually
|
|
181
|
+
updated.
|
|
263
182
|
|
|
264
|
-
|
|
265
|
-
|
|
183
|
+
Run the repository's distribution audit for the exact release version and do
|
|
184
|
+
not call the release synchronized while a required surface is red.
|
|
266
185
|
|
|
267
186
|
## If something goes wrong
|
|
268
187
|
|
|
269
|
-
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
-
|
|
282
|
-
and
|
|
283
|
-
|
|
284
|
-
Do not publish from the VPS.
|
|
285
|
-
|
|
188
|
+
- Trusted-publisher or OIDC failure: stop and inspect the GitHub environment,
|
|
189
|
+
workflow identity, npm trusted-publisher settings, and workflow logs. Do not
|
|
190
|
+
fall back to a token.
|
|
191
|
+
- `EPUBLISHCONFLICT`: the version is immutable and already exists. Verify
|
|
192
|
+
whether it is the intended artifact; otherwise prepare a new version.
|
|
193
|
+
- Registry version differs from repository metadata: stop. Do not move the tag
|
|
194
|
+
or overwrite npm.
|
|
195
|
+
- Tag push failed before the GitHub release: confirm whether the exact tag
|
|
196
|
+
exists remotely before retrying. Never force-update a release tag.
|
|
197
|
+
- GitHub release exists but publish failed: leave the tag immutable, fix the
|
|
198
|
+
trusted workflow or policy, rerun the reviewed automation, and preserve the
|
|
199
|
+
failure evidence.
|
|
200
|
+
- Vercel or package-manager delivery failed: keep the release status explicit
|
|
201
|
+
and repair only the affected reviewed surface.
|
|
202
|
+
|
|
203
|
+
Do not publish from the VPS. Do not put an npm token in local config, CI, chat,
|
|
204
|
+
issues, logs, or shell examples. Relmio publishing authenticates only through
|
|
205
|
+
the repository's short-lived GitHub OIDC identity.
|
package/docs/security.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Security and limitations
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
The VPS/n8n path handles a ChatGPT OAuth credential and an SSH authentication
|
|
4
|
+
method. The local endpoint path can additionally handle an OpenAI Platform API
|
|
5
|
+
key, a Codex/ChatGPT session, and generated local capabilities. Treat every one
|
|
6
|
+
of these values as password-equivalent. Read this page before offering the
|
|
7
|
+
wizard to another person.
|
|
6
8
|
|
|
7
9
|
## Trust model
|
|
8
10
|
|
|
@@ -16,6 +18,20 @@ The design assumes:
|
|
|
16
18
|
|
|
17
19
|
If any of those assumptions is false, do not use this design.
|
|
18
20
|
|
|
21
|
+
For a local Docker endpoint, the design additionally assumes:
|
|
22
|
+
|
|
23
|
+
- the local computer, operating-system account, and Docker Engine are trusted;
|
|
24
|
+
- the app receiving the Relmio capability displayed once by the wizard is
|
|
25
|
+
trusted and controlled
|
|
26
|
+
by the same person;
|
|
27
|
+
- a browser origin allowlist is not being used as a substitute for secret
|
|
28
|
+
storage; and
|
|
29
|
+
- a Codex client is trusted with App Server's broad agent and account surface.
|
|
30
|
+
|
|
31
|
+
The raw Codex App Server is not a multi-user boundary. It is for a trusted
|
|
32
|
+
native client owned by the same account holder, not a browser, shared service,
|
|
33
|
+
public app, or untrusted plugin.
|
|
34
|
+
|
|
19
35
|
## Controls implemented by the wizard
|
|
20
36
|
|
|
21
37
|
- The web server binds only to `127.0.0.1`.
|
|
@@ -42,6 +58,45 @@ If any of those assumptions is false, do not use this design.
|
|
|
42
58
|
- There is no host `ports` mapping and no reverse-proxy route.
|
|
43
59
|
- The installer verifies the absence of a published port after startup.
|
|
44
60
|
|
|
61
|
+
### Local endpoint controls
|
|
62
|
+
|
|
63
|
+
- Generated Compose files publish only literal
|
|
64
|
+
`127.0.0.1:<selected-port>:<container-port>` mappings.
|
|
65
|
+
- Every OpenAI `/v1` operation that can reach OpenAI and every Codex WebSocket
|
|
66
|
+
upgrade requires a random Relmio capability displayed once by the wizard;
|
|
67
|
+
only its SHA-256 verifier is persisted. Exact-origin CORS `OPTIONS` is a
|
|
68
|
+
non-forwarding metadata exception. The bearer remains valid until an
|
|
69
|
+
endpoint update rotates it.
|
|
70
|
+
- The Platform API key is accepted only for the OpenAI gateway. A transient,
|
|
71
|
+
network-disabled helper receives it over stdin and atomically seeds a private,
|
|
72
|
+
labeled Docker volume that the gateway mounts read-only. No host key file or
|
|
73
|
+
Compose environment value is created, and the key is never returned to the
|
|
74
|
+
browser after installation.
|
|
75
|
+
- ChatGPT sign-in is accepted only through the official Codex App Server
|
|
76
|
+
account flow. Relmio never returns or converts the resulting tokens.
|
|
77
|
+
- Browser requests to the OpenAI gateway require an exact configured `http`
|
|
78
|
+
or `https` origin. Wildcards and `null` are rejected; requests without an
|
|
79
|
+
`Origin` remain available to authenticated native clients and backends.
|
|
80
|
+
- Codex receives private named credential and workspace volumes. No host
|
|
81
|
+
directory, Docker socket, SSH key, browser profile, or home directory is
|
|
82
|
+
mounted into either local service.
|
|
83
|
+
- Local managed paths use mode `0700`, generated files use owner-only modes,
|
|
84
|
+
symlinks are rejected, and existing unmanaged directories are not
|
|
85
|
+
overwritten.
|
|
86
|
+
- The selected Docker context must resolve to a local Unix socket. Every
|
|
87
|
+
mutating command is pinned to that socket, Docker selector environment
|
|
88
|
+
overrides are removed, and native Windows is rejected before mutation.
|
|
89
|
+
- Each install uses a random Compose project identity. Containers, networks,
|
|
90
|
+
and volumes must carry matching Relmio ownership labels before update,
|
|
91
|
+
restart, recovery, or sign-in actions are allowed.
|
|
92
|
+
- Both long-running endpoint containers run as a non-root user, drop Linux
|
|
93
|
+
capabilities, set `no-new-privileges`, use a read-only root filesystem, and
|
|
94
|
+
have bounded temporary storage and resource limits.
|
|
95
|
+
- The one-shot OpenAI credential seed helper is the narrow exception: it has no
|
|
96
|
+
network, port, or logs; runs with a read-only root filesystem and strict
|
|
97
|
+
resource limits; and uses root plus only `CHOWN` long enough to atomically
|
|
98
|
+
make the stdin-seeded volume entry readable by the non-root gateway.
|
|
99
|
+
|
|
45
100
|
## What “private” means here
|
|
46
101
|
|
|
47
102
|
Port `10531` is not reachable from the public internet or VPS host through a
|
|
@@ -67,6 +122,20 @@ expose it.
|
|
|
67
122
|
- Revoke or refresh the session if the VPS may be compromised.
|
|
68
123
|
- Prefer a dedicated personal VPS with current security updates.
|
|
69
124
|
|
|
125
|
+
The local capabilities have separate consequences:
|
|
126
|
+
|
|
127
|
+
- The OpenAI gateway capability can spend through the protected Platform API
|
|
128
|
+
key, subject to that Platform project's permissions and limits.
|
|
129
|
+
- The Codex capability can invoke broad App Server methods inside the isolated
|
|
130
|
+
container and use its signed-in ChatGPT/Codex session.
|
|
131
|
+
- An origin allowlist does not make a bearer embedded in browser JavaScript
|
|
132
|
+
private. Use browser access only for private same-owner local development.
|
|
133
|
+
- Do not expose either endpoint on a LAN, public IP, domain, reverse proxy, or
|
|
134
|
+
hosted service. Loopback binding and the bearer capability are both required.
|
|
135
|
+
- If a capability is disclosed, update the endpoint to rotate it. If an
|
|
136
|
+
upstream credential may be exposed, revoke or sign out through the provider
|
|
137
|
+
as well.
|
|
138
|
+
|
|
70
139
|
## Product and policy limitations
|
|
71
140
|
|
|
72
141
|
- This is not an OpenAI Platform API key.
|
|
@@ -79,10 +148,29 @@ expose it.
|
|
|
79
148
|
- Rate limits and account restrictions still apply.
|
|
80
149
|
- OpenAI can change or discontinue service behavior and can suspend access for
|
|
81
150
|
Terms or usage-policy violations.
|
|
151
|
+
- The local OpenAI-compatible endpoint requires a Platform API key. Its usage
|
|
152
|
+
is billed or credited to the associated Platform project; a ChatGPT
|
|
153
|
+
subscription or Codex for Open Source benefit is not substituted for API
|
|
154
|
+
billing.
|
|
155
|
+
- The local Codex option preserves the official App Server JSON-RPC protocol.
|
|
156
|
+
It does not provide `/v1/chat/completions`, `/v1/responses`, or any other
|
|
157
|
+
OpenAI API compatibility route.
|
|
158
|
+
- OpenAI documents App Server WebSocket transport as experimental and
|
|
159
|
+
unsupported for production. It rejects browser-origin requests and is
|
|
160
|
+
limited here to trusted native same-owner clients.
|
|
161
|
+
- Acceptance into Codex for Open Source is not treated by Relmio as permission
|
|
162
|
+
to repurpose credentials, share an account, bypass controls, or broaden the
|
|
163
|
+
scope of another agreement. Review the current
|
|
164
|
+
[program terms](https://learn.chatgpt.com/docs/codex-for-oss-terms).
|
|
82
165
|
|
|
83
166
|
This repository does not claim that every possible use of the bridge is
|
|
84
167
|
permitted. The account owner is responsible for reviewing the current
|
|
85
168
|
[OpenAI Terms](https://openai.com/policies/terms-of-use/) and usage policies.
|
|
169
|
+
The local endpoint design follows the documented
|
|
170
|
+
[OpenAI API authentication](https://developers.openai.com/api/reference/overview#authentication),
|
|
171
|
+
[Codex authentication](https://learn.chatgpt.com/docs/auth), and
|
|
172
|
+
[Codex App Server](https://learn.chatgpt.com/docs/app-server) boundaries. This
|
|
173
|
+
is engineering guidance, not legal advice or an OpenAI approval.
|
|
86
174
|
|
|
87
175
|
## Dependency policy
|
|
88
176
|
|
|
@@ -91,6 +179,7 @@ The current release pins:
|
|
|
91
179
|
- Node.js 22+
|
|
92
180
|
- `ssh2` `1.17.0`
|
|
93
181
|
- `openai-oauth` `2.0.0`
|
|
182
|
+
- `@openai/codex` `0.147.0` in the local Codex image
|
|
94
183
|
|
|
95
184
|
The POSIX and native Windows PowerShell bootstraps reuse a compatible local
|
|
96
185
|
Node.js runtime or download the matching current official Node.js 22 archive
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "relmio",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
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",
|
|
7
7
|
"gpt-5-6-sol",
|