pilotswarm-web 0.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 (57) hide show
  1. package/README.md +144 -0
  2. package/auth/authz/engine.js +139 -0
  3. package/auth/config.js +110 -0
  4. package/auth/index.js +153 -0
  5. package/auth/normalize/entra.js +22 -0
  6. package/auth/providers/entra.js +76 -0
  7. package/auth/providers/none.js +24 -0
  8. package/auth.js +10 -0
  9. package/bin/serve.js +53 -0
  10. package/config.js +20 -0
  11. package/dist/app.js +469 -0
  12. package/dist/assets/index-BSVg-lGb.css +1 -0
  13. package/dist/assets/index-BXD5YP7A.js +24 -0
  14. package/dist/assets/msal-CytV9RFv.js +7 -0
  15. package/dist/assets/pilotswarm-WX3NED6m.js +40 -0
  16. package/dist/assets/react-jg0oazEi.js +1 -0
  17. package/dist/index.html +16 -0
  18. package/node_modules/pilotswarm-ui-core/README.md +6 -0
  19. package/node_modules/pilotswarm-ui-core/package.json +32 -0
  20. package/node_modules/pilotswarm-ui-core/src/commands.js +72 -0
  21. package/node_modules/pilotswarm-ui-core/src/context-usage.js +212 -0
  22. package/node_modules/pilotswarm-ui-core/src/controller.js +3613 -0
  23. package/node_modules/pilotswarm-ui-core/src/formatting.js +872 -0
  24. package/node_modules/pilotswarm-ui-core/src/history.js +571 -0
  25. package/node_modules/pilotswarm-ui-core/src/index.js +13 -0
  26. package/node_modules/pilotswarm-ui-core/src/layout.js +196 -0
  27. package/node_modules/pilotswarm-ui-core/src/reducer.js +1027 -0
  28. package/node_modules/pilotswarm-ui-core/src/selectors.js +2786 -0
  29. package/node_modules/pilotswarm-ui-core/src/session-tree.js +109 -0
  30. package/node_modules/pilotswarm-ui-core/src/state.js +80 -0
  31. package/node_modules/pilotswarm-ui-core/src/store.js +23 -0
  32. package/node_modules/pilotswarm-ui-core/src/system-titles.js +24 -0
  33. package/node_modules/pilotswarm-ui-core/src/themes/catppuccin-mocha.js +56 -0
  34. package/node_modules/pilotswarm-ui-core/src/themes/cobalt2.js +56 -0
  35. package/node_modules/pilotswarm-ui-core/src/themes/dark-high-contrast.js +56 -0
  36. package/node_modules/pilotswarm-ui-core/src/themes/dracula.js +56 -0
  37. package/node_modules/pilotswarm-ui-core/src/themes/github-dark.js +56 -0
  38. package/node_modules/pilotswarm-ui-core/src/themes/gruvbox-dark.js +56 -0
  39. package/node_modules/pilotswarm-ui-core/src/themes/hacker-x-matrix.js +56 -0
  40. package/node_modules/pilotswarm-ui-core/src/themes/hacker-x-orion-prime.js +56 -0
  41. package/node_modules/pilotswarm-ui-core/src/themes/helpers.js +77 -0
  42. package/node_modules/pilotswarm-ui-core/src/themes/index.js +42 -0
  43. package/node_modules/pilotswarm-ui-core/src/themes/noctis-viola.js +56 -0
  44. package/node_modules/pilotswarm-ui-core/src/themes/noctis.js +56 -0
  45. package/node_modules/pilotswarm-ui-core/src/themes/nord.js +56 -0
  46. package/node_modules/pilotswarm-ui-core/src/themes/solarized-dark.js +56 -0
  47. package/node_modules/pilotswarm-ui-core/src/themes/tokyo-night.js +56 -0
  48. package/node_modules/pilotswarm-ui-react/README.md +5 -0
  49. package/node_modules/pilotswarm-ui-react/package.json +36 -0
  50. package/node_modules/pilotswarm-ui-react/src/components.js +1316 -0
  51. package/node_modules/pilotswarm-ui-react/src/index.js +4 -0
  52. package/node_modules/pilotswarm-ui-react/src/platform.js +15 -0
  53. package/node_modules/pilotswarm-ui-react/src/use-controller-state.js +38 -0
  54. package/node_modules/pilotswarm-ui-react/src/web-app.js +2661 -0
  55. package/package.json +64 -0
  56. package/runtime.js +146 -0
  57. package/server.js +311 -0
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const hackerXOrionPrimeTheme = createTheme({
4
+ id: "hacker-x-orion-prime",
5
+ label: "Hacker X - Orion Prime",
6
+ description: "Deep-space navy palette with electric cyan, violet, and amber accents.",
7
+ page: {
8
+ background: "#0a0f1e",
9
+ foreground: "#e8f2ff",
10
+ overlayBackground: "#0a0f1e",
11
+ overlayForeground: "#e8f2ff",
12
+ hintColor: "#7e90b5",
13
+ modalBackdrop: "rgba(6, 10, 24, 0.76)",
14
+ modalBackground: "#121a30",
15
+ modalBorder: "#2d4a73",
16
+ modalForeground: "#edf5ff",
17
+ modalMuted: "#93a7cc",
18
+ modalSelectedBackground: "#19365f",
19
+ modalSelectedBorder: "#55c2ff",
20
+ modalSelectedForeground: "#f3fbff",
21
+ },
22
+ terminal: {
23
+ background: "#0a0f1e",
24
+ foreground: "#e8f2ff",
25
+ cursor: "#55c2ff",
26
+ cursorAccent: "#0a0f1e",
27
+ selectionBackground: "rgba(85, 194, 255, 0.22)",
28
+ black: "#10182b",
29
+ red: "#ff6b88",
30
+ green: "#67f5c2",
31
+ yellow: "#ffd36b",
32
+ blue: "#55c2ff",
33
+ magenta: "#c79bff",
34
+ cyan: "#7ceeff",
35
+ white: "#c3d4ef",
36
+ brightBlack: "#7e90b5",
37
+ brightRed: "#ff8aa2",
38
+ brightGreen: "#8cffd8",
39
+ brightYellow: "#ffe28f",
40
+ brightBlue: "#8fdcff",
41
+ brightMagenta: "#d8b6ff",
42
+ brightCyan: "#a2f5ff",
43
+ brightWhite: "#ffffff",
44
+ },
45
+ tui: {
46
+ surface: "#0c1325",
47
+ activeHighlightBackground: "#173052",
48
+ activeHighlightForeground: "#f3fbff",
49
+ selectionBackground: "#55c2ff",
50
+ selectionForeground: "#0a0f1e",
51
+ promptCursorBackground: "#55c2ff",
52
+ promptCursorForeground: "#0a0f1e",
53
+ },
54
+ });
55
+
56
+ export default hackerXOrionPrimeTheme;
@@ -0,0 +1,77 @@
1
+ function freezeTheme(theme) {
2
+ return Object.freeze({
3
+ ...theme,
4
+ page: Object.freeze({ ...(theme.page || {}) }),
5
+ terminal: Object.freeze({ ...(theme.terminal || {}) }),
6
+ tui: Object.freeze({ ...(theme.tui || {}) }),
7
+ });
8
+ }
9
+
10
+ function parseHexChannel(value) {
11
+ return Number.parseInt(value, 16) / 255;
12
+ }
13
+
14
+ function normalizeHexColor(value) {
15
+ const color = String(value || "").trim();
16
+ if (/^#[0-9a-f]{3}$/iu.test(color)) {
17
+ return `#${color.slice(1).split("").map((channel) => channel + channel).join("")}`;
18
+ }
19
+ return /^#[0-9a-f]{6}$/iu.test(color) ? color : null;
20
+ }
21
+
22
+ function toRelativeLuminanceChannel(value) {
23
+ return value <= 0.03928
24
+ ? value / 12.92
25
+ : ((value + 0.055) / 1.055) ** 2.4;
26
+ }
27
+
28
+ function getRelativeLuminance(color) {
29
+ const normalized = normalizeHexColor(color);
30
+ if (!normalized) return 0;
31
+
32
+ const red = toRelativeLuminanceChannel(parseHexChannel(normalized.slice(1, 3)));
33
+ const green = toRelativeLuminanceChannel(parseHexChannel(normalized.slice(3, 5)));
34
+ const blue = toRelativeLuminanceChannel(parseHexChannel(normalized.slice(5, 7)));
35
+
36
+ return (0.2126 * red) + (0.7152 * green) + (0.0722 * blue);
37
+ }
38
+
39
+ export function isThemeLight(theme) {
40
+ const background = theme?.page?.background || theme?.tui?.background || theme?.terminal?.background;
41
+ return getRelativeLuminance(background) >= 0.5;
42
+ }
43
+
44
+ export function createTheme({ id, label, description, page, terminal, tui = {} }) {
45
+ const baseTui = {
46
+ background: page?.background || terminal?.background || "#000000",
47
+ surface: terminal?.background || page?.background || "#000000",
48
+ foreground: terminal?.foreground || page?.foreground || "#ffffff",
49
+ white: terminal?.foreground || page?.foreground || "#ffffff",
50
+ gray: page?.hintColor || terminal?.brightBlack || terminal?.white || "#999999",
51
+ black: terminal?.black || "#000000",
52
+ red: terminal?.red || "#ff5555",
53
+ green: terminal?.green || "#55ff55",
54
+ yellow: terminal?.yellow || "#ffff55",
55
+ blue: terminal?.blue || "#5555ff",
56
+ magenta: terminal?.magenta || "#ff55ff",
57
+ cyan: terminal?.cyan || "#55ffff",
58
+ activeHighlightBackground: terminal?.blue || "#5555ff",
59
+ activeHighlightForeground: terminal?.background || "#000000",
60
+ selectionBackground: terminal?.cursor || terminal?.blue || "#5555ff",
61
+ selectionForeground: terminal?.cursorAccent || terminal?.background || "#000000",
62
+ promptCursorBackground: terminal?.cursor || terminal?.green || "#55ff55",
63
+ promptCursorForeground: terminal?.cursorAccent || terminal?.background || "#000000",
64
+ };
65
+
66
+ return freezeTheme({
67
+ id,
68
+ label,
69
+ description,
70
+ page,
71
+ terminal,
72
+ tui: {
73
+ ...baseTui,
74
+ ...tui,
75
+ },
76
+ });
77
+ }
@@ -0,0 +1,42 @@
1
+ import githubDarkTheme from "./github-dark.js";
2
+ import cobalt2Theme from "./cobalt2.js";
3
+ import draculaTheme from "./dracula.js";
4
+ import catppuccinMochaTheme from "./catppuccin-mocha.js";
5
+ import hackerXMatrixTheme from "./hacker-x-matrix.js";
6
+ import hackerXOrionPrimeTheme from "./hacker-x-orion-prime.js";
7
+ import nordTheme from "./nord.js";
8
+ import tokyoNightTheme from "./tokyo-night.js";
9
+ import gruvboxDarkTheme from "./gruvbox-dark.js";
10
+ import solarizedDarkTheme from "./solarized-dark.js";
11
+ import noctisTheme from "./noctis.js";
12
+ import noctisViolaTheme from "./noctis-viola.js";
13
+ import darkHighContrastTheme from "./dark-high-contrast.js";
14
+
15
+ const THEMES = Object.freeze([
16
+ draculaTheme,
17
+ githubDarkTheme,
18
+ cobalt2Theme,
19
+ hackerXOrionPrimeTheme,
20
+ hackerXMatrixTheme,
21
+ catppuccinMochaTheme,
22
+ nordTheme,
23
+ tokyoNightTheme,
24
+ gruvboxDarkTheme,
25
+ solarizedDarkTheme,
26
+ noctisTheme,
27
+ noctisViolaTheme,
28
+ darkHighContrastTheme,
29
+ ]);
30
+
31
+ const THEME_MAP = new Map(THEMES.map((theme) => [theme.id, theme]));
32
+
33
+ export const DEFAULT_THEME_ID = draculaTheme.id;
34
+
35
+ export function listThemes() {
36
+ return THEMES;
37
+ }
38
+
39
+ export function getTheme(themeId) {
40
+ if (!themeId) return null;
41
+ return THEME_MAP.get(themeId) ?? null;
42
+ }
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const noctisViolaTheme = createTheme({
4
+ id: "noctis-viola",
5
+ label: "Noctis Viola",
6
+ description: "Saturated dark violet palette with purple and warm accents.",
7
+ page: {
8
+ background: "#30243d",
9
+ foreground: "#ccbfd9",
10
+ overlayBackground: "#30243d",
11
+ overlayForeground: "#ccbfd9",
12
+ hintColor: "#bf8ef1",
13
+ modalBackdrop: "rgba(28, 18, 38, 0.72)",
14
+ modalBackground: "#3d2e4d",
15
+ modalBorder: "#8767a8",
16
+ modalForeground: "#ccbfd9",
17
+ modalMuted: "#ad9cc0",
18
+ modalSelectedBackground: "#593a78",
19
+ modalSelectedBorder: "#bf8ef1",
20
+ modalSelectedForeground: "#edebff",
21
+ },
22
+ terminal: {
23
+ background: "#291d35",
24
+ foreground: "#ccbfd9",
25
+ cursor: "#d9b3ff",
26
+ cursorAccent: "#291d35",
27
+ selectionBackground: "rgba(135, 103, 168, 0.33)",
28
+ black: "#362f3d",
29
+ red: "#e66533",
30
+ green: "#49e9a6",
31
+ yellow: "#e4b781",
32
+ blue: "#49ace9",
33
+ magenta: "#df769b",
34
+ cyan: "#49d6e9",
35
+ white: "#bfafcf",
36
+ brightBlack: "#8f869b",
37
+ brightRed: "#e97749",
38
+ brightGreen: "#60ebb1",
39
+ brightYellow: "#e69533",
40
+ brightBlue: "#60b6eb",
41
+ brightMagenta: "#e798b3",
42
+ brightCyan: "#60dbeb",
43
+ brightWhite: "#ccbfd9",
44
+ },
45
+ tui: {
46
+ surface: "#291d35",
47
+ activeHighlightBackground: "#402d53",
48
+ activeHighlightForeground: "#edebff",
49
+ selectionBackground: "#8767a8",
50
+ selectionForeground: "#30243d",
51
+ promptCursorBackground: "#d9b3ff",
52
+ promptCursorForeground: "#291d35",
53
+ },
54
+ });
55
+
56
+ export default noctisViolaTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const noctisTheme = createTheme({
4
+ id: "noctis",
5
+ label: "Noctis",
6
+ description: "Dark cyan-tinted palette with warm and cold medium contrast accents.",
7
+ page: {
8
+ background: "#052529",
9
+ foreground: "#b2cacd",
10
+ overlayBackground: "#052529",
11
+ overlayForeground: "#b2cacd",
12
+ hintColor: "#40d4e7",
13
+ modalBackdrop: "rgba(3, 25, 27, 0.72)",
14
+ modalBackground: "#073940",
15
+ modalBorder: "#0e6671",
16
+ modalForeground: "#b2cacd",
17
+ modalMuted: "#87a7ab",
18
+ modalSelectedBackground: "#0b515b",
19
+ modalSelectedBorder: "#40d4e7",
20
+ modalSelectedForeground: "#ebfdff",
21
+ },
22
+ terminal: {
23
+ background: "#03191b",
24
+ foreground: "#b2cacd",
25
+ cursor: "#85efff",
26
+ cursorAccent: "#03191b",
27
+ selectionBackground: "rgba(22, 159, 177, 0.27)",
28
+ black: "#324a4d",
29
+ red: "#e66533",
30
+ green: "#49e9a6",
31
+ yellow: "#e4b781",
32
+ blue: "#49ace9",
33
+ magenta: "#df769b",
34
+ cyan: "#49d6e9",
35
+ white: "#b2cacd",
36
+ brightBlack: "#5e878c",
37
+ brightRed: "#e97749",
38
+ brightGreen: "#60ebb1",
39
+ brightYellow: "#e69533",
40
+ brightBlue: "#60b6eb",
41
+ brightMagenta: "#e798b3",
42
+ brightCyan: "#60dbeb",
43
+ brightWhite: "#c1d4d7",
44
+ },
45
+ tui: {
46
+ surface: "#03191b",
47
+ activeHighlightBackground: "#083d44",
48
+ activeHighlightForeground: "#ebfdff",
49
+ selectionBackground: "#169fb1",
50
+ selectionForeground: "#052529",
51
+ promptCursorBackground: "#85efff",
52
+ promptCursorForeground: "#03191b",
53
+ },
54
+ });
55
+
56
+ export default noctisTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const nordTheme = createTheme({
4
+ id: "nord",
5
+ label: "Nord",
6
+ description: "Arctic blue-gray palette with frosty accents and clean contrast.",
7
+ page: {
8
+ background: "#2e3440",
9
+ foreground: "#d8dee9",
10
+ overlayBackground: "#2e3440",
11
+ overlayForeground: "#d8dee9",
12
+ hintColor: "#8f9ab5",
13
+ modalBackdrop: "rgba(46, 52, 64, 0.74)",
14
+ modalBackground: "#3b4252",
15
+ modalBorder: "#4c566a",
16
+ modalForeground: "#d8dee9",
17
+ modalMuted: "#8f9ab5",
18
+ modalSelectedBackground: "#434c5e",
19
+ modalSelectedBorder: "#88c0d0",
20
+ modalSelectedForeground: "#eceff4",
21
+ },
22
+ terminal: {
23
+ background: "#2e3440",
24
+ foreground: "#d8dee9",
25
+ cursor: "#d8dee9",
26
+ cursorAccent: "#2e3440",
27
+ selectionBackground: "rgba(136, 192, 208, 0.22)",
28
+ black: "#3b4252",
29
+ red: "#bf616a",
30
+ green: "#a3be8c",
31
+ yellow: "#ebcb8b",
32
+ blue: "#81a1c1",
33
+ magenta: "#b48ead",
34
+ cyan: "#88c0d0",
35
+ white: "#e5e9f0",
36
+ brightBlack: "#4c566a",
37
+ brightRed: "#bf616a",
38
+ brightGreen: "#a3be8c",
39
+ brightYellow: "#ebcb8b",
40
+ brightBlue: "#81a1c1",
41
+ brightMagenta: "#b48ead",
42
+ brightCyan: "#8fbcbb",
43
+ brightWhite: "#eceff4",
44
+ },
45
+ tui: {
46
+ surface: "#2e3440",
47
+ activeHighlightBackground: "#434c5e",
48
+ activeHighlightForeground: "#eceff4",
49
+ selectionBackground: "#88c0d0",
50
+ selectionForeground: "#2e3440",
51
+ promptCursorBackground: "#d8dee9",
52
+ promptCursorForeground: "#2e3440",
53
+ },
54
+ });
55
+
56
+ export default nordTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const solarizedDarkTheme = createTheme({
4
+ id: "solarized-dark",
5
+ label: "Solarized Dark",
6
+ description: "Ethan Schoonover's precision-engineered dark palette with warm accents.",
7
+ page: {
8
+ background: "#002b36",
9
+ foreground: "#839496",
10
+ overlayBackground: "#002b36",
11
+ overlayForeground: "#839496",
12
+ hintColor: "#839496",
13
+ modalBackdrop: "rgba(0, 43, 54, 0.74)",
14
+ modalBackground: "#073642",
15
+ modalBorder: "#586e75",
16
+ modalForeground: "#839496",
17
+ modalMuted: "#839496",
18
+ modalSelectedBackground: "#073642",
19
+ modalSelectedBorder: "#268bd2",
20
+ modalSelectedForeground: "#93a1a1",
21
+ },
22
+ terminal: {
23
+ background: "#002b36",
24
+ foreground: "#839496",
25
+ cursor: "#839496",
26
+ cursorAccent: "#002b36",
27
+ selectionBackground: "rgba(38, 139, 210, 0.22)",
28
+ black: "#073642",
29
+ red: "#dc322f",
30
+ green: "#859900",
31
+ yellow: "#b58900",
32
+ blue: "#268bd2",
33
+ magenta: "#d33682",
34
+ cyan: "#2aa198",
35
+ white: "#eee8d5",
36
+ brightBlack: "#586e75",
37
+ brightRed: "#cb4b16",
38
+ brightGreen: "#586e75",
39
+ brightYellow: "#657b83",
40
+ brightBlue: "#839496",
41
+ brightMagenta: "#6c71c4",
42
+ brightCyan: "#93a1a1",
43
+ brightWhite: "#fdf6e3",
44
+ },
45
+ tui: {
46
+ surface: "#002b36",
47
+ activeHighlightBackground: "#073642",
48
+ activeHighlightForeground: "#93a1a1",
49
+ selectionBackground: "#268bd2",
50
+ selectionForeground: "#fdf6e3",
51
+ promptCursorBackground: "#839496",
52
+ promptCursorForeground: "#002b36",
53
+ },
54
+ });
55
+
56
+ export default solarizedDarkTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const tokyoNightTheme = createTheme({
4
+ id: "tokyo-night",
5
+ label: "Tokyo Night",
6
+ description: "Deep blue-gray canvas with vivid neon accents inspired by Tokyo city lights.",
7
+ page: {
8
+ background: "#1a1b26",
9
+ foreground: "#a9b1d6",
10
+ overlayBackground: "#1a1b26",
11
+ overlayForeground: "#a9b1d6",
12
+ hintColor: "#737aa2",
13
+ modalBackdrop: "rgba(26, 27, 38, 0.74)",
14
+ modalBackground: "#24283b",
15
+ modalBorder: "#414868",
16
+ modalForeground: "#a9b1d6",
17
+ modalMuted: "#737aa2",
18
+ modalSelectedBackground: "#33467c",
19
+ modalSelectedBorder: "#7aa2f7",
20
+ modalSelectedForeground: "#c0caf5",
21
+ },
22
+ terminal: {
23
+ background: "#1a1b26",
24
+ foreground: "#a9b1d6",
25
+ cursor: "#c0caf5",
26
+ cursorAccent: "#1a1b26",
27
+ selectionBackground: "rgba(122, 162, 247, 0.22)",
28
+ black: "#414868",
29
+ red: "#f7768e",
30
+ green: "#9ece6a",
31
+ yellow: "#e0af68",
32
+ blue: "#7aa2f7",
33
+ magenta: "#bb9af7",
34
+ cyan: "#7dcfff",
35
+ white: "#a9b1d6",
36
+ brightBlack: "#565f89",
37
+ brightRed: "#f7768e",
38
+ brightGreen: "#9ece6a",
39
+ brightYellow: "#e0af68",
40
+ brightBlue: "#7aa2f7",
41
+ brightMagenta: "#bb9af7",
42
+ brightCyan: "#7dcfff",
43
+ brightWhite: "#c0caf5",
44
+ },
45
+ tui: {
46
+ surface: "#1a1b26",
47
+ activeHighlightBackground: "#33467c",
48
+ activeHighlightForeground: "#c0caf5",
49
+ selectionBackground: "#7aa2f7",
50
+ selectionForeground: "#1a1b26",
51
+ promptCursorBackground: "#c0caf5",
52
+ promptCursorForeground: "#1a1b26",
53
+ },
54
+ });
55
+
56
+ export default tokyoNightTheme;
@@ -0,0 +1,5 @@
1
+ # pilotswarm-ui-react
2
+
3
+ Shared React views and host adapters for PilotSwarm interfaces.
4
+
5
+ This package is used by both the TUI and web portal host layers.
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "pilotswarm-ui-react",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "description": "Shared React screens and panes for PilotSwarm hosts.",
7
+ "main": "./src/index.js",
8
+ "exports": {
9
+ ".": "./src/index.js"
10
+ },
11
+ "files": [
12
+ "src/**/*",
13
+ "README.md"
14
+ ],
15
+ "dependencies": {
16
+ "pilotswarm-ui-core": "0.1.0",
17
+ "react": "^19.2.4"
18
+ },
19
+ "scripts": {
20
+ "build": "echo 'pilotswarm-ui-react: no build step (plain JS)'",
21
+ "clean": "true"
22
+ },
23
+ "author": "Affan Dar",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/affandar/PilotSwarm"
28
+ },
29
+ "homepage": "https://github.com/affandar/PilotSwarm",
30
+ "bugs": {
31
+ "url": "https://github.com/affandar/PilotSwarm/issues"
32
+ },
33
+ "engines": {
34
+ "node": ">=24.0.0"
35
+ }
36
+ }