nolo-cli 0.8.0-alpha.2 → 0.8.0-alpha.20
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 +1 -1
- package/_executeModel-WRUCQIV5.js +205 -0
- package/action-R4M4ORGA.js +28 -0
- package/addContentAction-UYFFTEWJ.js +26 -0
- package/addDialogAgentAction-OT4XZAVP.js +68 -0
- package/agentDeleteCommand-5DD2IM3J.js +327 -0
- package/agentEmailCommands-IASM2YBQ.js +628 -0
- package/agentListCommands-I6KZYCIG.js +223 -0
- package/agentMachineCommands-OUP3YQP7.js +425 -0
- package/agentPullCommand-O2MTUAFR.js +122 -0
- package/agentRecordCommands-QKGE2JTA.js +96 -0
- package/agentRunCommand-TVZXUBQ5.js +114 -0
- package/agentRunControl-K4VKNEHF.js +57 -0
- package/agentRuntimeLocal-ZYEIPTY4.js +104 -0
- package/agentSlice-T4PMW7W6.js +42 -0
- package/authCommand-EB5JSOX5.js +581 -0
- package/authCommands-XPEHTKSM.js +35 -0
- package/chunk-2EHX7F5G.js +1948 -0
- package/chunk-2FTTDCD4.js +675 -0
- package/chunk-3ASDTTEI.js +1774 -0
- package/chunk-3EUW3WEO.js +8 -0
- package/chunk-3LY4F7SV.js +9293 -0
- package/chunk-4CQLVGRV.js +50 -0
- package/chunk-4FBRSEV4.js +573 -0
- package/chunk-4IJYA27C.js +342 -0
- package/chunk-4QEWT7KD.js +933 -0
- package/chunk-4SN6J65J.js +38 -0
- package/chunk-4VNS5WPM.js +42 -0
- package/chunk-4ZDM73SD.js +34 -0
- package/chunk-5CS33IBL.js +301 -0
- package/chunk-5KLGBAAR.js +386 -0
- package/chunk-5MIDPSSK.js +206 -0
- package/chunk-5MMAK75Q.js +15 -0
- package/chunk-5W3VUFOX.js +34 -0
- package/chunk-63W5N6P3.js +150 -0
- package/chunk-6HYVJV7B.js +102 -0
- package/chunk-6WD3OOJS.js +20 -0
- package/chunk-7DAJ4AI4.js +191 -0
- package/chunk-7KCUSYT2.js +354 -0
- package/chunk-7T5PWAZN.js +171 -0
- package/chunk-AFON4QUU.js +112 -0
- package/chunk-AGFH73SK.js +239 -0
- package/chunk-ATNTHIZI.js +13 -0
- package/chunk-AVMKZHBC.js +85 -0
- package/chunk-AZPCASRE.js +36 -0
- package/chunk-BBYVOSU2.js +792 -0
- package/chunk-BCIOM4NZ.js +1078 -0
- package/chunk-C3RUNRHT.js +51 -0
- package/chunk-C4FTUXVF.js +146 -0
- package/chunk-CF2WZF4N.js +134 -0
- package/chunk-CF7PE763.js +10 -0
- package/chunk-CKOJQDKR.js +198 -0
- package/chunk-CMKUBIGW.js +1550 -0
- package/chunk-CWMSB67P.js +34 -0
- package/chunk-DCOA4QSN.js +105 -0
- package/chunk-DFFIZ25G.js +30 -0
- package/chunk-DWLEOOGR.js +8 -0
- package/chunk-DZ3XJVET.js +231 -0
- package/chunk-EHLHSX7R.js +1433 -0
- package/chunk-FM5IVZXO.js +4723 -0
- package/chunk-FVYY6MCS.js +1447 -0
- package/chunk-G3SUCT4W.js +8 -0
- package/chunk-GAKEBQD6.js +30 -0
- package/chunk-GBRG75BQ.js +86 -0
- package/chunk-GLYVN7EQ.js +238 -0
- package/chunk-H33743XH.js +25 -0
- package/chunk-HNMXYYJR.js +12 -0
- package/chunk-HNW7IJSK.js +71 -0
- package/chunk-I42VC5KR.js +15 -0
- package/chunk-IDZTNRP2.js +85 -0
- package/chunk-IHBCLYEE.js +22310 -0
- package/chunk-IJGXKGXW.js +421 -0
- package/chunk-ISNCLGUZ.js +146 -0
- package/chunk-IWX4UW2E.js +548 -0
- package/chunk-JBTJAPUF.js +35 -0
- package/chunk-JEXVIMYZ.js +55 -0
- package/chunk-JRKKFRAV.js +537 -0
- package/chunk-JZPBVBIY.js +94 -0
- package/chunk-K6BPOQLF.js +2052 -0
- package/chunk-K777STIO.js +478 -0
- package/chunk-KKY4B2Q2.js +21 -0
- package/chunk-KQHGZWSV.js +63 -0
- package/chunk-KUG52IAP.js +8 -0
- package/chunk-KX6YBIHG.js +8 -0
- package/chunk-LCBAMY2M.js +60 -0
- package/chunk-LM6IYQ3F.js +16 -0
- package/chunk-LTRXGFMS.js +83 -0
- package/chunk-M76ECQRD.js +13658 -0
- package/chunk-MNJDFJND.js +222 -0
- package/chunk-MRC4Q34M.js +188 -0
- package/chunk-MTU75CZ2.js +91 -0
- package/chunk-N54XAP77.js +19 -0
- package/chunk-O2ZNTTET.js +3272 -0
- package/chunk-O4BU24WZ.js +3212 -0
- package/chunk-OLZBQWZU.js +6 -0
- package/chunk-OPZYGHUC.js +89 -0
- package/chunk-OWOHNGCN.js +50 -0
- package/chunk-P3PKED2I.js +962 -0
- package/chunk-PFTAG6DY.js +1939 -0
- package/chunk-PMKQGGGM.js +221 -0
- package/chunk-PP4S6RTL.js +175 -0
- package/chunk-QJ7FZNYN.js +939 -0
- package/chunk-QSJ3HFEF.js +8 -0
- package/chunk-RGIM3WLT.js +113 -0
- package/chunk-RL776AGR.js +190 -0
- package/chunk-ROWQEJRP.js +139 -0
- package/chunk-S7Z2HMCN.js +25 -0
- package/chunk-SDJDLO5W.js +628 -0
- package/chunk-SOTZ6RDN.js +69 -0
- package/chunk-TILFE6LV.js +381 -0
- package/chunk-TIMLUWQA.js +231 -0
- package/chunk-TISCADJH.js +807 -0
- package/chunk-U4TRT5V4.js +246 -0
- package/chunk-U6VC4MU4.js +8 -0
- package/chunk-UAD2WT54.js +64 -0
- package/chunk-VC6OZXO5.js +298 -0
- package/chunk-VF4K2QE6.js +21 -0
- package/chunk-VHBWHNVT.js +59 -0
- package/chunk-VIDPVFP3.js +20 -0
- package/chunk-VP4WJWKW.js +8882 -0
- package/chunk-VVX233PH.js +482 -0
- package/chunk-W4NVOSFF.js +37 -0
- package/chunk-WI4XWASA.js +208 -0
- package/chunk-WWC7I6TA.js +8 -0
- package/chunk-WZSRQNQG.js +2587 -0
- package/chunk-XBROXIGL.js +3066 -0
- package/chunk-XENYHRUE.js +104 -0
- package/chunk-Y5GCAMGP.js +9 -0
- package/chunk-YN4XDB7B.js +9036 -0
- package/chunk-YPRZSPF3.js +148 -0
- package/chunk-Z4NR32XR.js +50 -0
- package/chunk-Z6EKEXJW.js +138 -0
- package/chunk-ZDRZMLKO.js +27339 -0
- package/chunk-ZNFJWEN4.js +56 -0
- package/cliExecutor-K3F7DMRO.js +36 -0
- package/clipboardy-BVE3LVEH.js +12001 -0
- package/createAgentAutomationAction-CCABEOM6.js +866 -0
- package/createDialogAction-YPKF5ITI.js +55 -0
- package/createPageAction-YEZ7EK5F.js +172 -0
- package/db-HCJ5PRB5.js +271 -0
- package/dbSlice-QPVZHBOE.js +60 -0
- package/deleteFile-SV5MS23W.js +41 -0
- package/dialogCommands-4IX4XIZE.js +63 -0
- package/dialogSlice-OVTO7QGW.js +148 -0
- package/docCreateCommands-SIL3NPGT.js +220 -0
- package/docDeleteCommands-7IOMLUS4.js +181 -0
- package/docReadCommands-FNFXUA5L.js +134 -0
- package/docStore-ZAYLW2HN.js +98 -0
- package/docUpdateCommands-X2HNDVUC.js +318 -0
- package/fetchMessages-KTNM7QAR.js +17 -0
- package/getPricing-3E6UNPKL.js +30 -0
- package/handleSendMessageAction-TZMZ4EP5.js +185 -0
- package/index.js +188 -112958
- package/lib-FYYBQIXS.js +19839 -0
- package/localDialogRead-2VRI24F4.js +26 -0
- package/localFirstLog-DHNOY2NA.js +19 -0
- package/localRuntimeAuthority-TEGCOWX4.js +471 -0
- package/localRuntimeDb-LGDF6FQP.js +12 -0
- package/machineCommands-M4ZJZIMS.js +781 -0
- package/machineInfo-M6KB6HZN.js +10 -0
- package/machineWsRunDispatch-TPJAUGLP.js +112 -0
- package/memoryCommands-O4MIPIWQ.js +476 -0
- package/models-4OPOOLFS.js +9 -0
- package/offlineMarxistsAgentCommand-BCPJITJL.js +242 -0
- package/package.json +4 -23
- package/read-EBMWX4Z6.js +17 -0
- package/readDocTool-2MWHSTQE.js +16 -0
- package/readlineWorkspace-OMCIU3WT.js +5682 -0
- package/removeDialogAgentAction-SNZ662NP.js +73 -0
- package/runAgentClientLoop-H6NGOUAM.js +293 -0
- package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
- package/setDialogExtraReferencesAction-XDI2KM2N.js +60 -0
- package/setPrimaryDialogAgentAction-PYEC4N4Z.js +80 -0
- package/settingSlice-NOWHY2FK.js +199 -0
- package/skillDiscovery-UGSQGX2U.js +16 -0
- package/skillSummaryMarker-42HKSXYY.js +9 -0
- package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
- package/slateUtils-2M7MUTWX.js +19 -0
- package/spaceCommands-E7VOF4LO.js +450 -0
- package/spaceSlice-QHBPICA2.js +149 -0
- package/streamAgentChatTurn-3XTBA2HN.js +4510 -0
- package/tableCommands-R5UCM63M.js +1286 -0
- package/toolApiClient-QI3YBNWB.js +26 -0
- package/tools-GHLZ3XD6.js +87 -0
- package/tuiSummaryLlmCaller-RV3THLZF.js +78 -0
- package/understanding-3CUQQ6SV.js +271 -0
- package/updateCommands-VOSPKXFF.js +31 -0
- package/updateDialogTitleAction-XA2OZTLP.js +188 -0
|
@@ -0,0 +1,2052 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parsePositiveFiniteNumberOrFallback
|
|
3
|
+
} from "./chunk-Y5GCAMGP.js";
|
|
4
|
+
import {
|
|
5
|
+
patch,
|
|
6
|
+
readAndWait,
|
|
7
|
+
toTimestampMs,
|
|
8
|
+
upsert,
|
|
9
|
+
write
|
|
10
|
+
} from "./chunk-TISCADJH.js";
|
|
11
|
+
import {
|
|
12
|
+
asRecordOrEmpty
|
|
13
|
+
} from "./chunk-KX6YBIHG.js";
|
|
14
|
+
import {
|
|
15
|
+
createUserKey,
|
|
16
|
+
createUserPreferenceKey,
|
|
17
|
+
ulid
|
|
18
|
+
} from "./chunk-O4BU24WZ.js";
|
|
19
|
+
import {
|
|
20
|
+
asTrimmedLowercaseString
|
|
21
|
+
} from "./chunk-QSJ3HFEF.js";
|
|
22
|
+
import {
|
|
23
|
+
BUILTIN_NOLO_AGENT_KEY
|
|
24
|
+
} from "./chunk-K777STIO.js";
|
|
25
|
+
import {
|
|
26
|
+
asyncThunkCreator,
|
|
27
|
+
buildCreateSlice,
|
|
28
|
+
createAction,
|
|
29
|
+
createAsyncThunk,
|
|
30
|
+
createSelector,
|
|
31
|
+
selectIdentityUserId
|
|
32
|
+
} from "./chunk-XBROXIGL.js";
|
|
33
|
+
import {
|
|
34
|
+
getAllServers,
|
|
35
|
+
getIsDesktopApp,
|
|
36
|
+
isProduction
|
|
37
|
+
} from "./chunk-WI4XWASA.js";
|
|
38
|
+
import {
|
|
39
|
+
isLocalServerUrl
|
|
40
|
+
} from "./chunk-4SN6J65J.js";
|
|
41
|
+
import {
|
|
42
|
+
SERVERS
|
|
43
|
+
} from "./chunk-LCBAMY2M.js";
|
|
44
|
+
import {
|
|
45
|
+
normalizeServerOrigin
|
|
46
|
+
} from "./chunk-CF7PE763.js";
|
|
47
|
+
|
|
48
|
+
// packages/ai/policy/types.ts
|
|
49
|
+
var DEFAULT_AGENT_BASE_POLICY = {
|
|
50
|
+
version: 1,
|
|
51
|
+
tone: {
|
|
52
|
+
preset: "default",
|
|
53
|
+
resolutionMode: "blend"
|
|
54
|
+
},
|
|
55
|
+
knowledgeCaptureMaxLevel: 4,
|
|
56
|
+
spaceContextMaxLevel: 4,
|
|
57
|
+
selfEvolutionMode: "knowledge_only"
|
|
58
|
+
};
|
|
59
|
+
var DEFAULT_USER_PREFERENCE_PROFILE = {
|
|
60
|
+
version: 1,
|
|
61
|
+
tone: {
|
|
62
|
+
preset: "default"
|
|
63
|
+
},
|
|
64
|
+
knowledgeCaptureLevel: 2,
|
|
65
|
+
spaceContextLevel: 3
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// packages/ai/policy/selfUpdateFields.ts
|
|
69
|
+
var AGENT_UPDATE_FIELD_NAMES = [
|
|
70
|
+
"name",
|
|
71
|
+
"handle",
|
|
72
|
+
"model",
|
|
73
|
+
"provider",
|
|
74
|
+
"prompt",
|
|
75
|
+
"introduction",
|
|
76
|
+
"greeting",
|
|
77
|
+
"isPublic",
|
|
78
|
+
"tags",
|
|
79
|
+
"tools",
|
|
80
|
+
"references",
|
|
81
|
+
"temperature",
|
|
82
|
+
"top_p",
|
|
83
|
+
"frequency_penalty",
|
|
84
|
+
"presence_penalty",
|
|
85
|
+
"max_tokens",
|
|
86
|
+
"reasoning_effort"
|
|
87
|
+
];
|
|
88
|
+
var PRIMARY_AUTO_APPROVE_SELF_UPDATE_FIELDS = [
|
|
89
|
+
"greeting",
|
|
90
|
+
"introduction",
|
|
91
|
+
"tags"
|
|
92
|
+
];
|
|
93
|
+
var DEFAULT_AUTO_APPROVED_SELF_UPDATE_FIELDS = [
|
|
94
|
+
...PRIMARY_AUTO_APPROVE_SELF_UPDATE_FIELDS
|
|
95
|
+
];
|
|
96
|
+
var VALID_AGENT_UPDATE_FIELDS = new Set(AGENT_UPDATE_FIELD_NAMES);
|
|
97
|
+
var normalizeAgentUpdateFieldList = (value, fallback = DEFAULT_AUTO_APPROVED_SELF_UPDATE_FIELDS) => {
|
|
98
|
+
if (!Array.isArray(value)) {
|
|
99
|
+
return [...fallback];
|
|
100
|
+
}
|
|
101
|
+
const normalized = Array.from(
|
|
102
|
+
new Set(
|
|
103
|
+
value.filter(
|
|
104
|
+
(item) => typeof item === "string" && VALID_AGENT_UPDATE_FIELDS.has(item)
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
);
|
|
108
|
+
return normalized;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// packages/app/theme/fontPreference.ts
|
|
112
|
+
var DEFAULT_FONT_PRESET = "hei";
|
|
113
|
+
var FONT_PRESET_ALIASES = {
|
|
114
|
+
system: "system",
|
|
115
|
+
default: "system",
|
|
116
|
+
hei: "hei",
|
|
117
|
+
heiti: "hei",
|
|
118
|
+
sans: "hei",
|
|
119
|
+
song: "song",
|
|
120
|
+
songti: "song",
|
|
121
|
+
serif: "song",
|
|
122
|
+
kai: "kai",
|
|
123
|
+
kaiti: "kai",
|
|
124
|
+
"kai-ti": "kai",
|
|
125
|
+
"fang-song": "fang-song",
|
|
126
|
+
fangsong: "fang-song",
|
|
127
|
+
"fang song": "fang-song"
|
|
128
|
+
};
|
|
129
|
+
var normalizeFontPreset = (value) => {
|
|
130
|
+
const normalized = asTrimmedLowercaseString(value);
|
|
131
|
+
return FONT_PRESET_ALIASES[normalized];
|
|
132
|
+
};
|
|
133
|
+
var FONT_PRESET_CSS_VARIABLES = {
|
|
134
|
+
system: {
|
|
135
|
+
ui: "var(--font-ui-system)",
|
|
136
|
+
"sans-zh": "var(--font-sans-zh-system)",
|
|
137
|
+
"sans-en": "var(--font-sans-en-system)",
|
|
138
|
+
"sans-ja": "var(--font-sans-ja-system)",
|
|
139
|
+
"sans-ko": "var(--font-sans-ko-system)"
|
|
140
|
+
},
|
|
141
|
+
hei: {
|
|
142
|
+
ui: "var(--font-ui-hei)",
|
|
143
|
+
"sans-zh": "var(--font-sans-zh-hei)",
|
|
144
|
+
"sans-en": "var(--font-sans-en-hei)",
|
|
145
|
+
"sans-ja": "var(--font-sans-ja-system)",
|
|
146
|
+
"sans-ko": "var(--font-sans-ko-system)"
|
|
147
|
+
},
|
|
148
|
+
song: {
|
|
149
|
+
ui: "var(--font-ui-song)",
|
|
150
|
+
"sans-zh": "var(--font-sans-zh-song)",
|
|
151
|
+
"sans-en": "var(--font-sans-en-song)",
|
|
152
|
+
"sans-ja": "var(--font-sans-ja-system)",
|
|
153
|
+
"sans-ko": "var(--font-sans-ko-system)"
|
|
154
|
+
},
|
|
155
|
+
kai: {
|
|
156
|
+
ui: "var(--font-ui-kai)",
|
|
157
|
+
"sans-zh": "var(--font-sans-zh-kai)",
|
|
158
|
+
"sans-en": "var(--font-sans-en-kai)",
|
|
159
|
+
"sans-ja": "var(--font-sans-ja-system)",
|
|
160
|
+
"sans-ko": "var(--font-sans-ko-system)"
|
|
161
|
+
},
|
|
162
|
+
"fang-song": {
|
|
163
|
+
ui: "var(--font-ui-fang-song)",
|
|
164
|
+
"sans-zh": "var(--font-sans-zh-fang-song)",
|
|
165
|
+
"sans-en": "var(--font-sans-en-fang-song)",
|
|
166
|
+
"sans-ja": "var(--font-sans-ja-system)",
|
|
167
|
+
"sans-ko": "var(--font-sans-ko-system)"
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// packages/app/theme/colors.ts
|
|
172
|
+
var semantic = {
|
|
173
|
+
light: { success: "#16A34A", warning: "#D97706", info: "#2563EB", error: "#DC2626" },
|
|
174
|
+
dark: { success: "#4ADE80", warning: "#FCD34D", info: "#60A5FA", error: "#F87171" }
|
|
175
|
+
};
|
|
176
|
+
var mkLight = (bg, bg2, bg3, textPrimary, textSec, textTer, border, borderL) => ({
|
|
177
|
+
background: bg,
|
|
178
|
+
backgroundSecondary: bg2,
|
|
179
|
+
backgroundTertiary: bg3,
|
|
180
|
+
backgroundGhost: bg + "F0",
|
|
181
|
+
backgroundHover: bg3,
|
|
182
|
+
backgroundSelected: border,
|
|
183
|
+
backgroundElevated: bg2,
|
|
184
|
+
text: textPrimary,
|
|
185
|
+
textSecondary: textSec,
|
|
186
|
+
textTertiary: textTer,
|
|
187
|
+
textQuaternary: textTer + "99",
|
|
188
|
+
textLight: border,
|
|
189
|
+
placeholder: textTer,
|
|
190
|
+
border,
|
|
191
|
+
borderLight: borderL,
|
|
192
|
+
borderHover: textTer,
|
|
193
|
+
messageBackground: bg2,
|
|
194
|
+
codeBackground: bg3,
|
|
195
|
+
shadowLight: `rgba(0,0,0,0.04)`,
|
|
196
|
+
shadowMedium: `rgba(0,0,0,0.08)`,
|
|
197
|
+
shadowHeavy: `rgba(0,0,0,0.14)`,
|
|
198
|
+
textOnPrimary: "#FFFFFF"
|
|
199
|
+
});
|
|
200
|
+
var mkDark = (bg, bg2, bg3, textPrimary, textSec, textTer, border, borderL, shadowBase = "0,0,0") => ({
|
|
201
|
+
background: bg,
|
|
202
|
+
backgroundSecondary: bg2,
|
|
203
|
+
backgroundTertiary: bg3,
|
|
204
|
+
backgroundGhost: bg2 + "F0",
|
|
205
|
+
backgroundHover: bg3,
|
|
206
|
+
backgroundSelected: border,
|
|
207
|
+
backgroundElevated: bg3,
|
|
208
|
+
text: textPrimary,
|
|
209
|
+
textSecondary: textSec,
|
|
210
|
+
textTertiary: textTer,
|
|
211
|
+
textQuaternary: textTer + "88",
|
|
212
|
+
textLight: border,
|
|
213
|
+
placeholder: textTer,
|
|
214
|
+
border,
|
|
215
|
+
borderLight: borderL,
|
|
216
|
+
borderHover: textTer,
|
|
217
|
+
messageBackground: bg2,
|
|
218
|
+
codeBackground: bg2,
|
|
219
|
+
shadowLight: `rgba(${shadowBase},0.18)`,
|
|
220
|
+
shadowMedium: `rgba(${shadowBase},0.30)`,
|
|
221
|
+
shadowHeavy: `rgba(${shadowBase},0.44)`,
|
|
222
|
+
textOnPrimary: "#FFFFFF"
|
|
223
|
+
});
|
|
224
|
+
var neutral = {
|
|
225
|
+
light: {
|
|
226
|
+
primary: "#71717A",
|
|
227
|
+
primaryLight: "#A1A1AA",
|
|
228
|
+
primaryDark: "#52525B",
|
|
229
|
+
primaryGradient: "linear-gradient(135deg, #71717A, #A1A1AA)",
|
|
230
|
+
primaryGhost: "rgba(113,113,122,0.08)",
|
|
231
|
+
primaryHover: "rgba(113,113,122,0.10)",
|
|
232
|
+
borderAccent: "#D4D4D8",
|
|
233
|
+
...semantic.light,
|
|
234
|
+
...mkLight("#FFFFFF", "#F4F4F5", "#E4E4E7", "#18181B", "#52525B", "#71717A", "#E4E4E7", "#F4F4F5")
|
|
235
|
+
},
|
|
236
|
+
dark: {
|
|
237
|
+
primary: "#A1A1AA",
|
|
238
|
+
primaryLight: "#D4D4D8",
|
|
239
|
+
primaryDark: "#71717A",
|
|
240
|
+
primaryGradient: "linear-gradient(135deg, #A1A1AA, #D4D4D8)",
|
|
241
|
+
primaryGhost: "rgba(161,161,170,0.10)",
|
|
242
|
+
primaryHover: "rgba(161,161,170,0.12)",
|
|
243
|
+
borderAccent: "#52525B",
|
|
244
|
+
...semantic.dark,
|
|
245
|
+
...mkDark("#18181B", "#27272A", "#3F3F46", "#FAFAFA", "#D4D4D8", "#A1A1AA", "#3F3F46", "#27272A", "24,24,27"),
|
|
246
|
+
textOnPrimary: "#18181B"
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
var ocean = {
|
|
250
|
+
light: {
|
|
251
|
+
primary: "#0969DA",
|
|
252
|
+
primaryLight: "#218BFF",
|
|
253
|
+
primaryDark: "#0550AE",
|
|
254
|
+
primaryGradient: "linear-gradient(135deg, #0969DA, #218BFF)",
|
|
255
|
+
primaryGhost: "rgba(9,105,218,0.08)",
|
|
256
|
+
primaryHover: "rgba(9,105,218,0.10)",
|
|
257
|
+
borderAccent: "#54AEFF",
|
|
258
|
+
...semantic.light,
|
|
259
|
+
...mkLight("#FFFFFF", "#F6F8FA", "#EBF0F4", "#1C2128", "#57606A", "#6E7781", "#D0D7DE", "#F6F8FA")
|
|
260
|
+
},
|
|
261
|
+
dark: {
|
|
262
|
+
primary: "#58A6FF",
|
|
263
|
+
primaryLight: "#79C0FF",
|
|
264
|
+
primaryDark: "#388BFD",
|
|
265
|
+
primaryGradient: "linear-gradient(135deg, #58A6FF, #79C0FF)",
|
|
266
|
+
primaryGhost: "rgba(88,166,255,0.10)",
|
|
267
|
+
primaryHover: "rgba(88,166,255,0.12)",
|
|
268
|
+
borderAccent: "#1F6FEB",
|
|
269
|
+
...semantic.dark,
|
|
270
|
+
...mkDark("#0D1117", "#161B22", "#21262D", "#E6EDF3", "#8B949E", "#6E7681", "#30363D", "#161B22", "13,17,23"),
|
|
271
|
+
textHeading: "#E6EDF3",
|
|
272
|
+
textOnPrimary: "#0D1117"
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
var iris = {
|
|
276
|
+
meta: { radiusBoost: -2, motionEase: "cubic-bezier(0.16, 1, 0.3, 1)" },
|
|
277
|
+
light: {
|
|
278
|
+
primary: "#5E6AD2",
|
|
279
|
+
primaryLight: "#8B9CF4",
|
|
280
|
+
primaryDark: "#4A55C0",
|
|
281
|
+
primaryGradient: "linear-gradient(135deg, #5E6AD2, #8B9CF4)",
|
|
282
|
+
primaryGhost: "rgba(94, 106, 210, 0.07)",
|
|
283
|
+
primaryHover: "rgba(94, 106, 210, 0.10)",
|
|
284
|
+
borderAccent: "#ADB5F7",
|
|
285
|
+
success: "#16A34A",
|
|
286
|
+
warning: "#D97706",
|
|
287
|
+
info: "#5E6AD2",
|
|
288
|
+
error: "#E5484D",
|
|
289
|
+
background: "#FBFBFD",
|
|
290
|
+
backgroundSecondary: "#F4F4F9",
|
|
291
|
+
backgroundTertiary: "#ECECF3",
|
|
292
|
+
backgroundGhost: "rgba(251, 251, 253, 0.94)",
|
|
293
|
+
backgroundHover: "#E4E4ED",
|
|
294
|
+
backgroundSelected: "#D8D8E3",
|
|
295
|
+
backgroundElevated: "#F7F7FB",
|
|
296
|
+
text: "#1A1730",
|
|
297
|
+
textSecondary: "#4E4B6B",
|
|
298
|
+
textTertiary: "#6E6A8A",
|
|
299
|
+
textQuaternary: "#9E9AB5",
|
|
300
|
+
textLight: "#C4C2D4",
|
|
301
|
+
placeholder: "#9E9AB5",
|
|
302
|
+
border: "#E4E4ED",
|
|
303
|
+
borderHover: "#CFCFD9",
|
|
304
|
+
borderLight: "#F2F2F7",
|
|
305
|
+
messageBackground: "#FFFFFF",
|
|
306
|
+
codeBackground: "#F2F2F7",
|
|
307
|
+
shadowLight: "rgba(26, 23, 48, 0.04)",
|
|
308
|
+
shadowMedium: "rgba(26, 23, 48, 0.08)",
|
|
309
|
+
shadowHeavy: "rgba(26, 23, 48, 0.13)",
|
|
310
|
+
textHeading: "#1A1730",
|
|
311
|
+
textOnPrimary: "#FFFFFF"
|
|
312
|
+
},
|
|
313
|
+
dark: {
|
|
314
|
+
primary: "#8B9CF4",
|
|
315
|
+
primaryLight: "#ADB5F7",
|
|
316
|
+
primaryDark: "#5E6AD2",
|
|
317
|
+
primaryGradient: "linear-gradient(135deg, #8B9CF4, #ADB5F7)",
|
|
318
|
+
primaryGhost: "rgba(139, 156, 244, 0.10)",
|
|
319
|
+
primaryHover: "rgba(139, 156, 244, 0.14)",
|
|
320
|
+
borderAccent: "#4A55C0",
|
|
321
|
+
success: "#26BD6C",
|
|
322
|
+
warning: "#F5A623",
|
|
323
|
+
info: "#8B9CF4",
|
|
324
|
+
error: "#EC5B6E",
|
|
325
|
+
background: "#0F0E17",
|
|
326
|
+
backgroundSecondary: "#16141F",
|
|
327
|
+
backgroundTertiary: "#1E1B2E",
|
|
328
|
+
backgroundGhost: "rgba(15, 14, 23, 0.94)",
|
|
329
|
+
backgroundHover: "#28253A",
|
|
330
|
+
backgroundSelected: "#36334D",
|
|
331
|
+
backgroundElevated: "#1E1B2E",
|
|
332
|
+
text: "#E8E5F7",
|
|
333
|
+
textSecondary: "#C0BDD8",
|
|
334
|
+
textTertiary: "#938AA9",
|
|
335
|
+
textQuaternary: "#5A5772",
|
|
336
|
+
textLight: "#36334D",
|
|
337
|
+
placeholder: "#5A5772",
|
|
338
|
+
border: "#272435",
|
|
339
|
+
borderHover: "#3A3650",
|
|
340
|
+
borderLight: "#16141F",
|
|
341
|
+
messageBackground: "#16141F",
|
|
342
|
+
codeBackground: "#0A0911",
|
|
343
|
+
shadowLight: "rgba(10, 9, 17, 0.20)",
|
|
344
|
+
shadowMedium: "rgba(10, 9, 17, 0.32)",
|
|
345
|
+
shadowHeavy: "rgba(10, 9, 17, 0.44)",
|
|
346
|
+
textHeading: "#E8E5F7",
|
|
347
|
+
textOnPrimary: "#0F0E17"
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
var forest = {
|
|
351
|
+
light: {
|
|
352
|
+
primary: "#059669",
|
|
353
|
+
primaryLight: "#10B981",
|
|
354
|
+
primaryDark: "#047857",
|
|
355
|
+
primaryGradient: "linear-gradient(135deg, #059669, #10B981)",
|
|
356
|
+
primaryGhost: "rgba(5,150,105,0.08)",
|
|
357
|
+
primaryHover: "rgba(5,150,105,0.10)",
|
|
358
|
+
borderAccent: "#6EE7B7",
|
|
359
|
+
...semantic.light,
|
|
360
|
+
...mkLight("#F6FAF6", "#EDF5EC", "#DDF0DB", "#1A2E18", "#3D6B3A", "#5C8A58", "#C3E0C0", "#EDF5EC")
|
|
361
|
+
},
|
|
362
|
+
dark: {
|
|
363
|
+
primary: "#34D399",
|
|
364
|
+
primaryLight: "#6EE7B7",
|
|
365
|
+
primaryDark: "#10B981",
|
|
366
|
+
primaryGradient: "linear-gradient(135deg, #34D399, #6EE7B7)",
|
|
367
|
+
primaryGhost: "rgba(52,211,153,0.10)",
|
|
368
|
+
primaryHover: "rgba(52,211,153,0.12)",
|
|
369
|
+
borderAccent: "#059669",
|
|
370
|
+
...semantic.dark,
|
|
371
|
+
...mkDark("#0C1209", "#121A0E", "#1A2416", "#E4F0E2", "#87A882", "#5E7A5A", "#1A2416", "#121A0E", "12,18,9"),
|
|
372
|
+
success: "#4ADE80",
|
|
373
|
+
textHeading: "#C8EEC4",
|
|
374
|
+
textOnPrimary: "#0C1209"
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
var trail = {
|
|
378
|
+
meta: { radiusBoost: 1, motionEase: "cubic-bezier(0.22, 1, 0.36, 1)" },
|
|
379
|
+
light: {
|
|
380
|
+
primary: "#2E7DB5",
|
|
381
|
+
primaryLight: "#6BB5E0",
|
|
382
|
+
primaryDark: "#1F5F94",
|
|
383
|
+
primaryGradient: "linear-gradient(135deg, #2E7DB5, #6BB5E0)",
|
|
384
|
+
primaryGhost: "rgba(46, 125, 181, 0.08)",
|
|
385
|
+
primaryHover: "rgba(46, 125, 181, 0.11)",
|
|
386
|
+
borderAccent: "#9EC9E8",
|
|
387
|
+
success: "#3F8F5C",
|
|
388
|
+
warning: "#D4A054",
|
|
389
|
+
info: "#4A9FD4",
|
|
390
|
+
error: "#C45C4A",
|
|
391
|
+
accentTrail: "#C9924E",
|
|
392
|
+
accentMoss: "#7A9B6E",
|
|
393
|
+
accentTrailGhost: "rgba(201, 146, 78, 0.10)",
|
|
394
|
+
accentMossGhost: "rgba(122, 155, 110, 0.10)",
|
|
395
|
+
background: "#FAFBFC",
|
|
396
|
+
backgroundSecondary: "#F4F7FA",
|
|
397
|
+
backgroundTertiary: "#E8EDF2",
|
|
398
|
+
backgroundGhost: "rgba(250, 251, 252, 0.94)",
|
|
399
|
+
backgroundHover: "#DCE4EC",
|
|
400
|
+
backgroundSelected: "#C8D4E0",
|
|
401
|
+
text: "#1C2430",
|
|
402
|
+
textSecondary: "#5C6775",
|
|
403
|
+
textTertiary: "#7A8796",
|
|
404
|
+
textQuaternary: "#A3B0BD",
|
|
405
|
+
textLight: "#C5CED8",
|
|
406
|
+
placeholder: "#A3B0BD",
|
|
407
|
+
border: "#D8E0E8",
|
|
408
|
+
borderHover: "#B8C5D4",
|
|
409
|
+
borderLight: "#EEF2F6",
|
|
410
|
+
messageBackground: "#FFFFFF",
|
|
411
|
+
codeBackground: "#EEF2F6",
|
|
412
|
+
shadowLight: "rgba(28, 36, 48, 0.05)",
|
|
413
|
+
shadowMedium: "rgba(28, 36, 48, 0.09)",
|
|
414
|
+
shadowHeavy: "rgba(28, 36, 48, 0.14)",
|
|
415
|
+
textHeading: "#1C2430",
|
|
416
|
+
textOnPrimary: "#FFFFFF"
|
|
417
|
+
},
|
|
418
|
+
dark: {
|
|
419
|
+
primary: "#5BA3D9",
|
|
420
|
+
primaryLight: "#7FBEE8",
|
|
421
|
+
primaryDark: "#3D85BF",
|
|
422
|
+
primaryGradient: "linear-gradient(135deg, #5BA3D9, #7FBEE8)",
|
|
423
|
+
primaryGhost: "rgba(91, 163, 217, 0.12)",
|
|
424
|
+
primaryHover: "rgba(91, 163, 217, 0.16)",
|
|
425
|
+
borderAccent: "#2F5F78",
|
|
426
|
+
success: "#5CB87A",
|
|
427
|
+
warning: "#E6B35C",
|
|
428
|
+
info: "#6BB8E8",
|
|
429
|
+
error: "#E07060",
|
|
430
|
+
accentTrail: "#D4A96A",
|
|
431
|
+
accentMoss: "#8FB896",
|
|
432
|
+
accentTrailGhost: "rgba(212, 169, 106, 0.12)",
|
|
433
|
+
accentMossGhost: "rgba(143, 184, 150, 0.12)",
|
|
434
|
+
background: "#0B1218",
|
|
435
|
+
backgroundSecondary: "#111A22",
|
|
436
|
+
backgroundTertiary: "#1A2630",
|
|
437
|
+
backgroundGhost: "rgba(11, 18, 24, 0.94)",
|
|
438
|
+
backgroundHover: "#243240",
|
|
439
|
+
backgroundSelected: "#2E4050",
|
|
440
|
+
text: "#EEF3F8",
|
|
441
|
+
textSecondary: "#A8B8C8",
|
|
442
|
+
textTertiary: "#7A8FA3",
|
|
443
|
+
textQuaternary: "#5A6F82",
|
|
444
|
+
textLight: "#3A4F62",
|
|
445
|
+
placeholder: "#5A6F82",
|
|
446
|
+
border: "#243240",
|
|
447
|
+
borderHover: "#3A5060",
|
|
448
|
+
borderLight: "#111A22",
|
|
449
|
+
messageBackground: "#111A22",
|
|
450
|
+
codeBackground: "#070D12",
|
|
451
|
+
shadowLight: "rgba(4, 8, 12, 0.22)",
|
|
452
|
+
shadowMedium: "rgba(4, 8, 12, 0.34)",
|
|
453
|
+
shadowHeavy: "rgba(4, 8, 12, 0.46)",
|
|
454
|
+
textHeading: "#E8F4FC",
|
|
455
|
+
textOnPrimary: "#0B1218"
|
|
456
|
+
}
|
|
457
|
+
};
|
|
458
|
+
var wave = {
|
|
459
|
+
light: {
|
|
460
|
+
// Kanagawa Lotus — lotusBlue3 accent(日式水墨蓝,与 Wave dark 气质呼应)
|
|
461
|
+
primary: "#4D699B",
|
|
462
|
+
primaryLight: "#6680B3",
|
|
463
|
+
primaryDark: "#3C5585",
|
|
464
|
+
primaryGradient: "linear-gradient(135deg, #4D699B, #6680B3)",
|
|
465
|
+
primaryGhost: "rgba(77, 105, 155, 0.08)",
|
|
466
|
+
primaryHover: "rgba(77, 105, 155, 0.10)",
|
|
467
|
+
borderAccent: "#8CA6CF",
|
|
468
|
+
success: "#6F894E",
|
|
469
|
+
warning: "#836F4A",
|
|
470
|
+
info: "#4D699B",
|
|
471
|
+
error: "#C84053",
|
|
472
|
+
// Surface overrides — Kanagawa Lotus palette
|
|
473
|
+
background: "#F5F4EF",
|
|
474
|
+
backgroundSecondary: "#FFFFFF",
|
|
475
|
+
backgroundTertiary: "#ECEAE3",
|
|
476
|
+
backgroundGhost: "rgba(245, 244, 239, 0.94)",
|
|
477
|
+
backgroundHover: "#E8E6DE",
|
|
478
|
+
backgroundSelected: "#DEDAD0",
|
|
479
|
+
text: "#1A1A22",
|
|
480
|
+
textSecondary: "#3D3B4F",
|
|
481
|
+
textTertiary: "#716E61",
|
|
482
|
+
textQuaternary: "#9E9B8E",
|
|
483
|
+
textLight: "#C3BBAA",
|
|
484
|
+
placeholder: "#9E9B8E",
|
|
485
|
+
border: "#D8D5C8",
|
|
486
|
+
borderHover: "#C4C0B2",
|
|
487
|
+
borderLight: "#ECEAE3",
|
|
488
|
+
messageBackground: "#FFFFFF",
|
|
489
|
+
codeBackground: "#ECEAE3",
|
|
490
|
+
shadowLight: "rgba(26, 26, 34, 0.05)",
|
|
491
|
+
shadowMedium: "rgba(26, 26, 34, 0.09)",
|
|
492
|
+
shadowHeavy: "rgba(26, 26, 34, 0.14)",
|
|
493
|
+
textOnPrimary: "#FFFFFF"
|
|
494
|
+
},
|
|
495
|
+
dark: {
|
|
496
|
+
// Kanagawa Wave — crystalBlue accent(#7E9CD8 是函数名颜色,最标志性的 Kanagawa 蓝)
|
|
497
|
+
primary: "#7E9CD8",
|
|
498
|
+
primaryLight: "#9DB4E8",
|
|
499
|
+
primaryDark: "#6688BC",
|
|
500
|
+
primaryGradient: "linear-gradient(135deg, #7E9CD8, #9DB4E8)",
|
|
501
|
+
primaryGhost: "rgba(126, 156, 216, 0.10)",
|
|
502
|
+
primaryHover: "rgba(126, 156, 216, 0.16)",
|
|
503
|
+
borderAccent: "#2D4F67",
|
|
504
|
+
success: "#98BB6C",
|
|
505
|
+
// bamboo green
|
|
506
|
+
warning: "#E6C384",
|
|
507
|
+
// autumn gold
|
|
508
|
+
info: "#7FB4CA",
|
|
509
|
+
// waveBlue
|
|
510
|
+
error: "#E82424",
|
|
511
|
+
// Surface overrides — Kanagawa Wave palette
|
|
512
|
+
background: "#1F1F28",
|
|
513
|
+
// surumiBlack — 墨色
|
|
514
|
+
backgroundSecondary: "#16161D",
|
|
515
|
+
// deeper ink
|
|
516
|
+
backgroundTertiary: "#2A2A37",
|
|
517
|
+
// waveBlue-dark
|
|
518
|
+
backgroundGhost: "rgba(22, 22, 29, 0.94)",
|
|
519
|
+
backgroundHover: "#363646",
|
|
520
|
+
backgroundSelected: "#54546D",
|
|
521
|
+
text: "#DCD7BA",
|
|
522
|
+
// fujiWhite — 宣纸暖白,365天的护眼体验
|
|
523
|
+
textSecondary: "#C8C093",
|
|
524
|
+
// oldWhite — 次级暖白
|
|
525
|
+
textTertiary: "#938AA9",
|
|
526
|
+
// springViolet2 — 注释紫,Kanagawa 气质核心
|
|
527
|
+
textQuaternary: "#727169",
|
|
528
|
+
// fujiGray
|
|
529
|
+
textLight: "#54546D",
|
|
530
|
+
placeholder: "#727169",
|
|
531
|
+
border: "#2A2A37",
|
|
532
|
+
borderHover: "#54546D",
|
|
533
|
+
borderLight: "#1F1F28",
|
|
534
|
+
messageBackground: "#16161D",
|
|
535
|
+
codeBackground: "#0D0C0C",
|
|
536
|
+
// 比背景更深的墨黑
|
|
537
|
+
shadowLight: "rgba(13, 12, 12, 0.18)",
|
|
538
|
+
shadowMedium: "rgba(13, 12, 12, 0.28)",
|
|
539
|
+
shadowHeavy: "rgba(13, 12, 12, 0.38)",
|
|
540
|
+
textHeading: "#DCD7BA",
|
|
541
|
+
// fujiWhite — 暖色标题
|
|
542
|
+
textOnPrimary: "#1F1F28"
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
var rose = {
|
|
546
|
+
light: {
|
|
547
|
+
// Rosé Pine Dawn
|
|
548
|
+
primary: "#D14D72",
|
|
549
|
+
primaryLight: "#E87C9D",
|
|
550
|
+
primaryDark: "#B03060",
|
|
551
|
+
primaryGradient: "linear-gradient(135deg, #D14D72, #E87C9D)",
|
|
552
|
+
primaryGhost: "rgba(209, 77, 114, 0.08)",
|
|
553
|
+
primaryHover: "rgba(209, 77, 114, 0.10)",
|
|
554
|
+
borderAccent: "#F2BFCC",
|
|
555
|
+
success: "#56949F",
|
|
556
|
+
warning: "#EA9D34",
|
|
557
|
+
info: "#286983",
|
|
558
|
+
error: "#B4637A",
|
|
559
|
+
background: "#FAF4ED",
|
|
560
|
+
backgroundSecondary: "#FFFAF3",
|
|
561
|
+
backgroundTertiary: "#F2E9E1",
|
|
562
|
+
backgroundGhost: "rgba(250, 244, 237, 0.94)",
|
|
563
|
+
backgroundHover: "#EDE3DA",
|
|
564
|
+
backgroundSelected: "#DFD3C7",
|
|
565
|
+
text: "#575279",
|
|
566
|
+
textSecondary: "#6E6A86",
|
|
567
|
+
textTertiary: "#797593",
|
|
568
|
+
textQuaternary: "#9893A5",
|
|
569
|
+
textLight: "#CECACD",
|
|
570
|
+
placeholder: "#9893A5",
|
|
571
|
+
border: "#DFDAD9",
|
|
572
|
+
borderHover: "#C5BFB3",
|
|
573
|
+
borderLight: "#F2E9E1",
|
|
574
|
+
messageBackground: "#FFFAF3",
|
|
575
|
+
codeBackground: "#F2E9E1",
|
|
576
|
+
shadowLight: "rgba(87, 82, 121, 0.05)",
|
|
577
|
+
shadowMedium: "rgba(87, 82, 121, 0.09)",
|
|
578
|
+
shadowHeavy: "rgba(87, 82, 121, 0.14)",
|
|
579
|
+
textOnPrimary: "#FFFFFF"
|
|
580
|
+
},
|
|
581
|
+
dark: {
|
|
582
|
+
// Rosé Pine main
|
|
583
|
+
primary: "#EB6F92",
|
|
584
|
+
primaryLight: "#F0A8BF",
|
|
585
|
+
primaryDark: "#C4637A",
|
|
586
|
+
primaryGradient: "linear-gradient(135deg, #EB6F92, #F0A8BF)",
|
|
587
|
+
primaryGhost: "rgba(235, 111, 146, 0.10)",
|
|
588
|
+
primaryHover: "rgba(235, 111, 146, 0.14)",
|
|
589
|
+
borderAccent: "#6E3050",
|
|
590
|
+
success: "#9CCFD8",
|
|
591
|
+
warning: "#F6C177",
|
|
592
|
+
info: "#C4A7E7",
|
|
593
|
+
error: "#EB6F92",
|
|
594
|
+
background: "#191724",
|
|
595
|
+
backgroundSecondary: "#1F1D2E",
|
|
596
|
+
backgroundTertiary: "#26233A",
|
|
597
|
+
backgroundGhost: "rgba(25, 23, 36, 0.94)",
|
|
598
|
+
backgroundHover: "#312E45",
|
|
599
|
+
backgroundSelected: "#403D52",
|
|
600
|
+
text: "#E0DEF4",
|
|
601
|
+
textSecondary: "#C4C1D9",
|
|
602
|
+
textTertiary: "#908CAA",
|
|
603
|
+
textQuaternary: "#6E6A86",
|
|
604
|
+
textLight: "#403D52",
|
|
605
|
+
placeholder: "#6E6A86",
|
|
606
|
+
border: "#26233A",
|
|
607
|
+
borderHover: "#6E6A86",
|
|
608
|
+
borderLight: "#1F1D2E",
|
|
609
|
+
messageBackground: "#1F1D2E",
|
|
610
|
+
codeBackground: "#12101E",
|
|
611
|
+
shadowLight: "rgba(12, 10, 20, 0.20)",
|
|
612
|
+
shadowMedium: "rgba(12, 10, 20, 0.30)",
|
|
613
|
+
shadowHeavy: "rgba(12, 10, 20, 0.44)",
|
|
614
|
+
textHeading: "#E0DEF4",
|
|
615
|
+
textOnPrimary: "#191724"
|
|
616
|
+
}
|
|
617
|
+
};
|
|
618
|
+
var mono = {
|
|
619
|
+
meta: { radiusBoost: 0, motionEase: "cubic-bezier(0.4, 0, 0.2, 1)" },
|
|
620
|
+
light: {
|
|
621
|
+
// open-props: --orange-6 = #FF9500, --orange-3 = #FFD599, --orange-7 = #E68600
|
|
622
|
+
primary: "#FF9500",
|
|
623
|
+
primaryLight: "#FFD599",
|
|
624
|
+
primaryDark: "#E68600",
|
|
625
|
+
primaryGradient: "linear-gradient(135deg, #FF9500, #FFD599)",
|
|
626
|
+
primaryGhost: "rgba(255,149,0,0.08)",
|
|
627
|
+
primaryHover: "rgba(255,149,0,0.12)",
|
|
628
|
+
borderAccent: "#FFBF66",
|
|
629
|
+
success: "#16A34A",
|
|
630
|
+
warning: "#D97706",
|
|
631
|
+
info: "#2563EB",
|
|
632
|
+
error: "#DC2626",
|
|
633
|
+
// 采用 open-props 默认的冷系 slate-gray 调色(H=210, S=10%),完美消除泥土发灰感
|
|
634
|
+
background: "#FCFCFD",
|
|
635
|
+
// gray-0
|
|
636
|
+
backgroundSecondary: "#F9FAFA",
|
|
637
|
+
// gray-1
|
|
638
|
+
backgroundTertiary: "#F1F2F4",
|
|
639
|
+
// gray-2
|
|
640
|
+
backgroundGhost: "rgba(252,252,253,0.94)",
|
|
641
|
+
backgroundHover: "#EBEDEF",
|
|
642
|
+
// gray-3
|
|
643
|
+
backgroundSelected: "#C1C7CD",
|
|
644
|
+
// gray-6
|
|
645
|
+
backgroundElevated: "#FFFFFF",
|
|
646
|
+
text: "#292E32",
|
|
647
|
+
// gray-12
|
|
648
|
+
textSecondary: "#57616B",
|
|
649
|
+
// gray-10
|
|
650
|
+
textTertiary: "#7B8793",
|
|
651
|
+
// gray-8
|
|
652
|
+
textQuaternary: "#9DA6AF",
|
|
653
|
+
// gray-7
|
|
654
|
+
textLight: "#C1C7CD",
|
|
655
|
+
placeholder: "#9DA6AF",
|
|
656
|
+
border: "#E6E8EA",
|
|
657
|
+
// gray-4
|
|
658
|
+
borderHover: "#C1C7CD",
|
|
659
|
+
borderLight: "#F1F2F4",
|
|
660
|
+
messageBackground: "#FFFFFF",
|
|
661
|
+
codeBackground: "#F1F2F4",
|
|
662
|
+
// 基于 slate-gray 调色 #292E32 (RGB 41, 46, 50) 的有机冷调阴影
|
|
663
|
+
shadowLight: "rgba(41, 46, 50, 0.05)",
|
|
664
|
+
shadowMedium: "rgba(41, 46, 50, 0.09)",
|
|
665
|
+
shadowHeavy: "rgba(41, 46, 50, 0.15)",
|
|
666
|
+
textHeading: "#292E32",
|
|
667
|
+
textOnPrimary: "#FFFFFF"
|
|
668
|
+
},
|
|
669
|
+
// dim 是 mono 的"主"暗态:用 open-props 经典 slate-gray 暗色(gray-12..9)做画布,
|
|
670
|
+
// 完美对应参考图中的深石墨色/冷灰色调,对比极强、层次细腻。
|
|
671
|
+
dark: {
|
|
672
|
+
// open-props: --orange-3 = #FFD599, --orange-4 = #FFBF66, --orange-5 = #FFAA33
|
|
673
|
+
primary: "#FFBF66",
|
|
674
|
+
primaryLight: "#FFD599",
|
|
675
|
+
primaryDark: "#FFAA33",
|
|
676
|
+
primaryGradient: "linear-gradient(135deg, #FFBF66, #FFAA33)",
|
|
677
|
+
primaryGhost: "rgba(255,191,102,0.12)",
|
|
678
|
+
primaryHover: "rgba(255,191,102,0.18)",
|
|
679
|
+
borderAccent: "#FFAA33",
|
|
680
|
+
success: "#4ADE80",
|
|
681
|
+
warning: "#FCD34D",
|
|
682
|
+
info: "#60A5FA",
|
|
683
|
+
error: "#F87171",
|
|
684
|
+
// open-props 冷系 slate-gray 暗色画布(H=210, S=10%)
|
|
685
|
+
background: "#292E32",
|
|
686
|
+
// gray-12
|
|
687
|
+
backgroundSecondary: "#3E454C",
|
|
688
|
+
// gray-11
|
|
689
|
+
backgroundTertiary: "#57616B",
|
|
690
|
+
// gray-10
|
|
691
|
+
backgroundGhost: "rgba(41,46,50,0.94)",
|
|
692
|
+
backgroundHover: "#4F5862",
|
|
693
|
+
// ~gray-10.5
|
|
694
|
+
backgroundSelected: "#6E7A87",
|
|
695
|
+
// gray-9
|
|
696
|
+
backgroundElevated: "#3E454C",
|
|
697
|
+
text: "#EBEDEF",
|
|
698
|
+
// gray-3
|
|
699
|
+
textSecondary: "#DDE0E3",
|
|
700
|
+
// gray-5
|
|
701
|
+
textTertiary: "#C1C7CD",
|
|
702
|
+
// gray-6
|
|
703
|
+
textQuaternary: "#7B8793",
|
|
704
|
+
// gray-8
|
|
705
|
+
textLight: "#3E454C",
|
|
706
|
+
placeholder: "#7B8793",
|
|
707
|
+
// 边框必须比所在表面亮一档,否则夜间卡片/分割线全部融进背景
|
|
708
|
+
border: "#4A525A",
|
|
709
|
+
borderHover: "#6E7A87",
|
|
710
|
+
borderLight: "#343A40",
|
|
711
|
+
messageBackground: "#3E454C",
|
|
712
|
+
codeBackground: "#1A1D20",
|
|
713
|
+
// 略深于 canvas 的冷墨色
|
|
714
|
+
// 基于深 slate-gray #0F1113 (RGB 15, 17, 19) 的有机阴影,在冷深色背景上极其细腻浮空
|
|
715
|
+
shadowLight: "rgba(15, 17, 19, 0.28)",
|
|
716
|
+
shadowMedium: "rgba(15, 17, 19, 0.45)",
|
|
717
|
+
shadowHeavy: "rgba(15, 17, 19, 0.65)",
|
|
718
|
+
textHeading: "#F1F2F4",
|
|
719
|
+
// 近白标题;橙色 heading 在夜间大标题上过于突兀
|
|
720
|
+
textOnPrimary: "#2E2E2E"
|
|
721
|
+
}
|
|
722
|
+
};
|
|
723
|
+
var catppuccin = {
|
|
724
|
+
// 保留 catppuccin 的柔和圆角 + 弹性缓动;色值换成 Ghostty "GitHub Light/Dark Default"
|
|
725
|
+
// 官方 palette,获得通透高对比的观感。合成后名字/位次不变,DEFAULT_THEME_NAME 不动。
|
|
726
|
+
// Reviewer 改进:dark textTertiary/quaternary 提亮达 WCAG AA;light warning 改琥珀色;
|
|
727
|
+
// light backgroundElevated 拉开与画布的层级,大圆角浮层不再粘连。
|
|
728
|
+
meta: { radiusBoost: 2, motionEase: "cubic-bezier(0.22, 1, 0.36, 1)" },
|
|
729
|
+
light: {
|
|
730
|
+
// Ghostty GitHub Light Default — 纯白 canvas + blue-500 accent
|
|
731
|
+
primary: "#0969DA",
|
|
732
|
+
primaryLight: "#218BFF",
|
|
733
|
+
primaryDark: "#0550AE",
|
|
734
|
+
primaryGradient: "linear-gradient(135deg, #0969DA, #218BFF)",
|
|
735
|
+
primaryGhost: "rgba(9,105,218,0.08)",
|
|
736
|
+
primaryHover: "rgba(9,105,218,0.10)",
|
|
737
|
+
borderAccent: "#54AEFF",
|
|
738
|
+
success: "#116329",
|
|
739
|
+
warning: "#9A6700",
|
|
740
|
+
info: "#0969DA",
|
|
741
|
+
error: "#CF222E",
|
|
742
|
+
background: "#FFFFFF",
|
|
743
|
+
backgroundSecondary: "#F6F8FA",
|
|
744
|
+
backgroundTertiary: "#E8ECF0",
|
|
745
|
+
backgroundGhost: "rgba(255,255,255,0.94)",
|
|
746
|
+
backgroundHover: "#E8ECF0",
|
|
747
|
+
backgroundSelected: "#D0D7DE",
|
|
748
|
+
backgroundElevated: "#F6F8FA",
|
|
749
|
+
text: "#1F2328",
|
|
750
|
+
textSecondary: "#57606A",
|
|
751
|
+
textTertiary: "#6E7781",
|
|
752
|
+
textQuaternary: "#8C959F",
|
|
753
|
+
textLight: "#D0D7DE",
|
|
754
|
+
placeholder: "#6E7781",
|
|
755
|
+
border: "#D0D7DE",
|
|
756
|
+
borderHover: "#B1BAC4",
|
|
757
|
+
borderLight: "#D8DEE4",
|
|
758
|
+
messageBackground: "#F6F8FA",
|
|
759
|
+
codeBackground: "#F6F8FA",
|
|
760
|
+
shadowLight: "rgba(0,0,0,0.04)",
|
|
761
|
+
shadowMedium: "rgba(0,0,0,0.08)",
|
|
762
|
+
shadowHeavy: "rgba(0,0,0,0.14)",
|
|
763
|
+
textOnPrimary: "#FFFFFF"
|
|
764
|
+
},
|
|
765
|
+
dark: {
|
|
766
|
+
// Ghostty GitHub Dark Default — #0D1117 canvas + sky blue #58A6FF accent
|
|
767
|
+
primary: "#58A6FF",
|
|
768
|
+
primaryLight: "#79C0FF",
|
|
769
|
+
primaryDark: "#1F6FEB",
|
|
770
|
+
primaryGradient: "linear-gradient(135deg, #58A6FF, #79C0FF)",
|
|
771
|
+
primaryGhost: "rgba(88,166,255,0.10)",
|
|
772
|
+
primaryHover: "rgba(88,166,255,0.12)",
|
|
773
|
+
borderAccent: "#1F6FEB",
|
|
774
|
+
success: "#3FB950",
|
|
775
|
+
warning: "#D29922",
|
|
776
|
+
info: "#58A6FF",
|
|
777
|
+
error: "#FF7B72",
|
|
778
|
+
background: "#0D1117",
|
|
779
|
+
backgroundSecondary: "#161B22",
|
|
780
|
+
backgroundTertiary: "#21262D",
|
|
781
|
+
backgroundGhost: "rgba(13,17,23,0.94)",
|
|
782
|
+
backgroundHover: "#1C2128",
|
|
783
|
+
backgroundSelected: "#1F6FEB",
|
|
784
|
+
backgroundElevated: "#161B22",
|
|
785
|
+
text: "#E6EDF3",
|
|
786
|
+
textSecondary: "#B1BAC4",
|
|
787
|
+
textTertiary: "#8B949E",
|
|
788
|
+
textQuaternary: "#6E7681",
|
|
789
|
+
textLight: "#30363D",
|
|
790
|
+
placeholder: "#6E7681",
|
|
791
|
+
border: "#30363D",
|
|
792
|
+
borderHover: "#424A53",
|
|
793
|
+
borderLight: "#21262D",
|
|
794
|
+
messageBackground: "#161B22",
|
|
795
|
+
codeBackground: "#161B22",
|
|
796
|
+
shadowLight: "rgba(13,17,23,0.18)",
|
|
797
|
+
shadowMedium: "rgba(13,17,23,0.30)",
|
|
798
|
+
shadowHeavy: "rgba(13,17,23,0.44)",
|
|
799
|
+
textHeading: "#E6EDF3",
|
|
800
|
+
textOnPrimary: "#0D1117"
|
|
801
|
+
}
|
|
802
|
+
};
|
|
803
|
+
|
|
804
|
+
// packages/app/theme/theme.config.ts
|
|
805
|
+
var SPACE = {
|
|
806
|
+
0: "0",
|
|
807
|
+
1: "4px",
|
|
808
|
+
2: "8px",
|
|
809
|
+
3: "12px",
|
|
810
|
+
4: "16px",
|
|
811
|
+
5: "20px",
|
|
812
|
+
6: "24px",
|
|
813
|
+
7: "28px",
|
|
814
|
+
8: "32px",
|
|
815
|
+
10: "40px",
|
|
816
|
+
12: "48px",
|
|
817
|
+
14: "56px",
|
|
818
|
+
16: "64px",
|
|
819
|
+
20: "80px",
|
|
820
|
+
24: "96px"
|
|
821
|
+
};
|
|
822
|
+
var THEME_COLORS = {
|
|
823
|
+
catppuccin,
|
|
824
|
+
trail,
|
|
825
|
+
wave,
|
|
826
|
+
iris,
|
|
827
|
+
rose,
|
|
828
|
+
mono
|
|
829
|
+
};
|
|
830
|
+
var THEME_NAME_ALIASES = {
|
|
831
|
+
// 原核心主题被精简
|
|
832
|
+
ocean: "catppuccin",
|
|
833
|
+
forest: "wave",
|
|
834
|
+
neutral: "catppuccin",
|
|
835
|
+
// 原向后兼容 alias
|
|
836
|
+
blue: "catppuccin",
|
|
837
|
+
purple: "iris",
|
|
838
|
+
green: "wave",
|
|
839
|
+
orange: "mono",
|
|
840
|
+
yellow: "mono",
|
|
841
|
+
graphite: "catppuccin",
|
|
842
|
+
pink: "rose",
|
|
843
|
+
red: "mono",
|
|
844
|
+
mocha: "catppuccin"
|
|
845
|
+
};
|
|
846
|
+
var DEFAULT_THEME_NAME = "catppuccin";
|
|
847
|
+
|
|
848
|
+
// packages/app/theme/themeModeBootstrap.ts
|
|
849
|
+
var THEME_MODE_VALUES = ["system", "light", "dark"];
|
|
850
|
+
var SYSTEM_DARK_MEDIA_QUERY = "(prefers-color-scheme: dark)";
|
|
851
|
+
var createLiteralGuard = (values) => (value) => typeof value === "string" && values.includes(value);
|
|
852
|
+
var isThemeMode = (value) => createLiteralGuard(THEME_MODE_VALUES)(value);
|
|
853
|
+
var normalizeThemeName = (value) => {
|
|
854
|
+
if (typeof value !== "string") return void 0;
|
|
855
|
+
const canonicalName = value in THEME_NAME_ALIASES ? THEME_NAME_ALIASES[value] : value;
|
|
856
|
+
return canonicalName in THEME_COLORS ? canonicalName : void 0;
|
|
857
|
+
};
|
|
858
|
+
var resolveThemeModeIsDark = (themeMode, systemPrefersDark) => themeMode === "dark" ? true : themeMode === "light" ? false : systemPrefersDark;
|
|
859
|
+
function readStoredThemeMode(storage) {
|
|
860
|
+
try {
|
|
861
|
+
const value = storage?.getItem("nolo-theme-mode");
|
|
862
|
+
return isThemeMode(value) ? value : "system";
|
|
863
|
+
} catch {
|
|
864
|
+
return "system";
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
function resolveThemeModePreload({
|
|
868
|
+
storage,
|
|
869
|
+
systemPrefersDark
|
|
870
|
+
}) {
|
|
871
|
+
const themeMode = readStoredThemeMode(storage);
|
|
872
|
+
return {
|
|
873
|
+
themeMode,
|
|
874
|
+
isDark: resolveThemeModeIsDark(themeMode, systemPrefersDark)
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
// packages/app/settings/settingTypes.ts
|
|
879
|
+
var SYSTEM_DEFAULT_AGENT_ID = "system-default";
|
|
880
|
+
|
|
881
|
+
// packages/app/settings/settingInitialState.ts
|
|
882
|
+
var _preloadedTheme = typeof window !== "undefined" ? resolveThemeModePreload({
|
|
883
|
+
storage: typeof localStorage !== "undefined" ? localStorage : void 0,
|
|
884
|
+
systemPrefersDark: typeof window.matchMedia === "function" ? window.matchMedia(SYSTEM_DARK_MEDIA_QUERY).matches : false
|
|
885
|
+
}) : { themeMode: "system", isDark: false };
|
|
886
|
+
var initialState = {
|
|
887
|
+
isAutoSync: false,
|
|
888
|
+
currentServer: isProduction ? SERVERS.MAIN : SERVERS.US,
|
|
889
|
+
syncServers: Object.values(SERVERS),
|
|
890
|
+
showThinking: true,
|
|
891
|
+
preferredAnimationSet: 0,
|
|
892
|
+
maxExecutionTime: 6e5,
|
|
893
|
+
maxCost: 1,
|
|
894
|
+
themeName: DEFAULT_THEME_NAME,
|
|
895
|
+
themeMode: _preloadedTheme.themeMode,
|
|
896
|
+
isDark: _preloadedTheme.isDark,
|
|
897
|
+
sidebarWidth: 280,
|
|
898
|
+
headerHeight: 56,
|
|
899
|
+
density: "compact",
|
|
900
|
+
fontPreset: DEFAULT_FONT_PRESET,
|
|
901
|
+
editorDefaultMode: "markdown",
|
|
902
|
+
editorLightCodeTheme: "default",
|
|
903
|
+
editorDarkCodeTheme: "okaidia",
|
|
904
|
+
editorWordCountEnabled: true,
|
|
905
|
+
editorShortcuts: {
|
|
906
|
+
heading: true,
|
|
907
|
+
ulist: true,
|
|
908
|
+
olist: true,
|
|
909
|
+
quote: true,
|
|
910
|
+
code: true,
|
|
911
|
+
tasklist: true
|
|
912
|
+
},
|
|
913
|
+
editorFontSize: 14,
|
|
914
|
+
editorAutoSave: true,
|
|
915
|
+
editorAutoSaveInterval: 30,
|
|
916
|
+
editorLineNumbers: false,
|
|
917
|
+
editorWordWrap: true,
|
|
918
|
+
editorSpellCheck: true,
|
|
919
|
+
editorTabSize: 2,
|
|
920
|
+
editorFontFamily: "SF Mono, Monaco, Cascadia Code, Roboto Mono, monospace",
|
|
921
|
+
enableReadCurrentSpace: true,
|
|
922
|
+
globalPrompt: "",
|
|
923
|
+
userTonePreset: "",
|
|
924
|
+
knowledgeCaptureLevel: DEFAULT_USER_PREFERENCE_PROFILE.knowledgeCaptureLevel,
|
|
925
|
+
spaceContextLevel: DEFAULT_USER_PREFERENCE_PROFILE.spaceContextLevel,
|
|
926
|
+
autoApproveSelfUpdateFields: [...DEFAULT_AUTO_APPROVED_SELF_UPDATE_FIELDS],
|
|
927
|
+
aiRecentContentLimit: 50,
|
|
928
|
+
defaultAgentId: SYSTEM_DEFAULT_AGENT_ID,
|
|
929
|
+
quickChatAutoAgentId: "",
|
|
930
|
+
ocrModel: "google_document_ocr",
|
|
931
|
+
showScrollToTopButton: false,
|
|
932
|
+
showScrollToBottomButton: false,
|
|
933
|
+
createMenuOpenCount: 0,
|
|
934
|
+
desktopChromeConnectorEnabled: false,
|
|
935
|
+
developerModeEnabled: false,
|
|
936
|
+
diagnosticModeEnabled: false,
|
|
937
|
+
deleteShortcut: typeof window !== "undefined" && typeof window.navigator !== "undefined" && /Mac|iPod|iPhone|iPad/.test(window.navigator.platform) ? "meta+backspace" : "ctrl+backspace"
|
|
938
|
+
};
|
|
939
|
+
|
|
940
|
+
// packages/database/userPreferenceRegister.ts
|
|
941
|
+
var USER_PREFERENCE_NAMES = {
|
|
942
|
+
AUTHORITY_HOME: "authority_home",
|
|
943
|
+
DEFAULT_AGENT: "agent_default"
|
|
944
|
+
};
|
|
945
|
+
var nextRegisterUpdatedAt = (previousRecord) => {
|
|
946
|
+
const previousTimestamp = Math.max(
|
|
947
|
+
toTimestampMs(previousRecord?.updatedAt),
|
|
948
|
+
toTimestampMs(previousRecord?.createdAt)
|
|
949
|
+
);
|
|
950
|
+
return Math.max(Date.now(), previousTimestamp + 1);
|
|
951
|
+
};
|
|
952
|
+
var buildUserPreferenceRegisterRecord = ({
|
|
953
|
+
userId,
|
|
954
|
+
preferenceName,
|
|
955
|
+
value,
|
|
956
|
+
previousRecord
|
|
957
|
+
}) => {
|
|
958
|
+
const updatedAt = nextRegisterUpdatedAt(previousRecord ?? void 0);
|
|
959
|
+
return {
|
|
960
|
+
type: "setting" /* SETTING */,
|
|
961
|
+
registerType: "user_preference",
|
|
962
|
+
preferenceName,
|
|
963
|
+
schemaVersion: 1,
|
|
964
|
+
userId,
|
|
965
|
+
value,
|
|
966
|
+
opId: ulid(),
|
|
967
|
+
createdAt: toTimestampMs(previousRecord?.createdAt) || updatedAt,
|
|
968
|
+
updatedAt
|
|
969
|
+
};
|
|
970
|
+
};
|
|
971
|
+
var readUserPreferenceRegisterValue = (record, preferenceName) => {
|
|
972
|
+
if (!record || typeof record !== "object") return void 0;
|
|
973
|
+
if (record.registerType !== "user_preference") return void 0;
|
|
974
|
+
if (record.preferenceName !== preferenceName) return void 0;
|
|
975
|
+
if (!("value" in record)) return void 0;
|
|
976
|
+
return record.value;
|
|
977
|
+
};
|
|
978
|
+
var buildDefaultAgentPreferenceRegisterRecord = ({
|
|
979
|
+
userId,
|
|
980
|
+
defaultAgentId,
|
|
981
|
+
previousRecord
|
|
982
|
+
}) => buildUserPreferenceRegisterRecord({
|
|
983
|
+
userId,
|
|
984
|
+
preferenceName: USER_PREFERENCE_NAMES.DEFAULT_AGENT,
|
|
985
|
+
value: defaultAgentId,
|
|
986
|
+
previousRecord
|
|
987
|
+
});
|
|
988
|
+
|
|
989
|
+
// packages/app/settings/dbActionThunks.ts
|
|
990
|
+
var getDefaultSettingDbActionThunks = () => ({
|
|
991
|
+
readAndWait,
|
|
992
|
+
patch,
|
|
993
|
+
upsert,
|
|
994
|
+
write
|
|
995
|
+
});
|
|
996
|
+
var settingDbActionThunksOverrideKey = Symbol.for(
|
|
997
|
+
"bun-nolo.app.settings.dbActionThunksOverride"
|
|
998
|
+
);
|
|
999
|
+
var getSettingDbActionThunks = () => {
|
|
1000
|
+
const globalOverride = globalThis[settingDbActionThunksOverrideKey];
|
|
1001
|
+
return globalOverride ?? getDefaultSettingDbActionThunks();
|
|
1002
|
+
};
|
|
1003
|
+
|
|
1004
|
+
// packages/app/settings/settingsRecord.ts
|
|
1005
|
+
var SETTINGS_RECORD_SCHEMA_VERSION = 1;
|
|
1006
|
+
var withSettingsRecordSchema = (changes) => ({
|
|
1007
|
+
...changes,
|
|
1008
|
+
schemaVersion: SETTINGS_RECORD_SCHEMA_VERSION
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
// packages/core/init.ts
|
|
1012
|
+
var nolotusId = "0e95801d90";
|
|
1013
|
+
var ADMIN_IDS = /* @__PURE__ */ new Set([nolotusId]);
|
|
1014
|
+
var isSystemAdmin = (userId) => userId != null && ADMIN_IDS.has(userId);
|
|
1015
|
+
var noloAgentId = BUILTIN_NOLO_AGENT_KEY;
|
|
1016
|
+
|
|
1017
|
+
// packages/app/settings/settingNormalizers.ts
|
|
1018
|
+
var hasOwn = (target, key) => Object.prototype.hasOwnProperty.call(target, key);
|
|
1019
|
+
var normalizeDefaultAgentIdSetting = (value) => {
|
|
1020
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
1021
|
+
return void 0;
|
|
1022
|
+
}
|
|
1023
|
+
return value === noloAgentId || value === SYSTEM_DEFAULT_AGENT_ID ? SYSTEM_DEFAULT_AGENT_ID : value;
|
|
1024
|
+
};
|
|
1025
|
+
var normalizeAuthorityHomeServerSetting = (value) => {
|
|
1026
|
+
const normalized = normalizeServerOrigin(value);
|
|
1027
|
+
return /^https?:\/\//i.test(normalized) ? normalized : null;
|
|
1028
|
+
};
|
|
1029
|
+
var normalizeTonePresetSetting = (value) => {
|
|
1030
|
+
switch (value) {
|
|
1031
|
+
case "professional":
|
|
1032
|
+
case "friendly":
|
|
1033
|
+
case "direct":
|
|
1034
|
+
case "pragmatic":
|
|
1035
|
+
case "default":
|
|
1036
|
+
return value;
|
|
1037
|
+
default:
|
|
1038
|
+
return DEFAULT_USER_PREFERENCE_PROFILE.tone?.preset ?? "default";
|
|
1039
|
+
}
|
|
1040
|
+
};
|
|
1041
|
+
var normalizePolicyLevelSetting = (value, fallback) => {
|
|
1042
|
+
const n = Number(value);
|
|
1043
|
+
if (n === 1 || n === 2 || n === 3 || n === 4) {
|
|
1044
|
+
return n;
|
|
1045
|
+
}
|
|
1046
|
+
return fallback;
|
|
1047
|
+
};
|
|
1048
|
+
var resolveDefaultAgentIdSetting = (value) => normalizeDefaultAgentIdSetting(value) ?? SYSTEM_DEFAULT_AGENT_ID;
|
|
1049
|
+
var selectResolvedDefaultAgentId = (value) => {
|
|
1050
|
+
const normalizedValue = resolveDefaultAgentIdSetting(value);
|
|
1051
|
+
return normalizedValue === SYSTEM_DEFAULT_AGENT_ID ? noloAgentId : normalizedValue;
|
|
1052
|
+
};
|
|
1053
|
+
var hexToRgbString = (value) => {
|
|
1054
|
+
if (typeof value !== "string") return null;
|
|
1055
|
+
const normalized = value.trim().replace(/^#/, "");
|
|
1056
|
+
const safe = normalized.length === 3 ? normalized.split("").map((char) => char + char).join("") : normalized;
|
|
1057
|
+
if (!/^[0-9a-fA-F]{6}$/.test(safe)) return null;
|
|
1058
|
+
const intValue = Number.parseInt(safe, 16);
|
|
1059
|
+
const r = intValue >> 16 & 255;
|
|
1060
|
+
const g = intValue >> 8 & 255;
|
|
1061
|
+
const b = intValue & 255;
|
|
1062
|
+
return `${r}, ${g}, ${b}`;
|
|
1063
|
+
};
|
|
1064
|
+
var alphaColor = (hex, alpha, fallback) => {
|
|
1065
|
+
const rgb = hexToRgbString(hex);
|
|
1066
|
+
return rgb ? `rgba(${rgb}, ${alpha})` : fallback;
|
|
1067
|
+
};
|
|
1068
|
+
var omitKeys = (record, keys) => {
|
|
1069
|
+
const next = { ...record };
|
|
1070
|
+
keys.forEach((key) => {
|
|
1071
|
+
delete next[key];
|
|
1072
|
+
});
|
|
1073
|
+
return next;
|
|
1074
|
+
};
|
|
1075
|
+
|
|
1076
|
+
// packages/app/settings/settingPersistence.ts
|
|
1077
|
+
var normalizeSettingChanges = (changes) => {
|
|
1078
|
+
let normalizedChanges = changes;
|
|
1079
|
+
if (hasOwn(normalizedChanges, "defaultAgentId")) {
|
|
1080
|
+
normalizedChanges = {
|
|
1081
|
+
...normalizedChanges,
|
|
1082
|
+
defaultAgentId: normalizeDefaultAgentIdSetting(
|
|
1083
|
+
normalizedChanges.defaultAgentId
|
|
1084
|
+
)
|
|
1085
|
+
};
|
|
1086
|
+
}
|
|
1087
|
+
if (hasOwn(normalizedChanges, "defaultSpaceId")) {
|
|
1088
|
+
normalizedChanges = omitKeys(normalizedChanges, [
|
|
1089
|
+
"defaultSpaceId"
|
|
1090
|
+
]);
|
|
1091
|
+
}
|
|
1092
|
+
if (hasOwn(normalizedChanges, "themeName")) {
|
|
1093
|
+
const themeName = normalizeThemeName(normalizedChanges.themeName);
|
|
1094
|
+
normalizedChanges = themeName ? { ...normalizedChanges, themeName } : omitKeys(normalizedChanges, ["themeName"]);
|
|
1095
|
+
}
|
|
1096
|
+
if (hasOwn(normalizedChanges, "fontPreset")) {
|
|
1097
|
+
const fontPreset = normalizeFontPreset(normalizedChanges.fontPreset);
|
|
1098
|
+
normalizedChanges = fontPreset ? { ...normalizedChanges, fontPreset } : omitKeys(normalizedChanges, ["fontPreset"]);
|
|
1099
|
+
}
|
|
1100
|
+
if (hasOwn(normalizedChanges, "userTonePreset")) {
|
|
1101
|
+
normalizedChanges = {
|
|
1102
|
+
...normalizedChanges,
|
|
1103
|
+
userTonePreset: normalizeTonePresetSetting(
|
|
1104
|
+
normalizedChanges.userTonePreset
|
|
1105
|
+
)
|
|
1106
|
+
};
|
|
1107
|
+
}
|
|
1108
|
+
if (hasOwn(normalizedChanges, "knowledgeCaptureLevel")) {
|
|
1109
|
+
normalizedChanges = {
|
|
1110
|
+
...normalizedChanges,
|
|
1111
|
+
knowledgeCaptureLevel: normalizePolicyLevelSetting(
|
|
1112
|
+
normalizedChanges.knowledgeCaptureLevel,
|
|
1113
|
+
DEFAULT_USER_PREFERENCE_PROFILE.knowledgeCaptureLevel
|
|
1114
|
+
)
|
|
1115
|
+
};
|
|
1116
|
+
}
|
|
1117
|
+
if (hasOwn(normalizedChanges, "spaceContextLevel")) {
|
|
1118
|
+
normalizedChanges = {
|
|
1119
|
+
...normalizedChanges,
|
|
1120
|
+
spaceContextLevel: normalizePolicyLevelSetting(
|
|
1121
|
+
normalizedChanges.spaceContextLevel,
|
|
1122
|
+
DEFAULT_USER_PREFERENCE_PROFILE.spaceContextLevel
|
|
1123
|
+
)
|
|
1124
|
+
};
|
|
1125
|
+
}
|
|
1126
|
+
if (hasOwn(normalizedChanges, "autoApproveSelfUpdateFields")) {
|
|
1127
|
+
normalizedChanges = {
|
|
1128
|
+
...normalizedChanges,
|
|
1129
|
+
autoApproveSelfUpdateFields: normalizeAgentUpdateFieldList(
|
|
1130
|
+
normalizedChanges.autoApproveSelfUpdateFields
|
|
1131
|
+
)
|
|
1132
|
+
};
|
|
1133
|
+
}
|
|
1134
|
+
return normalizedChanges;
|
|
1135
|
+
};
|
|
1136
|
+
var LOCAL_APPEARANCE_KEY_NAMES = [
|
|
1137
|
+
"themeName",
|
|
1138
|
+
"themeMode",
|
|
1139
|
+
"isDark",
|
|
1140
|
+
"density",
|
|
1141
|
+
"fontPreset"
|
|
1142
|
+
];
|
|
1143
|
+
var GUEST_UPDATABLE_KEY_NAMES = [
|
|
1144
|
+
...LOCAL_APPEARANCE_KEY_NAMES,
|
|
1145
|
+
"sidebarWidth"
|
|
1146
|
+
];
|
|
1147
|
+
var LOCAL_FIRST_APPEARANCE_KEYS = Object.freeze(
|
|
1148
|
+
Object.fromEntries(
|
|
1149
|
+
LOCAL_APPEARANCE_KEY_NAMES.map((key) => [key, true])
|
|
1150
|
+
)
|
|
1151
|
+
);
|
|
1152
|
+
var LOCAL_ONLY_SETTINGS_KEYS = LOCAL_FIRST_APPEARANCE_KEYS;
|
|
1153
|
+
var GUEST_UPDATABLE_KEYS = Object.freeze(
|
|
1154
|
+
Object.fromEntries(
|
|
1155
|
+
GUEST_UPDATABLE_KEY_NAMES.map((key) => [key, true])
|
|
1156
|
+
)
|
|
1157
|
+
);
|
|
1158
|
+
var isGuestUpdatableKey = (key) => key in GUEST_UPDATABLE_KEYS;
|
|
1159
|
+
var isLocalFirstAppearanceChange = (changes) => {
|
|
1160
|
+
const keys = Object.keys(changes);
|
|
1161
|
+
if (keys.length === 0) return false;
|
|
1162
|
+
return keys.every(
|
|
1163
|
+
(key) => isGuestUpdatableKey(key)
|
|
1164
|
+
);
|
|
1165
|
+
};
|
|
1166
|
+
var stripRegisterBackedFieldsFromSettingsWrite = (changes) => {
|
|
1167
|
+
return omitKeys(changes, [
|
|
1168
|
+
"defaultSpaceId",
|
|
1169
|
+
"userAuthorityRegistry",
|
|
1170
|
+
...LOCAL_APPEARANCE_KEY_NAMES
|
|
1171
|
+
]);
|
|
1172
|
+
};
|
|
1173
|
+
var sanitizeStoredSettingsRecord = (settingsRecord) => {
|
|
1174
|
+
if (!settingsRecord || typeof settingsRecord !== "object") {
|
|
1175
|
+
return null;
|
|
1176
|
+
}
|
|
1177
|
+
const record = settingsRecord;
|
|
1178
|
+
const sanitizedSettings = omitKeys(record, [
|
|
1179
|
+
"defaultSpaceId",
|
|
1180
|
+
"schemaVersion",
|
|
1181
|
+
...LOCAL_APPEARANCE_KEY_NAMES
|
|
1182
|
+
]);
|
|
1183
|
+
return Object.keys(sanitizedSettings).length > 0 ? sanitizedSettings : null;
|
|
1184
|
+
};
|
|
1185
|
+
var hydrateStoredSettings = ({
|
|
1186
|
+
userId,
|
|
1187
|
+
settingsRecord,
|
|
1188
|
+
authorityHomeServer
|
|
1189
|
+
}) => {
|
|
1190
|
+
const record = settingsRecord ?? {};
|
|
1191
|
+
const resolvedDefaultAgentId = normalizeDefaultAgentIdSetting(record.defaultAgentId) ?? SYSTEM_DEFAULT_AGENT_ID;
|
|
1192
|
+
const baseSettings = sanitizeStoredSettingsRecord(settingsRecord) ?? {};
|
|
1193
|
+
const normalizedAuthorityHome = normalizeAuthorityHomeServerSetting(authorityHomeServer);
|
|
1194
|
+
const existingRegistry = asRecordOrEmpty(
|
|
1195
|
+
baseSettings.userAuthorityRegistry
|
|
1196
|
+
);
|
|
1197
|
+
const userAuthorityRegistry = userId && normalizedAuthorityHome ? { ...existingRegistry, [userId]: normalizedAuthorityHome } : existingRegistry;
|
|
1198
|
+
const userAuthorityRegistryIsEmpty = Object.keys(userAuthorityRegistry).length === 0;
|
|
1199
|
+
const hydratedSettings = {
|
|
1200
|
+
...baseSettings,
|
|
1201
|
+
...userAuthorityRegistryIsEmpty ? {} : { userAuthorityRegistry },
|
|
1202
|
+
defaultAgentId: resolvedDefaultAgentId
|
|
1203
|
+
};
|
|
1204
|
+
return Object.keys(hydratedSettings).length > 0 ? hydratedSettings : null;
|
|
1205
|
+
};
|
|
1206
|
+
var buildSettingsPersistencePlan = ({
|
|
1207
|
+
userId,
|
|
1208
|
+
currentSettings,
|
|
1209
|
+
changes,
|
|
1210
|
+
previousDefaultAgentRecord
|
|
1211
|
+
}) => {
|
|
1212
|
+
const normalizedChanges = normalizeSettingChanges(changes);
|
|
1213
|
+
const persistedChanges = stripRegisterBackedFieldsFromSettingsWrite(normalizedChanges);
|
|
1214
|
+
const previousDefaultAgentId = normalizeDefaultAgentIdSetting(currentSettings.defaultAgentId) ?? SYSTEM_DEFAULT_AGENT_ID;
|
|
1215
|
+
const nextDefaultAgentId = normalizeDefaultAgentIdSetting(normalizedChanges.defaultAgentId) ?? null;
|
|
1216
|
+
const previousDefaultAgentValue = readUserPreferenceRegisterValue(
|
|
1217
|
+
previousDefaultAgentRecord,
|
|
1218
|
+
USER_PREFERENCE_NAMES.DEFAULT_AGENT
|
|
1219
|
+
) ?? null;
|
|
1220
|
+
const defaultAgentRegisterWrite = hasOwn(normalizedChanges, "defaultAgentId") && previousDefaultAgentId !== (nextDefaultAgentId ?? SYSTEM_DEFAULT_AGENT_ID) && (!previousDefaultAgentRecord || previousDefaultAgentValue !== nextDefaultAgentId) ? {
|
|
1221
|
+
customKey: createUserPreferenceKey.defaultAgent(userId),
|
|
1222
|
+
data: buildDefaultAgentPreferenceRegisterRecord({
|
|
1223
|
+
userId,
|
|
1224
|
+
defaultAgentId: nextDefaultAgentId,
|
|
1225
|
+
previousRecord: previousDefaultAgentRecord
|
|
1226
|
+
})
|
|
1227
|
+
} : null;
|
|
1228
|
+
const settingsPatch = Object.keys(persistedChanges).length > 0 ? {
|
|
1229
|
+
dbKey: createUserKey.settings(userId),
|
|
1230
|
+
changes: withSettingsRecordSchema(
|
|
1231
|
+
persistedChanges
|
|
1232
|
+
)
|
|
1233
|
+
} : null;
|
|
1234
|
+
return {
|
|
1235
|
+
normalizedChanges,
|
|
1236
|
+
defaultAgentRegisterWrite,
|
|
1237
|
+
settingsPatch
|
|
1238
|
+
};
|
|
1239
|
+
};
|
|
1240
|
+
var getCachedDefaultAgentRegisterRecord = (getState, registerKey) => {
|
|
1241
|
+
const record = getState().db.entities[registerKey];
|
|
1242
|
+
if (!record || typeof record !== "object") return null;
|
|
1243
|
+
return record;
|
|
1244
|
+
};
|
|
1245
|
+
var persistDefaultAgentRegister = async (dispatch, getState, userId, value) => {
|
|
1246
|
+
const registerKey = createUserPreferenceKey.defaultAgent(userId);
|
|
1247
|
+
let previousRecord = getCachedDefaultAgentRegisterRecord(getState, registerKey);
|
|
1248
|
+
if (!previousRecord) {
|
|
1249
|
+
previousRecord = await dispatch(
|
|
1250
|
+
getSettingDbActionThunks().readAndWait(registerKey)
|
|
1251
|
+
).unwrap().catch(() => null);
|
|
1252
|
+
}
|
|
1253
|
+
const previousValue = readUserPreferenceRegisterValue(
|
|
1254
|
+
previousRecord,
|
|
1255
|
+
USER_PREFERENCE_NAMES.DEFAULT_AGENT
|
|
1256
|
+
) ?? null;
|
|
1257
|
+
if (previousRecord && previousValue === value) {
|
|
1258
|
+
return;
|
|
1259
|
+
}
|
|
1260
|
+
await dispatch(
|
|
1261
|
+
getSettingDbActionThunks().write({
|
|
1262
|
+
customKey: registerKey,
|
|
1263
|
+
data: buildDefaultAgentPreferenceRegisterRecord({
|
|
1264
|
+
userId,
|
|
1265
|
+
defaultAgentId: value,
|
|
1266
|
+
previousRecord
|
|
1267
|
+
})
|
|
1268
|
+
})
|
|
1269
|
+
).unwrap();
|
|
1270
|
+
};
|
|
1271
|
+
|
|
1272
|
+
// packages/app/settings/serverSelectors.ts
|
|
1273
|
+
var resolveDesktopSafeServer = (value) => {
|
|
1274
|
+
if (!getIsDesktopApp()) return value || SERVERS.MAIN;
|
|
1275
|
+
return isLocalServerUrl(value) ? SERVERS.MAIN : value || SERVERS.MAIN;
|
|
1276
|
+
};
|
|
1277
|
+
var selectSettings = (state) => state.settings;
|
|
1278
|
+
var selectCurrentServer = createSelector(
|
|
1279
|
+
[selectSettings],
|
|
1280
|
+
(settings) => resolveDesktopSafeServer(settings.currentServer)
|
|
1281
|
+
);
|
|
1282
|
+
var selectSyncServers = createSelector(
|
|
1283
|
+
[selectSettings],
|
|
1284
|
+
(settings) => (settings.syncServers || []).filter(
|
|
1285
|
+
(server) => !getIsDesktopApp() || !isLocalServerUrl(server)
|
|
1286
|
+
)
|
|
1287
|
+
);
|
|
1288
|
+
var selectRemoteServer = selectCurrentServer;
|
|
1289
|
+
var selectRemoteSyncServers = selectSyncServers;
|
|
1290
|
+
var selectRemoteServers = createSelector(
|
|
1291
|
+
[selectRemoteServer, selectRemoteSyncServers],
|
|
1292
|
+
(currentServer, syncServers) => getAllServers(currentServer, syncServers)
|
|
1293
|
+
);
|
|
1294
|
+
|
|
1295
|
+
// packages/app/settings/fieldSelectors.ts
|
|
1296
|
+
var selectPreferredAnimationSet = (state) => state.settings.preferredAnimationSet ?? 0;
|
|
1297
|
+
var selectShowThinking = (state) => state.settings.showThinking;
|
|
1298
|
+
var selectMaxCost = (state) => state.settings.maxCost;
|
|
1299
|
+
var selectMaxExecutionTime = (state) => state.settings.maxExecutionTime;
|
|
1300
|
+
var selectIsDark = (state) => state.settings.isDark;
|
|
1301
|
+
var selectThemeMode = (state) => state.settings.themeMode ?? "system";
|
|
1302
|
+
var selectHeaderHeight = (state) => state.settings.headerHeight;
|
|
1303
|
+
var selectThemeName = (state) => state.settings.themeName;
|
|
1304
|
+
var selectThemeFollowsSystem = (state) => (state.settings.themeMode ?? "system") === "system";
|
|
1305
|
+
var selectSidebarWidth = (state) => state.settings.sidebarWidth;
|
|
1306
|
+
var selectDensity = (state) => state.settings.density ?? "compact";
|
|
1307
|
+
var selectFontPreset = (state) => normalizeFontPreset(state.settings.fontPreset) ?? DEFAULT_FONT_PRESET;
|
|
1308
|
+
var selectEnableReadCurrentSpace = (state) => state.settings.enableReadCurrentSpace;
|
|
1309
|
+
var selectGlobalPrompt = (state) => state.settings.globalPrompt;
|
|
1310
|
+
var selectUserTonePreset = (state) => normalizeTonePresetSetting(state.settings.userTonePreset);
|
|
1311
|
+
var selectKnowledgeCaptureLevel = (state) => normalizePolicyLevelSetting(
|
|
1312
|
+
state.settings.knowledgeCaptureLevel,
|
|
1313
|
+
DEFAULT_USER_PREFERENCE_PROFILE.knowledgeCaptureLevel
|
|
1314
|
+
);
|
|
1315
|
+
var selectSpaceContextLevel = (state) => state.settings.enableReadCurrentSpace === false ? 1 : normalizePolicyLevelSetting(
|
|
1316
|
+
state.settings.spaceContextLevel,
|
|
1317
|
+
DEFAULT_USER_PREFERENCE_PROFILE.spaceContextLevel
|
|
1318
|
+
);
|
|
1319
|
+
var selectAutoApproveSelfUpdateFields = createSelector(
|
|
1320
|
+
[(state) => state.settings.autoApproveSelfUpdateFields],
|
|
1321
|
+
(fields) => normalizeAgentUpdateFieldList(
|
|
1322
|
+
fields,
|
|
1323
|
+
DEFAULT_AUTO_APPROVED_SELF_UPDATE_FIELDS
|
|
1324
|
+
)
|
|
1325
|
+
);
|
|
1326
|
+
var selectAiRecentContentLimit = (state) => state.settings.aiRecentContentLimit ?? 50;
|
|
1327
|
+
var selectDefaultAgentPreference = (state) => resolveDefaultAgentIdSetting(state.settings.defaultAgentId);
|
|
1328
|
+
var selectDefaultAgentId = (state) => selectResolvedDefaultAgentId(state.settings.defaultAgentId);
|
|
1329
|
+
var selectOcrModel = (state) => {
|
|
1330
|
+
if (state.settings.ocrModel === "none") return "none";
|
|
1331
|
+
if (state.settings.ocrModel === "olm_ocr") return "olm_ocr";
|
|
1332
|
+
return "google_document_ocr";
|
|
1333
|
+
};
|
|
1334
|
+
var selectShowScrollToTopButton = (state) => state.settings.showScrollToTopButton ?? false;
|
|
1335
|
+
var selectShowScrollToBottomButton = (state) => state.settings.showScrollToBottomButton ?? false;
|
|
1336
|
+
var selectCreateMenuOpenCount = (state) => Math.floor(
|
|
1337
|
+
parsePositiveFiniteNumberOrFallback(state.settings.createMenuOpenCount, 0)
|
|
1338
|
+
);
|
|
1339
|
+
var selectDesktopChromeConnectorEnabled = (state) => state.settings.desktopChromeConnectorEnabled === true;
|
|
1340
|
+
var selectDeveloperModeEnabled = (state) => state.settings.developerModeEnabled === true;
|
|
1341
|
+
var selectDiagnosticModeEnabled = (state) => state.settings.diagnosticModeEnabled === true;
|
|
1342
|
+
var selectCopyDiagnosticsEnabled = (state) => selectDeveloperModeEnabled(state) && selectDiagnosticModeEnabled(state);
|
|
1343
|
+
var selectEditorDefaultMode = (state) => state.settings.editorDefaultMode;
|
|
1344
|
+
var selectEditorLightCodeTheme = (state) => state.settings.editorLightCodeTheme;
|
|
1345
|
+
var selectEditorDarkCodeTheme = (state) => state.settings.editorDarkCodeTheme;
|
|
1346
|
+
var selectEditorWordCountEnabled = (state) => state.settings.editorWordCountEnabled;
|
|
1347
|
+
var selectEditorShortcuts = (state) => state.settings.editorShortcuts;
|
|
1348
|
+
var PLATFORM_MAC_REGEX = /Mac|iPod|iPhone|iPad/;
|
|
1349
|
+
var isMacPlatform = () => typeof window !== "undefined" && typeof window.navigator !== "undefined" && PLATFORM_MAC_REGEX.test(window.navigator.platform);
|
|
1350
|
+
var selectDeleteShortcut = (state) => {
|
|
1351
|
+
const shortcut = state.settings.deleteShortcut;
|
|
1352
|
+
if (shortcut === void 0 || shortcut === null) {
|
|
1353
|
+
return isMacPlatform() ? "meta+backspace" : "ctrl+backspace";
|
|
1354
|
+
}
|
|
1355
|
+
return shortcut;
|
|
1356
|
+
};
|
|
1357
|
+
var selectEditorFontSize = (state) => state.settings.editorFontSize;
|
|
1358
|
+
var selectEditorAutoSave = (state) => state.settings.editorAutoSave;
|
|
1359
|
+
var selectEditorAutoSaveInterval = (state) => state.settings.editorAutoSaveInterval;
|
|
1360
|
+
|
|
1361
|
+
// packages/app/settings/editorConfigSelectors.ts
|
|
1362
|
+
var selectEditorCodeTheme = createSelector(
|
|
1363
|
+
[selectEditorLightCodeTheme, selectEditorDarkCodeTheme, selectIsDark],
|
|
1364
|
+
(lightTheme, darkTheme, isDark) => isDark ? darkTheme : lightTheme
|
|
1365
|
+
);
|
|
1366
|
+
var selectEditorConfig = createSelector(
|
|
1367
|
+
[
|
|
1368
|
+
selectEditorDefaultMode,
|
|
1369
|
+
selectEditorLightCodeTheme,
|
|
1370
|
+
selectEditorDarkCodeTheme,
|
|
1371
|
+
selectEditorWordCountEnabled,
|
|
1372
|
+
selectEditorShortcuts,
|
|
1373
|
+
selectEditorFontSize,
|
|
1374
|
+
selectEditorAutoSave,
|
|
1375
|
+
selectEditorAutoSaveInterval,
|
|
1376
|
+
selectIsDark
|
|
1377
|
+
],
|
|
1378
|
+
(defaultMode, lightCodeTheme, darkCodeTheme, wordCountEnabled, shortcuts, fontSize, autoSave, autoSaveInterval, isDark) => {
|
|
1379
|
+
const codeTheme = isDark ? darkCodeTheme : lightCodeTheme;
|
|
1380
|
+
return {
|
|
1381
|
+
defaultMode,
|
|
1382
|
+
codeTheme,
|
|
1383
|
+
lightCodeTheme,
|
|
1384
|
+
darkCodeTheme,
|
|
1385
|
+
wordCountEnabled,
|
|
1386
|
+
shortcuts,
|
|
1387
|
+
fontSize,
|
|
1388
|
+
autoSave,
|
|
1389
|
+
autoSaveInterval
|
|
1390
|
+
};
|
|
1391
|
+
}
|
|
1392
|
+
);
|
|
1393
|
+
|
|
1394
|
+
// packages/app/settings/themeSelectors.ts
|
|
1395
|
+
var isThemeData = (value) => {
|
|
1396
|
+
if (!value || typeof value !== "object") return false;
|
|
1397
|
+
const candidate = value;
|
|
1398
|
+
return typeof candidate.light === "object" && candidate.light !== null && typeof candidate.dark === "object" && candidate.dark !== null;
|
|
1399
|
+
};
|
|
1400
|
+
var readMeta = (themeData) => themeData.meta;
|
|
1401
|
+
var SPACIOUS_SPACE = {
|
|
1402
|
+
0: "0",
|
|
1403
|
+
1: "5px",
|
|
1404
|
+
2: "10px",
|
|
1405
|
+
3: "14px",
|
|
1406
|
+
4: "20px",
|
|
1407
|
+
5: "24px",
|
|
1408
|
+
6: "30px",
|
|
1409
|
+
7: "34px",
|
|
1410
|
+
8: "40px",
|
|
1411
|
+
10: "50px",
|
|
1412
|
+
12: "60px",
|
|
1413
|
+
14: "70px",
|
|
1414
|
+
16: "80px",
|
|
1415
|
+
20: "100px",
|
|
1416
|
+
24: "120px"
|
|
1417
|
+
};
|
|
1418
|
+
var SPACIOUS_FONT_SIZE = {
|
|
1419
|
+
xs: "12px",
|
|
1420
|
+
sm: "13px",
|
|
1421
|
+
base: "15px",
|
|
1422
|
+
md: "15.5px",
|
|
1423
|
+
lg: "17.5px",
|
|
1424
|
+
xl: "22px",
|
|
1425
|
+
"2xl": "26px",
|
|
1426
|
+
"3xl": "30px"
|
|
1427
|
+
};
|
|
1428
|
+
var SPACIOUS_LEADING = {
|
|
1429
|
+
tight: "1.4",
|
|
1430
|
+
normal: "1.6",
|
|
1431
|
+
relaxed: "1.75"
|
|
1432
|
+
};
|
|
1433
|
+
var SPACIOUS_CONTROL = {
|
|
1434
|
+
xs: "28px",
|
|
1435
|
+
sm: "32px",
|
|
1436
|
+
md: "40px",
|
|
1437
|
+
lg: "46px",
|
|
1438
|
+
xl: "56px"
|
|
1439
|
+
};
|
|
1440
|
+
var COMPACT_LEADING = {
|
|
1441
|
+
tight: "1.3",
|
|
1442
|
+
normal: "1.45",
|
|
1443
|
+
relaxed: "1.6"
|
|
1444
|
+
};
|
|
1445
|
+
var COMPACT_CONTROL = {
|
|
1446
|
+
xs: "24px",
|
|
1447
|
+
sm: "28px",
|
|
1448
|
+
md: "36px",
|
|
1449
|
+
lg: "40px",
|
|
1450
|
+
xl: "48px"
|
|
1451
|
+
};
|
|
1452
|
+
var COMPACT_FONT_SIZE = {
|
|
1453
|
+
xs: "11px",
|
|
1454
|
+
sm: "12px",
|
|
1455
|
+
base: "14px",
|
|
1456
|
+
md: "14px",
|
|
1457
|
+
lg: "16px",
|
|
1458
|
+
xl: "20px",
|
|
1459
|
+
"2xl": "24px",
|
|
1460
|
+
"3xl": "28px"
|
|
1461
|
+
};
|
|
1462
|
+
var FONT_WEIGHT = {
|
|
1463
|
+
normal: "400",
|
|
1464
|
+
medium: "500",
|
|
1465
|
+
semibold: "600",
|
|
1466
|
+
bold: "700"
|
|
1467
|
+
};
|
|
1468
|
+
var TRACKING = {
|
|
1469
|
+
tight: "-0.02em",
|
|
1470
|
+
normal: "0",
|
|
1471
|
+
wide: "0.02em"
|
|
1472
|
+
};
|
|
1473
|
+
var Z_INDEX = {
|
|
1474
|
+
sticky: 100,
|
|
1475
|
+
dropdown: 1e3,
|
|
1476
|
+
modalBackdrop: 1010,
|
|
1477
|
+
modal: 1020,
|
|
1478
|
+
toast: 1030,
|
|
1479
|
+
tooltip: 1040
|
|
1480
|
+
};
|
|
1481
|
+
var FALLBACK_PRIMARY_RGB = "59, 130, 246";
|
|
1482
|
+
var FALLBACK_SUCCESS_GHOST = "rgba(16, 185, 129, 0.12)";
|
|
1483
|
+
var FALLBACK_WARNING_GHOST = "rgba(245, 158, 11, 0.12)";
|
|
1484
|
+
var FALLBACK_INFO_GHOST = "rgba(59, 130, 246, 0.12)";
|
|
1485
|
+
var FALLBACK_ERROR_GHOST = "rgba(239, 68, 68, 0.12)";
|
|
1486
|
+
var FALLBACK_INVALID_BG = "rgba(239, 68, 68, 0.5)";
|
|
1487
|
+
var DEFAULT_MOTION_EASE = "cubic-bezier(0.33, 0, 0.2, 1)";
|
|
1488
|
+
var TIDE_MOTION_EASE = "cubic-bezier(0.22, 1, 0.36, 1)";
|
|
1489
|
+
var BREATH_MOTION_EASE = "cubic-bezier(0.4, 0, 0.6, 1)";
|
|
1490
|
+
var selectTheme = createSelector(
|
|
1491
|
+
[
|
|
1492
|
+
selectThemeName,
|
|
1493
|
+
selectIsDark,
|
|
1494
|
+
selectSidebarWidth,
|
|
1495
|
+
selectHeaderHeight,
|
|
1496
|
+
selectDensity,
|
|
1497
|
+
selectFontPreset
|
|
1498
|
+
],
|
|
1499
|
+
(themeName, isDark, sidebarWidth, headerHeight, density, fontPreset) => {
|
|
1500
|
+
const mode = isDark ? "dark" : "light";
|
|
1501
|
+
const validThemeName = THEME_COLORS[themeName] ? themeName : DEFAULT_THEME_NAME;
|
|
1502
|
+
const validFontPreset = normalizeFontPreset(fontPreset) ?? DEFAULT_FONT_PRESET;
|
|
1503
|
+
const themeCandidate = THEME_COLORS[validThemeName];
|
|
1504
|
+
if (!isThemeData(themeCandidate)) {
|
|
1505
|
+
throw new Error(
|
|
1506
|
+
`selectTheme: theme "${String(validThemeName)}" is missing required light/dark tables`
|
|
1507
|
+
);
|
|
1508
|
+
}
|
|
1509
|
+
const themeData = themeCandidate;
|
|
1510
|
+
const c = themeData[mode];
|
|
1511
|
+
const meta = readMeta(themeData);
|
|
1512
|
+
const compact = density === "compact";
|
|
1513
|
+
return {
|
|
1514
|
+
sidebarWidth: `${sidebarWidth}px`,
|
|
1515
|
+
headerHeight: `${headerHeight}px`,
|
|
1516
|
+
// Sidebar list density is intentionally tighter than form `control-md`
|
|
1517
|
+
// (36/40): long agent/dialog lists need more rows on screen. Header chrome
|
|
1518
|
+
// and nav rows should bind to these tokens, not control-md.
|
|
1519
|
+
sidebarItemHeight: compact ? "32px" : "36px",
|
|
1520
|
+
sidebarIconSize: compact ? "16px" : "18px",
|
|
1521
|
+
sidebarItemGap: compact ? "4px" : "6px",
|
|
1522
|
+
// Density-aware spacing scale (4px grid → 5px grid)
|
|
1523
|
+
space: compact ? SPACE : SPACIOUS_SPACE,
|
|
1524
|
+
// Semantic typography scale
|
|
1525
|
+
fontSize: compact ? COMPACT_FONT_SIZE : SPACIOUS_FONT_SIZE,
|
|
1526
|
+
// Font weight scale
|
|
1527
|
+
fontWeight: FONT_WEIGHT,
|
|
1528
|
+
// Letter spacing scale
|
|
1529
|
+
tracking: TRACKING,
|
|
1530
|
+
// Semantic line-height scale
|
|
1531
|
+
leading: compact ? COMPACT_LEADING : SPACIOUS_LEADING,
|
|
1532
|
+
// Component height scale (buttons, inputs, list items)
|
|
1533
|
+
control: compact ? COMPACT_CONTROL : SPACIOUS_CONTROL,
|
|
1534
|
+
// Border radius scale — xs/sm/md map to control/surface/overlay tiers.
|
|
1535
|
+
// lg/xl remain as aliases for gradual migration of legacy CSS.
|
|
1536
|
+
radius: (() => {
|
|
1537
|
+
const boost = meta?.radiusBoost ?? 0;
|
|
1538
|
+
const xs = compact ? "10px" : "12px";
|
|
1539
|
+
const sm = compact ? `${14 + boost}px` : `${16 + boost}px`;
|
|
1540
|
+
const md = compact ? "20px" : "24px";
|
|
1541
|
+
return { xs, sm, md, lg: sm, xl: md };
|
|
1542
|
+
})(),
|
|
1543
|
+
motionEase: meta?.motionEase ?? DEFAULT_MOTION_EASE,
|
|
1544
|
+
motionEaseTide: TIDE_MOTION_EASE,
|
|
1545
|
+
motionEaseBreath: BREATH_MOTION_EASE,
|
|
1546
|
+
motionDuration: "0.32s",
|
|
1547
|
+
motionDurationSlow: "0.52s",
|
|
1548
|
+
// Popover/menu/dropdown shell — the single source of truth for every
|
|
1549
|
+
// floating panel. Consumers read --popover-* only; the radius tier is
|
|
1550
|
+
// encapsulated here so a retune stays a one-line change.
|
|
1551
|
+
popover: (() => {
|
|
1552
|
+
const boost = meta?.radiusBoost ?? 0;
|
|
1553
|
+
const radius = compact ? `${14 + boost}px` : `${16 + boost}px`;
|
|
1554
|
+
const pad = "6px";
|
|
1555
|
+
return {
|
|
1556
|
+
// 弹层是最上浮的层:light 下 background(雪白)亮于下沉面板 elevated;
|
|
1557
|
+
// dark 下相反,elevated 才是更亮的上浮面,必须取 brighter 的那个。
|
|
1558
|
+
bg: alphaColor(
|
|
1559
|
+
isDark ? c.backgroundElevated ?? c.background : c.background,
|
|
1560
|
+
isDark ? 0.86 : 0.92,
|
|
1561
|
+
isDark ? c.backgroundElevated ?? c.background : c.background
|
|
1562
|
+
),
|
|
1563
|
+
border: alphaColor(c.border, isDark ? 0.5 : 0.7, c.borderLight),
|
|
1564
|
+
// Layered: a wide ambient pool plus a tight contact edge. The pair is
|
|
1565
|
+
// what reads as "lifted" rather than "outlined".
|
|
1566
|
+
shadow: [
|
|
1567
|
+
`0 18px 44px -24px ${c.shadowHeavy}`,
|
|
1568
|
+
`0 4px 12px -6px ${c.shadowMedium}`,
|
|
1569
|
+
`0 1px 1px -0.5px ${c.shadowLight}`
|
|
1570
|
+
].join(", "),
|
|
1571
|
+
radius,
|
|
1572
|
+
pad,
|
|
1573
|
+
itemRadius: `calc(${radius} - ${pad})`,
|
|
1574
|
+
blur: "24px",
|
|
1575
|
+
// Enter/exit travel. Small on purpose: the panel should settle, not fly.
|
|
1576
|
+
travel: "6px",
|
|
1577
|
+
duration: "0.18s",
|
|
1578
|
+
durationExit: "0.12s",
|
|
1579
|
+
ease: meta?.motionEase ?? DEFAULT_MOTION_EASE
|
|
1580
|
+
};
|
|
1581
|
+
})(),
|
|
1582
|
+
font: FONT_PRESET_CSS_VARIABLES[validFontPreset],
|
|
1583
|
+
// Z-index scale aligned with existing hardcoded layers
|
|
1584
|
+
z: Z_INDEX,
|
|
1585
|
+
// Semantic spacing aliases
|
|
1586
|
+
contentPadding: compact ? "16px" : "20px",
|
|
1587
|
+
sectionGap: compact ? "32px" : "40px",
|
|
1588
|
+
cardPadding: compact ? "16px" : "20px",
|
|
1589
|
+
inputPadding: compact ? "8px 12px" : "10px 14px",
|
|
1590
|
+
...c,
|
|
1591
|
+
borderSubtle: c.borderLight,
|
|
1592
|
+
borderFaint: alphaColor(c.border, isDark ? 0.22 : 0.35, c.borderLight),
|
|
1593
|
+
borderStrong: c.borderHover,
|
|
1594
|
+
surface: c.backgroundSecondary,
|
|
1595
|
+
surfaceElevated: c.backgroundTertiary,
|
|
1596
|
+
surfaceCanvas: c.background,
|
|
1597
|
+
surfaceSidebar: isDark ? c.backgroundSecondary : c.background,
|
|
1598
|
+
surfacePanel: c.backgroundSecondary,
|
|
1599
|
+
surfaceCard: c.messageBackground,
|
|
1600
|
+
surfaceRaised: isDark ? c.backgroundTertiary : c.backgroundSecondary,
|
|
1601
|
+
surfaceInset: isDark ? c.backgroundSecondary : alphaColor(c.borderHover, 0.05, c.codeBackground),
|
|
1602
|
+
surfaceCode: c.codeBackground,
|
|
1603
|
+
surfaceInteractive: c.backgroundTertiary,
|
|
1604
|
+
surfaceInteractiveHover: c.backgroundHover,
|
|
1605
|
+
textMuted: c.textSecondary,
|
|
1606
|
+
textSubtle: c.textTertiary,
|
|
1607
|
+
textHeading: c.textHeading ?? c.text,
|
|
1608
|
+
borderMuted: alphaColor(
|
|
1609
|
+
c.borderHover,
|
|
1610
|
+
isDark ? 0.3 : 0.24,
|
|
1611
|
+
c.borderLight
|
|
1612
|
+
),
|
|
1613
|
+
accentSoft: alphaColor(c.primary, isDark ? 0.18 : 0.1, c.primaryGhost),
|
|
1614
|
+
shadow: c.shadowMedium,
|
|
1615
|
+
shadow1: `0 1px 2px ${c.shadowLight}`,
|
|
1616
|
+
shadow2: `0 8px 24px -12px ${c.shadowMedium}`,
|
|
1617
|
+
shadow3: `0 18px 44px -24px ${c.shadowHeavy}`,
|
|
1618
|
+
primaryBorder: c.borderAccent ?? c.primary,
|
|
1619
|
+
primaryBgStrong: alphaColor(
|
|
1620
|
+
c.primary,
|
|
1621
|
+
isDark ? 0.18 : 0.1,
|
|
1622
|
+
c.primaryGhost
|
|
1623
|
+
),
|
|
1624
|
+
success: c.success,
|
|
1625
|
+
warning: c.warning,
|
|
1626
|
+
info: c.info,
|
|
1627
|
+
successGhost: alphaColor(
|
|
1628
|
+
c.success,
|
|
1629
|
+
isDark ? 0.2 : 0.12,
|
|
1630
|
+
FALLBACK_SUCCESS_GHOST
|
|
1631
|
+
),
|
|
1632
|
+
warningGhost: alphaColor(
|
|
1633
|
+
c.warning,
|
|
1634
|
+
isDark ? 0.2 : 0.12,
|
|
1635
|
+
FALLBACK_WARNING_GHOST
|
|
1636
|
+
),
|
|
1637
|
+
infoGhost: alphaColor(c.info, isDark ? 0.2 : 0.12, FALLBACK_INFO_GHOST),
|
|
1638
|
+
errorGhost: alphaColor(
|
|
1639
|
+
c.error,
|
|
1640
|
+
isDark ? 0.2 : 0.12,
|
|
1641
|
+
FALLBACK_ERROR_GHOST
|
|
1642
|
+
),
|
|
1643
|
+
primaryRgb: hexToRgbString(c.primary) ?? FALLBACK_PRIMARY_RGB,
|
|
1644
|
+
focusRing: alphaColor(c.primary, isDark ? 0.3 : 0.22, c.primaryGhost),
|
|
1645
|
+
// Generic interactive state tokens (dark-mode aware)
|
|
1646
|
+
hoverBg: alphaColor(c.text, isDark ? 0.06 : 0.04, c.backgroundTertiary),
|
|
1647
|
+
activeBg: alphaColor(c.text, isDark ? 0.1 : 0.08, c.backgroundTertiary),
|
|
1648
|
+
disabledText: c.textTertiary,
|
|
1649
|
+
disabledBg: c.backgroundSecondary,
|
|
1650
|
+
// Code block tokens
|
|
1651
|
+
codeBg: c.codeBackground,
|
|
1652
|
+
codeText: c.text,
|
|
1653
|
+
// Text selection token
|
|
1654
|
+
selectionBg: alphaColor(c.primary, isDark ? 0.2 : 0.15, c.primaryGhost),
|
|
1655
|
+
// ── --focus 全局 token(消除 ~30 处内联 fallback)──────────
|
|
1656
|
+
focus: alphaColor(c.primary, isDark ? 0.3 : 0.22, c.primaryGhost),
|
|
1657
|
+
// ── RAC 别名层(让 RAC 组件自动获得项目主题色)──────────
|
|
1658
|
+
focusRingColor: c.primary,
|
|
1659
|
+
invalidColor: c.error,
|
|
1660
|
+
buttonBackground: alphaColor(
|
|
1661
|
+
c.primary,
|
|
1662
|
+
isDark ? 0.12 : 0.08,
|
|
1663
|
+
c.primaryGhost
|
|
1664
|
+
),
|
|
1665
|
+
buttonBackgroundPressed: alphaColor(
|
|
1666
|
+
c.primary,
|
|
1667
|
+
isDark ? 0.18 : 0.12,
|
|
1668
|
+
c.primaryGhost
|
|
1669
|
+
),
|
|
1670
|
+
highlightBackground: c.primary,
|
|
1671
|
+
highlightForeground: c.textOnPrimary,
|
|
1672
|
+
highlightBackgroundPressed: c.primary,
|
|
1673
|
+
highlightOverlay: alphaColor(
|
|
1674
|
+
c.primary,
|
|
1675
|
+
isDark ? 0.15 : 0.1,
|
|
1676
|
+
c.primaryGhost
|
|
1677
|
+
),
|
|
1678
|
+
highlightBackgroundInvalid: alphaColor(
|
|
1679
|
+
c.error,
|
|
1680
|
+
isDark ? 0.55 : 0.5,
|
|
1681
|
+
FALLBACK_INVALID_BG
|
|
1682
|
+
),
|
|
1683
|
+
fieldBackground: c.backgroundSecondary,
|
|
1684
|
+
fieldTextColor: c.text,
|
|
1685
|
+
linkColor: c.primary,
|
|
1686
|
+
linkColorSecondary: c.text,
|
|
1687
|
+
linkColorPressed: c.primaryDark,
|
|
1688
|
+
borderColorDisabled: c.borderLight
|
|
1689
|
+
};
|
|
1690
|
+
}
|
|
1691
|
+
);
|
|
1692
|
+
|
|
1693
|
+
// packages/app/settings/settingActions.ts
|
|
1694
|
+
var updateSettingsState = createAction(
|
|
1695
|
+
"settings/_updateSettingsState"
|
|
1696
|
+
);
|
|
1697
|
+
|
|
1698
|
+
// packages/app/settings/settingThunks.ts
|
|
1699
|
+
var getSettings = createAsyncThunk("settings/getSettings", async (_, { dispatch, getState }) => {
|
|
1700
|
+
const userId = selectIdentityUserId(getState());
|
|
1701
|
+
if (!userId) return null;
|
|
1702
|
+
const settingsKey = createUserKey.settings(userId);
|
|
1703
|
+
const authorityHomeKey = createUserPreferenceKey.authorityHome(userId);
|
|
1704
|
+
const [settingsRecord, authorityHomeRecord] = await Promise.all([
|
|
1705
|
+
dispatch(getSettingDbActionThunks().readAndWait(settingsKey)).unwrap().catch(() => null),
|
|
1706
|
+
dispatch(getSettingDbActionThunks().readAndWait(authorityHomeKey)).unwrap().catch(() => null)
|
|
1707
|
+
]);
|
|
1708
|
+
const authorityHomeServer = readUserPreferenceRegisterValue(
|
|
1709
|
+
authorityHomeRecord,
|
|
1710
|
+
USER_PREFERENCE_NAMES.AUTHORITY_HOME
|
|
1711
|
+
) ?? null;
|
|
1712
|
+
const hydrated = hydrateStoredSettings({
|
|
1713
|
+
userId,
|
|
1714
|
+
settingsRecord,
|
|
1715
|
+
authorityHomeServer
|
|
1716
|
+
});
|
|
1717
|
+
if (hydrated) {
|
|
1718
|
+
const normalizedPayload = normalizeSettingChanges(
|
|
1719
|
+
hydrated
|
|
1720
|
+
);
|
|
1721
|
+
const { currentServer: _ignored, ...settingsToApply } = normalizedPayload;
|
|
1722
|
+
dispatch(updateSettingsState(settingsToApply));
|
|
1723
|
+
}
|
|
1724
|
+
return hydrated;
|
|
1725
|
+
});
|
|
1726
|
+
var setSettings = createAsyncThunk("settings/setSettings", async (changes, { dispatch, getState }) => {
|
|
1727
|
+
const currentSettings = getState().settings;
|
|
1728
|
+
const normalizedChanges = normalizeSettingChanges(changes);
|
|
1729
|
+
const previousDefaultAgentId = normalizeDefaultAgentIdSetting(currentSettings.defaultAgentId) ?? SYSTEM_DEFAULT_AGENT_ID;
|
|
1730
|
+
const userId = selectIdentityUserId(getState());
|
|
1731
|
+
if (!userId) {
|
|
1732
|
+
const hasAppearanceChanges = Object.keys(normalizedChanges).length > 0;
|
|
1733
|
+
if (hasAppearanceChanges) {
|
|
1734
|
+
if (!isLocalFirstAppearanceChange(normalizedChanges)) {
|
|
1735
|
+
throw new Error("User not found for persisting settings.");
|
|
1736
|
+
}
|
|
1737
|
+
} else {
|
|
1738
|
+
throw new Error("User not found for persisting settings.");
|
|
1739
|
+
}
|
|
1740
|
+
dispatch(updateSettingsState(normalizedChanges));
|
|
1741
|
+
return normalizedChanges;
|
|
1742
|
+
}
|
|
1743
|
+
const persistencePlan = buildSettingsPersistencePlan({
|
|
1744
|
+
userId,
|
|
1745
|
+
currentSettings,
|
|
1746
|
+
changes: normalizedChanges,
|
|
1747
|
+
previousDefaultAgentRecord: null
|
|
1748
|
+
});
|
|
1749
|
+
dispatch(updateSettingsState(persistencePlan.normalizedChanges));
|
|
1750
|
+
const nextDefaultAgentId = normalizeDefaultAgentIdSetting(
|
|
1751
|
+
persistencePlan.normalizedChanges.defaultAgentId
|
|
1752
|
+
) ?? null;
|
|
1753
|
+
if (hasOwn(changes, "defaultAgentId") && previousDefaultAgentId !== (nextDefaultAgentId ?? SYSTEM_DEFAULT_AGENT_ID)) {
|
|
1754
|
+
await persistDefaultAgentRegister(
|
|
1755
|
+
dispatch,
|
|
1756
|
+
getState,
|
|
1757
|
+
userId,
|
|
1758
|
+
nextDefaultAgentId
|
|
1759
|
+
);
|
|
1760
|
+
}
|
|
1761
|
+
if (persistencePlan.settingsPatch) {
|
|
1762
|
+
await dispatch(
|
|
1763
|
+
getSettingDbActionThunks().upsert({
|
|
1764
|
+
dbKey: persistencePlan.settingsPatch.dbKey,
|
|
1765
|
+
data: persistencePlan.settingsPatch.changes
|
|
1766
|
+
})
|
|
1767
|
+
).unwrap();
|
|
1768
|
+
}
|
|
1769
|
+
return persistencePlan.normalizedChanges;
|
|
1770
|
+
});
|
|
1771
|
+
var changeTheme = createAsyncThunk(
|
|
1772
|
+
"settings/changeTheme",
|
|
1773
|
+
async (themeName, { dispatch }) => dispatch(setSettings({ themeName })).unwrap()
|
|
1774
|
+
);
|
|
1775
|
+
var changeDensity = createAsyncThunk(
|
|
1776
|
+
"settings/changeDensity",
|
|
1777
|
+
async (density, { dispatch }) => dispatch(setSettings({ density })).unwrap()
|
|
1778
|
+
);
|
|
1779
|
+
var changeFontPreset = createAsyncThunk(
|
|
1780
|
+
"settings/changeFontPreset",
|
|
1781
|
+
async (fontPreset, { dispatch }) => {
|
|
1782
|
+
const normalized = normalizeFontPreset(fontPreset) ?? fontPreset;
|
|
1783
|
+
return dispatch(setSettings({ fontPreset: normalized })).unwrap();
|
|
1784
|
+
}
|
|
1785
|
+
);
|
|
1786
|
+
var changeDarkMode = createAsyncThunk(
|
|
1787
|
+
"settings/changeDarkMode",
|
|
1788
|
+
async (isDark, { dispatch }) => dispatch(
|
|
1789
|
+
setSettings({ isDark, themeMode: isDark ? "dark" : "light" })
|
|
1790
|
+
).unwrap()
|
|
1791
|
+
);
|
|
1792
|
+
var toggleShowThinking = createAsyncThunk(
|
|
1793
|
+
"settings/toggleShowThinking",
|
|
1794
|
+
async (_, { dispatch, getState }) => {
|
|
1795
|
+
const currentShowThinking = getState().settings.showThinking;
|
|
1796
|
+
return dispatch(
|
|
1797
|
+
setSettings({ showThinking: !currentShowThinking })
|
|
1798
|
+
).unwrap();
|
|
1799
|
+
}
|
|
1800
|
+
);
|
|
1801
|
+
var setThemeFollowsSystem = createAsyncThunk(
|
|
1802
|
+
"settings/setThemeFollowsSystem",
|
|
1803
|
+
async (follows, { dispatch }) => dispatch(setSettings({ themeMode: follows ? "system" : "light" })).unwrap()
|
|
1804
|
+
);
|
|
1805
|
+
var setSidebarWidth = createAsyncThunk(
|
|
1806
|
+
"settings/setSidebarWidth",
|
|
1807
|
+
async (sidebarWidth, { dispatch }) => dispatch(setSettings({ sidebarWidth })).unwrap()
|
|
1808
|
+
);
|
|
1809
|
+
var toggleEnableReadCurrentSpace = createAsyncThunk(
|
|
1810
|
+
"settings/toggleEnableReadCurrentSpace",
|
|
1811
|
+
async (_, { dispatch, getState }) => {
|
|
1812
|
+
const current = getState().settings.enableReadCurrentSpace;
|
|
1813
|
+
return dispatch(
|
|
1814
|
+
setSettings({
|
|
1815
|
+
enableReadCurrentSpace: !current,
|
|
1816
|
+
spaceContextLevel: current ? 1 : DEFAULT_USER_PREFERENCE_PROFILE.spaceContextLevel
|
|
1817
|
+
})
|
|
1818
|
+
).unwrap();
|
|
1819
|
+
}
|
|
1820
|
+
);
|
|
1821
|
+
var setEditorDefaultMode = createAsyncThunk(
|
|
1822
|
+
"settings/setEditorDefaultMode",
|
|
1823
|
+
async (mode, { dispatch }) => dispatch(setSettings({ editorDefaultMode: mode })).unwrap()
|
|
1824
|
+
);
|
|
1825
|
+
var setEditorLightCodeTheme = createAsyncThunk(
|
|
1826
|
+
"settings/setEditorLightCodeTheme",
|
|
1827
|
+
async (theme, { dispatch }) => dispatch(setSettings({ editorLightCodeTheme: theme })).unwrap()
|
|
1828
|
+
);
|
|
1829
|
+
var setEditorDarkCodeTheme = createAsyncThunk(
|
|
1830
|
+
"settings/setEditorDarkCodeTheme",
|
|
1831
|
+
async (theme, { dispatch }) => dispatch(setSettings({ editorDarkCodeTheme: theme })).unwrap()
|
|
1832
|
+
);
|
|
1833
|
+
var setEditorCodeTheme = createAsyncThunk(
|
|
1834
|
+
"settings/setEditorCodeTheme",
|
|
1835
|
+
async (theme, { dispatch }) => dispatch(
|
|
1836
|
+
setSettings({
|
|
1837
|
+
editorLightCodeTheme: theme,
|
|
1838
|
+
editorDarkCodeTheme: theme
|
|
1839
|
+
})
|
|
1840
|
+
).unwrap()
|
|
1841
|
+
);
|
|
1842
|
+
var toggleEditorWordCount = createAsyncThunk(
|
|
1843
|
+
"settings/toggleEditorWordCount",
|
|
1844
|
+
async (_, { dispatch, getState }) => {
|
|
1845
|
+
const current = getState().settings.editorWordCountEnabled;
|
|
1846
|
+
return dispatch(setSettings({ editorWordCountEnabled: !current })).unwrap();
|
|
1847
|
+
}
|
|
1848
|
+
);
|
|
1849
|
+
var toggleEditorShortcut = createAsyncThunk(
|
|
1850
|
+
"settings/toggleEditorShortcut",
|
|
1851
|
+
async (key, { dispatch, getState }) => {
|
|
1852
|
+
const currentShortcuts = getState().settings.editorShortcuts;
|
|
1853
|
+
const newShortcuts = {
|
|
1854
|
+
...currentShortcuts,
|
|
1855
|
+
[key]: !currentShortcuts[key]
|
|
1856
|
+
};
|
|
1857
|
+
return dispatch(setSettings({ editorShortcuts: newShortcuts })).unwrap();
|
|
1858
|
+
}
|
|
1859
|
+
);
|
|
1860
|
+
var setEditorFontSize = createAsyncThunk(
|
|
1861
|
+
"settings/setEditorFontSize",
|
|
1862
|
+
async (fontSize, { dispatch }) => dispatch(setSettings({ editorFontSize: fontSize })).unwrap()
|
|
1863
|
+
);
|
|
1864
|
+
var toggleEditorAutoSave = createAsyncThunk(
|
|
1865
|
+
"settings/toggleEditorAutoSave",
|
|
1866
|
+
async (_, { dispatch, getState }) => {
|
|
1867
|
+
const current = getState().settings.editorAutoSave;
|
|
1868
|
+
return dispatch(setSettings({ editorAutoSave: !current })).unwrap();
|
|
1869
|
+
}
|
|
1870
|
+
);
|
|
1871
|
+
var setEditorAutoSaveInterval = createAsyncThunk(
|
|
1872
|
+
"settings/setEditorAutoSaveInterval",
|
|
1873
|
+
async (interval, { dispatch }) => dispatch(setSettings({ editorAutoSaveInterval: interval })).unwrap()
|
|
1874
|
+
);
|
|
1875
|
+
var setGlobalPrompt = createAsyncThunk(
|
|
1876
|
+
"settings/setGlobalPrompt",
|
|
1877
|
+
async (prompt, { dispatch }) => dispatch(setSettings({ globalPrompt: prompt })).unwrap()
|
|
1878
|
+
);
|
|
1879
|
+
var setUserTonePreset = createAsyncThunk(
|
|
1880
|
+
"settings/setUserTonePreset",
|
|
1881
|
+
async (tone, { dispatch }) => dispatch(setSettings({ userTonePreset: tone })).unwrap()
|
|
1882
|
+
);
|
|
1883
|
+
var setKnowledgeCaptureLevel = createAsyncThunk(
|
|
1884
|
+
"settings/setKnowledgeCaptureLevel",
|
|
1885
|
+
async (level, { dispatch }) => dispatch(setSettings({ knowledgeCaptureLevel: level })).unwrap()
|
|
1886
|
+
);
|
|
1887
|
+
var setSpaceContextLevel = createAsyncThunk(
|
|
1888
|
+
"settings/setSpaceContextLevel",
|
|
1889
|
+
async (level, { dispatch }) => dispatch(
|
|
1890
|
+
setSettings({
|
|
1891
|
+
spaceContextLevel: level,
|
|
1892
|
+
enableReadCurrentSpace: level > 1
|
|
1893
|
+
})
|
|
1894
|
+
).unwrap()
|
|
1895
|
+
);
|
|
1896
|
+
var setAiRecentContentLimit = createAsyncThunk(
|
|
1897
|
+
"settings/setAiRecentContentLimit",
|
|
1898
|
+
async (limit, { dispatch }) => dispatch(setSettings({ aiRecentContentLimit: limit })).unwrap()
|
|
1899
|
+
);
|
|
1900
|
+
var setMaxExecutionTime = createAsyncThunk(
|
|
1901
|
+
"settings/setMaxExecutionTime",
|
|
1902
|
+
async (time, { dispatch }) => dispatch(setSettings({ maxExecutionTime: time })).unwrap()
|
|
1903
|
+
);
|
|
1904
|
+
var setDefaultAgentId = createAsyncThunk(
|
|
1905
|
+
"settings/setDefaultAgentId",
|
|
1906
|
+
async (agentId, { dispatch }) => dispatch(
|
|
1907
|
+
setSettings({
|
|
1908
|
+
defaultAgentId: resolveDefaultAgentIdSetting(agentId)
|
|
1909
|
+
})
|
|
1910
|
+
).unwrap()
|
|
1911
|
+
);
|
|
1912
|
+
var setThemeMode = createAsyncThunk(
|
|
1913
|
+
"settings/setThemeMode",
|
|
1914
|
+
async (mode, { dispatch }) => {
|
|
1915
|
+
const changes = { themeMode: mode };
|
|
1916
|
+
const systemPrefersDark = typeof window !== "undefined" && window.matchMedia(SYSTEM_DARK_MEDIA_QUERY).matches;
|
|
1917
|
+
changes.isDark = resolveThemeModeIsDark(mode, systemPrefersDark);
|
|
1918
|
+
return dispatch(setSettings(changes)).unwrap();
|
|
1919
|
+
}
|
|
1920
|
+
);
|
|
1921
|
+
|
|
1922
|
+
// packages/app/settings/settingSlice.tsx
|
|
1923
|
+
var createSliceWithThunks = buildCreateSlice({
|
|
1924
|
+
creators: { asyncThunk: asyncThunkCreator }
|
|
1925
|
+
});
|
|
1926
|
+
var settingSlice = createSliceWithThunks({
|
|
1927
|
+
name: "settings",
|
|
1928
|
+
initialState,
|
|
1929
|
+
reducers: {
|
|
1930
|
+
_updateSettingsState: (state, action) => {
|
|
1931
|
+
Object.assign(state, normalizeSettingChanges(action.payload));
|
|
1932
|
+
},
|
|
1933
|
+
addHostToCurrentServer: (state, action) => {
|
|
1934
|
+
const rawValue = action.payload;
|
|
1935
|
+
if (typeof rawValue !== "string" || rawValue.trim() === "") return;
|
|
1936
|
+
const trimmed = rawValue.trim();
|
|
1937
|
+
if (/^https?:\/\//i.test(trimmed)) {
|
|
1938
|
+
try {
|
|
1939
|
+
state.currentServer = new URL(trimmed).origin;
|
|
1940
|
+
return;
|
|
1941
|
+
} catch {
|
|
1942
|
+
return;
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
const host = trimmed.replace(/^\/+|\/+$/g, "");
|
|
1946
|
+
const [hostname] = host.split(":");
|
|
1947
|
+
if (!hostname) return;
|
|
1948
|
+
const isIpAddress = /^(\d{1,3}\.){3}\d{1,3}$/.test(hostname);
|
|
1949
|
+
const isLocal = ["nolotus.local", "localhost"].includes(hostname) || isIpAddress;
|
|
1950
|
+
const protocol = isLocal ? "http" : "https";
|
|
1951
|
+
state.currentServer = `${protocol}://${host}`;
|
|
1952
|
+
}
|
|
1953
|
+
}
|
|
1954
|
+
});
|
|
1955
|
+
var { addHostToCurrentServer } = settingSlice.actions;
|
|
1956
|
+
var settingSlice_default = settingSlice.reducer;
|
|
1957
|
+
|
|
1958
|
+
export {
|
|
1959
|
+
DEFAULT_AGENT_BASE_POLICY,
|
|
1960
|
+
DEFAULT_USER_PREFERENCE_PROFILE,
|
|
1961
|
+
AGENT_UPDATE_FIELD_NAMES,
|
|
1962
|
+
normalizeAgentUpdateFieldList,
|
|
1963
|
+
SYSTEM_DEFAULT_AGENT_ID,
|
|
1964
|
+
nolotusId,
|
|
1965
|
+
isSystemAdmin,
|
|
1966
|
+
normalizeSettingChanges,
|
|
1967
|
+
LOCAL_FIRST_APPEARANCE_KEYS,
|
|
1968
|
+
LOCAL_ONLY_SETTINGS_KEYS,
|
|
1969
|
+
isLocalFirstAppearanceChange,
|
|
1970
|
+
stripRegisterBackedFieldsFromSettingsWrite,
|
|
1971
|
+
sanitizeStoredSettingsRecord,
|
|
1972
|
+
hydrateStoredSettings,
|
|
1973
|
+
buildSettingsPersistencePlan,
|
|
1974
|
+
getCachedDefaultAgentRegisterRecord,
|
|
1975
|
+
persistDefaultAgentRegister,
|
|
1976
|
+
selectSettings,
|
|
1977
|
+
selectCurrentServer,
|
|
1978
|
+
selectSyncServers,
|
|
1979
|
+
selectRemoteServer,
|
|
1980
|
+
selectRemoteSyncServers,
|
|
1981
|
+
selectRemoteServers,
|
|
1982
|
+
selectPreferredAnimationSet,
|
|
1983
|
+
selectShowThinking,
|
|
1984
|
+
selectMaxCost,
|
|
1985
|
+
selectMaxExecutionTime,
|
|
1986
|
+
selectIsDark,
|
|
1987
|
+
selectThemeMode,
|
|
1988
|
+
selectHeaderHeight,
|
|
1989
|
+
selectThemeName,
|
|
1990
|
+
selectThemeFollowsSystem,
|
|
1991
|
+
selectSidebarWidth,
|
|
1992
|
+
selectDensity,
|
|
1993
|
+
selectFontPreset,
|
|
1994
|
+
selectEnableReadCurrentSpace,
|
|
1995
|
+
selectGlobalPrompt,
|
|
1996
|
+
selectUserTonePreset,
|
|
1997
|
+
selectKnowledgeCaptureLevel,
|
|
1998
|
+
selectSpaceContextLevel,
|
|
1999
|
+
selectAutoApproveSelfUpdateFields,
|
|
2000
|
+
selectAiRecentContentLimit,
|
|
2001
|
+
selectDefaultAgentPreference,
|
|
2002
|
+
selectDefaultAgentId,
|
|
2003
|
+
selectOcrModel,
|
|
2004
|
+
selectShowScrollToTopButton,
|
|
2005
|
+
selectShowScrollToBottomButton,
|
|
2006
|
+
selectCreateMenuOpenCount,
|
|
2007
|
+
selectDesktopChromeConnectorEnabled,
|
|
2008
|
+
selectDeveloperModeEnabled,
|
|
2009
|
+
selectDiagnosticModeEnabled,
|
|
2010
|
+
selectCopyDiagnosticsEnabled,
|
|
2011
|
+
selectEditorDefaultMode,
|
|
2012
|
+
selectEditorLightCodeTheme,
|
|
2013
|
+
selectEditorDarkCodeTheme,
|
|
2014
|
+
selectEditorWordCountEnabled,
|
|
2015
|
+
selectEditorShortcuts,
|
|
2016
|
+
selectDeleteShortcut,
|
|
2017
|
+
selectEditorFontSize,
|
|
2018
|
+
selectEditorAutoSave,
|
|
2019
|
+
selectEditorAutoSaveInterval,
|
|
2020
|
+
selectEditorCodeTheme,
|
|
2021
|
+
selectEditorConfig,
|
|
2022
|
+
selectTheme,
|
|
2023
|
+
getSettings,
|
|
2024
|
+
setSettings,
|
|
2025
|
+
changeTheme,
|
|
2026
|
+
changeDensity,
|
|
2027
|
+
changeFontPreset,
|
|
2028
|
+
changeDarkMode,
|
|
2029
|
+
toggleShowThinking,
|
|
2030
|
+
setThemeFollowsSystem,
|
|
2031
|
+
setSidebarWidth,
|
|
2032
|
+
toggleEnableReadCurrentSpace,
|
|
2033
|
+
setEditorDefaultMode,
|
|
2034
|
+
setEditorLightCodeTheme,
|
|
2035
|
+
setEditorDarkCodeTheme,
|
|
2036
|
+
setEditorCodeTheme,
|
|
2037
|
+
toggleEditorWordCount,
|
|
2038
|
+
toggleEditorShortcut,
|
|
2039
|
+
setEditorFontSize,
|
|
2040
|
+
toggleEditorAutoSave,
|
|
2041
|
+
setEditorAutoSaveInterval,
|
|
2042
|
+
setGlobalPrompt,
|
|
2043
|
+
setUserTonePreset,
|
|
2044
|
+
setKnowledgeCaptureLevel,
|
|
2045
|
+
setSpaceContextLevel,
|
|
2046
|
+
setAiRecentContentLimit,
|
|
2047
|
+
setMaxExecutionTime,
|
|
2048
|
+
setDefaultAgentId,
|
|
2049
|
+
setThemeMode,
|
|
2050
|
+
addHostToCurrentServer,
|
|
2051
|
+
settingSlice_default
|
|
2052
|
+
};
|