@usex/mikrotik-mcp 1.0.0 → 2.1.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.
Files changed (196) hide show
  1. package/README.md +23 -8
  2. package/dist/cli.js +8571 -2330
  3. package/dist/index.d.ts +42 -2
  4. package/dist/index.js +7798 -2226
  5. package/dist/ui/dashboard.html +19 -0
  6. package/dist/ui/firewall.html +20 -0
  7. package/dist/ui/interfaces.html +20 -0
  8. package/dist/ui/observability.html +27 -0
  9. package/dist/ui/records.html +20 -0
  10. package/package.json +63 -50
  11. package/schemas/README.md +1 -1
  12. package/schemas/config.schema.json +112 -21
  13. package/schemas/tool-catalog.json +11783 -5555
  14. package/schemas/tools/add_dot1x_client.json +42 -0
  15. package/schemas/tools/add_dot1x_server.json +60 -0
  16. package/schemas/tools/add_graphing_interface.json +23 -0
  17. package/schemas/tools/add_graphing_queue.json +22 -0
  18. package/schemas/tools/add_graphing_resource.json +14 -0
  19. package/schemas/tools/add_ipv6_address.json +43 -0
  20. package/schemas/tools/add_ipv6_address_list_entry.json +32 -0
  21. package/schemas/tools/add_ipv6_default_route.json +34 -0
  22. package/schemas/tools/add_ipv6_dhcp_binding.json +42 -0
  23. package/schemas/tools/add_ipv6_dhcp_client.json +69 -0
  24. package/schemas/tools/add_ipv6_dhcp_option.json +29 -0
  25. package/schemas/tools/add_ipv6_dhcp_relay.json +35 -0
  26. package/schemas/tools/add_ipv6_nd.json +68 -0
  27. package/schemas/tools/add_ipv6_nd_prefix.json +35 -0
  28. package/schemas/tools/add_ipv6_route.json +64 -0
  29. package/schemas/tools/add_romon_port.json +34 -0
  30. package/schemas/tools/add_switch_port_isolation.json +23 -0
  31. package/schemas/tools/add_switch_rule.json +96 -0
  32. package/schemas/tools/add_traffic_generator_port.json +23 -0
  33. package/schemas/tools/add_traffic_generator_stream.json +39 -0
  34. package/schemas/tools/add_traffic_monitor.json +54 -0
  35. package/schemas/tools/create_ipv6_dhcp_server.json +60 -0
  36. package/schemas/tools/create_ipv6_filter_rule.json +103 -0
  37. package/schemas/tools/create_ipv6_mangle_rule.json +110 -0
  38. package/schemas/tools/create_ipv6_nat_rule.json +88 -0
  39. package/schemas/tools/create_ipv6_pool.json +29 -0
  40. package/schemas/tools/create_ipv6_raw_rule.json +78 -0
  41. package/schemas/tools/delete_s3_backup.json +15 -0
  42. package/schemas/tools/disable_ipv6_address_list_entry.json +15 -0
  43. package/schemas/tools/disable_ipv6_dhcp_relay.json +14 -0
  44. package/schemas/tools/disable_ipv6_filter_rule.json +14 -0
  45. package/schemas/tools/disable_ipv6_mangle_rule.json +14 -0
  46. package/schemas/tools/disable_ipv6_nat_rule.json +14 -0
  47. package/schemas/tools/disable_ipv6_raw_rule.json +14 -0
  48. package/schemas/tools/disable_ipv6_route.json +14 -0
  49. package/schemas/tools/disable_switch_rule.json +14 -0
  50. package/schemas/tools/disable_traffic_monitor.json +14 -0
  51. package/schemas/tools/download_backup_from_s3.json +25 -0
  52. package/schemas/tools/enable_ipv6_address_list_entry.json +15 -0
  53. package/schemas/tools/enable_ipv6_dhcp_relay.json +14 -0
  54. package/schemas/tools/enable_ipv6_filter_rule.json +14 -0
  55. package/schemas/tools/enable_ipv6_mangle_rule.json +14 -0
  56. package/schemas/tools/enable_ipv6_nat_rule.json +14 -0
  57. package/schemas/tools/enable_ipv6_raw_rule.json +14 -0
  58. package/schemas/tools/enable_ipv6_route.json +14 -0
  59. package/schemas/tools/enable_switch_rule.json +14 -0
  60. package/schemas/tools/enable_traffic_monitor.json +14 -0
  61. package/schemas/tools/flood_ping.json +37 -0
  62. package/schemas/tools/get_bandwidth_server.json +7 -0
  63. package/schemas/tools/get_dot1x_client.json +15 -0
  64. package/schemas/tools/get_dot1x_server.json +15 -0
  65. package/schemas/tools/get_ipv6_address.json +15 -0
  66. package/schemas/tools/get_ipv6_address_list_entry.json +15 -0
  67. package/schemas/tools/get_ipv6_dhcp_client.json +15 -0
  68. package/schemas/tools/get_ipv6_dhcp_relay.json +14 -0
  69. package/schemas/tools/get_ipv6_dhcp_server.json +14 -0
  70. package/schemas/tools/get_ipv6_filter_rule.json +15 -0
  71. package/schemas/tools/get_ipv6_mangle_rule.json +15 -0
  72. package/schemas/tools/get_ipv6_nat_rule.json +15 -0
  73. package/schemas/tools/get_ipv6_nd.json +15 -0
  74. package/schemas/tools/get_ipv6_neighbor.json +15 -0
  75. package/schemas/tools/get_ipv6_pool.json +14 -0
  76. package/schemas/tools/get_ipv6_raw_rule.json +15 -0
  77. package/schemas/tools/get_ipv6_route.json +15 -0
  78. package/schemas/tools/get_ipv6_settings.json +7 -0
  79. package/schemas/tools/get_mac_ping.json +7 -0
  80. package/schemas/tools/get_mac_server.json +7 -0
  81. package/schemas/tools/get_mac_winbox.json +7 -0
  82. package/schemas/tools/get_queue_interface.json +15 -0
  83. package/schemas/tools/get_romon.json +7 -0
  84. package/schemas/tools/get_sms_settings.json +7 -0
  85. package/schemas/tools/get_sniffer_settings.json +7 -0
  86. package/schemas/tools/get_switch.json +15 -0
  87. package/schemas/tools/get_switch_port.json +15 -0
  88. package/schemas/tools/get_switch_port_isolation.json +15 -0
  89. package/schemas/tools/get_switch_rule.json +15 -0
  90. package/schemas/tools/get_traffic_monitor.json +14 -0
  91. package/schemas/tools/ip_scan.json +26 -0
  92. package/schemas/tools/list_bandwidth_server_sessions.json +12 -0
  93. package/schemas/tools/list_dot1x_clients.json +22 -0
  94. package/schemas/tools/list_dot1x_servers.json +18 -0
  95. package/schemas/tools/list_graphing.json +20 -0
  96. package/schemas/tools/list_ipv6_address_lists.json +24 -0
  97. package/schemas/tools/list_ipv6_addresses.json +31 -0
  98. package/schemas/tools/list_ipv6_dhcp_bindings.json +21 -0
  99. package/schemas/tools/list_ipv6_dhcp_clients.json +27 -0
  100. package/schemas/tools/list_ipv6_dhcp_options.json +11 -0
  101. package/schemas/tools/list_ipv6_dhcp_relays.json +21 -0
  102. package/schemas/tools/list_ipv6_dhcp_servers.json +26 -0
  103. package/schemas/tools/list_ipv6_filter_rules.json +43 -0
  104. package/schemas/tools/list_ipv6_mangle_rules.json +37 -0
  105. package/schemas/tools/list_ipv6_nat_rules.json +37 -0
  106. package/schemas/tools/list_ipv6_nd.json +18 -0
  107. package/schemas/tools/list_ipv6_nd_prefixes.json +21 -0
  108. package/schemas/tools/list_ipv6_neighbors.json +29 -0
  109. package/schemas/tools/list_ipv6_pool_used.json +12 -0
  110. package/schemas/tools/list_ipv6_pools.json +14 -0
  111. package/schemas/tools/list_ipv6_raw_rules.json +37 -0
  112. package/schemas/tools/list_ipv6_routes.json +34 -0
  113. package/schemas/tools/list_mac_server_sessions.json +11 -0
  114. package/schemas/tools/list_queue_interfaces.json +16 -0
  115. package/schemas/tools/list_romon_ports.json +11 -0
  116. package/schemas/tools/list_s3_backups.json +22 -0
  117. package/schemas/tools/list_sms_inbox.json +12 -0
  118. package/schemas/tools/list_sniffer_connections.json +7 -0
  119. package/schemas/tools/list_sniffer_hosts.json +11 -0
  120. package/schemas/tools/list_sniffer_packets.json +15 -0
  121. package/schemas/tools/list_sniffer_protocols.json +7 -0
  122. package/schemas/tools/list_switch_port_isolation.json +12 -0
  123. package/schemas/tools/list_switch_ports.json +16 -0
  124. package/schemas/tools/list_switch_rules.json +21 -0
  125. package/schemas/tools/list_switches.json +16 -0
  126. package/schemas/tools/list_traffic_generator_ports.json +11 -0
  127. package/schemas/tools/list_traffic_generator_streams.json +14 -0
  128. package/schemas/tools/list_traffic_monitors.json +21 -0
  129. package/schemas/tools/move_ipv6_filter_rule.json +21 -0
  130. package/schemas/tools/move_ipv6_mangle_rule.json +21 -0
  131. package/schemas/tools/move_ipv6_nat_rule.json +21 -0
  132. package/schemas/tools/move_ipv6_raw_rule.json +21 -0
  133. package/schemas/tools/profile_cpu.json +22 -0
  134. package/schemas/tools/release_ipv6_dhcp_client.json +14 -0
  135. package/schemas/tools/remove_dot1x_client.json +15 -0
  136. package/schemas/tools/remove_dot1x_server.json +15 -0
  137. package/schemas/tools/remove_graphing.json +24 -0
  138. package/schemas/tools/remove_ipv6_address.json +14 -0
  139. package/schemas/tools/remove_ipv6_address_list_entry.json +15 -0
  140. package/schemas/tools/remove_ipv6_dhcp_binding.json +15 -0
  141. package/schemas/tools/remove_ipv6_dhcp_client.json +14 -0
  142. package/schemas/tools/remove_ipv6_dhcp_option.json +14 -0
  143. package/schemas/tools/remove_ipv6_dhcp_relay.json +14 -0
  144. package/schemas/tools/remove_ipv6_dhcp_server.json +14 -0
  145. package/schemas/tools/remove_ipv6_filter_rule.json +14 -0
  146. package/schemas/tools/remove_ipv6_mangle_rule.json +14 -0
  147. package/schemas/tools/remove_ipv6_nat_rule.json +14 -0
  148. package/schemas/tools/remove_ipv6_nd.json +15 -0
  149. package/schemas/tools/remove_ipv6_nd_prefix.json +15 -0
  150. package/schemas/tools/remove_ipv6_neighbor.json +15 -0
  151. package/schemas/tools/remove_ipv6_pool.json +14 -0
  152. package/schemas/tools/remove_ipv6_raw_rule.json +14 -0
  153. package/schemas/tools/remove_ipv6_route.json +15 -0
  154. package/schemas/tools/remove_romon_port.json +15 -0
  155. package/schemas/tools/remove_switch_port_isolation.json +15 -0
  156. package/schemas/tools/remove_switch_rule.json +14 -0
  157. package/schemas/tools/remove_traffic_generator_port.json +15 -0
  158. package/schemas/tools/remove_traffic_generator_stream.json +15 -0
  159. package/schemas/tools/remove_traffic_monitor.json +14 -0
  160. package/schemas/tools/renew_ipv6_dhcp_client.json +14 -0
  161. package/schemas/tools/s3_backup_info.json +15 -0
  162. package/schemas/tools/s3_backup_status.json +7 -0
  163. package/schemas/tools/save_sniffer.json +15 -0
  164. package/schemas/tools/send_sms.json +34 -0
  165. package/schemas/tools/show_firewall_filter.json +7 -0
  166. package/schemas/tools/show_interfaces.json +7 -0
  167. package/schemas/tools/show_system_dashboard.json +7 -0
  168. package/schemas/tools/speed_test.json +47 -0
  169. package/schemas/tools/start_sniffer.json +7 -0
  170. package/schemas/tools/start_traffic_generator.json +14 -0
  171. package/schemas/tools/stop_sniffer.json +7 -0
  172. package/schemas/tools/stop_traffic_generator.json +7 -0
  173. package/schemas/tools/update_bandwidth_server.json +24 -0
  174. package/schemas/tools/update_dot1x_client.json +36 -0
  175. package/schemas/tools/update_dot1x_server.json +54 -0
  176. package/schemas/tools/update_ipv6_filter_rule.json +77 -0
  177. package/schemas/tools/update_ipv6_mangle_rule.json +80 -0
  178. package/schemas/tools/update_ipv6_nat_rule.json +65 -0
  179. package/schemas/tools/update_ipv6_nd.json +64 -0
  180. package/schemas/tools/update_ipv6_pool.json +28 -0
  181. package/schemas/tools/update_ipv6_raw_rule.json +59 -0
  182. package/schemas/tools/update_ipv6_settings.json +35 -0
  183. package/schemas/tools/update_mac_ping.json +15 -0
  184. package/schemas/tools/update_mac_server.json +15 -0
  185. package/schemas/tools/update_mac_winbox.json +15 -0
  186. package/schemas/tools/update_queue_interface.json +20 -0
  187. package/schemas/tools/update_romon.json +19 -0
  188. package/schemas/tools/update_sms_settings.json +30 -0
  189. package/schemas/tools/update_sniffer_settings.json +39 -0
  190. package/schemas/tools/update_switch.json +34 -0
  191. package/schemas/tools/update_switch_port.json +39 -0
  192. package/schemas/tools/update_switch_port_isolation.json +22 -0
  193. package/schemas/tools/update_switch_rule.json +83 -0
  194. package/schemas/tools/update_traffic_monitor.json +46 -0
  195. package/schemas/tools/upload_backup_to_s3.json +25 -0
  196. package/schemas/tools/wake_on_lan.json +19 -0
@@ -0,0 +1,19 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>MikroTik Device Dashboard</title>
7
+ <script type="module">
8
+ import{a as e,i as t,n,r,t as i}from"./app-DU6NBjf_.js";var a=`show_system_dashboard`,o=document.getElementById(`app`);function s(e,t={},...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t))e===`class`?r.className=n:r.setAttribute(e,n);for(let e of n.flat())e===!1||e==null||r.append(e instanceof Node?e:document.createTextNode(String(e)));return r}function c(e){if(e==null)return`—`;let t=[`B`,`KiB`,`MiB`,`GiB`,`TiB`],n=0,r=e;for(;r>=1024&&n<t.length-1;)r/=1024,n++;return`${r.toFixed(+(r<10&&n>0))} ${t[n]}`}function l(e){return e==null?``:e>=90?`is-bad`:e>=70?`is-warn`:`is-good`}var u=`http://www.w3.org/2000/svg`;function d(e,t){let n=document.createElementNS(u,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,String(r));return n}function f(e,t,n){let r=2*Math.PI*26,i=t==null?0:Math.max(0,Math.min(100,t))/100,a=d(`svg`,{width:64,height:64,viewBox:`0 0 64 64`}),o=d(`circle`,{cx:32,cy:32,r:26,fill:`none`,"stroke-width":7});o.setAttribute(`class`,`gauge__track`);let c=d(`circle`,{cx:32,cy:32,r:26,fill:`none`,"stroke-width":7,"stroke-dasharray":r,"stroke-dashoffset":r*(1-i)});c.setAttribute(`class`,`gauge__bar ${l(t)}`);let u=d(`text`,{x:32,y:37,"text-anchor":`middle`});return u.setAttribute(`class`,`gauge__pct`),u.textContent=t==null?`—`:`${Math.round(t)}%`,a.replaceChildren(o,c,u),s(`div`,{class:`card gauge`},a,s(`div`,{class:`gauge__meta`},s(`p`,{class:`card__label`},e),s(`small`,{},n)))}function p(e,t){return s(`div`,{class:`card`},s(`p`,{class:`card__label`},e),s(`div`,{class:`card__value`},t))}function m(e,t){let n=Object.entries(t);if(n.length===0)return null;let r=s(`div`,{class:`kv__body`},...n.flatMap(([e,t])=>[s(`div`,{class:`kv__k`},e),s(`div`,{class:`kv__v`},t||`—`)]));return s(`details`,{class:`kv`},s(`summary`,{},`${e} (${n.length})`),r)}var h=null,g=!1;function _(){if(!h){o.replaceChildren(s(`div`,{class:`skeleton`},`Waiting for device data…`));return}let e=h,t=e.derived,n=e.resource.version??`?`,r=e.routerboard.model??e.resource[`board-name`]??`?`,i=[f(`CPU load`,t.cpuLoadPct,`${e.resource[`cpu-count`]??`?`} cores`),f(`Memory`,t.memUsedPct,`${c(t.memUsedBytes)} / ${c(t.memTotalBytes)}`),t.hddUsedPct!=null&&f(`Disk`,t.hddUsedPct,`${c(t.hddUsedBytes)} / ${c(t.hddTotalBytes)}`)].filter(Boolean),a=[p(`Uptime`,e.resource.uptime??`—`),t.temperatureC!=null&&p(`Temperature`,`${t.temperatureC} °C`),t.voltageV!=null&&p(`Voltage`,`${t.voltageV} V`),p(`Architecture`,e.resource[`architecture-name`]??`—`)].filter(Boolean),l=s(`button`,{class:`btn`},g?`Refreshing…`:`↻ Refresh`);g&&l.setAttribute(`disabled`,`true`),l.addEventListener(`click`,b);let u=s(`span`,{class:`pill`},`device `,s(`b`,{},e.device)),d=s(`header`,{class:`hd`},s(`span`,{class:`hd__dot`}),s(`div`,{},s(`h1`,{class:`hd__title`},e.identity),s(`p`,{class:`hd__sub`},`${r} · RouterOS ${n}`)),s(`span`,{class:`hd__spacer`}),u),_=s(`footer`,{class:`foot`},l,s(`span`,{},`updated ${new Date(e.generatedAt).toLocaleTimeString()}`)),v=[d,s(`section`,{class:`grid`},...i),s(`section`,{class:`grid`},...a),m(`System resource`,e.resource),m(`RouterBOARD`,e.routerboard),_].filter(e=>e!=null);o.replaceChildren(...v)}var v=new t({name:`mikrotik-dashboard`,version:`1.0.0`});function y(e){e&&typeof e==`object`&&`device`in e&&(h=e,_())}async function b(){if(!g){g=!0,_();try{y((await v.callServerTool({name:a,arguments:{}})).structuredContent)}catch(e){console.error(`[dashboard] refresh failed`,e)}finally{g=!1,_()}}}v.ontoolresult=e=>y(e.structuredContent),v.ontoolinput=()=>{h||_()},v.onhostcontextchanged=t=>{if(t.theme&&e(t.theme),t.styles?.variables&&r(t.styles.variables),t.styles?.css?.fonts&&n(t.styles.css.fonts),t.safeAreaInsets){let{top:e,right:n,bottom:r,left:i}=t.safeAreaInsets;document.body.style.padding=`${e+16}px ${n+16}px ${r+16}px ${i+16}px`}},v.onteardown=async()=>({}),e(i()),_(),v.connect().catch(e=>console.error(`[dashboard] connect failed`,e));
9
+ </script>
10
+ <link rel="modulepreload" crossorigin href="../assets/app-DU6NBjf_.js">
11
+ <style>
12
+ @media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}.card__value small{color:var(--mt-text-dim);font-size:12px;font-weight:400}.gauge{align-items:center;gap:14px;display:flex}.gauge svg{flex:none}.gauge__track{stroke:var(--mt-surface-2)}.gauge__bar{stroke:var(--mt-accent);stroke-linecap:round;transform-origin:50%;transition:stroke-dashoffset .6s cubic-bezier(.2,.8,.2,1);transform:rotate(-90deg)}.gauge__pct{font-family:var(--mt-mono);fill:var(--mt-text);font-size:16px;font-weight:650}.gauge__meta{min-width:0}.gauge__meta .card__label{margin-bottom:4px}.gauge__meta small{color:var(--mt-text-faint);font-family:var(--mt-mono);font-size:11px}.is-good{stroke:var(--mt-good)}.is-warn{stroke:var(--mt-warn)}.is-bad{stroke:var(--mt-bad)}details.kv{background:var(--mt-surface);border:1px solid var(--mt-border);border-radius:var(--mt-radius);overflow:hidden}details.kv>summary{cursor:pointer;color:var(--mt-text-dim);-webkit-user-select:none;user-select:none;padding:12px 14px;font-weight:600;list-style:none}details.kv>summary::-webkit-details-marker{display:none}details.kv>summary:after{content:"▸";float:right;color:var(--mt-text-faint);transition:transform .2s}details.kv[open]>summary:after{transform:rotate(90deg)}.kv__body{border-top:1px solid var(--mt-border);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;padding:7px 14px;font-size:12px}.kv__k{color:var(--mt-text-dim);font-family:var(--mt-mono)}.kv__v{font-family:var(--mt-mono);color:var(--mt-text)}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);align-items:center;gap:10px;display:flex}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;padding:5px 11px;font-size:12px;transition:border-color .15s,background .15s}.skeleton{color:var(--mt-text-faint);text-align:center;padding:40px 0}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.act{font-family:var(--mt-mono);border:1px solid var(--mt-border);color:var(--mt-text-dim);border-radius:999px;padding:1px 8px;font-size:11px;display:inline-block}.act.is-accept{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.act.is-drop{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.act.is-jump{color:var(--mt-accent);border-color:color-mix(in srgb, var(--mt-accent) 45%, var(--mt-border))}.matchers{color:var(--mt-text-dim);max-width:340px;white-space:normal!important}.matchers b{color:var(--mt-text);font-weight:500}td.num{text-align:right;color:var(--mt-text-dim)}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.if-grid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;display:grid}.if-card{gap:8px;display:grid}.if-card__top{align-items:center;gap:8px;display:flex}.if-card__name{font-family:var(--mt-mono);overflow-wrap:anywhere;font-size:14px;font-weight:650}.if-card.is-disabled{opacity:.6}.dot{background:var(--mt-text-faint);border-radius:50%;flex:none;width:9px;height:9px}.dot.is-up{background:var(--mt-good);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent)}.dot.is-down{background:var(--mt-bad);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-bad) 18%, transparent)}.if-card__meta{font-family:var(--mt-mono);color:var(--mt-text-dim);grid-template-columns:auto 1fr;gap:2px 10px;font-size:11px;display:grid}.if-card__meta b{color:var(--mt-text);overflow-wrap:anywhere;font-weight:500}.if-card__meta .contents{display:contents}.badge{border:1px solid var(--mt-border);background:var(--mt-surface-2);color:var(--mt-text-dim);font-family:var(--mt-mono);text-transform:uppercase;letter-spacing:.04em;border-radius:999px;margin-left:auto;padding:1px 7px;font-size:10px}:root{--mt-bg:var(--color-background-primary,#0b0d10);--mt-surface:var(--color-background-secondary,#14171c);--mt-surface-2:var(--color-background-tertiary,#1b1f26);--mt-border:var(--color-border-primary,#262b33);--mt-text:var(--color-text-primary,#e8eaed);--mt-text-dim:var(--color-text-secondary,#9aa3af);--mt-text-faint:var(--color-text-tertiary,#6b7280);--mt-accent:var(--color-accent-primary,#6ea8fe);--mt-good:#34d399;--mt-warn:#fbbf24;--mt-bad:#f87171;--mt-radius:var(--border-radius-md,14px);--mt-radius-sm:var(--border-radius-sm,9px);--mt-mono:var(--font-mono,ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace);--mt-sans:var(--font-sans,system-ui, -apple-system, "Segoe UI", sans-serif);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}body{background:var(--mt-bg);color:var(--mt-text);font-family:var(--mt-sans);-webkit-font-smoothing:antialiased;margin:0;padding:16px;font-size:13px;line-height:1.5}.app{gap:14px;max-width:960px;margin:0 auto;display:grid}.hd{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.hd__dot{background:var(--mt-good);width:9px;height:9px;box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent);border-radius:50%}.hd__title{letter-spacing:-.01em;margin:0;font-size:17px;font-weight:650}.hd__sub{color:var(--mt-text-dim);font-family:var(--mt-mono);margin:0;font-size:12px}.hd__spacer{flex:1}.pill{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;display:inline-flex}.pill b{color:var(--mt-text);font-weight:600}.grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.card{background:linear-gradient(180deg, var(--mt-surface), var(--mt-surface-2));border:1px solid var(--mt-border);border-radius:var(--mt-radius);padding:14px}.card__label{color:var(--mt-text-dim);text-transform:uppercase;letter-spacing:.06em;margin:0 0 8px;font-size:11px}.card__value{font-family:var(--mt-mono);letter-spacing:-.01em;font-size:20px;font-weight:600}.toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.toolbar .grow{flex:1;min-width:140px}.search{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);width:100%;color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);padding:7px 11px;font-size:13px}.search:focus{border-color:var(--mt-accent);outline:none}.search::placeholder{color:var(--mt-text-faint)}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;white-space:nowrap;padding:6px 11px;font-size:12px;transition:border-color .15s,background .15s}.btn:hover{border-color:var(--mt-accent);background:var(--mt-surface-2)}.btn:disabled{opacity:.5;cursor:default}.btn.is-active{border-color:var(--mt-accent);color:var(--mt-accent)}.chip{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:4px;padding:1px 7px;font-size:11px;display:inline-flex}.chip.is-good{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.chip.is-warn{color:var(--mt-warn);border-color:color-mix(in srgb, var(--mt-warn) 45%, var(--mt-border))}.chip.is-bad{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.tablewrap{border:1px solid var(--mt-border);border-radius:var(--mt-radius);max-height:70vh;overflow:auto}table.tbl{border-collapse:collapse;width:100%;font-size:12px}table.tbl th,table.tbl td{text-align:left;border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);white-space:nowrap;font-family:var(--mt-mono);padding:7px 12px}table.tbl thead th{z-index:1;background:var(--mt-surface-2);color:var(--mt-text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;position:sticky;top:0}table.tbl thead th:hover{color:var(--mt-text)}table.tbl thead th .arrow{color:var(--mt-accent);margin-left:4px}table.tbl tbody tr{cursor:pointer}table.tbl tbody tr:hover{background:color-mix(in srgb, var(--mt-accent) 8%, transparent)}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.kv__body{border:1px solid var(--mt-border);border-radius:var(--mt-radius);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid;overflow:hidden}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;font-size:12px;font-family:var(--mt-mono);padding:7px 14px}.kv__k{color:var(--mt-text-dim);background:color-mix(in srgb, var(--mt-surface) 60%, transparent)}.kv__v{color:var(--mt-text)}.drawer{border:1px solid var(--mt-accent);border-radius:var(--mt-radius);background:var(--mt-surface);gap:10px;padding:12px;display:grid}.drawer__hd{align-items:center;gap:8px;display:flex}.drawer__hd b{font-family:var(--mt-mono)}pre.raw{border:1px solid var(--mt-border);border-radius:var(--mt-radius);background:var(--mt-surface);color:var(--mt-text);font-family:var(--mt-mono);white-space:pre;max-height:70vh;margin:0;padding:14px;font-size:12px;overflow:auto}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);flex-wrap:wrap;align-items:center;gap:10px;display:flex}.foot .grow{flex:1}.skeleton,.empty{color:var(--mt-text-faint);text-align:center;padding:40px 0}.count-pill b{color:var(--mt-accent)}table.tbl td.col-num,table.tbl th.col-num{width:1%}
13
+ /*$vite$:1*/
14
+ </style>
15
+ </head>
16
+ <body>
17
+ <div id="app"></div>
18
+ </body>
19
+ </html>
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>MikroTik Firewall Rules</title>
7
+ <script type="module">
8
+ import{i as e}from"./app-DU6NBjf_.js";import{a as t,i as n,o as r,r as i,t as a}from"./kit-DAVkZl3Q.js";var o=`show_firewall_filter`,s=document.getElementById(`app`),c=null,l=``,u=!1,d=[`protocol`,`src-address`,`dst-address`,`src-port`,`dst-port`,`in-interface`,`out-interface`,`in-interface-list`,`out-interface-list`,`connection-state`,`src-address-list`,`dst-address-list`];function f(e){return e===`accept`?`act is-accept`:e===`drop`||e===`reject`?`act is-drop`:e===`jump`||e===`return`?`act is-jump`:`act`}function p(e){let t=Number(e);if(!e||Number.isNaN(t))return e??`—`;if(t<1e3)return String(t);let n=[`k`,`M`,`G`,`T`],r=-1,i=t;for(;i>=1e3&&r<n.length-1;)i/=1e3,r++;return`${i.toFixed(1)}${n[r]}`}function m(e){let t=[];for(let r of d)e[r]&&t.push(n(`span`,{},`${r}=`,n(`b`,{},e[r])));let r=n(`td`,{class:`matchers`});return t.forEach((e,t)=>{t&&r.append(document.createTextNode(` `)),r.append(e)}),t.length||r.append(document.createTextNode(e.comment??`—`)),r}function h(e){let t=l.trim().toLowerCase();return t?e.rows.filter(e=>Object.values(e).some(e=>e.toLowerCase().includes(t))):e.rows}function g(e){let t=(e.flags??``).includes(`X`),r=e.action??`—`,i=n(`tr`,t?{class:`is-disabled`}:{});return i.append(n(`td`,{class:`col-num`},e[`#`]??`—`),n(`td`,{},e.chain??`—`),n(`td`,{},n(`span`,{class:f(r)},r)),m(e),n(`td`,{class:`num`},p(e.packets)),n(`td`,{class:`num`},p(e.bytes))),i}function _(){if(!c){s.replaceChildren(n(`div`,{class:`skeleton`},`Waiting for firewall rules…`));return}let e=c,r=h(e),o=e.rows.filter(e=>(e.flags??``).includes(`X`)).length,f=n(`input`,{class:`search`,type:`search`,placeholder:`Search ${e.rows.length} rule(s)…`,value:l});f.addEventListener(`input`,()=>{l=f.value,_()});let p=n(`header`,{class:`hd`},n(`span`,{class:`hd__dot`}),n(`div`,{},n(`h1`,{class:`hd__title`},`Firewall — Filter`),n(`p`,{class:`hd__sub`},`${e.rows.length} rules · ${o} disabled`)),n(`span`,{class:`hd__spacer`}),n(`span`,{class:`pill`},`device `,n(`b`,{},e.device))),m=n(`div`,{class:`toolbar`},n(`div`,{class:`grow`},f),a(u?`Refreshing…`:`↻ Refresh`,b,{disabled:u}),a(`CSV`,()=>{let n=[`#`,`chain`,`action`,...d,`packets`,`bytes`];i(`firewall-${e.chain}.csv`,t(n,h(e)),`text/csv`)},{title:`Export visible rules as CSV`})),v;v=e.rows.length?r.length?n(`div`,{class:`tablewrap`},n(`table`,{class:`tbl`},n(`thead`,{},n(`tr`,{},n(`th`,{class:`col-num`},`#`),n(`th`,{},`chain`),n(`th`,{},`action`),n(`th`,{},`matchers`),n(`th`,{class:`num`},`packets`),n(`th`,{class:`num`},`bytes`))),n(`tbody`,{},...r.map(g)))):n(`div`,{class:`empty`},`No rules match the search.`):n(`div`,{class:`empty`},`No filter rules configured.`);let y=n(`footer`,{class:`foot`},n(`span`,{class:`grow`}),n(`span`,{},`updated ${new Date(e.generatedAt).toLocaleTimeString()}`));s.replaceChildren(p,m,v,y)}var v=new e({name:`mikrotik-firewall`,version:`1.0.0`});function y(e){e&&typeof e==`object`&&e.__mikrotikView===`firewall`&&(c=e,_())}async function b(){if(!u){u=!0,_();try{y((await v.callServerTool({name:o,arguments:{}})).structuredContent)}catch(e){console.error(`[firewall] refresh failed`,e)}finally{u=!1,_()}}}v.ontoolresult=e=>y(e.structuredContent),v.ontoolinput=()=>{c||_()},r(v),v.onteardown=async()=>({}),_(),v.connect().catch(e=>console.error(`[firewall] connect failed`,e));
9
+ </script>
10
+ <link rel="modulepreload" crossorigin href="../assets/app-DU6NBjf_.js">
11
+ <link rel="modulepreload" crossorigin href="../assets/kit-DAVkZl3Q.js">
12
+ <style>
13
+ @media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}.card__value small{color:var(--mt-text-dim);font-size:12px;font-weight:400}.gauge{align-items:center;gap:14px;display:flex}.gauge svg{flex:none}.gauge__track{stroke:var(--mt-surface-2)}.gauge__bar{stroke:var(--mt-accent);stroke-linecap:round;transform-origin:50%;transition:stroke-dashoffset .6s cubic-bezier(.2,.8,.2,1);transform:rotate(-90deg)}.gauge__pct{font-family:var(--mt-mono);fill:var(--mt-text);font-size:16px;font-weight:650}.gauge__meta{min-width:0}.gauge__meta .card__label{margin-bottom:4px}.gauge__meta small{color:var(--mt-text-faint);font-family:var(--mt-mono);font-size:11px}.is-good{stroke:var(--mt-good)}.is-warn{stroke:var(--mt-warn)}.is-bad{stroke:var(--mt-bad)}details.kv{background:var(--mt-surface);border:1px solid var(--mt-border);border-radius:var(--mt-radius);overflow:hidden}details.kv>summary{cursor:pointer;color:var(--mt-text-dim);-webkit-user-select:none;user-select:none;padding:12px 14px;font-weight:600;list-style:none}details.kv>summary::-webkit-details-marker{display:none}details.kv>summary:after{content:"▸";float:right;color:var(--mt-text-faint);transition:transform .2s}details.kv[open]>summary:after{transform:rotate(90deg)}.kv__body{border-top:1px solid var(--mt-border);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;padding:7px 14px;font-size:12px}.kv__k{color:var(--mt-text-dim);font-family:var(--mt-mono)}.kv__v{font-family:var(--mt-mono);color:var(--mt-text)}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);align-items:center;gap:10px;display:flex}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;padding:5px 11px;font-size:12px;transition:border-color .15s,background .15s}.skeleton{color:var(--mt-text-faint);text-align:center;padding:40px 0}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.act{font-family:var(--mt-mono);border:1px solid var(--mt-border);color:var(--mt-text-dim);border-radius:999px;padding:1px 8px;font-size:11px;display:inline-block}.act.is-accept{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.act.is-drop{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.act.is-jump{color:var(--mt-accent);border-color:color-mix(in srgb, var(--mt-accent) 45%, var(--mt-border))}.matchers{color:var(--mt-text-dim);max-width:340px;white-space:normal!important}.matchers b{color:var(--mt-text);font-weight:500}td.num{text-align:right;color:var(--mt-text-dim)}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.if-grid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;display:grid}.if-card{gap:8px;display:grid}.if-card__top{align-items:center;gap:8px;display:flex}.if-card__name{font-family:var(--mt-mono);overflow-wrap:anywhere;font-size:14px;font-weight:650}.if-card.is-disabled{opacity:.6}.dot{background:var(--mt-text-faint);border-radius:50%;flex:none;width:9px;height:9px}.dot.is-up{background:var(--mt-good);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent)}.dot.is-down{background:var(--mt-bad);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-bad) 18%, transparent)}.if-card__meta{font-family:var(--mt-mono);color:var(--mt-text-dim);grid-template-columns:auto 1fr;gap:2px 10px;font-size:11px;display:grid}.if-card__meta b{color:var(--mt-text);overflow-wrap:anywhere;font-weight:500}.if-card__meta .contents{display:contents}.badge{border:1px solid var(--mt-border);background:var(--mt-surface-2);color:var(--mt-text-dim);font-family:var(--mt-mono);text-transform:uppercase;letter-spacing:.04em;border-radius:999px;margin-left:auto;padding:1px 7px;font-size:10px}:root{--mt-bg:var(--color-background-primary,#0b0d10);--mt-surface:var(--color-background-secondary,#14171c);--mt-surface-2:var(--color-background-tertiary,#1b1f26);--mt-border:var(--color-border-primary,#262b33);--mt-text:var(--color-text-primary,#e8eaed);--mt-text-dim:var(--color-text-secondary,#9aa3af);--mt-text-faint:var(--color-text-tertiary,#6b7280);--mt-accent:var(--color-accent-primary,#6ea8fe);--mt-good:#34d399;--mt-warn:#fbbf24;--mt-bad:#f87171;--mt-radius:var(--border-radius-md,14px);--mt-radius-sm:var(--border-radius-sm,9px);--mt-mono:var(--font-mono,ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace);--mt-sans:var(--font-sans,system-ui, -apple-system, "Segoe UI", sans-serif);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}body{background:var(--mt-bg);color:var(--mt-text);font-family:var(--mt-sans);-webkit-font-smoothing:antialiased;margin:0;padding:16px;font-size:13px;line-height:1.5}.app{gap:14px;max-width:960px;margin:0 auto;display:grid}.hd{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.hd__dot{background:var(--mt-good);width:9px;height:9px;box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent);border-radius:50%}.hd__title{letter-spacing:-.01em;margin:0;font-size:17px;font-weight:650}.hd__sub{color:var(--mt-text-dim);font-family:var(--mt-mono);margin:0;font-size:12px}.hd__spacer{flex:1}.pill{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;display:inline-flex}.pill b{color:var(--mt-text);font-weight:600}.grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.card{background:linear-gradient(180deg, var(--mt-surface), var(--mt-surface-2));border:1px solid var(--mt-border);border-radius:var(--mt-radius);padding:14px}.card__label{color:var(--mt-text-dim);text-transform:uppercase;letter-spacing:.06em;margin:0 0 8px;font-size:11px}.card__value{font-family:var(--mt-mono);letter-spacing:-.01em;font-size:20px;font-weight:600}.toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.toolbar .grow{flex:1;min-width:140px}.search{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);width:100%;color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);padding:7px 11px;font-size:13px}.search:focus{border-color:var(--mt-accent);outline:none}.search::placeholder{color:var(--mt-text-faint)}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;white-space:nowrap;padding:6px 11px;font-size:12px;transition:border-color .15s,background .15s}.btn:hover{border-color:var(--mt-accent);background:var(--mt-surface-2)}.btn:disabled{opacity:.5;cursor:default}.btn.is-active{border-color:var(--mt-accent);color:var(--mt-accent)}.chip{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:4px;padding:1px 7px;font-size:11px;display:inline-flex}.chip.is-good{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.chip.is-warn{color:var(--mt-warn);border-color:color-mix(in srgb, var(--mt-warn) 45%, var(--mt-border))}.chip.is-bad{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.tablewrap{border:1px solid var(--mt-border);border-radius:var(--mt-radius);max-height:70vh;overflow:auto}table.tbl{border-collapse:collapse;width:100%;font-size:12px}table.tbl th,table.tbl td{text-align:left;border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);white-space:nowrap;font-family:var(--mt-mono);padding:7px 12px}table.tbl thead th{z-index:1;background:var(--mt-surface-2);color:var(--mt-text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;position:sticky;top:0}table.tbl thead th:hover{color:var(--mt-text)}table.tbl thead th .arrow{color:var(--mt-accent);margin-left:4px}table.tbl tbody tr{cursor:pointer}table.tbl tbody tr:hover{background:color-mix(in srgb, var(--mt-accent) 8%, transparent)}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.kv__body{border:1px solid var(--mt-border);border-radius:var(--mt-radius);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid;overflow:hidden}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;font-size:12px;font-family:var(--mt-mono);padding:7px 14px}.kv__k{color:var(--mt-text-dim);background:color-mix(in srgb, var(--mt-surface) 60%, transparent)}.kv__v{color:var(--mt-text)}.drawer{border:1px solid var(--mt-accent);border-radius:var(--mt-radius);background:var(--mt-surface);gap:10px;padding:12px;display:grid}.drawer__hd{align-items:center;gap:8px;display:flex}.drawer__hd b{font-family:var(--mt-mono)}pre.raw{border:1px solid var(--mt-border);border-radius:var(--mt-radius);background:var(--mt-surface);color:var(--mt-text);font-family:var(--mt-mono);white-space:pre;max-height:70vh;margin:0;padding:14px;font-size:12px;overflow:auto}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);flex-wrap:wrap;align-items:center;gap:10px;display:flex}.foot .grow{flex:1}.skeleton,.empty{color:var(--mt-text-faint);text-align:center;padding:40px 0}.count-pill b{color:var(--mt-accent)}table.tbl td.col-num,table.tbl th.col-num{width:1%}
14
+ /*$vite$:1*/
15
+ </style>
16
+ </head>
17
+ <body>
18
+ <div id="app"></div>
19
+ </body>
20
+ </html>
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>MikroTik Interfaces</title>
7
+ <script type="module">
8
+ import{i as e}from"./app-DU6NBjf_.js";import{i as t,o as n,t as r}from"./kit-DAVkZl3Q.js";var i=`show_interfaces`,a=document.getElementById(`app`),o=null,s=``,c=!1;function l(e){return(e.flags??``).includes(`R`)||e.running===`true`}function u(e){return(e.flags??``).includes(`X`)||e.disabled===`true`}function d(e,n){return!!n&&t(`div`,{class:`contents`},t(`span`,{},e),t(`b`,{},n))}function f(e){let n=u(e),r=n?`dot is-down`:l(e)?`dot is-up`:`dot`,i=t(`div`,{class:`if-card__meta`},d(`MTU`,e.mtu??e[`actual-mtu`]),d(`MAC`,e[`mac-address`]),d(`comment`,e.comment));return t(`div`,{class:`card if-card${n?` is-disabled`:``}`},t(`div`,{class:`if-card__top`},t(`span`,{class:r}),t(`span`,{class:`if-card__name`},e.name??`?`),t(`span`,{class:`badge`},e.type??`—`)),i)}function p(e){let t=s.trim().toLowerCase();return t?e.rows.filter(e=>Object.values(e).some(e=>e.toLowerCase().includes(t))):e.rows}function m(){if(!o){a.replaceChildren(t(`div`,{class:`skeleton`},`Waiting for interfaces…`));return}let e=o,n=p(e),i=e.rows.filter(l).length,d=e.rows.filter(u).length,h=t(`input`,{class:`search`,type:`search`,placeholder:`Search ${e.rows.length} interface(s)…`,value:s});h.addEventListener(`input`,()=>{s=h.value,m()});let g=t(`header`,{class:`hd`},t(`span`,{class:`hd__dot`}),t(`div`,{},t(`h1`,{class:`hd__title`},`Interfaces`),t(`p`,{class:`hd__sub`},`${i} running · ${d} disabled · ${e.rows.length} total`)),t(`span`,{class:`hd__spacer`}),t(`span`,{class:`pill`},`device `,t(`b`,{},e.device))),v=t(`div`,{class:`toolbar`},t(`div`,{class:`grow`},h),r(c?`Refreshing…`:`↻ Refresh`,_,{disabled:c})),y=n.length?t(`section`,{class:`if-grid`},...n.map(f)):t(`div`,{class:`empty`},`No interfaces match the search.`),b=t(`footer`,{class:`foot`},t(`span`,{class:`grow`}),t(`span`,{},`updated ${new Date(e.generatedAt).toLocaleTimeString()}`));a.replaceChildren(g,v,y,b)}var h=new e({name:`mikrotik-interfaces`,version:`1.0.0`});function g(e){e&&typeof e==`object`&&e.__mikrotikView===`interfaces`&&(o=e,m())}async function _(){if(!c){c=!0,m();try{g((await h.callServerTool({name:i,arguments:{}})).structuredContent)}catch(e){console.error(`[interfaces] refresh failed`,e)}finally{c=!1,m()}}}h.ontoolresult=e=>g(e.structuredContent),h.ontoolinput=()=>{o||m()},n(h),h.onteardown=async()=>({}),m(),h.connect().catch(e=>console.error(`[interfaces] connect failed`,e));
9
+ </script>
10
+ <link rel="modulepreload" crossorigin href="../assets/app-DU6NBjf_.js">
11
+ <link rel="modulepreload" crossorigin href="../assets/kit-DAVkZl3Q.js">
12
+ <style>
13
+ @media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}.card__value small{color:var(--mt-text-dim);font-size:12px;font-weight:400}.gauge{align-items:center;gap:14px;display:flex}.gauge svg{flex:none}.gauge__track{stroke:var(--mt-surface-2)}.gauge__bar{stroke:var(--mt-accent);stroke-linecap:round;transform-origin:50%;transition:stroke-dashoffset .6s cubic-bezier(.2,.8,.2,1);transform:rotate(-90deg)}.gauge__pct{font-family:var(--mt-mono);fill:var(--mt-text);font-size:16px;font-weight:650}.gauge__meta{min-width:0}.gauge__meta .card__label{margin-bottom:4px}.gauge__meta small{color:var(--mt-text-faint);font-family:var(--mt-mono);font-size:11px}.is-good{stroke:var(--mt-good)}.is-warn{stroke:var(--mt-warn)}.is-bad{stroke:var(--mt-bad)}details.kv{background:var(--mt-surface);border:1px solid var(--mt-border);border-radius:var(--mt-radius);overflow:hidden}details.kv>summary{cursor:pointer;color:var(--mt-text-dim);-webkit-user-select:none;user-select:none;padding:12px 14px;font-weight:600;list-style:none}details.kv>summary::-webkit-details-marker{display:none}details.kv>summary:after{content:"▸";float:right;color:var(--mt-text-faint);transition:transform .2s}details.kv[open]>summary:after{transform:rotate(90deg)}.kv__body{border-top:1px solid var(--mt-border);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;padding:7px 14px;font-size:12px}.kv__k{color:var(--mt-text-dim);font-family:var(--mt-mono)}.kv__v{font-family:var(--mt-mono);color:var(--mt-text)}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);align-items:center;gap:10px;display:flex}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;padding:5px 11px;font-size:12px;transition:border-color .15s,background .15s}.skeleton{color:var(--mt-text-faint);text-align:center;padding:40px 0}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.act{font-family:var(--mt-mono);border:1px solid var(--mt-border);color:var(--mt-text-dim);border-radius:999px;padding:1px 8px;font-size:11px;display:inline-block}.act.is-accept{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.act.is-drop{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.act.is-jump{color:var(--mt-accent);border-color:color-mix(in srgb, var(--mt-accent) 45%, var(--mt-border))}.matchers{color:var(--mt-text-dim);max-width:340px;white-space:normal!important}.matchers b{color:var(--mt-text);font-weight:500}td.num{text-align:right;color:var(--mt-text-dim)}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.if-grid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;display:grid}.if-card{gap:8px;display:grid}.if-card__top{align-items:center;gap:8px;display:flex}.if-card__name{font-family:var(--mt-mono);overflow-wrap:anywhere;font-size:14px;font-weight:650}.if-card.is-disabled{opacity:.6}.dot{background:var(--mt-text-faint);border-radius:50%;flex:none;width:9px;height:9px}.dot.is-up{background:var(--mt-good);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent)}.dot.is-down{background:var(--mt-bad);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-bad) 18%, transparent)}.if-card__meta{font-family:var(--mt-mono);color:var(--mt-text-dim);grid-template-columns:auto 1fr;gap:2px 10px;font-size:11px;display:grid}.if-card__meta b{color:var(--mt-text);overflow-wrap:anywhere;font-weight:500}.if-card__meta .contents{display:contents}.badge{border:1px solid var(--mt-border);background:var(--mt-surface-2);color:var(--mt-text-dim);font-family:var(--mt-mono);text-transform:uppercase;letter-spacing:.04em;border-radius:999px;margin-left:auto;padding:1px 7px;font-size:10px}:root{--mt-bg:var(--color-background-primary,#0b0d10);--mt-surface:var(--color-background-secondary,#14171c);--mt-surface-2:var(--color-background-tertiary,#1b1f26);--mt-border:var(--color-border-primary,#262b33);--mt-text:var(--color-text-primary,#e8eaed);--mt-text-dim:var(--color-text-secondary,#9aa3af);--mt-text-faint:var(--color-text-tertiary,#6b7280);--mt-accent:var(--color-accent-primary,#6ea8fe);--mt-good:#34d399;--mt-warn:#fbbf24;--mt-bad:#f87171;--mt-radius:var(--border-radius-md,14px);--mt-radius-sm:var(--border-radius-sm,9px);--mt-mono:var(--font-mono,ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace);--mt-sans:var(--font-sans,system-ui, -apple-system, "Segoe UI", sans-serif);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}body{background:var(--mt-bg);color:var(--mt-text);font-family:var(--mt-sans);-webkit-font-smoothing:antialiased;margin:0;padding:16px;font-size:13px;line-height:1.5}.app{gap:14px;max-width:960px;margin:0 auto;display:grid}.hd{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.hd__dot{background:var(--mt-good);width:9px;height:9px;box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent);border-radius:50%}.hd__title{letter-spacing:-.01em;margin:0;font-size:17px;font-weight:650}.hd__sub{color:var(--mt-text-dim);font-family:var(--mt-mono);margin:0;font-size:12px}.hd__spacer{flex:1}.pill{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;display:inline-flex}.pill b{color:var(--mt-text);font-weight:600}.grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.card{background:linear-gradient(180deg, var(--mt-surface), var(--mt-surface-2));border:1px solid var(--mt-border);border-radius:var(--mt-radius);padding:14px}.card__label{color:var(--mt-text-dim);text-transform:uppercase;letter-spacing:.06em;margin:0 0 8px;font-size:11px}.card__value{font-family:var(--mt-mono);letter-spacing:-.01em;font-size:20px;font-weight:600}.toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.toolbar .grow{flex:1;min-width:140px}.search{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);width:100%;color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);padding:7px 11px;font-size:13px}.search:focus{border-color:var(--mt-accent);outline:none}.search::placeholder{color:var(--mt-text-faint)}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;white-space:nowrap;padding:6px 11px;font-size:12px;transition:border-color .15s,background .15s}.btn:hover{border-color:var(--mt-accent);background:var(--mt-surface-2)}.btn:disabled{opacity:.5;cursor:default}.btn.is-active{border-color:var(--mt-accent);color:var(--mt-accent)}.chip{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:4px;padding:1px 7px;font-size:11px;display:inline-flex}.chip.is-good{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.chip.is-warn{color:var(--mt-warn);border-color:color-mix(in srgb, var(--mt-warn) 45%, var(--mt-border))}.chip.is-bad{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.tablewrap{border:1px solid var(--mt-border);border-radius:var(--mt-radius);max-height:70vh;overflow:auto}table.tbl{border-collapse:collapse;width:100%;font-size:12px}table.tbl th,table.tbl td{text-align:left;border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);white-space:nowrap;font-family:var(--mt-mono);padding:7px 12px}table.tbl thead th{z-index:1;background:var(--mt-surface-2);color:var(--mt-text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;position:sticky;top:0}table.tbl thead th:hover{color:var(--mt-text)}table.tbl thead th .arrow{color:var(--mt-accent);margin-left:4px}table.tbl tbody tr{cursor:pointer}table.tbl tbody tr:hover{background:color-mix(in srgb, var(--mt-accent) 8%, transparent)}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.kv__body{border:1px solid var(--mt-border);border-radius:var(--mt-radius);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid;overflow:hidden}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;font-size:12px;font-family:var(--mt-mono);padding:7px 14px}.kv__k{color:var(--mt-text-dim);background:color-mix(in srgb, var(--mt-surface) 60%, transparent)}.kv__v{color:var(--mt-text)}.drawer{border:1px solid var(--mt-accent);border-radius:var(--mt-radius);background:var(--mt-surface);gap:10px;padding:12px;display:grid}.drawer__hd{align-items:center;gap:8px;display:flex}.drawer__hd b{font-family:var(--mt-mono)}pre.raw{border:1px solid var(--mt-border);border-radius:var(--mt-radius);background:var(--mt-surface);color:var(--mt-text);font-family:var(--mt-mono);white-space:pre;max-height:70vh;margin:0;padding:14px;font-size:12px;overflow:auto}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);flex-wrap:wrap;align-items:center;gap:10px;display:flex}.foot .grow{flex:1}.skeleton,.empty{color:var(--mt-text-faint);text-align:center;padding:40px 0}.count-pill b{color:var(--mt-accent)}table.tbl td.col-num,table.tbl th.col-num{width:1%}
14
+ /*$vite$:1*/
15
+ </style>
16
+ </head>
17
+ <body>
18
+ <div id="app"></div>
19
+ </body>
20
+ </html>