Files

62 lines
3.1 KiB
Markdown

# Node and state contracts
## 公開ノード
| 登録名 | 表示名 | 主な入力 | 出力 |
|---|---|---|---|
| `CheckpointListSelector` | Checkpoint List Selector | `checkpoint` | `ckpt_name`, `ckpt_name_str`, `ckpt_name_safe` |
| `CheckpointNameCycler` | Checkpoint Name Cycler | `start_checkpoint`, `mode`, `change_every` | `ckpt_name`, `ckpt_name_str`, `ckpt_name_safe` |
| `CheckpointStatusTagger` | Checkpoint Status Tagger | `ckpt_name_str` | なし |
| `CheckpointTagExportImport` | Checkpoint Tag Export / Import | `tag_transfer_directory` UI | なし |
| `EphemeralPreview` | Ephemeral Preview | `image` | なし |
| `ImageDirPreview` | ImageDir Preview | `ckpt_name_str`, `search_directory`, `max_preview_images` | なし |
## メニュー階層
通常ノードは`HandpickerSuite`直下、Preview系だけは`HandpickerSuite/Preview`へ登録する。
```text
HandpickerSuite
├─ Checkpoint List Selector
├─ Checkpoint Name Cycler
├─ Checkpoint Status Tagger
├─ Checkpoint Tag Export / Import
└─ Preview
├─ Ephemeral Preview
└─ ImageDir Preview
```
## Checkpoint名の3出力
SelectorとCyclerは、同じ相対Checkpointパスを用途別に3形式で公開する。
- `ckpt_name`: Checkpoint Loaderへ接続できるCombo互換出力。
- `ckpt_name_str`: TaggerとImageDirPreviewへ接続するSTRING出力。
- `ckpt_name_safe`: 拡張子とファイル名に不向きな文字を除去・置換したSTRING出力。
値が同じでも型と接続先が異なるため、`ckpt_name_str`を削除して`ckpt_name`へ統合してはならない。
TaggerとImageDirPreviewの`ckpt_name_str`はSTRINGかつ`forceInput: True`を維持する。
未接続時に先頭Checkpointや共有Preview状態から対象を推測してはならない。
## 状態の所有範囲
- Cycler、Tagger、Preview、実行中Checkpointの保持状態はブラウザタブIDとノードIDで分離する。
- 通常のSelector同期、DirectLink、Tagger変更、Preview進捗は対象タブだけへ反映する。
- Tag Importと、Refresh Allによる消失済み`delete`評価の解除は全タブへ反映する。
- Cyclerの実行後スナップショットが、最後に実際に返したCheckpointの正本である。
- EphemeralPreviewのCheckpoint名表示はタブ内の実行状態を利用するが、評価や削除対象の決定には使用しない。
## 永続データ
- 評価DBは`data/checkpoint_statuses.json`へatomic保存する。
- `favorite`互換データは`data/checkpoint_favorites.json`へ同期する。
- `none`は評価DBからrecordを削除して表現する。
- Runtime UI状態はバックエンドメモリにも保持され、Workflowに保存されたhidden widgetは初期化時の復元元となる。
## フロントエンド読み込み契約
- 実装は`web/checkpoint_handpicker_suite.js`だけを正本とする。
- `WEB_DIRECTORY = "./web"`を維持する。
- JavaScriptのComfyUI importは`../../scripts/app.js`と`../../scripts/api.js`を使用する。
- 必須Comboへ`.`や空文字など、候補一覧に存在しないsentinelを残してQueue検証を失敗させてはならない。