@wcstack/devtools 1.20.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/README.ja.md +88 -0
- package/README.md +90 -0
- package/dist/auto.js +3 -0
- package/dist/auto.min.js +3 -0
- package/dist/index.d.ts +358 -0
- package/dist/index.esm.js +0 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.esm.min.js +2 -0
- package/dist/index.esm.min.js.map +1 -0
- package/package.json +70 -0
package/README.ja.md
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# @wcstack/devtools
|
|
2
|
+
|
|
3
|
+
**wcstack のページ内 DevTools オーバーレイ。** `<script>` 一行で `<wcs-devtools>`
|
|
4
|
+
オーバーレイが載り、state ツリーの検査、各パスがどの DOM ノードに配線されているかの
|
|
5
|
+
確認、write / 更新バッチ / command・event トークン発火のライブタイムラインが使える。
|
|
6
|
+
|
|
7
|
+
- **依存ゼロ・ビルド不要。** ページ上の wcstack ランタイムとは
|
|
8
|
+
[DevTools Hook Protocol](../../docs/devtools-hook-protocol.md)
|
|
9
|
+
(`globalThis.__WCSTACK_DEVTOOLS_HOOK__`)だけで接続する。`@wcstack/state` を
|
|
10
|
+
import せず、ランタイムのコピーが複数あるページでもそのまま動く。
|
|
11
|
+
- **標準ファースト。** オーバーレイ自体がカスタム要素で、Shadow DOM 内で完結。
|
|
12
|
+
ページの DOM / CSS / class / style には一切触れない。ハイライトは fixed 配置の
|
|
13
|
+
オーバーレイ枠として描画する。
|
|
14
|
+
- **本番経路は不活性。** devtools 未接続時、`@wcstack/state` 側計装のコストは
|
|
15
|
+
計装点あたり null チェック 1 回。オーバーレイはタグを書いたページにしか存在しない。
|
|
16
|
+
SSR では何も描画しない。
|
|
17
|
+
|
|
18
|
+
## クイックスタート
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<!-- @wcstack/state より前に読む: 配線台帳がライブで captured される -->
|
|
22
|
+
<script type="module" src="https://esm.run/@wcstack/devtools/auto"></script>
|
|
23
|
+
<script type="module" src="https://esm.run/@wcstack/state/auto"></script>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
フローティングの **WCS** バッジ、または **Alt+Shift+D** でパネルが開く。
|
|
27
|
+
|
|
28
|
+
auto エントリは `<wcs-devtools>` を定義し、ページに無ければ `<body>` 末尾に
|
|
29
|
+
1 つ挿入する。配置や属性を制御したい場合は自分でタグを書く:
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<wcs-devtools open dock="right" hotkey="Ctrl+Shift+X" buffer="1000"
|
|
33
|
+
hidden-states="analytics"></wcs-devtools>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## ペイン
|
|
37
|
+
|
|
38
|
+
| ペイン | 内容 |
|
|
39
|
+
|---|---|
|
|
40
|
+
| **State** | 各 `<wcs-state>`(ランタイム source 単位)のトップレベルキー、配列/オブジェクトの展開、computed getter。値クリックでインライン編集 — 書き込みは通常のリアクティブパイプライン(set トラップ → 更新バッチ → DOM)を通るため、アプリコードが書いたのと同じようにページが反応する。**パス**クリックで束縛ノードをハイライト。 |
|
|
41
|
+
| **Wiring** | ライブ binding 台帳: binding ごとの `property ← path@state` 行と型バッジ(`text` / `prop` / `for` / …)。**⌖ pick** でページ要素をクリックするとその要素の配線だけに絞れる。行クリックで束縛ノードをハイライト。 |
|
|
42
|
+
| **Timeline** | ring buffer(既定 500 件): `write`(旧値が取れた場合は併記)、`batch`(drain ごとの dedup 済み更新アドレス)、`command` / `event` トークン発火(引数要約 + 購読者数 — **購読者ゼロの空撃ちには警告バッジ**。whenDefined 前配線レースの検出に効く)、state 要素の登録/解除。⏸ で一時停止、🗑 でクリア。 |
|
|
43
|
+
|
|
44
|
+
## 属性
|
|
45
|
+
|
|
46
|
+
| 属性 | 既定 | 意味 |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| `open` | 閉 | パネルの表示(バッジ/ホットキーでトグル) |
|
|
49
|
+
| `dock` | `bottom` | `bottom` または `right` |
|
|
50
|
+
| `hotkey` | `Alt+Shift+D` | 開閉ショートカット。`none` で無効 |
|
|
51
|
+
| `buffer` | `500` | タイムライン ring buffer 件数(接続時に読む) |
|
|
52
|
+
| `hidden-states` | — | 非表示にする state 名(カンマ区切り。`wcs-devtools` 始まりは常に非表示) |
|
|
53
|
+
|
|
54
|
+
## 遅延アタッチ
|
|
55
|
+
|
|
56
|
+
バインディング構築**後**に devtools がロード(または注入)された場合、過去の
|
|
57
|
+
`binding-added` は復元できない。Wiring ペインは **declared** ビュー
|
|
58
|
+
(`data-wcs` 属性と `wcs-*` コメントの再スキャン)にフォールバックし、リロード
|
|
59
|
+
導線を出す。それ以外(state ツリー・編集・以降のタイムライン)は全機能動く。
|
|
60
|
+
プロトコル §6 参照。
|
|
61
|
+
|
|
62
|
+
## 注意・制限
|
|
63
|
+
|
|
64
|
+
- パネルの再描画は `requestAnimationFrame` 駆動。非表示タブ(どのみち見えない)
|
|
65
|
+
では次のフレームまで描画が止まる。
|
|
66
|
+
- パネルを開いている間、ドック側のページ領域は覆われる — 反対側にドックするか
|
|
67
|
+
閉じれば操作できる。
|
|
68
|
+
- `@wcstack/signals` 対応は今後(プロトコルは `kind: "signals"` を予約済み)。
|
|
69
|
+
v1 は `@wcstack/state` を対象とする。
|
|
70
|
+
|
|
71
|
+
## プログラマティック利用
|
|
72
|
+
|
|
73
|
+
同じプロトコルの上に自前ツールを組むための部品も export している:
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
import { DevtoolsCore, getOrCreateHookRegistry, formatValue, scanDeclaredBindings }
|
|
77
|
+
from "@wcstack/devtools";
|
|
78
|
+
|
|
79
|
+
const core = new DevtoolsCore({ timelineCapacity: 200 });
|
|
80
|
+
core.connect();
|
|
81
|
+
core.onChange((kind) => { /* "sources" | "roster" | "wiring" | "timeline" */ });
|
|
82
|
+
core.getRoster(); // 観測中の <wcs-state> 要素
|
|
83
|
+
core.getTimeline(); // ring buffer スナップショット
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## ライセンス
|
|
87
|
+
|
|
88
|
+
MIT
|
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# @wcstack/devtools
|
|
2
|
+
|
|
3
|
+
**In-page DevTools overlay for wcstack.** One `<script>` tag adds a `<wcs-devtools>`
|
|
4
|
+
overlay that lets you inspect state trees, see which DOM nodes each state path is
|
|
5
|
+
wired to, and watch a live timeline of writes, update batches, and
|
|
6
|
+
command/event-token emissions.
|
|
7
|
+
|
|
8
|
+
- **Zero dependencies, zero build.** Connects to the page's wcstack runtimes only
|
|
9
|
+
through the [DevTools Hook Protocol](../../docs/devtools-hook-protocol.md)
|
|
10
|
+
(`globalThis.__WCSTACK_DEVTOOLS_HOOK__`) — it does not import `@wcstack/state`,
|
|
11
|
+
and works even when multiple copies of a runtime are on the page.
|
|
12
|
+
- **Standards-first.** The overlay is itself a custom element rendered in a closed
|
|
13
|
+
world (Shadow DOM); it never touches the page's DOM, CSS, classes, or styles.
|
|
14
|
+
Highlights are drawn as fixed-position overlay boxes.
|
|
15
|
+
- **Inert in production paths.** With no devtools attached, the runtime cost of the
|
|
16
|
+
instrumentation in `@wcstack/state` is a single null check per site; the overlay
|
|
17
|
+
is only present when you add the script tag. SSR renders nothing.
|
|
18
|
+
|
|
19
|
+
## Quick start
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<!-- load BEFORE @wcstack/state so the wiring ledger is captured live -->
|
|
23
|
+
<script type="module" src="https://esm.run/@wcstack/devtools/auto"></script>
|
|
24
|
+
<script type="module" src="https://esm.run/@wcstack/state/auto"></script>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Open the panel with the floating **WCS** badge or **Alt+Shift+D**.
|
|
28
|
+
|
|
29
|
+
The auto entry defines `<wcs-devtools>` and appends one to `<body>` if the page
|
|
30
|
+
does not already contain one. To control placement/attributes, write the tag
|
|
31
|
+
yourself:
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<wcs-devtools open dock="right" hotkey="Ctrl+Shift+X" buffer="1000"
|
|
35
|
+
hidden-states="analytics"></wcs-devtools>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Panes
|
|
39
|
+
|
|
40
|
+
| Pane | What it shows |
|
|
41
|
+
|---|---|
|
|
42
|
+
| **State** | Every `<wcs-state>` (per runtime source): top-level keys, expandable arrays/objects, computed getters. Click a value to edit it inline — the write goes through the normal reactive pipeline (set trap → update batch → DOM), so the page reacts exactly as if application code had written it. Click a **path** to highlight the DOM nodes bound to it. |
|
|
43
|
+
| **Wiring** | The live binding ledger: `property ← path@state` rows per binding, with type badges (`text` / `prop` / `for` / …). Use **⌖ pick** to click a page element and see only its bindings. Rows highlight their bound nodes on click. |
|
|
44
|
+
| **Timeline** | A ring buffer (default 500) of `write` (with old value when available), `batch` (deduplicated update addresses per drain), `command` / `event` token emissions (with argument summaries and subscriber counts — **zero-subscriber emissions get a warning badge**, catching wired-before-`whenDefined` races), and state element registration. ⏸ pauses, 🗑 clears. |
|
|
45
|
+
|
|
46
|
+
## Attributes
|
|
47
|
+
|
|
48
|
+
| Attribute | Default | Meaning |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `open` | closed | Panel visibility (toggled by badge/hotkey) |
|
|
51
|
+
| `dock` | `bottom` | `bottom` or `right` |
|
|
52
|
+
| `hotkey` | `Alt+Shift+D` | Toggle shortcut; `none` disables |
|
|
53
|
+
| `buffer` | `500` | Timeline ring-buffer capacity (read at connect) |
|
|
54
|
+
| `hidden-states` | — | Comma-separated state names to hide (names starting with `wcs-devtools` are always hidden) |
|
|
55
|
+
|
|
56
|
+
## Late attach
|
|
57
|
+
|
|
58
|
+
If devtools loads (or is injected) **after** bindings were built, past
|
|
59
|
+
`binding-added` events are unrecoverable — the Wiring pane falls back to a
|
|
60
|
+
**declared** view (re-scanning `data-wcs` attributes and `wcs-*` comments) and
|
|
61
|
+
offers a reload link; everything else (state tree, editing, timeline from that
|
|
62
|
+
point on) works fully. See protocol §6.
|
|
63
|
+
|
|
64
|
+
## Notes & limitations
|
|
65
|
+
|
|
66
|
+
- The panel repaints on `requestAnimationFrame`; in a hidden/background tab
|
|
67
|
+
(where the overlay is invisible anyway) rendering pauses until the next frame.
|
|
68
|
+
- While open, the docked panel covers part of the page — dock it to the other
|
|
69
|
+
side or close it to interact with covered controls.
|
|
70
|
+
- `@wcstack/signals` support is planned (the protocol reserves `kind: "signals"`);
|
|
71
|
+
v1 covers `@wcstack/state`.
|
|
72
|
+
|
|
73
|
+
## Programmatic use
|
|
74
|
+
|
|
75
|
+
The pieces are exported for building your own tooling on the same protocol:
|
|
76
|
+
|
|
77
|
+
```js
|
|
78
|
+
import { DevtoolsCore, getOrCreateHookRegistry, formatValue, scanDeclaredBindings }
|
|
79
|
+
from "@wcstack/devtools";
|
|
80
|
+
|
|
81
|
+
const core = new DevtoolsCore({ timelineCapacity: 200 });
|
|
82
|
+
core.connect();
|
|
83
|
+
core.onChange((kind) => { /* "sources" | "roster" | "wiring" | "timeline" */ });
|
|
84
|
+
core.getRoster(); // observed <wcs-state> elements
|
|
85
|
+
core.getTimeline(); // ring buffer snapshot
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## License
|
|
89
|
+
|
|
90
|
+
MIT
|
package/dist/auto.js
ADDED
package/dist/auto.min.js
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bootstrapDevtools.ts
|
|
3
|
+
*
|
|
4
|
+
* `<wcs-devtools>` の登録と自動挿入(devtools-tag-design.md §2)。
|
|
5
|
+
* - 既に定義済みなら再定義しない
|
|
6
|
+
* - ページに `<wcs-devtools>` が無ければ body 末尾に 1 つ挿入
|
|
7
|
+
* (手動で書かれていれば挿入しない)
|
|
8
|
+
* - SSR では何もしない
|
|
9
|
+
*/
|
|
10
|
+
declare function bootstrapDevtools(): void;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* protocol/types.ts
|
|
14
|
+
*
|
|
15
|
+
* DevTools Hook Protocol (docs/devtools-hook-protocol.md) の devtools 側型定義。
|
|
16
|
+
*
|
|
17
|
+
* ランタイム(@wcstack/state)側の内部型は import しない — プロトコルは
|
|
18
|
+
* 「文書化された構造」への構造的型付けで両側が独立に実装する(protocol §2)。
|
|
19
|
+
* そのためランタイム内部オブジェクトは *Like インターフェースとして、
|
|
20
|
+
* devtools が実際に触るプロパティだけを宣言する。
|
|
21
|
+
*/
|
|
22
|
+
/** グローバル registry のプロパティ名 */
|
|
23
|
+
declare const DEVTOOLS_HOOK_GLOBAL = "__WCSTACK_DEVTOOLS_HOOK__";
|
|
24
|
+
/** プロトコル版。additive change では上げない(protocol §2) */
|
|
25
|
+
declare const DEVTOOLS_PROTOCOL_VERSION = 1;
|
|
26
|
+
interface IPathInfoLike {
|
|
27
|
+
readonly path: string;
|
|
28
|
+
}
|
|
29
|
+
interface IAbsolutePathInfoLike {
|
|
30
|
+
readonly stateName: string;
|
|
31
|
+
readonly pathInfo: IPathInfoLike;
|
|
32
|
+
}
|
|
33
|
+
interface IListIndexLike {
|
|
34
|
+
readonly index: number;
|
|
35
|
+
readonly indexes: number[];
|
|
36
|
+
}
|
|
37
|
+
interface IAbsoluteAddressLike {
|
|
38
|
+
readonly absolutePathInfo: IAbsolutePathInfoLike;
|
|
39
|
+
readonly listIndex: IListIndexLike | null;
|
|
40
|
+
}
|
|
41
|
+
interface IBindingLike {
|
|
42
|
+
readonly propName: string;
|
|
43
|
+
readonly statePathName: string;
|
|
44
|
+
readonly stateName: string;
|
|
45
|
+
readonly bindingType: string;
|
|
46
|
+
readonly node: Node;
|
|
47
|
+
readonly replaceNode: Node;
|
|
48
|
+
}
|
|
49
|
+
interface IStateElementSummaryLike {
|
|
50
|
+
readonly name: string;
|
|
51
|
+
readonly rootNode: Node;
|
|
52
|
+
readonly element: unknown;
|
|
53
|
+
readonly paths: {
|
|
54
|
+
readonly list: ReadonlySet<string>;
|
|
55
|
+
readonly element: ReadonlySet<string>;
|
|
56
|
+
readonly getter: ReadonlySet<string>;
|
|
57
|
+
readonly setter: ReadonlySet<string>;
|
|
58
|
+
};
|
|
59
|
+
readonly commandTokenNames: ReadonlySet<string>;
|
|
60
|
+
readonly eventTokenNames: ReadonlySet<string>;
|
|
61
|
+
readonly staticDependency: ReadonlyMap<string, readonly string[]>;
|
|
62
|
+
readonly dynamicDependency: ReadonlyMap<string, readonly string[]>;
|
|
63
|
+
}
|
|
64
|
+
type DevtoolsEventLike = {
|
|
65
|
+
readonly type: "state:element-registered";
|
|
66
|
+
readonly name: string;
|
|
67
|
+
readonly rootNode: Node;
|
|
68
|
+
readonly element: unknown;
|
|
69
|
+
} | {
|
|
70
|
+
readonly type: "state:element-unregistered";
|
|
71
|
+
readonly name: string;
|
|
72
|
+
readonly rootNode: Node;
|
|
73
|
+
readonly element: unknown;
|
|
74
|
+
} | {
|
|
75
|
+
readonly type: "state:write";
|
|
76
|
+
readonly absoluteAddress: IAbsoluteAddressLike;
|
|
77
|
+
readonly value: unknown;
|
|
78
|
+
readonly oldValue: unknown;
|
|
79
|
+
readonly hasOldValue: boolean;
|
|
80
|
+
} | {
|
|
81
|
+
readonly type: "state:update-batch";
|
|
82
|
+
readonly addresses: ReadonlySet<IAbsoluteAddressLike>;
|
|
83
|
+
} | {
|
|
84
|
+
readonly type: "state:binding-added";
|
|
85
|
+
readonly absoluteAddress: IAbsoluteAddressLike;
|
|
86
|
+
readonly binding: IBindingLike;
|
|
87
|
+
} | {
|
|
88
|
+
readonly type: "state:binding-removed";
|
|
89
|
+
readonly absoluteAddress: IAbsoluteAddressLike;
|
|
90
|
+
readonly binding: IBindingLike;
|
|
91
|
+
} | {
|
|
92
|
+
readonly type: "state:binding-cleared";
|
|
93
|
+
readonly absoluteAddress: IAbsoluteAddressLike;
|
|
94
|
+
} | {
|
|
95
|
+
readonly type: "state:token-emit";
|
|
96
|
+
readonly kind: "command" | "event";
|
|
97
|
+
readonly stateName: string | null;
|
|
98
|
+
readonly tokenName: string;
|
|
99
|
+
readonly args: readonly unknown[];
|
|
100
|
+
readonly subscriberCount: number;
|
|
101
|
+
};
|
|
102
|
+
type DevtoolsSinkLike = (event: DevtoolsEventLike) => void;
|
|
103
|
+
interface IDevtoolsSourceLike {
|
|
104
|
+
readonly id: string;
|
|
105
|
+
readonly kind: string;
|
|
106
|
+
readonly packageVersion: string;
|
|
107
|
+
getStateElements(): IStateElementSummaryLike[];
|
|
108
|
+
/** protocol v1 追補 API。古いランタイムには無い可能性があるため optional 扱いで呼ぶ */
|
|
109
|
+
keys?(name: string, rootNode: Node): string[];
|
|
110
|
+
read(name: string, rootNode: Node, path: string, indexes?: number[]): unknown;
|
|
111
|
+
write(name: string, rootNode: Node, path: string, value: unknown, indexes?: number[]): void;
|
|
112
|
+
_setSink(sink: DevtoolsSinkLike | null): void;
|
|
113
|
+
}
|
|
114
|
+
interface IDevtoolsListenerLike {
|
|
115
|
+
onSourceRegistered?(source: IDevtoolsSourceLike): void;
|
|
116
|
+
onSourceUnregistered?(sourceId: string): void;
|
|
117
|
+
onEvent?(sourceId: string, event: DevtoolsEventLike): void;
|
|
118
|
+
}
|
|
119
|
+
interface IDevtoolsHookRegistryLike {
|
|
120
|
+
readonly version: number;
|
|
121
|
+
readonly sources: Map<string, IDevtoolsSourceLike>;
|
|
122
|
+
register(source: IDevtoolsSourceLike): void;
|
|
123
|
+
unregister(sourceId: string): void;
|
|
124
|
+
addListener(listener: IDevtoolsListenerLike): () => void;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* core/DevtoolsCore.ts
|
|
129
|
+
*
|
|
130
|
+
* hook client(devtools-tag-design.md §1)。DOM 非依存の純ロジック層。
|
|
131
|
+
*
|
|
132
|
+
* - registry への addListener / 解除(connect / disconnect)
|
|
133
|
+
* - source 管理と roster(state 要素一覧)の維持
|
|
134
|
+
* - 配線台帳(binding-added/removed イベントから構築。binding は WeakRef 保持)
|
|
135
|
+
* - タイムライン ring buffer(既定 500 件 FIFO)
|
|
136
|
+
* - 予約 prefix `wcs-devtools` の自己除外(protocol §5)
|
|
137
|
+
*
|
|
138
|
+
* 台帳はすべて devtools 側に置く(protocol 原則 2)。disconnect で
|
|
139
|
+
* sources / roster / wiring をクリアし、残留参照を持たない。
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
/** 予約 state 名 prefix(protocol §5)。この prefix の要素・イベントは常に除外 */
|
|
143
|
+
declare const RESERVED_STATE_NAME_PREFIX = "wcs-devtools";
|
|
144
|
+
type TimelineKind = "write" | "batch" | "command" | "event" | "element-registered" | "element-unregistered";
|
|
145
|
+
interface ITimelineEntry {
|
|
146
|
+
readonly seq: number;
|
|
147
|
+
readonly time: number;
|
|
148
|
+
readonly sourceId: string;
|
|
149
|
+
readonly kind: TimelineKind;
|
|
150
|
+
readonly stateName: string | null;
|
|
151
|
+
readonly label: string;
|
|
152
|
+
readonly detail: string;
|
|
153
|
+
readonly subscriberCount: number | null;
|
|
154
|
+
}
|
|
155
|
+
interface IRosterEntry {
|
|
156
|
+
readonly sourceId: string;
|
|
157
|
+
readonly name: string;
|
|
158
|
+
readonly rootNode: Node;
|
|
159
|
+
readonly summary: IStateElementSummaryLike;
|
|
160
|
+
}
|
|
161
|
+
interface IWiringEntry {
|
|
162
|
+
readonly sourceId: string;
|
|
163
|
+
readonly stateName: string;
|
|
164
|
+
readonly path: string;
|
|
165
|
+
readonly propName: string;
|
|
166
|
+
readonly bindingType: string;
|
|
167
|
+
readonly bindingRef: WeakRef<IBindingLike>;
|
|
168
|
+
}
|
|
169
|
+
type CoreChangeKind = "sources" | "roster" | "wiring" | "timeline";
|
|
170
|
+
type CoreChangeListener = (kind: CoreChangeKind) => void;
|
|
171
|
+
interface IDevtoolsCoreOptions {
|
|
172
|
+
/** タイムライン ring buffer 件数(既定 500) */
|
|
173
|
+
timelineCapacity?: number;
|
|
174
|
+
/** 追加で除外する state 名(予約 prefix は常に除外) */
|
|
175
|
+
hiddenStateNames?: readonly string[];
|
|
176
|
+
}
|
|
177
|
+
declare class DevtoolsCore {
|
|
178
|
+
private _timelineCapacity;
|
|
179
|
+
private _hiddenStateNames;
|
|
180
|
+
private _removeListener;
|
|
181
|
+
private _sources;
|
|
182
|
+
private _roster;
|
|
183
|
+
private _wiringByPathKey;
|
|
184
|
+
private _wiringEntryByBinding;
|
|
185
|
+
private _timeline;
|
|
186
|
+
private _seq;
|
|
187
|
+
private _paused;
|
|
188
|
+
private _changeListeners;
|
|
189
|
+
constructor(options?: IDevtoolsCoreOptions);
|
|
190
|
+
get connected(): boolean;
|
|
191
|
+
get paused(): boolean;
|
|
192
|
+
set paused(value: boolean);
|
|
193
|
+
/** 表示から除外する state 名か(予約 prefix + hiddenStateNames、protocol §5) */
|
|
194
|
+
isHiddenStateName(name: string | null): boolean;
|
|
195
|
+
connect(): void;
|
|
196
|
+
/** 購読解除 + 台帳クリア(タイムラインは保持。protocol §7-2 の残留ゼロ) */
|
|
197
|
+
disconnect(): void;
|
|
198
|
+
onChange(listener: CoreChangeListener): () => void;
|
|
199
|
+
getSources(): IDevtoolsSourceLike[];
|
|
200
|
+
getRoster(): IRosterEntry[];
|
|
201
|
+
/** 全 source の state 要素一覧を pull で取り直す */
|
|
202
|
+
refreshRoster(): void;
|
|
203
|
+
getTimeline(): readonly ITimelineEntry[];
|
|
204
|
+
clearTimeline(): void;
|
|
205
|
+
/** 指定パスに束縛された配線(生存している binding のみ) */
|
|
206
|
+
getWiringForPath(stateName: string, path: string): IWiringEntry[];
|
|
207
|
+
/** 全配線のスナップショット(生存している binding のみ) */
|
|
208
|
+
getAllWiring(): IWiringEntry[];
|
|
209
|
+
/** 指定ノード(またはその子孫のバインドノード)に載る配線 */
|
|
210
|
+
getWiringForNode(node: Node): IWiringEntry[];
|
|
211
|
+
/** roster entry の state からトップレベルキーを列挙(keys 未実装ランタイムは空) */
|
|
212
|
+
keysOf(entry: IRosterEntry): string[];
|
|
213
|
+
readValue(entry: IRosterEntry, path: string, indexes?: number[]): unknown;
|
|
214
|
+
writeValue(entry: IRosterEntry, path: string, value: unknown, indexes?: number[]): void;
|
|
215
|
+
private _notify;
|
|
216
|
+
private _refreshRosterOf;
|
|
217
|
+
private _collectAlive;
|
|
218
|
+
private _appendTimeline;
|
|
219
|
+
private _labelOf;
|
|
220
|
+
private _ingest;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* shell/WcsDevtools.ts
|
|
225
|
+
*
|
|
226
|
+
* `<wcs-devtools>` — ページ内オーバーレイ DevTools 本体(devtools-tag-design.md)。
|
|
227
|
+
*
|
|
228
|
+
* - ShadowRoot 内で完結(ページの CSS/DOM を変更しない)
|
|
229
|
+
* - ハイライトはページ要素の style/class を触らず、fixed 配置の
|
|
230
|
+
* オーバーレイ枠で描く(devtools-tag-design.md §2)
|
|
231
|
+
* - UI レンダリングは vanilla DOM(記録済み決定: inspected ランタイムの
|
|
232
|
+
* updater キューに devtools 描画負荷を混ぜない = 観測者効果の排除。
|
|
233
|
+
* wcs-state ドッグフーディングは Phase 2 で再評価)
|
|
234
|
+
* - 描画は Core の change 通知を rAF で 1 回に合流(イベント毎 DOM 追加禁止、
|
|
235
|
+
* devtools-tag-design.md §3.3)
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
declare class WcsDevtools extends HTMLElement {
|
|
239
|
+
static get observedAttributes(): string[];
|
|
240
|
+
private _core;
|
|
241
|
+
private _removeCoreListener;
|
|
242
|
+
private _panel;
|
|
243
|
+
private _badge;
|
|
244
|
+
private _stateSelect;
|
|
245
|
+
private _paneElements;
|
|
246
|
+
private _highlightLayer;
|
|
247
|
+
private _dirtyPanes;
|
|
248
|
+
private _renderScheduled;
|
|
249
|
+
private _selectedRosterKey;
|
|
250
|
+
private _selectedPath;
|
|
251
|
+
private _pickedNode;
|
|
252
|
+
private _pickMode;
|
|
253
|
+
private _expanded;
|
|
254
|
+
private _hotkeyHandler;
|
|
255
|
+
private _pickHandler;
|
|
256
|
+
get core(): DevtoolsCore | null;
|
|
257
|
+
connectedCallback(): void;
|
|
258
|
+
disconnectedCallback(): void;
|
|
259
|
+
attributeChangedCallback(name: string): void;
|
|
260
|
+
/** テスト用: rAF を待たずに保留中の描画を実行する */
|
|
261
|
+
__flushRenderForTest(): void;
|
|
262
|
+
private _buildShadow;
|
|
263
|
+
private _headerButton;
|
|
264
|
+
get open(): boolean;
|
|
265
|
+
toggle(force?: boolean): void;
|
|
266
|
+
private _applyOpen;
|
|
267
|
+
private _applyDock;
|
|
268
|
+
private _installHotkey;
|
|
269
|
+
private _uninstallHotkey;
|
|
270
|
+
private _enterPickMode;
|
|
271
|
+
private _exitPickMode;
|
|
272
|
+
private _markDirty;
|
|
273
|
+
private _renderDirty;
|
|
274
|
+
private _rosterKey;
|
|
275
|
+
private _selectedRoster;
|
|
276
|
+
private _renderStatePane;
|
|
277
|
+
private _renderTreeNode;
|
|
278
|
+
private _beginEdit;
|
|
279
|
+
private _renderWiringPane;
|
|
280
|
+
private _scanRootOf;
|
|
281
|
+
private _wiringRow;
|
|
282
|
+
private _declaredRow;
|
|
283
|
+
private _renderTimelinePane;
|
|
284
|
+
private _timelineRow;
|
|
285
|
+
private _emptyRow;
|
|
286
|
+
private _highlightPath;
|
|
287
|
+
private _highlightNodes;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* core/formatValue.ts
|
|
292
|
+
*
|
|
293
|
+
* 値フォーマッタ(devtools-tag-design.md §6)。
|
|
294
|
+
*
|
|
295
|
+
* 規範:
|
|
296
|
+
* - primitive はそのまま(文字列は引用 + 80 文字上限)
|
|
297
|
+
* - 配列 / plain object は深さ制限 + 要素数制限つきの要約
|
|
298
|
+
* - それ以外(MediaStream, Blob, Element, class インスタンス等)は
|
|
299
|
+
* `[[ClassName]]` タグ表示のみ
|
|
300
|
+
* - structuredClone / JSON.stringify を全値に無差別適用しない
|
|
301
|
+
* (生ハンドル・循環・巨大値対策。camera G1 との共存)
|
|
302
|
+
*/
|
|
303
|
+
/**
|
|
304
|
+
* 任意の値を表示用の短い文字列へ変換する。
|
|
305
|
+
* @param value 対象値
|
|
306
|
+
* @param depth 再帰許容深さ(既定 2。0 で複合値は要約タグのみ)
|
|
307
|
+
*/
|
|
308
|
+
declare function formatValue(value: unknown, depth?: number): string;
|
|
309
|
+
/**
|
|
310
|
+
* token 引数の要約(先頭 3 引数 × 各 80 文字上限、devtools-tag-design.md §6)。
|
|
311
|
+
*/
|
|
312
|
+
declare function formatArgs(args: readonly unknown[]): string;
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* core/declaredScan.ts
|
|
316
|
+
*
|
|
317
|
+
* 遅延アタッチ時の declared ビュー(protocol §6)。
|
|
318
|
+
*
|
|
319
|
+
* binding 台帳はフック接続前の分を復元できないため、DOM に残っている
|
|
320
|
+
* `data-wcs` 属性と `<!--wcs-*: -->` コメントを再スキャンして
|
|
321
|
+
* 「宣言レベルの配線ビュー」を組む。ライブ台帳と違い binding 実体・
|
|
322
|
+
* 接続状態は分からない(UI では "declared" バッジで区別する)。
|
|
323
|
+
*
|
|
324
|
+
* パースは表示目的の簡易版(`prop[#mod]: path[@state][|filters]` を
|
|
325
|
+
* `;` 区切りで分解するだけ)。正確なセマンティクスの正本は
|
|
326
|
+
* @wcstack/state の bindTextParser であり、ここでは追随しない。
|
|
327
|
+
*/
|
|
328
|
+
interface IDeclaredBinding {
|
|
329
|
+
/** 宣言が載っている要素(コメント由来の場合は親要素) */
|
|
330
|
+
readonly element: Element;
|
|
331
|
+
readonly propName: string;
|
|
332
|
+
readonly path: string;
|
|
333
|
+
readonly stateName: string;
|
|
334
|
+
readonly filters: readonly string[];
|
|
335
|
+
/** 宣言ソース: data-wcs 属性か comment ノードか */
|
|
336
|
+
readonly origin: "attribute" | "comment";
|
|
337
|
+
readonly raw: string;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* rootNode 配下の宣言配線を列挙する。
|
|
341
|
+
* @param root 走査起点(Document / ShadowRoot / Element)
|
|
342
|
+
* @param bindAttributeName バインド属性名(既定 data-wcs。setConfig で変えたページ用)
|
|
343
|
+
*/
|
|
344
|
+
declare function scanDeclaredBindings(root: ParentNode, bindAttributeName?: string): IDeclaredBinding[];
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* protocol/registry.ts
|
|
348
|
+
*
|
|
349
|
+
* registry 最小実装の devtools 側コピー(protocol §2)。
|
|
350
|
+
* ロード順非依存にするため、ランタイム側(@wcstack/state の bridge)と
|
|
351
|
+
* devtools 側の両方が同一仕様の最小実装を持ち、先にロードされた方が
|
|
352
|
+
* globalThis に置く(先勝ち・振る舞い差し替えなし)。
|
|
353
|
+
*/
|
|
354
|
+
|
|
355
|
+
declare function getOrCreateHookRegistry(): IDevtoolsHookRegistryLike;
|
|
356
|
+
|
|
357
|
+
export { DEVTOOLS_HOOK_GLOBAL, DEVTOOLS_PROTOCOL_VERSION, DevtoolsCore, RESERVED_STATE_NAME_PREFIX, WcsDevtools, bootstrapDevtools, formatArgs, formatValue, getOrCreateHookRegistry, scanDeclaredBindings };
|
|
358
|
+
export type { CoreChangeKind, CoreChangeListener, DevtoolsEventLike, DevtoolsSinkLike, IAbsoluteAddressLike, IAbsolutePathInfoLike, IBindingLike, IDeclaredBinding, IDevtoolsCoreOptions, IDevtoolsHookRegistryLike, IDevtoolsListenerLike, IDevtoolsSourceLike, IListIndexLike, IPathInfoLike, IRosterEntry, IStateElementSummaryLike, ITimelineEntry, IWiringEntry, TimelineKind };
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/protocol/types.ts","../src/protocol/registry.ts","../src/core/formatValue.ts","../src/core/DevtoolsCore.ts","../src/core/declaredScan.ts","../src/shell/WcsDevtools.ts","../src/bootstrapDevtools.ts"],"sourcesContent":["/**\n * protocol/types.ts\n *\n * DevTools Hook Protocol (docs/devtools-hook-protocol.md) の devtools 側型定義。\n *\n * ランタイム(@wcstack/state)側の内部型は import しない — プロトコルは\n * 「文書化された構造」への構造的型付けで両側が独立に実装する(protocol §2)。\n * そのためランタイム内部オブジェクトは *Like インターフェースとして、\n * devtools が実際に触るプロパティだけを宣言する。\n */\n\n/** グローバル registry のプロパティ名 */\nexport const DEVTOOLS_HOOK_GLOBAL = \"__WCSTACK_DEVTOOLS_HOOK__\";\n\n/** プロトコル版。additive change では上げない(protocol §2) */\nexport const DEVTOOLS_PROTOCOL_VERSION = 1;\n\nexport interface IPathInfoLike {\n readonly path: string;\n}\n\nexport interface IAbsolutePathInfoLike {\n readonly stateName: string;\n readonly pathInfo: IPathInfoLike;\n}\n\nexport interface IListIndexLike {\n readonly index: number;\n readonly indexes: number[];\n}\n\nexport interface IAbsoluteAddressLike {\n readonly absolutePathInfo: IAbsolutePathInfoLike;\n readonly listIndex: IListIndexLike | null;\n}\n\nexport interface IBindingLike {\n readonly propName: string;\n readonly statePathName: string;\n readonly stateName: string;\n readonly bindingType: string;\n readonly node: Node;\n readonly replaceNode: Node;\n}\n\nexport interface IStateElementSummaryLike {\n readonly name: string;\n readonly rootNode: Node;\n readonly element: unknown;\n readonly paths: {\n readonly list: ReadonlySet<string>;\n readonly element: ReadonlySet<string>;\n readonly getter: ReadonlySet<string>;\n readonly setter: ReadonlySet<string>;\n };\n readonly commandTokenNames: ReadonlySet<string>;\n readonly eventTokenNames: ReadonlySet<string>;\n readonly staticDependency: ReadonlyMap<string, readonly string[]>;\n readonly dynamicDependency: ReadonlyMap<string, readonly string[]>;\n}\n\nexport type DevtoolsEventLike =\n | {\n readonly type: \"state:element-registered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: unknown;\n }\n | {\n readonly type: \"state:element-unregistered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: unknown;\n }\n | {\n readonly type: \"state:write\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n readonly value: unknown;\n readonly oldValue: unknown;\n readonly hasOldValue: boolean;\n }\n | {\n readonly type: \"state:update-batch\";\n readonly addresses: ReadonlySet<IAbsoluteAddressLike>;\n }\n | {\n readonly type: \"state:binding-added\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n readonly binding: IBindingLike;\n }\n | {\n readonly type: \"state:binding-removed\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n readonly binding: IBindingLike;\n }\n | {\n readonly type: \"state:binding-cleared\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n }\n | {\n readonly type: \"state:token-emit\";\n readonly kind: \"command\" | \"event\";\n readonly stateName: string | null;\n readonly tokenName: string;\n readonly args: readonly unknown[];\n readonly subscriberCount: number;\n };\n\nexport type DevtoolsSinkLike = (event: DevtoolsEventLike) => void;\n\nexport interface IDevtoolsSourceLike {\n readonly id: string;\n readonly kind: string;\n readonly packageVersion: string;\n getStateElements(): IStateElementSummaryLike[];\n /** protocol v1 追補 API。古いランタイムには無い可能性があるため optional 扱いで呼ぶ */\n keys?(name: string, rootNode: Node): string[];\n read(name: string, rootNode: Node, path: string, indexes?: number[]): unknown;\n write(name: string, rootNode: Node, path: string, value: unknown, indexes?: number[]): void;\n _setSink(sink: DevtoolsSinkLike | null): void;\n}\n\nexport interface IDevtoolsListenerLike {\n onSourceRegistered?(source: IDevtoolsSourceLike): void;\n onSourceUnregistered?(sourceId: string): void;\n onEvent?(sourceId: string, event: DevtoolsEventLike): void;\n}\n\nexport interface IDevtoolsHookRegistryLike {\n readonly version: number;\n readonly sources: Map<string, IDevtoolsSourceLike>;\n register(source: IDevtoolsSourceLike): void;\n unregister(sourceId: string): void;\n addListener(listener: IDevtoolsListenerLike): () => void;\n}\n","/**\n * protocol/registry.ts\n *\n * registry 最小実装の devtools 側コピー(protocol §2)。\n * ロード順非依存にするため、ランタイム側(@wcstack/state の bridge)と\n * devtools 側の両方が同一仕様の最小実装を持ち、先にロードされた方が\n * globalThis に置く(先勝ち・振る舞い差し替えなし)。\n */\n\nimport {\n DEVTOOLS_HOOK_GLOBAL,\n DEVTOOLS_PROTOCOL_VERSION,\n IDevtoolsHookRegistryLike,\n IDevtoolsListenerLike,\n IDevtoolsSourceLike,\n} from \"./types\";\n\nfunction createMinimalRegistry(): IDevtoolsHookRegistryLike {\n const sources = new Map<string, IDevtoolsSourceLike>();\n const listeners = new Set<IDevtoolsListenerLike>();\n const applySink = (source: IDevtoolsSourceLike): void => {\n if (listeners.size === 0) {\n source._setSink(null);\n return;\n }\n const sourceId = source.id;\n source._setSink((event) => {\n for (const listener of listeners) {\n listener.onEvent?.(sourceId, event);\n }\n });\n };\n return {\n version: DEVTOOLS_PROTOCOL_VERSION,\n sources,\n register(source: IDevtoolsSourceLike): void {\n if (sources.has(source.id)) {\n return;\n }\n sources.set(source.id, source);\n applySink(source);\n for (const listener of listeners) {\n listener.onSourceRegistered?.(source);\n }\n },\n unregister(sourceId: string): void {\n const source = sources.get(sourceId);\n if (source === undefined) {\n return;\n }\n source._setSink(null);\n sources.delete(sourceId);\n for (const listener of listeners) {\n listener.onSourceUnregistered?.(sourceId);\n }\n },\n addListener(listener: IDevtoolsListenerLike): () => void {\n listeners.add(listener);\n for (const source of sources.values()) {\n applySink(source);\n listener.onSourceRegistered?.(source);\n }\n return () => {\n if (!listeners.delete(listener)) {\n return;\n }\n for (const source of sources.values()) {\n applySink(source);\n }\n };\n },\n };\n}\n\nexport function getOrCreateHookRegistry(): IDevtoolsHookRegistryLike {\n const globals = globalThis as unknown as Record<string, unknown>;\n const existing = globals[DEVTOOLS_HOOK_GLOBAL] as IDevtoolsHookRegistryLike | undefined;\n if (existing !== undefined) {\n if (existing.version !== DEVTOOLS_PROTOCOL_VERSION) {\n // 先勝ち固定。振る舞いは差し替えない(protocol §2)\n console.warn(\n `[wcstack/devtools] hook registry version mismatch: found ${existing.version}, expected ${DEVTOOLS_PROTOCOL_VERSION}. Keeping the existing registry (first-wins).`\n );\n }\n return existing;\n }\n const registry = createMinimalRegistry();\n globals[DEVTOOLS_HOOK_GLOBAL] = registry;\n return registry;\n}\n","/**\n * core/formatValue.ts\n *\n * 値フォーマッタ(devtools-tag-design.md §6)。\n *\n * 規範:\n * - primitive はそのまま(文字列は引用 + 80 文字上限)\n * - 配列 / plain object は深さ制限 + 要素数制限つきの要約\n * - それ以外(MediaStream, Blob, Element, class インスタンス等)は\n * `[[ClassName]]` タグ表示のみ\n * - structuredClone / JSON.stringify を全値に無差別適用しない\n * (生ハンドル・循環・巨大値対策。camera G1 との共存)\n */\n\nconst MAX_STRING = 80;\nconst MAX_ITEMS = 3;\n\nfunction isPlainObject(value: object): boolean {\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction className(value: object): string {\n const ctor = (value as { constructor?: { name?: string } }).constructor;\n const name = ctor?.name;\n return typeof name === \"string\" && name.length > 0 ? name : \"Object\";\n}\n\n/**\n * 任意の値を表示用の短い文字列へ変換する。\n * @param value 対象値\n * @param depth 再帰許容深さ(既定 2。0 で複合値は要約タグのみ)\n */\nexport function formatValue(value: unknown, depth: number = 2): string {\n switch (typeof value) {\n case \"string\": {\n const body = value.length > MAX_STRING ? value.slice(0, MAX_STRING) + \"…\" : value;\n return `\"${body}\"`;\n }\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n return String(value);\n case \"symbol\":\n return value.toString();\n case \"undefined\":\n return \"undefined\";\n case \"function\":\n return \"[[Function]]\";\n default:\n break;\n }\n if (value === null) {\n return \"null\";\n }\n const objectValue = value as object;\n if (Array.isArray(objectValue)) {\n if (depth <= 0) {\n return `[[Array(${objectValue.length})]]`;\n }\n const shown = objectValue.slice(0, MAX_ITEMS).map((item) => formatValue(item, depth - 1));\n const rest = objectValue.length > MAX_ITEMS ? `, …(${objectValue.length})` : \"\";\n return `[${shown.join(\", \")}${rest}]`;\n }\n if (isPlainObject(objectValue)) {\n if (depth <= 0) {\n return \"[[Object]]\";\n }\n const keys = Object.keys(objectValue);\n const shown = keys.slice(0, MAX_ITEMS).map(\n (key) => `${key}: ${formatValue((objectValue as Record<string, unknown>)[key], depth - 1)}`\n );\n const rest = keys.length > MAX_ITEMS ? `, …(${keys.length})` : \"\";\n return `{${shown.join(\", \")}${rest}}`;\n }\n // DOM ノード・生ハンドル・class インスタンス等はタグ表示のみ\n return `[[${className(objectValue)}]]`;\n}\n\n/**\n * token 引数の要約(先頭 3 引数 × 各 80 文字上限、devtools-tag-design.md §6)。\n */\nexport function formatArgs(args: readonly unknown[]): string {\n if (args.length === 0) {\n return \"\";\n }\n const shown = args.slice(0, MAX_ITEMS).map((arg) => {\n const text = formatValue(arg, 1);\n return text.length > MAX_STRING ? text.slice(0, MAX_STRING) + \"…\" : text;\n });\n const rest = args.length > MAX_ITEMS ? `, …(${args.length})` : \"\";\n return `${shown.join(\", \")}${rest}`;\n}\n","/**\n * core/DevtoolsCore.ts\n *\n * hook client(devtools-tag-design.md §1)。DOM 非依存の純ロジック層。\n *\n * - registry への addListener / 解除(connect / disconnect)\n * - source 管理と roster(state 要素一覧)の維持\n * - 配線台帳(binding-added/removed イベントから構築。binding は WeakRef 保持)\n * - タイムライン ring buffer(既定 500 件 FIFO)\n * - 予約 prefix `wcs-devtools` の自己除外(protocol §5)\n *\n * 台帳はすべて devtools 側に置く(protocol 原則 2)。disconnect で\n * sources / roster / wiring をクリアし、残留参照を持たない。\n */\n\nimport { getOrCreateHookRegistry } from \"../protocol/registry\";\nimport {\n DevtoolsEventLike,\n IAbsoluteAddressLike,\n IBindingLike,\n IDevtoolsSourceLike,\n IStateElementSummaryLike,\n} from \"../protocol/types\";\nimport { formatArgs, formatValue } from \"./formatValue\";\n\n/** 予約 state 名 prefix(protocol §5)。この prefix の要素・イベントは常に除外 */\nexport const RESERVED_STATE_NAME_PREFIX = \"wcs-devtools\";\n\nconst DEFAULT_TIMELINE_CAPACITY = 500;\n\nexport type TimelineKind =\n | \"write\"\n | \"batch\"\n | \"command\"\n | \"event\"\n | \"element-registered\"\n | \"element-unregistered\";\n\nexport interface ITimelineEntry {\n readonly seq: number;\n readonly time: number;\n readonly sourceId: string;\n readonly kind: TimelineKind;\n readonly stateName: string | null;\n readonly label: string;\n readonly detail: string;\n readonly subscriberCount: number | null;\n}\n\nexport interface IRosterEntry {\n readonly sourceId: string;\n readonly name: string;\n readonly rootNode: Node;\n readonly summary: IStateElementSummaryLike;\n}\n\nexport interface IWiringEntry {\n readonly sourceId: string;\n readonly stateName: string;\n readonly path: string;\n readonly propName: string;\n readonly bindingType: string;\n readonly bindingRef: WeakRef<IBindingLike>;\n}\n\nexport type CoreChangeKind = \"sources\" | \"roster\" | \"wiring\" | \"timeline\";\nexport type CoreChangeListener = (kind: CoreChangeKind) => void;\n\nexport interface IDevtoolsCoreOptions {\n /** タイムライン ring buffer 件数(既定 500) */\n timelineCapacity?: number;\n /** 追加で除外する state 名(予約 prefix は常に除外) */\n hiddenStateNames?: readonly string[];\n}\n\nfunction pathKeyOf(stateName: string, path: string): string {\n return stateName + \"\u0000\" + path;\n}\n\nexport class DevtoolsCore {\n private _timelineCapacity: number;\n private _hiddenStateNames: Set<string>;\n private _removeListener: (() => void) | null = null;\n private _sources: Map<string, IDevtoolsSourceLike> = new Map();\n private _roster: Map<string, IRosterEntry[]> = new Map();\n private _wiringByPathKey: Map<string, Set<IWiringEntry>> = new Map();\n private _wiringEntryByBinding: WeakMap<IBindingLike, IWiringEntry> = new WeakMap();\n private _timeline: ITimelineEntry[] = [];\n private _seq: number = 0;\n private _paused: boolean = false;\n private _changeListeners: Set<CoreChangeListener> = new Set();\n\n constructor(options?: IDevtoolsCoreOptions) {\n this._timelineCapacity = options?.timelineCapacity ?? DEFAULT_TIMELINE_CAPACITY;\n this._hiddenStateNames = new Set(options?.hiddenStateNames ?? []);\n }\n\n get connected(): boolean {\n return this._removeListener !== null;\n }\n\n get paused(): boolean {\n return this._paused;\n }\n\n set paused(value: boolean) {\n this._paused = value;\n }\n\n /** 表示から除外する state 名か(予約 prefix + hiddenStateNames、protocol §5) */\n isHiddenStateName(name: string | null): boolean {\n if (name === null) {\n return false;\n }\n return name.startsWith(RESERVED_STATE_NAME_PREFIX) || this._hiddenStateNames.has(name);\n }\n\n connect(): void {\n if (this._removeListener !== null) {\n return;\n }\n const registry = getOrCreateHookRegistry();\n this._removeListener = registry.addListener({\n onSourceRegistered: (source) => {\n this._sources.set(source.id, source);\n this._refreshRosterOf(source);\n this._notify(\"sources\");\n },\n onSourceUnregistered: (sourceId) => {\n this._sources.delete(sourceId);\n this._roster.delete(sourceId);\n this._notify(\"sources\");\n this._notify(\"roster\");\n },\n onEvent: (sourceId, event) => {\n this._ingest(sourceId, event);\n },\n });\n }\n\n /** 購読解除 + 台帳クリア(タイムラインは保持。protocol §7-2 の残留ゼロ) */\n disconnect(): void {\n if (this._removeListener === null) {\n return;\n }\n this._removeListener();\n this._removeListener = null;\n this._sources.clear();\n this._roster.clear();\n this._wiringByPathKey.clear();\n this._wiringEntryByBinding = new WeakMap();\n this._notify(\"sources\");\n this._notify(\"roster\");\n this._notify(\"wiring\");\n }\n\n onChange(listener: CoreChangeListener): () => void {\n this._changeListeners.add(listener);\n return () => {\n this._changeListeners.delete(listener);\n };\n }\n\n getSources(): IDevtoolsSourceLike[] {\n return [...this._sources.values()];\n }\n\n getRoster(): IRosterEntry[] {\n const entries: IRosterEntry[] = [];\n for (const list of this._roster.values()) {\n entries.push(...list);\n }\n return entries;\n }\n\n /** 全 source の state 要素一覧を pull で取り直す */\n refreshRoster(): void {\n for (const source of this._sources.values()) {\n this._refreshRosterOf(source);\n }\n this._notify(\"roster\");\n }\n\n getTimeline(): readonly ITimelineEntry[] {\n return this._timeline;\n }\n\n clearTimeline(): void {\n this._timeline = [];\n this._notify(\"timeline\");\n }\n\n /** 指定パスに束縛された配線(生存している binding のみ) */\n getWiringForPath(stateName: string, path: string): IWiringEntry[] {\n const set = this._wiringByPathKey.get(pathKeyOf(stateName, path));\n if (set === undefined) {\n return [];\n }\n return this._collectAlive(set);\n }\n\n /** 全配線のスナップショット(生存している binding のみ) */\n getAllWiring(): IWiringEntry[] {\n const result: IWiringEntry[] = [];\n for (const set of this._wiringByPathKey.values()) {\n result.push(...this._collectAlive(set));\n }\n return result;\n }\n\n /** 指定ノード(またはその子孫のバインドノード)に載る配線 */\n getWiringForNode(node: Node): IWiringEntry[] {\n const result: IWiringEntry[] = [];\n for (const set of this._wiringByPathKey.values()) {\n for (const entry of this._collectAlive(set)) {\n const binding = entry.bindingRef.deref()!;\n if (\n binding.node === node ||\n binding.replaceNode === node ||\n node.contains(binding.node) ||\n node.contains(binding.replaceNode)\n ) {\n result.push(entry);\n }\n }\n }\n return result;\n }\n\n /** roster entry の state からトップレベルキーを列挙(keys 未実装ランタイムは空) */\n keysOf(entry: IRosterEntry): string[] {\n const source = this._sources.get(entry.sourceId);\n if (source === undefined || typeof source.keys !== \"function\") {\n return [];\n }\n return source.keys(entry.name, entry.rootNode);\n }\n\n readValue(entry: IRosterEntry, path: string, indexes?: number[]): unknown {\n const source = this._sources.get(entry.sourceId);\n if (source === undefined) {\n return undefined;\n }\n return source.read(entry.name, entry.rootNode, path, indexes);\n }\n\n writeValue(entry: IRosterEntry, path: string, value: unknown, indexes?: number[]): void {\n const source = this._sources.get(entry.sourceId);\n if (source === undefined) {\n return;\n }\n source.write(entry.name, entry.rootNode, path, value, indexes);\n }\n\n // --- internal ---\n\n private _notify(kind: CoreChangeKind): void {\n for (const listener of this._changeListeners) {\n listener(kind);\n }\n }\n\n private _refreshRosterOf(source: IDevtoolsSourceLike): void {\n const entries: IRosterEntry[] = [];\n for (const summary of source.getStateElements()) {\n if (this.isHiddenStateName(summary.name)) {\n continue;\n }\n entries.push({\n sourceId: source.id,\n name: summary.name,\n rootNode: summary.rootNode,\n summary,\n });\n }\n this._roster.set(source.id, entries);\n }\n\n private _collectAlive(set: Set<IWiringEntry>): IWiringEntry[] {\n const alive: IWiringEntry[] = [];\n for (const entry of set) {\n if (entry.bindingRef.deref() === undefined) {\n // GC 済み binding は遅延剪定(detach 漏れで DOM を残さないための WeakRef 側)\n set.delete(entry);\n continue;\n }\n alive.push(entry);\n }\n return alive;\n }\n\n private _appendTimeline(entry: Omit<ITimelineEntry, \"seq\" | \"time\">): void {\n if (this._paused) {\n return;\n }\n this._timeline.push({\n ...entry,\n seq: this._seq++,\n time: performance.now(),\n });\n const overflow = this._timeline.length - this._timelineCapacity;\n if (overflow > 0) {\n this._timeline.splice(0, overflow);\n }\n this._notify(\"timeline\");\n }\n\n private _labelOf(address: IAbsoluteAddressLike): string {\n const indexes = address.listIndex?.indexes;\n const path = address.absolutePathInfo.pathInfo.path;\n return indexes !== undefined ? `${path}[${indexes.join(\",\")}]` : path;\n }\n\n private _ingest(sourceId: string, event: DevtoolsEventLike): void {\n switch (event.type) {\n case \"state:element-registered\": {\n if (this.isHiddenStateName(event.name)) {\n return;\n }\n const source = this._sources.get(sourceId);\n if (source !== undefined) {\n this._refreshRosterOf(source);\n this._notify(\"roster\");\n }\n this._appendTimeline({\n sourceId,\n kind: \"element-registered\",\n stateName: event.name,\n label: event.name,\n detail: \"\",\n subscriberCount: null,\n });\n return;\n }\n case \"state:element-unregistered\": {\n if (this.isHiddenStateName(event.name)) {\n return;\n }\n const source = this._sources.get(sourceId);\n if (source !== undefined) {\n this._refreshRosterOf(source);\n this._notify(\"roster\");\n }\n this._appendTimeline({\n sourceId,\n kind: \"element-unregistered\",\n stateName: event.name,\n label: event.name,\n detail: \"\",\n subscriberCount: null,\n });\n return;\n }\n case \"state:write\": {\n const stateName = event.absoluteAddress.absolutePathInfo.stateName;\n if (this.isHiddenStateName(stateName)) {\n return;\n }\n const detail = event.hasOldValue\n ? `${formatValue(event.value)} (was ${formatValue(event.oldValue)})`\n : formatValue(event.value);\n this._appendTimeline({\n sourceId,\n kind: \"write\",\n stateName,\n label: this._labelOf(event.absoluteAddress),\n detail,\n subscriberCount: null,\n });\n return;\n }\n case \"state:update-batch\": {\n const labels: string[] = [];\n let total = 0;\n for (const address of event.addresses) {\n if (this.isHiddenStateName(address.absolutePathInfo.stateName)) {\n continue;\n }\n total++;\n if (labels.length < 3) {\n labels.push(this._labelOf(address));\n }\n }\n if (total === 0) {\n return;\n }\n const rest = total > labels.length ? `, …(${total})` : \"\";\n this._appendTimeline({\n sourceId,\n kind: \"batch\",\n stateName: null,\n label: `${total} address${total === 1 ? \"\" : \"es\"}`,\n detail: `${labels.join(\", \")}${rest}`,\n subscriberCount: null,\n });\n return;\n }\n case \"state:binding-added\": {\n const stateName = event.absoluteAddress.absolutePathInfo.stateName;\n if (this.isHiddenStateName(stateName)) {\n return;\n }\n const path = event.absoluteAddress.absolutePathInfo.pathInfo.path;\n const key = pathKeyOf(stateName, path);\n let set = this._wiringByPathKey.get(key);\n if (set === undefined) {\n set = new Set();\n this._wiringByPathKey.set(key, set);\n }\n const entry: IWiringEntry = {\n sourceId,\n stateName,\n path,\n propName: event.binding.propName,\n bindingType: event.binding.bindingType,\n bindingRef: new WeakRef(event.binding),\n };\n set.add(entry);\n this._wiringEntryByBinding.set(event.binding, entry);\n this._notify(\"wiring\");\n return;\n }\n case \"state:binding-removed\": {\n const entry = this._wiringEntryByBinding.get(event.binding);\n if (entry === undefined) {\n return;\n }\n this._wiringEntryByBinding.delete(event.binding);\n const key = pathKeyOf(entry.stateName, entry.path);\n const set = this._wiringByPathKey.get(key);\n if (set !== undefined) {\n set.delete(entry);\n if (set.size === 0) {\n this._wiringByPathKey.delete(key);\n }\n }\n this._notify(\"wiring\");\n return;\n }\n case \"state:binding-cleared\": {\n const stateName = event.absoluteAddress.absolutePathInfo.stateName;\n const path = event.absoluteAddress.absolutePathInfo.pathInfo.path;\n const key = pathKeyOf(stateName, path);\n if (this._wiringByPathKey.delete(key)) {\n this._notify(\"wiring\");\n }\n return;\n }\n case \"state:token-emit\": {\n if (this.isHiddenStateName(event.stateName)) {\n return;\n }\n this._appendTimeline({\n sourceId,\n kind: event.kind,\n stateName: event.stateName,\n label: event.tokenName,\n detail: formatArgs(event.args),\n subscriberCount: event.subscriberCount,\n });\n return;\n }\n }\n }\n}\n","/**\n * core/declaredScan.ts\n *\n * 遅延アタッチ時の declared ビュー(protocol §6)。\n *\n * binding 台帳はフック接続前の分を復元できないため、DOM に残っている\n * `data-wcs` 属性と `<!--wcs-*: -->` コメントを再スキャンして\n * 「宣言レベルの配線ビュー」を組む。ライブ台帳と違い binding 実体・\n * 接続状態は分からない(UI では \"declared\" バッジで区別する)。\n *\n * パースは表示目的の簡易版(`prop[#mod]: path[@state][|filters]` を\n * `;` 区切りで分解するだけ)。正確なセマンティクスの正本は\n * @wcstack/state の bindTextParser であり、ここでは追随しない。\n */\n\nexport interface IDeclaredBinding {\n /** 宣言が載っている要素(コメント由来の場合は親要素) */\n readonly element: Element;\n readonly propName: string;\n readonly path: string;\n readonly stateName: string;\n readonly filters: readonly string[];\n /** 宣言ソース: data-wcs 属性か comment ノードか */\n readonly origin: \"attribute\" | \"comment\";\n readonly raw: string;\n}\n\nconst DEFAULT_BIND_ATTRIBUTE = \"data-wcs\";\nconst COMMENT_PREFIXES = [\"wcs-text\", \"wcs-for\", \"wcs-if\", \"wcs-elseif\", \"wcs-else\"];\n\nfunction parseEntry(\n element: Element,\n raw: string,\n origin: \"attribute\" | \"comment\"\n): IDeclaredBinding | null {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return null;\n }\n const colon = trimmed.indexOf(\":\");\n if (colon < 0) {\n return null;\n }\n const propName = trimmed.slice(0, colon).trim();\n const rhs = trimmed.slice(colon + 1).trim();\n if (propName.length === 0 || rhs.length === 0) {\n return null;\n }\n const [pathPart, ...filterParts] = rhs.split(\"|\").map((part) => part.trim());\n let path = pathPart;\n let stateName = \"default\";\n const at = pathPart.lastIndexOf(\"@\");\n if (at > 0) {\n path = pathPart.slice(0, at).trim();\n stateName = pathPart.slice(at + 1).trim();\n }\n return {\n element,\n propName,\n path,\n stateName,\n filters: filterParts.filter((part) => part.length > 0),\n origin,\n raw: trimmed,\n };\n}\n\n/**\n * rootNode 配下の宣言配線を列挙する。\n * @param root 走査起点(Document / ShadowRoot / Element)\n * @param bindAttributeName バインド属性名(既定 data-wcs。setConfig で変えたページ用)\n */\nexport function scanDeclaredBindings(\n root: ParentNode,\n bindAttributeName: string = DEFAULT_BIND_ATTRIBUTE\n): IDeclaredBinding[] {\n const result: IDeclaredBinding[] = [];\n\n // data-wcs 属性(template の for/if 宣言もこの属性に載る)\n for (const element of root.querySelectorAll(`[${bindAttributeName}]`)) {\n // querySelectorAll の一致条件上、属性は必ず存在する\n const raw = element.getAttribute(bindAttributeName)!;\n for (const part of raw.split(\";\")) {\n const entry = parseEntry(element, part, \"attribute\");\n if (entry !== null) {\n result.push(entry);\n }\n }\n }\n\n // <!--wcs-text: path--> 等のコメントノード(mustache 展開後の姿)\n const document = root.ownerDocument ?? (root as Document);\n const walker = document.createTreeWalker(root as Node, NodeFilter.SHOW_COMMENT);\n let comment = walker.nextNode();\n while (comment !== null) {\n // コメントノードの textContent は常に文字列\n const text = comment.textContent!.trim();\n const prefix = COMMENT_PREFIXES.find(\n (candidate) => text === candidate || text.startsWith(candidate + \":\")\n );\n if (prefix !== undefined) {\n const parentElement =\n comment.parentNode instanceof Element ? comment.parentNode : null;\n if (parentElement !== null) {\n const body = text === prefix ? \"\" : text.slice(prefix.length + 1).trim();\n if (body.length > 0) {\n const propName = prefix === \"wcs-text\" ? \"textContent\" : prefix.slice(\"wcs-\".length);\n // propName / body とも非空のため parseEntry は必ず成功する\n result.push(parseEntry(parentElement, `${propName}: ${body}`, \"comment\")!);\n }\n }\n }\n comment = walker.nextNode();\n }\n\n return result;\n}\n","/**\n * shell/WcsDevtools.ts\n *\n * `<wcs-devtools>` — ページ内オーバーレイ DevTools 本体(devtools-tag-design.md)。\n *\n * - ShadowRoot 内で完結(ページの CSS/DOM を変更しない)\n * - ハイライトはページ要素の style/class を触らず、fixed 配置の\n * オーバーレイ枠で描く(devtools-tag-design.md §2)\n * - UI レンダリングは vanilla DOM(記録済み決定: inspected ランタイムの\n * updater キューに devtools 描画負荷を混ぜない = 観測者効果の排除。\n * wcs-state ドッグフーディングは Phase 2 で再評価)\n * - 描画は Core の change 通知を rAF で 1 回に合流(イベント毎 DOM 追加禁止、\n * devtools-tag-design.md §3.3)\n */\n\nimport { DevtoolsCore, IRosterEntry, ITimelineEntry, IWiringEntry } from \"../core/DevtoolsCore\";\nimport { formatValue } from \"../core/formatValue\";\nimport { IDeclaredBinding, scanDeclaredBindings } from \"../core/declaredScan\";\n\nconst STYLE_TEXT = /* css */ `\n:host {\n all: initial;\n position: fixed;\n z-index: 2147483647;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n inset: auto 0 0 auto;\n}\n* { box-sizing: border-box; }\n.badge {\n position: fixed;\n right: 12px;\n bottom: 12px;\n width: 40px;\n height: 40px;\n border-radius: 20px;\n border: 1px solid #2b4f78;\n background: #10263f;\n color: #9fd0ff;\n font-weight: 700;\n cursor: pointer;\n}\n.panel {\n position: fixed;\n display: flex;\n flex-direction: column;\n background: #0d1b2a;\n color: #d7e3f4;\n border: 1px solid #2b4f78;\n box-shadow: 0 0 24px rgba(0,0,0,.5);\n}\n.panel.dock-bottom { left: 0; right: 0; bottom: 0; height: 45vh; }\n.panel.dock-right { top: 0; right: 0; bottom: 0; width: 420px; }\n.panel[hidden] { display: none; }\nheader {\n display: flex;\n gap: 6px;\n align-items: center;\n padding: 6px 8px;\n border-bottom: 1px solid #2b4f78;\n background: #10263f;\n}\nheader .title { font-weight: 700; color: #9fd0ff; margin-right: 4px; }\nheader select, header button {\n font: inherit;\n background: #16324f;\n color: #d7e3f4;\n border: 1px solid #2b4f78;\n border-radius: 4px;\n padding: 2px 8px;\n cursor: pointer;\n}\nheader button[aria-pressed=\"true\"] { background: #2b5d8f; }\nheader .spacer { flex: 1; }\n.panes { display: flex; flex: 1; min-height: 0; }\n.pane { flex: 1; min-width: 0; overflow: auto; padding: 6px 8px; border-right: 1px solid #1d3a5c; }\n.pane:last-child { border-right: none; }\n.pane h3 {\n margin: 0 0 6px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: .08em;\n color: #7ba7d4;\n}\n.tree-row { display: flex; gap: 6px; padding: 1px 0; align-items: baseline; white-space: nowrap; }\n.tree-row .toggle { width: 14px; cursor: pointer; color: #7ba7d4; user-select: none; }\n.tree-row .key { color: #9fd0ff; cursor: pointer; }\n.tree-row .value { color: #ffd9a0; overflow: hidden; text-overflow: ellipsis; }\n.tree-row .value.editable { cursor: pointer; }\n.tree-row input { font: inherit; background: #16324f; color: #ffd9a0; border: 1px solid #2b4f78; }\n.badge-tag {\n display: inline-block;\n padding: 0 4px;\n border-radius: 3px;\n font-size: 10px;\n background: #26456a;\n color: #a8c6e8;\n}\n.badge-tag.warn { background: #6a3326; color: #ffb3a0; }\n.badge-tag.declared { background: #4a4426; color: #efe3a0; }\n.wiring-row, .timeline-row { padding: 1px 0; white-space: nowrap; }\n.wiring-row .prop { color: #b7f0c0; }\n.wiring-row .path { color: #9fd0ff; }\n.timeline-row .t { color: #6f88a3; }\n.timeline-row .label { color: #9fd0ff; }\n.timeline-row .detail { color: #ffd9a0; }\n.timeline-row .kind { display: inline-block; min-width: 52px; text-align: center; }\n.empty { color: #6f88a3; font-style: italic; padding: 4px 0; }\n.notice { color: #efe3a0; padding: 2px 0 6px; }\n.notice button { font: inherit; margin-left: 6px; cursor: pointer; }\n.hl-box {\n position: fixed;\n pointer-events: none;\n border: 1px solid #58c2ff;\n background: rgba(88,194,255,.18);\n}\n`;\n\ntype PaneName = \"state\" | \"wiring\" | \"timeline\";\n\n/** タイムラインの DOM 描画上限(buffer とは別。§3.3 のバースト圧縮の一部) */\nconst TIMELINE_RENDER_LIMIT = 200;\n/** リスト展開の 1 階層あたり表示件数上限 */\nconst LIST_CHILD_LIMIT = 20;\n\ninterface ITreeNodeRef {\n readonly path: string;\n readonly indexes: number[];\n}\n\nfunction nodeKeyOf(ref: ITreeNodeRef): string {\n return `${ref.path}#${ref.indexes.join(\",\")}`;\n}\n\nfunction isExpandable(value: unknown): boolean {\n if (Array.isArray(value)) {\n return true;\n }\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction coerceInput(text: string): unknown {\n const trimmed = text.trim();\n try {\n return JSON.parse(trimmed);\n } catch {\n return text;\n }\n}\n\nexport class WcsDevtools extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\"open\", \"dock\", \"hotkey\"];\n }\n\n private _core: DevtoolsCore | null = null;\n private _removeCoreListener: (() => void) | null = null;\n private _panel: HTMLElement | null = null;\n private _badge: HTMLButtonElement | null = null;\n private _stateSelect: HTMLSelectElement | null = null;\n private _paneElements: Partial<Record<PaneName, HTMLElement>> = {};\n private _highlightLayer: HTMLElement | null = null;\n private _dirtyPanes: Set<PaneName> = new Set();\n private _renderScheduled: boolean = false;\n private _selectedRosterKey: string | null = null;\n private _selectedPath: string | null = null;\n private _pickedNode: Node | null = null;\n private _pickMode: boolean = false;\n private _expanded: Set<string> = new Set();\n private _hotkeyHandler: ((event: KeyboardEvent) => void) | null = null;\n private _pickHandler: ((event: MouseEvent) => void) | null = null;\n\n get core(): DevtoolsCore | null {\n return this._core;\n }\n\n connectedCallback(): void {\n // SSR では不活性(protocol 原則 6)\n if (document.documentElement.hasAttribute(\"data-wcs-server\")) {\n return;\n }\n if (this.shadowRoot === null) {\n this._buildShadow();\n }\n const capacity = Number(this.getAttribute(\"buffer\") ?? \"\");\n const hidden = (this.getAttribute(\"hidden-states\") ?? \"\")\n .split(\",\")\n .map((name) => name.trim())\n .filter((name) => name.length > 0);\n this._core = new DevtoolsCore({\n timelineCapacity: Number.isFinite(capacity) && capacity > 0 ? capacity : undefined,\n hiddenStateNames: hidden,\n });\n this._removeCoreListener = this._core.onChange((kind) => {\n if (kind === \"roster\" || kind === \"sources\") {\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n } else if (kind === \"wiring\") {\n this._markDirty(\"wiring\");\n } else {\n this._markDirty(\"timeline\");\n }\n });\n this._core.connect();\n this._applyDock();\n this._applyOpen();\n this._installHotkey();\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n this._markDirty(\"timeline\");\n }\n\n disconnectedCallback(): void {\n this._removeCoreListener?.();\n this._removeCoreListener = null;\n this._core?.disconnect();\n this._core = null;\n this._uninstallHotkey();\n this._exitPickMode();\n }\n\n attributeChangedCallback(name: string): void {\n if (this.shadowRoot === null) {\n return;\n }\n if (name === \"open\") {\n this._applyOpen();\n } else if (name === \"dock\") {\n this._applyDock();\n } else if (name === \"hotkey\") {\n this._uninstallHotkey();\n this._installHotkey();\n }\n }\n\n /** テスト用: rAF を待たずに保留中の描画を実行する */\n __flushRenderForTest(): void {\n this._renderDirty();\n }\n\n // --- shadow construction ---\n\n private _buildShadow(): void {\n const shadow = this.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = STYLE_TEXT;\n shadow.append(style);\n\n const badge = document.createElement(\"button\");\n badge.className = \"badge\";\n badge.title = \"wcstack DevTools\";\n badge.textContent = \"WCS\";\n badge.addEventListener(\"click\", () => this.toggle());\n shadow.append(badge);\n this._badge = badge;\n\n const panel = document.createElement(\"div\");\n panel.className = \"panel dock-bottom\";\n panel.hidden = true;\n\n const header = document.createElement(\"header\");\n const title = document.createElement(\"span\");\n title.className = \"title\";\n title.textContent = \"wcstack devtools\";\n header.append(title);\n\n const stateSelect = document.createElement(\"select\");\n stateSelect.title = \"state element\";\n stateSelect.addEventListener(\"change\", () => {\n this._selectedRosterKey = stateSelect.value || null;\n this._selectedPath = null;\n this._expanded.clear();\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n });\n header.append(stateSelect);\n this._stateSelect = stateSelect;\n\n const pickButton = this._headerButton(header, \"⌖ pick\", \"pick a page element\");\n pickButton.addEventListener(\"click\", () => {\n if (this._pickMode) {\n this._exitPickMode();\n } else {\n this._enterPickMode();\n }\n pickButton.setAttribute(\"aria-pressed\", String(this._pickMode));\n });\n pickButton.dataset[\"role\"] = \"pick\";\n\n const pauseButton = this._headerButton(header, \"⏸\", \"pause timeline\");\n pauseButton.addEventListener(\"click\", () => {\n const core = this._core;\n if (core === null) {\n return;\n }\n core.paused = !core.paused;\n pauseButton.setAttribute(\"aria-pressed\", String(core.paused));\n });\n pauseButton.dataset[\"role\"] = \"pause\";\n\n const clearButton = this._headerButton(header, \"🗑\", \"clear timeline\");\n clearButton.addEventListener(\"click\", () => {\n this._core?.clearTimeline();\n });\n clearButton.dataset[\"role\"] = \"clear\";\n\n const spacer = document.createElement(\"span\");\n spacer.className = \"spacer\";\n header.append(spacer);\n\n const dockButton = this._headerButton(header, \"dock\", \"toggle dock position\");\n dockButton.addEventListener(\"click\", () => {\n const next = (this.getAttribute(\"dock\") ?? \"bottom\") === \"bottom\" ? \"right\" : \"bottom\";\n this.setAttribute(\"dock\", next);\n });\n dockButton.dataset[\"role\"] = \"dock\";\n\n const closeButton = this._headerButton(header, \"×\", \"close\");\n closeButton.addEventListener(\"click\", () => this.toggle(false));\n closeButton.dataset[\"role\"] = \"close\";\n\n panel.append(header);\n\n const panes = document.createElement(\"div\");\n panes.className = \"panes\";\n for (const [name, heading] of [\n [\"state\", \"State\"],\n [\"wiring\", \"Wiring\"],\n [\"timeline\", \"Timeline\"],\n ] as const) {\n const pane = document.createElement(\"section\");\n pane.className = `pane pane-${name}`;\n const h3 = document.createElement(\"h3\");\n h3.textContent = heading;\n const body = document.createElement(\"div\");\n body.className = \"pane-body\";\n pane.append(h3, body);\n panes.append(pane);\n this._paneElements[name] = body;\n }\n panel.append(panes);\n shadow.append(panel);\n this._panel = panel;\n\n const highlightLayer = document.createElement(\"div\");\n highlightLayer.className = \"hl-layer\";\n shadow.append(highlightLayer);\n this._highlightLayer = highlightLayer;\n }\n\n private _headerButton(header: HTMLElement, label: string, title: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.textContent = label;\n button.title = title;\n button.setAttribute(\"aria-pressed\", \"false\");\n header.append(button);\n return button;\n }\n\n // --- open/close/dock/hotkey ---\n\n get open(): boolean {\n return this.hasAttribute(\"open\");\n }\n\n toggle(force?: boolean): void {\n const next = force ?? !this.open;\n if (next) {\n this.setAttribute(\"open\", \"\");\n } else {\n this.removeAttribute(\"open\");\n }\n }\n\n private _applyOpen(): void {\n // shadowRoot 構築後にしか呼ばれない(attributeChangedCallback 側でガード済み)\n this._panel!.hidden = !this.open;\n this._badge!.hidden = this.open;\n if (this.open) {\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n this._markDirty(\"timeline\");\n }\n }\n\n private _applyDock(): void {\n // shadowRoot 構築後にしか呼ばれない(attributeChangedCallback 側でガード済み)\n const dock = this.getAttribute(\"dock\") === \"right\" ? \"right\" : \"bottom\";\n this._panel!.classList.toggle(\"dock-right\", dock === \"right\");\n this._panel!.classList.toggle(\"dock-bottom\", dock === \"bottom\");\n }\n\n private _installHotkey(): void {\n const spec = this.getAttribute(\"hotkey\") ?? \"Alt+Shift+D\";\n if (spec === \"none\") {\n return;\n }\n const parts = spec.split(\"+\").map((part) => part.trim().toLowerCase());\n const key = parts[parts.length - 1];\n const alt = parts.includes(\"alt\");\n const shift = parts.includes(\"shift\");\n const ctrl = parts.includes(\"ctrl\");\n const meta = parts.includes(\"meta\");\n this._hotkeyHandler = (event: KeyboardEvent) => {\n if (\n event.key.toLowerCase() === key &&\n event.altKey === alt &&\n event.shiftKey === shift &&\n event.ctrlKey === ctrl &&\n event.metaKey === meta\n ) {\n event.preventDefault();\n this.toggle();\n }\n };\n window.addEventListener(\"keydown\", this._hotkeyHandler);\n }\n\n private _uninstallHotkey(): void {\n if (this._hotkeyHandler !== null) {\n window.removeEventListener(\"keydown\", this._hotkeyHandler);\n this._hotkeyHandler = null;\n }\n }\n\n // --- pick mode ---\n\n private _enterPickMode(): void {\n // 呼び出し元(pick ボタン)が toggle 済みのため、ここでは常に開始でよい\n this._pickMode = true;\n // click を capture で奪う(誤操作防止、devtools-tag-design.md G-U2 の既定側)\n this._pickHandler = (event: MouseEvent) => {\n const target = event.target as Node;\n // devtools 自身(実ブラウザでは retarget されて host、shadow 非 retarget 環境では\n // shadow 内ノード)は pick 対象外\n if (target.getRootNode() === this.shadowRoot || target === this) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this._pickedNode = target;\n this._selectedPath = null;\n this._exitPickMode();\n this._markDirty(\"wiring\");\n };\n document.addEventListener(\"click\", this._pickHandler, { capture: true });\n }\n\n private _exitPickMode(): void {\n if (this._pickHandler !== null) {\n document.removeEventListener(\"click\", this._pickHandler, { capture: true });\n this._pickHandler = null;\n }\n this._pickMode = false;\n const pickButton = this.shadowRoot?.querySelector('button[data-role=\"pick\"]');\n pickButton?.setAttribute(\"aria-pressed\", \"false\");\n }\n\n // --- rendering ---\n\n private _markDirty(pane: PaneName): void {\n this._dirtyPanes.add(pane);\n if (this._renderScheduled) {\n return;\n }\n this._renderScheduled = true;\n requestAnimationFrame(() => {\n this._renderDirty();\n });\n }\n\n private _renderDirty(): void {\n this._renderScheduled = false;\n if (this._core === null || this.shadowRoot === null) {\n this._dirtyPanes.clear();\n return;\n }\n const dirty = this._dirtyPanes;\n this._dirtyPanes = new Set();\n if (dirty.has(\"state\")) {\n this._renderStatePane();\n }\n if (dirty.has(\"wiring\")) {\n this._renderWiringPane();\n }\n if (dirty.has(\"timeline\")) {\n this._renderTimelinePane();\n }\n }\n\n private _rosterKey(entry: IRosterEntry): string {\n return `${entry.sourceId}:${entry.name}`;\n }\n\n private _selectedRoster(): IRosterEntry | null {\n const core = this._core!;\n const roster = core.getRoster();\n if (roster.length === 0) {\n return null;\n }\n const found = roster.find((entry) => this._rosterKey(entry) === this._selectedRosterKey);\n return found ?? roster[0];\n }\n\n private _renderStatePane(): void {\n const core = this._core!;\n const body = this._paneElements[\"state\"]!;\n const select = this._stateSelect!;\n const roster = core.getRoster();\n const selected = this._selectedRoster();\n\n select.replaceChildren(\n ...roster.map((entry) => {\n const option = document.createElement(\"option\");\n option.value = this._rosterKey(entry);\n option.textContent = `${entry.name} (${entry.sourceId.slice(0, 12)})`;\n option.selected = selected !== null && this._rosterKey(entry) === this._rosterKey(selected);\n return option;\n })\n );\n\n body.replaceChildren();\n if (selected === null) {\n body.append(this._emptyRow(\"no <wcs-state> elements observed\"));\n return;\n }\n this._selectedRosterKey = this._rosterKey(selected);\n const keys = core.keysOf(selected);\n if (keys.length === 0) {\n body.append(this._emptyRow(\"no readable keys (runtime without keys() API?)\"));\n return;\n }\n for (const key of keys) {\n this._renderTreeNode(body, selected, { path: key, indexes: [] }, key, 0);\n }\n }\n\n private _renderTreeNode(\n container: HTMLElement,\n entry: IRosterEntry,\n ref: ITreeNodeRef,\n label: string,\n depth: number\n ): void {\n const core = this._core!;\n let value: unknown;\n let readable = true;\n try {\n value = core.readValue(entry, ref.path, ref.indexes);\n } catch {\n readable = false;\n }\n\n const row = document.createElement(\"div\");\n row.className = \"tree-row\";\n row.style.paddingLeft = `${depth * 14}px`;\n\n const expandable = readable && isExpandable(value);\n const key = nodeKeyOf(ref);\n const expanded = expandable && this._expanded.has(key);\n\n const toggle = document.createElement(\"span\");\n toggle.className = \"toggle\";\n toggle.textContent = expandable ? (expanded ? \"▾\" : \"▸\") : \"\";\n if (expandable) {\n toggle.addEventListener(\"click\", () => {\n if (this._expanded.has(key)) {\n this._expanded.delete(key);\n } else {\n this._expanded.add(key);\n }\n this._markDirty(\"state\");\n });\n }\n row.append(toggle);\n\n const keySpan = document.createElement(\"span\");\n keySpan.className = \"key\";\n keySpan.textContent = `${label}:`;\n keySpan.title = ref.path;\n keySpan.addEventListener(\"click\", () => {\n this._selectedPath = ref.path;\n this._pickedNode = null;\n this._markDirty(\"wiring\");\n this._highlightPath(entry, ref.path);\n });\n row.append(keySpan);\n\n const valueSpan = document.createElement(\"span\");\n valueSpan.className = \"value\";\n if (!readable) {\n valueSpan.textContent = \"(unreadable getter)\";\n } else {\n valueSpan.textContent = formatValue(value, 1);\n const editable = value === null || typeof value !== \"object\";\n if (editable && typeof value !== \"function\") {\n valueSpan.classList.add(\"editable\");\n valueSpan.title = \"click to edit\";\n valueSpan.addEventListener(\"click\", () => {\n this._beginEdit(row, valueSpan, entry, ref, value);\n });\n }\n }\n row.append(valueSpan);\n container.append(row);\n\n if (expanded) {\n if (Array.isArray(value)) {\n const limit = Math.min(value.length, LIST_CHILD_LIMIT);\n for (let index = 0; index < limit; index++) {\n this._renderTreeNode(\n container,\n entry,\n { path: `${ref.path}.*`, indexes: [...ref.indexes, index] },\n `[${index}]`,\n depth + 1\n );\n }\n if (value.length > limit) {\n const more = this._emptyRow(`…(${value.length} items)`);\n more.style.paddingLeft = `${(depth + 1) * 14}px`;\n container.append(more);\n }\n } else {\n for (const childKey of Object.keys(value as Record<string, unknown>)) {\n this._renderTreeNode(\n container,\n entry,\n { path: `${ref.path}.${childKey}`, indexes: ref.indexes },\n childKey,\n depth + 1\n );\n }\n }\n }\n }\n\n private _beginEdit(\n row: HTMLElement,\n valueSpan: HTMLElement,\n entry: IRosterEntry,\n ref: ITreeNodeRef,\n current: unknown\n ): void {\n const input = document.createElement(\"input\");\n input.value = typeof current === \"string\" ? current : String(current);\n const commit = (): void => {\n // 編集は通常のリアクティブパイプラインを通る(devtools-tag-design.md §3.1)\n this._core?.writeValue(entry, ref.path, coerceInput(input.value), ref.indexes);\n this._markDirty(\"state\");\n };\n input.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\") {\n commit();\n } else if (event.key === \"Escape\") {\n this._markDirty(\"state\");\n }\n });\n row.replaceChild(input, valueSpan);\n input.focus();\n }\n\n private _renderWiringPane(): void {\n const core = this._core!;\n const body = this._paneElements[\"wiring\"]!;\n body.replaceChildren();\n\n let entries: IWiringEntry[];\n let contextLabel: string;\n if (this._pickedNode !== null) {\n entries = core.getWiringForNode(this._pickedNode);\n const target = this._pickedNode;\n contextLabel =\n target instanceof Element ? `<${target.tagName.toLowerCase()}>` : target.nodeName;\n } else if (this._selectedPath !== null) {\n const selected = this._selectedRoster();\n entries =\n selected !== null ? core.getWiringForPath(selected.name, this._selectedPath) : [];\n contextLabel = this._selectedPath;\n } else {\n entries = core.getAllWiring();\n contextLabel = \"all\";\n }\n\n const info = document.createElement(\"div\");\n info.textContent = `context: ${contextLabel} — ${entries.length} live binding${entries.length === 1 ? \"\" : \"s\"}`;\n body.append(info);\n\n if (entries.length > 0) {\n for (const entry of entries) {\n body.append(this._wiringRow(entry));\n }\n return;\n }\n\n // ライブ台帳が空 → declared ビューへフォールバック(protocol §6)\n const selected = this._selectedRoster();\n const declared =\n selected !== null ? scanDeclaredBindings(this._scanRootOf(selected)) : [];\n if (declared.length === 0) {\n body.append(this._emptyRow(\"no bindings observed\"));\n return;\n }\n const notice = document.createElement(\"div\");\n notice.className = \"notice\";\n const tag = document.createElement(\"span\");\n tag.className = \"badge-tag declared\";\n tag.textContent = \"declared\";\n notice.append(tag, document.createTextNode(\" attached late — reload to capture live bindings \"));\n const reload = document.createElement(\"button\");\n reload.textContent = \"reload\";\n reload.addEventListener(\"click\", () => {\n location.reload();\n });\n notice.append(reload);\n body.append(notice);\n for (const entry of declared) {\n body.append(this._declaredRow(entry));\n }\n }\n\n private _scanRootOf(entry: IRosterEntry): ParentNode {\n // instanceof はテスト環境(happy-dom)の Document 実体と一致しないことがあるため\n // nodeType で判定する(DOCUMENT_FRAGMENT_NODE は ShadowRoot を含む)\n const rootNode = entry.rootNode;\n if (\n rootNode.nodeType === Node.DOCUMENT_NODE ||\n rootNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE\n ) {\n return rootNode as unknown as ParentNode;\n }\n return document;\n }\n\n private _wiringRow(entry: IWiringEntry): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"wiring-row\";\n const prop = document.createElement(\"span\");\n prop.className = \"prop\";\n prop.textContent = entry.propName;\n const arrow = document.createTextNode(\" ← \");\n const path = document.createElement(\"span\");\n path.className = \"path\";\n path.textContent = `${entry.path}@${entry.stateName}`;\n const type = document.createElement(\"span\");\n type.className = \"badge-tag\";\n type.textContent = entry.bindingType;\n row.append(type, document.createTextNode(\" \"), prop, arrow, path);\n row.addEventListener(\"click\", () => {\n const binding = entry.bindingRef.deref();\n if (binding !== undefined) {\n this._highlightNodes([binding.node, binding.replaceNode]);\n }\n });\n return row;\n }\n\n private _declaredRow(entry: IDeclaredBinding): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"wiring-row\";\n const type = document.createElement(\"span\");\n type.className = \"badge-tag declared\";\n type.textContent = entry.origin;\n const prop = document.createElement(\"span\");\n prop.className = \"prop\";\n prop.textContent = entry.propName;\n const path = document.createElement(\"span\");\n path.className = \"path\";\n path.textContent = `${entry.path}@${entry.stateName}`;\n row.append(type, document.createTextNode(\" \"), prop, document.createTextNode(\" ← \"), path);\n row.addEventListener(\"click\", () => {\n this._highlightNodes([entry.element]);\n });\n return row;\n }\n\n private _renderTimelinePane(): void {\n const core = this._core!;\n const body = this._paneElements[\"timeline\"]!;\n const timeline = core.getTimeline();\n const start = Math.max(0, timeline.length - TIMELINE_RENDER_LIMIT);\n const rows: HTMLElement[] = [];\n if (start > 0) {\n rows.push(this._emptyRow(`…(${start} earlier entries)`));\n }\n for (let index = start; index < timeline.length; index++) {\n rows.push(this._timelineRow(timeline[index]));\n }\n if (rows.length === 0) {\n rows.push(this._emptyRow(\"no activity yet\"));\n }\n body.replaceChildren(...rows);\n body.scrollTop = body.scrollHeight;\n }\n\n private _timelineRow(entry: ITimelineEntry): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"timeline-row\";\n const time = document.createElement(\"span\");\n time.className = \"t\";\n time.textContent = `${(entry.time / 1000).toFixed(3)}s `;\n const kind = document.createElement(\"span\");\n kind.className = \"badge-tag kind\";\n kind.textContent = entry.kind;\n // subscriber 0 の command/event 空撃ちは警告表示(devtools-tag-design.md §3.2)\n if (entry.subscriberCount === 0) {\n kind.classList.add(\"warn\");\n kind.title = \"emitted with no subscribers\";\n }\n const label = document.createElement(\"span\");\n label.className = \"label\";\n const stateName = entry.stateName !== null ? `@${entry.stateName}` : \"\";\n label.textContent = ` ${entry.label}${stateName} `;\n const detail = document.createElement(\"span\");\n detail.className = \"detail\";\n detail.textContent = entry.detail;\n row.append(time, kind, label, detail);\n return row;\n }\n\n private _emptyRow(text: string): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"empty\";\n row.textContent = text;\n return row;\n }\n\n // --- highlight ---\n\n private _highlightPath(entry: IRosterEntry, path: string): void {\n const core = this._core!;\n const nodes: Node[] = [];\n for (const wiring of core.getWiringForPath(entry.name, path)) {\n const binding = wiring.bindingRef.deref();\n if (binding !== undefined) {\n nodes.push(binding.node, binding.replaceNode);\n }\n }\n this._highlightNodes(nodes);\n }\n\n private _highlightNodes(nodes: readonly Node[]): void {\n // shadowRoot 構築後にしか呼ばれない(各リスナーは _buildShadow 内で配線される)\n const layer = this._highlightLayer!;\n layer.replaceChildren();\n const seen = new Set<Element>();\n for (const node of nodes) {\n const element = node instanceof Element ? node : node.parentElement;\n if (element === null || seen.has(element) || !element.isConnected) {\n continue;\n }\n seen.add(element);\n const rect = element.getBoundingClientRect();\n const box = document.createElement(\"div\");\n box.className = \"hl-box\";\n box.style.left = `${rect.left}px`;\n box.style.top = `${rect.top}px`;\n box.style.width = `${rect.width}px`;\n box.style.height = `${rect.height}px`;\n layer.append(box);\n }\n // 2 秒後に自動で消す(追従はしない — クリック時スナップショット表示)\n setTimeout(() => {\n layer.replaceChildren();\n }, 2000);\n }\n}\n","/**\n * bootstrapDevtools.ts\n *\n * `<wcs-devtools>` の登録と自動挿入(devtools-tag-design.md §2)。\n * - 既に定義済みなら再定義しない\n * - ページに `<wcs-devtools>` が無ければ body 末尾に 1 つ挿入\n * (手動で書かれていれば挿入しない)\n * - SSR では何もしない\n */\n\nimport { WcsDevtools } from \"./shell/WcsDevtools\";\n\nconst TAG_NAME = \"wcs-devtools\";\n\nfunction insertIfAbsent(): void {\n if (document.querySelector(TAG_NAME) !== null) {\n return;\n }\n document.body.appendChild(document.createElement(TAG_NAME));\n}\n\nexport function bootstrapDevtools(): void {\n if (document.documentElement.hasAttribute(\"data-wcs-server\")) {\n return;\n }\n if (!customElements.get(TAG_NAME)) {\n customElements.define(TAG_NAME, WcsDevtools);\n }\n if (document.body !== null) {\n insertIfAbsent();\n } else {\n document.addEventListener(\"DOMContentLoaded\", insertIfAbsent, { once: true });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e="__WCSTACK_DEVTOOLS_HOOK__",t=1;function n(){const t=globalThis,n=t[e];if(void 0!==n)return 1!==n.version&&console.warn(`[wcstack/devtools] hook registry version mismatch: found ${n.version}, expected 1. Keeping the existing registry (first-wins).`),n;const i=function(){const e=new Map,t=new Set,n=e=>{if(0===t.size)return void e._setSink(null);const n=e.id;e._setSink(e=>{for(const i of t)i.onEvent?.(n,e)})};return{version:1,sources:e,register(i){if(!e.has(i.id)){e.set(i.id,i),n(i);for(const e of t)e.onSourceRegistered?.(i)}},unregister(n){const i=e.get(n);if(void 0!==i){i._setSink(null),e.delete(n);for(const e of t)e.onSourceUnregistered?.(n)}},addListener(i){t.add(i);for(const t of e.values())n(t),i.onSourceRegistered?.(t);return()=>{if(t.delete(i))for(const t of e.values())n(t)}}}}();return t[e]=i,i}function i(e,t=2){switch(typeof e){case"string":return`"${e.length>80?e.slice(0,80)+"…":e}"`;case"number":case"boolean":case"bigint":return String(e);case"symbol":return e.toString();case"undefined":return"undefined";case"function":return"[[Function]]"}if(null===e)return"null";const n=e;if(Array.isArray(n)){if(t<=0)return`[[Array(${n.length})]]`;const e=n.slice(0,3).map(e=>i(e,t-1)),s=n.length>3?`, …(${n.length})`:"";return`[${e.join(", ")}${s}]`}if(function(e){const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(n)){if(t<=0)return"[[Object]]";const e=Object.keys(n),s=e.slice(0,3).map(e=>`${e}: ${i(n[e],t-1)}`),o=e.length>3?`, …(${e.length})`:"";return`{${s.join(", ")}${o}}`}return`[[${function(e){const t=e.constructor,n=t?.name;return"string"==typeof n&&n.length>0?n:"Object"}(n)}]]`}function s(e){if(0===e.length)return"";const t=e.slice(0,3).map(e=>{const t=i(e,1);return t.length>80?t.slice(0,80)+"…":t}),n=e.length>3?`, …(${e.length})`:"";return`${t.join(", ")}${n}`}const o="wcs-devtools";function r(e,t){return e+"\0"+t}class a{_timelineCapacity;_hiddenStateNames;_removeListener=null;_sources=new Map;_roster=new Map;_wiringByPathKey=new Map;_wiringEntryByBinding=new WeakMap;_timeline=[];_seq=0;_paused=!1;_changeListeners=new Set;constructor(e){this._timelineCapacity=e?.timelineCapacity??500,this._hiddenStateNames=new Set(e?.hiddenStateNames??[])}get connected(){return null!==this._removeListener}get paused(){return this._paused}set paused(e){this._paused=e}isHiddenStateName(e){return null!==e&&(e.startsWith(o)||this._hiddenStateNames.has(e))}connect(){if(null!==this._removeListener)return;const e=n();this._removeListener=e.addListener({onSourceRegistered:e=>{this._sources.set(e.id,e),this._refreshRosterOf(e),this._notify("sources")},onSourceUnregistered:e=>{this._sources.delete(e),this._roster.delete(e),this._notify("sources"),this._notify("roster")},onEvent:(e,t)=>{this._ingest(e,t)}})}disconnect(){null!==this._removeListener&&(this._removeListener(),this._removeListener=null,this._sources.clear(),this._roster.clear(),this._wiringByPathKey.clear(),this._wiringEntryByBinding=new WeakMap,this._notify("sources"),this._notify("roster"),this._notify("wiring"))}onChange(e){return this._changeListeners.add(e),()=>{this._changeListeners.delete(e)}}getSources(){return[...this._sources.values()]}getRoster(){const e=[];for(const t of this._roster.values())e.push(...t);return e}refreshRoster(){for(const e of this._sources.values())this._refreshRosterOf(e);this._notify("roster")}getTimeline(){return this._timeline}clearTimeline(){this._timeline=[],this._notify("timeline")}getWiringForPath(e,t){const n=this._wiringByPathKey.get(r(e,t));return void 0===n?[]:this._collectAlive(n)}getAllWiring(){const e=[];for(const t of this._wiringByPathKey.values())e.push(...this._collectAlive(t));return e}getWiringForNode(e){const t=[];for(const n of this._wiringByPathKey.values())for(const i of this._collectAlive(n)){const n=i.bindingRef.deref();(n.node===e||n.replaceNode===e||e.contains(n.node)||e.contains(n.replaceNode))&&t.push(i)}return t}keysOf(e){const t=this._sources.get(e.sourceId);return void 0===t||"function"!=typeof t.keys?[]:t.keys(e.name,e.rootNode)}readValue(e,t,n){const i=this._sources.get(e.sourceId);if(void 0!==i)return i.read(e.name,e.rootNode,t,n)}writeValue(e,t,n,i){const s=this._sources.get(e.sourceId);void 0!==s&&s.write(e.name,e.rootNode,t,n,i)}_notify(e){for(const t of this._changeListeners)t(e)}_refreshRosterOf(e){const t=[];for(const n of e.getStateElements())this.isHiddenStateName(n.name)||t.push({sourceId:e.id,name:n.name,rootNode:n.rootNode,summary:n});this._roster.set(e.id,t)}_collectAlive(e){const t=[];for(const n of e)void 0!==n.bindingRef.deref()?t.push(n):e.delete(n);return t}_appendTimeline(e){if(this._paused)return;this._timeline.push({...e,seq:this._seq++,time:performance.now()});const t=this._timeline.length-this._timelineCapacity;t>0&&this._timeline.splice(0,t),this._notify("timeline")}_labelOf(e){const t=e.listIndex?.indexes,n=e.absolutePathInfo.pathInfo.path;return void 0!==t?`${n}[${t.join(",")}]`:n}_ingest(e,t){switch(t.type){case"state:element-registered":{if(this.isHiddenStateName(t.name))return;const n=this._sources.get(e);return void 0!==n&&(this._refreshRosterOf(n),this._notify("roster")),void this._appendTimeline({sourceId:e,kind:"element-registered",stateName:t.name,label:t.name,detail:"",subscriberCount:null})}case"state:element-unregistered":{if(this.isHiddenStateName(t.name))return;const n=this._sources.get(e);return void 0!==n&&(this._refreshRosterOf(n),this._notify("roster")),void this._appendTimeline({sourceId:e,kind:"element-unregistered",stateName:t.name,label:t.name,detail:"",subscriberCount:null})}case"state:write":{const n=t.absoluteAddress.absolutePathInfo.stateName;if(this.isHiddenStateName(n))return;const s=t.hasOldValue?`${i(t.value)} (was ${i(t.oldValue)})`:i(t.value);return void this._appendTimeline({sourceId:e,kind:"write",stateName:n,label:this._labelOf(t.absoluteAddress),detail:s,subscriberCount:null})}case"state:update-batch":{const n=[];let i=0;for(const e of t.addresses)this.isHiddenStateName(e.absolutePathInfo.stateName)||(i++,n.length<3&&n.push(this._labelOf(e)));if(0===i)return;const s=i>n.length?`, …(${i})`:"";return void this._appendTimeline({sourceId:e,kind:"batch",stateName:null,label:`${i} address${1===i?"":"es"}`,detail:`${n.join(", ")}${s}`,subscriberCount:null})}case"state:binding-added":{const n=t.absoluteAddress.absolutePathInfo.stateName;if(this.isHiddenStateName(n))return;const i=t.absoluteAddress.absolutePathInfo.pathInfo.path,s=r(n,i);let o=this._wiringByPathKey.get(s);void 0===o&&(o=new Set,this._wiringByPathKey.set(s,o));const a={sourceId:e,stateName:n,path:i,propName:t.binding.propName,bindingType:t.binding.bindingType,bindingRef:new WeakRef(t.binding)};return o.add(a),this._wiringEntryByBinding.set(t.binding,a),void this._notify("wiring")}case"state:binding-removed":{const e=this._wiringEntryByBinding.get(t.binding);if(void 0===e)return;this._wiringEntryByBinding.delete(t.binding);const n=r(e.stateName,e.path),i=this._wiringByPathKey.get(n);return void 0!==i&&(i.delete(e),0===i.size&&this._wiringByPathKey.delete(n)),void this._notify("wiring")}case"state:binding-cleared":{const e=r(t.absoluteAddress.absolutePathInfo.stateName,t.absoluteAddress.absolutePathInfo.pathInfo.path);return void(this._wiringByPathKey.delete(e)&&this._notify("wiring"))}case"state:token-emit":if(this.isHiddenStateName(t.stateName))return;return void this._appendTimeline({sourceId:e,kind:t.kind,stateName:t.stateName,label:t.tokenName,detail:s(t.args),subscriberCount:t.subscriberCount})}}}const l=["wcs-text","wcs-for","wcs-if","wcs-elseif","wcs-else"];function d(e,t,n){const i=t.trim();if(0===i.length)return null;const s=i.indexOf(":");if(s<0)return null;const o=i.slice(0,s).trim(),r=i.slice(s+1).trim();if(0===o.length||0===r.length)return null;const[a,...l]=r.split("|").map(e=>e.trim());let d=a,c="default";const h=a.lastIndexOf("@");return h>0&&(d=a.slice(0,h).trim(),c=a.slice(h+1).trim()),{element:e,propName:o,path:d,stateName:c,filters:l.filter(e=>e.length>0),origin:n,raw:i}}function c(e,t="data-wcs"){const n=[];for(const i of e.querySelectorAll(`[${t}]`)){const e=i.getAttribute(t);for(const t of e.split(";")){const e=d(i,t,"attribute");null!==e&&n.push(e)}}const i=(e.ownerDocument??e).createTreeWalker(e,NodeFilter.SHOW_COMMENT);let s=i.nextNode();for(;null!==s;){const e=s.textContent.trim(),t=l.find(t=>e===t||e.startsWith(t+":"));if(void 0!==t){const i=s.parentNode instanceof Element?s.parentNode:null;if(null!==i){const s=e===t?"":e.slice(t.length+1).trim();if(s.length>0){const e="wcs-text"===t?"textContent":t.slice(4);n.push(d(i,`${e}: ${s}`,"comment"))}}}s=i.nextNode()}return n}class h extends HTMLElement{static get observedAttributes(){return["open","dock","hotkey"]}_core=null;_removeCoreListener=null;_panel=null;_badge=null;_stateSelect=null;_paneElements={};_highlightLayer=null;_dirtyPanes=new Set;_renderScheduled=!1;_selectedRosterKey=null;_selectedPath=null;_pickedNode=null;_pickMode=!1;_expanded=new Set;_hotkeyHandler=null;_pickHandler=null;get core(){return this._core}connectedCallback(){if(document.documentElement.hasAttribute("data-wcs-server"))return;null===this.shadowRoot&&this._buildShadow();const e=Number(this.getAttribute("buffer")??""),t=(this.getAttribute("hidden-states")??"").split(",").map(e=>e.trim()).filter(e=>e.length>0);this._core=new a({timelineCapacity:Number.isFinite(e)&&e>0?e:void 0,hiddenStateNames:t}),this._removeCoreListener=this._core.onChange(e=>{"roster"===e||"sources"===e?(this._markDirty("state"),this._markDirty("wiring")):"wiring"===e?this._markDirty("wiring"):this._markDirty("timeline")}),this._core.connect(),this._applyDock(),this._applyOpen(),this._installHotkey(),this._markDirty("state"),this._markDirty("wiring"),this._markDirty("timeline")}disconnectedCallback(){this._removeCoreListener?.(),this._removeCoreListener=null,this._core?.disconnect(),this._core=null,this._uninstallHotkey(),this._exitPickMode()}attributeChangedCallback(e){null!==this.shadowRoot&&("open"===e?this._applyOpen():"dock"===e?this._applyDock():"hotkey"===e&&(this._uninstallHotkey(),this._installHotkey()))}__flushRenderForTest(){this._renderDirty()}_buildShadow(){const e=this.attachShadow({mode:"open"}),t=document.createElement("style");t.textContent='\n:host {\n all: initial;\n position: fixed;\n z-index: 2147483647;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n inset: auto 0 0 auto;\n}\n* { box-sizing: border-box; }\n.badge {\n position: fixed;\n right: 12px;\n bottom: 12px;\n width: 40px;\n height: 40px;\n border-radius: 20px;\n border: 1px solid #2b4f78;\n background: #10263f;\n color: #9fd0ff;\n font-weight: 700;\n cursor: pointer;\n}\n.panel {\n position: fixed;\n display: flex;\n flex-direction: column;\n background: #0d1b2a;\n color: #d7e3f4;\n border: 1px solid #2b4f78;\n box-shadow: 0 0 24px rgba(0,0,0,.5);\n}\n.panel.dock-bottom { left: 0; right: 0; bottom: 0; height: 45vh; }\n.panel.dock-right { top: 0; right: 0; bottom: 0; width: 420px; }\n.panel[hidden] { display: none; }\nheader {\n display: flex;\n gap: 6px;\n align-items: center;\n padding: 6px 8px;\n border-bottom: 1px solid #2b4f78;\n background: #10263f;\n}\nheader .title { font-weight: 700; color: #9fd0ff; margin-right: 4px; }\nheader select, header button {\n font: inherit;\n background: #16324f;\n color: #d7e3f4;\n border: 1px solid #2b4f78;\n border-radius: 4px;\n padding: 2px 8px;\n cursor: pointer;\n}\nheader button[aria-pressed="true"] { background: #2b5d8f; }\nheader .spacer { flex: 1; }\n.panes { display: flex; flex: 1; min-height: 0; }\n.pane { flex: 1; min-width: 0; overflow: auto; padding: 6px 8px; border-right: 1px solid #1d3a5c; }\n.pane:last-child { border-right: none; }\n.pane h3 {\n margin: 0 0 6px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: .08em;\n color: #7ba7d4;\n}\n.tree-row { display: flex; gap: 6px; padding: 1px 0; align-items: baseline; white-space: nowrap; }\n.tree-row .toggle { width: 14px; cursor: pointer; color: #7ba7d4; user-select: none; }\n.tree-row .key { color: #9fd0ff; cursor: pointer; }\n.tree-row .value { color: #ffd9a0; overflow: hidden; text-overflow: ellipsis; }\n.tree-row .value.editable { cursor: pointer; }\n.tree-row input { font: inherit; background: #16324f; color: #ffd9a0; border: 1px solid #2b4f78; }\n.badge-tag {\n display: inline-block;\n padding: 0 4px;\n border-radius: 3px;\n font-size: 10px;\n background: #26456a;\n color: #a8c6e8;\n}\n.badge-tag.warn { background: #6a3326; color: #ffb3a0; }\n.badge-tag.declared { background: #4a4426; color: #efe3a0; }\n.wiring-row, .timeline-row { padding: 1px 0; white-space: nowrap; }\n.wiring-row .prop { color: #b7f0c0; }\n.wiring-row .path { color: #9fd0ff; }\n.timeline-row .t { color: #6f88a3; }\n.timeline-row .label { color: #9fd0ff; }\n.timeline-row .detail { color: #ffd9a0; }\n.timeline-row .kind { display: inline-block; min-width: 52px; text-align: center; }\n.empty { color: #6f88a3; font-style: italic; padding: 4px 0; }\n.notice { color: #efe3a0; padding: 2px 0 6px; }\n.notice button { font: inherit; margin-left: 6px; cursor: pointer; }\n.hl-box {\n position: fixed;\n pointer-events: none;\n border: 1px solid #58c2ff;\n background: rgba(88,194,255,.18);\n}\n',e.append(t);const n=document.createElement("button");n.className="badge",n.title="wcstack DevTools",n.textContent="WCS",n.addEventListener("click",()=>this.toggle()),e.append(n),this._badge=n;const i=document.createElement("div");i.className="panel dock-bottom",i.hidden=!0;const s=document.createElement("header"),o=document.createElement("span");o.className="title",o.textContent="wcstack devtools",s.append(o);const r=document.createElement("select");r.title="state element",r.addEventListener("change",()=>{this._selectedRosterKey=r.value||null,this._selectedPath=null,this._expanded.clear(),this._markDirty("state"),this._markDirty("wiring")}),s.append(r),this._stateSelect=r;const a=this._headerButton(s,"⌖ pick","pick a page element");a.addEventListener("click",()=>{this._pickMode?this._exitPickMode():this._enterPickMode(),a.setAttribute("aria-pressed",String(this._pickMode))}),a.dataset.role="pick";const l=this._headerButton(s,"⏸","pause timeline");l.addEventListener("click",()=>{const e=this._core;null!==e&&(e.paused=!e.paused,l.setAttribute("aria-pressed",String(e.paused)))}),l.dataset.role="pause";const d=this._headerButton(s,"🗑","clear timeline");d.addEventListener("click",()=>{this._core?.clearTimeline()}),d.dataset.role="clear";const c=document.createElement("span");c.className="spacer",s.append(c);const h=this._headerButton(s,"dock","toggle dock position");h.addEventListener("click",()=>{const e="bottom"===(this.getAttribute("dock")??"bottom")?"right":"bottom";this.setAttribute("dock",e)}),h.dataset.role="dock";const u=this._headerButton(s,"×","close");u.addEventListener("click",()=>this.toggle(!1)),u.dataset.role="close",i.append(s);const p=document.createElement("div");p.className="panes";for(const[e,t]of[["state","State"],["wiring","Wiring"],["timeline","Timeline"]]){const n=document.createElement("section");n.className=`pane pane-${e}`;const i=document.createElement("h3");i.textContent=t;const s=document.createElement("div");s.className="pane-body",n.append(i,s),p.append(n),this._paneElements[e]=s}i.append(p),e.append(i),this._panel=i;const m=document.createElement("div");m.className="hl-layer",e.append(m),this._highlightLayer=m}_headerButton(e,t,n){const i=document.createElement("button");return i.textContent=t,i.title=n,i.setAttribute("aria-pressed","false"),e.append(i),i}get open(){return this.hasAttribute("open")}toggle(e){e??!this.open?this.setAttribute("open",""):this.removeAttribute("open")}_applyOpen(){this._panel.hidden=!this.open,this._badge.hidden=this.open,this.open&&(this._markDirty("state"),this._markDirty("wiring"),this._markDirty("timeline"))}_applyDock(){const e="right"===this.getAttribute("dock")?"right":"bottom";this._panel.classList.toggle("dock-right","right"===e),this._panel.classList.toggle("dock-bottom","bottom"===e)}_installHotkey(){const e=this.getAttribute("hotkey")??"Alt+Shift+D";if("none"===e)return;const t=e.split("+").map(e=>e.trim().toLowerCase()),n=t[t.length-1],i=t.includes("alt"),s=t.includes("shift"),o=t.includes("ctrl"),r=t.includes("meta");this._hotkeyHandler=e=>{e.key.toLowerCase()===n&&e.altKey===i&&e.shiftKey===s&&e.ctrlKey===o&&e.metaKey===r&&(e.preventDefault(),this.toggle())},window.addEventListener("keydown",this._hotkeyHandler)}_uninstallHotkey(){null!==this._hotkeyHandler&&(window.removeEventListener("keydown",this._hotkeyHandler),this._hotkeyHandler=null)}_enterPickMode(){this._pickMode=!0,this._pickHandler=e=>{const t=e.target;t.getRootNode()!==this.shadowRoot&&t!==this&&(e.preventDefault(),e.stopPropagation(),this._pickedNode=t,this._selectedPath=null,this._exitPickMode(),this._markDirty("wiring"))},document.addEventListener("click",this._pickHandler,{capture:!0})}_exitPickMode(){null!==this._pickHandler&&(document.removeEventListener("click",this._pickHandler,{capture:!0}),this._pickHandler=null),this._pickMode=!1;const e=this.shadowRoot?.querySelector('button[data-role="pick"]');e?.setAttribute("aria-pressed","false")}_markDirty(e){this._dirtyPanes.add(e),this._renderScheduled||(this._renderScheduled=!0,requestAnimationFrame(()=>{this._renderDirty()}))}_renderDirty(){if(this._renderScheduled=!1,null===this._core||null===this.shadowRoot)return void this._dirtyPanes.clear();const e=this._dirtyPanes;this._dirtyPanes=new Set,e.has("state")&&this._renderStatePane(),e.has("wiring")&&this._renderWiringPane(),e.has("timeline")&&this._renderTimelinePane()}_rosterKey(e){return`${e.sourceId}:${e.name}`}_selectedRoster(){const e=this._core.getRoster();if(0===e.length)return null;return e.find(e=>this._rosterKey(e)===this._selectedRosterKey)??e[0]}_renderStatePane(){const e=this._core,t=this._paneElements.state,n=this._stateSelect,i=e.getRoster(),s=this._selectedRoster();if(n.replaceChildren(...i.map(e=>{const t=document.createElement("option");return t.value=this._rosterKey(e),t.textContent=`${e.name} (${e.sourceId.slice(0,12)})`,t.selected=null!==s&&this._rosterKey(e)===this._rosterKey(s),t})),t.replaceChildren(),null===s)return void t.append(this._emptyRow("no <wcs-state> elements observed"));this._selectedRosterKey=this._rosterKey(s);const o=e.keysOf(s);if(0!==o.length)for(const e of o)this._renderTreeNode(t,s,{path:e,indexes:[]},e,0);else t.append(this._emptyRow("no readable keys (runtime without keys() API?)"))}_renderTreeNode(e,t,n,s,o){const r=this._core;let a,l=!0;try{a=r.readValue(t,n.path,n.indexes)}catch{l=!1}const d=document.createElement("div");d.className="tree-row",d.style.paddingLeft=14*o+"px";const c=l&&function(e){if(Array.isArray(e))return!0;if(null===e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(a),h=function(e){return`${e.path}#${e.indexes.join(",")}`}(n),u=c&&this._expanded.has(h),p=document.createElement("span");p.className="toggle",p.textContent=c?u?"▾":"▸":"",c&&p.addEventListener("click",()=>{this._expanded.has(h)?this._expanded.delete(h):this._expanded.add(h),this._markDirty("state")}),d.append(p);const m=document.createElement("span");m.className="key",m.textContent=`${s}:`,m.title=n.path,m.addEventListener("click",()=>{this._selectedPath=n.path,this._pickedNode=null,this._markDirty("wiring"),this._highlightPath(t,n.path)}),d.append(m);const g=document.createElement("span");if(g.className="value",l){g.textContent=i(a,1);(null===a||"object"!=typeof a)&&"function"!=typeof a&&(g.classList.add("editable"),g.title="click to edit",g.addEventListener("click",()=>{this._beginEdit(d,g,t,n,a)}))}else g.textContent="(unreadable getter)";if(d.append(g),e.append(d),u)if(Array.isArray(a)){const i=Math.min(a.length,20);for(let s=0;s<i;s++)this._renderTreeNode(e,t,{path:`${n.path}.*`,indexes:[...n.indexes,s]},`[${s}]`,o+1);if(a.length>i){const t=this._emptyRow(`…(${a.length} items)`);t.style.paddingLeft=14*(o+1)+"px",e.append(t)}}else for(const i of Object.keys(a))this._renderTreeNode(e,t,{path:`${n.path}.${i}`,indexes:n.indexes},i,o+1)}_beginEdit(e,t,n,i,s){const o=document.createElement("input");o.value="string"==typeof s?s:String(s);const r=()=>{this._core?.writeValue(n,i.path,function(e){const t=e.trim();try{return JSON.parse(t)}catch{return e}}(o.value),i.indexes),this._markDirty("state")};o.addEventListener("keydown",e=>{"Enter"===e.key?r():"Escape"===e.key&&this._markDirty("state")}),e.replaceChild(o,t),o.focus()}_renderWiringPane(){const e=this._core,t=this._paneElements.wiring;let n,i;if(t.replaceChildren(),null!==this._pickedNode){n=e.getWiringForNode(this._pickedNode);const t=this._pickedNode;i=t instanceof Element?`<${t.tagName.toLowerCase()}>`:t.nodeName}else if(null!==this._selectedPath){const t=this._selectedRoster();n=null!==t?e.getWiringForPath(t.name,this._selectedPath):[],i=this._selectedPath}else n=e.getAllWiring(),i="all";const s=document.createElement("div");if(s.textContent=`context: ${i} — ${n.length} live binding${1===n.length?"":"s"}`,t.append(s),n.length>0){for(const e of n)t.append(this._wiringRow(e));return}const o=this._selectedRoster(),r=null!==o?c(this._scanRootOf(o)):[];if(0===r.length)return void t.append(this._emptyRow("no bindings observed"));const a=document.createElement("div");a.className="notice";const l=document.createElement("span");l.className="badge-tag declared",l.textContent="declared",a.append(l,document.createTextNode(" attached late — reload to capture live bindings "));const d=document.createElement("button");d.textContent="reload",d.addEventListener("click",()=>{location.reload()}),a.append(d),t.append(a);for(const e of r)t.append(this._declaredRow(e))}_scanRootOf(e){const t=e.rootNode;return t.nodeType===Node.DOCUMENT_NODE||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE?t:document}_wiringRow(e){const t=document.createElement("div");t.className="wiring-row";const n=document.createElement("span");n.className="prop",n.textContent=e.propName;const i=document.createTextNode(" ← "),s=document.createElement("span");s.className="path",s.textContent=`${e.path}@${e.stateName}`;const o=document.createElement("span");return o.className="badge-tag",o.textContent=e.bindingType,t.append(o,document.createTextNode(" "),n,i,s),t.addEventListener("click",()=>{const t=e.bindingRef.deref();void 0!==t&&this._highlightNodes([t.node,t.replaceNode])}),t}_declaredRow(e){const t=document.createElement("div");t.className="wiring-row";const n=document.createElement("span");n.className="badge-tag declared",n.textContent=e.origin;const i=document.createElement("span");i.className="prop",i.textContent=e.propName;const s=document.createElement("span");return s.className="path",s.textContent=`${e.path}@${e.stateName}`,t.append(n,document.createTextNode(" "),i,document.createTextNode(" ← "),s),t.addEventListener("click",()=>{this._highlightNodes([e.element])}),t}_renderTimelinePane(){const e=this._core,t=this._paneElements.timeline,n=e.getTimeline(),i=Math.max(0,n.length-200),s=[];i>0&&s.push(this._emptyRow(`…(${i} earlier entries)`));for(let e=i;e<n.length;e++)s.push(this._timelineRow(n[e]));0===s.length&&s.push(this._emptyRow("no activity yet")),t.replaceChildren(...s),t.scrollTop=t.scrollHeight}_timelineRow(e){const t=document.createElement("div");t.className="timeline-row";const n=document.createElement("span");n.className="t",n.textContent=`${(e.time/1e3).toFixed(3)}s `;const i=document.createElement("span");i.className="badge-tag kind",i.textContent=e.kind,0===e.subscriberCount&&(i.classList.add("warn"),i.title="emitted with no subscribers");const s=document.createElement("span");s.className="label";const o=null!==e.stateName?`@${e.stateName}`:"";s.textContent=` ${e.label}${o} `;const r=document.createElement("span");return r.className="detail",r.textContent=e.detail,t.append(n,i,s,r),t}_emptyRow(e){const t=document.createElement("div");return t.className="empty",t.textContent=e,t}_highlightPath(e,t){const n=this._core,i=[];for(const s of n.getWiringForPath(e.name,t)){const e=s.bindingRef.deref();void 0!==e&&i.push(e.node,e.replaceNode)}this._highlightNodes(i)}_highlightNodes(e){const t=this._highlightLayer;t.replaceChildren();const n=new Set;for(const i of e){const e=i instanceof Element?i:i.parentElement;if(null===e||n.has(e)||!e.isConnected)continue;n.add(e);const s=e.getBoundingClientRect(),o=document.createElement("div");o.className="hl-box",o.style.left=`${s.left}px`,o.style.top=`${s.top}px`,o.style.width=`${s.width}px`,o.style.height=`${s.height}px`,t.append(o)}setTimeout(()=>{t.replaceChildren()},2e3)}}const u="wcs-devtools";function p(){null===document.querySelector(u)&&document.body.appendChild(document.createElement(u))}function m(){document.documentElement.hasAttribute("data-wcs-server")||(customElements.get(u)||customElements.define(u,h),null!==document.body?p():document.addEventListener("DOMContentLoaded",p,{once:!0}))}export{e as DEVTOOLS_HOOK_GLOBAL,t as DEVTOOLS_PROTOCOL_VERSION,a as DevtoolsCore,o as RESERVED_STATE_NAME_PREFIX,h as WcsDevtools,m as bootstrapDevtools,s as formatArgs,i as formatValue,n as getOrCreateHookRegistry,c as scanDeclaredBindings};
|
|
2
|
+
//# sourceMappingURL=index.esm.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.min.js","sources":["../src/protocol/types.ts","../src/protocol/registry.ts","../src/core/formatValue.ts","../src/core/DevtoolsCore.ts","../src/core/declaredScan.ts","../src/shell/WcsDevtools.ts","../src/bootstrapDevtools.ts"],"sourcesContent":["/**\n * protocol/types.ts\n *\n * DevTools Hook Protocol (docs/devtools-hook-protocol.md) の devtools 側型定義。\n *\n * ランタイム(@wcstack/state)側の内部型は import しない — プロトコルは\n * 「文書化された構造」への構造的型付けで両側が独立に実装する(protocol §2)。\n * そのためランタイム内部オブジェクトは *Like インターフェースとして、\n * devtools が実際に触るプロパティだけを宣言する。\n */\n\n/** グローバル registry のプロパティ名 */\nexport const DEVTOOLS_HOOK_GLOBAL = \"__WCSTACK_DEVTOOLS_HOOK__\";\n\n/** プロトコル版。additive change では上げない(protocol §2) */\nexport const DEVTOOLS_PROTOCOL_VERSION = 1;\n\nexport interface IPathInfoLike {\n readonly path: string;\n}\n\nexport interface IAbsolutePathInfoLike {\n readonly stateName: string;\n readonly pathInfo: IPathInfoLike;\n}\n\nexport interface IListIndexLike {\n readonly index: number;\n readonly indexes: number[];\n}\n\nexport interface IAbsoluteAddressLike {\n readonly absolutePathInfo: IAbsolutePathInfoLike;\n readonly listIndex: IListIndexLike | null;\n}\n\nexport interface IBindingLike {\n readonly propName: string;\n readonly statePathName: string;\n readonly stateName: string;\n readonly bindingType: string;\n readonly node: Node;\n readonly replaceNode: Node;\n}\n\nexport interface IStateElementSummaryLike {\n readonly name: string;\n readonly rootNode: Node;\n readonly element: unknown;\n readonly paths: {\n readonly list: ReadonlySet<string>;\n readonly element: ReadonlySet<string>;\n readonly getter: ReadonlySet<string>;\n readonly setter: ReadonlySet<string>;\n };\n readonly commandTokenNames: ReadonlySet<string>;\n readonly eventTokenNames: ReadonlySet<string>;\n readonly staticDependency: ReadonlyMap<string, readonly string[]>;\n readonly dynamicDependency: ReadonlyMap<string, readonly string[]>;\n}\n\nexport type DevtoolsEventLike =\n | {\n readonly type: \"state:element-registered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: unknown;\n }\n | {\n readonly type: \"state:element-unregistered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: unknown;\n }\n | {\n readonly type: \"state:write\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n readonly value: unknown;\n readonly oldValue: unknown;\n readonly hasOldValue: boolean;\n }\n | {\n readonly type: \"state:update-batch\";\n readonly addresses: ReadonlySet<IAbsoluteAddressLike>;\n }\n | {\n readonly type: \"state:binding-added\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n readonly binding: IBindingLike;\n }\n | {\n readonly type: \"state:binding-removed\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n readonly binding: IBindingLike;\n }\n | {\n readonly type: \"state:binding-cleared\";\n readonly absoluteAddress: IAbsoluteAddressLike;\n }\n | {\n readonly type: \"state:token-emit\";\n readonly kind: \"command\" | \"event\";\n readonly stateName: string | null;\n readonly tokenName: string;\n readonly args: readonly unknown[];\n readonly subscriberCount: number;\n };\n\nexport type DevtoolsSinkLike = (event: DevtoolsEventLike) => void;\n\nexport interface IDevtoolsSourceLike {\n readonly id: string;\n readonly kind: string;\n readonly packageVersion: string;\n getStateElements(): IStateElementSummaryLike[];\n /** protocol v1 追補 API。古いランタイムには無い可能性があるため optional 扱いで呼ぶ */\n keys?(name: string, rootNode: Node): string[];\n read(name: string, rootNode: Node, path: string, indexes?: number[]): unknown;\n write(name: string, rootNode: Node, path: string, value: unknown, indexes?: number[]): void;\n _setSink(sink: DevtoolsSinkLike | null): void;\n}\n\nexport interface IDevtoolsListenerLike {\n onSourceRegistered?(source: IDevtoolsSourceLike): void;\n onSourceUnregistered?(sourceId: string): void;\n onEvent?(sourceId: string, event: DevtoolsEventLike): void;\n}\n\nexport interface IDevtoolsHookRegistryLike {\n readonly version: number;\n readonly sources: Map<string, IDevtoolsSourceLike>;\n register(source: IDevtoolsSourceLike): void;\n unregister(sourceId: string): void;\n addListener(listener: IDevtoolsListenerLike): () => void;\n}\n","/**\n * protocol/registry.ts\n *\n * registry 最小実装の devtools 側コピー(protocol §2)。\n * ロード順非依存にするため、ランタイム側(@wcstack/state の bridge)と\n * devtools 側の両方が同一仕様の最小実装を持ち、先にロードされた方が\n * globalThis に置く(先勝ち・振る舞い差し替えなし)。\n */\n\nimport {\n DEVTOOLS_HOOK_GLOBAL,\n DEVTOOLS_PROTOCOL_VERSION,\n IDevtoolsHookRegistryLike,\n IDevtoolsListenerLike,\n IDevtoolsSourceLike,\n} from \"./types\";\n\nfunction createMinimalRegistry(): IDevtoolsHookRegistryLike {\n const sources = new Map<string, IDevtoolsSourceLike>();\n const listeners = new Set<IDevtoolsListenerLike>();\n const applySink = (source: IDevtoolsSourceLike): void => {\n if (listeners.size === 0) {\n source._setSink(null);\n return;\n }\n const sourceId = source.id;\n source._setSink((event) => {\n for (const listener of listeners) {\n listener.onEvent?.(sourceId, event);\n }\n });\n };\n return {\n version: DEVTOOLS_PROTOCOL_VERSION,\n sources,\n register(source: IDevtoolsSourceLike): void {\n if (sources.has(source.id)) {\n return;\n }\n sources.set(source.id, source);\n applySink(source);\n for (const listener of listeners) {\n listener.onSourceRegistered?.(source);\n }\n },\n unregister(sourceId: string): void {\n const source = sources.get(sourceId);\n if (source === undefined) {\n return;\n }\n source._setSink(null);\n sources.delete(sourceId);\n for (const listener of listeners) {\n listener.onSourceUnregistered?.(sourceId);\n }\n },\n addListener(listener: IDevtoolsListenerLike): () => void {\n listeners.add(listener);\n for (const source of sources.values()) {\n applySink(source);\n listener.onSourceRegistered?.(source);\n }\n return () => {\n if (!listeners.delete(listener)) {\n return;\n }\n for (const source of sources.values()) {\n applySink(source);\n }\n };\n },\n };\n}\n\nexport function getOrCreateHookRegistry(): IDevtoolsHookRegistryLike {\n const globals = globalThis as unknown as Record<string, unknown>;\n const existing = globals[DEVTOOLS_HOOK_GLOBAL] as IDevtoolsHookRegistryLike | undefined;\n if (existing !== undefined) {\n if (existing.version !== DEVTOOLS_PROTOCOL_VERSION) {\n // 先勝ち固定。振る舞いは差し替えない(protocol §2)\n console.warn(\n `[wcstack/devtools] hook registry version mismatch: found ${existing.version}, expected ${DEVTOOLS_PROTOCOL_VERSION}. Keeping the existing registry (first-wins).`\n );\n }\n return existing;\n }\n const registry = createMinimalRegistry();\n globals[DEVTOOLS_HOOK_GLOBAL] = registry;\n return registry;\n}\n","/**\n * core/formatValue.ts\n *\n * 値フォーマッタ(devtools-tag-design.md §6)。\n *\n * 規範:\n * - primitive はそのまま(文字列は引用 + 80 文字上限)\n * - 配列 / plain object は深さ制限 + 要素数制限つきの要約\n * - それ以外(MediaStream, Blob, Element, class インスタンス等)は\n * `[[ClassName]]` タグ表示のみ\n * - structuredClone / JSON.stringify を全値に無差別適用しない\n * (生ハンドル・循環・巨大値対策。camera G1 との共存)\n */\n\nconst MAX_STRING = 80;\nconst MAX_ITEMS = 3;\n\nfunction isPlainObject(value: object): boolean {\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction className(value: object): string {\n const ctor = (value as { constructor?: { name?: string } }).constructor;\n const name = ctor?.name;\n return typeof name === \"string\" && name.length > 0 ? name : \"Object\";\n}\n\n/**\n * 任意の値を表示用の短い文字列へ変換する。\n * @param value 対象値\n * @param depth 再帰許容深さ(既定 2。0 で複合値は要約タグのみ)\n */\nexport function formatValue(value: unknown, depth: number = 2): string {\n switch (typeof value) {\n case \"string\": {\n const body = value.length > MAX_STRING ? value.slice(0, MAX_STRING) + \"…\" : value;\n return `\"${body}\"`;\n }\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n return String(value);\n case \"symbol\":\n return value.toString();\n case \"undefined\":\n return \"undefined\";\n case \"function\":\n return \"[[Function]]\";\n default:\n break;\n }\n if (value === null) {\n return \"null\";\n }\n const objectValue = value as object;\n if (Array.isArray(objectValue)) {\n if (depth <= 0) {\n return `[[Array(${objectValue.length})]]`;\n }\n const shown = objectValue.slice(0, MAX_ITEMS).map((item) => formatValue(item, depth - 1));\n const rest = objectValue.length > MAX_ITEMS ? `, …(${objectValue.length})` : \"\";\n return `[${shown.join(\", \")}${rest}]`;\n }\n if (isPlainObject(objectValue)) {\n if (depth <= 0) {\n return \"[[Object]]\";\n }\n const keys = Object.keys(objectValue);\n const shown = keys.slice(0, MAX_ITEMS).map(\n (key) => `${key}: ${formatValue((objectValue as Record<string, unknown>)[key], depth - 1)}`\n );\n const rest = keys.length > MAX_ITEMS ? `, …(${keys.length})` : \"\";\n return `{${shown.join(\", \")}${rest}}`;\n }\n // DOM ノード・生ハンドル・class インスタンス等はタグ表示のみ\n return `[[${className(objectValue)}]]`;\n}\n\n/**\n * token 引数の要約(先頭 3 引数 × 各 80 文字上限、devtools-tag-design.md §6)。\n */\nexport function formatArgs(args: readonly unknown[]): string {\n if (args.length === 0) {\n return \"\";\n }\n const shown = args.slice(0, MAX_ITEMS).map((arg) => {\n const text = formatValue(arg, 1);\n return text.length > MAX_STRING ? text.slice(0, MAX_STRING) + \"…\" : text;\n });\n const rest = args.length > MAX_ITEMS ? `, …(${args.length})` : \"\";\n return `${shown.join(\", \")}${rest}`;\n}\n","/**\n * core/DevtoolsCore.ts\n *\n * hook client(devtools-tag-design.md §1)。DOM 非依存の純ロジック層。\n *\n * - registry への addListener / 解除(connect / disconnect)\n * - source 管理と roster(state 要素一覧)の維持\n * - 配線台帳(binding-added/removed イベントから構築。binding は WeakRef 保持)\n * - タイムライン ring buffer(既定 500 件 FIFO)\n * - 予約 prefix `wcs-devtools` の自己除外(protocol §5)\n *\n * 台帳はすべて devtools 側に置く(protocol 原則 2)。disconnect で\n * sources / roster / wiring をクリアし、残留参照を持たない。\n */\n\nimport { getOrCreateHookRegistry } from \"../protocol/registry\";\nimport {\n DevtoolsEventLike,\n IAbsoluteAddressLike,\n IBindingLike,\n IDevtoolsSourceLike,\n IStateElementSummaryLike,\n} from \"../protocol/types\";\nimport { formatArgs, formatValue } from \"./formatValue\";\n\n/** 予約 state 名 prefix(protocol §5)。この prefix の要素・イベントは常に除外 */\nexport const RESERVED_STATE_NAME_PREFIX = \"wcs-devtools\";\n\nconst DEFAULT_TIMELINE_CAPACITY = 500;\n\nexport type TimelineKind =\n | \"write\"\n | \"batch\"\n | \"command\"\n | \"event\"\n | \"element-registered\"\n | \"element-unregistered\";\n\nexport interface ITimelineEntry {\n readonly seq: number;\n readonly time: number;\n readonly sourceId: string;\n readonly kind: TimelineKind;\n readonly stateName: string | null;\n readonly label: string;\n readonly detail: string;\n readonly subscriberCount: number | null;\n}\n\nexport interface IRosterEntry {\n readonly sourceId: string;\n readonly name: string;\n readonly rootNode: Node;\n readonly summary: IStateElementSummaryLike;\n}\n\nexport interface IWiringEntry {\n readonly sourceId: string;\n readonly stateName: string;\n readonly path: string;\n readonly propName: string;\n readonly bindingType: string;\n readonly bindingRef: WeakRef<IBindingLike>;\n}\n\nexport type CoreChangeKind = \"sources\" | \"roster\" | \"wiring\" | \"timeline\";\nexport type CoreChangeListener = (kind: CoreChangeKind) => void;\n\nexport interface IDevtoolsCoreOptions {\n /** タイムライン ring buffer 件数(既定 500) */\n timelineCapacity?: number;\n /** 追加で除外する state 名(予約 prefix は常に除外) */\n hiddenStateNames?: readonly string[];\n}\n\nfunction pathKeyOf(stateName: string, path: string): string {\n return stateName + \"\u0000\" + path;\n}\n\nexport class DevtoolsCore {\n private _timelineCapacity: number;\n private _hiddenStateNames: Set<string>;\n private _removeListener: (() => void) | null = null;\n private _sources: Map<string, IDevtoolsSourceLike> = new Map();\n private _roster: Map<string, IRosterEntry[]> = new Map();\n private _wiringByPathKey: Map<string, Set<IWiringEntry>> = new Map();\n private _wiringEntryByBinding: WeakMap<IBindingLike, IWiringEntry> = new WeakMap();\n private _timeline: ITimelineEntry[] = [];\n private _seq: number = 0;\n private _paused: boolean = false;\n private _changeListeners: Set<CoreChangeListener> = new Set();\n\n constructor(options?: IDevtoolsCoreOptions) {\n this._timelineCapacity = options?.timelineCapacity ?? DEFAULT_TIMELINE_CAPACITY;\n this._hiddenStateNames = new Set(options?.hiddenStateNames ?? []);\n }\n\n get connected(): boolean {\n return this._removeListener !== null;\n }\n\n get paused(): boolean {\n return this._paused;\n }\n\n set paused(value: boolean) {\n this._paused = value;\n }\n\n /** 表示から除外する state 名か(予約 prefix + hiddenStateNames、protocol §5) */\n isHiddenStateName(name: string | null): boolean {\n if (name === null) {\n return false;\n }\n return name.startsWith(RESERVED_STATE_NAME_PREFIX) || this._hiddenStateNames.has(name);\n }\n\n connect(): void {\n if (this._removeListener !== null) {\n return;\n }\n const registry = getOrCreateHookRegistry();\n this._removeListener = registry.addListener({\n onSourceRegistered: (source) => {\n this._sources.set(source.id, source);\n this._refreshRosterOf(source);\n this._notify(\"sources\");\n },\n onSourceUnregistered: (sourceId) => {\n this._sources.delete(sourceId);\n this._roster.delete(sourceId);\n this._notify(\"sources\");\n this._notify(\"roster\");\n },\n onEvent: (sourceId, event) => {\n this._ingest(sourceId, event);\n },\n });\n }\n\n /** 購読解除 + 台帳クリア(タイムラインは保持。protocol §7-2 の残留ゼロ) */\n disconnect(): void {\n if (this._removeListener === null) {\n return;\n }\n this._removeListener();\n this._removeListener = null;\n this._sources.clear();\n this._roster.clear();\n this._wiringByPathKey.clear();\n this._wiringEntryByBinding = new WeakMap();\n this._notify(\"sources\");\n this._notify(\"roster\");\n this._notify(\"wiring\");\n }\n\n onChange(listener: CoreChangeListener): () => void {\n this._changeListeners.add(listener);\n return () => {\n this._changeListeners.delete(listener);\n };\n }\n\n getSources(): IDevtoolsSourceLike[] {\n return [...this._sources.values()];\n }\n\n getRoster(): IRosterEntry[] {\n const entries: IRosterEntry[] = [];\n for (const list of this._roster.values()) {\n entries.push(...list);\n }\n return entries;\n }\n\n /** 全 source の state 要素一覧を pull で取り直す */\n refreshRoster(): void {\n for (const source of this._sources.values()) {\n this._refreshRosterOf(source);\n }\n this._notify(\"roster\");\n }\n\n getTimeline(): readonly ITimelineEntry[] {\n return this._timeline;\n }\n\n clearTimeline(): void {\n this._timeline = [];\n this._notify(\"timeline\");\n }\n\n /** 指定パスに束縛された配線(生存している binding のみ) */\n getWiringForPath(stateName: string, path: string): IWiringEntry[] {\n const set = this._wiringByPathKey.get(pathKeyOf(stateName, path));\n if (set === undefined) {\n return [];\n }\n return this._collectAlive(set);\n }\n\n /** 全配線のスナップショット(生存している binding のみ) */\n getAllWiring(): IWiringEntry[] {\n const result: IWiringEntry[] = [];\n for (const set of this._wiringByPathKey.values()) {\n result.push(...this._collectAlive(set));\n }\n return result;\n }\n\n /** 指定ノード(またはその子孫のバインドノード)に載る配線 */\n getWiringForNode(node: Node): IWiringEntry[] {\n const result: IWiringEntry[] = [];\n for (const set of this._wiringByPathKey.values()) {\n for (const entry of this._collectAlive(set)) {\n const binding = entry.bindingRef.deref()!;\n if (\n binding.node === node ||\n binding.replaceNode === node ||\n node.contains(binding.node) ||\n node.contains(binding.replaceNode)\n ) {\n result.push(entry);\n }\n }\n }\n return result;\n }\n\n /** roster entry の state からトップレベルキーを列挙(keys 未実装ランタイムは空) */\n keysOf(entry: IRosterEntry): string[] {\n const source = this._sources.get(entry.sourceId);\n if (source === undefined || typeof source.keys !== \"function\") {\n return [];\n }\n return source.keys(entry.name, entry.rootNode);\n }\n\n readValue(entry: IRosterEntry, path: string, indexes?: number[]): unknown {\n const source = this._sources.get(entry.sourceId);\n if (source === undefined) {\n return undefined;\n }\n return source.read(entry.name, entry.rootNode, path, indexes);\n }\n\n writeValue(entry: IRosterEntry, path: string, value: unknown, indexes?: number[]): void {\n const source = this._sources.get(entry.sourceId);\n if (source === undefined) {\n return;\n }\n source.write(entry.name, entry.rootNode, path, value, indexes);\n }\n\n // --- internal ---\n\n private _notify(kind: CoreChangeKind): void {\n for (const listener of this._changeListeners) {\n listener(kind);\n }\n }\n\n private _refreshRosterOf(source: IDevtoolsSourceLike): void {\n const entries: IRosterEntry[] = [];\n for (const summary of source.getStateElements()) {\n if (this.isHiddenStateName(summary.name)) {\n continue;\n }\n entries.push({\n sourceId: source.id,\n name: summary.name,\n rootNode: summary.rootNode,\n summary,\n });\n }\n this._roster.set(source.id, entries);\n }\n\n private _collectAlive(set: Set<IWiringEntry>): IWiringEntry[] {\n const alive: IWiringEntry[] = [];\n for (const entry of set) {\n if (entry.bindingRef.deref() === undefined) {\n // GC 済み binding は遅延剪定(detach 漏れで DOM を残さないための WeakRef 側)\n set.delete(entry);\n continue;\n }\n alive.push(entry);\n }\n return alive;\n }\n\n private _appendTimeline(entry: Omit<ITimelineEntry, \"seq\" | \"time\">): void {\n if (this._paused) {\n return;\n }\n this._timeline.push({\n ...entry,\n seq: this._seq++,\n time: performance.now(),\n });\n const overflow = this._timeline.length - this._timelineCapacity;\n if (overflow > 0) {\n this._timeline.splice(0, overflow);\n }\n this._notify(\"timeline\");\n }\n\n private _labelOf(address: IAbsoluteAddressLike): string {\n const indexes = address.listIndex?.indexes;\n const path = address.absolutePathInfo.pathInfo.path;\n return indexes !== undefined ? `${path}[${indexes.join(\",\")}]` : path;\n }\n\n private _ingest(sourceId: string, event: DevtoolsEventLike): void {\n switch (event.type) {\n case \"state:element-registered\": {\n if (this.isHiddenStateName(event.name)) {\n return;\n }\n const source = this._sources.get(sourceId);\n if (source !== undefined) {\n this._refreshRosterOf(source);\n this._notify(\"roster\");\n }\n this._appendTimeline({\n sourceId,\n kind: \"element-registered\",\n stateName: event.name,\n label: event.name,\n detail: \"\",\n subscriberCount: null,\n });\n return;\n }\n case \"state:element-unregistered\": {\n if (this.isHiddenStateName(event.name)) {\n return;\n }\n const source = this._sources.get(sourceId);\n if (source !== undefined) {\n this._refreshRosterOf(source);\n this._notify(\"roster\");\n }\n this._appendTimeline({\n sourceId,\n kind: \"element-unregistered\",\n stateName: event.name,\n label: event.name,\n detail: \"\",\n subscriberCount: null,\n });\n return;\n }\n case \"state:write\": {\n const stateName = event.absoluteAddress.absolutePathInfo.stateName;\n if (this.isHiddenStateName(stateName)) {\n return;\n }\n const detail = event.hasOldValue\n ? `${formatValue(event.value)} (was ${formatValue(event.oldValue)})`\n : formatValue(event.value);\n this._appendTimeline({\n sourceId,\n kind: \"write\",\n stateName,\n label: this._labelOf(event.absoluteAddress),\n detail,\n subscriberCount: null,\n });\n return;\n }\n case \"state:update-batch\": {\n const labels: string[] = [];\n let total = 0;\n for (const address of event.addresses) {\n if (this.isHiddenStateName(address.absolutePathInfo.stateName)) {\n continue;\n }\n total++;\n if (labels.length < 3) {\n labels.push(this._labelOf(address));\n }\n }\n if (total === 0) {\n return;\n }\n const rest = total > labels.length ? `, …(${total})` : \"\";\n this._appendTimeline({\n sourceId,\n kind: \"batch\",\n stateName: null,\n label: `${total} address${total === 1 ? \"\" : \"es\"}`,\n detail: `${labels.join(\", \")}${rest}`,\n subscriberCount: null,\n });\n return;\n }\n case \"state:binding-added\": {\n const stateName = event.absoluteAddress.absolutePathInfo.stateName;\n if (this.isHiddenStateName(stateName)) {\n return;\n }\n const path = event.absoluteAddress.absolutePathInfo.pathInfo.path;\n const key = pathKeyOf(stateName, path);\n let set = this._wiringByPathKey.get(key);\n if (set === undefined) {\n set = new Set();\n this._wiringByPathKey.set(key, set);\n }\n const entry: IWiringEntry = {\n sourceId,\n stateName,\n path,\n propName: event.binding.propName,\n bindingType: event.binding.bindingType,\n bindingRef: new WeakRef(event.binding),\n };\n set.add(entry);\n this._wiringEntryByBinding.set(event.binding, entry);\n this._notify(\"wiring\");\n return;\n }\n case \"state:binding-removed\": {\n const entry = this._wiringEntryByBinding.get(event.binding);\n if (entry === undefined) {\n return;\n }\n this._wiringEntryByBinding.delete(event.binding);\n const key = pathKeyOf(entry.stateName, entry.path);\n const set = this._wiringByPathKey.get(key);\n if (set !== undefined) {\n set.delete(entry);\n if (set.size === 0) {\n this._wiringByPathKey.delete(key);\n }\n }\n this._notify(\"wiring\");\n return;\n }\n case \"state:binding-cleared\": {\n const stateName = event.absoluteAddress.absolutePathInfo.stateName;\n const path = event.absoluteAddress.absolutePathInfo.pathInfo.path;\n const key = pathKeyOf(stateName, path);\n if (this._wiringByPathKey.delete(key)) {\n this._notify(\"wiring\");\n }\n return;\n }\n case \"state:token-emit\": {\n if (this.isHiddenStateName(event.stateName)) {\n return;\n }\n this._appendTimeline({\n sourceId,\n kind: event.kind,\n stateName: event.stateName,\n label: event.tokenName,\n detail: formatArgs(event.args),\n subscriberCount: event.subscriberCount,\n });\n return;\n }\n }\n }\n}\n","/**\n * core/declaredScan.ts\n *\n * 遅延アタッチ時の declared ビュー(protocol §6)。\n *\n * binding 台帳はフック接続前の分を復元できないため、DOM に残っている\n * `data-wcs` 属性と `<!--wcs-*: -->` コメントを再スキャンして\n * 「宣言レベルの配線ビュー」を組む。ライブ台帳と違い binding 実体・\n * 接続状態は分からない(UI では \"declared\" バッジで区別する)。\n *\n * パースは表示目的の簡易版(`prop[#mod]: path[@state][|filters]` を\n * `;` 区切りで分解するだけ)。正確なセマンティクスの正本は\n * @wcstack/state の bindTextParser であり、ここでは追随しない。\n */\n\nexport interface IDeclaredBinding {\n /** 宣言が載っている要素(コメント由来の場合は親要素) */\n readonly element: Element;\n readonly propName: string;\n readonly path: string;\n readonly stateName: string;\n readonly filters: readonly string[];\n /** 宣言ソース: data-wcs 属性か comment ノードか */\n readonly origin: \"attribute\" | \"comment\";\n readonly raw: string;\n}\n\nconst DEFAULT_BIND_ATTRIBUTE = \"data-wcs\";\nconst COMMENT_PREFIXES = [\"wcs-text\", \"wcs-for\", \"wcs-if\", \"wcs-elseif\", \"wcs-else\"];\n\nfunction parseEntry(\n element: Element,\n raw: string,\n origin: \"attribute\" | \"comment\"\n): IDeclaredBinding | null {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return null;\n }\n const colon = trimmed.indexOf(\":\");\n if (colon < 0) {\n return null;\n }\n const propName = trimmed.slice(0, colon).trim();\n const rhs = trimmed.slice(colon + 1).trim();\n if (propName.length === 0 || rhs.length === 0) {\n return null;\n }\n const [pathPart, ...filterParts] = rhs.split(\"|\").map((part) => part.trim());\n let path = pathPart;\n let stateName = \"default\";\n const at = pathPart.lastIndexOf(\"@\");\n if (at > 0) {\n path = pathPart.slice(0, at).trim();\n stateName = pathPart.slice(at + 1).trim();\n }\n return {\n element,\n propName,\n path,\n stateName,\n filters: filterParts.filter((part) => part.length > 0),\n origin,\n raw: trimmed,\n };\n}\n\n/**\n * rootNode 配下の宣言配線を列挙する。\n * @param root 走査起点(Document / ShadowRoot / Element)\n * @param bindAttributeName バインド属性名(既定 data-wcs。setConfig で変えたページ用)\n */\nexport function scanDeclaredBindings(\n root: ParentNode,\n bindAttributeName: string = DEFAULT_BIND_ATTRIBUTE\n): IDeclaredBinding[] {\n const result: IDeclaredBinding[] = [];\n\n // data-wcs 属性(template の for/if 宣言もこの属性に載る)\n for (const element of root.querySelectorAll(`[${bindAttributeName}]`)) {\n // querySelectorAll の一致条件上、属性は必ず存在する\n const raw = element.getAttribute(bindAttributeName)!;\n for (const part of raw.split(\";\")) {\n const entry = parseEntry(element, part, \"attribute\");\n if (entry !== null) {\n result.push(entry);\n }\n }\n }\n\n // <!--wcs-text: path--> 等のコメントノード(mustache 展開後の姿)\n const document = root.ownerDocument ?? (root as Document);\n const walker = document.createTreeWalker(root as Node, NodeFilter.SHOW_COMMENT);\n let comment = walker.nextNode();\n while (comment !== null) {\n // コメントノードの textContent は常に文字列\n const text = comment.textContent!.trim();\n const prefix = COMMENT_PREFIXES.find(\n (candidate) => text === candidate || text.startsWith(candidate + \":\")\n );\n if (prefix !== undefined) {\n const parentElement =\n comment.parentNode instanceof Element ? comment.parentNode : null;\n if (parentElement !== null) {\n const body = text === prefix ? \"\" : text.slice(prefix.length + 1).trim();\n if (body.length > 0) {\n const propName = prefix === \"wcs-text\" ? \"textContent\" : prefix.slice(\"wcs-\".length);\n // propName / body とも非空のため parseEntry は必ず成功する\n result.push(parseEntry(parentElement, `${propName}: ${body}`, \"comment\")!);\n }\n }\n }\n comment = walker.nextNode();\n }\n\n return result;\n}\n","/**\n * shell/WcsDevtools.ts\n *\n * `<wcs-devtools>` — ページ内オーバーレイ DevTools 本体(devtools-tag-design.md)。\n *\n * - ShadowRoot 内で完結(ページの CSS/DOM を変更しない)\n * - ハイライトはページ要素の style/class を触らず、fixed 配置の\n * オーバーレイ枠で描く(devtools-tag-design.md §2)\n * - UI レンダリングは vanilla DOM(記録済み決定: inspected ランタイムの\n * updater キューに devtools 描画負荷を混ぜない = 観測者効果の排除。\n * wcs-state ドッグフーディングは Phase 2 で再評価)\n * - 描画は Core の change 通知を rAF で 1 回に合流(イベント毎 DOM 追加禁止、\n * devtools-tag-design.md §3.3)\n */\n\nimport { DevtoolsCore, IRosterEntry, ITimelineEntry, IWiringEntry } from \"../core/DevtoolsCore\";\nimport { formatValue } from \"../core/formatValue\";\nimport { IDeclaredBinding, scanDeclaredBindings } from \"../core/declaredScan\";\n\nconst STYLE_TEXT = /* css */ `\n:host {\n all: initial;\n position: fixed;\n z-index: 2147483647;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n inset: auto 0 0 auto;\n}\n* { box-sizing: border-box; }\n.badge {\n position: fixed;\n right: 12px;\n bottom: 12px;\n width: 40px;\n height: 40px;\n border-radius: 20px;\n border: 1px solid #2b4f78;\n background: #10263f;\n color: #9fd0ff;\n font-weight: 700;\n cursor: pointer;\n}\n.panel {\n position: fixed;\n display: flex;\n flex-direction: column;\n background: #0d1b2a;\n color: #d7e3f4;\n border: 1px solid #2b4f78;\n box-shadow: 0 0 24px rgba(0,0,0,.5);\n}\n.panel.dock-bottom { left: 0; right: 0; bottom: 0; height: 45vh; }\n.panel.dock-right { top: 0; right: 0; bottom: 0; width: 420px; }\n.panel[hidden] { display: none; }\nheader {\n display: flex;\n gap: 6px;\n align-items: center;\n padding: 6px 8px;\n border-bottom: 1px solid #2b4f78;\n background: #10263f;\n}\nheader .title { font-weight: 700; color: #9fd0ff; margin-right: 4px; }\nheader select, header button {\n font: inherit;\n background: #16324f;\n color: #d7e3f4;\n border: 1px solid #2b4f78;\n border-radius: 4px;\n padding: 2px 8px;\n cursor: pointer;\n}\nheader button[aria-pressed=\"true\"] { background: #2b5d8f; }\nheader .spacer { flex: 1; }\n.panes { display: flex; flex: 1; min-height: 0; }\n.pane { flex: 1; min-width: 0; overflow: auto; padding: 6px 8px; border-right: 1px solid #1d3a5c; }\n.pane:last-child { border-right: none; }\n.pane h3 {\n margin: 0 0 6px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: .08em;\n color: #7ba7d4;\n}\n.tree-row { display: flex; gap: 6px; padding: 1px 0; align-items: baseline; white-space: nowrap; }\n.tree-row .toggle { width: 14px; cursor: pointer; color: #7ba7d4; user-select: none; }\n.tree-row .key { color: #9fd0ff; cursor: pointer; }\n.tree-row .value { color: #ffd9a0; overflow: hidden; text-overflow: ellipsis; }\n.tree-row .value.editable { cursor: pointer; }\n.tree-row input { font: inherit; background: #16324f; color: #ffd9a0; border: 1px solid #2b4f78; }\n.badge-tag {\n display: inline-block;\n padding: 0 4px;\n border-radius: 3px;\n font-size: 10px;\n background: #26456a;\n color: #a8c6e8;\n}\n.badge-tag.warn { background: #6a3326; color: #ffb3a0; }\n.badge-tag.declared { background: #4a4426; color: #efe3a0; }\n.wiring-row, .timeline-row { padding: 1px 0; white-space: nowrap; }\n.wiring-row .prop { color: #b7f0c0; }\n.wiring-row .path { color: #9fd0ff; }\n.timeline-row .t { color: #6f88a3; }\n.timeline-row .label { color: #9fd0ff; }\n.timeline-row .detail { color: #ffd9a0; }\n.timeline-row .kind { display: inline-block; min-width: 52px; text-align: center; }\n.empty { color: #6f88a3; font-style: italic; padding: 4px 0; }\n.notice { color: #efe3a0; padding: 2px 0 6px; }\n.notice button { font: inherit; margin-left: 6px; cursor: pointer; }\n.hl-box {\n position: fixed;\n pointer-events: none;\n border: 1px solid #58c2ff;\n background: rgba(88,194,255,.18);\n}\n`;\n\ntype PaneName = \"state\" | \"wiring\" | \"timeline\";\n\n/** タイムラインの DOM 描画上限(buffer とは別。§3.3 のバースト圧縮の一部) */\nconst TIMELINE_RENDER_LIMIT = 200;\n/** リスト展開の 1 階層あたり表示件数上限 */\nconst LIST_CHILD_LIMIT = 20;\n\ninterface ITreeNodeRef {\n readonly path: string;\n readonly indexes: number[];\n}\n\nfunction nodeKeyOf(ref: ITreeNodeRef): string {\n return `${ref.path}#${ref.indexes.join(\",\")}`;\n}\n\nfunction isExpandable(value: unknown): boolean {\n if (Array.isArray(value)) {\n return true;\n }\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction coerceInput(text: string): unknown {\n const trimmed = text.trim();\n try {\n return JSON.parse(trimmed);\n } catch {\n return text;\n }\n}\n\nexport class WcsDevtools extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\"open\", \"dock\", \"hotkey\"];\n }\n\n private _core: DevtoolsCore | null = null;\n private _removeCoreListener: (() => void) | null = null;\n private _panel: HTMLElement | null = null;\n private _badge: HTMLButtonElement | null = null;\n private _stateSelect: HTMLSelectElement | null = null;\n private _paneElements: Partial<Record<PaneName, HTMLElement>> = {};\n private _highlightLayer: HTMLElement | null = null;\n private _dirtyPanes: Set<PaneName> = new Set();\n private _renderScheduled: boolean = false;\n private _selectedRosterKey: string | null = null;\n private _selectedPath: string | null = null;\n private _pickedNode: Node | null = null;\n private _pickMode: boolean = false;\n private _expanded: Set<string> = new Set();\n private _hotkeyHandler: ((event: KeyboardEvent) => void) | null = null;\n private _pickHandler: ((event: MouseEvent) => void) | null = null;\n\n get core(): DevtoolsCore | null {\n return this._core;\n }\n\n connectedCallback(): void {\n // SSR では不活性(protocol 原則 6)\n if (document.documentElement.hasAttribute(\"data-wcs-server\")) {\n return;\n }\n if (this.shadowRoot === null) {\n this._buildShadow();\n }\n const capacity = Number(this.getAttribute(\"buffer\") ?? \"\");\n const hidden = (this.getAttribute(\"hidden-states\") ?? \"\")\n .split(\",\")\n .map((name) => name.trim())\n .filter((name) => name.length > 0);\n this._core = new DevtoolsCore({\n timelineCapacity: Number.isFinite(capacity) && capacity > 0 ? capacity : undefined,\n hiddenStateNames: hidden,\n });\n this._removeCoreListener = this._core.onChange((kind) => {\n if (kind === \"roster\" || kind === \"sources\") {\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n } else if (kind === \"wiring\") {\n this._markDirty(\"wiring\");\n } else {\n this._markDirty(\"timeline\");\n }\n });\n this._core.connect();\n this._applyDock();\n this._applyOpen();\n this._installHotkey();\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n this._markDirty(\"timeline\");\n }\n\n disconnectedCallback(): void {\n this._removeCoreListener?.();\n this._removeCoreListener = null;\n this._core?.disconnect();\n this._core = null;\n this._uninstallHotkey();\n this._exitPickMode();\n }\n\n attributeChangedCallback(name: string): void {\n if (this.shadowRoot === null) {\n return;\n }\n if (name === \"open\") {\n this._applyOpen();\n } else if (name === \"dock\") {\n this._applyDock();\n } else if (name === \"hotkey\") {\n this._uninstallHotkey();\n this._installHotkey();\n }\n }\n\n /** テスト用: rAF を待たずに保留中の描画を実行する */\n __flushRenderForTest(): void {\n this._renderDirty();\n }\n\n // --- shadow construction ---\n\n private _buildShadow(): void {\n const shadow = this.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = STYLE_TEXT;\n shadow.append(style);\n\n const badge = document.createElement(\"button\");\n badge.className = \"badge\";\n badge.title = \"wcstack DevTools\";\n badge.textContent = \"WCS\";\n badge.addEventListener(\"click\", () => this.toggle());\n shadow.append(badge);\n this._badge = badge;\n\n const panel = document.createElement(\"div\");\n panel.className = \"panel dock-bottom\";\n panel.hidden = true;\n\n const header = document.createElement(\"header\");\n const title = document.createElement(\"span\");\n title.className = \"title\";\n title.textContent = \"wcstack devtools\";\n header.append(title);\n\n const stateSelect = document.createElement(\"select\");\n stateSelect.title = \"state element\";\n stateSelect.addEventListener(\"change\", () => {\n this._selectedRosterKey = stateSelect.value || null;\n this._selectedPath = null;\n this._expanded.clear();\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n });\n header.append(stateSelect);\n this._stateSelect = stateSelect;\n\n const pickButton = this._headerButton(header, \"⌖ pick\", \"pick a page element\");\n pickButton.addEventListener(\"click\", () => {\n if (this._pickMode) {\n this._exitPickMode();\n } else {\n this._enterPickMode();\n }\n pickButton.setAttribute(\"aria-pressed\", String(this._pickMode));\n });\n pickButton.dataset[\"role\"] = \"pick\";\n\n const pauseButton = this._headerButton(header, \"⏸\", \"pause timeline\");\n pauseButton.addEventListener(\"click\", () => {\n const core = this._core;\n if (core === null) {\n return;\n }\n core.paused = !core.paused;\n pauseButton.setAttribute(\"aria-pressed\", String(core.paused));\n });\n pauseButton.dataset[\"role\"] = \"pause\";\n\n const clearButton = this._headerButton(header, \"🗑\", \"clear timeline\");\n clearButton.addEventListener(\"click\", () => {\n this._core?.clearTimeline();\n });\n clearButton.dataset[\"role\"] = \"clear\";\n\n const spacer = document.createElement(\"span\");\n spacer.className = \"spacer\";\n header.append(spacer);\n\n const dockButton = this._headerButton(header, \"dock\", \"toggle dock position\");\n dockButton.addEventListener(\"click\", () => {\n const next = (this.getAttribute(\"dock\") ?? \"bottom\") === \"bottom\" ? \"right\" : \"bottom\";\n this.setAttribute(\"dock\", next);\n });\n dockButton.dataset[\"role\"] = \"dock\";\n\n const closeButton = this._headerButton(header, \"×\", \"close\");\n closeButton.addEventListener(\"click\", () => this.toggle(false));\n closeButton.dataset[\"role\"] = \"close\";\n\n panel.append(header);\n\n const panes = document.createElement(\"div\");\n panes.className = \"panes\";\n for (const [name, heading] of [\n [\"state\", \"State\"],\n [\"wiring\", \"Wiring\"],\n [\"timeline\", \"Timeline\"],\n ] as const) {\n const pane = document.createElement(\"section\");\n pane.className = `pane pane-${name}`;\n const h3 = document.createElement(\"h3\");\n h3.textContent = heading;\n const body = document.createElement(\"div\");\n body.className = \"pane-body\";\n pane.append(h3, body);\n panes.append(pane);\n this._paneElements[name] = body;\n }\n panel.append(panes);\n shadow.append(panel);\n this._panel = panel;\n\n const highlightLayer = document.createElement(\"div\");\n highlightLayer.className = \"hl-layer\";\n shadow.append(highlightLayer);\n this._highlightLayer = highlightLayer;\n }\n\n private _headerButton(header: HTMLElement, label: string, title: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.textContent = label;\n button.title = title;\n button.setAttribute(\"aria-pressed\", \"false\");\n header.append(button);\n return button;\n }\n\n // --- open/close/dock/hotkey ---\n\n get open(): boolean {\n return this.hasAttribute(\"open\");\n }\n\n toggle(force?: boolean): void {\n const next = force ?? !this.open;\n if (next) {\n this.setAttribute(\"open\", \"\");\n } else {\n this.removeAttribute(\"open\");\n }\n }\n\n private _applyOpen(): void {\n // shadowRoot 構築後にしか呼ばれない(attributeChangedCallback 側でガード済み)\n this._panel!.hidden = !this.open;\n this._badge!.hidden = this.open;\n if (this.open) {\n this._markDirty(\"state\");\n this._markDirty(\"wiring\");\n this._markDirty(\"timeline\");\n }\n }\n\n private _applyDock(): void {\n // shadowRoot 構築後にしか呼ばれない(attributeChangedCallback 側でガード済み)\n const dock = this.getAttribute(\"dock\") === \"right\" ? \"right\" : \"bottom\";\n this._panel!.classList.toggle(\"dock-right\", dock === \"right\");\n this._panel!.classList.toggle(\"dock-bottom\", dock === \"bottom\");\n }\n\n private _installHotkey(): void {\n const spec = this.getAttribute(\"hotkey\") ?? \"Alt+Shift+D\";\n if (spec === \"none\") {\n return;\n }\n const parts = spec.split(\"+\").map((part) => part.trim().toLowerCase());\n const key = parts[parts.length - 1];\n const alt = parts.includes(\"alt\");\n const shift = parts.includes(\"shift\");\n const ctrl = parts.includes(\"ctrl\");\n const meta = parts.includes(\"meta\");\n this._hotkeyHandler = (event: KeyboardEvent) => {\n if (\n event.key.toLowerCase() === key &&\n event.altKey === alt &&\n event.shiftKey === shift &&\n event.ctrlKey === ctrl &&\n event.metaKey === meta\n ) {\n event.preventDefault();\n this.toggle();\n }\n };\n window.addEventListener(\"keydown\", this._hotkeyHandler);\n }\n\n private _uninstallHotkey(): void {\n if (this._hotkeyHandler !== null) {\n window.removeEventListener(\"keydown\", this._hotkeyHandler);\n this._hotkeyHandler = null;\n }\n }\n\n // --- pick mode ---\n\n private _enterPickMode(): void {\n // 呼び出し元(pick ボタン)が toggle 済みのため、ここでは常に開始でよい\n this._pickMode = true;\n // click を capture で奪う(誤操作防止、devtools-tag-design.md G-U2 の既定側)\n this._pickHandler = (event: MouseEvent) => {\n const target = event.target as Node;\n // devtools 自身(実ブラウザでは retarget されて host、shadow 非 retarget 環境では\n // shadow 内ノード)は pick 対象外\n if (target.getRootNode() === this.shadowRoot || target === this) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this._pickedNode = target;\n this._selectedPath = null;\n this._exitPickMode();\n this._markDirty(\"wiring\");\n };\n document.addEventListener(\"click\", this._pickHandler, { capture: true });\n }\n\n private _exitPickMode(): void {\n if (this._pickHandler !== null) {\n document.removeEventListener(\"click\", this._pickHandler, { capture: true });\n this._pickHandler = null;\n }\n this._pickMode = false;\n const pickButton = this.shadowRoot?.querySelector('button[data-role=\"pick\"]');\n pickButton?.setAttribute(\"aria-pressed\", \"false\");\n }\n\n // --- rendering ---\n\n private _markDirty(pane: PaneName): void {\n this._dirtyPanes.add(pane);\n if (this._renderScheduled) {\n return;\n }\n this._renderScheduled = true;\n requestAnimationFrame(() => {\n this._renderDirty();\n });\n }\n\n private _renderDirty(): void {\n this._renderScheduled = false;\n if (this._core === null || this.shadowRoot === null) {\n this._dirtyPanes.clear();\n return;\n }\n const dirty = this._dirtyPanes;\n this._dirtyPanes = new Set();\n if (dirty.has(\"state\")) {\n this._renderStatePane();\n }\n if (dirty.has(\"wiring\")) {\n this._renderWiringPane();\n }\n if (dirty.has(\"timeline\")) {\n this._renderTimelinePane();\n }\n }\n\n private _rosterKey(entry: IRosterEntry): string {\n return `${entry.sourceId}:${entry.name}`;\n }\n\n private _selectedRoster(): IRosterEntry | null {\n const core = this._core!;\n const roster = core.getRoster();\n if (roster.length === 0) {\n return null;\n }\n const found = roster.find((entry) => this._rosterKey(entry) === this._selectedRosterKey);\n return found ?? roster[0];\n }\n\n private _renderStatePane(): void {\n const core = this._core!;\n const body = this._paneElements[\"state\"]!;\n const select = this._stateSelect!;\n const roster = core.getRoster();\n const selected = this._selectedRoster();\n\n select.replaceChildren(\n ...roster.map((entry) => {\n const option = document.createElement(\"option\");\n option.value = this._rosterKey(entry);\n option.textContent = `${entry.name} (${entry.sourceId.slice(0, 12)})`;\n option.selected = selected !== null && this._rosterKey(entry) === this._rosterKey(selected);\n return option;\n })\n );\n\n body.replaceChildren();\n if (selected === null) {\n body.append(this._emptyRow(\"no <wcs-state> elements observed\"));\n return;\n }\n this._selectedRosterKey = this._rosterKey(selected);\n const keys = core.keysOf(selected);\n if (keys.length === 0) {\n body.append(this._emptyRow(\"no readable keys (runtime without keys() API?)\"));\n return;\n }\n for (const key of keys) {\n this._renderTreeNode(body, selected, { path: key, indexes: [] }, key, 0);\n }\n }\n\n private _renderTreeNode(\n container: HTMLElement,\n entry: IRosterEntry,\n ref: ITreeNodeRef,\n label: string,\n depth: number\n ): void {\n const core = this._core!;\n let value: unknown;\n let readable = true;\n try {\n value = core.readValue(entry, ref.path, ref.indexes);\n } catch {\n readable = false;\n }\n\n const row = document.createElement(\"div\");\n row.className = \"tree-row\";\n row.style.paddingLeft = `${depth * 14}px`;\n\n const expandable = readable && isExpandable(value);\n const key = nodeKeyOf(ref);\n const expanded = expandable && this._expanded.has(key);\n\n const toggle = document.createElement(\"span\");\n toggle.className = \"toggle\";\n toggle.textContent = expandable ? (expanded ? \"▾\" : \"▸\") : \"\";\n if (expandable) {\n toggle.addEventListener(\"click\", () => {\n if (this._expanded.has(key)) {\n this._expanded.delete(key);\n } else {\n this._expanded.add(key);\n }\n this._markDirty(\"state\");\n });\n }\n row.append(toggle);\n\n const keySpan = document.createElement(\"span\");\n keySpan.className = \"key\";\n keySpan.textContent = `${label}:`;\n keySpan.title = ref.path;\n keySpan.addEventListener(\"click\", () => {\n this._selectedPath = ref.path;\n this._pickedNode = null;\n this._markDirty(\"wiring\");\n this._highlightPath(entry, ref.path);\n });\n row.append(keySpan);\n\n const valueSpan = document.createElement(\"span\");\n valueSpan.className = \"value\";\n if (!readable) {\n valueSpan.textContent = \"(unreadable getter)\";\n } else {\n valueSpan.textContent = formatValue(value, 1);\n const editable = value === null || typeof value !== \"object\";\n if (editable && typeof value !== \"function\") {\n valueSpan.classList.add(\"editable\");\n valueSpan.title = \"click to edit\";\n valueSpan.addEventListener(\"click\", () => {\n this._beginEdit(row, valueSpan, entry, ref, value);\n });\n }\n }\n row.append(valueSpan);\n container.append(row);\n\n if (expanded) {\n if (Array.isArray(value)) {\n const limit = Math.min(value.length, LIST_CHILD_LIMIT);\n for (let index = 0; index < limit; index++) {\n this._renderTreeNode(\n container,\n entry,\n { path: `${ref.path}.*`, indexes: [...ref.indexes, index] },\n `[${index}]`,\n depth + 1\n );\n }\n if (value.length > limit) {\n const more = this._emptyRow(`…(${value.length} items)`);\n more.style.paddingLeft = `${(depth + 1) * 14}px`;\n container.append(more);\n }\n } else {\n for (const childKey of Object.keys(value as Record<string, unknown>)) {\n this._renderTreeNode(\n container,\n entry,\n { path: `${ref.path}.${childKey}`, indexes: ref.indexes },\n childKey,\n depth + 1\n );\n }\n }\n }\n }\n\n private _beginEdit(\n row: HTMLElement,\n valueSpan: HTMLElement,\n entry: IRosterEntry,\n ref: ITreeNodeRef,\n current: unknown\n ): void {\n const input = document.createElement(\"input\");\n input.value = typeof current === \"string\" ? current : String(current);\n const commit = (): void => {\n // 編集は通常のリアクティブパイプラインを通る(devtools-tag-design.md §3.1)\n this._core?.writeValue(entry, ref.path, coerceInput(input.value), ref.indexes);\n this._markDirty(\"state\");\n };\n input.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\") {\n commit();\n } else if (event.key === \"Escape\") {\n this._markDirty(\"state\");\n }\n });\n row.replaceChild(input, valueSpan);\n input.focus();\n }\n\n private _renderWiringPane(): void {\n const core = this._core!;\n const body = this._paneElements[\"wiring\"]!;\n body.replaceChildren();\n\n let entries: IWiringEntry[];\n let contextLabel: string;\n if (this._pickedNode !== null) {\n entries = core.getWiringForNode(this._pickedNode);\n const target = this._pickedNode;\n contextLabel =\n target instanceof Element ? `<${target.tagName.toLowerCase()}>` : target.nodeName;\n } else if (this._selectedPath !== null) {\n const selected = this._selectedRoster();\n entries =\n selected !== null ? core.getWiringForPath(selected.name, this._selectedPath) : [];\n contextLabel = this._selectedPath;\n } else {\n entries = core.getAllWiring();\n contextLabel = \"all\";\n }\n\n const info = document.createElement(\"div\");\n info.textContent = `context: ${contextLabel} — ${entries.length} live binding${entries.length === 1 ? \"\" : \"s\"}`;\n body.append(info);\n\n if (entries.length > 0) {\n for (const entry of entries) {\n body.append(this._wiringRow(entry));\n }\n return;\n }\n\n // ライブ台帳が空 → declared ビューへフォールバック(protocol §6)\n const selected = this._selectedRoster();\n const declared =\n selected !== null ? scanDeclaredBindings(this._scanRootOf(selected)) : [];\n if (declared.length === 0) {\n body.append(this._emptyRow(\"no bindings observed\"));\n return;\n }\n const notice = document.createElement(\"div\");\n notice.className = \"notice\";\n const tag = document.createElement(\"span\");\n tag.className = \"badge-tag declared\";\n tag.textContent = \"declared\";\n notice.append(tag, document.createTextNode(\" attached late — reload to capture live bindings \"));\n const reload = document.createElement(\"button\");\n reload.textContent = \"reload\";\n reload.addEventListener(\"click\", () => {\n location.reload();\n });\n notice.append(reload);\n body.append(notice);\n for (const entry of declared) {\n body.append(this._declaredRow(entry));\n }\n }\n\n private _scanRootOf(entry: IRosterEntry): ParentNode {\n // instanceof はテスト環境(happy-dom)の Document 実体と一致しないことがあるため\n // nodeType で判定する(DOCUMENT_FRAGMENT_NODE は ShadowRoot を含む)\n const rootNode = entry.rootNode;\n if (\n rootNode.nodeType === Node.DOCUMENT_NODE ||\n rootNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE\n ) {\n return rootNode as unknown as ParentNode;\n }\n return document;\n }\n\n private _wiringRow(entry: IWiringEntry): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"wiring-row\";\n const prop = document.createElement(\"span\");\n prop.className = \"prop\";\n prop.textContent = entry.propName;\n const arrow = document.createTextNode(\" ← \");\n const path = document.createElement(\"span\");\n path.className = \"path\";\n path.textContent = `${entry.path}@${entry.stateName}`;\n const type = document.createElement(\"span\");\n type.className = \"badge-tag\";\n type.textContent = entry.bindingType;\n row.append(type, document.createTextNode(\" \"), prop, arrow, path);\n row.addEventListener(\"click\", () => {\n const binding = entry.bindingRef.deref();\n if (binding !== undefined) {\n this._highlightNodes([binding.node, binding.replaceNode]);\n }\n });\n return row;\n }\n\n private _declaredRow(entry: IDeclaredBinding): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"wiring-row\";\n const type = document.createElement(\"span\");\n type.className = \"badge-tag declared\";\n type.textContent = entry.origin;\n const prop = document.createElement(\"span\");\n prop.className = \"prop\";\n prop.textContent = entry.propName;\n const path = document.createElement(\"span\");\n path.className = \"path\";\n path.textContent = `${entry.path}@${entry.stateName}`;\n row.append(type, document.createTextNode(\" \"), prop, document.createTextNode(\" ← \"), path);\n row.addEventListener(\"click\", () => {\n this._highlightNodes([entry.element]);\n });\n return row;\n }\n\n private _renderTimelinePane(): void {\n const core = this._core!;\n const body = this._paneElements[\"timeline\"]!;\n const timeline = core.getTimeline();\n const start = Math.max(0, timeline.length - TIMELINE_RENDER_LIMIT);\n const rows: HTMLElement[] = [];\n if (start > 0) {\n rows.push(this._emptyRow(`…(${start} earlier entries)`));\n }\n for (let index = start; index < timeline.length; index++) {\n rows.push(this._timelineRow(timeline[index]));\n }\n if (rows.length === 0) {\n rows.push(this._emptyRow(\"no activity yet\"));\n }\n body.replaceChildren(...rows);\n body.scrollTop = body.scrollHeight;\n }\n\n private _timelineRow(entry: ITimelineEntry): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"timeline-row\";\n const time = document.createElement(\"span\");\n time.className = \"t\";\n time.textContent = `${(entry.time / 1000).toFixed(3)}s `;\n const kind = document.createElement(\"span\");\n kind.className = \"badge-tag kind\";\n kind.textContent = entry.kind;\n // subscriber 0 の command/event 空撃ちは警告表示(devtools-tag-design.md §3.2)\n if (entry.subscriberCount === 0) {\n kind.classList.add(\"warn\");\n kind.title = \"emitted with no subscribers\";\n }\n const label = document.createElement(\"span\");\n label.className = \"label\";\n const stateName = entry.stateName !== null ? `@${entry.stateName}` : \"\";\n label.textContent = ` ${entry.label}${stateName} `;\n const detail = document.createElement(\"span\");\n detail.className = \"detail\";\n detail.textContent = entry.detail;\n row.append(time, kind, label, detail);\n return row;\n }\n\n private _emptyRow(text: string): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = \"empty\";\n row.textContent = text;\n return row;\n }\n\n // --- highlight ---\n\n private _highlightPath(entry: IRosterEntry, path: string): void {\n const core = this._core!;\n const nodes: Node[] = [];\n for (const wiring of core.getWiringForPath(entry.name, path)) {\n const binding = wiring.bindingRef.deref();\n if (binding !== undefined) {\n nodes.push(binding.node, binding.replaceNode);\n }\n }\n this._highlightNodes(nodes);\n }\n\n private _highlightNodes(nodes: readonly Node[]): void {\n // shadowRoot 構築後にしか呼ばれない(各リスナーは _buildShadow 内で配線される)\n const layer = this._highlightLayer!;\n layer.replaceChildren();\n const seen = new Set<Element>();\n for (const node of nodes) {\n const element = node instanceof Element ? node : node.parentElement;\n if (element === null || seen.has(element) || !element.isConnected) {\n continue;\n }\n seen.add(element);\n const rect = element.getBoundingClientRect();\n const box = document.createElement(\"div\");\n box.className = \"hl-box\";\n box.style.left = `${rect.left}px`;\n box.style.top = `${rect.top}px`;\n box.style.width = `${rect.width}px`;\n box.style.height = `${rect.height}px`;\n layer.append(box);\n }\n // 2 秒後に自動で消す(追従はしない — クリック時スナップショット表示)\n setTimeout(() => {\n layer.replaceChildren();\n }, 2000);\n }\n}\n","/**\n * bootstrapDevtools.ts\n *\n * `<wcs-devtools>` の登録と自動挿入(devtools-tag-design.md §2)。\n * - 既に定義済みなら再定義しない\n * - ページに `<wcs-devtools>` が無ければ body 末尾に 1 つ挿入\n * (手動で書かれていれば挿入しない)\n * - SSR では何もしない\n */\n\nimport { WcsDevtools } from \"./shell/WcsDevtools\";\n\nconst TAG_NAME = \"wcs-devtools\";\n\nfunction insertIfAbsent(): void {\n if (document.querySelector(TAG_NAME) !== null) {\n return;\n }\n document.body.appendChild(document.createElement(TAG_NAME));\n}\n\nexport function bootstrapDevtools(): void {\n if (document.documentElement.hasAttribute(\"data-wcs-server\")) {\n return;\n }\n if (!customElements.get(TAG_NAME)) {\n customElements.define(TAG_NAME, WcsDevtools);\n }\n if (document.body !== null) {\n insertIfAbsent();\n } else {\n document.addEventListener(\"DOMContentLoaded\", insertIfAbsent, { once: true });\n }\n}\n"],"names":["DEVTOOLS_HOOK_GLOBAL","DEVTOOLS_PROTOCOL_VERSION","getOrCreateHookRegistry","globals","globalThis","existing","undefined","version","console","warn","registry","sources","Map","listeners","Set","applySink","source","size","_setSink","sourceId","id","event","listener","onEvent","register","has","set","onSourceRegistered","unregister","get","delete","onSourceUnregistered","addListener","add","values","createMinimalRegistry","formatValue","value","depth","length","slice","String","toString","objectValue","Array","isArray","shown","map","item","rest","join","proto","Object","getPrototypeOf","prototype","isPlainObject","keys","key","ctor","constructor","name","className","formatArgs","args","arg","text","RESERVED_STATE_NAME_PREFIX","pathKeyOf","stateName","path","DevtoolsCore","_timelineCapacity","_hiddenStateNames","_removeListener","_sources","_roster","_wiringByPathKey","_wiringEntryByBinding","WeakMap","_timeline","_seq","_paused","_changeListeners","options","this","timelineCapacity","hiddenStateNames","connected","paused","isHiddenStateName","startsWith","connect","_refreshRosterOf","_notify","_ingest","disconnect","clear","onChange","getSources","getRoster","entries","list","push","refreshRoster","getTimeline","clearTimeline","getWiringForPath","_collectAlive","getAllWiring","result","getWiringForNode","node","entry","binding","bindingRef","deref","replaceNode","contains","keysOf","rootNode","readValue","indexes","read","writeValue","write","kind","summary","getStateElements","alive","_appendTimeline","seq","time","performance","now","overflow","splice","_labelOf","address","listIndex","absolutePathInfo","pathInfo","type","label","detail","subscriberCount","absoluteAddress","hasOldValue","oldValue","labels","total","addresses","propName","bindingType","WeakRef","tokenName","COMMENT_PREFIXES","parseEntry","element","raw","origin","trimmed","trim","colon","indexOf","rhs","pathPart","filterParts","split","part","at","lastIndexOf","filters","filter","scanDeclaredBindings","root","bindAttributeName","querySelectorAll","getAttribute","walker","ownerDocument","createTreeWalker","NodeFilter","SHOW_COMMENT","comment","nextNode","textContent","prefix","find","candidate","parentElement","parentNode","Element","body","WcsDevtools","HTMLElement","observedAttributes","_core","_removeCoreListener","_panel","_badge","_stateSelect","_paneElements","_highlightLayer","_dirtyPanes","_renderScheduled","_selectedRosterKey","_selectedPath","_pickedNode","_pickMode","_expanded","_hotkeyHandler","_pickHandler","core","connectedCallback","document","documentElement","hasAttribute","shadowRoot","_buildShadow","capacity","Number","hidden","isFinite","_markDirty","_applyDock","_applyOpen","_installHotkey","disconnectedCallback","_uninstallHotkey","_exitPickMode","attributeChangedCallback","__flushRenderForTest","_renderDirty","shadow","attachShadow","mode","style","createElement","append","badge","title","addEventListener","toggle","panel","header","stateSelect","pickButton","_headerButton","_enterPickMode","setAttribute","dataset","pauseButton","clearButton","spacer","dockButton","next","closeButton","panes","heading","pane","h3","highlightLayer","button","open","force","removeAttribute","dock","classList","spec","parts","toLowerCase","alt","includes","shift","ctrl","meta","altKey","shiftKey","ctrlKey","metaKey","preventDefault","window","removeEventListener","target","getRootNode","stopPropagation","capture","querySelector","requestAnimationFrame","dirty","_renderStatePane","_renderWiringPane","_renderTimelinePane","_rosterKey","_selectedRoster","roster","select","selected","replaceChildren","option","_emptyRow","_renderTreeNode","container","ref","readable","row","paddingLeft","expandable","isExpandable","nodeKeyOf","expanded","keySpan","_highlightPath","valueSpan","_beginEdit","limit","Math","min","index","more","childKey","current","input","commit","JSON","parse","coerceInput","replaceChild","focus","contextLabel","tagName","nodeName","info","_wiringRow","declared","_scanRootOf","notice","tag","createTextNode","reload","location","_declaredRow","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","prop","arrow","_highlightNodes","timeline","start","max","rows","_timelineRow","scrollTop","scrollHeight","toFixed","nodes","wiring","layer","seen","isConnected","rect","getBoundingClientRect","box","left","top","width","height","setTimeout","TAG_NAME","insertIfAbsent","appendChild","bootstrapDevtools","customElements","define","once"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wcstack/devtools",
|
|
3
|
+
"version": "1.20.0",
|
|
4
|
+
"description": "In-page DevTools overlay for wcstack. Inspect state trees, bindings/wiring and update timelines via the DevTools Hook Protocol - one script tag, no build step.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.esm.js",
|
|
7
|
+
"module": "./dist/index.esm.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.esm.js"
|
|
13
|
+
},
|
|
14
|
+
"./auto": "./dist/auto.min.js"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"clean": "rimraf dist .tsc-out",
|
|
21
|
+
"build": "rimraf dist .tsc-out && tsc && rollup -c",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"test:coverage": "vitest run --coverage",
|
|
25
|
+
"lint": "eslint src",
|
|
26
|
+
"version:patch": "npm version patch",
|
|
27
|
+
"version:minor": "npm version minor",
|
|
28
|
+
"version:major": "npm version major",
|
|
29
|
+
"prepublishOnly": "npm run build && npm run test:coverage"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"web-components",
|
|
33
|
+
"devtools",
|
|
34
|
+
"debugging",
|
|
35
|
+
"inspector",
|
|
36
|
+
"state-management",
|
|
37
|
+
"custom-elements",
|
|
38
|
+
"declarative",
|
|
39
|
+
"framework-agnostic"
|
|
40
|
+
],
|
|
41
|
+
"author": "mogera551",
|
|
42
|
+
"homepage": "https://wcstack.github.io",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/wcstack/wcstack.git",
|
|
46
|
+
"directory": "packages/devtools"
|
|
47
|
+
},
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/wcstack/wcstack/issues"
|
|
50
|
+
},
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@eslint/js": "^9.39.1",
|
|
54
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
55
|
+
"@rollup/plugin-typescript": "^11.1.6",
|
|
56
|
+
"@vitest/coverage-v8": "^4.0.15",
|
|
57
|
+
"@vitest/ui": "^4.0.15",
|
|
58
|
+
"eslint": "^9.39.1",
|
|
59
|
+
"globals": "^16.5.0",
|
|
60
|
+
"happy-dom": "^20.0.11",
|
|
61
|
+
"rimraf": "^6.0.1",
|
|
62
|
+
"rollup": "^4.22.4",
|
|
63
|
+
"rollup-plugin-dts": "^6.1.1",
|
|
64
|
+
"rollup-plugin-copy": "^3.5.0",
|
|
65
|
+
"tslib": "^2.8.1",
|
|
66
|
+
"typescript": "^5.9.3",
|
|
67
|
+
"typescript-eslint": "^8.49.0",
|
|
68
|
+
"vitest": "^4.0.15"
|
|
69
|
+
}
|
|
70
|
+
}
|