auq-mcp-server 2.6.3 → 2.7.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 (96) hide show
  1. package/README.md +56 -2
  2. package/dist/bin/auq.js +36 -3
  3. package/dist/bin/tui-app.js +30 -15
  4. package/dist/package.json +7 -2
  5. package/dist/src/__tests__/schema-validation.test.js +61 -1
  6. package/dist/src/cli/commands/__tests__/fetch-answers.test.js +310 -0
  7. package/dist/src/cli/commands/__tests__/history.test.js +211 -0
  8. package/dist/src/cli/commands/answer.js +11 -0
  9. package/dist/src/cli/commands/config.js +48 -0
  10. package/dist/src/cli/commands/fetch-answers.js +205 -0
  11. package/dist/src/cli/commands/history.js +375 -0
  12. package/dist/src/config/__tests__/ConfigLoader.test.js +38 -0
  13. package/dist/src/config/defaults.js +1 -0
  14. package/dist/src/config/types.js +1 -0
  15. package/dist/src/core/ask-user-questions.js +63 -0
  16. package/dist/src/i18n/locales/en.js +2 -2
  17. package/dist/src/server.js +59 -2
  18. package/dist/src/session/ResponseFormatter.js +79 -2
  19. package/dist/src/session/SessionManager.js +36 -0
  20. package/dist/src/session/__tests__/ResponseFormatter.test.js +86 -0
  21. package/dist/src/session/__tests__/SessionManager.test.js +129 -0
  22. package/dist/src/shared/schemas.js +8 -0
  23. package/dist/src/tui/ThemeProvider.js +3 -3
  24. package/dist/src/tui/components/Header.js +2 -1
  25. package/dist/src/tui/components/OptionsList.js +1 -1
  26. package/dist/src/tui/components/SessionPicker.js +1 -1
  27. package/dist/src/tui/components/StepperView.js +1 -1
  28. package/dist/src/tui/components/__tests__/ConfirmationDialog.test.js +1 -1
  29. package/dist/src/tui/components/__tests__/Footer.test.js +1 -1
  30. package/dist/src/tui/components/__tests__/MarkdownPrompt.test.js +1 -1
  31. package/dist/src/tui/components/__tests__/ReviewScreen.test.js +1 -1
  32. package/dist/src/tui/components/__tests__/SessionDots.test.js +1 -1
  33. package/dist/src/tui/components/__tests__/SessionPicker.test.js +1 -1
  34. package/dist/src/tui/components/__tests__/StepperView.abandoned.test.js +1 -1
  35. package/dist/src/tui/components/__tests__/StepperView.keyboard.test.js +1 -1
  36. package/dist/src/tui/components/__tests__/StepperView.state.test.js +1 -1
  37. package/dist/src/tui/components/__tests__/WaitingScreen.test.js +1 -1
  38. package/dist/src/tui/shared/session-events.js +4 -0
  39. package/dist/src/tui/shared/themes/catppuccin-latte.js +130 -0
  40. package/dist/src/tui/shared/themes/catppuccin-mocha.js +131 -0
  41. package/dist/src/tui/shared/themes/dark.js +131 -0
  42. package/dist/src/tui/shared/themes/dracula.js +131 -0
  43. package/dist/src/tui/shared/themes/github-dark.js +129 -0
  44. package/dist/src/tui/shared/themes/github-light.js +129 -0
  45. package/dist/src/tui/shared/themes/gruvbox-dark.js +130 -0
  46. package/dist/src/tui/shared/themes/gruvbox-light.js +130 -0
  47. package/dist/src/tui/shared/themes/index.js +70 -0
  48. package/dist/src/tui/shared/themes/light.js +130 -0
  49. package/dist/src/tui/shared/themes/loader.js +111 -0
  50. package/dist/src/tui/shared/themes/monokai.js +132 -0
  51. package/dist/src/tui/shared/themes/nord.js +130 -0
  52. package/dist/src/tui/shared/themes/one-dark.js +131 -0
  53. package/dist/src/tui/shared/themes/rose-pine.js +131 -0
  54. package/dist/src/tui/shared/themes/solarized-dark.js +130 -0
  55. package/dist/src/tui/shared/themes/solarized-light.js +130 -0
  56. package/dist/src/tui/shared/themes/tokyo-night.js +131 -0
  57. package/dist/src/tui/shared/themes/types.js +1 -0
  58. package/dist/src/tui/shared/types.js +1 -0
  59. package/dist/src/tui/shared/utils/config.js +80 -0
  60. package/dist/src/tui/shared/utils/detectTheme.js +33 -0
  61. package/dist/src/tui/shared/utils/index.js +6 -0
  62. package/dist/src/tui/shared/utils/recommended.js +52 -0
  63. package/dist/src/tui/shared/utils/relativeTime.js +24 -0
  64. package/dist/src/tui/shared/utils/sessionSwitching.js +56 -0
  65. package/dist/src/tui/shared/utils/staleDetection.js +51 -0
  66. package/dist/src/tui/themes/catppuccin-latte.js +2 -127
  67. package/dist/src/tui/themes/catppuccin-mocha.js +2 -127
  68. package/dist/src/tui/themes/dark.js +2 -128
  69. package/dist/src/tui/themes/dracula.js +2 -127
  70. package/dist/src/tui/themes/github-dark.js +2 -126
  71. package/dist/src/tui/themes/github-light.js +2 -126
  72. package/dist/src/tui/themes/gruvbox-dark.js +2 -127
  73. package/dist/src/tui/themes/gruvbox-light.js +2 -127
  74. package/dist/src/tui/themes/index.js +2 -70
  75. package/dist/src/tui/themes/light.js +2 -127
  76. package/dist/src/tui/themes/loader.js +2 -111
  77. package/dist/src/tui/themes/monokai.js +2 -128
  78. package/dist/src/tui/themes/nord.js +2 -127
  79. package/dist/src/tui/themes/one-dark.js +2 -127
  80. package/dist/src/tui/themes/rose-pine.js +2 -128
  81. package/dist/src/tui/themes/solarized-dark.js +2 -127
  82. package/dist/src/tui/themes/solarized-light.js +2 -127
  83. package/dist/src/tui/themes/tokyo-night.js +2 -127
  84. package/dist/src/tui/themes/types.js +2 -1
  85. package/dist/src/tui/types.js +1 -1
  86. package/dist/src/tui/utils/__tests__/recommended.test.js +1 -1
  87. package/dist/src/tui/utils/__tests__/relativeTime.test.js +1 -1
  88. package/dist/src/tui/utils/__tests__/sessionSwitching.test.js +1 -1
  89. package/dist/src/tui/utils/__tests__/staleDetection.test.js +1 -1
  90. package/dist/src/tui/utils/config.js +1 -80
  91. package/dist/src/tui/utils/detectTheme.js +1 -22
  92. package/dist/src/tui/utils/recommended.js +1 -52
  93. package/dist/src/tui/utils/relativeTime.js +1 -24
  94. package/dist/src/tui/utils/sessionSwitching.js +1 -56
  95. package/dist/src/tui/utils/staleDetection.js +1 -51
  96. package/package.json +7 -2
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Utility for detecting recommended options in question labels.
3
+ * Supports multiple languages and bracket styles.
4
+ */
5
+ /**
6
+ * Regex patterns for detecting recommended markers in labels.
7
+ * Requires matching delimiters: either (word) or [word].
8
+ * Matches case-insensitively and supports both parentheses and brackets.
9
+ */
10
+ export const RECOMMENDED_PATTERNS = {
11
+ /** Matches (recommended) or [recommended] - case insensitive, requires matching delimiters */
12
+ EN: /(?:\(recommended\)|\[recommended\])/i,
13
+ /** Matches (추천) or [추천] - requires matching delimiters */
14
+ KO: /(?:\(추천\)|\[추천\])/,
15
+ };
16
+ /**
17
+ * Combined regex for detecting any recommended pattern.
18
+ * Requires matching delimiters: either (word) or [word].
19
+ * Matches case-insensitively for English, exactly for Korean.
20
+ */
21
+ const RECOMMENDED_REGEX = /(?:\(recommended\)|\[recommended\]|\(추천\)|\[추천\])/i;
22
+ /**
23
+ * Detects if a label contains a recommended pattern.
24
+ * Supports English "recommended" and Korean "추천" in parentheses or brackets.
25
+ * Case-insensitive matching.
26
+ *
27
+ * @param label - The option label to check
28
+ * @returns true if the label contains a recommended marker
29
+ *
30
+ * @example
31
+ * isRecommendedOption("Option A (recommended)") // true
32
+ * isRecommendedOption("[추천] Option B") // true
33
+ * isRecommendedOption("Option C") // false
34
+ */
35
+ export function isRecommendedOption(label) {
36
+ return RECOMMENDED_REGEX.test(label);
37
+ }
38
+ /**
39
+ * Extracts the clean label by removing recommended markers.
40
+ * Removes recommended patterns and trims whitespace.
41
+ *
42
+ * @param label - The option label with potential recommended marker
43
+ * @returns The clean label without recommended markers
44
+ *
45
+ * @example
46
+ * extractCleanLabel("Option A (recommended)") // "Option A"
47
+ * extractCleanLabel("[추천] Option B") // "Option B"
48
+ * extractCleanLabel(" Option C ") // "Option C"
49
+ */
50
+ export function extractCleanLabel(label) {
51
+ return label.replace(RECOMMENDED_REGEX, "").trim().replace(/\s+/g, " ");
52
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Format a timestamp as a concise relative time string.
3
+ *
4
+ * @param date - A Date object or a numeric epoch-ms timestamp
5
+ * @returns Human-readable label such as "just now", "12s ago", "3m ago"
6
+ */
7
+ export function formatRelativeTime(date) {
8
+ const now = Date.now();
9
+ const then = typeof date === "number" ? date : date.getTime();
10
+ const diffMs = Math.max(0, now - then);
11
+ const diffSec = Math.floor(diffMs / 1000);
12
+ if (diffSec < 5)
13
+ return "just now";
14
+ if (diffSec < 60)
15
+ return `${diffSec}s ago`;
16
+ const diffMin = Math.floor(diffSec / 60);
17
+ if (diffMin < 60)
18
+ return `${diffMin}m ago`;
19
+ const diffHr = Math.floor(diffMin / 60);
20
+ if (diffHr < 24)
21
+ return `${diffHr}h ago`;
22
+ const diffDay = Math.floor(diffHr / 24);
23
+ return `${diffDay}d ago`;
24
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Calculate the next session index with cyclic wrap-around.
3
+ * Returns current index if queue has <= 1 item.
4
+ */
5
+ export function getNextSessionIndex(currentIndex, queueLength) {
6
+ if (queueLength <= 1) {
7
+ return currentIndex;
8
+ }
9
+ return (currentIndex + 1) % queueLength;
10
+ }
11
+ /**
12
+ * Calculate the previous session index with cyclic wrap-around.
13
+ * Returns current index if queue has <= 1 item.
14
+ */
15
+ export function getPrevSessionIndex(currentIndex, queueLength) {
16
+ if (queueLength <= 1) {
17
+ return currentIndex;
18
+ }
19
+ return (currentIndex - 1 + queueLength) % queueLength;
20
+ }
21
+ /**
22
+ * Validate and return the target index for a direct jump (1-based input).
23
+ * Returns null if the jump is invalid (out of range, same as current).
24
+ */
25
+ export function getDirectJumpIndex(keyNumber, currentIndex, queueLength) {
26
+ if (keyNumber < 1 || keyNumber > 9) {
27
+ return null;
28
+ }
29
+ const targetIndex = keyNumber - 1;
30
+ if (targetIndex >= queueLength) {
31
+ return null;
32
+ }
33
+ if (targetIndex === currentIndex) {
34
+ return null;
35
+ }
36
+ return targetIndex;
37
+ }
38
+ /**
39
+ * Calculate the new active session index after removing a session.
40
+ * Handles: removal before active, removal at active, removal after active, queue becoming empty.
41
+ */
42
+ export function getAdjustedIndexAfterRemoval(removedIndex, activeIndex, newQueueLength) {
43
+ if (newQueueLength === 0) {
44
+ return 0;
45
+ }
46
+ if (removedIndex < activeIndex) {
47
+ return activeIndex - 1;
48
+ }
49
+ if (removedIndex > activeIndex) {
50
+ return activeIndex;
51
+ }
52
+ if (removedIndex < newQueueLength) {
53
+ return removedIndex;
54
+ }
55
+ return newQueueLength - 1;
56
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Stale Session Detection Utilities
3
+ *
4
+ * Pure functions for computing session staleness. No I/O or React dependencies.
5
+ * Design Decision 4: "Stale is computed flag, not persisted status"
6
+ * Design Decision 8: "Interaction resets stale check for that session"
7
+ */
8
+ /**
9
+ * Default grace period in milliseconds (30 minutes).
10
+ * If a user interacted with a session within this window, it is not considered stale.
11
+ */
12
+ export const DEFAULT_GRACE_PERIOD = 1800000; // 30 minutes
13
+ /**
14
+ * Determine whether a session should be considered stale based on its age,
15
+ * a configurable threshold, and an optional last-interaction timestamp.
16
+ *
17
+ * @param requestTimestamp - When the session was originally created (epoch ms)
18
+ * @param staleThreshold - Maximum allowed age before a session is stale (ms)
19
+ * @param lastInteraction - Last time the user interacted with this session (epoch ms)
20
+ * @param gracePeriod - Time after an interaction during which the session is not stale (ms)
21
+ * @returns true if the session is stale
22
+ */
23
+ export function isSessionStale(requestTimestamp, staleThreshold, lastInteraction, gracePeriod = DEFAULT_GRACE_PERIOD) {
24
+ const now = Date.now();
25
+ // If the user interacted recently (within grace period), session is not stale
26
+ if (lastInteraction && now - lastInteraction < gracePeriod) {
27
+ return false;
28
+ }
29
+ return now - requestTimestamp > staleThreshold;
30
+ }
31
+ /**
32
+ * Check whether a session has been explicitly marked as abandoned
33
+ * (e.g. AI disconnected).
34
+ *
35
+ * @param status - The session's current status string
36
+ * @returns true if status is "abandoned"
37
+ */
38
+ export function isSessionAbandoned(status) {
39
+ return status === "abandoned";
40
+ }
41
+ /**
42
+ * Build a human-readable toast message for a stale session.
43
+ *
44
+ * @param sessionTitle - Display name or ID of the session
45
+ * @param createdAtMs - Session creation time in epoch milliseconds
46
+ * @returns Formatted message string
47
+ */
48
+ export function formatStaleToastMessage(sessionTitle, createdAtMs) {
49
+ const hoursAgo = Math.floor((Date.now() - createdAtMs) / 3600000);
50
+ return `Session "${sessionTitle}" may be orphaned (created ${hoursAgo}h ago)`;
51
+ }
@@ -1,127 +1,2 @@
1
- /**
2
- * Catppuccin Latte Theme
3
- * Soothing pastel theme - light flavor.
4
- * https://github.com/catppuccin/catppuccin
5
- */
6
- export const catppuccinLatteTheme = {
7
- name: "catppuccin-latte",
8
- gradient: {
9
- start: "#1e66f5", // blue
10
- middle: "#8839ef", // mauve
11
- end: "#1e66f5",
12
- },
13
- colors: {
14
- primary: "#1e66f5", // blue
15
- success: "#40a02b", // green
16
- warning: "#df8e1d", // yellow
17
- error: "#d20f39", // red
18
- info: "#04a5e5", // sky
19
- focused: "#1e66f5",
20
- selected: "#40a02b",
21
- pending: "#fe640b", // peach
22
- unansweredHighlight: "#d20f39",
23
- text: "#4c4f69", // text
24
- textDim: "#acb0c0", // overlay0 lightened
25
- textBold: "#4c4f69",
26
- },
27
- borders: {
28
- primary: "#1e66f5",
29
- warning: "#df8e1d",
30
- error: "#d20f39",
31
- neutral: "#ccd0da", // surface0
32
- },
33
- components: {
34
- header: {
35
- border: "#9ca0b0", // overlay0 - slightly more visible
36
- queueActive: "#1e66f5",
37
- queueEmpty: "#acb0c0",
38
- queueFlash: "#8839ef",
39
- pillBg: "#ccd0da",
40
- },
41
- directory: {
42
- label: "#acb0c0",
43
- path: "#4c4f69",
44
- },
45
- tabBar: {
46
- selected: "#4c4f69",
47
- selectedBg: "#ccd0da",
48
- default: "#acb0c0",
49
- answered: "#40a02b",
50
- unanswered: "#acb0c0",
51
- divider: "#ccd0da",
52
- },
53
- options: {
54
- focused: "#40a02b",
55
- focusedBg: "#ccd0da",
56
- selected: "#1e66f5",
57
- selectedBg: "#ccd0da",
58
- default: "#4c4f69",
59
- description: "#6c6f85", // subtext0 - darker for readability
60
- hint: "#6c6f85", // subtext0 - darker for readability
61
- },
62
- input: {
63
- border: "#ccd0da",
64
- borderFocused: "#1e66f5",
65
- placeholder: "#acb0c0",
66
- cursor: "#1e66f5",
67
- cursorDim: "#8839ef",
68
- },
69
- review: {
70
- border: "#ccd0da",
71
- confirmBorder: "#1e66f5",
72
- selectedOption: "#40a02b",
73
- customAnswer: "#df8e1d",
74
- questionId: "#acb0c0",
75
- divider: "#ccd0da",
76
- },
77
- questionDisplay: {
78
- questionId: "#1e66f5",
79
- typeIndicator: "#acb0c0",
80
- elapsed: "#acb0c0",
81
- },
82
- footer: {
83
- border: "#ccd0da",
84
- keyBg: "#ccd0da",
85
- keyFg: "#1e66f5",
86
- action: "#7c7f93", // overlay1 - darker for visibility
87
- separator: "#ccd0da",
88
- },
89
- toast: {
90
- success: "#40a02b",
91
- successPillBg: "#dce0e8",
92
- error: "#d20f39",
93
- info: "#1e66f5",
94
- warning: "#df8e1d",
95
- border: "#ccd0da",
96
- },
97
- markdown: {
98
- codeBlockBg: "#eff1f5",
99
- codeBlockText: "#4c4f69",
100
- codeBlockBorder: "#ccd0da",
101
- },
102
- sessionDots: {
103
- active: "#1e66f5",
104
- answered: "#40a02b",
105
- inProgress: "#df8e1d",
106
- untouched: "#acb0c0",
107
- number: "#4c4f69",
108
- activeNumber: "#1e66f5",
109
- stale: "#df8e1d",
110
- abandoned: "#d20f39",
111
- },
112
- sessionPicker: {
113
- border: "#1e66f5",
114
- title: "#1e66f5",
115
- rowText: "#4c4f69",
116
- rowDim: "#acb0c0",
117
- highlightBg: "#ccd0da",
118
- highlightFg: "#40a02b",
119
- activeMark: "#1e66f5",
120
- progress: "#04a5e5",
121
- staleIcon: "#df8e1d",
122
- staleText: "#df8e1d",
123
- staleAge: "#df8e1d",
124
- staleSubtitle: "#acb0c0",
125
- },
126
- },
127
- };
1
+ // Re-export from shared location for backward compatibility
2
+ export * from "../shared/themes/catppuccin-latte.js";
@@ -1,127 +1,2 @@
1
- /**
2
- * Catppuccin Mocha Theme
3
- * Soothing pastel theme - darkest flavor.
4
- * https://github.com/catppuccin/catppuccin
5
- */
6
- export const catppuccinMochaTheme = {
7
- name: "catppuccin-mocha",
8
- gradient: {
9
- start: "#89b4fa", // blue
10
- middle: "#cba6f7", // mauve
11
- end: "#89b4fa",
12
- },
13
- colors: {
14
- primary: "#89b4fa", // blue
15
- success: "#a6e3a1", // green
16
- warning: "#f9e2af", // yellow
17
- error: "#f38ba8", // red
18
- info: "#89dceb", // sky
19
- focused: "#89b4fa",
20
- selected: "#a6e3a1",
21
- pending: "#fab387", // peach
22
- unansweredHighlight: "#f38ba8",
23
- text: "#cdd6f4", // text
24
- textDim: "#8688a0", // overlay0 brightened
25
- textBold: "#cdd6f4",
26
- },
27
- borders: {
28
- primary: "#89b4fa",
29
- warning: "#f9e2af",
30
- error: "#f38ba8",
31
- neutral: "#313244", // surface0
32
- },
33
- components: {
34
- header: {
35
- border: "#45475a", // surface1 - slightly more visible
36
- queueActive: "#89b4fa",
37
- queueEmpty: "#8688a0",
38
- queueFlash: "#cba6f7",
39
- pillBg: "#313244",
40
- },
41
- directory: {
42
- label: "#8688a0",
43
- path: "#cdd6f4",
44
- },
45
- tabBar: {
46
- selected: "#cdd6f4",
47
- selectedBg: "#313244",
48
- default: "#8688a0",
49
- answered: "#a6e3a1",
50
- unanswered: "#8688a0",
51
- divider: "#313244",
52
- },
53
- options: {
54
- focused: "#a6e3a1",
55
- focusedBg: "#313244",
56
- selected: "#89b4fa",
57
- selectedBg: "#313244",
58
- default: "#cdd6f4",
59
- description: "#a6adc8", // subtext0 - lighter for readability
60
- hint: "#a6adc8", // subtext0 - lighter for readability
61
- },
62
- input: {
63
- border: "#313244",
64
- borderFocused: "#89b4fa",
65
- placeholder: "#8688a0",
66
- cursor: "#89b4fa",
67
- cursorDim: "#cba6f7",
68
- },
69
- review: {
70
- border: "#313244",
71
- confirmBorder: "#89b4fa",
72
- selectedOption: "#a6e3a1",
73
- customAnswer: "#f9e2af",
74
- questionId: "#8688a0",
75
- divider: "#313244",
76
- },
77
- questionDisplay: {
78
- questionId: "#89b4fa",
79
- typeIndicator: "#8688a0",
80
- elapsed: "#8688a0",
81
- },
82
- footer: {
83
- border: "#313244",
84
- keyBg: "#313244",
85
- keyFg: "#89b4fa",
86
- action: "#9399b2", // overlay2 - brighter for visibility
87
- separator: "#313244",
88
- },
89
- toast: {
90
- success: "#a6e3a1",
91
- successPillBg: "#313244",
92
- error: "#f38ba8",
93
- info: "#89b4fa",
94
- warning: "#f9e2af",
95
- border: "#313244",
96
- },
97
- markdown: {
98
- codeBlockBg: "#1e1e2e",
99
- codeBlockText: "#cdd6f4",
100
- codeBlockBorder: "#313244",
101
- },
102
- sessionDots: {
103
- active: "#89b4fa",
104
- answered: "#a6e3a1",
105
- inProgress: "#f9e2af",
106
- untouched: "#8688a0",
107
- number: "#cdd6f4",
108
- activeNumber: "#89b4fa",
109
- stale: "#f9e2af",
110
- abandoned: "#f38ba8",
111
- },
112
- sessionPicker: {
113
- border: "#89b4fa",
114
- title: "#89b4fa",
115
- rowText: "#cdd6f4",
116
- rowDim: "#8688a0",
117
- highlightBg: "#313244",
118
- highlightFg: "#a6e3a1",
119
- activeMark: "#89b4fa",
120
- progress: "#89dceb",
121
- staleIcon: "#f9e2af",
122
- staleText: "#f9e2af",
123
- staleAge: "#f9e2af",
124
- staleSubtitle: "#8688a0",
125
- },
126
- },
127
- };
1
+ // Re-export from shared location for backward compatibility
2
+ export * from "../shared/themes/catppuccin-mocha.js";
@@ -1,128 +1,2 @@
1
- /**
2
- * Visual direction: graphite + electric-cyan accent.
3
- * Keep the palette tight; lean on neutrals for structure.
4
- *
5
- * This is the original AUQ theme, optimized for dark terminals.
6
- */
7
- export const darkTheme = {
8
- name: "AUQ dark",
9
- gradient: {
10
- start: "#46D9FF",
11
- middle: "#B8F2FF",
12
- end: "#46D9FF",
13
- },
14
- colors: {
15
- primary: "#46D9FF",
16
- success: "#5AF78E",
17
- warning: "#FFD36A",
18
- error: "#FF5C57",
19
- info: "#46D9FF",
20
- focused: "#46D9FF",
21
- selected: "#5AF78E",
22
- pending: "#FFD36A",
23
- unansweredHighlight: "#FF6B6B",
24
- text: "#E7EEF5",
25
- textDim: "#A0AAB4",
26
- textBold: "#F5FAFF",
27
- },
28
- borders: {
29
- primary: "#46D9FF",
30
- warning: "#FFD36A",
31
- error: "#FF5C57",
32
- neutral: "#2A3238",
33
- },
34
- components: {
35
- header: {
36
- border: "#3D4852", // slightly more visible
37
- queueActive: "#46D9FF",
38
- queueEmpty: "#A0AAB4",
39
- queueFlash: "#B8F2FF",
40
- pillBg: "#0B1F26",
41
- },
42
- directory: {
43
- label: "#A0AAB4",
44
- path: "#E7EEF5",
45
- },
46
- tabBar: {
47
- selected: "#E7EEF5",
48
- selectedBg: "#0B1F26",
49
- default: "#A0AAB4",
50
- answered: "#5AF78E",
51
- unanswered: "#A0AAB4",
52
- divider: "#2A3238",
53
- },
54
- options: {
55
- focused: "#5AF78E",
56
- focusedBg: "#0F2417",
57
- selected: "#46D9FF",
58
- selectedBg: "#0B1F26",
59
- default: "#E7EEF5",
60
- description: "#A8B2BC",
61
- hint: "#A8B2BC",
62
- },
63
- input: {
64
- border: "#2A3238",
65
- borderFocused: "#46D9FF",
66
- placeholder: "#A0AAB4",
67
- cursor: "#46D9FF",
68
- cursorDim: "#B8F2FF",
69
- },
70
- review: {
71
- border: "#2A3238",
72
- confirmBorder: "#46D9FF",
73
- selectedOption: "#5AF78E",
74
- customAnswer: "#FFD36A",
75
- questionId: "#A0AAB4",
76
- divider: "#2A3238",
77
- },
78
- questionDisplay: {
79
- questionId: "#46D9FF",
80
- typeIndicator: "#A0AAB4",
81
- elapsed: "#A0AAB4",
82
- },
83
- footer: {
84
- border: "#2A3238",
85
- keyBg: "#0B1F26",
86
- keyFg: "#46D9FF",
87
- action: "#A8B2BC",
88
- separator: "#2A3238",
89
- },
90
- toast: {
91
- success: "#5AF78E",
92
- successPillBg: "#0F2417",
93
- error: "#FF5C57",
94
- info: "#46D9FF",
95
- warning: "#FFD36A",
96
- border: "#2A3238",
97
- },
98
- markdown: {
99
- codeBlockBg: "#0F1419",
100
- codeBlockText: "#E7EEF5",
101
- codeBlockBorder: "#2A3238",
102
- },
103
- sessionDots: {
104
- active: "#46D9FF",
105
- answered: "#5AF78E",
106
- inProgress: "#FFD36A",
107
- untouched: "#A0AAB4",
108
- number: "#E7EEF5",
109
- activeNumber: "#46D9FF",
110
- stale: "#FFD36A",
111
- abandoned: "#FF5C57",
112
- },
113
- sessionPicker: {
114
- border: "#46D9FF",
115
- title: "#46D9FF",
116
- rowText: "#E7EEF5",
117
- rowDim: "#A0AAB4",
118
- highlightBg: "#0F2417",
119
- highlightFg: "#5AF78E",
120
- activeMark: "#46D9FF",
121
- progress: "#46D9FF",
122
- staleIcon: "#FFD36A",
123
- staleText: "#FFD36A",
124
- staleAge: "#FFD36A",
125
- staleSubtitle: "#A0AAB4",
126
- },
127
- },
128
- };
1
+ // Re-export from shared location for backward compatibility
2
+ export * from "../shared/themes/dark.js";