@tikoci/centrs 0.1.3 → 0.1.4

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.
Files changed (90) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/GLOSSARY.txt +213 -0
  3. package/LICENSE +21 -0
  4. package/README.md +36 -8
  5. package/commands/AGENTS.md +7 -1
  6. package/commands/api/README.md +19 -18
  7. package/commands/api/examples.md +15 -0
  8. package/commands/btest/README.md +21 -32
  9. package/commands/check/README.md +6 -1
  10. package/commands/discover/README.md +5 -11
  11. package/commands/execute/README.md +41 -29
  12. package/commands/execute/examples.md +41 -3
  13. package/commands/explain/README.md +1716 -0
  14. package/commands/explain/examples.md +606 -0
  15. package/commands/retrieve/README.md +25 -27
  16. package/commands/retrieve/examples.md +16 -0
  17. package/commands/transfer/README.md +28 -20
  18. package/commands/transfer/examples.md +29 -0
  19. package/docs/CLI.md +353 -0
  20. package/docs/CONSTITUTION.md +66 -15
  21. package/docs/MATRIX.md +38 -1
  22. package/docs/errors/README.md +3 -0
  23. package/docs/errors/quickchr/machine-not-found.md +22 -0
  24. package/docs/errors/quickchr/machine-stopped.md +20 -0
  25. package/docs/errors/quickchr/package-unavailable.md +27 -0
  26. package/docs/errors/quickchr/unsupported-via.md +35 -0
  27. package/docs/errors/quickchr/unsupported.md +35 -0
  28. package/docs/errors/routeros/version-unsupported.md +26 -0
  29. package/docs/errors/transport/provider-trust.md +29 -0
  30. package/docs/errors/usage/stdin-ignored.md +28 -0
  31. package/docs/errors/validation/unknown-attribute.md +37 -4
  32. package/package.json +45 -10
  33. package/src/api-fanout.ts +29 -14
  34. package/src/api.ts +97 -54
  35. package/src/cli/api.ts +25 -6
  36. package/src/cli/btest.ts +18 -2
  37. package/src/cli/execute.ts +25 -6
  38. package/src/cli/explain.ts +503 -0
  39. package/src/cli/retrieve.ts +33 -1
  40. package/src/cli/selection.ts +71 -11
  41. package/src/cli/settings.ts +2 -2
  42. package/src/cli/transfer.ts +23 -6
  43. package/src/cli.ts +15 -2
  44. package/src/core/envelope.ts +5 -2
  45. package/src/core/error-catalog.ts +40 -0
  46. package/src/core/preflight.ts +306 -0
  47. package/src/core/routeros-string.ts +24 -0
  48. package/src/errors.ts +1 -0
  49. package/src/execute-fanout.ts +29 -14
  50. package/src/execute.ts +114 -63
  51. package/src/explain/arg-tokens.ts +114 -0
  52. package/src/explain/args.ts +1403 -0
  53. package/src/explain/blocks.ts +132 -0
  54. package/src/explain/brace-slots.ts +143 -0
  55. package/src/explain/brace-tokens.ts +38 -0
  56. package/src/explain/catalog.ts +1345 -0
  57. package/src/explain/coordinates.ts +329 -0
  58. package/src/explain/defects.ts +217 -0
  59. package/src/explain/is-known-menu.ts +17 -0
  60. package/src/explain/menus.ts +664 -0
  61. package/src/explain/operator-tokens.ts +310 -0
  62. package/src/explain/operators.ts +458 -0
  63. package/src/explain/path-tokens.ts +150 -0
  64. package/src/explain/pathresolve.ts +1324 -0
  65. package/src/explain/quoted-string.ts +241 -0
  66. package/src/explain/scope-brace.ts +308 -0
  67. package/src/explain/segment.ts +757 -0
  68. package/src/explain/string-tokens.ts +67 -0
  69. package/src/explain/symbol-values.ts +520 -0
  70. package/src/explain/symbols.ts +1597 -0
  71. package/src/explain/token-ranges.ts +72 -0
  72. package/src/explain/transport.ts +497 -0
  73. package/src/explain/value-tokens.ts +80 -0
  74. package/src/explain/values.ts +357 -0
  75. package/src/explain/verbs.ts +64 -0
  76. package/src/explain/verbsplit.ts +813 -0
  77. package/src/explain/write.ts +815 -0
  78. package/src/explain.ts +2152 -0
  79. package/src/index.ts +206 -4
  80. package/src/protocols/mac-telnet-console.ts +61 -17
  81. package/src/resolver/facts.ts +1 -1
  82. package/src/resolver/index.ts +23 -4
  83. package/src/resolver/quickchr-provider.ts +597 -0
  84. package/src/resolver/selection.ts +99 -12
  85. package/src/resolver/service-endpoint.ts +155 -0
  86. package/src/resolver/target.ts +1 -1
  87. package/src/retrieve-fanout.ts +26 -12
  88. package/src/retrieve.ts +81 -18
  89. package/src/transfer-fanout.ts +42 -25
  90. package/src/transfer.ts +87 -44
@@ -0,0 +1,664 @@
1
+ /**
2
+ * RouterOS menu (container) paths — GENERATED, do not hand-edit.
3
+ *
4
+ * Regenerate with `bun run explain:menus`; `bun run explain:menus --check` is
5
+ * the drift gate. The generator (`scripts/gen-explain-menus.ts`) carries the
6
+ * full rationale, the source pin, and why absence here is safe.
7
+ *
8
+ * Union of the `dir` and `path` nodes in four pinned restraml typed trees
9
+ * (`https://tikoci.github.io/restraml/`), all extra-packages builds:
10
+ *
11
+ * | Tree | Arch | RouterOS | Nodes | Containers |
12
+ * | ---- | ---- | -------- | ----- | ---------- |
13
+ * | `7.10.2/extra/inspect.json` | x86 | 7.10.2 | 29,086 | 458 |
14
+ * | `7.16/extra/inspect.json` | x86 | 7.16 | 34,876 | 522 |
15
+ * | `7.23.2/extra/deep-inspect.x86.json` | x86 | 7.23.2 | 40,595 | 550 |
16
+ * | `7.24rc2/extra/deep-inspect.arm64.json` | arm64 | 7.24rc2 | 42,690 | 575 |
17
+ *
18
+ * Zero node-type conflicts across those trees — no `dir`↔`cmd` flip across
19
+ * three versions or across architectures — which is what makes the union
20
+ * version-less rather than version-keyed. Generation aborts if that ever stops
21
+ * holding.
22
+ *
23
+ * **This table is a floor.** A path missing here is not confirmed as
24
+ * navigation, so `write.ts` abstains on it — the pre-#207 behaviour for an
25
+ * unrecognized menu, never a wrong answer. A COMMAND wrongly listed here would
26
+ * be a wrong answer, which is what the pin and the conflict check protect.
27
+ */
28
+
29
+ /** Every container path the pinned trees agree on, lower-cased and sorted. */
30
+ export const MENU_PATHS: ReadonlySet<string> = new Set([
31
+ "/app",
32
+ "/app/network",
33
+ "/app/settings",
34
+ "/caps-man",
35
+ "/caps-man/aaa",
36
+ "/caps-man/access-list",
37
+ "/caps-man/actual-interface-configuration",
38
+ "/caps-man/channel",
39
+ "/caps-man/configuration",
40
+ "/caps-man/datapath",
41
+ "/caps-man/interface",
42
+ "/caps-man/manager",
43
+ "/caps-man/manager/interface",
44
+ "/caps-man/provisioning",
45
+ "/caps-man/radio",
46
+ "/caps-man/rates",
47
+ "/caps-man/registration-table",
48
+ "/caps-man/remote-cap",
49
+ "/caps-man/security",
50
+ "/certificate",
51
+ "/certificate/builtin",
52
+ "/certificate/crl",
53
+ "/certificate/scep-server",
54
+ "/certificate/scep-server/otp",
55
+ "/certificate/scep-server/ra",
56
+ "/certificate/scep-server/requests",
57
+ "/certificate/settings",
58
+ "/console",
59
+ "/console/settings",
60
+ "/container",
61
+ "/container/config",
62
+ "/container/envs",
63
+ "/container/layers",
64
+ "/container/log",
65
+ "/container/mounts",
66
+ "/disk",
67
+ "/disk/btrfs",
68
+ "/disk/btrfs/filesystem",
69
+ "/disk/btrfs/subvolume",
70
+ "/disk/btrfs/transfer",
71
+ "/disk/settings",
72
+ "/disk/smb-share",
73
+ "/disk/smb-user",
74
+ "/dude",
75
+ "/dude/agent",
76
+ "/dude/device",
77
+ "/dude/device-type",
78
+ "/dude/notification",
79
+ "/dude/probe",
80
+ "/dude/ros",
81
+ "/dude/ros/address",
82
+ "/dude/ros/arp",
83
+ "/dude/ros/health",
84
+ "/dude/ros/interface",
85
+ "/dude/ros/lease",
86
+ "/dude/ros/neighbor",
87
+ "/dude/ros/queue",
88
+ "/dude/ros/registration-table",
89
+ "/dude/ros/resource",
90
+ "/dude/ros/route",
91
+ "/dude/ros/routerboard",
92
+ "/dude/service",
93
+ "/dude/settings",
94
+ "/environment",
95
+ "/file",
96
+ "/file/rsync-daemon",
97
+ "/file/sync",
98
+ "/interface",
99
+ "/interface/6to4",
100
+ "/interface/bonding",
101
+ "/interface/bridge",
102
+ "/interface/bridge/calea",
103
+ "/interface/bridge/filter",
104
+ "/interface/bridge/host",
105
+ "/interface/bridge/mdb",
106
+ "/interface/bridge/msti",
107
+ "/interface/bridge/nat",
108
+ "/interface/bridge/port",
109
+ "/interface/bridge/port-controller",
110
+ "/interface/bridge/port-controller/device",
111
+ "/interface/bridge/port-controller/port",
112
+ "/interface/bridge/port-controller/port/poe",
113
+ "/interface/bridge/port-extender",
114
+ "/interface/bridge/port/mst-override",
115
+ "/interface/bridge/settings",
116
+ "/interface/bridge/vlan",
117
+ "/interface/bridge/vlan/mvrp",
118
+ "/interface/detect-internet",
119
+ "/interface/detect-internet/state",
120
+ "/interface/dot1x",
121
+ "/interface/dot1x/client",
122
+ "/interface/dot1x/server",
123
+ "/interface/dot1x/server/active",
124
+ "/interface/dot1x/server/state",
125
+ "/interface/eoip",
126
+ "/interface/eoipv6",
127
+ "/interface/ethernet",
128
+ "/interface/ethernet/switch",
129
+ "/interface/ethernet/switch/host",
130
+ "/interface/ethernet/switch/port",
131
+ "/interface/ethernet/switch/port-isolation",
132
+ "/interface/ethernet/switch/rule",
133
+ "/interface/ethernet/switch/vlan",
134
+ "/interface/gre",
135
+ "/interface/gre6",
136
+ "/interface/ipip",
137
+ "/interface/ipipv6",
138
+ "/interface/l2tp-client",
139
+ "/interface/l2tp-ether",
140
+ "/interface/l2tp-server",
141
+ "/interface/l2tp-server/server",
142
+ "/interface/list",
143
+ "/interface/list/member",
144
+ "/interface/lte",
145
+ "/interface/lte/apn",
146
+ "/interface/lte/esim",
147
+ "/interface/lte/settings",
148
+ "/interface/macsec",
149
+ "/interface/macsec/profile",
150
+ "/interface/macvlan",
151
+ "/interface/mesh",
152
+ "/interface/mesh/fdb",
153
+ "/interface/mesh/port",
154
+ "/interface/ovpn-client",
155
+ "/interface/ovpn-server",
156
+ "/interface/ovpn-server/server",
157
+ "/interface/ppp-client",
158
+ "/interface/ppp-server",
159
+ "/interface/pppoe-client",
160
+ "/interface/pppoe-server",
161
+ "/interface/pppoe-server/server",
162
+ "/interface/pptp-client",
163
+ "/interface/pptp-server",
164
+ "/interface/pptp-server/server",
165
+ "/interface/sstp-client",
166
+ "/interface/sstp-server",
167
+ "/interface/sstp-server/server",
168
+ "/interface/veth",
169
+ "/interface/vlan",
170
+ "/interface/vpls",
171
+ "/interface/vrrp",
172
+ "/interface/vxlan",
173
+ "/interface/vxlan/fdb",
174
+ "/interface/vxlan/vteps",
175
+ "/interface/wifi",
176
+ "/interface/wifi/aaa",
177
+ "/interface/wifi/access-list",
178
+ "/interface/wifi/cap",
179
+ "/interface/wifi/capsman",
180
+ "/interface/wifi/capsman/remote-cap",
181
+ "/interface/wifi/channel",
182
+ "/interface/wifi/configuration",
183
+ "/interface/wifi/datapath",
184
+ "/interface/wifi/interworking",
185
+ "/interface/wifi/network",
186
+ "/interface/wifi/network/radio",
187
+ "/interface/wifi/provisioning",
188
+ "/interface/wifi/radio",
189
+ "/interface/wifi/radio/settings",
190
+ "/interface/wifi/registration-table",
191
+ "/interface/wifi/security",
192
+ "/interface/wifi/security/multi-passphrase",
193
+ "/interface/wifi/steering",
194
+ "/interface/wifi/steering/neighbor-group",
195
+ "/interface/wifiwave2",
196
+ "/interface/wifiwave2/aaa",
197
+ "/interface/wifiwave2/access-list",
198
+ "/interface/wifiwave2/actual-configuration",
199
+ "/interface/wifiwave2/cap",
200
+ "/interface/wifiwave2/capsman",
201
+ "/interface/wifiwave2/capsman/remote-cap",
202
+ "/interface/wifiwave2/channel",
203
+ "/interface/wifiwave2/configuration",
204
+ "/interface/wifiwave2/datapath",
205
+ "/interface/wifiwave2/interworking",
206
+ "/interface/wifiwave2/provisioning",
207
+ "/interface/wifiwave2/radio",
208
+ "/interface/wifiwave2/registration-table",
209
+ "/interface/wifiwave2/security",
210
+ "/interface/wireguard",
211
+ "/interface/wireguard/peers",
212
+ "/interface/wireless",
213
+ "/interface/wireless/access-list",
214
+ "/interface/wireless/align",
215
+ "/interface/wireless/cap",
216
+ "/interface/wireless/channels",
217
+ "/interface/wireless/connect-list",
218
+ "/interface/wireless/info",
219
+ "/interface/wireless/interworking-profiles",
220
+ "/interface/wireless/manual-tx-power-table",
221
+ "/interface/wireless/nstreme",
222
+ "/interface/wireless/nstreme-dual",
223
+ "/interface/wireless/registration-table",
224
+ "/interface/wireless/security-profiles",
225
+ "/interface/wireless/sniffer",
226
+ "/interface/wireless/sniffer/packet",
227
+ "/interface/wireless/snooper",
228
+ "/interface/wireless/wds",
229
+ "/iot",
230
+ "/iot/bluetooth",
231
+ "/iot/bluetooth/advertisers",
232
+ "/iot/bluetooth/advertisers/ad-structures",
233
+ "/iot/bluetooth/connections",
234
+ "/iot/bluetooth/connections/async-data",
235
+ "/iot/bluetooth/connections/characteristics",
236
+ "/iot/bluetooth/peripheral-devices",
237
+ "/iot/bluetooth/scanners",
238
+ "/iot/bluetooth/scanners/advertisements",
239
+ "/iot/bluetooth/whitelist",
240
+ "/iot/lora",
241
+ "/iot/lora/channels",
242
+ "/iot/lora/joineui",
243
+ "/iot/lora/netid",
244
+ "/iot/lora/radios",
245
+ "/iot/lora/servers",
246
+ "/iot/lora/traffic",
247
+ "/iot/lora/traffic/options",
248
+ "/iot/modbus",
249
+ "/iot/modbus/security-rules",
250
+ "/iot/mqtt",
251
+ "/iot/mqtt/brokers",
252
+ "/iot/mqtt/subscriptions",
253
+ "/iot/mqtt/subscriptions/recv",
254
+ "/iot/wiliot",
255
+ "/iot/wiliot/bluetooth-traffic",
256
+ "/iot/wiliot/mqtt-traffic",
257
+ "/iot/wiliot/options",
258
+ "/iot/wiliot/servers",
259
+ "/ip",
260
+ "/ip/address",
261
+ "/ip/arp",
262
+ "/ip/cloud",
263
+ "/ip/cloud/advanced",
264
+ "/ip/cloud/back-to-home-file",
265
+ "/ip/cloud/back-to-home-file/settings",
266
+ "/ip/cloud/back-to-home-user",
267
+ "/ip/dhcp-client",
268
+ "/ip/dhcp-client/option",
269
+ "/ip/dhcp-relay",
270
+ "/ip/dhcp-server",
271
+ "/ip/dhcp-server/alert",
272
+ "/ip/dhcp-server/config",
273
+ "/ip/dhcp-server/lease",
274
+ "/ip/dhcp-server/matcher",
275
+ "/ip/dhcp-server/network",
276
+ "/ip/dhcp-server/option",
277
+ "/ip/dhcp-server/option/sets",
278
+ "/ip/dns",
279
+ "/ip/dns/adlist",
280
+ "/ip/dns/cache",
281
+ "/ip/dns/cache/all",
282
+ "/ip/dns/forwarders",
283
+ "/ip/dns/static",
284
+ "/ip/firewall",
285
+ "/ip/firewall/address-list",
286
+ "/ip/firewall/calea",
287
+ "/ip/firewall/connection",
288
+ "/ip/firewall/connection/tracking",
289
+ "/ip/firewall/filter",
290
+ "/ip/firewall/layer7-protocol",
291
+ "/ip/firewall/mangle",
292
+ "/ip/firewall/nat",
293
+ "/ip/firewall/raw",
294
+ "/ip/firewall/service-port",
295
+ "/ip/hotspot",
296
+ "/ip/hotspot/active",
297
+ "/ip/hotspot/cookie",
298
+ "/ip/hotspot/host",
299
+ "/ip/hotspot/ip-binding",
300
+ "/ip/hotspot/profile",
301
+ "/ip/hotspot/service-port",
302
+ "/ip/hotspot/user",
303
+ "/ip/hotspot/user/profile",
304
+ "/ip/hotspot/walled-garden",
305
+ "/ip/hotspot/walled-garden/ip",
306
+ "/ip/ipsec",
307
+ "/ip/ipsec/active-peers",
308
+ "/ip/ipsec/identity",
309
+ "/ip/ipsec/installed-sa",
310
+ "/ip/ipsec/key",
311
+ "/ip/ipsec/key/psk",
312
+ "/ip/ipsec/key/qkd",
313
+ "/ip/ipsec/key/rsa",
314
+ "/ip/ipsec/mode-config",
315
+ "/ip/ipsec/peer",
316
+ "/ip/ipsec/policy",
317
+ "/ip/ipsec/policy/group",
318
+ "/ip/ipsec/profile",
319
+ "/ip/ipsec/proposal",
320
+ "/ip/ipsec/settings",
321
+ "/ip/ipsec/statistics",
322
+ "/ip/kid-control",
323
+ "/ip/kid-control/device",
324
+ "/ip/media",
325
+ "/ip/media/settings",
326
+ "/ip/nat-pmp",
327
+ "/ip/nat-pmp/interfaces",
328
+ "/ip/neighbor",
329
+ "/ip/neighbor/discovery-settings",
330
+ "/ip/neighbor/lldp",
331
+ "/ip/packing",
332
+ "/ip/pool",
333
+ "/ip/pool/used",
334
+ "/ip/proxy",
335
+ "/ip/proxy/access",
336
+ "/ip/proxy/cache",
337
+ "/ip/proxy/cache-contents",
338
+ "/ip/proxy/connections",
339
+ "/ip/proxy/direct",
340
+ "/ip/proxy/inserts",
341
+ "/ip/proxy/lookups",
342
+ "/ip/proxy/refreshes",
343
+ "/ip/reverse-proxy",
344
+ "/ip/route",
345
+ "/ip/service",
346
+ "/ip/service/webserver",
347
+ "/ip/settings",
348
+ "/ip/smb",
349
+ "/ip/smb/shares",
350
+ "/ip/smb/users",
351
+ "/ip/socks",
352
+ "/ip/socks/access",
353
+ "/ip/socks/connections",
354
+ "/ip/socks/users",
355
+ "/ip/socksify",
356
+ "/ip/ssh",
357
+ "/ip/tftp",
358
+ "/ip/tftp/settings",
359
+ "/ip/traffic-flow",
360
+ "/ip/traffic-flow/ipfix",
361
+ "/ip/traffic-flow/target",
362
+ "/ip/upnp",
363
+ "/ip/upnp/interfaces",
364
+ "/ip/vrf",
365
+ "/ipv6",
366
+ "/ipv6/address",
367
+ "/ipv6/dhcp-client",
368
+ "/ipv6/dhcp-client/option",
369
+ "/ipv6/dhcp-relay",
370
+ "/ipv6/dhcp-relay/option",
371
+ "/ipv6/dhcp-relay/routes",
372
+ "/ipv6/dhcp-server",
373
+ "/ipv6/dhcp-server/binding",
374
+ "/ipv6/dhcp-server/option",
375
+ "/ipv6/dhcp-server/option/sets",
376
+ "/ipv6/firewall",
377
+ "/ipv6/firewall/address-list",
378
+ "/ipv6/firewall/connection",
379
+ "/ipv6/firewall/filter",
380
+ "/ipv6/firewall/mangle",
381
+ "/ipv6/firewall/nat",
382
+ "/ipv6/firewall/raw",
383
+ "/ipv6/nd",
384
+ "/ipv6/nd/prefix",
385
+ "/ipv6/nd/prefix/default",
386
+ "/ipv6/nd/proxy",
387
+ "/ipv6/nd/settings",
388
+ "/ipv6/neighbor",
389
+ "/ipv6/pool",
390
+ "/ipv6/pool/used",
391
+ "/ipv6/route",
392
+ "/ipv6/settings",
393
+ "/log",
394
+ "/lora",
395
+ "/lora/channels",
396
+ "/lora/joineui",
397
+ "/lora/netid",
398
+ "/lora/radios",
399
+ "/lora/servers",
400
+ "/mpls",
401
+ "/mpls/forwarding-table",
402
+ "/mpls/interface",
403
+ "/mpls/ldp",
404
+ "/mpls/ldp/accept-filter",
405
+ "/mpls/ldp/advertise-filter",
406
+ "/mpls/ldp/interface",
407
+ "/mpls/ldp/local-mapping",
408
+ "/mpls/ldp/neighbor",
409
+ "/mpls/ldp/remote-mapping",
410
+ "/mpls/mangle",
411
+ "/mpls/settings",
412
+ "/mpls/traffic-eng",
413
+ "/mpls/traffic-eng/flow",
414
+ "/mpls/traffic-eng/interface",
415
+ "/mpls/traffic-eng/path",
416
+ "/mpls/traffic-eng/tunnel",
417
+ "/openflow",
418
+ "/openflow/flow",
419
+ "/openflow/group",
420
+ "/openflow/meter",
421
+ "/openflow/port",
422
+ "/port",
423
+ "/port/remote-access",
424
+ "/ppp",
425
+ "/ppp/aaa",
426
+ "/ppp/active",
427
+ "/ppp/l2tp-secret",
428
+ "/ppp/profile",
429
+ "/ppp/secret",
430
+ "/queue",
431
+ "/queue/interface",
432
+ "/queue/simple",
433
+ "/queue/tree",
434
+ "/queue/type",
435
+ "/radius",
436
+ "/radius/incoming",
437
+ "/routing",
438
+ "/routing/bfd",
439
+ "/routing/bfd/configuration",
440
+ "/routing/bfd/session",
441
+ "/routing/bgp",
442
+ "/routing/bgp/advertisements",
443
+ "/routing/bgp/connection",
444
+ "/routing/bgp/evpn",
445
+ "/routing/bgp/instance",
446
+ "/routing/bgp/session",
447
+ "/routing/bgp/template",
448
+ "/routing/bgp/vpls",
449
+ "/routing/bgp/vpn",
450
+ "/routing/fantasy",
451
+ "/routing/filter",
452
+ "/routing/filter/chain",
453
+ "/routing/filter/community-ext-list",
454
+ "/routing/filter/community-large-list",
455
+ "/routing/filter/community-list",
456
+ "/routing/filter/num-list",
457
+ "/routing/filter/rule",
458
+ "/routing/filter/select-rule",
459
+ "/routing/gmp",
460
+ "/routing/id",
461
+ "/routing/igmp-proxy",
462
+ "/routing/igmp-proxy/interface",
463
+ "/routing/igmp-proxy/mfc",
464
+ "/routing/isis",
465
+ "/routing/isis/instance",
466
+ "/routing/isis/interface",
467
+ "/routing/isis/interface-template",
468
+ "/routing/isis/lsp",
469
+ "/routing/isis/neighbor",
470
+ "/routing/nexthop",
471
+ "/routing/ospf",
472
+ "/routing/ospf/area",
473
+ "/routing/ospf/area/range",
474
+ "/routing/ospf/instance",
475
+ "/routing/ospf/interface",
476
+ "/routing/ospf/interface-template",
477
+ "/routing/ospf/lsa",
478
+ "/routing/ospf/neighbor",
479
+ "/routing/ospf/static-neighbor",
480
+ "/routing/pimsm",
481
+ "/routing/pimsm/bsr",
482
+ "/routing/pimsm/bsr/candidate",
483
+ "/routing/pimsm/bsr/rp-candidate",
484
+ "/routing/pimsm/bsr/rp-set",
485
+ "/routing/pimsm/igmp-interface-template",
486
+ "/routing/pimsm/instance",
487
+ "/routing/pimsm/interface",
488
+ "/routing/pimsm/interface-template",
489
+ "/routing/pimsm/neighbor",
490
+ "/routing/pimsm/static-rp",
491
+ "/routing/pimsm/uib-g",
492
+ "/routing/pimsm/uib-sg",
493
+ "/routing/rip",
494
+ "/routing/rip/instance",
495
+ "/routing/rip/interface",
496
+ "/routing/rip/interface-template",
497
+ "/routing/rip/keys",
498
+ "/routing/rip/neighbor",
499
+ "/routing/rip/static-neighbor",
500
+ "/routing/route",
501
+ "/routing/route/rule",
502
+ "/routing/rpki",
503
+ "/routing/rpki/session",
504
+ "/routing/rule",
505
+ "/routing/settings",
506
+ "/routing/stats",
507
+ "/routing/stats/memory",
508
+ "/routing/stats/origin",
509
+ "/routing/stats/pcap",
510
+ "/routing/stats/process",
511
+ "/routing/stats/step",
512
+ "/routing/table",
513
+ "/rsync-daemon",
514
+ "/safe-mode",
515
+ "/snmp",
516
+ "/snmp/community",
517
+ "/special-login",
518
+ "/system",
519
+ "/system/backup",
520
+ "/system/backup/cloud",
521
+ "/system/clock",
522
+ "/system/clock/manual",
523
+ "/system/console",
524
+ "/system/console/screen",
525
+ "/system/default-configuration",
526
+ "/system/default-configuration/caps-mode-script",
527
+ "/system/default-configuration/custom-script",
528
+ "/system/default-configuration/script",
529
+ "/system/device-mode",
530
+ "/system/gps",
531
+ "/system/hardware",
532
+ "/system/health",
533
+ "/system/health/settings",
534
+ "/system/history",
535
+ "/system/identity",
536
+ "/system/keymat-provider",
537
+ "/system/leds",
538
+ "/system/leds/settings",
539
+ "/system/license",
540
+ "/system/logging",
541
+ "/system/logging/action",
542
+ "/system/note",
543
+ "/system/ntp",
544
+ "/system/ntp/client",
545
+ "/system/ntp/client/servers",
546
+ "/system/ntp/key",
547
+ "/system/ntp/server",
548
+ "/system/package",
549
+ "/system/package/local-update",
550
+ "/system/package/local-update/mirror",
551
+ "/system/package/local-update/update-package-source",
552
+ "/system/package/update",
553
+ "/system/regulatory",
554
+ "/system/resource",
555
+ "/system/resource/cpu",
556
+ "/system/resource/hardware",
557
+ "/system/resource/hardware/usb-settings",
558
+ "/system/resource/irq",
559
+ "/system/resource/irq/rps",
560
+ "/system/resource/pci",
561
+ "/system/resource/usb",
562
+ "/system/resource/usb/settings",
563
+ "/system/routerboard",
564
+ "/system/routerboard/mode-button",
565
+ "/system/routerboard/reset-button",
566
+ "/system/routerboard/settings",
567
+ "/system/routerboard/usb",
568
+ "/system/routerboard/wps-button",
569
+ "/system/rtrace",
570
+ "/system/scheduler",
571
+ "/system/script",
572
+ "/system/script/environment",
573
+ "/system/script/job",
574
+ "/system/upgrade",
575
+ "/system/upgrade/mirror",
576
+ "/system/upgrade/upgrade-package-source",
577
+ "/system/ups",
578
+ "/system/watchdog",
579
+ "/task",
580
+ "/terminal",
581
+ "/tool",
582
+ "/tool/bandwidth-server",
583
+ "/tool/bandwidth-server/session",
584
+ "/tool/calea",
585
+ "/tool/e-mail",
586
+ "/tool/graphing",
587
+ "/tool/graphing/interface",
588
+ "/tool/graphing/queue",
589
+ "/tool/graphing/resource",
590
+ "/tool/mac-server",
591
+ "/tool/mac-server/mac-winbox",
592
+ "/tool/mac-server/ping",
593
+ "/tool/mac-server/sessions",
594
+ "/tool/netinstall",
595
+ "/tool/netinstall/cache",
596
+ "/tool/netinstall/devices",
597
+ "/tool/netinstall/settings",
598
+ "/tool/netwatch",
599
+ "/tool/romon",
600
+ "/tool/romon/port",
601
+ "/tool/sms",
602
+ "/tool/sms/inbox",
603
+ "/tool/sniffer",
604
+ "/tool/sniffer/connection",
605
+ "/tool/sniffer/host",
606
+ "/tool/sniffer/packet",
607
+ "/tool/sniffer/protocol",
608
+ "/tool/traffic-generator",
609
+ "/tool/traffic-generator/packet-template",
610
+ "/tool/traffic-generator/port",
611
+ "/tool/traffic-generator/raw-packet-template",
612
+ "/tool/traffic-generator/stats",
613
+ "/tool/traffic-generator/stats/latency-distribution",
614
+ "/tool/traffic-generator/stats/port",
615
+ "/tool/traffic-generator/stats/raw",
616
+ "/tool/traffic-generator/stats/stream",
617
+ "/tool/traffic-generator/stream",
618
+ "/tool/traffic-monitor",
619
+ "/tr069-client",
620
+ "/user",
621
+ "/user-manager",
622
+ "/user-manager/advanced",
623
+ "/user-manager/attribute",
624
+ "/user-manager/database",
625
+ "/user-manager/limitation",
626
+ "/user-manager/payment",
627
+ "/user-manager/profile",
628
+ "/user-manager/profile-limitation",
629
+ "/user-manager/router",
630
+ "/user-manager/session",
631
+ "/user-manager/user",
632
+ "/user-manager/user-profile",
633
+ "/user-manager/user/group",
634
+ "/user/aaa",
635
+ "/user/active",
636
+ "/user/group",
637
+ "/user/settings",
638
+ "/user/ssh-keys",
639
+ "/user/ssh-keys/private",
640
+ "/zerotier",
641
+ "/zerotier/controller",
642
+ "/zerotier/controller/member",
643
+ "/zerotier/interface",
644
+ "/zerotier/peer",
645
+ "/zerotier/peer/hint",
646
+ ]);
647
+
648
+ /**
649
+ * Is this token sequence a known RouterOS menu?
650
+ *
651
+ * Takes the path SEGMENTS rather than raw text so callers pass what they
652
+ * already parsed — `describeStatement`'s run, say — instead of re-splitting a
653
+ * statement and having to re-derive which spelling (`/ip/address` or
654
+ * `/ip address`) it used. Both spellings reduce to the same segments, which is
655
+ * the whole reason this reads segments.
656
+ *
657
+ * Empty input is not a menu: the bare `/` and `..` forms are decided by their
658
+ * own rule, and answering `true` here would let an empty run fall into a menu
659
+ * verdict by accident.
660
+ */
661
+ export function isMenuPath(segments: readonly string[]): boolean {
662
+ if (segments.length === 0) return false;
663
+ return MENU_PATHS.has(`/${segments.join("/").toLowerCase()}`);
664
+ }