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.
- package/README.md +56 -2
- package/dist/bin/auq.js +36 -3
- package/dist/bin/tui-app.js +30 -15
- package/dist/package.json +7 -2
- package/dist/src/__tests__/schema-validation.test.js +61 -1
- package/dist/src/cli/commands/__tests__/fetch-answers.test.js +310 -0
- package/dist/src/cli/commands/__tests__/history.test.js +211 -0
- package/dist/src/cli/commands/answer.js +11 -0
- package/dist/src/cli/commands/config.js +48 -0
- package/dist/src/cli/commands/fetch-answers.js +205 -0
- package/dist/src/cli/commands/history.js +375 -0
- package/dist/src/config/__tests__/ConfigLoader.test.js +38 -0
- package/dist/src/config/defaults.js +1 -0
- package/dist/src/config/types.js +1 -0
- package/dist/src/core/ask-user-questions.js +63 -0
- package/dist/src/i18n/locales/en.js +2 -2
- package/dist/src/server.js +59 -2
- package/dist/src/session/ResponseFormatter.js +79 -2
- package/dist/src/session/SessionManager.js +36 -0
- package/dist/src/session/__tests__/ResponseFormatter.test.js +86 -0
- package/dist/src/session/__tests__/SessionManager.test.js +129 -0
- package/dist/src/shared/schemas.js +8 -0
- package/dist/src/tui/ThemeProvider.js +3 -3
- package/dist/src/tui/components/Header.js +2 -1
- package/dist/src/tui/components/OptionsList.js +1 -1
- package/dist/src/tui/components/SessionPicker.js +1 -1
- package/dist/src/tui/components/StepperView.js +1 -1
- package/dist/src/tui/components/__tests__/ConfirmationDialog.test.js +1 -1
- package/dist/src/tui/components/__tests__/Footer.test.js +1 -1
- package/dist/src/tui/components/__tests__/MarkdownPrompt.test.js +1 -1
- package/dist/src/tui/components/__tests__/ReviewScreen.test.js +1 -1
- package/dist/src/tui/components/__tests__/SessionDots.test.js +1 -1
- package/dist/src/tui/components/__tests__/SessionPicker.test.js +1 -1
- package/dist/src/tui/components/__tests__/StepperView.abandoned.test.js +1 -1
- package/dist/src/tui/components/__tests__/StepperView.keyboard.test.js +1 -1
- package/dist/src/tui/components/__tests__/StepperView.state.test.js +1 -1
- package/dist/src/tui/components/__tests__/WaitingScreen.test.js +1 -1
- package/dist/src/tui/shared/session-events.js +4 -0
- package/dist/src/tui/shared/themes/catppuccin-latte.js +130 -0
- package/dist/src/tui/shared/themes/catppuccin-mocha.js +131 -0
- package/dist/src/tui/shared/themes/dark.js +131 -0
- package/dist/src/tui/shared/themes/dracula.js +131 -0
- package/dist/src/tui/shared/themes/github-dark.js +129 -0
- package/dist/src/tui/shared/themes/github-light.js +129 -0
- package/dist/src/tui/shared/themes/gruvbox-dark.js +130 -0
- package/dist/src/tui/shared/themes/gruvbox-light.js +130 -0
- package/dist/src/tui/shared/themes/index.js +70 -0
- package/dist/src/tui/shared/themes/light.js +130 -0
- package/dist/src/tui/shared/themes/loader.js +111 -0
- package/dist/src/tui/shared/themes/monokai.js +132 -0
- package/dist/src/tui/shared/themes/nord.js +130 -0
- package/dist/src/tui/shared/themes/one-dark.js +131 -0
- package/dist/src/tui/shared/themes/rose-pine.js +131 -0
- package/dist/src/tui/shared/themes/solarized-dark.js +130 -0
- package/dist/src/tui/shared/themes/solarized-light.js +130 -0
- package/dist/src/tui/shared/themes/tokyo-night.js +131 -0
- package/dist/src/tui/shared/themes/types.js +1 -0
- package/dist/src/tui/shared/types.js +1 -0
- package/dist/src/tui/shared/utils/config.js +80 -0
- package/dist/src/tui/shared/utils/detectTheme.js +33 -0
- package/dist/src/tui/shared/utils/index.js +6 -0
- package/dist/src/tui/shared/utils/recommended.js +52 -0
- package/dist/src/tui/shared/utils/relativeTime.js +24 -0
- package/dist/src/tui/shared/utils/sessionSwitching.js +56 -0
- package/dist/src/tui/shared/utils/staleDetection.js +51 -0
- package/dist/src/tui/themes/catppuccin-latte.js +2 -127
- package/dist/src/tui/themes/catppuccin-mocha.js +2 -127
- package/dist/src/tui/themes/dark.js +2 -128
- package/dist/src/tui/themes/dracula.js +2 -127
- package/dist/src/tui/themes/github-dark.js +2 -126
- package/dist/src/tui/themes/github-light.js +2 -126
- package/dist/src/tui/themes/gruvbox-dark.js +2 -127
- package/dist/src/tui/themes/gruvbox-light.js +2 -127
- package/dist/src/tui/themes/index.js +2 -70
- package/dist/src/tui/themes/light.js +2 -127
- package/dist/src/tui/themes/loader.js +2 -111
- package/dist/src/tui/themes/monokai.js +2 -128
- package/dist/src/tui/themes/nord.js +2 -127
- package/dist/src/tui/themes/one-dark.js +2 -127
- package/dist/src/tui/themes/rose-pine.js +2 -128
- package/dist/src/tui/themes/solarized-dark.js +2 -127
- package/dist/src/tui/themes/solarized-light.js +2 -127
- package/dist/src/tui/themes/tokyo-night.js +2 -127
- package/dist/src/tui/themes/types.js +2 -1
- package/dist/src/tui/types.js +1 -1
- package/dist/src/tui/utils/__tests__/recommended.test.js +1 -1
- package/dist/src/tui/utils/__tests__/relativeTime.test.js +1 -1
- package/dist/src/tui/utils/__tests__/sessionSwitching.test.js +1 -1
- package/dist/src/tui/utils/__tests__/staleDetection.test.js +1 -1
- package/dist/src/tui/utils/config.js +1 -80
- package/dist/src/tui/utils/detectTheme.js +1 -22
- package/dist/src/tui/utils/recommended.js +1 -52
- package/dist/src/tui/utils/relativeTime.js +1 -24
- package/dist/src/tui/utils/sessionSwitching.js +1 -56
- package/dist/src/tui/utils/staleDetection.js +1 -51
- 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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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";
|