@takodotid/circuit 0.43.1 → 1.0.0-rc.2

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 (256) hide show
  1. package/README.md +115 -37
  2. package/package.json +21 -58
  3. package/src/checks/across.ts +402 -0
  4. package/src/checks/built-in.ts +256 -0
  5. package/src/checks/device.ts +436 -0
  6. package/src/checks/index.ts +53 -0
  7. package/src/cli/advisories.ts +108 -0
  8. package/src/cli/app.ts +71 -0
  9. package/src/cli/editor-types.generated.ts +30 -0
  10. package/src/cli/editor-types.ts +69 -0
  11. package/src/cli/format.ts +124 -0
  12. package/src/cli/git-hooks.ts +79 -0
  13. package/src/cli/index.ts +350 -1170
  14. package/src/cli/migrate.ts +554 -0
  15. package/src/cli/project-commands.ts +656 -0
  16. package/src/cli/releases.ts +374 -0
  17. package/src/cli/remember.ts +339 -0
  18. package/src/cli/rename.ts +27 -33
  19. package/src/cli/secrets-password.ts +60 -0
  20. package/src/cli/secrets.ts +258 -0
  21. package/src/cli/setup.ts +300 -0
  22. package/src/cli/signing.ts +23 -0
  23. package/src/cli/text-editor.ts +268 -0
  24. package/src/cli/ui.ts +298 -0
  25. package/src/cli/version.ts +2 -0
  26. package/src/cli/versions.ts +158 -0
  27. package/src/config/address.ts +102 -0
  28. package/src/config/circuit.d.ts +30 -0
  29. package/src/config/common.ts +65 -0
  30. package/src/config/communities.ts +479 -0
  31. package/src/config/define.ts +684 -0
  32. package/src/config/device.ts +164 -0
  33. package/src/config/firewall.ts +150 -0
  34. package/src/config/index.ts +22 -0
  35. package/src/{schema → config}/interfaces.ts +121 -85
  36. package/src/config/keys.ts +434 -0
  37. package/src/config/management.ts +61 -0
  38. package/src/config/merge.ts +335 -0
  39. package/src/config/models.ts +70 -0
  40. package/src/config/monitoring.ts +64 -0
  41. package/src/config/network.ts +180 -0
  42. package/src/config/presets.ts +149 -0
  43. package/src/config/routing.ts +401 -0
  44. package/src/config/services.ts +51 -0
  45. package/src/config/switching.ts +84 -0
  46. package/src/config/system.ts +103 -0
  47. package/src/{schema → config}/time-zones.ts +1 -1
  48. package/src/core/address.ts +1 -1
  49. package/src/core/cabling.ts +8 -43
  50. package/src/core/graph.ts +40 -0
  51. package/src/{integrations → core}/registries.ts +5 -3
  52. package/src/core/secrets-file.ts +539 -0
  53. package/src/core/secrets.ts +83 -64
  54. package/src/core/topology.ts +103 -146
  55. package/src/core/utils.ts +12 -1
  56. package/src/model.ts +83 -0
  57. package/src/platforms/derive.ts +64 -37
  58. package/src/platforms/finding.ts +9 -0
  59. package/src/platforms/fortios/firewall.ts +76 -64
  60. package/src/platforms/fortios/index.ts +189 -125
  61. package/src/platforms/fortios/names.ts +51 -18
  62. package/src/platforms/fortios/render.ts +69 -62
  63. package/src/platforms/fortios/routing.ts +89 -58
  64. package/src/platforms/fortios/vdoms.ts +47 -16
  65. package/src/platforms/junos/TRAPS.md +2 -2
  66. package/src/platforms/junos/bgp.ts +63 -42
  67. package/src/platforms/junos/index.ts +122 -89
  68. package/src/platforms/junos/render.ts +139 -104
  69. package/src/platforms/platform.ts +10 -8
  70. package/src/platforms/raisecom-ros/TRAPS.md +1 -1
  71. package/src/platforms/raisecom-ros/index.ts +89 -70
  72. package/src/platforms/raisecom-ros/render.ts +49 -45
  73. package/src/platforms/routeros/TRAPS.md +3 -3
  74. package/src/platforms/routeros/index.ts +121 -60
  75. package/src/platforms/routeros/render.ts +214 -195
  76. package/src/platforms/vrp/TRAPS.md +1 -1
  77. package/src/platforms/vrp/index.ts +74 -50
  78. package/src/platforms/vrp/render.ts +67 -56
  79. package/src/project/project.ts +725 -0
  80. package/src/studio/app/env.d.ts +9 -0
  81. package/src/studio/app/index.html +18 -0
  82. package/src/studio/app/src/App.vue +95 -0
  83. package/src/studio/app/src/components/AddressesView.vue +38 -0
  84. package/src/studio/app/src/components/CablesView.vue +29 -0
  85. package/src/studio/app/src/components/CompareView.vue +160 -0
  86. package/src/studio/app/src/components/DataTable.vue +49 -0
  87. package/src/studio/app/src/components/DeviceView.vue +237 -0
  88. package/src/studio/app/src/components/DevicesView.vue +32 -0
  89. package/src/studio/app/src/components/Faceplate.vue +75 -0
  90. package/src/studio/app/src/components/GraphView.vue +282 -0
  91. package/src/studio/app/src/components/LineDiff.vue +24 -0
  92. package/src/studio/app/src/components/ProblemsView.vue +42 -0
  93. package/src/studio/app/src/components/SearchView.vue +72 -0
  94. package/src/studio/app/src/components/SecretsView.vue +112 -0
  95. package/src/studio/app/src/components/SessionsView.vue +35 -0
  96. package/src/studio/app/src/components/Settings.vue +95 -0
  97. package/src/studio/app/src/components/ToolsView.vue +118 -0
  98. package/src/studio/app/src/components/VlansView.vue +50 -0
  99. package/src/studio/app/src/lib/csv.ts +19 -0
  100. package/src/studio/{public/diff.js → app/src/lib/diff.ts} +40 -35
  101. package/src/studio/app/src/lib/format.ts +38 -0
  102. package/src/studio/app/src/lib/net.ts +68 -0
  103. package/src/studio/app/src/lib/secrets-crypto.ts +35 -0
  104. package/src/studio/app/src/lib/store.ts +71 -0
  105. package/src/studio/app/src/lib/tools.ts +217 -0
  106. package/src/studio/app/src/main.ts +9 -0
  107. package/src/studio/{public → app/src}/style.css +14 -4
  108. package/src/studio/app/tsconfig.json +17 -0
  109. package/src/studio/app/vite.config.ts +16 -0
  110. package/src/studio/assets.generated.ts +3 -0
  111. package/src/studio/data.ts +96 -188
  112. package/src/studio/git.ts +27 -43
  113. package/src/studio/server.ts +196 -107
  114. package/src/studio/types.ts +141 -0
  115. package/src/transport/console.ts +3 -3
  116. package/src/transport/ssh.ts +1 -1
  117. package/dist/chunks/index-3b343xva.js +0 -177
  118. package/dist/chunks/index-6wb41q67.js +0 -62
  119. package/dist/chunks/index-n7w3tg5y.js +0 -149
  120. package/dist/chunks/index-yzw86rc8.js +0 -921
  121. package/dist/chunks/new-w3zys5y4.js +0 -172
  122. package/dist/chunks/server-cxr9ynxc.js +0 -259
  123. package/dist/cli/index.js +0 -12922
  124. package/dist/helpers/index.js +0 -881
  125. package/dist/index.js +0 -28
  126. package/dist/types/core/address-space.d.ts +0 -62
  127. package/dist/types/core/address.d.ts +0 -44
  128. package/dist/types/core/cabling.d.ts +0 -41
  129. package/dist/types/core/cross-checks.d.ts +0 -28
  130. package/dist/types/core/define.d.ts +0 -79
  131. package/dist/types/core/project-files.d.ts +0 -12
  132. package/dist/types/core/schema-docs.d.ts +0 -25
  133. package/dist/types/core/secrets.d.ts +0 -62
  134. package/dist/types/core/topology.d.ts +0 -96
  135. package/dist/types/core/utils.d.ts +0 -10
  136. package/dist/types/core/validator.d.ts +0 -23
  137. package/dist/types/helpers/bgp.d.ts +0 -195
  138. package/dist/types/helpers/cables.d.ts +0 -69
  139. package/dist/types/helpers/checks.d.ts +0 -36
  140. package/dist/types/helpers/exchange.d.ts +0 -55
  141. package/dist/types/helpers/filters.d.ts +0 -51
  142. package/dist/types/helpers/index.d.ts +0 -14
  143. package/dist/types/helpers/route-server.d.ts +0 -52
  144. package/dist/types/helpers/upstreams.d.ts +0 -192
  145. package/dist/types/index.d.ts +0 -10
  146. package/dist/types/integrations/librenms.d.ts +0 -60
  147. package/dist/types/integrations/netbox.d.ts +0 -89
  148. package/dist/types/integrations/peeringdb.d.ts +0 -24
  149. package/dist/types/integrations/prometheus.d.ts +0 -24
  150. package/dist/types/integrations/registries.d.ts +0 -8
  151. package/dist/types/platforms/bgp-wait.d.ts +0 -24
  152. package/dist/types/platforms/catalog.d.ts +0 -109
  153. package/dist/types/platforms/derive.d.ts +0 -17
  154. package/dist/types/platforms/fortios/firewall.d.ts +0 -47
  155. package/dist/types/platforms/fortios/index.d.ts +0 -140
  156. package/dist/types/platforms/fortios/models.d.ts +0 -14
  157. package/dist/types/platforms/fortios/names.d.ts +0 -52
  158. package/dist/types/platforms/fortios/plan.d.ts +0 -114
  159. package/dist/types/platforms/fortios/render.d.ts +0 -77
  160. package/dist/types/platforms/fortios/routing.d.ts +0 -56
  161. package/dist/types/platforms/fortios/tree.d.ts +0 -37
  162. package/dist/types/platforms/fortios/vdoms.d.ts +0 -50
  163. package/dist/types/platforms/index.d.ts +0 -13
  164. package/dist/types/platforms/junos/bgp.d.ts +0 -44
  165. package/dist/types/platforms/junos/index.d.ts +0 -114
  166. package/dist/types/platforms/junos/models.d.ts +0 -14
  167. package/dist/types/platforms/junos/render.d.ts +0 -154
  168. package/dist/types/platforms/line-diff.d.ts +0 -67
  169. package/dist/types/platforms/platform.d.ts +0 -135
  170. package/dist/types/platforms/raisecom-ros/index.d.ts +0 -71
  171. package/dist/types/platforms/raisecom-ros/models.d.ts +0 -14
  172. package/dist/types/platforms/raisecom-ros/render.d.ts +0 -41
  173. package/dist/types/platforms/routeros/export.d.ts +0 -59
  174. package/dist/types/platforms/routeros/index.d.ts +0 -116
  175. package/dist/types/platforms/routeros/models.d.ts +0 -18
  176. package/dist/types/platforms/routeros/plan.d.ts +0 -58
  177. package/dist/types/platforms/routeros/render.d.ts +0 -250
  178. package/dist/types/platforms/vrp/index.d.ts +0 -83
  179. package/dist/types/platforms/vrp/models.d.ts +0 -12
  180. package/dist/types/platforms/vrp/render.d.ts +0 -96
  181. package/dist/types/schema/common.d.ts +0 -30
  182. package/dist/types/schema/device.d.ts +0 -126
  183. package/dist/types/schema/firewall.d.ts +0 -131
  184. package/dist/types/schema/index.d.ts +0 -8
  185. package/dist/types/schema/interfaces.d.ts +0 -205
  186. package/dist/types/schema/policy.d.ts +0 -107
  187. package/dist/types/schema/routing.d.ts +0 -161
  188. package/dist/types/schema/system.d.ts +0 -198
  189. package/dist/types/schema/time-zones.d.ts +0 -2
  190. package/dist/types/transport/console.d.ts +0 -115
  191. package/dist/types/transport/path-check.d.ts +0 -32
  192. package/dist/types/transport/ssh.d.ts +0 -27
  193. package/src/cli/graph-format.ts +0 -91
  194. package/src/cli/new.ts +0 -234
  195. package/src/core/address-space.ts +0 -320
  196. package/src/core/cross-checks.ts +0 -369
  197. package/src/core/define.ts +0 -124
  198. package/src/core/project-files.ts +0 -35
  199. package/src/core/schema-docs.ts +0 -174
  200. package/src/core/validator.ts +0 -508
  201. package/src/helpers/bgp.ts +0 -473
  202. package/src/helpers/cables.ts +0 -74
  203. package/src/helpers/checks.ts +0 -201
  204. package/src/helpers/exchange.ts +0 -123
  205. package/src/helpers/filters.ts +0 -107
  206. package/src/helpers/index.ts +0 -25
  207. package/src/helpers/route-server.ts +0 -212
  208. package/src/helpers/upstreams.ts +0 -369
  209. package/src/index.ts +0 -13
  210. package/src/integrations/librenms.ts +0 -291
  211. package/src/integrations/netbox.ts +0 -620
  212. package/src/integrations/peeringdb.ts +0 -173
  213. package/src/integrations/prometheus.ts +0 -90
  214. package/src/schema/common.ts +0 -41
  215. package/src/schema/device.ts +0 -145
  216. package/src/schema/firewall.ts +0 -140
  217. package/src/schema/index.ts +0 -8
  218. package/src/schema/policy.ts +0 -115
  219. package/src/schema/routing.ts +0 -173
  220. package/src/schema/system.ts +0 -203
  221. package/src/studio/public/app.js +0 -186
  222. package/src/studio/public/compare.js +0 -250
  223. package/src/studio/public/dom.js +0 -138
  224. package/src/studio/public/evaluate.js +0 -687
  225. package/src/studio/public/export.js +0 -130
  226. package/src/studio/public/graph.js +0 -1541
  227. package/src/studio/public/index.html +0 -83
  228. package/src/studio/public/net.js +0 -134
  229. package/src/studio/public/tables.js +0 -1289
  230. package/src/studio/public/tools.js +0 -610
  231. package/templates/colocation/checks.ts +0 -53
  232. package/templates/colocation/circuit.config.ts +0 -9
  233. package/templates/colocation/edge-01.ts +0 -133
  234. package/templates/colocation/routing.ts +0 -13
  235. package/templates/colocation/tenancy.ts +0 -76
  236. package/templates/colocation/tenants/acme.ts +0 -19
  237. package/templates/colocation/tenants/index.ts +0 -6
  238. package/templates/colocation/tor-01.ts +0 -33
  239. package/templates/edge-router/checks.ts +0 -20
  240. package/templates/edge-router/circuit.config.ts +0 -8
  241. package/templates/edge-router/edge-01.ts +0 -110
  242. package/templates/edge-router/routing.ts +0 -13
  243. package/templates/project/AGENTS.md +0 -51
  244. package/templates/project/CLAUDE.md +0 -1
  245. package/templates/project/README.md +0 -16
  246. package/templates/project/gitignore +0 -5
  247. package/templates/project/tsconfig.json +0 -13
  248. package/templates/single-site/checks.ts +0 -26
  249. package/templates/single-site/circuit.config.ts +0 -8
  250. package/templates/single-site/router.ts +0 -86
  251. package/templates/single-site/site.ts +0 -18
  252. package/templates/single-site/switch.ts +0 -34
  253. /package/src/studio/{public → app/public}/favicon.svg +0 -0
  254. /package/src/studio/{public → app/public}/special-gothic-latin-ext.woff2 +0 -0
  255. /package/src/studio/{public → app/public}/special-gothic-latin.woff2 +0 -0
  256. /package/src/studio/{public → app/public}/special-gothic-license.txt +0 -0
@@ -1,83 +0,0 @@
1
- <!doctype html>
2
- <!-- Circuit Studio. The scripts fill the parts below from /data, and draw again when the server says the config changed. -->
3
- <html lang="en">
4
- <head>
5
- <meta charset="utf-8" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1" />
7
- <title>Circuit Studio</title>
8
- <!-- Studio shows one team's network, so search engines are asked to leave it out. -->
9
- <meta name="robots" content="noindex, nofollow, noarchive" />
10
- <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
11
- <!-- Special Gothic is shared with the documentation site, and served from beside this page so Studio works offline. -->
12
- <link rel="preload" href="special-gothic-latin.woff2" as="font" type="font/woff2" crossorigin />
13
- <link rel="stylesheet" href="style.css" />
14
- <script type="module" src="app.js"></script>
15
- </head>
16
- <body>
17
- <header>
18
- <a class="brand" href="#graph" aria-label="Circuit Studio, back to the graph"
19
- ><span class="wordmark">Circuit</span><span class="product">Studio</span></a
20
- >
21
- <nav id="views" aria-label="Views">
22
- <button data-view="graph">Graph</button>
23
- <button data-view="devices">Devices</button>
24
- <button data-view="vlans">VLANs</button>
25
- <button data-view="addresses">Addresses</button>
26
- <button data-view="sessions">BGP</button>
27
- <button data-view="cables">Cables</button>
28
- <button data-view="tools">Tools</button>
29
- <button data-view="compare">Compare</button>
30
- <button data-view="problems">Problems<span id="problem-count" class="count"></span></button>
31
- </nav>
32
- <input id="search" type="search" placeholder="Search the config" aria-label="Search the config" />
33
- <div class="status-rail" aria-label="Network status">
34
- <span id="summary" class="summary"></span>
35
- <span id="live" class="live">connecting</span>
36
- </div>
37
- </header>
38
-
39
- <pre id="banner" class="banner" hidden></pre>
40
-
41
- <main>
42
- <section id="graph-view" class="view">
43
- <div class="toolbar">
44
- <nav id="layers" aria-label="Layers"></nav>
45
- <div class="actions">
46
- <button id="fit" title="Fit the drawing to the window">Fit</button>
47
- <button id="lay-out" title="Forget where nodes were moved on this layer, and lay it out again">
48
- Lay out again
49
- </button>
50
- <button
51
- id="present"
52
- aria-pressed="false"
53
- title="Show the network on a big screen: the panel hides, and the drawing goes through every layer, lighting its busiest devices in turn. Key P."
54
- >
55
- Present
56
- </button>
57
- <details class="menu">
58
- <summary>Save image</summary>
59
- <div class="menu-items">
60
- <button id="save-svg" title="Save this layer as an SVG image">SVG</button>
61
- <button id="save-png" title="Save this layer as a PNG image">PNG</button>
62
- </div>
63
- </details>
64
- </div>
65
- </div>
66
- <div class="stage">
67
- <svg id="canvas" class="canvas" role="img" aria-label="The network">
68
- <g id="viewport">
69
- <g id="edges"></g>
70
- <g id="nodes"></g>
71
- </g>
72
- </svg>
73
- <p id="present-caption" class="present-caption" aria-live="polite" hidden></p>
74
- <aside id="panel"></aside>
75
- </div>
76
- </section>
77
-
78
- <section id="tables-view" class="view" hidden>
79
- <div id="tables" class="tables"></div>
80
- </section>
81
- </main>
82
- </body>
83
- </html>
@@ -1,134 +0,0 @@
1
- // @ts-check
2
- // Address arithmetic for the browser, for both families, as src/core/address.ts does it for Circuit: addresses as numbers, so IPv4 and IPv6 share one path.
3
-
4
- /** @typedef {"ipv4" | "ipv6"} Family */
5
- /** @typedef {{ family: Family, value: bigint }} Address */
6
- /** @typedef {{ family: Family, first: bigint, last: bigint, length: number }} Range */
7
-
8
- export class Net {
9
- /** @param {Family} family */
10
- static #bits(family) {
11
- return family === "ipv4" ? 32 : 128;
12
- }
13
-
14
- /**
15
- * An address as a number, or undefined when the text is not one.
16
- *
17
- * @param {string} text
18
- * @returns {Address | undefined}
19
- */
20
- static parseAddress(text) {
21
- if (!text.includes(":")) {
22
- const octets = text.split(".");
23
- if (octets.length !== 4 || !octets.every((octet) => /^\d{1,3}$/.test(octet) && Number(octet) <= 255)) return undefined;
24
- return { family: "ipv4", value: octets.reduce((value, octet) => (value << 8n) | BigInt(octet), 0n) };
25
- }
26
-
27
- const [before, after, extra] = text.split("::");
28
- if (extra !== undefined || before === undefined) return undefined;
29
-
30
- /** @param {string | undefined} part */
31
- const groupsOf = (part) => (part ? part.split(":") : []);
32
- const leading = groupsOf(before);
33
- const trailing = groupsOf(after);
34
-
35
- // `::` stands for as many zero groups as make eight.
36
- const zeros = after === undefined ? 0 : 8 - leading.length - trailing.length;
37
- if (zeros < 0) return undefined;
38
- const groups = [...leading, ...Array(zeros).fill("0"), ...trailing];
39
- if (groups.length !== 8 || !groups.every((group) => /^[0-9a-fA-F]{1,4}$/.test(group))) return undefined;
40
-
41
- return { family: "ipv6", value: groups.reduce((value, group) => (value << 16n) | BigInt(parseInt(group, 16)), 0n) };
42
- }
43
-
44
- /**
45
- * A prefix, or a lone address as the prefix of just itself, as the range of numbers it covers. Undefined when the text is neither.
46
- *
47
- * @param {string} text
48
- * @returns {Range | undefined}
49
- */
50
- static parseRange(text) {
51
- const [addressText, lengthText] = text.split("/");
52
- const address = Net.parseAddress(addressText ?? "");
53
- if (!address) return undefined;
54
-
55
- const bits = Net.#bits(address.family);
56
- const length = lengthText === undefined ? bits : Number(lengthText);
57
- if (!Number.isInteger(length) || length < 0 || length > bits) return undefined;
58
-
59
- const hostBits = (1n << BigInt(bits - length)) - 1n;
60
- const first = address.value & ~hostBits & ((1n << BigInt(bits)) - 1n);
61
- return { family: address.family, first, last: first | hostBits, length };
62
- }
63
-
64
- /**
65
- * Whether a prefix, or an address, holds an address or a whole other prefix.
66
- *
67
- * @param {string} outer
68
- * @param {string} inner
69
- */
70
- static covers(outer, inner) {
71
- const a = Net.parseRange(outer);
72
- const b = Net.parseRange(inner);
73
- return Boolean(a && b && a.family === b.family && a.first <= b.first && b.last <= a.last);
74
- }
75
-
76
- /**
77
- * The same prefix, however it is written: same family, same length, same network.
78
- *
79
- * @param {string} a
80
- * @param {string} b
81
- */
82
- static samePrefix(a, b) {
83
- const x = Net.parseRange(a);
84
- const y = Net.parseRange(b);
85
- return Boolean(x && y && x.family === y.family && x.length === y.length && x.first === y.first);
86
- }
87
-
88
- /**
89
- * The family of an address or prefix, or undefined when it is not one.
90
- *
91
- * @param {string} text
92
- */
93
- static family(text) {
94
- return Net.parseRange(text)?.family;
95
- }
96
-
97
- /**
98
- * A number back to the address it stands for, with IPv6 written short as RFC 5952 asks.
99
- *
100
- * @param {bigint} value
101
- * @param {Family} family
102
- */
103
- static formatAddress(value, family) {
104
- if (family === "ipv4") return [24n, 16n, 8n, 0n].map((shift) => String((value >> shift) & 255n)).join(".");
105
-
106
- const groups = Array.from({ length: 8 }, (_, index) => ((value >> BigInt(112 - index * 16)) & 0xffffn).toString(16));
107
-
108
- // The longest run of two or more zero groups becomes `::`.
109
- let start = -1;
110
- let length = 0;
111
- for (let at = 0; at < 8;) {
112
- let end = at;
113
- while (end < 8 && groups[end] === "0") end++;
114
- if (end - at > length && end - at > 1) {
115
- start = at;
116
- length = end - at;
117
- }
118
- at = end === at ? at + 1 : end;
119
- }
120
-
121
- if (start < 0) return groups.join(":");
122
- return `${groups.slice(0, start).join(":")}::${groups.slice(start + length).join(":")}`;
123
- }
124
-
125
- /**
126
- * The network a prefix or interface address is in, such as `10.0.0.0/24` for `10.0.0.1/24`.
127
- *
128
- * @param {string} text
129
- */
130
- static prefixOf(text) {
131
- const range = Net.parseRange(text);
132
- return range ? `${Net.formatAddress(range.first, range.family)}/${range.length}` : text;
133
- }
134
- }