@wisdoverse/dsh-inline-media-viewer 1.0.1 → 1.0.3
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 +32 -18
- package/LICENSE +21 -21
- package/README.md +13 -4
- package/README.zh-CN.md +11 -4
- package/SECURITY.md +67 -67
- package/client/client.js +561 -554
- package/index.js +185 -185
- package/lib.js +178 -178
- package/package.json +44 -44
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.3
|
|
4
|
+
|
|
5
|
+
- Clarify and enforce the transport split: workspace files use the DSH host,
|
|
6
|
+
regular HTTP(S) media loads directly, and only recognized ComfyUI URLs use
|
|
7
|
+
the optional proxy.
|
|
8
|
+
- Mark ComfyUI as optional throughout the bilingual settings UI and README.
|
|
9
|
+
|
|
10
|
+
## 1.0.2
|
|
11
|
+
|
|
12
|
+
- Make the settings navigation and all setting copy react live to DSH's
|
|
13
|
+
English/Chinese UI language through the standard locale slot contract.
|
|
14
|
+
- Add a dependency-free client registration test for both locale dictionaries
|
|
15
|
+
and the settings locale namespace.
|
|
16
|
+
|
|
3
17
|
## 1.0.1
|
|
4
18
|
|
|
5
19
|
- Publish the plugin as `@wisdoverse/dsh-inline-media-viewer` for one-command
|
|
@@ -8,22 +22,22 @@
|
|
|
8
22
|
documentation with the scoped package name.
|
|
9
23
|
|
|
10
24
|
## 1.0.0
|
|
11
|
-
|
|
12
|
-
- **Initial public release.** Inline image/video/audio previews in the
|
|
13
|
-
conversation tail (`conversation.chat.turnTail` projection): any media
|
|
14
|
-
path or media URL mentioned in a chat turn renders inline under that
|
|
15
|
-
turn.
|
|
16
|
-
- **Workspace-confined local reads** — a path renders only when it
|
|
17
|
-
resolves inside the calling session's workspace root (`realpath` +
|
|
18
|
-
containment; no symlink escapes).
|
|
19
|
-
- **Configurable ComfyUI proxy** — media URLs on the local aliases
|
|
20
|
-
(`127.0.0.1`/`localhost` on port 8188) or on the configured server
|
|
21
|
-
address are fetched server-side from the configured origin, with
|
|
22
|
-
redirects refused, a 20 s timeout, and a 48 MiB cap.
|
|
23
|
-
- **Settings page** (媒体预览 / Media preview): auto-render toggle,
|
|
24
|
-
per-turn cap (1–30), max media height (160–1200 px), ComfyUI server
|
|
25
|
-
address — persisted through the DSH settings document (loopback
|
|
26
|
-
writes).
|
|
27
|
-
- **Pure helpers** in a dependency-free `lib.js` with a zero-dependency
|
|
28
|
-
unit test runner (`node test.mjs`), plus README, SECURITY, and MIT
|
|
25
|
+
|
|
26
|
+
- **Initial public release.** Inline image/video/audio previews in the
|
|
27
|
+
conversation tail (`conversation.chat.turnTail` projection): any media
|
|
28
|
+
path or media URL mentioned in a chat turn renders inline under that
|
|
29
|
+
turn.
|
|
30
|
+
- **Workspace-confined local reads** — a path renders only when it
|
|
31
|
+
resolves inside the calling session's workspace root (`realpath` +
|
|
32
|
+
containment; no symlink escapes).
|
|
33
|
+
- **Configurable ComfyUI proxy** — media URLs on the local aliases
|
|
34
|
+
(`127.0.0.1`/`localhost` on port 8188) or on the configured server
|
|
35
|
+
address are fetched server-side from the configured origin, with
|
|
36
|
+
redirects refused, a 20 s timeout, and a 48 MiB cap.
|
|
37
|
+
- **Settings page** (媒体预览 / Media preview): auto-render toggle,
|
|
38
|
+
per-turn cap (1–30), max media height (160–1200 px), ComfyUI server
|
|
39
|
+
address — persisted through the DSH settings document (loopback
|
|
40
|
+
writes).
|
|
41
|
+
- **Pure helpers** in a dependency-free `lib.js` with a zero-dependency
|
|
42
|
+
unit test runner (`node test.mjs`), plus README, SECURITY, and MIT
|
|
29
43
|
LICENSE.
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Wisdoverse
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Wisdoverse
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<a href="CHANGELOG.md"><img alt="Latest tag" src="https://img.shields.io/github/v/tag/Wisdoverse/dsh-inline-media-viewer-plugin?style=flat-square&label=version"></a>
|
|
9
9
|
<a href="LICENSE"><img alt="License" src="https://img.shields.io/github/license/Wisdoverse/dsh-inline-media-viewer-plugin?style=flat-square"></a>
|
|
10
10
|
<a href="package.json"><img alt="Top language" src="https://img.shields.io/github/languages/top/Wisdoverse/dsh-inline-media-viewer-plugin?style=flat-square"></a>
|
|
11
|
-
<a href="#configuration"><img alt="ComfyUI
|
|
11
|
+
<a href="#configuration"><img alt="Optional ComfyUI" src="https://img.shields.io/badge/ComfyUI-optional-ff6f00?style=flat-square"></a>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
14
|
<p align="center">
|
|
@@ -40,9 +40,14 @@ audio/sound.mp3 → <audio controls>
|
|
|
40
40
|
| --- | --- |
|
|
41
41
|
| Inline rendering | Displays images, videos, and audio directly below the chat turn that mentions them. |
|
|
42
42
|
| Workspace-safe reads | Resolves local paths with `realpath` and rejects traversal, out-of-workspace paths, and symlink escapes. |
|
|
43
|
-
| ComfyUI proxy | Fetches recognized ComfyUI media URLs server-side from the configured origin, including for remote users and HTTPS pages. |
|
|
43
|
+
| Optional ComfyUI proxy | Fetches recognized ComfyUI media URLs server-side from the configured origin, including for remote users and HTTPS pages. |
|
|
44
44
|
| Bounded transfers | Limits each file or response to 48 MiB and remote requests to 20 seconds. |
|
|
45
|
-
| User controls | Provides auto-render, per-turn item limit, media height, and ComfyUI origin settings. |
|
|
45
|
+
| User controls | Provides auto-render, per-turn item limit, media height, and optional ComfyUI origin settings. |
|
|
46
|
+
|
|
47
|
+
> [!NOTE]
|
|
48
|
+
> ComfyUI is not required. Workspace files and regular HTTP(S) media URLs work
|
|
49
|
+
> when ComfyUI is not installed or running; its proxy is activated only for
|
|
50
|
+
> recognized ComfyUI URLs.
|
|
46
51
|
|
|
47
52
|
## Supported media
|
|
48
53
|
|
|
@@ -97,12 +102,15 @@ through [`cordis.patch.yml`](cordis.patch.yml).
|
|
|
97
102
|
|
|
98
103
|
Open **Settings → 媒体预览 / Media preview**.
|
|
99
104
|
|
|
105
|
+
The navigation label and all setting copy follow DSH's active UI language and
|
|
106
|
+
switch live between English and Chinese.
|
|
107
|
+
|
|
100
108
|
| Setting | Default | Allowed values |
|
|
101
109
|
| --- | --- | --- |
|
|
102
110
|
| Auto-render detected media | On | On / off |
|
|
103
111
|
| Maximum items per turn | `12` | `1`–`30` |
|
|
104
112
|
| Maximum media height | `380 px` | `160`–`1200 px` |
|
|
105
|
-
| ComfyUI origin | Empty | `http(s)://host[:port]` |
|
|
113
|
+
| ComfyUI origin (optional) | Empty | `http(s)://host[:port]` |
|
|
106
114
|
|
|
107
115
|
Settings are stored in the DSH settings document. Writes are available only on
|
|
108
116
|
loopback connections; remote browsers can read settings but cannot persist
|
|
@@ -110,6 +118,7 @@ changes.
|
|
|
110
118
|
|
|
111
119
|
### ComfyUI origin
|
|
112
120
|
|
|
121
|
+
- Skip this setting entirely if you do not use ComfyUI.
|
|
113
122
|
- Leave the field empty to use `http://127.0.0.1:8188`.
|
|
114
123
|
- Accepted forms are `http://host[:port]`, `https://host[:port]`, and bare
|
|
115
124
|
`host[:port]` (`http` is assumed).
|
package/README.zh-CN.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<a href="CHANGELOG.md"><img alt="最新标签" src="https://img.shields.io/github/v/tag/Wisdoverse/dsh-inline-media-viewer-plugin?style=flat-square&label=version"></a>
|
|
9
9
|
<a href="LICENSE"><img alt="许可证" src="https://img.shields.io/github/license/Wisdoverse/dsh-inline-media-viewer-plugin?style=flat-square"></a>
|
|
10
10
|
<a href="package.json"><img alt="主要语言" src="https://img.shields.io/github/languages/top/Wisdoverse/dsh-inline-media-viewer-plugin?style=flat-square"></a>
|
|
11
|
-
<a href="#配置"><img alt="
|
|
11
|
+
<a href="#配置"><img alt="可选 ComfyUI" src="https://img.shields.io/badge/ComfyUI-optional-ff6f00?style=flat-square"></a>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
14
|
<p align="center">
|
|
@@ -39,9 +39,13 @@ audio/sound.mp3 → <audio controls>
|
|
|
39
39
|
| --- | --- |
|
|
40
40
|
| 内联渲染 | 在提及媒体的聊天消息下方直接显示图像、视频和音频。 |
|
|
41
41
|
| 工作区安全读取 | 使用 `realpath` 解析本地路径,并拒绝目录穿越、工作区外路径和符号链接逃逸。 |
|
|
42
|
-
| ComfyUI 代理 | 由服务端从配置的源站获取识别到的 ComfyUI 媒体 URL,使远程用户和 HTTPS 页面也能正常查看。 |
|
|
42
|
+
| 可选 ComfyUI 代理 | 由服务端从配置的源站获取识别到的 ComfyUI 媒体 URL,使远程用户和 HTTPS 页面也能正常查看。 |
|
|
43
43
|
| 资源限制 | 每个文件或响应最大 48 MiB,远程请求最长 20 秒。 |
|
|
44
|
-
| 用户控制 |
|
|
44
|
+
| 用户控制 | 提供自动渲染、每条消息的媒体数量、媒体高度和可选的 ComfyUI 源站设置。 |
|
|
45
|
+
|
|
46
|
+
> [!NOTE]
|
|
47
|
+
> ComfyUI 不是必需依赖。即使没有安装或运行 ComfyUI,工作区文件和普通 HTTP(S)
|
|
48
|
+
> 媒体 URL 仍可正常使用;只有识别为 ComfyUI 的 URL 才会启用代理。
|
|
45
49
|
|
|
46
50
|
## 支持的媒体格式
|
|
47
51
|
|
|
@@ -95,17 +99,20 @@ dsh plugin --profile web add @wisdoverse/dsh-inline-media-viewer
|
|
|
95
99
|
|
|
96
100
|
打开 **设置 → 媒体预览 / Media preview**。
|
|
97
101
|
|
|
102
|
+
导航名称和全部设置文案会跟随 DSH 当前界面语言,在中文与英文之间实时切换。
|
|
103
|
+
|
|
98
104
|
| 设置项 | 默认值 | 可选范围 |
|
|
99
105
|
| --- | --- | --- |
|
|
100
106
|
| 自动渲染检测到的媒体 | 开启 | 开启 / 关闭 |
|
|
101
107
|
| 每条消息的最大媒体数量 | `12` | `1`–`30` |
|
|
102
108
|
| 媒体最大高度 | `380 px` | `160`–`1200 px` |
|
|
103
|
-
| ComfyUI
|
|
109
|
+
| ComfyUI 源站(可选) | 留空 | `http(s)://host[:port]` |
|
|
104
110
|
|
|
105
111
|
设置值保存在 DSH 设置文档中。只有回环连接可以写入;远程浏览器可以读取设置,但不能持久化修改。
|
|
106
112
|
|
|
107
113
|
### ComfyUI 源站
|
|
108
114
|
|
|
115
|
+
- 不使用 ComfyUI 时无需配置此项。
|
|
109
116
|
- 留空时使用 `http://127.0.0.1:8188`。
|
|
110
117
|
- 支持 `http://host[:port]`、`https://host[:port]` 和不带协议的
|
|
111
118
|
`host[:port]`(默认使用 `http`)。
|
package/SECURITY.md
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
# Security
|
|
2
|
-
|
|
3
|
-
This plugin renders media in a user's chat. It is a **local trust helper**, not
|
|
4
|
-
a security boundary: the conversation content it renders is produced by the
|
|
5
|
-
same session that views it. What shipping standards demand here is that the
|
|
6
|
-
plugin *cannot be turned into a wider primitive* — no arbitrary local file
|
|
7
|
-
exfiltration, no arbitrary SSRF, no unbounded memory use.
|
|
8
|
-
|
|
9
|
-
## Local file reads
|
|
10
|
-
|
|
11
|
-
- Only the session's workspace root is readable: `realpath(cwd)` + containment
|
|
12
|
-
check (`isInside`) against the resolved target. Symlink escapes, `..`
|
|
13
|
-
traversal, and out-of-workspace paths are rejected.
|
|
14
|
-
- Only known media extensions are accepted (MIME map in `lib.js`).
|
|
15
|
-
- Size cap: 48 MiB per file.
|
|
16
|
-
- The client must supply a valid session id; the workspace root is taken from
|
|
17
|
-
that session's header, never from client input.
|
|
18
|
-
|
|
19
|
-
## Remote (ComfyUI) proxy
|
|
20
|
-
|
|
21
|
-
- The fetch target is always the **configured ComfyUI origin** (default
|
|
22
|
-
`http://127.0.0.1:8188`, `comfyUrl` in the `inline-media` settings
|
|
23
|
-
namespace) — never the source host. Chat content can therefore only
|
|
24
|
-
select a path/query on a server the user configured, not an arbitrary
|
|
25
|
-
host.
|
|
26
|
-
- A source URL is accepted only when its host:port is a local alias
|
|
27
|
-
(`127.0.0.1` / `localhost` on port 8188) **or** matches the configured
|
|
28
|
-
origin; everything else is rejected before any network I/O.
|
|
29
|
-
- The configured address is validated to a bare `http(s)://host[:port]`
|
|
30
|
-
origin: credentials, paths, queries, hashes, and odd hostnames are
|
|
31
|
-
rejected. A non-empty invalid value fails remote reads with an explicit
|
|
32
|
-
error instead of silently retargeting; an empty value uses the built-in
|
|
33
|
-
default.
|
|
34
|
-
- Settings writes are loopback-only (see below), so only the local user
|
|
35
|
-
can point the proxy at another host — a remote viewer cannot retarget it.
|
|
36
|
-
- `redirect: "error"` — redirects are refused.
|
|
37
|
-
- 20 s timeout, 48 MiB response cap, and the response MIME must be
|
|
38
|
-
image/video/audio.
|
|
39
|
-
|
|
40
|
-
## Transport
|
|
41
|
-
|
|
42
|
-
- The media channel `/inline-media/read` is registered with the DSH
|
|
43
|
-
connection service (`authority: "trusted-host"`), so it runs under the same
|
|
44
|
-
browser-trust fence and session gating as DSH's own RPC surface.
|
|
45
|
-
- The client renderer never receives file system paths back — only `data:`
|
|
46
|
-
URLs — so a hostile session cannot use the channel as a file oracle for
|
|
47
|
-
paths the UI already knows.
|
|
48
|
-
|
|
49
|
-
## Settings
|
|
50
|
-
|
|
51
|
-
- Values are normalized client-side and validated server-side against the
|
|
52
|
-
schema (autoRender boolean; displayCap 1–30; imageMaxPx 160–1200;
|
|
53
|
-
comfyUrl string ≤ 512 chars, parsed to a bare origin at use time).
|
|
54
|
-
- The settings service only writes back for **loopback** connections; remote
|
|
55
|
-
browsers are read-only, so a remote viewer cannot persist state.
|
|
56
|
-
|
|
57
|
-
## Known limitations
|
|
58
|
-
|
|
59
|
-
- Remote (non-loopback) browsers cannot persist settings by design (DSH
|
|
60
|
-
settings writes are loopback-only).
|
|
61
|
-
- ComfyUI on a non-standard host/port: set the server address in the settings
|
|
62
|
-
page. The proxy fetches only from that configured origin, so it must be
|
|
63
|
-
reachable from the DSH host process — plain `http://` for a local install,
|
|
64
|
-
`https://` behind a TLS-terminating proxy. The loopback aliases
|
|
65
|
-
(`127.0.0.1`/`localhost` on port 8188) are always accepted as source
|
|
66
|
-
origins; editing `COMFY_HOSTS`/`COMFY_PORTS` is deliberate code surgery,
|
|
67
|
-
not a configuration surface.
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
This plugin renders media in a user's chat. It is a **local trust helper**, not
|
|
4
|
+
a security boundary: the conversation content it renders is produced by the
|
|
5
|
+
same session that views it. What shipping standards demand here is that the
|
|
6
|
+
plugin *cannot be turned into a wider primitive* — no arbitrary local file
|
|
7
|
+
exfiltration, no arbitrary SSRF, no unbounded memory use.
|
|
8
|
+
|
|
9
|
+
## Local file reads
|
|
10
|
+
|
|
11
|
+
- Only the session's workspace root is readable: `realpath(cwd)` + containment
|
|
12
|
+
check (`isInside`) against the resolved target. Symlink escapes, `..`
|
|
13
|
+
traversal, and out-of-workspace paths are rejected.
|
|
14
|
+
- Only known media extensions are accepted (MIME map in `lib.js`).
|
|
15
|
+
- Size cap: 48 MiB per file.
|
|
16
|
+
- The client must supply a valid session id; the workspace root is taken from
|
|
17
|
+
that session's header, never from client input.
|
|
18
|
+
|
|
19
|
+
## Remote (ComfyUI) proxy
|
|
20
|
+
|
|
21
|
+
- The fetch target is always the **configured ComfyUI origin** (default
|
|
22
|
+
`http://127.0.0.1:8188`, `comfyUrl` in the `inline-media` settings
|
|
23
|
+
namespace) — never the source host. Chat content can therefore only
|
|
24
|
+
select a path/query on a server the user configured, not an arbitrary
|
|
25
|
+
host.
|
|
26
|
+
- A source URL is accepted only when its host:port is a local alias
|
|
27
|
+
(`127.0.0.1` / `localhost` on port 8188) **or** matches the configured
|
|
28
|
+
origin; everything else is rejected before any network I/O.
|
|
29
|
+
- The configured address is validated to a bare `http(s)://host[:port]`
|
|
30
|
+
origin: credentials, paths, queries, hashes, and odd hostnames are
|
|
31
|
+
rejected. A non-empty invalid value fails remote reads with an explicit
|
|
32
|
+
error instead of silently retargeting; an empty value uses the built-in
|
|
33
|
+
default.
|
|
34
|
+
- Settings writes are loopback-only (see below), so only the local user
|
|
35
|
+
can point the proxy at another host — a remote viewer cannot retarget it.
|
|
36
|
+
- `redirect: "error"` — redirects are refused.
|
|
37
|
+
- 20 s timeout, 48 MiB response cap, and the response MIME must be
|
|
38
|
+
image/video/audio.
|
|
39
|
+
|
|
40
|
+
## Transport
|
|
41
|
+
|
|
42
|
+
- The media channel `/inline-media/read` is registered with the DSH
|
|
43
|
+
connection service (`authority: "trusted-host"`), so it runs under the same
|
|
44
|
+
browser-trust fence and session gating as DSH's own RPC surface.
|
|
45
|
+
- The client renderer never receives file system paths back — only `data:`
|
|
46
|
+
URLs — so a hostile session cannot use the channel as a file oracle for
|
|
47
|
+
paths the UI already knows.
|
|
48
|
+
|
|
49
|
+
## Settings
|
|
50
|
+
|
|
51
|
+
- Values are normalized client-side and validated server-side against the
|
|
52
|
+
schema (autoRender boolean; displayCap 1–30; imageMaxPx 160–1200;
|
|
53
|
+
comfyUrl string ≤ 512 chars, parsed to a bare origin at use time).
|
|
54
|
+
- The settings service only writes back for **loopback** connections; remote
|
|
55
|
+
browsers are read-only, so a remote viewer cannot persist state.
|
|
56
|
+
|
|
57
|
+
## Known limitations
|
|
58
|
+
|
|
59
|
+
- Remote (non-loopback) browsers cannot persist settings by design (DSH
|
|
60
|
+
settings writes are loopback-only).
|
|
61
|
+
- ComfyUI on a non-standard host/port: set the server address in the settings
|
|
62
|
+
page. The proxy fetches only from that configured origin, so it must be
|
|
63
|
+
reachable from the DSH host process — plain `http://` for a local install,
|
|
64
|
+
`https://` behind a TLS-terminating proxy. The loopback aliases
|
|
65
|
+
(`127.0.0.1`/`localhost` on port 8188) are always accepted as source
|
|
66
|
+
origins; editing `COMFY_HOSTS`/`COMFY_PORTS` is deliberate code surgery,
|
|
67
|
+
not a configuration surface.
|