@matter-server/dashboard 1.1.8-alpha.0-20260707-c552b9d → 1.2.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.md +30 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts +6 -0
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.d.ts.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js +55 -2
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-thread.js.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts +6 -0
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.d.ts.map +1 -1
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js +53 -3
- package/dist/esm/components/dialogs/commission-node-dialog/commission-node-wifi.js.map +1 -1
- package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.d.ts +29 -0
- package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.js +112 -0
- package/dist/esm/components/dialogs/fabric-label-dialog/fabric-label-dialog.js.map +6 -0
- package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.d.ts +8 -0
- package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.js +17 -0
- package/dist/esm/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.js.map +6 -0
- package/dist/esm/components/dialogs/settings/settings-dialog.d.ts +28 -0
- package/dist/esm/components/dialogs/settings/settings-dialog.d.ts.map +1 -1
- package/dist/esm/components/dialogs/settings/settings-dialog.js +496 -105
- package/dist/esm/components/dialogs/settings/settings-dialog.js.map +1 -1
- package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts +6 -0
- package/dist/esm/pages/cluster-commands/base-cluster-commands.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/base-cluster-commands.js +8 -0
- package/dist/esm/pages/cluster-commands/base-cluster-commands.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js +21 -7
- package/dist/esm/pages/cluster-commands/clusters/access-control-commands.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/avsum-commands.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/avsum-commands.js +34 -13
- package/dist/esm/pages/cluster-commands/clusters/avsum-commands.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js +17 -11
- package/dist/esm/pages/cluster-commands/clusters/basic-information-commands.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.js +24 -9
- package/dist/esm/pages/cluster-commands/clusters/binding-commands.js.map +1 -1
- package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.d.ts +54 -0
- package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.d.ts.map +1 -0
- package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.js +514 -0
- package/dist/esm/pages/cluster-commands/clusters/icd-management-commands.js.map +6 -0
- package/dist/esm/pages/cluster-commands/index.d.ts +1 -0
- package/dist/esm/pages/cluster-commands/index.d.ts.map +1 -1
- package/dist/esm/pages/cluster-commands/index.js +1 -0
- package/dist/esm/pages/cluster-commands/index.js.map +1 -1
- package/dist/esm/pages/components/node-details.d.ts +2 -0
- package/dist/esm/pages/components/node-details.d.ts.map +1 -1
- package/dist/esm/pages/components/node-details.js +43 -2
- package/dist/esm/pages/components/node-details.js.map +1 -1
- package/dist/esm/pages/components/server-details.d.ts +4 -0
- package/dist/esm/pages/components/server-details.d.ts.map +1 -1
- package/dist/esm/pages/components/server-details.js +50 -2
- package/dist/esm/pages/components/server-details.js.map +1 -1
- package/dist/esm/pages/matter-cluster-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-cluster-view.js +1 -1
- package/dist/esm/pages/matter-cluster-view.js.map +1 -1
- package/dist/esm/pages/matter-network-view.d.ts +2 -0
- package/dist/esm/pages/matter-network-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-network-view.js +23 -0
- package/dist/esm/pages/matter-network-view.js.map +1 -1
- package/dist/esm/pages/matter-server-view.d.ts.map +1 -1
- package/dist/esm/pages/matter-server-view.js +35 -1
- package/dist/esm/pages/matter-server-view.js.map +1 -1
- package/dist/esm/pages/network/border-router-store.d.ts +11 -4
- package/dist/esm/pages/network/border-router-store.d.ts.map +1 -1
- package/dist/esm/pages/network/border-router-store.js +39 -0
- package/dist/esm/pages/network/border-router-store.js.map +1 -1
- package/dist/esm/pages/network/network-details.d.ts +11 -1
- package/dist/esm/pages/network/network-details.d.ts.map +1 -1
- package/dist/esm/pages/network/network-details.js +305 -3
- package/dist/esm/pages/network/network-details.js.map +1 -1
- package/dist/esm/pages/network/network-types.d.ts +3 -183
- package/dist/esm/pages/network/network-types.d.ts.map +1 -1
- package/dist/esm/pages/network/network-types.js +1 -10
- package/dist/esm/pages/network/network-types.js.map +2 -2
- package/dist/esm/pages/network/network-utils.d.ts +19 -171
- package/dist/esm/pages/network/network-utils.d.ts.map +1 -1
- package/dist/esm/pages/network/network-utils.js +118 -510
- package/dist/esm/pages/network/network-utils.js.map +2 -2
- package/dist/esm/pages/network/thread-graph.d.ts +23 -1
- package/dist/esm/pages/network/thread-graph.d.ts.map +1 -1
- package/dist/esm/pages/network/thread-graph.js +187 -10
- package/dist/esm/pages/network/thread-graph.js.map +1 -1
- package/dist/esm/util/duration.d.ts +8 -0
- package/dist/esm/util/duration.d.ts.map +1 -0
- package/dist/esm/util/duration.js +25 -0
- package/dist/esm/util/duration.js.map +6 -0
- package/dist/esm/util/icd.d.ts +54 -0
- package/dist/esm/util/icd.d.ts.map +1 -0
- package/dist/esm/util/icd.js +139 -0
- package/dist/esm/util/icd.js.map +6 -0
- package/dist/web/js/{attribute-write-dialog-Bk3AWMoZ.js → attribute-write-dialog-Bu7d1xMh.js} +1 -1
- package/dist/web/js/{command-invoke-dialog-H8A7dCFd.js → command-invoke-dialog-BK7MYWq-.js} +1 -1
- package/dist/web/js/{commission-node-dialog-GIvqBYGw.js → commission-node-dialog-BeRg7rEp.js} +5 -5
- package/dist/web/js/{commission-node-existing-DglV5NXP.js → commission-node-existing-ugSNvMcK.js} +2 -2
- package/dist/web/js/{commission-node-thread-DzrHWt8R.js → commission-node-thread-CT_Qbe1U.js} +53 -4
- package/dist/web/js/{commission-node-wifi-DWQ9mxqk.js → commission-node-wifi-Bx1nhWl4.js} +48 -5
- package/dist/web/js/{dialog-box-CsqgNzj2.js → dialog-box-DolVvXoK.js} +1 -1
- package/dist/web/js/fabric-label-dialog-D4NlfZS9.js +94 -0
- package/dist/web/js/fire_event-CJVsUQ4T.js +18 -0
- package/dist/web/js/main.js +101 -22
- package/dist/web/js/{matter-dashboard-app-BrbVPiqG.js → matter-dashboard-app-DMIDxj8f.js} +3118 -944
- package/dist/web/js/{node-acl-add-dialog-COL4myAw.js → node-acl-add-dialog-8qtV5Lx-.js} +1 -1
- package/dist/web/js/{node-binding-dialog-_Odw2AGk.js → node-binding-dialog-B75AcGPb.js} +1 -1
- package/dist/web/js/{node-label-dialog-D6hA1gVX.js → node-label-dialog-QxhxDvAP.js} +1 -1
- package/dist/web/js/settings-dialog-CeBkVje3.js +980 -0
- package/package.json +4 -4
- package/src/components/dialogs/commission-node-dialog/commission-node-thread.ts +64 -3
- package/src/components/dialogs/commission-node-dialog/commission-node-wifi.ts +62 -4
- package/src/components/dialogs/fabric-label-dialog/fabric-label-dialog.ts +109 -0
- package/src/components/dialogs/fabric-label-dialog/show-fabric-label-dialog.ts +16 -0
- package/src/components/dialogs/settings/settings-dialog.ts +526 -118
- package/src/pages/cluster-commands/base-cluster-commands.ts +11 -0
- package/src/pages/cluster-commands/clusters/access-control-commands.ts +21 -7
- package/src/pages/cluster-commands/clusters/avsum-commands.ts +34 -13
- package/src/pages/cluster-commands/clusters/basic-information-commands.ts +17 -12
- package/src/pages/cluster-commands/clusters/binding-commands.ts +26 -10
- package/src/pages/cluster-commands/clusters/icd-management-commands.ts +551 -0
- package/src/pages/cluster-commands/index.ts +1 -0
- package/src/pages/components/node-details.ts +46 -2
- package/src/pages/components/server-details.ts +55 -2
- package/src/pages/matter-cluster-view.ts +4 -3
- package/src/pages/matter-network-view.ts +25 -0
- package/src/pages/matter-server-view.ts +37 -1
- package/src/pages/network/border-router-store.ts +51 -4
- package/src/pages/network/network-details.ts +379 -3
- package/src/pages/network/network-types.ts +19 -193
- package/src/pages/network/network-utils.ts +125 -803
- package/src/pages/network/thread-graph.ts +241 -13
- package/src/util/duration.ts +24 -0
- package/src/util/icd.ts +197 -0
- package/dist/web/js/fire_event-BEdDUG4R.js +0 -168
- package/dist/web/js/settings-dialog-DUmZpfSq.js +0 -606
|
@@ -3,189 +3,9 @@
|
|
|
3
3
|
* Copyright 2025-2026 Open Home Foundation
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
export type NetworkType = "thread" | "wifi" | "ethernet" | "unknown";
|
|
11
|
-
/**
|
|
12
|
-
* Classification of a Thread mesh link based on LQI.
|
|
13
|
-
* "none" means LQI=0 — neighbor entry exists but no recent valid frames (dead/stale link).
|
|
14
|
-
*/
|
|
15
|
-
export type SignalLevel = "strong" | "medium" | "weak" | "none";
|
|
16
|
-
/**
|
|
17
|
-
* Thread routing role from ThreadNetworkDiagnostics cluster.
|
|
18
|
-
* Attribute 0/53/1 (RoutingRole)
|
|
19
|
-
*/
|
|
20
|
-
export declare enum ThreadRoutingRole {
|
|
21
|
-
Unspecified = 0,
|
|
22
|
-
Unassigned = 1,
|
|
23
|
-
SleepyEndDevice = 2,
|
|
24
|
-
EndDevice = 3,
|
|
25
|
-
REED = 4,// Router-Eligible End Device
|
|
26
|
-
Router = 5,
|
|
27
|
-
Leader = 6
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Thread neighbor table entry from ThreadNetworkDiagnostics cluster.
|
|
31
|
-
* Attribute 0/53/7 (NeighborTable)
|
|
32
|
-
*/
|
|
33
|
-
export interface ThreadNeighbor {
|
|
34
|
-
/** Extended address of the neighbor (64-bit) */
|
|
35
|
-
extAddress: bigint;
|
|
36
|
-
/** Age of the entry in seconds */
|
|
37
|
-
age: number;
|
|
38
|
-
/** RLOC16 (Router Locator) */
|
|
39
|
-
rloc16: number;
|
|
40
|
-
/** Link frame counter */
|
|
41
|
-
linkFrameCounter: number;
|
|
42
|
-
/** MLE frame counter */
|
|
43
|
-
mleFrameCounter: number;
|
|
44
|
-
/**
|
|
45
|
-
* Link Quality Indicator. Spec types as uint8 (0-255), but OpenThread reports
|
|
46
|
-
* 0-3 in practice. 0 = no recent valid frames (dead/stale link).
|
|
47
|
-
*/
|
|
48
|
-
lqi: number;
|
|
49
|
-
/** Average RSSI in dBm (nullable) */
|
|
50
|
-
avgRssi: number | null;
|
|
51
|
-
/** Last RSSI in dBm (nullable) */
|
|
52
|
-
lastRssi: number | null;
|
|
53
|
-
/** Frame error rate (0-255) */
|
|
54
|
-
frameErrorRate: number;
|
|
55
|
-
/** Message error rate (0-255) */
|
|
56
|
-
messageErrorRate: number;
|
|
57
|
-
/** Whether RX is on when idle */
|
|
58
|
-
rxOnWhenIdle: boolean;
|
|
59
|
-
/** Whether this is a full Thread device */
|
|
60
|
-
fullThreadDevice: boolean;
|
|
61
|
-
/** Whether this is a full network data device */
|
|
62
|
-
fullNetworkData: boolean;
|
|
63
|
-
/** Whether the link is established */
|
|
64
|
-
isChild: boolean;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Thread route table entry from ThreadNetworkDiagnostics cluster.
|
|
68
|
-
* Attribute 0/53/8 (RouteTable)
|
|
69
|
-
*/
|
|
70
|
-
export interface ThreadRoute {
|
|
71
|
-
/** Extended address of the destination */
|
|
72
|
-
extAddress: bigint;
|
|
73
|
-
/** RLOC16 of the destination */
|
|
74
|
-
rloc16: number;
|
|
75
|
-
/** Router ID */
|
|
76
|
-
routerId: number;
|
|
77
|
-
/** Next hop RLOC16 */
|
|
78
|
-
nextHop: number;
|
|
79
|
-
/** Path cost */
|
|
80
|
-
pathCost: number;
|
|
81
|
-
/** LQI in (0-3 on OpenThread; 0 = no link). */
|
|
82
|
-
lqiIn: number;
|
|
83
|
-
/** LQI out (0-3 on OpenThread; 0 = no link). */
|
|
84
|
-
lqiOut: number;
|
|
85
|
-
/** Age of the route */
|
|
86
|
-
age: number;
|
|
87
|
-
/** Whether this is allocated */
|
|
88
|
-
allocated: boolean;
|
|
89
|
-
/** Whether link is established */
|
|
90
|
-
linkEstablished: boolean;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Categorized devices by network type.
|
|
94
|
-
* Node IDs are stored as strings to avoid BigInt precision loss.
|
|
95
|
-
*/
|
|
96
|
-
export interface CategorizedDevices {
|
|
97
|
-
thread: string[];
|
|
98
|
-
wifi: string[];
|
|
99
|
-
ethernet: string[];
|
|
100
|
-
unknown: string[];
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Thread mesh connection between two nodes.
|
|
104
|
-
*/
|
|
105
|
-
export interface ThreadConnection {
|
|
106
|
-
fromNodeId: number | string;
|
|
107
|
-
toNodeId: number | string;
|
|
108
|
-
signalColor: string;
|
|
109
|
-
signalLevel: SignalLevel;
|
|
110
|
-
lqi: number;
|
|
111
|
-
rssi: number | null;
|
|
112
|
-
/** Path cost from route table (1 = direct, higher = multi-hop). Only available for routers. */
|
|
113
|
-
pathCost?: number;
|
|
114
|
-
/** Bidirectional LQI from route table (average of lqiIn and lqiOut) */
|
|
115
|
-
bidirectionalLqi?: number;
|
|
116
|
-
/** Whether this connection was supplemented by route table data (vs neighbor table only) */
|
|
117
|
-
fromRouteTable?: boolean;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* A pair of Thread nodes with their directional edge data.
|
|
121
|
-
* Each connected pair has 0-2 edges (one per neighbor/route table direction).
|
|
122
|
-
*/
|
|
123
|
-
export interface ThreadEdgePair {
|
|
124
|
-
/** Canonical pair key (sorted node IDs joined by "|") */
|
|
125
|
-
pairKey: string;
|
|
126
|
-
/** First node ID (lexicographically smaller) */
|
|
127
|
-
nodeA: string;
|
|
128
|
-
/** Second node ID (lexicographically larger) */
|
|
129
|
-
nodeB: string;
|
|
130
|
-
/** Edge where nodeA reports nodeB as neighbor */
|
|
131
|
-
edgeAB?: ThreadConnection;
|
|
132
|
-
/** Edge where nodeB reports nodeA as neighbor */
|
|
133
|
-
edgeBA?: ThreadConnection;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Unknown Thread device seen in neighbor tables but not commissioned.
|
|
137
|
-
*/
|
|
138
|
-
export interface UnknownThreadDevice {
|
|
139
|
-
kind: "unknown";
|
|
140
|
-
/** Unique ID for the unknown device (prefixed with 'unknown_') */
|
|
141
|
-
id: string;
|
|
142
|
-
/** Extended address as hex string */
|
|
143
|
-
extAddressHex: string;
|
|
144
|
-
/** Extended address as BigInt */
|
|
145
|
-
extAddress: bigint;
|
|
146
|
-
/** Node IDs that see this device as a neighbor (as strings to avoid BigInt precision loss) */
|
|
147
|
-
seenBy: string[];
|
|
148
|
-
/** Whether this device appears to be a router */
|
|
149
|
-
isRouter: boolean;
|
|
150
|
-
/** Best signal strength seen */
|
|
151
|
-
bestRssi: number | null;
|
|
152
|
-
/**
|
|
153
|
-
* Extended PAN ID (16-char uppercase hex) inherited from the commissioned node that
|
|
154
|
-
* reports this neighbor. All Thread neighbors share the observing node's network.
|
|
155
|
-
*/
|
|
156
|
-
extendedPanIdHex?: string;
|
|
157
|
-
/**
|
|
158
|
-
* Friendly Thread network name resolved by joining {@link extendedPanIdHex} against the
|
|
159
|
-
* Border Router registry. Some BR vendors (e.g. Apple, Aqara) use a stable border-agent
|
|
160
|
-
* ID as the MeshCoP `xa` while the actual Thread radio MAC differs, so the BR can show
|
|
161
|
-
* up as both a known BR and an "unknown" router on the same network.
|
|
162
|
-
*/
|
|
163
|
-
networkName?: string;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Thread Border Router enriched via mDNS.
|
|
167
|
-
*
|
|
168
|
-
* Same neighbor-table aggregate fields as UnknownThreadDevice (seenBy, isRouter, bestRssi),
|
|
169
|
-
* plus all BorderRouterEntry fields (network name, vendor, addresses, etc.).
|
|
170
|
-
*/
|
|
171
|
-
export interface KnownBorderRouter extends BorderRouterEntry {
|
|
172
|
-
kind: "br";
|
|
173
|
-
/** DOM/graph ID, formatted "br_<XAHEX>". */
|
|
174
|
-
id: string;
|
|
175
|
-
/** Convenience copy of extAddressHex as bigint, mirroring UnknownThreadDevice. */
|
|
176
|
-
extAddress: bigint;
|
|
177
|
-
/** Commissioned node IDs whose neighbor table sees this xa. */
|
|
178
|
-
seenBy: string[];
|
|
179
|
-
/** Inferred from neighbor entry. */
|
|
180
|
-
isRouter: boolean;
|
|
181
|
-
/** Best signal strength seen across observers. */
|
|
182
|
-
bestRssi: number | null;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* External Thread device discriminated union — either a recognized Border Router
|
|
186
|
-
* or an unidentified neighbor.
|
|
187
|
-
*/
|
|
188
|
-
export type ThreadExternalDevice = KnownBorderRouter | UnknownThreadDevice;
|
|
6
|
+
import type { NetworkType, ThreadRoutingRole } from "@matter-server/ws-client";
|
|
7
|
+
export type { CategorizedDevices, DiagnosticMeshNode, KnownBorderRouter, NetworkType, SignalLevel, ThreadConnection, ThreadEdgePair, ThreadExternalDevice, ThreadNeighbor, ThreadRoute, UnknownThreadDevice, WiFiDiagnostics, } from "@matter-server/ws-client";
|
|
8
|
+
export { ThreadRoutingRole } from "@matter-server/ws-client";
|
|
189
9
|
/**
|
|
190
10
|
* Network graph node data for vis.js.
|
|
191
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-types.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"network-types.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAK/E,YAAY,EACR,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,eAAe,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;IACrC,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;+DAC2D;IAC3D,MAAM,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACrE,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC"}
|
|
@@ -3,16 +3,7 @@
|
|
|
3
3
|
* Copyright 2025-2026 Open Home Foundation
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
ThreadRoutingRole2[ThreadRoutingRole2["Unspecified"] = 0] = "Unspecified";
|
|
8
|
-
ThreadRoutingRole2[ThreadRoutingRole2["Unassigned"] = 1] = "Unassigned";
|
|
9
|
-
ThreadRoutingRole2[ThreadRoutingRole2["SleepyEndDevice"] = 2] = "SleepyEndDevice";
|
|
10
|
-
ThreadRoutingRole2[ThreadRoutingRole2["EndDevice"] = 3] = "EndDevice";
|
|
11
|
-
ThreadRoutingRole2[ThreadRoutingRole2["REED"] = 4] = "REED";
|
|
12
|
-
ThreadRoutingRole2[ThreadRoutingRole2["Router"] = 5] = "Router";
|
|
13
|
-
ThreadRoutingRole2[ThreadRoutingRole2["Leader"] = 6] = "Leader";
|
|
14
|
-
return ThreadRoutingRole2;
|
|
15
|
-
})(ThreadRoutingRole || {});
|
|
6
|
+
import { ThreadRoutingRole } from "@matter-server/ws-client";
|
|
16
7
|
export {
|
|
17
8
|
ThreadRoutingRole
|
|
18
9
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/pages/network/network-types.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
5
|
-
"names": [
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA,SAAS,yBAAyB;",
|
|
5
|
+
"names": []
|
|
6
6
|
}
|
|
@@ -3,33 +3,21 @@
|
|
|
3
3
|
* Copyright 2025-2026 Open Home Foundation
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
export
|
|
12
|
-
/** BSSID as hex string */
|
|
13
|
-
bssid: string | null;
|
|
14
|
-
/** RSSI in dBm (-120 to 0) */
|
|
15
|
-
rssi: number | null;
|
|
16
|
-
/** WiFi channel */
|
|
17
|
-
channel: number | null;
|
|
18
|
-
/** Security type */
|
|
19
|
-
securityType: number | null;
|
|
20
|
-
/** WiFi version */
|
|
21
|
-
wifiVersion: number | null;
|
|
22
|
-
}
|
|
6
|
+
import type { MatterNode, SignalLevel, ThreadEdgePair } from "@matter-server/ws-client";
|
|
7
|
+
export { buildDiagnosticRloc16Map, buildExtAddrMap, buildMatterRloc16ByXp, buildRloc16Map, buildThreadEdgePairs, categorizeDevices, diagnosticNodeId, findDiagnosticMeshNodes, findRouteByExtAddress, findUnknownDevices, getEdgeSignalScore, getNeighborTableLength, getNetworkType, getRoutableDestinationsCount, getRouteBidirectionalLqi, getSignalLevel, getSignalLevelFromLqi, getThreadChannel, getThreadExtendedAddress, getThreadExtendedAddressHex, getThreadExtendedPanId, getThreadRloc16, getThreadRole, getThreadVersion, getWiFiDiagnostics, makeDiagnosticRloc16Resolver, makePairKey, mergeDiagnosticEdges, parseNeighborTable, parseRouteTable, } from "@matter-server/ws-client";
|
|
8
|
+
export type { WiFiDiagnostics } from "@matter-server/ws-client";
|
|
9
|
+
export { getDeviceName } from "../../util/node-name.js";
|
|
10
|
+
/** Map a signal level to its theme-aware color. */
|
|
11
|
+
export declare function signalLevelToColor(level: SignalLevel): string;
|
|
23
12
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
13
|
+
* Get signal color from an LQI value (0-3 in practice on OpenThread).
|
|
14
|
+
* 0 = grey (no link), 1 = red, 2 = orange, 3 = green.
|
|
26
15
|
*/
|
|
27
|
-
export declare function
|
|
16
|
+
export declare function getSignalColorFromLqi(lqi: number): string;
|
|
28
17
|
/**
|
|
29
|
-
*
|
|
30
|
-
* Uses NetworkCommissioning cluster (0x31/49) ThreadVersion attribute (0x0A/10).
|
|
18
|
+
* Gets the signal color for a given RSSI value.
|
|
31
19
|
*/
|
|
32
|
-
export declare function
|
|
20
|
+
export declare function getSignalColorFromRssi(rssi: number | null): string;
|
|
33
21
|
/**
|
|
34
22
|
* Human-readable Thread version string from the Version TLV value.
|
|
35
23
|
* Unmapped TLVs render as `Thread unknown (N)` so the raw value stays
|
|
@@ -37,102 +25,19 @@ export declare function getThreadVersion(node: MatterNode): number | undefined;
|
|
|
37
25
|
*/
|
|
38
26
|
export declare function formatThreadVersion(tlv: number): string;
|
|
39
27
|
/**
|
|
40
|
-
*
|
|
41
|
-
* Node IDs are stored as strings to avoid BigInt precision loss.
|
|
42
|
-
*/
|
|
43
|
-
export declare function categorizeDevices(nodes: Record<string, MatterNode>): CategorizedDevices;
|
|
44
|
-
/**
|
|
45
|
-
* Gets the Thread routing role for a node.
|
|
46
|
-
* Uses attribute 0/53/1 (RoutingRole, nullable per Matter spec).
|
|
47
|
-
*/
|
|
48
|
-
export declare function getThreadRole(node: MatterNode): number | undefined;
|
|
49
|
-
/**
|
|
50
|
-
* Gets the Thread channel for a node.
|
|
51
|
-
* Uses attribute 0/53/0 (Channel, nullable per Matter spec).
|
|
52
|
-
*/
|
|
53
|
-
export declare function getThreadChannel(node: MatterNode): number | undefined;
|
|
54
|
-
/**
|
|
55
|
-
* Gets the Thread extended PAN ID for a node.
|
|
56
|
-
* Uses attribute 0/53/4 (ExtendedPanId, nullable per Matter spec).
|
|
57
|
-
*
|
|
58
|
-
* The WebSocket JSON reviver only revives integers above Number.MAX_SAFE_INTEGER
|
|
59
|
-
* as bigint; smaller uint64 values arrive as plain number, so accept both.
|
|
60
|
-
*/
|
|
61
|
-
export declare function getThreadExtendedPanId(node: MatterNode): bigint | undefined;
|
|
62
|
-
/**
|
|
63
|
-
* Gets the Thread extended address (EUI-64) for a node.
|
|
64
|
-
*
|
|
65
|
-
* Uses General Diagnostics cluster (0x0033/51) NetworkInterfaces attribute (0/51/0).
|
|
66
|
-
* The NetworkInterface struct has:
|
|
67
|
-
* - Field 4: HardwareAddress (base64 encoded EUI-64)
|
|
68
|
-
* - Field 7: Type (4 = Thread)
|
|
69
|
-
*
|
|
70
|
-
* Returns as BigInt. Only upper 48 bits should be used for matching due to JSON precision loss.
|
|
71
|
-
*/
|
|
72
|
-
export declare function getThreadExtendedAddress(node: MatterNode): bigint | undefined;
|
|
73
|
-
/**
|
|
74
|
-
* Gets the Thread extended address as a hex string for display.
|
|
75
|
-
* Uses General Diagnostics NetworkInterfaces (0/51/0).
|
|
76
|
-
*/
|
|
77
|
-
export declare function getThreadExtendedAddressHex(node: MatterNode): string | undefined;
|
|
78
|
-
/**
|
|
79
|
-
* Counts entries in the Thread neighbor table without normalizing each entry.
|
|
80
|
-
* Use this in hot paths where only the cardinality matters; the full parse
|
|
81
|
-
* does a base64 decode per entry that adds up across re-renders.
|
|
82
|
-
*/
|
|
83
|
-
export declare function getNeighborTableLength(node: MatterNode): number;
|
|
84
|
-
/**
|
|
85
|
-
* Parses the Thread neighbor table from a node's attributes.
|
|
86
|
-
* Attribute 0/53/7 (NeighborTable) is an array of neighbor objects.
|
|
87
|
-
* The data uses numeric keys matching the Matter spec field IDs.
|
|
88
|
-
*/
|
|
89
|
-
export declare function parseNeighborTable(node: MatterNode): ThreadNeighbor[];
|
|
90
|
-
/**
|
|
91
|
-
* Parses the Thread route table from a node's attributes.
|
|
92
|
-
* Attribute 0/53/8 (RouteTable) is an array of route objects.
|
|
93
|
-
* The data uses numeric keys matching the Matter spec field IDs.
|
|
94
|
-
*/
|
|
95
|
-
export declare function parseRouteTable(node: MatterNode): ThreadRoute[];
|
|
96
|
-
/**
|
|
97
|
-
* Find a route table entry for a specific destination by extended address.
|
|
98
|
-
* Returns the route entry if found, undefined otherwise.
|
|
99
|
-
*/
|
|
100
|
-
export declare function findRouteByExtAddress(node: MatterNode, targetExtAddr: bigint): ThreadRoute | undefined;
|
|
101
|
-
/**
|
|
102
|
-
* Count the number of routable destinations for a node (from route table).
|
|
103
|
-
* Only counts entries where allocated=true and linkEstablished=true.
|
|
104
|
-
* This is typically only meaningful for router nodes.
|
|
105
|
-
*/
|
|
106
|
-
export declare function getRoutableDestinationsCount(node: MatterNode): number;
|
|
107
|
-
/**
|
|
108
|
-
* Calculate combined bidirectional LQI from route table entry.
|
|
109
|
-
* Returns average of lqiIn and lqiOut if both are non-zero.
|
|
110
|
-
*/
|
|
111
|
-
export declare function getRouteBidirectionalLqi(route: ThreadRoute): number | undefined;
|
|
112
|
-
/**
|
|
113
|
-
* Gets the RLOC16 (short address) for a Thread node.
|
|
114
|
-
* Uses attribute 0/53/64 (Rloc16, 0x0040).
|
|
115
|
-
*/
|
|
116
|
-
export declare function getThreadRloc16(node: MatterNode): number | undefined;
|
|
117
|
-
/**
|
|
118
|
-
* Builds a map of extended addresses (BigInt) to node IDs for Thread devices.
|
|
119
|
-
* Uses General Diagnostics NetworkInterfaces (0/51/0) for the hardware address.
|
|
120
|
-
* Node IDs are stored as strings to avoid BigInt precision loss.
|
|
28
|
+
* Gets the human-readable name for a Thread routing role.
|
|
121
29
|
*/
|
|
122
|
-
export declare function
|
|
30
|
+
export declare function getThreadRoleName(role: number | undefined): string;
|
|
123
31
|
/**
|
|
124
|
-
*
|
|
125
|
-
* Used as fallback when ExtAddress is not available.
|
|
126
|
-
* Node IDs are stored as strings to avoid BigInt precision loss.
|
|
32
|
+
* Gets WiFi security type name.
|
|
127
33
|
*/
|
|
128
|
-
export declare function
|
|
34
|
+
export declare function getWiFiSecurityTypeName(securityType: number | null): string;
|
|
129
35
|
/**
|
|
130
|
-
*
|
|
131
|
-
* any commissioned device. Classifies each against the optional Border Router registry:
|
|
132
|
-
* matched ones are emitted as kind:"br" with full mDNS enrichment; the rest stay as
|
|
133
|
-
* kind:"unknown". Uses RLOC16 as fallback when extended address matching fails.
|
|
36
|
+
* Gets WiFi version name.
|
|
134
37
|
*/
|
|
135
|
-
export declare function
|
|
38
|
+
export declare function getWiFiVersionName(version: number | null): string;
|
|
39
|
+
/** Strips trailing dot and `.local` suffix from an mDNS hostname. */
|
|
40
|
+
export declare function stripMdnsHostname(hostname: string): string;
|
|
136
41
|
/**
|
|
137
42
|
* Decoded form of the MeshCoP `_meshcop` TXT `sb` (state bitmap) field. Layout per
|
|
138
43
|
* OpenThread's `border_agent_txt_data.hpp` (`openthread/openthread`, the de-facto reference
|
|
@@ -171,46 +76,6 @@ export interface DecodedStateBitmap {
|
|
|
171
76
|
* layout. Returns undefined if the input is not a valid hex value.
|
|
172
77
|
*/
|
|
173
78
|
export declare function decodeMeshcopStateBitmap(hex: string | undefined): DecodedStateBitmap | undefined;
|
|
174
|
-
/** Determine signal level from a Thread neighbor's LQI. */
|
|
175
|
-
export declare function getSignalLevel(neighbor: ThreadNeighbor): SignalLevel;
|
|
176
|
-
/**
|
|
177
|
-
* Map an LQI value (0-3 in practice on OpenThread) to a signal level.
|
|
178
|
-
* 0 = "none" (no recent valid frames — stale/dead link).
|
|
179
|
-
*/
|
|
180
|
-
export declare function getSignalLevelFromLqi(lqi: number): SignalLevel;
|
|
181
|
-
/** Map a signal level to its theme-aware color. */
|
|
182
|
-
export declare function signalLevelToColor(level: SignalLevel): string;
|
|
183
|
-
/** Gets the signal color for a Thread neighbor based on its LQI. */
|
|
184
|
-
export declare function getSignalColor(neighbor: ThreadNeighbor): string;
|
|
185
|
-
/**
|
|
186
|
-
* Get signal color from an LQI value (0-3 in practice on OpenThread).
|
|
187
|
-
* 0 = grey (no link), 1 = red, 2 = orange, 3 = green.
|
|
188
|
-
*/
|
|
189
|
-
export declare function getSignalColorFromLqi(lqi: number): string;
|
|
190
|
-
/** Strips trailing dot and `.local` suffix from an mDNS hostname. */
|
|
191
|
-
export declare function stripMdnsHostname(hostname: string): string;
|
|
192
|
-
export { getDeviceName } from "../../util/node-name.js";
|
|
193
|
-
/**
|
|
194
|
-
* Gets the human-readable name for a Thread routing role.
|
|
195
|
-
*/
|
|
196
|
-
export declare function getThreadRoleName(role: number | undefined): string;
|
|
197
|
-
/**
|
|
198
|
-
* Parses WiFi diagnostics from a node's attributes.
|
|
199
|
-
* Cluster 0x36/54 - WiFi Network Diagnostics.
|
|
200
|
-
*/
|
|
201
|
-
export declare function getWiFiDiagnostics(node: MatterNode): WiFiDiagnostics;
|
|
202
|
-
/**
|
|
203
|
-
* Gets the signal color for a given RSSI value.
|
|
204
|
-
*/
|
|
205
|
-
export declare function getSignalColorFromRssi(rssi: number | null): string;
|
|
206
|
-
/**
|
|
207
|
-
* Gets WiFi security type name.
|
|
208
|
-
*/
|
|
209
|
-
export declare function getWiFiSecurityTypeName(securityType: number | null): string;
|
|
210
|
-
/**
|
|
211
|
-
* Gets WiFi version name.
|
|
212
|
-
*/
|
|
213
|
-
export declare function getWiFiVersionName(version: number | null): string;
|
|
214
79
|
/**
|
|
215
80
|
* Represents a connection from the perspective of a specific node.
|
|
216
81
|
* Includes both neighbors this node reports AND nodes that report this node as their neighbor.
|
|
@@ -238,23 +103,6 @@ export interface NodeConnection {
|
|
|
238
103
|
/** Bidirectional LQI from route table (average of lqiIn and lqiOut) */
|
|
239
104
|
bidirectionalLqi?: number;
|
|
240
105
|
}
|
|
241
|
-
/**
|
|
242
|
-
* Creates a canonical pair key from two node IDs.
|
|
243
|
-
* The key is always ordered so that the same pair produces the same key regardless of direction.
|
|
244
|
-
*/
|
|
245
|
-
export declare function makePairKey(a: string, b: string): string;
|
|
246
|
-
/**
|
|
247
|
-
* Computes a numeric signal score for edge comparison.
|
|
248
|
-
* Lower score = weaker signal (worst case).
|
|
249
|
-
*/
|
|
250
|
-
export declare function getEdgeSignalScore(conn: ThreadConnection): number;
|
|
251
|
-
/**
|
|
252
|
-
* Builds edge pairs for all Thread connections.
|
|
253
|
-
* Each pair represents two connected nodes with up to 2 directional edges
|
|
254
|
-
* (one from each node's neighbor/route table). No dedup is performed —
|
|
255
|
-
* callers are responsible for selecting which edge to display per pair.
|
|
256
|
-
*/
|
|
257
|
-
export declare function buildThreadEdgePairs(nodes: Record<string, MatterNode>, extAddrMap: Map<bigint, string>, rloc16Map: Map<number, string>, unknownDevices: ThreadExternalDevice[]): Map<string, ThreadEdgePair>;
|
|
258
106
|
/**
|
|
259
107
|
* Filter options for edge visibility, matching the graph's filter pipeline.
|
|
260
108
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-utils.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"network-utils.d.ts","sourceRoot":"","sources":["../../../../src/pages/network/network-utils.ts"],"names":[],"mappings":"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"}
|