comfyui-mcp 0.8.0 → 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 +83 -0
- package/CONTRIBUTING.md +137 -0
- package/README.md +5 -4
- package/design/remote-and-cloud-modes.md +113 -0
- package/dist/comfyui/client.d.ts.map +1 -1
- package/dist/comfyui/client.js +53 -2
- package/dist/comfyui/client.js.map +1 -1
- package/dist/comfyui/cloud-client.d.ts +37 -0
- package/dist/comfyui/cloud-client.d.ts.map +1 -0
- package/dist/comfyui/cloud-client.js +190 -0
- package/dist/comfyui/cloud-client.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +80 -7
- package/dist/config.js.map +1 -1
- package/dist/experimental/chat-handler.d.ts +6 -19
- package/dist/experimental/chat-handler.d.ts.map +1 -1
- package/dist/experimental/chat-handler.js +36 -41
- package/dist/experimental/chat-handler.js.map +1 -1
- package/dist/experimental/provider-registry.d.ts +2 -6
- package/dist/experimental/provider-registry.d.ts.map +1 -1
- package/dist/experimental/provider-registry.js +36 -28
- package/dist/experimental/provider-registry.js.map +1 -1
- package/dist/services/health-check.d.ts +6 -0
- package/dist/services/health-check.d.ts.map +1 -0
- package/dist/services/health-check.js +110 -0
- package/dist/services/health-check.js.map +1 -0
- package/dist/services/job-watcher.d.ts.map +1 -1
- package/dist/services/job-watcher.js +59 -47
- package/dist/services/job-watcher.js.map +1 -1
- package/dist/services/registry-client.d.ts.map +1 -1
- package/dist/services/registry-client.js +53 -7
- package/dist/services/registry-client.js.map +1 -1
- package/dist/services/storage/azure-blob.d.ts.map +1 -1
- package/dist/services/storage/azure-blob.js +18 -8
- package/dist/services/storage/azure-blob.js.map +1 -1
- package/dist/services/storage/s3.d.ts.map +1 -1
- package/dist/services/storage/s3.js +13 -4
- package/dist/services/storage/s3.js.map +1 -1
- package/dist/services/tunnel.d.ts.map +1 -1
- package/dist/services/tunnel.js +9 -1
- package/dist/services/tunnel.js.map +1 -1
- package/dist/tools/health-check.d.ts +3 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +30 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/image-management.d.ts.map +1 -1
- package/dist/tools/image-management.js +27 -83
- package/dist/tools/image-management.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/utils/optional-dep.d.ts +5 -0
- package/dist/utils/optional-dep.d.ts.map +1 -0
- package/dist/utils/optional-dep.js +29 -0
- package/dist/utils/optional-dep.js.map +1 -0
- package/package.json +16 -8
- package/scripts/gen-tool-docs.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,87 @@ All notable changes to this project are documented here. This project adheres to
|
|
|
4
4
|
[Semantic Versioning](https://semver.org/) and the format follows
|
|
5
5
|
[Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## [0.9.0] - 2026-06-01
|
|
8
|
+
|
|
9
|
+
Three deployment modes, slimmer install footprint, and first-class
|
|
10
|
+
[Comfy Cloud](https://cloud.comfy.org) support — built from a survey of
|
|
11
|
+
forks and a port of the cloud-dispatch architecture from
|
|
12
|
+
[@picoSols](https://github.com/picoSols)'s `comfyui-cloud-mcp` fork.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **Comfy Cloud mode** — set `COMFYUI_API_KEY` to route HTTP-backed primitives
|
|
17
|
+
(enqueue, history, system stats, queue, view, upload) to `cloud.comfy.org`
|
|
18
|
+
with `X-API-Key` authentication. WebSocket-bound and local-FS/process
|
|
19
|
+
tools throw a clear `CLOUD_UNSUPPORTED` error in this mode. New
|
|
20
|
+
`src/comfyui/cloud-client.ts` mirrors the local client interface so the
|
|
21
|
+
rest of the server is transparent to which backend it's talking to.
|
|
22
|
+
Architecture and dispatcher pattern originally shipped by
|
|
23
|
+
[@picoSols](https://github.com/picoSols) in
|
|
24
|
+
[`picoSols/comfyui-cloud-mcp@7a812069`](https://github.com/picoSols/comfyui-cloud-mcp/commit/7a812069).
|
|
25
|
+
- **Explicit remote mode + smart-detect** — when `--comfyui-url` points at a
|
|
26
|
+
non-loopback host (anything other than `127.0.0.1` / `localhost` / `::1` /
|
|
27
|
+
`0.0.0.0`), the server skips `COMFYUI_PATH` auto-detection. This closes
|
|
28
|
+
the root cause behind the 0.8.1 `upload_*` fix — a stale local install can
|
|
29
|
+
no longer silently absorb uploads/downloads the agent intended for the
|
|
30
|
+
remote target. An explicit `COMFYUI_PATH` env var still wins.
|
|
31
|
+
- **`isCloudMode()` / `isRemoteMode()` / `isLocalMode()`** config helpers and
|
|
32
|
+
`COMFYUI_CLOUD_URL` (defaults to `https://cloud.comfy.org`).
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- **Slim install** — moved seven heavy/feature-gated packages out of
|
|
37
|
+
`dependencies` into `optionalDependencies` and dynamic-import them lazily
|
|
38
|
+
via a new `requireOptionalDep` helper:
|
|
39
|
+
`@aws-sdk/client-s3`, `@azure/storage-blob`, `cloudflared`,
|
|
40
|
+
`ai`, `@ai-sdk/anthropic`, `@ai-sdk/google`, `@ai-sdk/openai`. A
|
|
41
|
+
`npm install --no-optional comfyui-mcp` now yields a working core server;
|
|
42
|
+
features that need a missing optional dep surface a clear
|
|
43
|
+
`OPTIONAL_DEP_MISSING` error with the exact `npm install <pkg>` hint.
|
|
44
|
+
|
|
45
|
+
### Documentation
|
|
46
|
+
|
|
47
|
+
- New "Deployment modes" section in `docs/configuration.mdx` covering the
|
|
48
|
+
local / remote / cloud feature parity matrix and the `COMFYUI_API_KEY` /
|
|
49
|
+
`COMFYUI_CLOUD_URL` env vars.
|
|
50
|
+
|
|
51
|
+
## [0.8.1] - 2026-06-01
|
|
52
|
+
|
|
53
|
+
Bug-fix release picking up upstream contributions from
|
|
54
|
+
[@joaolvivas](https://github.com/joaolvivas)'s fork of comfyui-mcp.
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- **`health_check`** — single-call pre-flight diagnostic that reports
|
|
59
|
+
ComfyUI/Python/PyTorch versions, GPU + VRAM, queue depth, per-category
|
|
60
|
+
`/models` populations (catches empty-dropdown surprises from a
|
|
61
|
+
misconfigured `extra_model_paths.yaml`), and recent errors from
|
|
62
|
+
`/internal/logs`. Read-only. Useful before a long batch or when triaging an
|
|
63
|
+
unexplained failure. Originally contributed by
|
|
64
|
+
[@joaolvivas](https://github.com/joaolvivas) in
|
|
65
|
+
[`joaolvivas/comfyui-mcp-byjlucas@de82ecda`](https://github.com/joaolvivas/comfyui-mcp-byjlucas/commit/de82ecda).
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
|
|
69
|
+
- **`search_custom_nodes`** — `api.comfy.org/nodes` accepts a `search` query
|
|
70
|
+
parameter but ignores it server-side, returning the same paginated default
|
|
71
|
+
list regardless of query. We now fetch a larger window (limit=100) and
|
|
72
|
+
rank-filter client-side by id / name / author / description with a
|
|
73
|
+
popularity boost, so query-relevant packs actually appear. Diagnosed and
|
|
74
|
+
patched by [@joaolvivas](https://github.com/joaolvivas) in
|
|
75
|
+
[`joaolvivas/comfyui-mcp-byjlucas@f066b597`](https://github.com/joaolvivas/comfyui-mcp-byjlucas/commit/f066b597);
|
|
76
|
+
port adds a guard so popularity no longer inflates non-matching packs.
|
|
77
|
+
- **`upload_image` / `upload_video` / `upload_audio`** — HTTP-only.
|
|
78
|
+
Previously these tools fell back to a local filesystem copy if HTTP upload
|
|
79
|
+
failed and `COMFYUI_PATH` was set. When `COMFYUI_PATH` was auto-detected to
|
|
80
|
+
an unrelated install (common for users targeting a remote `--comfyui-url`),
|
|
81
|
+
the fallback wrote the file to the wrong tree and reported success, while
|
|
82
|
+
the remote ComfyUI never received it — the next `LoadImage` then failed
|
|
83
|
+
mysteriously. Now HTTP-only against the connected ComfyUI's
|
|
84
|
+
`/upload/image` endpoint, which works for both local and remote. Diagnosed
|
|
85
|
+
and patched by [@joaolvivas](https://github.com/joaolvivas) in
|
|
86
|
+
[`joaolvivas/comfyui-mcp-byjlucas@089180ad`](https://github.com/joaolvivas/comfyui-mcp-byjlucas/commit/089180ad).
|
|
87
|
+
|
|
7
88
|
## [0.8.0] - 2026-05-26
|
|
8
89
|
|
|
9
90
|
Completes the custom-node authoring lifecycle, adds cloud storage I/O and
|
|
@@ -171,6 +252,8 @@ subprocess fallback where the API can't do the job.
|
|
|
171
252
|
|
|
172
253
|
Earlier releases predate this changelog.
|
|
173
254
|
|
|
255
|
+
[0.9.0]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.9.0
|
|
256
|
+
[0.8.1]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.8.1
|
|
174
257
|
[0.8.0]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.8.0
|
|
175
258
|
[0.7.0]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.7.0
|
|
176
259
|
[0.6.1]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.6.1
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Contributing to comfyui-mcp
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in improving **comfyui-mcp** — an MCP server (and Claude Code plugin)
|
|
4
|
+
that lets an AI agent drive [ComfyUI](https://github.com/comfyanonymous/ComfyUI). This guide covers
|
|
5
|
+
the dev setup, project conventions, how to add a tool, and how releases work.
|
|
6
|
+
|
|
7
|
+
By contributing you agree your contributions are licensed under the project's [MIT License](./LICENSE).
|
|
8
|
+
|
|
9
|
+
## Getting started
|
|
10
|
+
|
|
11
|
+
Requirements: **Node ≥ 22** and npm (the repo is committed with `package-lock.json`; npm is the
|
|
12
|
+
supported dev path).
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
git clone https://github.com/artokun/comfyui-mcp
|
|
16
|
+
cd comfyui-mcp
|
|
17
|
+
npm install # builds native deps (better-sqlite3, sharp)
|
|
18
|
+
npm run build # tsc → dist/
|
|
19
|
+
npm test # vitest
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- **`npm run build`** — type-checks and compiles to `dist/` (`tsc`).
|
|
23
|
+
- **`npm run lint`** — type-check only (`tsc --noEmit`).
|
|
24
|
+
- **`npm test`** / **`npm run test:watch`** — the vitest suite.
|
|
25
|
+
- **`npm run dev`** — run the server from source via `tsx`.
|
|
26
|
+
- **`npm run docs:gen`** — regenerate the docs tool reference from the live schemas (see [Docs](#documentation)).
|
|
27
|
+
|
|
28
|
+
> **pnpm users:** pnpm 10 blocks dependency build scripts unless allow-listed. The native deps are
|
|
29
|
+
> already declared in `package.json` `pnpm.onlyBuiltDependencies` (`better-sqlite3`, `sharp`); if you
|
|
30
|
+
> add a dependency that needs a build step at runtime, add it there too.
|
|
31
|
+
|
|
32
|
+
Before opening a PR, make sure **`npm run build` and `npm test` both pass**.
|
|
33
|
+
|
|
34
|
+
## Project layout
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
src/
|
|
38
|
+
tools/ # thin MCP tool wrappers — one registerXxxTools(server) per file
|
|
39
|
+
index.ts # registers every tool group (the one shared wiring file)
|
|
40
|
+
services/ # the actual logic (network, subprocess, filesystem)
|
|
41
|
+
comfyui/ # ComfyUI client + workflow types
|
|
42
|
+
utils/ # errors, logger, shared helpers
|
|
43
|
+
__tests__/ # vitest tests, mirroring the source path
|
|
44
|
+
scripts/ # build/docs/util scripts (gen-tool-docs.ts, postinstall.mjs, …)
|
|
45
|
+
docs/ # Mintlify docs site (tool reference is GENERATED — see below)
|
|
46
|
+
plugin/ # the Claude Code plugin (skills, agents, slash commands, hooks)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Separation of concerns:** business logic lives in `src/services/<name>.ts`; the matching
|
|
50
|
+
`src/tools/<name>.ts` is a thin wrapper that defines the MCP tool and calls the service.
|
|
51
|
+
|
|
52
|
+
## Conventions
|
|
53
|
+
|
|
54
|
+
- **ESM** — this is an ESM package; **relative imports must use the `.js` extension**
|
|
55
|
+
(`import { foo } from "./foo.js"`), even from `.ts` files.
|
|
56
|
+
- **Errors** — throw typed errors from `src/utils/errors.ts` (`ComfyUIError`, `ValidationError`,
|
|
57
|
+
`ProcessControlError`, …) and convert them at the tool boundary with `errorToToolResult(err)`.
|
|
58
|
+
- **Local vs remote** — comfyui-mcp can target a remote ComfyUI (`--comfyui-url`). Tools that need a
|
|
59
|
+
local install must read `config.comfyuiPath` and throw a clear error when it's undefined.
|
|
60
|
+
- **Security** (please respect these — they're enforced in review):
|
|
61
|
+
- Secrets (API tokens, registry keys, cloud credentials) travel in **headers or env**, never in
|
|
62
|
+
URLs, argv, or logs. Redact secrets from any logged URL.
|
|
63
|
+
- Validate filesystem paths against traversal/symlink escapes (resolve + contain to the intended root).
|
|
64
|
+
- Validate values that reach a subprocess argv (reject leading `-` / control chars; use
|
|
65
|
+
`--end-of-options` for git, etc.).
|
|
66
|
+
|
|
67
|
+
## Adding a new MCP tool
|
|
68
|
+
|
|
69
|
+
Use `src/tools/registry-search.ts` and `src/tools/process-control.ts` as canonical examples.
|
|
70
|
+
|
|
71
|
+
1. **Service** — add `src/services/<name>.ts` with the logic and an exported function. Keep network
|
|
72
|
+
in `fetch`, subprocess in `node:child_process`. Make I/O seams injectable so they're testable.
|
|
73
|
+
2. **Tool** — add `src/tools/<name>.ts` exporting `registerXxxTools(server: McpServer): void`. Inside,
|
|
74
|
+
call `server.tool(name, description, zodShape, handler)`. Handlers return
|
|
75
|
+
`{ content: [{ type: "text" as const, text }] }` and wrap failures with `errorToToolResult(err)`.
|
|
76
|
+
3. **Wire it** — add one import and one `registerXxxTools(server);` call in `src/tools/index.ts`,
|
|
77
|
+
**before** `await registerAutoloadedWorkflows(server);`.
|
|
78
|
+
4. **Categorize for docs** — add the new tool name to the right category in
|
|
79
|
+
`scripts/gen-tool-docs.ts` (`CATEGORIES`), then run `npm run docs:gen` (it warns about any
|
|
80
|
+
uncategorized tool).
|
|
81
|
+
5. **Test** — add `src/__tests__/…` mirroring the source path. Mock `global.fetch`,
|
|
82
|
+
`node:child_process`, and `node:fs` — **no real network, disk, or process side effects**.
|
|
83
|
+
|
|
84
|
+
### Tool descriptions matter
|
|
85
|
+
|
|
86
|
+
Descriptions are the agent's only guide to a tool. Write them to answer three questions:
|
|
87
|
+
**what it does to the world** (read-only? mutates disk? requires a running server? irreversible?),
|
|
88
|
+
**when to use it vs. a sibling tool**, and **what each parameter means beyond its type**. Don't just
|
|
89
|
+
restate the schema. (This is graded by Glama's TDQS — see the [blog post](https://comfyui-mcp.artokun.io/docs/blog/comfyui-mcp-tdqs-case-study).)
|
|
90
|
+
|
|
91
|
+
## Documentation
|
|
92
|
+
|
|
93
|
+
The hosted docs live in `docs/` (Mintlify). The **Tool Reference is generated** from the live tool
|
|
94
|
+
schemas — **do not hand-edit `docs/tools/*.mdx`**. After changing any tool (name, description,
|
|
95
|
+
params), run:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm run docs:gen
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
and commit the regenerated MDX. Guide pages (`docs/*.mdx`) are hand-written; edit those directly.
|
|
102
|
+
Run `cd docs && npx mint broken-links` to validate links.
|
|
103
|
+
|
|
104
|
+
## Optional / experimental dependencies
|
|
105
|
+
|
|
106
|
+
Cloud storage (`@aws-sdk/client-s3`, `@azure/storage-blob`) and the experimental agent-panel POC
|
|
107
|
+
(`ai`, `@ai-sdk/*`, `cloudflared`) power optional/flag-gated features. Keep new heavy or
|
|
108
|
+
feature-specific dependencies out of the core hot path, and prefer lazy/dynamic imports so a base
|
|
109
|
+
install stays lean.
|
|
110
|
+
|
|
111
|
+
## Commits & pull requests
|
|
112
|
+
|
|
113
|
+
- **Branch** off `main` (`feat/…`, `fix/…`, `docs/…`).
|
|
114
|
+
- Use **Conventional Commit** prefixes (`feat:`, `fix:`, `docs:`, `chore:`, `test:`, `refactor:`).
|
|
115
|
+
- Keep PRs focused; include tests for behavior changes.
|
|
116
|
+
- **PR checklist:** `npm run build` ✓ · `npm test` ✓ · docs regenerated if tools changed ✓ ·
|
|
117
|
+
a clear description of what and why.
|
|
118
|
+
|
|
119
|
+
Open a GitHub issue first for large or potentially-breaking changes so we can align on the approach.
|
|
120
|
+
|
|
121
|
+
## Releases (maintainers)
|
|
122
|
+
|
|
123
|
+
Releases are automated — **never `npm publish` manually**. Bump + tag, and pushing the `v*` tag
|
|
124
|
+
triggers the GitHub Actions workflow that publishes to npm with provenance (OIDC):
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npm run release # patch
|
|
128
|
+
npm run release:minor # minor
|
|
129
|
+
npm run release:major # major
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Each script runs `npm version <bump>` (creating the commit + tag) and `git push --follow-tags`.
|
|
133
|
+
Update `CHANGELOG.md` (Keep a Changelog) and regenerate docs before tagging.
|
|
134
|
+
|
|
135
|
+
## Questions
|
|
136
|
+
|
|
137
|
+
Open a [GitHub issue](https://github.com/artokun/comfyui-mcp/issues) or start a discussion. Thanks for contributing! 🎨
|
package/README.md
CHANGED
|
@@ -641,10 +641,11 @@ Use `/comfy:install <pack>` to install missing node packs from the registry. The
|
|
|
641
641
|
|
|
642
642
|
## Contributing
|
|
643
643
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
644
|
+
Contributions are welcome! See **[CONTRIBUTING.md](./CONTRIBUTING.md)** for the dev setup, project
|
|
645
|
+
conventions, how to add an MCP tool, and the release process.
|
|
646
|
+
|
|
647
|
+
Quick version: fork → branch (`feat/my-feature`) → make changes (ensure `npm run build` and
|
|
648
|
+
`npm test` pass; run `npm run docs:gen` if you touched tools) → open a PR.
|
|
648
649
|
|
|
649
650
|
---
|
|
650
651
|
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Design — Remote ComfyUI and Comfy Cloud modes
|
|
2
|
+
|
|
3
|
+
**Status:** Draft, 2026-06-01
|
|
4
|
+
**Beads:** `comfyui-mcp-m1p` (Comfy Cloud evaluation)
|
|
5
|
+
**Sources surveyed:**
|
|
6
|
+
- `picoSols/comfyui-cloud-mcp` — added Comfy Cloud (`cloud.comfy.org`) as a deployment target
|
|
7
|
+
- `joaolvivas/comfyui-mcp-byjlucas` — HTTP-first refactor of file-bound tools for remote setups
|
|
8
|
+
|
|
9
|
+
## Why this doc
|
|
10
|
+
|
|
11
|
+
Today `comfyui-mcp` is **local-first**: many tools need `config.comfyuiPath` (process control, model removal, manifest, install, etc.) and the rest reach a "ComfyUI" identified by host:port. Two forks have independently pushed the project toward two related but distinct deployment shapes:
|
|
12
|
+
|
|
13
|
+
1. **Remote ComfyUI** — user runs ComfyUI on a RunPod / server / VPS, reaches it via `--comfyui-url`. The HTTP API works; filesystem and process control do not. Today some of our "remote-friendly" tools still have local-filesystem fallbacks that hide failures.
|
|
14
|
+
2. **Comfy Cloud** — `cloud.comfy.org` exposes a ComfyUI-shaped REST API (no WebSocket, no `/internal/logs`, no process control) authenticated with `X-API-Key`. Users in this mode don't have a "ComfyUI process" at all.
|
|
15
|
+
|
|
16
|
+
We have a strategic decision to make: do we want to be the canonical MCP for **all three** (local, remote, cloud), or stay opinionated about local-first?
|
|
17
|
+
|
|
18
|
+
## Survey: picoSols Comfy Cloud fork
|
|
19
|
+
|
|
20
|
+
PR-equivalent: `picoSols/comfyui-cloud-mcp@7a812069` (feat: Comfy Cloud API support).
|
|
21
|
+
|
|
22
|
+
### Architecture they shipped
|
|
23
|
+
|
|
24
|
+
- Added `comfyuiApiKey` + `comfyuiCloudUrl` to `configSchema`. New env vars: `COMFYUI_API_KEY`, `COMFYUI_CLOUD_URL` (defaults to `https://cloud.comfy.org`).
|
|
25
|
+
- `isCloudMode(): boolean` — returns `!!parsedConfig.comfyuiApiKey`. Acts as the dispatch switch.
|
|
26
|
+
- In cloud mode, **skip local port auto-detection** entirely (no `detectComfyUIPort` call).
|
|
27
|
+
- New file `src/comfyui/cloud-client.ts` (~346 LOC) — re-implements the surface area that `src/comfyui/client.ts` exposes (enqueue, history, system stats, queue, interrupt, view, object info, samplers/schedulers/checkpoints/loras/vaes/upscalers/logs) against `cloud.comfy.org` using `X-API-Key` headers and raw `fetch`.
|
|
28
|
+
- `src/comfyui/client.ts` becomes a **dispatcher**:
|
|
29
|
+
- Functions that have a cloud equivalent get an `if (isCloudMode()) return cloudClient.fn(...)` prologue.
|
|
30
|
+
- Functions that fundamentally can't work in cloud mode (`getClient`, `connectClient`, `ensureConnected` — anything WebSocket-bound) call `requireLocalMode("op")` that throws `ComfyUIError("CLOUD_UNSUPPORTED")`.
|
|
31
|
+
- `JobWatcher` gate: WebSocket attach is wrapped in `if (!isCloudMode())`. Cloud mode falls through to the existing HTTP-polling path that the local watcher already uses as a fallback.
|
|
32
|
+
|
|
33
|
+
### What's missing / opinionated
|
|
34
|
+
|
|
35
|
+
- No model-management tools touched. In cloud mode, models are pre-provisioned by Comfy-Org — `download_model`, `remove_model`, `list_local_models` should either be no-ops or surface a cloud-specific listing endpoint.
|
|
36
|
+
- No `/internal/logs` equivalent in cloud — picoSols returns `[]`. Our `health_check` (just landed from João Lucas) would degrade gracefully there.
|
|
37
|
+
- No process control coverage — the fork doesn't say what happens, but our `requireLocalMode` shim would correctly reject `start_comfyui`/`stop_comfyui`/`restart_comfyui`/`install_comfyui`/`apply_manifest`/etc.
|
|
38
|
+
|
|
39
|
+
## Survey: João Lucas remote-HTTP refactor
|
|
40
|
+
|
|
41
|
+
PR-equivalents:
|
|
42
|
+
- `joaolvivas/comfyui-mcp-byjlucas@089180ad` — `upload_image` HTTP-only (removed deceptive filesystem fallback)
|
|
43
|
+
- `joaolvivas/comfyui-mcp-byjlucas@e2ae39c8` — same pattern across `image-management.ts` + `model-resolver.ts`
|
|
44
|
+
|
|
45
|
+
### The deceptive-fallback bug
|
|
46
|
+
|
|
47
|
+
Current `src/tools/image-management.ts:104-119` (and `upload_video` / `upload_audio` mirrors at L:208–230):
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
try {
|
|
51
|
+
// HTTP first (works remote)
|
|
52
|
+
const result = await uploadImageAuto(...);
|
|
53
|
+
return success;
|
|
54
|
+
} catch (httpErr) {
|
|
55
|
+
// Fallback: filesystem copy if COMFYUI_PATH is set
|
|
56
|
+
const result = await uploadImage(...);
|
|
57
|
+
return success; // ← LIES when COMFYUI_PATH is auto-detected stale
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The auto-detection in `config.ts` happily resolves `~/ComfyUI` or `/opt/ComfyUI` even when the user is targeting a remote `--comfyui-url`. If HTTP fails (server down, wrong URL, network blip), the fallback writes the file into an **unrelated local install** and returns "success" — but the remote ComfyUI the agent will actually `enqueue` against never received the file. The next workflow run fails with "LoadImage: file not found" and the agent has no breadcrumb back to the upload step.
|
|
62
|
+
|
|
63
|
+
João's fix: drop the fallback entirely. HTTP-only, fail loud. His tool description updates to "Works with both local and remote ComfyUI instances" (because the local HTTP endpoint of course also works).
|
|
64
|
+
|
|
65
|
+
**Recommendation:** Pull this in, separately from cloud support, as a 0.8.1 fix. Affects three tools: `upload_image`, `upload_video`, `upload_audio`.
|
|
66
|
+
|
|
67
|
+
### Other João changes in scope
|
|
68
|
+
|
|
69
|
+
- `model-resolver.ts` (+37/-7) — likely makes model-existence checks remote-friendly (instead of `existsSync(localPath)`, ask ComfyUI via `/object_info` or `/models/{cat}`). Worth a closer read before deciding whether to port.
|
|
70
|
+
- `client.ts` (+70/-1) — HTTP-first paths for things we currently do filesystem-first.
|
|
71
|
+
- Partner-node auto-inject `api_key_comfy_org` (4b989e47) — comparison vs our existing `COMFY_API_KEY → extra_data` mechanism from 0.6.0. Likely duplicative.
|
|
72
|
+
|
|
73
|
+
## Proposed direction
|
|
74
|
+
|
|
75
|
+
### Three modes, three roles
|
|
76
|
+
|
|
77
|
+
| Mode | How user opts in | Local FS? | Process control? | WebSocket? | Process tools should… |
|
|
78
|
+
|---|---|---|---|---|---|
|
|
79
|
+
| **Local** | `COMFYUI_PATH` set or auto-detected | yes | yes | yes | work |
|
|
80
|
+
| **Remote** | `--comfyui-url` and no FS path (or FS path explicitly cleared) | no | no | yes | throw "remote-only target" |
|
|
81
|
+
| **Cloud** | `COMFYUI_API_KEY` set | no | no | no | throw "cloud-only target" |
|
|
82
|
+
|
|
83
|
+
Today we conflate "local" and "remote" because auto-detection silently fills in a local `COMFYUI_PATH` that may not match the `--comfyui-url` target. That's the root cause of João's deceptive-fallback bug.
|
|
84
|
+
|
|
85
|
+
### Phased adoption
|
|
86
|
+
|
|
87
|
+
**Phase 1 — Pull the bug fixes (no architecture change).** [0.8.1 patch]
|
|
88
|
+
- João's `upload_image`/`upload_video`/`upload_audio` HTTP-only fix.
|
|
89
|
+
- Read `model-resolver.ts` diff and decide on remote-aware model checks.
|
|
90
|
+
- Credit @joaolvivas in CHANGELOG.
|
|
91
|
+
|
|
92
|
+
**Phase 2 — Explicit remote mode.** [0.9.0]
|
|
93
|
+
- Add a `--remote-only` / `COMFYUI_REMOTE_ONLY=true` flag that suppresses `COMFYUI_PATH` auto-detection.
|
|
94
|
+
- All local-only tools (process control, install, manifest, model removal, model download cache materialization) check `config.comfyuiPath` and throw a clear `ProcessControlError("remote target — tool requires a local install path")` instead of silently degrading.
|
|
95
|
+
- Document the three modes explicitly in `docs/configuration.mdx`.
|
|
96
|
+
|
|
97
|
+
**Phase 3 — Comfy Cloud first-class.** [0.9.0 stretch or 0.10.0]
|
|
98
|
+
- Adopt picoSols's `isCloudMode()` + `cloud-client.ts` shape.
|
|
99
|
+
- Build the feature-parity matrix (which tools work in cloud? which throw?).
|
|
100
|
+
- Decide cloud-model-listing API (does `cloud.comfy.org` expose pre-provisioned model lists? if yes, wire `list_local_models` to it).
|
|
101
|
+
- Consider reaching out to Comfy-Org about a partnership listing.
|
|
102
|
+
- Credit @picoSols in CHANGELOG; consider co-authorship in commits.
|
|
103
|
+
|
|
104
|
+
### Open questions for the maintainer
|
|
105
|
+
|
|
106
|
+
1. Do we want to commit to cloud support? Strategic: it makes `comfyui-mcp` the right MCP for anyone using Comfy Cloud, which broadens the audience but also makes us a partner-of-record. If yes, an outreach to Comfy-Org alongside the implementation feels right.
|
|
107
|
+
2. For Phase 2's explicit remote mode — do we silently fix the auto-detection (don't fill in `COMFYUI_PATH` if `--comfyui-url` is a non-loopback host) or require users to opt in?
|
|
108
|
+
3. For the `upload_*` fix: ship as 0.8.1 patch alongside the search/health fixes from `df8050e`, or wait for the bigger 0.9.0 mode rework?
|
|
109
|
+
|
|
110
|
+
## Attribution
|
|
111
|
+
|
|
112
|
+
- **Comfy Cloud architecture, dispatch pattern, cloud-client.ts shape:** [@picoSols](https://github.com/picoSols) — `picoSols/comfyui-cloud-mcp@7a812069` (2026-03-25).
|
|
113
|
+
- **HTTP-first refactor + deceptive-fallback diagnosis:** [@joaolvivas](https://github.com/joaolvivas) — `joaolvivas/comfyui-mcp-byjlucas@089180ad` and `@e2ae39c8` (2026-05-12).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/comfyui/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/comfyui/client.ts"],"names":[],"mappings":"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"}
|
package/dist/comfyui/client.js
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import { Client } from "@stable-canvas/comfyui-client";
|
|
2
|
-
import { config, getComfyUIApiHost, getComfyUIProtocol } from "../config.js";
|
|
2
|
+
import { config, getComfyUIApiHost, getComfyUIProtocol, isCloudMode, } from "../config.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { ConnectionError } from "../utils/errors.js";
|
|
4
|
+
import { ComfyUIError, ConnectionError } from "../utils/errors.js";
|
|
5
|
+
import * as cloudClient from "./cloud-client.js";
|
|
6
|
+
// Functions that fundamentally require a local ComfyUI process (WebSocket-bound
|
|
7
|
+
// session, local `client.fetchApi` paths, etc.) throw via this guard when the
|
|
8
|
+
// server is configured for Comfy Cloud — there is no WebSocket to attach to
|
|
9
|
+
// and no local socket to call. Dispatcher pattern from @picoSols
|
|
10
|
+
// (picoSols/comfyui-cloud-mcp@7a812069).
|
|
11
|
+
function requireLocalMode(op) {
|
|
12
|
+
if (isCloudMode()) {
|
|
13
|
+
throw new ComfyUIError(`${op} is not supported in Comfy Cloud mode. ` +
|
|
14
|
+
`Unset COMFYUI_API_KEY to target a local/remote ComfyUI.`, "CLOUD_UNSUPPORTED");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
5
17
|
let clientInstance = null;
|
|
6
18
|
export function getClient() {
|
|
19
|
+
requireLocalMode("getClient");
|
|
7
20
|
if (!clientInstance) {
|
|
8
21
|
clientInstance = new Client({
|
|
9
22
|
api_host: getComfyUIApiHost(),
|
|
@@ -18,6 +31,7 @@ export function getClient() {
|
|
|
18
31
|
return clientInstance;
|
|
19
32
|
}
|
|
20
33
|
export async function connectClient() {
|
|
34
|
+
requireLocalMode("connectClient");
|
|
21
35
|
const client = getClient();
|
|
22
36
|
try {
|
|
23
37
|
await client.connect();
|
|
@@ -33,6 +47,7 @@ export async function connectClient() {
|
|
|
33
47
|
* Only needed before WebSocket-dependent operations (enqueue with progress tracking).
|
|
34
48
|
*/
|
|
35
49
|
export async function ensureConnected() {
|
|
50
|
+
requireLocalMode("ensureConnected");
|
|
36
51
|
const client = getClient();
|
|
37
52
|
// If the socket looks healthy, return immediately
|
|
38
53
|
if (!client.closed) {
|
|
@@ -57,16 +72,22 @@ export async function ensureConnected() {
|
|
|
57
72
|
}
|
|
58
73
|
}
|
|
59
74
|
export async function getSystemStats() {
|
|
75
|
+
if (isCloudMode())
|
|
76
|
+
return cloudClient.getSystemStats();
|
|
60
77
|
const client = getClient();
|
|
61
78
|
const stats = await client.getSystemStats();
|
|
62
79
|
return stats;
|
|
63
80
|
}
|
|
64
81
|
export async function getObjectInfo() {
|
|
82
|
+
if (isCloudMode())
|
|
83
|
+
return cloudClient.getObjectInfo();
|
|
65
84
|
const client = getClient();
|
|
66
85
|
const info = await client.getNodeDefs();
|
|
67
86
|
return info;
|
|
68
87
|
}
|
|
69
88
|
export async function getQueue() {
|
|
89
|
+
if (isCloudMode())
|
|
90
|
+
return cloudClient.getQueue();
|
|
70
91
|
const client = getClient();
|
|
71
92
|
const queue = await client.getQueue();
|
|
72
93
|
return {
|
|
@@ -75,6 +96,8 @@ export async function getQueue() {
|
|
|
75
96
|
};
|
|
76
97
|
}
|
|
77
98
|
export async function interrupt(promptId) {
|
|
99
|
+
if (isCloudMode())
|
|
100
|
+
return cloudClient.interrupt(promptId);
|
|
78
101
|
const client = getClient();
|
|
79
102
|
await client.interrupt(promptId ?? null);
|
|
80
103
|
}
|
|
@@ -83,6 +106,8 @@ export async function interrupt(promptId) {
|
|
|
83
106
|
* Returns prompt_id and queue position immediately.
|
|
84
107
|
*/
|
|
85
108
|
export async function enqueuePrompt(workflow, extraData) {
|
|
109
|
+
if (isCloudMode())
|
|
110
|
+
return cloudClient.enqueuePrompt(workflow, extraData);
|
|
86
111
|
const client = getClient();
|
|
87
112
|
// The SDK's _enqueue_prompt does not forward `extra_data`, which is how
|
|
88
113
|
// comfy.org API-node credentials (api_key_comfy_org / auth_token_comfy_org)
|
|
@@ -115,6 +140,8 @@ export async function enqueuePrompt(workflow, extraData) {
|
|
|
115
140
|
* Remove a specific pending job from the queue by prompt_id.
|
|
116
141
|
*/
|
|
117
142
|
export async function deleteQueueItem(id) {
|
|
143
|
+
if (isCloudMode())
|
|
144
|
+
return cloudClient.deleteQueueItem(id);
|
|
118
145
|
const client = getClient();
|
|
119
146
|
await client.deleteItem("queue", id);
|
|
120
147
|
}
|
|
@@ -122,30 +149,44 @@ export async function deleteQueueItem(id) {
|
|
|
122
149
|
* Clear all pending jobs from the queue (doesn't affect running job).
|
|
123
150
|
*/
|
|
124
151
|
export async function clearQueue() {
|
|
152
|
+
if (isCloudMode())
|
|
153
|
+
return cloudClient.clearQueue();
|
|
125
154
|
const client = getClient();
|
|
126
155
|
await client.clearItems("queue");
|
|
127
156
|
}
|
|
128
157
|
export async function getSamplers() {
|
|
158
|
+
if (isCloudMode())
|
|
159
|
+
return cloudClient.getSamplers();
|
|
129
160
|
const client = getClient();
|
|
130
161
|
return client.getSamplers();
|
|
131
162
|
}
|
|
132
163
|
export async function getSchedulers() {
|
|
164
|
+
if (isCloudMode())
|
|
165
|
+
return cloudClient.getSchedulers();
|
|
133
166
|
const client = getClient();
|
|
134
167
|
return client.getSchedulers();
|
|
135
168
|
}
|
|
136
169
|
export async function getCheckpoints() {
|
|
170
|
+
if (isCloudMode())
|
|
171
|
+
return cloudClient.getCheckpoints();
|
|
137
172
|
const client = getClient();
|
|
138
173
|
return client.getSDModels();
|
|
139
174
|
}
|
|
140
175
|
export async function getLoRAs() {
|
|
176
|
+
if (isCloudMode())
|
|
177
|
+
return cloudClient.getLoRAs();
|
|
141
178
|
const client = getClient();
|
|
142
179
|
return client.getLoRAs();
|
|
143
180
|
}
|
|
144
181
|
export async function getVAEs() {
|
|
182
|
+
if (isCloudMode())
|
|
183
|
+
return cloudClient.getVAEs();
|
|
145
184
|
const client = getClient();
|
|
146
185
|
return client.getVAEs();
|
|
147
186
|
}
|
|
148
187
|
export async function getUpscaleModels() {
|
|
188
|
+
if (isCloudMode())
|
|
189
|
+
return cloudClient.getUpscaleModels();
|
|
149
190
|
const client = getClient();
|
|
150
191
|
return client.getUpscaleModels();
|
|
151
192
|
}
|
|
@@ -162,9 +203,13 @@ export function resetClient() {
|
|
|
162
203
|
}
|
|
163
204
|
}
|
|
164
205
|
export function getComfyUIPath() {
|
|
206
|
+
if (isCloudMode())
|
|
207
|
+
return cloudClient.getComfyUIPath();
|
|
165
208
|
return config.comfyuiPath;
|
|
166
209
|
}
|
|
167
210
|
export async function getLogs() {
|
|
211
|
+
if (isCloudMode())
|
|
212
|
+
return cloudClient.getLogs();
|
|
168
213
|
const client = getClient();
|
|
169
214
|
const res = await client.fetchApi("/internal/logs");
|
|
170
215
|
const text = await res.text();
|
|
@@ -182,6 +227,8 @@ export async function getLogs() {
|
|
|
182
227
|
return text.split("\n").filter(Boolean);
|
|
183
228
|
}
|
|
184
229
|
export async function getHistory(promptId) {
|
|
230
|
+
if (isCloudMode())
|
|
231
|
+
return cloudClient.getHistory(promptId);
|
|
185
232
|
const client = getClient();
|
|
186
233
|
const path = promptId ? `/history/${promptId}` : "/history";
|
|
187
234
|
const res = await client.fetchApi(path);
|
|
@@ -192,6 +239,8 @@ export async function getHistory(promptId) {
|
|
|
192
239
|
* Works over HTTP — no local filesystem access needed.
|
|
193
240
|
*/
|
|
194
241
|
export async function fetchImage(filename, type = "output", subfolder = "") {
|
|
242
|
+
if (isCloudMode())
|
|
243
|
+
return cloudClient.fetchImage(filename, type, subfolder);
|
|
195
244
|
const client = getClient();
|
|
196
245
|
const params = new URLSearchParams({ filename, type, subfolder });
|
|
197
246
|
const res = await client.fetchApi(`/view?${params.toString()}`);
|
|
@@ -209,6 +258,8 @@ export async function fetchImage(filename, type = "output", subfolder = "") {
|
|
|
209
258
|
* Works over HTTP — no local filesystem access needed.
|
|
210
259
|
*/
|
|
211
260
|
export async function uploadImageHttp(filename, data, mimeType = "image/png") {
|
|
261
|
+
if (isCloudMode())
|
|
262
|
+
return cloudClient.uploadImageHttp(filename, data, mimeType);
|
|
212
263
|
const client = getClient();
|
|
213
264
|
const formData = new FormData();
|
|
214
265
|
const blob = new Blob([data], { type: mimeType });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/comfyui/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/comfyui/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { HistoryEntry } from "./client.js";
|
|
2
|
+
import type { ObjectInfo, QueueStatus, SystemStats } from "./types.js";
|
|
3
|
+
export interface CloudJobStatus {
|
|
4
|
+
status: "pending" | "in_progress" | "completed" | "failed";
|
|
5
|
+
prompt_id?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function enqueuePrompt(workflow: Record<string, unknown>, extraData?: Record<string, unknown>): Promise<{
|
|
9
|
+
prompt_id: string;
|
|
10
|
+
queue_remaining?: number;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function getHistory(promptId?: string): Promise<Record<string, HistoryEntry>>;
|
|
13
|
+
export declare function getSystemStats(): Promise<SystemStats>;
|
|
14
|
+
export declare function getQueue(): Promise<QueueStatus>;
|
|
15
|
+
export declare function interrupt(promptId?: string): Promise<void>;
|
|
16
|
+
export declare function deleteQueueItem(_id: string): Promise<void>;
|
|
17
|
+
export declare function clearQueue(): Promise<void>;
|
|
18
|
+
export declare function getJobStatus(promptId: string): Promise<CloudJobStatus>;
|
|
19
|
+
export declare function getObjectInfo(): Promise<ObjectInfo>;
|
|
20
|
+
export declare function getSamplers(): Promise<string[]>;
|
|
21
|
+
export declare function getSchedulers(): Promise<string[]>;
|
|
22
|
+
export declare function getCheckpoints(): Promise<string[]>;
|
|
23
|
+
export declare function getLoRAs(): Promise<string[]>;
|
|
24
|
+
export declare function getVAEs(): Promise<string[]>;
|
|
25
|
+
export declare function getUpscaleModels(): Promise<string[]>;
|
|
26
|
+
export declare function getLogs(): Promise<string[]>;
|
|
27
|
+
export declare function fetchImage(filename: string, type?: "output" | "input" | "temp", subfolder?: string): Promise<{
|
|
28
|
+
base64: string;
|
|
29
|
+
mimeType: string;
|
|
30
|
+
}>;
|
|
31
|
+
export declare function uploadImageHttp(filename: string, data: Buffer, mimeType?: string): Promise<{
|
|
32
|
+
name: string;
|
|
33
|
+
subfolder: string;
|
|
34
|
+
type: string;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function getComfyUIPath(): string | undefined;
|
|
37
|
+
//# sourceMappingURL=cloud-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../../src/comfyui/cloud-client.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2CvE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa1D;AAED,wBAAsB,UAAU,CAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAcvC;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CA0B3D;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAErD;AAED,wBAAsB,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAShE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhE;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAKhD;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAG5E;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAKzD;AAeD,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAErD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAEvD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAKxD;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAKlD;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAKjD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAK1D;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAKjD;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,QAAQ,GAAG,OAAO,GAAG,MAAiB,EAC5C,SAAS,SAAK,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/C;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAc,GACrB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAa5D;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD"}
|