@melite/models-trellis2-native 0.1.4-alpha → 0.2.0-alpha

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/README.md ADDED
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: TRELLIS.2 Native family — background-removed image to textured GLB through voxel structure, shape, and texture stages, with the mesh action on the ComfyUI engine.
3
+ kind: package-library
4
+ ---
5
+
6
+ # @melite/models-trellis2-native
7
+
8
+ `@melite/models-trellis2-native` is the model family package for TRELLIS.2 on native ComfyUI (`form_img_to_mesh`, genre 3d): background-removed conditioning flows to a voxel structure, a shape latent, and a texture atlas, saved as a `.glb`. The DECL declares the `mesh` action, a three-resolution variant rail, and the five-file lift-chain provisioning. The estate boot mounts it as a Cordis plugin through `ctx.models.registerFamily` inside `ctx.effect`; the img-to-mesh card binds the action. The lane is this package's own `actions.ts`, pinned to committed goldens.
9
+
10
+ ## Declaration
11
+
12
+ Variants: `1024` (default; BF16 at ~12 GB VRAM peak or INT8 ConvRot at ~8 GB), `1536` (hero quality; 16/10 GB), and a hidden fast `512`. Family defaults fix the sampler table (euler/normal structure and shape, euler/simple then euler/normal texture), `steps` 12 / `shape_steps` 20, `cfg` 7.5, remesh at 768 faces decimated to 700k, atlas 4096, AO 1024, normal 2048, `sd3_shift` 5, and `seed` 42. The `mesh` action requires `input_image` — the 3D lift is image-conditioned and takes no text prompt — and its facts door refuses any of the five load keys missing: `unet`, `vae`, `texture_vae`, `clip_vision`, `background_removal`. Provisions pin the weights, including `birefnet.safetensors` from Comfy-Org's BiRefNet repo for background removal. The build runs structure, shape, upsample, remesh, texture, and the atlas/AO/normal bakes, then saves through `MeshToFile3D` + `Save3DAdvanced`.
13
+
14
+ ## Model Experience
15
+
16
+ ### Request context and condition
17
+
18
+ #### What the model sees
19
+
20
+ - **input_image** — required; the source image the lift conditions on.
21
+ - **resolution / bg_removal** — the closed variant table and the birefnet on/off/auto pick.
22
+ - **sampler rows and seed** — the per-stage sampler/scheduler/steps/cfg table and the sentinel-minted seed.
23
+
24
+ #### Token effect
25
+
26
+ Zero-direct token effect — the fields ride the composed ComfyUI graph; no harness context is spent.
27
+
28
+ #### KV Cache effect
29
+
30
+ Independent — each mesh run is its own engine request; no shared prefix.
31
+
32
+ ## Known Limitations and Deferred Work
33
+
34
+ - **No text conditioning** — the lane accepts no prompt; shape intent must come from the image alone.
35
+ - **VRAM peaks are cell-declared** — the 8–16 GB figures are the DECL's measured rows, not runtime guarantees on every GPU.
36
+ - **Image quality ceiling** — background removal and texture fidelity are not verified against the running engine.
package/lib/actions.d.ts CHANGED
@@ -7,7 +7,6 @@ export type MeshFacts = {
7
7
  readonly vae: string;
8
8
  readonly texture_vae: string;
9
9
  readonly clip_vision: string;
10
- readonly background_removal: string;
11
10
  };
12
11
  /** The gated params doc the mesh segment reads (the card's schema
13
12
  * walk validated types and bounds — a same-process typed boundary;
@@ -21,6 +20,6 @@ export type MeshParams = Record<string, unknown>;
21
20
  * @returns the typed facts the segment factory reads */
22
21
  export declare function parseMeshFacts(raw: LaneInputsFacts): MeshFacts;
23
22
  /** The mesh action: trellis_t1 — DINOv3 conditioning (the image IS
24
- * the prompt; negative = ConditioningZeroOut). */
23
+ * the prompt; the negative is the conditioning's own output 1). */
25
24
  export declare const mesh: ComfyActionSpec<MeshParams, MeshFacts>;
26
25
  //# sourceMappingURL=actions.d.ts.map
package/lib/actions.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { requireText } from "@melite/comfyui-card-kit/facts";
2
- import { MESH_RESOLUTIONS, MESH_BG_MODES, MESH_ATLAS_SIZES, MESH_AO_SIZES, MESH_NORMAL_SIZES } from "@melite/comfyui-card-kit";
2
+ import { MESH_RESOLUTIONS, MESH_ATLAS_SIZES, MESH_AO_SIZES, MESH_NORMAL_SIZES, admitMeshLiftShared, isSpell } from "@melite/comfyui-card-kit";
3
3
  import { SAMPLER_OPTIONS, SCHEDULER_OPTIONS } from "@melite/comfyui-card-kit/vocab";
4
4
  /** The mesh facts door: the resolved lane_inputs parsed into the
5
5
  * closed shape — a missing load key refuses field-named here,
@@ -12,39 +12,19 @@ export function parseMeshFacts(raw) {
12
12
  vae: requireText(raw, 'vae', 'trellis2-native mesh'),
13
13
  texture_vae: requireText(raw, 'texture_vae', 'trellis2-native mesh'),
14
14
  clip_vision: requireText(raw, 'clip_vision', 'trellis2-native mesh'),
15
- background_removal: requireText(raw, 'background_removal', 'trellis2-native mesh'),
16
15
  };
17
16
  }
18
- const isSpell = (s) => s.startsWith('$');
19
- /** The lift arms' admission slice for THIS family (moved verbatim
20
- * from the kit's admitMeshLift — the required image and closed
21
- * sets refuse HERE, never in the schema): the source image,
22
- * resolution, bg mode, the bake-size table
23
- * (the pixal-only camera_fov row is pixal's, not ours). */
24
- function admitMeshLift(p) {
25
- if (!String(p.input_image || '').trim()) {
26
- throw new Error(`required param 'input_image' (Source image) missing on the img-to-mesh card — the 3D lift is image-conditioned (no text prompt rides this lane)`);
27
- }
28
- const MESH_RESOLUTIONS = ['1024', '1536'];
29
- const MESH_BG_MODES = ['auto', 'on', 'off'];
30
- const MESH_BAKE_SIZES = [
31
- ['atlas_size', ['2048', '4096']],
32
- ['ao_size', ['512', '1024']],
33
- ['normal_size', ['1024', '2048']],
34
- ];
35
- if (!MESH_RESOLUTIONS.includes(String(p.resolution))) {
36
- throw new Error(`resolution ${JSON.stringify(p.resolution)} is not one of ${MESH_RESOLUTIONS.join('|')} — the variant table is closed`);
37
- }
38
- const bg = String(p.bg_removal || 'auto');
39
- if (!MESH_BG_MODES.includes(bg)) {
40
- throw new Error(`bg_removal ${JSON.stringify(bg)} is not one of auto|on|off — birefnet either cuts or it doesn't`);
41
- }
42
- for (const [k, opts] of MESH_BAKE_SIZES) {
43
- if (!opts.includes(String(p[k]))) {
44
- throw new Error(`${k} ${JSON.stringify(p[k])} is not one of ${opts.join('|')} — the bake-size table is closed`);
45
- }
46
- }
47
- }
17
+ /** The wired-tensor law (the lanes-image precedent, ported 1:1):
18
+ * a '$name' value names an upstream stage's wired output — the
19
+ * spell IS the tensor and rides node inputs verbatim. ROW-4
20
+ * refuses producer links in Load* file slots, so a spelled image
21
+ * NEVER builds a loader; file paths keep the disk handoff. */
22
+ /** The lift arms' admission slice for THIS family: the SHARED kit
23
+ * seat (the dry-sweep's J4 re-hoist — two families carried this
24
+ * verbatim; the required image and closed sets refuse in the
25
+ * slice, never in the schema). This family adds no private arm
26
+ * (the pixal-only camera_fov row is pixal's, not ours). */
27
+ const admitMeshLift = admitMeshLiftShared;
48
28
  /** The dual guided unet + the two VAEs — the lift chain's shared
49
29
  * head. Creation order lands the reference renderers' numbering: the SHAPE
50
30
  * pair first (CFGOverride.0/RescaleCFG.0), then the STRUCT pair
@@ -74,15 +54,6 @@ function loadLiftHeads(g, li, p) {
74
54
  const texVae = g.node('VAELoader', { vae_name: li.texture_vae }).out();
75
55
  return { unet, rescaleShape, shifted, shapeVae, texVae };
76
56
  }
77
- /** The birefnet cut (bg_removal auto/on): the cutout MASK from
78
- * RemoveBackground bridged to IMAGE via MaskToImage (the GPU
79
- * canary verdict — RemoveBackground outputs MASK, not IMAGE). */
80
- function cutBackground(g, li, img) {
81
- const bgm = g.node('LoadBackgroundRemovalModel', { bg_removal_name: li.background_removal }).out();
82
- const mask = g.node('RemoveBackground', { bg_removal_model: bgm, image: img }).out();
83
- const src = g.node('MaskToImage', { mask }).out();
84
- return { src, mask };
85
- }
86
57
  /** The shared structure→shape→upsample→texture→bake→glb chain
87
58
  * (_shared_lift_chain verbatim — the model delta lives
88
59
  * ENTIRELY in the conditioning pair passed in). */
@@ -203,7 +174,7 @@ function sharedLiftChain(g, p, heads, pos, neg, prefix) {
203
174
  }).out();
204
175
  }
205
176
  /** The mesh action: trellis_t1 — DINOv3 conditioning (the image IS
206
- * the prompt; negative = ConditioningZeroOut). */
177
+ * the prompt; the negative is the conditioning's own output 1). */
207
178
  export const mesh = {
208
179
  id: "mesh",
209
180
  inputs: [],
@@ -220,7 +191,6 @@ export const mesh = {
220
191
  { name: "resolution", type: "enum", options: MESH_RESOLUTIONS },
221
192
  { name: "steps", type: "number", bounds: [4, 60] },
222
193
  { name: "cfg", type: "number", bounds: [1, 15] },
223
- { name: "bg_removal", type: "enum", options: MESH_BG_MODES },
224
194
  { name: "shape_steps", type: "number", bounds: [4, 60] },
225
195
  { name: "shape_cfg", type: "number", bounds: [1, 15] },
226
196
  { name: "shape_sampler", type: "enum", options: SAMPLER_OPTIONS },
@@ -262,13 +232,28 @@ export const mesh = {
262
232
  ? p.input_image
263
233
  : g.node('LoadImage', { image: p.input_image }).out();
264
234
  const heads = loadLiftHeads(g, li, p);
265
- let condImage = img;
266
- if (p.bg_removal !== 'off') {
267
- condImage = cutBackground(g, li, img).src;
268
- }
235
+ // THE TEMPLATE HAS NO MASK BRIDGE: the crop eats the photo
236
+ // (LoadImage) verbatim — a MaskToImage-sourced crop feeds the
237
+ // silhouette, and the silhouette starves every appearance
238
+
239
+
240
+ // "return_type_mismatch ... input_type(MASK)"), so the region
241
+ // rides ImageToMask of the SAME photo — images stay the photo
242
+ // verbatim (appearance features), the region is a real mask.
243
+ const mask = g.node('ImageToMask', { image: img, channel: 'red' }).out();
244
+ const cropped = g.node('ImageCropToMask', {
245
+ images: img, masks: mask,
246
+ pad_factor: 1.1, width: 1024, height: 1024,
247
+ // pin autofills leaves in place (core defaults)
248
+ background: '#000000', grow_mask: 0,
249
+ }).out();
269
250
  const clip = g.node('CLIPVisionLoader', { clip_name: li.clip_vision }).out();
270
- const pos = g.node('Trellis2Conditioning', { clip_vision_model: clip, image: condImage }).out(0);
271
- const neg = g.node('ConditioningZeroOut', { conditioning: pos }).out();
251
+ const cond = g.node('Trellis2Conditioning', { clip_vision_model: clip, image: cropped });
252
+ const pos = cond.out(0);
253
+ // the negative IS the conditioning's second output — never a
254
+ // fabricated zero (the zero drops the shared proj pack the
255
+ // template routes as every pass's negative)
256
+ const neg = cond.out(1);
272
257
  // Family constant, never a knob (compose stamps the prefix
273
258
  // internally; stable).
274
259
  return sharedLiftChain(g, p, heads, pos, neg, 'trellis2_native');
package/lib/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { Plugin } from "@deepseek-ai/cordis";
2
- import type { ModelDecl } from "@melite/comfyui-cordis/model-contract";
2
+ import type { ModelDecl } from '@melite/comfyui-card-kit/model-contract';
3
3
  export declare const DECL: ModelDecl;
4
4
  export declare const family: Plugin;
5
5
  export { mesh } from "./actions.js";
6
+ export { family as default };
6
7
  //# sourceMappingURL=index.d.ts.map
package/lib/index.js CHANGED
@@ -6,8 +6,13 @@ export const DECL = {
6
6
  "description": "Image to textured 3D mesh (native ComfyUI TRELLIS.2): background-removed conditioning → voxel structure → shape latent → texture atlas, saved as a .glb.",
7
7
  "engine": "comfyui",
8
8
  "defaults": {
9
+
10
+ // standard / quality, defaulting to standard): the floors ARE the
11
+ // standard tier — 1024 + the template's 768/700k tail (the card
12
+ // schema carries no remesh default, so this row is the raw-compose
13
+ // floor; the surviving 1024 lane stamps none, and the quality
14
+ // recipe's 1536/2048/2M picks override these as patch-only rows).
9
15
  "resolution": "1024",
10
- "bg_removal": "auto",
11
16
  "steps": 12,
12
17
  "cfg": 7.5,
13
18
  "shape_steps": 20,
@@ -35,7 +40,7 @@ export const DECL = {
35
40
  "rescale_shape": 0.5,
36
41
  "override_struct": 0.667,
37
42
  "override_shape": 0.769,
38
- "seed": 42
43
+ "seed": -1
39
44
  },
40
45
  "studio": {
41
46
  "tenant": "3d/img-to-mesh",
@@ -50,101 +55,84 @@ export const DECL = {
50
55
  "layout": "studio"
51
56
  },
52
57
  "genre": "3d",
58
+
59
+ // variant row declares its own steps+cfg in resolver_defaults —
60
+ // the family defaults can never substitute for a variant's face.
61
+ // input_image is the user-provided seat.
62
+ "required_defaults": [
63
+ { "name": "steps", "class": "variant" },
64
+ { "name": "cfg", "class": "variant" },
65
+ { "name": "input_image", "class": "user" }
66
+ ],
53
67
  "variants": [
54
68
  {
55
69
  "id": "1024",
56
70
  "label": "1024",
57
- "hint": "Standard resolution — DEFAULT",
71
+ "hint": "Standard resolution — the fast tier",
58
72
  "group": "Variant",
59
73
  "route": "trellis2-native",
74
+ // Resolution stays family-owned (one value, one owner — this row
75
+ // IS the lane), but the SAMPLER pair is declared here (the
76
+ // variant-sampler-defaults law): 12 / 7.5 — the official
77
+
78
+ // standard-tier ruling).
79
+ "resolver_defaults": { "steps": 12, "cfg": 7.5 },
60
80
  "order": 0,
61
81
  "cells": [
62
82
  {
63
- "quant": "bf16",
64
- "label": "BF16",
65
- "hide_from_dropdown": true,
66
- "route": "trellis2-native-bf16",
67
- "vram_peak_gb": 12,
68
- },
69
- {
70
- "quant": "int8",
83
+ "quant": "int8_convrot",
71
84
  "label": "INT8 ConvRot",
72
85
  "route": "trellis2-native-int8",
73
86
  "vram_peak_gb": 8,
74
87
  }
75
88
  ]
76
89
  },
90
+
91
+ // standard, quality on the img to mesh node, defaulting to
92
+ // standard"). Resolution rides ONE seat — the family defaults
93
+ // row's 1024 — so fast and standard leave it unstated and only
94
+ // quality restates the 1536 pick (the card's closed enum owns
95
+ // the vocabulary: 1024 | 1536; the hidden 512 lane was
96
+ // off-envelope and died with its variant row). The remesh tail
97
+ // rides the family defaults row (the floors ARE the standard —
98
+ // the h3 precedent: a recipe stamps only what DIFFERS from the
99
+ // floor). HIGH is the FIRST row and the group default (operator
100
+
101
+ // be run" — the old standard default's output read poor/low
102
+ // quality): 1536 detail + a mid remesh tail, comfortably under
103
+ // a 24GB card. STANDARD is now the stamp-less second row — the
104
+ // calibrated floor as an explicit pick.
77
105
  {
78
- "id": "1536",
79
- "label": "1536",
80
- "hint": "Quality resolution — hero assets, final production",
81
- "group": "Variant",
82
- "route": "trellis2-native-1536",
83
- "order": 2,
84
- "resolver_defaults": { "resolution": "1536" },
85
- "cells": [
86
- {
87
- "quant": "bf16",
88
- "label": "BF16",
89
- "hide_from_dropdown": true,
90
- "route": "trellis2-native-1536-bf16",
91
- "vram_peak_gb": 16,
92
- },
93
- {
94
- "quant": "int8",
95
- "label": "INT8 ConvRot",
96
- "route": "trellis2-native-1536-int8",
97
- "vram_peak_gb": 10,
98
- }
99
- ]
100
- },
101
- {
102
- "id": "512",
103
- "label": "512",
104
- "hint": "Fast resolution — props, thumbnails, iteration",
105
- "group": "Variant",
106
- "route": "trellis2-native-512",
107
- "order": 1,
108
- "hide_from_dropdown": true,
109
- "cells": [
110
- {
111
- "quant": "bf16",
112
- "label": "BF16",
113
- "hide_from_dropdown": true,
114
- "route": "trellis2-native-512-bf16",
115
- "vram_peak_gb": 8,
116
- },
117
- {
118
- "quant": "int8",
119
- "label": "INT8 ConvRot",
120
- "route": "trellis2-native-512-int8",
121
- "vram_peak_gb": 5,
122
- }
123
- ]
106
+ "id": "high",
107
+ "label": "High",
108
+ "hint": "The default — high quality that still runs: 1536 detail + remesh 1024 + 1M faces; the int8 chain peaks well under a 24GB card.",
109
+ "group": "Recipe",
110
+ "wire_defaults": { "resolution": "1536", "remesh_resolution": 1024, "decimate_faces": 1000000 },
111
+ "cells": [],
124
112
  },
125
113
  {
126
- "id": "fast_mesh",
127
- "label": "Fast Mesh",
128
- "hint": "Remesh 128 + 10k faces — the card schema's own floors (lightest preview mesh).",
114
+ "id": "standard",
115
+ "label": "Standard",
116
+ "hint": "The official template's calibration as the floor: 1024 + remesh 768 + 700k faces.",
129
117
  "group": "Recipe",
130
- "wire_defaults": { "remesh_resolution": 128, "decimate_faces": 10000 },
131
118
  "cells": [],
132
119
  },
133
120
  {
134
- "id": "hero_mesh",
135
- "label": "Hero Mesh",
136
- "hint": "Remesh 2048 + 2M faces — the card schema's own ceilings (densest hero mesh).",
121
+ "id": "fast",
122
+ "label": "Fast",
123
+ "hint": "Preview tier — remesh 128 + 10k faces at the same 1024 floor; the lightest mesh that still unwraps.",
137
124
  "group": "Recipe",
138
- "wire_defaults": { "remesh_resolution": 2048, "decimate_faces": 2000000 },
125
+ "wire_defaults": { "remesh_resolution": 128, "decimate_faces": 10000 },
139
126
  "cells": [],
140
127
  },
141
128
  {
142
- "id": "default",
143
- "label": "Default",
144
- "hint": "The family default — no extra stamps; a fresh card lands here.",
129
+ "id": "quality",
130
+ "label": "Quality",
131
+ "hint": "Hero assets — resolution 1536 + remesh 2048 + 2M faces; RemeshMesh wants ~3.6 GiB over a ~19 GiB resident chain (32GB+ VRAM only).",
145
132
  "group": "Recipe",
133
+ "wire_defaults": { "resolution": "1536", "remesh_resolution": 2048, "decimate_faces": 2000000 },
146
134
  "cells": [],
147
- }
135
+ },
148
136
  ],
149
137
  "variant_groups": [
150
138
  {
@@ -158,8 +146,8 @@ export const DECL = {
158
146
  {
159
147
  "id": "Recipe",
160
148
  "label": "Recipe",
161
- "tooltip": "One-click recipes — patch-only rows that stamp picks onto the draft; Default stamps nothing.",
162
- "default": "default"
149
+ "tooltip": "One-click mesh tiers — patch-only rows: High (the runnable 1536 default), Fast (preview tail), Standard (the calibrated floor), Quality (1536 hero pass).",
150
+ "default": "high"
163
151
  }
164
152
  ],
165
153
  "provisions": [
@@ -190,22 +178,39 @@ export const DECL = {
190
178
  "folder": "clip_vision",
191
179
  "sha256": "5cb785e458de7c460579082418af81f5c62380c181599344bdc60898c63468ee",
192
180
  "size_bytes": 1212559776
193
- },
194
- {
195
- "name": "birefnet.safetensors",
196
- "url": "https://huggingface.co/Comfy-Org/BiRefNet/resolve/main/background_removal/birefnet.safetensors",
197
- "folder": "background_removal",
198
- "sha256": "9ab37426bf4de0567af6b5d21b16151357149139362e6e8992021b8ce356a154",
199
- "size_bytes": 444473596
200
181
  }
201
182
  ],
202
183
  "lane_inputs": {
203
- "background_removal": "birefnet.safetensors",
204
184
  "clip_vision": "dino_v3_vit_l.safetensors",
205
185
  "texture_vae": "trellis_2_texture_vae_bf16.safetensors",
206
186
  "unet": "trellis_2_int8_convrot.safetensors",
207
187
  "vae": "trellis_2_shape_vae_bf16.safetensors"
208
188
  },
189
+ // THE DECLARED HOME (the lane-presence cure): the store folder this
190
+ // pack-specific lane file lives in — the run gate probes it at press
191
+ // instead of dying untyped at the engine.
192
+ "lane_homes": { "texture_vae": "vae" },
193
+ // THE LANE SURFACE (the z-image precedent): exactly the knobs the
194
+ // img-to-mesh card serves — the mesh lift, its shape/texture
195
+ // passes, the remesh/decimate tail, and the per-pass sampler pairs.
196
+ "params": [
197
+ "input_image", "rigged_glb", "target_glb",
198
+ "seed", "resolution", "steps", "cfg",
199
+ "camera_fov",
200
+ "shape_steps", "shape_cfg", "tex1_steps", "tex1_cfg",
201
+ "tex2_steps", "tex2_cfg",
202
+ "remesh_resolution", "remesh_qef", "remesh_drop_inverted",
203
+ "remesh_drop_enclosed", "remesh_fix_poles",
204
+ "decimate_faces", "smooth_angle",
205
+ "atlas_size", "ao_size", "normal_size",
206
+ "struct_sampler", "struct_scheduler",
207
+ "shape_sampler", "shape_scheduler",
208
+ "tex1_sampler", "tex1_scheduler",
209
+ "tex2_sampler", "tex2_scheduler",
210
+ "sd3_shift",
211
+ "rescale_struct", "rescale_shape",
212
+ "override_struct", "override_shape",
213
+ ],
209
214
  // the mesh action the img-to-mesh card binds (the trellis_t1
210
215
  // lane tree).
211
216
  "actions": [mesh],
@@ -218,4 +223,9 @@ export const family = {
218
223
  },
219
224
  };
220
225
  export { mesh } from "./actions.js";
226
+ // The Loader-row face: DSH loads plugin rows by bare specifier and
227
+ // unwraps `exports.default ?? exports` (vendor/cordis_plugins/loader
228
+ // unwrapExports) — the default export IS the row-loadable plugin. The
229
+ // named `family` stays the library face (engine loadFamilies).
230
+ export { family as default };
221
231
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@melite/models-trellis2-native",
3
- "version": "0.1.4-alpha",
4
- "license": "SSPL-1.0",
3
+ "version": "0.2.0-alpha",
4
+ "license": "AGPL-3.0-or-later",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
@@ -11,13 +11,12 @@
11
11
  "./package.json": "./package.json"
12
12
  },
13
13
  "dependencies": {
14
- "@melite/comfyui-card-kit": "0.1.4-alpha",
15
- "@melite/comfyui-cordis": "0.1.4-alpha"
14
+ "@melite/comfyui-card-kit": "0.2.0-alpha"
16
15
  },
17
16
  "devDependencies": {
18
17
  "@types/node": "^22.20.0",
19
18
  "typescript": "^5.9.3",
20
- "@deepseek-ai/cordis": "^4.0.4"
19
+ "@deepseek-ai/cordis": "^4.0.5"
21
20
  },
22
21
  "files": [
23
22
  "lib/index.js",
@@ -25,7 +24,7 @@
25
24
  "lib/**/*.d.ts"
26
25
  ],
27
26
  "peerDependencies": {
28
- "@deepseek-ai/cordis": "^4.0.4"
27
+ "@deepseek-ai/cordis": "^4.0.5"
29
28
  },
30
29
  "scripts": {
31
30
  "build": "tsc -p tsconfig.build.json",