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,109 @@
1
+ import { systemSessionSortOrder } from "./system-titles.js";
2
+
3
+ function systemSessionOrder(session) {
4
+ if (!session?.isSystem) return Number.MAX_SAFE_INTEGER;
5
+ return systemSessionSortOrder(session);
6
+ }
7
+
8
+ function rankSystemSession(session) {
9
+ if (!session.isSystem) return 1;
10
+ return 0;
11
+ }
12
+
13
+ function buildPreviousOrderMap(previousFlat = []) {
14
+ const order = new Map();
15
+ for (let index = 0; index < previousFlat.length; index += 1) {
16
+ const sessionId = previousFlat[index]?.sessionId;
17
+ if (!sessionId || order.has(sessionId)) continue;
18
+ order.set(sessionId, index);
19
+ }
20
+ return order;
21
+ }
22
+
23
+ function buildStableOrderMap(orderSource = []) {
24
+ if (orderSource instanceof Map) {
25
+ return new Map(orderSource);
26
+ }
27
+ if (Array.isArray(orderSource)) {
28
+ return buildPreviousOrderMap(orderSource);
29
+ }
30
+ const order = new Map();
31
+ for (const [sessionId, index] of Object.entries(orderSource || {})) {
32
+ if (!sessionId || typeof index !== "number" || Number.isNaN(index)) continue;
33
+ order.set(sessionId, index);
34
+ }
35
+ return order;
36
+ }
37
+
38
+ function sortSessions(a, b, stableOrderMap) {
39
+ const aRank = rankSystemSession(a);
40
+ const bRank = rankSystemSession(b);
41
+ if (aRank !== bRank) return aRank - bRank;
42
+
43
+ const aSystemOrder = systemSessionOrder(a);
44
+ const bSystemOrder = systemSessionOrder(b);
45
+ if (aSystemOrder !== bSystemOrder) return aSystemOrder - bSystemOrder;
46
+
47
+ const aPreviousOrder = stableOrderMap.get(a.sessionId);
48
+ const bPreviousOrder = stableOrderMap.get(b.sessionId);
49
+ if (
50
+ typeof aPreviousOrder === "number"
51
+ && typeof bPreviousOrder === "number"
52
+ && aPreviousOrder !== bPreviousOrder
53
+ ) {
54
+ return aPreviousOrder - bPreviousOrder;
55
+ }
56
+
57
+ const createdDiff = (b.createdAt || 0) - (a.createdAt || 0);
58
+ if (createdDiff !== 0) return createdDiff;
59
+
60
+ const aTitle = String(a.title || "");
61
+ const bTitle = String(b.title || "");
62
+ const titleDiff = aTitle.localeCompare(bTitle);
63
+ if (titleDiff !== 0) return titleDiff;
64
+
65
+ return String(a.sessionId || "").localeCompare(String(b.sessionId || ""));
66
+ }
67
+
68
+ export function buildSessionTree(sessions = [], collapsedIds = new Set(), orderSource = []) {
69
+ const byId = new Map();
70
+ const children = new Map();
71
+ const stableOrderMap = buildStableOrderMap(orderSource);
72
+
73
+ for (const session of sessions) {
74
+ byId.set(session.sessionId, session);
75
+ }
76
+
77
+ for (const session of sessions) {
78
+ const parentId = session.parentSessionId;
79
+ if (!parentId || !byId.has(parentId)) continue;
80
+ if (!children.has(parentId)) children.set(parentId, []);
81
+ children.get(parentId).push(session);
82
+ }
83
+
84
+ for (const childList of children.values()) {
85
+ childList.sort((a, b) => sortSessions(a, b, stableOrderMap));
86
+ }
87
+
88
+ const roots = sessions
89
+ .filter((session) => !session.parentSessionId || !byId.has(session.parentSessionId))
90
+ .sort((a, b) => sortSessions(a, b, stableOrderMap));
91
+
92
+ const flat = [];
93
+
94
+ function visit(session, depth) {
95
+ const childList = children.get(session.sessionId) || [];
96
+ flat.push({
97
+ sessionId: session.sessionId,
98
+ depth,
99
+ hasChildren: childList.length > 0,
100
+ collapsed: collapsedIds.has(session.sessionId),
101
+ });
102
+ if (collapsedIds.has(session.sessionId)) return;
103
+ for (const child of childList) visit(child, depth + 1);
104
+ }
105
+
106
+ for (const root of roots) visit(root, 0);
107
+
108
+ return flat;
109
+ }
@@ -0,0 +1,80 @@
1
+ import { FOCUS_REGIONS, INSPECTOR_TABS } from "./commands.js";
2
+ import { DEFAULT_THEME_ID } from "./themes/index.js";
3
+
4
+ export function createInitialState({ mode = "local", branding = null, themeId = null } = {}) {
5
+ return {
6
+ branding: branding || {
7
+ title: "PilotSwarm",
8
+ splash: "{bold}{cyan-fg}PilotSwarm{/cyan-fg}{/bold}",
9
+ },
10
+ ui: {
11
+ focusRegion: FOCUS_REGIONS.SESSIONS,
12
+ inspectorTab: INSPECTOR_TABS[0],
13
+ prompt: "",
14
+ promptCursor: 0,
15
+ promptRows: 1,
16
+ promptAttachments: [],
17
+ statusText: "Starting PilotSwarm...",
18
+ themeId: themeId || DEFAULT_THEME_ID,
19
+ modal: null,
20
+ fullscreenPane: null,
21
+ layout: {
22
+ paneAdjust: 0,
23
+ sessionPaneAdjust: 0,
24
+ viewportWidth: 120,
25
+ viewportHeight: 40,
26
+ },
27
+ scroll: {
28
+ chat: 0,
29
+ inspector: 0,
30
+ activity: 0,
31
+ filePreview: 0,
32
+ },
33
+ },
34
+ connection: {
35
+ mode,
36
+ connected: false,
37
+ workersOnline: null,
38
+ error: null,
39
+ },
40
+ sessions: {
41
+ byId: {},
42
+ flat: [],
43
+ activeSessionId: null,
44
+ collapsedIds: new Set(),
45
+ orderById: {},
46
+ nextOrderOrdinal: 0,
47
+ filterQuery: "",
48
+ },
49
+ history: {
50
+ bySessionId: new Map(),
51
+ },
52
+ orchestration: {
53
+ bySessionId: {},
54
+ },
55
+ executionHistory: {
56
+ bySessionId: {},
57
+ format: "pretty",
58
+ },
59
+ files: {
60
+ bySessionId: {},
61
+ fullscreen: false,
62
+ selectedArtifactId: null,
63
+ filter: {
64
+ scope: "selectedSession",
65
+ query: "",
66
+ },
67
+ },
68
+ logs: {
69
+ available: false,
70
+ availabilityReason: "Log tailing disabled: no K8S_CONTEXT configured in the env file.",
71
+ tailing: false,
72
+ entries: [],
73
+ filter: {
74
+ source: "allNodes",
75
+ level: "all",
76
+ format: "pretty",
77
+ },
78
+ },
79
+ };
80
+ }
@@ -0,0 +1,23 @@
1
+ export function createStore(reducer, initialState) {
2
+ let state = initialState;
3
+ const listeners = new Set();
4
+
5
+ return {
6
+ getState() {
7
+ return state;
8
+ },
9
+ dispatch(action) {
10
+ const nextState = reducer(state, action);
11
+ if (Object.is(nextState, state)) {
12
+ return action;
13
+ }
14
+ state = nextState;
15
+ for (const listener of listeners) listener(state, action);
16
+ return action;
17
+ },
18
+ subscribe(listener) {
19
+ listeners.add(listener);
20
+ return () => listeners.delete(listener);
21
+ },
22
+ };
23
+ }
@@ -0,0 +1,24 @@
1
+ export function canonicalSystemTitle(session, brandingTitle = "PilotSwarm") {
2
+ const brandedRootTitle = brandingTitle || "PilotSwarm";
3
+ const agentId = String(session?.agentId || "");
4
+ if (agentId === "pilotswarm") return brandedRootTitle;
5
+ if (agentId === "sweeper") return "Sweeper Agent";
6
+ if (agentId === "resourcemgr") return "Resource Manager Agent";
7
+ if (agentId === "facts-manager") return "Facts Manager";
8
+
9
+ const rawTitle = String(session?.title || "").trim();
10
+ if (/^pilotswarm(?: agent)?$/i.test(rawTitle)) return brandedRootTitle;
11
+ if (/^sweeper agent$/i.test(rawTitle) || /^sweeper$/i.test(rawTitle)) return "Sweeper Agent";
12
+ if (/^resource manager agent$/i.test(rawTitle) || /^resourcemgr$/i.test(rawTitle)) return "Resource Manager Agent";
13
+ if (/^facts manager$/i.test(rawTitle) || /^facts-manager$/i.test(rawTitle)) return "Facts Manager";
14
+ return rawTitle || "System Agent";
15
+ }
16
+
17
+ export function systemSessionSortOrder(session) {
18
+ const title = canonicalSystemTitle(session, "PilotSwarm");
19
+ if (title === "PilotSwarm") return 0;
20
+ if (title === "Sweeper Agent") return 1;
21
+ if (title === "Resource Manager Agent") return 2;
22
+ if (title === "Facts Manager") return 3;
23
+ return 10;
24
+ }
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const catppuccinMochaTheme = createTheme({
4
+ id: "catppuccin-mocha",
5
+ label: "Catppuccin Mocha",
6
+ description: "Creamy dark palette with soft pastels and high legibility.",
7
+ page: {
8
+ background: "#1e1e2e",
9
+ foreground: "#cdd6f4",
10
+ overlayBackground: "#1e1e2e",
11
+ overlayForeground: "#cdd6f4",
12
+ hintColor: "#bac2de",
13
+ modalBackdrop: "rgba(17, 17, 27, 0.74)",
14
+ modalBackground: "#313244",
15
+ modalBorder: "#585b70",
16
+ modalForeground: "#cdd6f4",
17
+ modalMuted: "#bac2de",
18
+ modalSelectedBackground: "#45475a",
19
+ modalSelectedBorder: "#89b4fa",
20
+ modalSelectedForeground: "#cdd6f4",
21
+ },
22
+ terminal: {
23
+ background: "#1e1e2e",
24
+ foreground: "#cdd6f4",
25
+ cursor: "#f5e0dc",
26
+ cursorAccent: "#1e1e2e",
27
+ selectionBackground: "rgba(137, 180, 250, 0.22)",
28
+ black: "#45475a",
29
+ red: "#f38ba8",
30
+ green: "#a6e3a1",
31
+ yellow: "#f9e2af",
32
+ blue: "#89b4fa",
33
+ magenta: "#f5c2e7",
34
+ cyan: "#94e2d5",
35
+ white: "#bac2de",
36
+ brightBlack: "#585b70",
37
+ brightRed: "#f38ba8",
38
+ brightGreen: "#a6e3a1",
39
+ brightYellow: "#f9e2af",
40
+ brightBlue: "#89b4fa",
41
+ brightMagenta: "#f5c2e7",
42
+ brightCyan: "#94e2d5",
43
+ brightWhite: "#f5e0dc",
44
+ },
45
+ tui: {
46
+ surface: "#1e1e2e",
47
+ activeHighlightBackground: "#45475a",
48
+ activeHighlightForeground: "#cdd6f4",
49
+ selectionBackground: "#89b4fa",
50
+ selectionForeground: "#1e1e2e",
51
+ promptCursorBackground: "#f5e0dc",
52
+ promptCursorForeground: "#1e1e2e",
53
+ },
54
+ });
55
+
56
+ export default catppuccinMochaTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const cobalt2Theme = createTheme({
4
+ id: "cobalt2",
5
+ label: "Cobalt2",
6
+ description: "Electric blue shell with bright yellow accents and saturated syntax colors.",
7
+ page: {
8
+ background: "#193549",
9
+ foreground: "#ffffff",
10
+ overlayBackground: "#193549",
11
+ overlayForeground: "#ffffff",
12
+ hintColor: "#a8c5e6",
13
+ modalBackdrop: "rgba(7, 17, 28, 0.68)",
14
+ modalBackground: "#224b68",
15
+ modalBorder: "#2e6c99",
16
+ modalForeground: "#ffffff",
17
+ modalMuted: "#a8c5e6",
18
+ modalSelectedBackground: "#ffc600",
19
+ modalSelectedBorder: "#ffc600",
20
+ modalSelectedForeground: "#193549",
21
+ },
22
+ terminal: {
23
+ background: "#193549",
24
+ foreground: "#ffffff",
25
+ cursor: "#ffc600",
26
+ cursorAccent: "#193549",
27
+ selectionBackground: "rgba(255, 255, 255, 0.18)",
28
+ black: "#000000",
29
+ red: "#ff628c",
30
+ green: "#3ad900",
31
+ yellow: "#ff9d00",
32
+ blue: "#0088ff",
33
+ magenta: "#ff628c",
34
+ cyan: "#80ffbb",
35
+ white: "#ffffff",
36
+ brightBlack: "#666666",
37
+ brightRed: "#ff628c",
38
+ brightGreen: "#3ad900",
39
+ brightYellow: "#ff9d00",
40
+ brightBlue: "#0088ff",
41
+ brightMagenta: "#ff9d00",
42
+ brightCyan: "#80ffbb",
43
+ brightWhite: "#ffffff",
44
+ },
45
+ tui: {
46
+ surface: "#193549",
47
+ activeHighlightBackground: "#0f5f91",
48
+ activeHighlightForeground: "#ffffff",
49
+ selectionBackground: "#ffc600",
50
+ selectionForeground: "#193549",
51
+ promptCursorBackground: "#ffc600",
52
+ promptCursorForeground: "#193549",
53
+ },
54
+ });
55
+
56
+ export default cobalt2Theme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const darkHighContrastTheme = createTheme({
4
+ id: "dark-high-contrast",
5
+ label: "Dark High Contrast",
6
+ description: "Pure black background with maximum contrast ANSI colors for accessibility.",
7
+ page: {
8
+ background: "#000000",
9
+ foreground: "#ffffff",
10
+ overlayBackground: "#000000",
11
+ overlayForeground: "#ffffff",
12
+ hintColor: "#3794ff",
13
+ modalBackdrop: "rgba(0, 0, 0, 0.85)",
14
+ modalBackground: "#0c0c0c",
15
+ modalBorder: "#6fc3df",
16
+ modalForeground: "#ffffff",
17
+ modalMuted: "#9d9d9d",
18
+ modalSelectedBackground: "#0f4a85",
19
+ modalSelectedBorder: "#f38518",
20
+ modalSelectedForeground: "#ffffff",
21
+ },
22
+ terminal: {
23
+ background: "#000000",
24
+ foreground: "#ffffff",
25
+ cursor: "#ffffff",
26
+ cursorAccent: "#000000",
27
+ selectionBackground: "rgba(255, 255, 255, 0.3)",
28
+ black: "#000000",
29
+ red: "#f44747",
30
+ green: "#73c991",
31
+ yellow: "#e5e510",
32
+ blue: "#3794ff",
33
+ magenta: "#bc3fbc",
34
+ cyan: "#29b8db",
35
+ white: "#e5e5e5",
36
+ brightBlack: "#666666",
37
+ brightRed: "#f14c4c",
38
+ brightGreen: "#89d185",
39
+ brightYellow: "#f5f543",
40
+ brightBlue: "#6fc3df",
41
+ brightMagenta: "#d670d6",
42
+ brightCyan: "#2ee2e2",
43
+ brightWhite: "#ffffff",
44
+ },
45
+ tui: {
46
+ surface: "#000000",
47
+ activeHighlightBackground: "#0f4a85",
48
+ activeHighlightForeground: "#ffffff",
49
+ selectionBackground: "#f38518",
50
+ selectionForeground: "#000000",
51
+ promptCursorBackground: "#ffffff",
52
+ promptCursorForeground: "#000000",
53
+ },
54
+ });
55
+
56
+ export default darkHighContrastTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const draculaTheme = createTheme({
4
+ id: "dracula",
5
+ label: "Dracula",
6
+ description: "Classic Dracula contrast with neon green, pink, and violet accents.",
7
+ page: {
8
+ background: "#282a36",
9
+ foreground: "#f8f8f2",
10
+ overlayBackground: "#282a36",
11
+ overlayForeground: "#f8f8f2",
12
+ hintColor: "#bd93f9",
13
+ modalBackdrop: "rgba(24, 25, 33, 0.72)",
14
+ modalBackground: "#313442",
15
+ modalBorder: "#6272a4",
16
+ modalForeground: "#f8f8f2",
17
+ modalMuted: "#bd93f9",
18
+ modalSelectedBackground: "#44475a",
19
+ modalSelectedBorder: "#bd93f9",
20
+ modalSelectedForeground: "#f8f8f2",
21
+ },
22
+ terminal: {
23
+ background: "#282a36",
24
+ foreground: "#f8f8f2",
25
+ cursor: "#f8f8f2",
26
+ cursorAccent: "#282a36",
27
+ selectionBackground: "rgba(189, 147, 249, 0.24)",
28
+ black: "#21222c",
29
+ red: "#ff5555",
30
+ green: "#50fa7b",
31
+ yellow: "#f1fa8c",
32
+ blue: "#bd93f9",
33
+ magenta: "#ff79c6",
34
+ cyan: "#8be9fd",
35
+ white: "#f8f8f2",
36
+ brightBlack: "#6272a4",
37
+ brightRed: "#ff6e6e",
38
+ brightGreen: "#69ff94",
39
+ brightYellow: "#ffffa5",
40
+ brightBlue: "#d6acff",
41
+ brightMagenta: "#ff92df",
42
+ brightCyan: "#a4ffff",
43
+ brightWhite: "#ffffff",
44
+ },
45
+ tui: {
46
+ surface: "#282a36",
47
+ activeHighlightBackground: "#44475a",
48
+ activeHighlightForeground: "#f8f8f2",
49
+ selectionBackground: "#bd93f9",
50
+ selectionForeground: "#282a36",
51
+ promptCursorBackground: "#f8f8f2",
52
+ promptCursorForeground: "#282a36",
53
+ },
54
+ });
55
+
56
+ export default draculaTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const githubDarkTheme = createTheme({
4
+ id: "github-dark",
5
+ label: "GitHub Dark",
6
+ description: "GitHub dark palette with soft blue accents and cool neutrals.",
7
+ page: {
8
+ background: "#0d1117",
9
+ foreground: "#e6edf3",
10
+ overlayBackground: "#0d1117",
11
+ overlayForeground: "#e6edf3",
12
+ hintColor: "#8b949e",
13
+ modalBackdrop: "rgba(1, 4, 9, 0.64)",
14
+ modalBackground: "#161b22",
15
+ modalBorder: "#30363d",
16
+ modalForeground: "#e6edf3",
17
+ modalMuted: "#8b949e",
18
+ modalSelectedBackground: "#1f6feb33",
19
+ modalSelectedBorder: "#2f81f7",
20
+ modalSelectedForeground: "#79c0ff",
21
+ },
22
+ terminal: {
23
+ background: "#0d1117",
24
+ foreground: "#e6edf3",
25
+ cursor: "#2f81f7",
26
+ cursorAccent: "#0d1117",
27
+ selectionBackground: "rgba(56, 139, 253, 0.28)",
28
+ black: "#484f58",
29
+ red: "#ff7b72",
30
+ green: "#3fb950",
31
+ yellow: "#d29922",
32
+ blue: "#58a6ff",
33
+ magenta: "#bc8cff",
34
+ cyan: "#39c5cf",
35
+ white: "#b1bac4",
36
+ brightBlack: "#6e7681",
37
+ brightRed: "#ffa198",
38
+ brightGreen: "#56d364",
39
+ brightYellow: "#e3b341",
40
+ brightBlue: "#79c0ff",
41
+ brightMagenta: "#d2a8ff",
42
+ brightCyan: "#56d4dd",
43
+ brightWhite: "#f0f6fc",
44
+ },
45
+ tui: {
46
+ surface: "#0d1117",
47
+ activeHighlightBackground: "#1f4b7a",
48
+ activeHighlightForeground: "#f0f6fc",
49
+ selectionBackground: "#79c0ff",
50
+ selectionForeground: "#0d1117",
51
+ promptCursorBackground: "#2f81f7",
52
+ promptCursorForeground: "#0d1117",
53
+ },
54
+ });
55
+
56
+ export default githubDarkTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const gruvboxDarkTheme = createTheme({
4
+ id: "gruvbox-dark",
5
+ label: "Gruvbox Dark",
6
+ description: "Retro warm palette with earthy browns, oranges, and high readability.",
7
+ page: {
8
+ background: "#282828",
9
+ foreground: "#ebdbb2",
10
+ overlayBackground: "#282828",
11
+ overlayForeground: "#ebdbb2",
12
+ hintColor: "#a89984",
13
+ modalBackdrop: "rgba(40, 40, 40, 0.74)",
14
+ modalBackground: "#3c3836",
15
+ modalBorder: "#504945",
16
+ modalForeground: "#ebdbb2",
17
+ modalMuted: "#a89984",
18
+ modalSelectedBackground: "#504945",
19
+ modalSelectedBorder: "#fabd2f",
20
+ modalSelectedForeground: "#fbf1c7",
21
+ },
22
+ terminal: {
23
+ background: "#282828",
24
+ foreground: "#ebdbb2",
25
+ cursor: "#ebdbb2",
26
+ cursorAccent: "#282828",
27
+ selectionBackground: "rgba(250, 189, 47, 0.22)",
28
+ black: "#282828",
29
+ red: "#cc241d",
30
+ green: "#98971a",
31
+ yellow: "#d79921",
32
+ blue: "#458588",
33
+ magenta: "#b16286",
34
+ cyan: "#689d6a",
35
+ white: "#a89984",
36
+ brightBlack: "#928374",
37
+ brightRed: "#fb4934",
38
+ brightGreen: "#b8bb26",
39
+ brightYellow: "#fabd2f",
40
+ brightBlue: "#83a598",
41
+ brightMagenta: "#d3869b",
42
+ brightCyan: "#8ec07c",
43
+ brightWhite: "#ebdbb2",
44
+ },
45
+ tui: {
46
+ surface: "#282828",
47
+ activeHighlightBackground: "#504945",
48
+ activeHighlightForeground: "#fbf1c7",
49
+ selectionBackground: "#fabd2f",
50
+ selectionForeground: "#282828",
51
+ promptCursorBackground: "#ebdbb2",
52
+ promptCursorForeground: "#282828",
53
+ },
54
+ });
55
+
56
+ export default gruvboxDarkTheme;
@@ -0,0 +1,56 @@
1
+ import { createTheme } from "./helpers.js";
2
+
3
+ const hackerXMatrixTheme = createTheme({
4
+ id: "hacker-x-matrix",
5
+ label: "Hacker X - Matrix",
6
+ description: "Black-and-phosphor terminal palette with vivid green glow and CRT-style contrast.",
7
+ page: {
8
+ background: "#030603",
9
+ foreground: "#c8ffc8",
10
+ overlayBackground: "#030603",
11
+ overlayForeground: "#c8ffc8",
12
+ hintColor: "#59a659",
13
+ modalBackdrop: "rgba(0, 6, 0, 0.82)",
14
+ modalBackground: "#081208",
15
+ modalBorder: "#1f5f1f",
16
+ modalForeground: "#d6ffd6",
17
+ modalMuted: "#6dbb6d",
18
+ modalSelectedBackground: "#0f240f",
19
+ modalSelectedBorder: "#39ff14",
20
+ modalSelectedForeground: "#dfffdf",
21
+ },
22
+ terminal: {
23
+ background: "#000000",
24
+ foreground: "#c8ffc8",
25
+ cursor: "#39ff14",
26
+ cursorAccent: "#000000",
27
+ selectionBackground: "rgba(57, 255, 20, 0.2)",
28
+ black: "#031003",
29
+ red: "#39ff14",
30
+ green: "#2a7a22",
31
+ yellow: "#4a8a30",
32
+ blue: "#1a6a4a",
33
+ magenta: "#2a7a3a",
34
+ cyan: "#2a8a5a",
35
+ white: "#b7f7b7",
36
+ brightBlack: "#59a659",
37
+ brightRed: "#9aff86",
38
+ brightGreen: "#7dff66",
39
+ brightYellow: "#e0ff8a",
40
+ brightBlue: "#61ffc2",
41
+ brightMagenta: "#b4ffb4",
42
+ brightCyan: "#98ffe0",
43
+ brightWhite: "#e8ffe8",
44
+ },
45
+ tui: {
46
+ surface: "#030603",
47
+ activeHighlightBackground: "#1a3a1a",
48
+ activeHighlightForeground: "#e8ffe8",
49
+ selectionBackground: "#39ff14",
50
+ selectionForeground: "#000000",
51
+ promptCursorBackground: "#39ff14",
52
+ promptCursorForeground: "#000000",
53
+ },
54
+ });
55
+
56
+ export default hackerXMatrixTheme;