reasonix 0.33.2 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dashboard/dist/app.js +1 -21
  2. package/dashboard/dist/app.js.map +1 -1
  3. package/dist/cli/{chat-ZMSAXE77.js → chat-TL4HMNEQ.js} +14 -13
  4. package/dist/cli/chunk-2EBODRRO.js +149 -0
  5. package/dist/cli/chunk-2EBODRRO.js.map +1 -0
  6. package/dist/cli/{chunk-DULSP7JH.js → chunk-5JXXEPDM.js} +34 -1
  7. package/dist/cli/chunk-5JXXEPDM.js.map +1 -0
  8. package/dist/cli/{chunk-OW7IHE6M.js → chunk-5SAMVHA3.js} +584 -288
  9. package/dist/cli/chunk-5SAMVHA3.js.map +1 -0
  10. package/dist/cli/{chunk-WVJL7ZO2.js → chunk-F3ILWP2L.js} +4 -4
  11. package/dist/cli/{chunk-SDE5U32Z.js → chunk-KZHMKOJH.js} +13 -8
  12. package/dist/cli/{chunk-SDE5U32Z.js.map → chunk-KZHMKOJH.js.map} +1 -1
  13. package/dist/cli/{chunk-G7M3QWEN.js → chunk-LNTORE5K.js} +225 -132
  14. package/dist/cli/chunk-LNTORE5K.js.map +1 -0
  15. package/dist/cli/chunk-MRLXEMZ7.js +26 -0
  16. package/dist/cli/chunk-MRLXEMZ7.js.map +1 -0
  17. package/dist/cli/{chunk-WBDE4IRI.js → chunk-OERAGRJX.js} +2 -2
  18. package/dist/cli/{chunk-QGE6AF76.js → chunk-Q36KBLSU.js} +207 -8
  19. package/dist/cli/chunk-Q36KBLSU.js.map +1 -0
  20. package/dist/cli/{chunk-RZILUXUC.js → chunk-RXGEGA7K.js} +2 -2
  21. package/dist/cli/{chunk-FXGQ5NHE.js → chunk-SA4UGZPG.js} +21 -1
  22. package/dist/cli/chunk-SA4UGZPG.js.map +1 -0
  23. package/dist/cli/{chunk-J5VLP23S.js → chunk-SW3CCXEV.js} +2 -2
  24. package/dist/cli/{chunk-W4LDFAZ6.js → chunk-SX6L4HZZ.js} +2 -2
  25. package/dist/cli/chunk-WUI3P4RA.js +319 -0
  26. package/dist/cli/chunk-WUI3P4RA.js.map +1 -0
  27. package/dist/cli/{code-R4TXQQEE.js → code-V6F4BKMG.js} +15 -14
  28. package/dist/cli/{code-R4TXQQEE.js.map → code-V6F4BKMG.js.map} +1 -1
  29. package/dist/cli/{commands-JWT2MWVH.js → commands-MEZPSEHV.js} +4 -3
  30. package/dist/cli/{commands-JWT2MWVH.js.map → commands-MEZPSEHV.js.map} +1 -1
  31. package/dist/cli/{commit-RPZBOZS2.js → commit-CE4EFTUQ.js} +3 -2
  32. package/dist/cli/{commit-RPZBOZS2.js.map → commit-CE4EFTUQ.js.map} +1 -1
  33. package/dist/cli/{doctor-V5HLCMSQ.js → doctor-YASM64X6.js} +7 -6
  34. package/dist/cli/index.js +22 -21
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/{mcp-ARTNQ24O.js → mcp-LDFK5QJI.js} +3 -2
  37. package/dist/cli/{mcp-ARTNQ24O.js.map → mcp-LDFK5QJI.js.map} +1 -1
  38. package/dist/cli/{mcp-browse-HLO2ENDL.js → mcp-browse-FYHEITCM.js} +3 -2
  39. package/dist/cli/{mcp-browse-HLO2ENDL.js.map → mcp-browse-FYHEITCM.js.map} +1 -1
  40. package/dist/cli/{replay-Q43DSMG6.js → replay-JEDLU7F2.js} +8 -6
  41. package/dist/cli/{replay-Q43DSMG6.js.map → replay-JEDLU7F2.js.map} +1 -1
  42. package/dist/cli/{run-HK3FP266.js → run-NHD2RSTD.js} +7 -6
  43. package/dist/cli/{run-HK3FP266.js.map → run-NHD2RSTD.js.map} +1 -1
  44. package/dist/cli/{server-SYC3OVOP.js → server-MC4A4WAJ.js} +9 -8
  45. package/dist/cli/{server-SYC3OVOP.js.map → server-MC4A4WAJ.js.map} +1 -1
  46. package/dist/cli/{sessions-3XU2GGHX.js → sessions-ZHWJEW4L.js} +7 -6
  47. package/dist/cli/{sessions-3XU2GGHX.js.map → sessions-ZHWJEW4L.js.map} +1 -1
  48. package/dist/cli/{setup-CCJZAWTY.js → setup-DK43MT47.js} +6 -5
  49. package/dist/cli/{setup-CCJZAWTY.js.map → setup-DK43MT47.js.map} +1 -1
  50. package/dist/cli/{version-5SGI2SEE.js → version-O362UKPM.js} +7 -6
  51. package/dist/cli/{version-5SGI2SEE.js.map → version-O362UKPM.js.map} +1 -1
  52. package/dist/index.d.ts +45 -1
  53. package/dist/index.js +569 -27
  54. package/dist/index.js.map +1 -1
  55. package/package.json +1 -1
  56. package/dist/cli/chunk-63KAV5DX.js +0 -106
  57. package/dist/cli/chunk-63KAV5DX.js.map +0 -1
  58. package/dist/cli/chunk-DULSP7JH.js.map +0 -1
  59. package/dist/cli/chunk-FXGQ5NHE.js.map +0 -1
  60. package/dist/cli/chunk-G7M3QWEN.js.map +0 -1
  61. package/dist/cli/chunk-OW7IHE6M.js.map +0 -1
  62. package/dist/cli/chunk-QGE6AF76.js.map +0 -1
  63. package/dist/cli/chunk-ZPTSJGX5.js +0 -88
  64. package/dist/cli/chunk-ZPTSJGX5.js.map +0 -1
  65. /package/dist/cli/{chat-ZMSAXE77.js.map → chat-TL4HMNEQ.js.map} +0 -0
  66. /package/dist/cli/{chunk-WVJL7ZO2.js.map → chunk-F3ILWP2L.js.map} +0 -0
  67. /package/dist/cli/{chunk-WBDE4IRI.js.map → chunk-OERAGRJX.js.map} +0 -0
  68. /package/dist/cli/{chunk-RZILUXUC.js.map → chunk-RXGEGA7K.js.map} +0 -0
  69. /package/dist/cli/{chunk-J5VLP23S.js.map → chunk-SW3CCXEV.js.map} +0 -0
  70. /package/dist/cli/{chunk-W4LDFAZ6.js.map → chunk-SX6L4HZZ.js.map} +0 -0
  71. /package/dist/cli/{doctor-V5HLCMSQ.js.map → doctor-YASM64X6.js.map} +0 -0
@@ -1,40 +1,41 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  chatCommand
4
- } from "./chunk-OW7IHE6M.js";
4
+ } from "./chunk-5SAMVHA3.js";
5
5
  import "./chunk-BQNUJJN7.js";
6
6
  import "./chunk-RFX7TYVV.js";
7
- import "./chunk-63KAV5DX.js";
7
+ import "./chunk-MRLXEMZ7.js";
8
8
  import "./chunk-CPOV2O73.js";
9
- import "./chunk-G7M3QWEN.js";
9
+ import "./chunk-LNTORE5K.js";
10
10
  import "./chunk-I6YIAK6C.js";
11
11
  import "./chunk-XJLZ4HKU.js";
12
12
  import "./chunk-XHQIK7B6.js";
13
13
  import "./chunk-6TMHAK5D.js";
14
- import "./chunk-SDE5U32Z.js";
15
- import "./chunk-ZPTSJGX5.js";
14
+ import "./chunk-KZHMKOJH.js";
15
+ import "./chunk-2EBODRRO.js";
16
16
  import "./chunk-MHDNZXJJ.js";
17
- import "./chunk-WVJL7ZO2.js";
17
+ import "./chunk-F3ILWP2L.js";
18
18
  import "./chunk-DAEAAVDF.js";
19
19
  import "./chunk-KMWKGPFZ.js";
20
20
  import "./chunk-3Q3C4W66.js";
21
21
  import "./chunk-4DCHFFEY.js";
22
- import "./chunk-FXGQ5NHE.js";
22
+ import "./chunk-SA4UGZPG.js";
23
23
  import "./chunk-G3XNWSFN.js";
24
24
  import "./chunk-SOZE7V7V.js";
25
- import "./chunk-W4LDFAZ6.js";
25
+ import "./chunk-SX6L4HZZ.js";
26
26
  import "./chunk-U3V2ZQ5J.js";
27
27
  import "./chunk-FM57FNPJ.js";
28
- import "./chunk-RZILUXUC.js";
29
- import "./chunk-WBDE4IRI.js";
28
+ import "./chunk-RXGEGA7K.js";
29
+ import "./chunk-OERAGRJX.js";
30
30
  import "./chunk-2AWTGJ2C.js";
31
31
  import "./chunk-5X7LZJDE.js";
32
32
  import "./chunk-DFP4YSVM.js";
33
- import "./chunk-QGE6AF76.js";
34
- import "./chunk-DULSP7JH.js";
33
+ import "./chunk-Q36KBLSU.js";
34
+ import "./chunk-5JXXEPDM.js";
35
+ import "./chunk-WUI3P4RA.js";
35
36
  import "./chunk-ZTLZO42A.js";
36
37
  import "./chunk-ORM6PK57.js";
37
38
  export {
38
39
  chatCommand
39
40
  };
40
- //# sourceMappingURL=chat-ZMSAXE77.js.map
41
+ //# sourceMappingURL=chat-TL4HMNEQ.js.map
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ CARD,
4
+ DEFAULT_THEME_NAME,
5
+ FG,
6
+ SURFACE,
7
+ THEMES,
8
+ TONE,
9
+ TONE_ACTIVE,
10
+ resolveThemeName,
11
+ setActiveTheme
12
+ } from "./chunk-WUI3P4RA.js";
13
+
14
+ // src/cli/ui/theme/context.tsx
15
+ import React from "react";
16
+ var ThemeContext = React.createContext(THEMES[DEFAULT_THEME_NAME]);
17
+ function ThemeProvider({
18
+ children,
19
+ name
20
+ }) {
21
+ const theme = THEMES[resolveThemeName(name)];
22
+ const restoreActiveTheme = setActiveTheme(theme);
23
+ React.useLayoutEffect(() => restoreActiveTheme, [restoreActiveTheme]);
24
+ return /* @__PURE__ */ React.createElement(ThemeContext.Provider, { value: theme }, children);
25
+ }
26
+ function useThemeTokens() {
27
+ return React.useContext(ThemeContext);
28
+ }
29
+
30
+ // src/cli/ui/theme.ts
31
+ import React2 from "react";
32
+ function gradientFromTheme(theme) {
33
+ return [
34
+ theme.tone.ok,
35
+ theme.tone.brand,
36
+ theme.tone.info,
37
+ theme.toneActive.brand,
38
+ theme.toneActive.violet,
39
+ theme.tone.accent,
40
+ theme.toneActive.accent,
41
+ theme.tone.err
42
+ ];
43
+ }
44
+ function colorFromTheme(theme) {
45
+ return {
46
+ primary: theme.tone.brand,
47
+ accent: theme.tone.accent,
48
+ brand: theme.tone.ok,
49
+ user: theme.tone.brand,
50
+ assistant: theme.tone.ok,
51
+ tool: theme.tone.warn,
52
+ toolErr: theme.tone.err,
53
+ info: theme.fg.sub,
54
+ warn: theme.tone.warn,
55
+ err: theme.tone.err,
56
+ ok: theme.tone.ok
57
+ };
58
+ }
59
+ function surfaceFromTheme(theme) {
60
+ return {
61
+ canvas: theme.surface.bg,
62
+ shell: theme.surface.bgInput,
63
+ card: theme.surface.bgElev,
64
+ elev: theme.surface.bgElev,
65
+ sel: theme.surface.bgInput,
66
+ line: theme.fg.faint,
67
+ lineSoft: theme.fg.meta
68
+ };
69
+ }
70
+ function fgFromTheme(theme) {
71
+ return {
72
+ strong: theme.fg.strong,
73
+ default: theme.fg.body,
74
+ dim: theme.fg.sub,
75
+ faint: theme.fg.meta,
76
+ ghost: theme.fg.faint
77
+ };
78
+ }
79
+ function proxyThemeValue(build) {
80
+ const target = build();
81
+ return new Proxy(target, {
82
+ get(_target, prop) {
83
+ return build()[prop];
84
+ },
85
+ getOwnPropertyDescriptor(_target, prop) {
86
+ return Reflect.getOwnPropertyDescriptor(build(), prop);
87
+ },
88
+ has(_target, prop) {
89
+ return prop in build();
90
+ },
91
+ ownKeys() {
92
+ return Reflect.ownKeys(build());
93
+ }
94
+ });
95
+ }
96
+ function currentTheme() {
97
+ return {
98
+ fg: FG,
99
+ tone: TONE,
100
+ toneActive: TONE_ACTIVE,
101
+ surface: SURFACE,
102
+ card: CARD
103
+ };
104
+ }
105
+ function useColor() {
106
+ const theme = useThemeTokens();
107
+ return React2.useMemo(() => colorFromTheme(theme), [theme]);
108
+ }
109
+ var GRADIENT = proxyThemeValue(() => gradientFromTheme(currentTheme()));
110
+ var COLOR = proxyThemeValue(() => colorFromTheme(currentTheme()));
111
+ var GLYPH = {
112
+ brand: "\u25C8",
113
+ user: "\u25C7",
114
+ assistant: "\u25C6",
115
+ toolOk: "\u25A3",
116
+ toolErr: "\u25A5",
117
+ warn: "\u25B2",
118
+ err: "\u2726",
119
+ arrow: "\u203A",
120
+ bullet: "\xB7",
121
+ bar: "\u258E",
122
+ thinBar: "\u258F",
123
+ block: "\u2588",
124
+ shade1: "\u2591",
125
+ shade2: "\u2592",
126
+ shade3: "\u2593",
127
+ done: "\u2713",
128
+ cur: "\u25B8",
129
+ pending: "\u25CB",
130
+ fail: "\u2717",
131
+ running: "\u25CF",
132
+ branch: "\u2523",
133
+ branchEnd: "\u2517",
134
+ branchStub: "\u2503",
135
+ rule: "\u2500",
136
+ spinFrames: ["\u25D0", "\u25D3", "\u25D1", "\u25D2"]
137
+ };
138
+ var SURFACE2 = proxyThemeValue(() => surfaceFromTheme(currentTheme()));
139
+ var FG2 = proxyThemeValue(() => fgFromTheme(currentTheme()));
140
+
141
+ export {
142
+ ThemeProvider,
143
+ useThemeTokens,
144
+ useColor,
145
+ GRADIENT,
146
+ COLOR,
147
+ GLYPH
148
+ };
149
+ //# sourceMappingURL=chunk-2EBODRRO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/ui/theme/context.tsx","../../src/cli/ui/theme.ts"],"sourcesContent":["import React from \"react\";\nimport {\n DEFAULT_THEME_NAME,\n THEMES,\n type ThemeName,\n type ThemeTokens,\n resolveThemeName,\n setActiveTheme,\n} from \"./tokens.js\";\n\nconst ThemeContext = React.createContext<ThemeTokens>(THEMES[DEFAULT_THEME_NAME]);\n\nexport function ThemeProvider({\n children,\n name,\n}: {\n children: React.ReactNode;\n name?: string | null;\n}): React.ReactElement {\n const theme = THEMES[resolveThemeName(name)];\n const restoreActiveTheme = setActiveTheme(theme);\n\n React.useLayoutEffect(() => restoreActiveTheme, [restoreActiveTheme]);\n\n return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n}\n\nexport function useThemeTokens(): ThemeTokens {\n return React.useContext(ThemeContext);\n}\n\nexport function useTheme(): ThemeTokens {\n return useThemeTokens();\n}\n\nexport type { ThemeName, ThemeTokens };\n","import React from \"react\";\nimport { useThemeTokens } from \"./theme/context.js\";\nimport {\n CARD,\n FG as TOKEN_FG,\n SURFACE as TOKEN_SURFACE,\n TONE,\n TONE_ACTIVE,\n type ThemeTokens,\n} from \"./theme/tokens.js\";\n\nexport type UiColor = ReturnType<typeof colorFromTheme>;\nexport type UiGradient = ReturnType<typeof gradientFromTheme>;\nexport type UiSurface = ReturnType<typeof surfaceFromTheme>;\nexport type UiFg = ReturnType<typeof fgFromTheme>;\n\nexport function gradientFromTheme(theme: ThemeTokens): ReadonlyArray<string> {\n return [\n theme.tone.ok,\n theme.tone.brand,\n theme.tone.info,\n theme.toneActive.brand,\n theme.toneActive.violet,\n theme.tone.accent,\n theme.toneActive.accent,\n theme.tone.err,\n ];\n}\n\nexport function colorFromTheme(theme: ThemeTokens) {\n return {\n primary: theme.tone.brand,\n accent: theme.tone.accent,\n brand: theme.tone.ok,\n\n user: theme.tone.brand,\n assistant: theme.tone.ok,\n tool: theme.tone.warn,\n toolErr: theme.tone.err,\n info: theme.fg.sub,\n warn: theme.tone.warn,\n err: theme.tone.err,\n ok: theme.tone.ok,\n } as const;\n}\n\nexport function surfaceFromTheme(theme: ThemeTokens) {\n return {\n canvas: theme.surface.bg,\n shell: theme.surface.bgInput,\n card: theme.surface.bgElev,\n elev: theme.surface.bgElev,\n sel: theme.surface.bgInput,\n line: theme.fg.faint,\n lineSoft: theme.fg.meta,\n } as const;\n}\n\nexport function fgFromTheme(theme: ThemeTokens) {\n return {\n strong: theme.fg.strong,\n default: theme.fg.body,\n dim: theme.fg.sub,\n faint: theme.fg.meta,\n ghost: theme.fg.faint,\n } as const;\n}\n\nfunction proxyThemeValue<T extends object>(build: () => T): T {\n const target = build();\n return new Proxy(target, {\n get(_target, prop: string | symbol) {\n return build()[prop as keyof T];\n },\n getOwnPropertyDescriptor(_target, prop: string | symbol) {\n return Reflect.getOwnPropertyDescriptor(build(), prop);\n },\n has(_target, prop: string | symbol) {\n return prop in build();\n },\n ownKeys() {\n return Reflect.ownKeys(build());\n },\n });\n}\n\nfunction currentTheme(): ThemeTokens {\n return {\n fg: TOKEN_FG,\n tone: TONE,\n toneActive: TONE_ACTIVE,\n surface: TOKEN_SURFACE,\n card: CARD,\n };\n}\n\nexport function useGradient(): UiGradient {\n const theme = useThemeTokens();\n return React.useMemo(() => gradientFromTheme(theme), [theme]);\n}\n\nexport function useColor(): UiColor {\n const theme = useThemeTokens();\n return React.useMemo(() => colorFromTheme(theme), [theme]);\n}\n\nexport function useUiSurface(): UiSurface {\n const theme = useThemeTokens();\n return React.useMemo(() => surfaceFromTheme(theme), [theme]);\n}\n\nexport function useUiFg(): UiFg {\n const theme = useThemeTokens();\n return React.useMemo(() => fgFromTheme(theme), [theme]);\n}\n\nexport const GRADIENT = proxyThemeValue(() => gradientFromTheme(currentTheme()));\nexport const COLOR = proxyThemeValue(() => colorFromTheme(currentTheme()));\n\nexport const GLYPH = {\n brand: \"◈\",\n user: \"◇\",\n assistant: \"◆\",\n toolOk: \"▣\",\n toolErr: \"▥\",\n warn: \"▲\",\n err: \"✦\",\n arrow: \"›\",\n bullet: \"·\",\n bar: \"▎\",\n thinBar: \"▏\",\n block: \"█\",\n shade1: \"░\",\n shade2: \"▒\",\n shade3: \"▓\",\n\n done: \"✓\",\n cur: \"▸\",\n pending: \"○\",\n fail: \"✗\",\n running: \"●\",\n\n branch: \"┣\",\n branchEnd: \"┗\",\n branchStub: \"┃\",\n rule: \"─\",\n\n spinFrames: [\"◐\", \"◓\", \"◑\", \"◒\"] as readonly string[],\n} as const;\n\nexport const SURFACE = proxyThemeValue(() => surfaceFromTheme(currentTheme()));\nexport const FG = proxyThemeValue(() => fgFromTheme(currentTheme()));\n\nexport function gradientCells(\n width: number,\n glyph: string = GLYPH.block,\n gradient: ReadonlyArray<string> = GRADIENT,\n): Array<{ ch: string; color: string }> {\n const cells: Array<{ ch: string; color: string }> = [];\n if (width <= 0) return cells;\n const last = gradient.length - 1;\n for (let i = 0; i < width; i++) {\n if (last <= 0) {\n cells.push({ ch: glyph, color: gradient[0] ?? COLOR.primary });\n continue;\n }\n const t = width === 1 ? 0 : (i * last) / (width - 1);\n const lo = Math.floor(t);\n const hi = Math.min(last, lo + 1);\n const color = t - lo < 0.5 ? gradient[lo]! : gradient[hi]!;\n cells.push({ ch: glyph, color });\n }\n return cells;\n}\n"],"mappings":"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","names":["React","React","SURFACE","FG"]}
@@ -1,4 +1,8 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ isThemeName,
4
+ resolveThemeName
5
+ } from "./chunk-WUI3P4RA.js";
2
6
 
3
7
  // src/config.ts
4
8
  import { chmodSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -250,10 +254,28 @@ function saveEditMode(mode, path = defaultConfigPath()) {
250
254
  function editModeHintShown(path = defaultConfigPath()) {
251
255
  return readConfig(path).editModeHintShown === true;
252
256
  }
257
+ function mouseClipboardHintShown(path = defaultConfigPath()) {
258
+ return readConfig(path).mouseClipboardHintShown === true;
259
+ }
253
260
  function loadReasoningEffort(path = defaultConfigPath()) {
254
261
  const v = readConfig(path).reasoningEffort;
255
262
  return v === "high" ? "high" : "max";
256
263
  }
264
+ function loadTheme(path = defaultConfigPath()) {
265
+ const value = readConfig(path).theme;
266
+ if (value === "auto") return "auto";
267
+ if (typeof value === "string" && isThemeName(value)) return value;
268
+ return void 0;
269
+ }
270
+ function resolveThemePreference(configTheme, envTheme) {
271
+ if (configTheme && configTheme !== "auto") return configTheme;
272
+ return resolveThemeName(envTheme);
273
+ }
274
+ function saveTheme(theme, path = defaultConfigPath()) {
275
+ const cfg = readConfig(path);
276
+ cfg.theme = theme;
277
+ writeConfig(cfg, path);
278
+ }
257
279
  function saveReasoningEffort(effort, path = defaultConfigPath()) {
258
280
  const cfg = readConfig(path);
259
281
  cfg.reasoningEffort = effort;
@@ -323,6 +345,12 @@ function markEditModeHintShown(path = defaultConfigPath()) {
323
345
  cfg.editModeHintShown = true;
324
346
  writeConfig(cfg, path);
325
347
  }
348
+ function markMouseClipboardHintShown(path = defaultConfigPath()) {
349
+ const cfg = readConfig(path);
350
+ if (cfg.mouseClipboardHintShown === true) return;
351
+ cfg.mouseClipboardHintShown = true;
352
+ writeConfig(cfg, path);
353
+ }
326
354
  function isPlausibleKey(key) {
327
355
  const trimmed = key.trim();
328
356
  return /^sk-[A-Za-z0-9_-]{16,}$/.test(trimmed);
@@ -395,7 +423,11 @@ export {
395
423
  loadEditMode,
396
424
  saveEditMode,
397
425
  editModeHintShown,
426
+ mouseClipboardHintShown,
398
427
  loadReasoningEffort,
428
+ loadTheme,
429
+ resolveThemePreference,
430
+ saveTheme,
399
431
  saveReasoningEffort,
400
432
  loadIndexUserConfig,
401
433
  loadIndexConfig,
@@ -404,7 +436,8 @@ export {
404
436
  resolveSemanticEmbeddingConfig,
405
437
  redactSemanticEmbeddingConfig,
406
438
  markEditModeHintShown,
439
+ markMouseClipboardHintShown,
407
440
  isPlausibleKey,
408
441
  redactKey
409
442
  };
410
- //# sourceMappingURL=chunk-DULSP7JH.js.map
443
+ //# sourceMappingURL=chunk-5JXXEPDM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config.ts","../../src/index/config.ts"],"sourcesContent":["/** Library reads only DEEPSEEK_API_KEY from env; the CLI bridges config.json → env var. */\n\nimport { chmodSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { type ThemeName, isThemeName, resolveThemeName } from \"./cli/ui/theme/tokens.js\";\nimport type { LanguageCode } from \"./i18n/types.js\";\nimport {\n type IndexUserConfig,\n type ResolvedIndexConfig,\n resolveIndexConfig,\n} from \"./index/config.js\";\n\n/** Legacy `fast|smart|max` kept for back-compat with existing config.json files. */\nexport type PresetName = \"auto\" | \"flash\" | \"pro\" | \"fast\" | \"smart\" | \"max\";\n\n/** Single trust dial: review queues edits + gates shell; auto applies + gates shell; yolo skips both gates. */\nexport type EditMode = \"review\" | \"auto\" | \"yolo\";\n\nexport type ReasoningEffort = \"high\" | \"max\";\n\nexport type EmbeddingProvider = \"ollama\" | \"openai-compat\";\n\nexport interface OllamaEmbeddingUserConfig {\n baseUrl?: string;\n model?: string;\n}\n\nexport interface OpenAICompatEmbeddingUserConfig {\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n extraBody?: Record<string, unknown>;\n}\n\nexport interface SemanticEmbeddingUserConfig {\n provider?: EmbeddingProvider;\n ollama?: OllamaEmbeddingUserConfig;\n openaiCompat?: OpenAICompatEmbeddingUserConfig;\n}\n\nexport interface ResolvedOllamaEmbeddingConfig {\n provider: \"ollama\";\n baseUrl: string;\n model: string;\n timeoutMs: number;\n}\n\nexport interface ResolvedOpenAICompatEmbeddingConfig {\n provider: \"openai-compat\";\n baseUrl: string;\n apiKey: string;\n model: string;\n extraBody: Record<string, unknown>;\n timeoutMs: number;\n}\n\nexport type ResolvedEmbeddingConfig =\n | ResolvedOllamaEmbeddingConfig\n | ResolvedOpenAICompatEmbeddingConfig;\n\nexport interface SemanticEmbeddingConfigView {\n provider: EmbeddingProvider;\n ollama: {\n baseUrl: string;\n model: string;\n };\n openaiCompat: {\n baseUrl: string;\n apiKey: string;\n apiKeySet: boolean;\n model: string;\n extraBody: Record<string, unknown>;\n };\n}\n\nexport interface ReasonixConfig {\n apiKey?: string;\n baseUrl?: string;\n lang?: LanguageCode;\n preset?: PresetName;\n editMode?: EditMode;\n editModeHintShown?: boolean;\n mouseClipboardHintShown?: boolean;\n reasoningEffort?: ReasoningEffort;\n theme?: ThemeName | \"auto\";\n /** Stored as `--mcp`-format strings so one parser handles both flag and config. */\n mcp?: string[];\n /** Names of servers in `mcp` to skip on bridge — see `/mcp disable <name>`. */\n mcpDisabled?: string[];\n session?: string | null;\n setupCompleted?: boolean;\n search?: boolean;\n /** Web search engine backend: \"mojeek\" (default, scrapes Mojeek) or \"searxng\" (self-hosted SearXNG). */\n webSearchEngine?: \"mojeek\" | \"searxng\";\n /** Base URL for SearXNG instance (default http://localhost:8080). */\n webSearchEndpoint?: string;\n projects?: {\n [absoluteRootDir: string]: {\n shellAllowed?: string[];\n };\n };\n index?: IndexUserConfig;\n semantic?: SemanticEmbeddingUserConfig;\n}\n\nconst DEFAULT_OLLAMA_URL = \"http://localhost:11434\";\nconst DEFAULT_EMBED_MODEL = \"nomic-embed-text\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport function defaultConfigPath(): string {\n return join(homedir(), \".reasonix\", \"config.json\");\n}\n\nexport function readConfig(path: string = defaultConfigPath()): ReasonixConfig {\n try {\n const raw = readFileSync(path, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as ReasonixConfig;\n } catch {\n /* missing or malformed → empty config */\n }\n return {};\n}\n\nexport function writeConfig(cfg: ReasonixConfig, path: string = defaultConfigPath()): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(cfg, null, 2), \"utf8\");\n try {\n chmodSync(path, 0o600);\n } catch {\n /* ignore on platforms without chmod */\n }\n}\n\n/** Resolve the language from config file. */\nexport function loadLanguage(path: string = defaultConfigPath()): LanguageCode | undefined {\n return readConfig(path).lang;\n}\n\n/** Persist the language so it survives a relaunch. */\nexport function saveLanguage(lang: LanguageCode, path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n cfg.lang = lang;\n writeConfig(cfg, path);\n}\n\n/** Resolve the API key from env var first, then the config file. */\nexport function loadApiKey(path: string = defaultConfigPath()): string | undefined {\n if (process.env.DEEPSEEK_API_KEY) return process.env.DEEPSEEK_API_KEY;\n return readConfig(path).apiKey;\n}\n\nexport function searchEnabled(path: string = defaultConfigPath()): boolean {\n const env = process.env.REASONIX_SEARCH;\n if (env === \"off\" || env === \"false\" || env === \"0\") return false;\n const cfg = readConfig(path).search;\n if (cfg === false) return false;\n return true;\n}\n\nexport function webSearchEngine(path: string = defaultConfigPath()): \"mojeek\" | \"searxng\" {\n const cfg = readConfig(path).webSearchEngine;\n if (cfg === \"searxng\") return \"searxng\";\n return \"mojeek\";\n}\n\nexport function webSearchEndpoint(path: string = defaultConfigPath()): string {\n const cfg = readConfig(path).webSearchEndpoint;\n if (cfg && typeof cfg === \"string\") return cfg;\n return \"http://localhost:8080\";\n}\n\nexport function saveApiKey(key: string, path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n cfg.apiKey = key.trim();\n writeConfig(cfg, path);\n}\n\n/** Windows: case-insensitive — NTFS treats `F:\\Foo` and `f:\\foo` as one directory (#402). */\nfunction findProjectKey(cfg: ReasonixConfig, rootDir: string): string | undefined {\n const projects = cfg.projects;\n if (!projects) return undefined;\n if (Object.hasOwn(projects, rootDir)) return rootDir;\n if (process.platform !== \"win32\") return undefined;\n const lower = rootDir.toLowerCase();\n for (const k of Object.keys(projects)) {\n if (k.toLowerCase() === lower) return k;\n }\n return undefined;\n}\n\nexport function loadProjectShellAllowed(\n rootDir: string,\n path: string = defaultConfigPath(),\n): string[] {\n const cfg = readConfig(path);\n const key = findProjectKey(cfg, rootDir);\n if (key === undefined) return [];\n return cfg.projects?.[key]?.shellAllowed ?? [];\n}\n\nexport function addProjectShellAllowed(\n rootDir: string,\n prefix: string,\n path: string = defaultConfigPath(),\n): void {\n const trimmed = prefix.trim();\n if (!trimmed) return;\n const cfg = readConfig(path);\n if (!cfg.projects) cfg.projects = {};\n const key = findProjectKey(cfg, rootDir) ?? rootDir;\n if (!cfg.projects[key]) cfg.projects[key] = {};\n const existing = cfg.projects[key].shellAllowed ?? [];\n if (existing.includes(trimmed)) return;\n cfg.projects[key].shellAllowed = [...existing, trimmed];\n writeConfig(cfg, path);\n}\n\n/** Match is exact after trim — NOT prefix-match: removing `git` MUST NOT drop `git push origin main`. */\nexport function removeProjectShellAllowed(\n rootDir: string,\n prefix: string,\n path: string = defaultConfigPath(),\n): boolean {\n const trimmed = prefix.trim();\n if (!trimmed) return false;\n const cfg = readConfig(path);\n const key = findProjectKey(cfg, rootDir);\n if (key === undefined) return false;\n const existing = cfg.projects?.[key]?.shellAllowed ?? [];\n if (!existing.includes(trimmed)) return false;\n const next = existing.filter((p) => p !== trimmed);\n if (!cfg.projects) cfg.projects = {};\n if (!cfg.projects[key]) cfg.projects[key] = {};\n cfg.projects[key].shellAllowed = next;\n writeConfig(cfg, path);\n return true;\n}\n\nexport function clearProjectShellAllowed(\n rootDir: string,\n path: string = defaultConfigPath(),\n): number {\n const cfg = readConfig(path);\n const key = findProjectKey(cfg, rootDir);\n if (key === undefined) return 0;\n const existing = cfg.projects?.[key]?.shellAllowed ?? [];\n if (existing.length === 0) return 0;\n if (!cfg.projects) cfg.projects = {};\n if (!cfg.projects[key]) cfg.projects[key] = {};\n cfg.projects[key].shellAllowed = [];\n writeConfig(cfg, path);\n return existing.length;\n}\n\n/** Unknown values fall back to \"review\" so hand-edited bad config gets the safe default. */\nexport function loadEditMode(path: string = defaultConfigPath()): EditMode {\n const v = readConfig(path).editMode;\n return v === \"auto\" ? \"auto\" : \"review\";\n}\n\n/** Persist the edit mode so `/mode auto` survives a relaunch. */\nexport function saveEditMode(mode: EditMode, path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n cfg.editMode = mode;\n writeConfig(cfg, path);\n}\n\n/** True when the onboarding tip for the review/AUTO gate has been shown. */\nexport function editModeHintShown(path: string = defaultConfigPath()): boolean {\n return readConfig(path).editModeHintShown === true;\n}\n\n/** True when the mouse-tracking + clipboard tip has been shown. */\nexport function mouseClipboardHintShown(path: string = defaultConfigPath()): boolean {\n return readConfig(path).mouseClipboardHintShown === true;\n}\n\n/** Unknown / missing fall back to \"max\" so hand-edited bad config can't silently override the default. */\nexport function loadReasoningEffort(path: string = defaultConfigPath()): ReasoningEffort {\n const v = readConfig(path).reasoningEffort;\n return v === \"high\" ? \"high\" : \"max\";\n}\n\nexport function loadTheme(path: string = defaultConfigPath()): ThemeName | \"auto\" | undefined {\n const value = readConfig(path).theme;\n if (value === \"auto\") return \"auto\";\n if (typeof value === \"string\" && isThemeName(value)) return value;\n return undefined;\n}\n\nexport function resolveThemePreference(\n configTheme: ThemeName | \"auto\" | undefined,\n envTheme?: string | null,\n): ThemeName {\n if (configTheme && configTheme !== \"auto\") return configTheme;\n return resolveThemeName(envTheme);\n}\n\nexport function saveTheme(theme: ThemeName | \"auto\", path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n cfg.theme = theme;\n writeConfig(cfg, path);\n}\n\n/** Persist the reasoning_effort cap so `/effort high` survives a relaunch. */\nexport function saveReasoningEffort(\n effort: ReasoningEffort,\n path: string = defaultConfigPath(),\n): void {\n const cfg = readConfig(path);\n cfg.reasoningEffort = effort;\n writeConfig(cfg, path);\n}\n\nexport function loadIndexUserConfig(path: string = defaultConfigPath()): IndexUserConfig {\n return readConfig(path).index ?? {};\n}\n\nexport function loadIndexConfig(path: string = defaultConfigPath()): ResolvedIndexConfig {\n return resolveIndexConfig(readConfig(path).index);\n}\n\nexport function saveIndexConfig(user: IndexUserConfig, path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n cfg.index = user;\n writeConfig(cfg, path);\n}\n\nexport function loadSemanticEmbeddingUserConfig(\n path: string = defaultConfigPath(),\n): SemanticEmbeddingUserConfig {\n return normalizeSemanticEmbeddingUserConfig(readConfig(path).semantic);\n}\n\nexport function saveSemanticEmbeddingConfig(\n user: SemanticEmbeddingUserConfig,\n path: string = defaultConfigPath(),\n): void {\n const cfg = readConfig(path);\n cfg.semantic = normalizeSemanticEmbeddingUserConfig(user);\n writeConfig(cfg, path);\n}\n\nexport function resolveSemanticEmbeddingConfig(\n path: string = defaultConfigPath(),\n): ResolvedEmbeddingConfig {\n const user = loadSemanticEmbeddingUserConfig(path);\n const provider = user.provider ?? \"ollama\";\n if (provider === \"openai-compat\") {\n const baseUrl = user.openaiCompat?.baseUrl?.trim() ?? \"\";\n const apiKey = user.openaiCompat?.apiKey?.trim() ?? \"\";\n const model = user.openaiCompat?.model?.trim() ?? \"\";\n if (!baseUrl) throw new Error(\"OpenAI-compatible embeddings require an API URL.\");\n requireValidUrl(baseUrl, \"OpenAI-compatible API URL\");\n if (!apiKey) throw new Error(\"OpenAI-compatible embeddings require an API key.\");\n if (!model) throw new Error(\"OpenAI-compatible embeddings require a model.\");\n return {\n provider,\n baseUrl,\n apiKey,\n model,\n extraBody: normalizeExtraBody(user.openaiCompat?.extraBody),\n timeoutMs: DEFAULT_TIMEOUT_MS,\n };\n }\n return {\n provider: \"ollama\",\n baseUrl: user.ollama?.baseUrl?.trim() || process.env.OLLAMA_URL || DEFAULT_OLLAMA_URL,\n model: user.ollama?.model?.trim() || process.env.REASONIX_EMBED_MODEL || DEFAULT_EMBED_MODEL,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n };\n}\n\nexport function redactSemanticEmbeddingConfig(\n user: SemanticEmbeddingUserConfig,\n): SemanticEmbeddingConfigView {\n const normalized = normalizeSemanticEmbeddingUserConfig(user);\n return {\n provider: normalized.provider ?? \"ollama\",\n ollama: {\n baseUrl: normalized.ollama?.baseUrl?.trim() || process.env.OLLAMA_URL || DEFAULT_OLLAMA_URL,\n model:\n normalized.ollama?.model?.trim() || process.env.REASONIX_EMBED_MODEL || DEFAULT_EMBED_MODEL,\n },\n openaiCompat: {\n baseUrl: normalized.openaiCompat?.baseUrl?.trim() ?? \"\",\n apiKey: normalized.openaiCompat?.apiKey ? redactKey(normalized.openaiCompat.apiKey) : \"\",\n apiKeySet: Boolean(normalized.openaiCompat?.apiKey?.trim()),\n model: normalized.openaiCompat?.model?.trim() ?? \"\",\n extraBody: normalizeExtraBody(normalized.openaiCompat?.extraBody),\n },\n };\n}\n\n/** Mark the onboarding tip as shown so subsequent launches skip it. */\nexport function markEditModeHintShown(path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n if (cfg.editModeHintShown === true) return;\n cfg.editModeHintShown = true;\n writeConfig(cfg, path);\n}\n\n/** Mark the mouse + clipboard tip as shown. */\nexport function markMouseClipboardHintShown(path: string = defaultConfigPath()): void {\n const cfg = readConfig(path);\n if (cfg.mouseClipboardHintShown === true) return;\n cfg.mouseClipboardHintShown = true;\n writeConfig(cfg, path);\n}\n\nexport function isPlausibleKey(key: string): boolean {\n const trimmed = key.trim();\n return /^sk-[A-Za-z0-9_-]{16,}$/.test(trimmed);\n}\n\n/** Mask a key for display: `sk-abcd...wxyz`. */\nexport function redactKey(key: string): string {\n if (!key) return \"\";\n if (key.length <= 12) return \"****\";\n return `${key.slice(0, 6)}…${key.slice(-4)}`;\n}\n\nfunction normalizeSemanticEmbeddingUserConfig(\n cfg: SemanticEmbeddingUserConfig | undefined,\n): SemanticEmbeddingUserConfig {\n return {\n provider: cfg?.provider === \"openai-compat\" ? \"openai-compat\" : \"ollama\",\n ollama: {\n baseUrl: normalizeOptionalString(cfg?.ollama?.baseUrl),\n model: normalizeOptionalString(cfg?.ollama?.model),\n },\n openaiCompat: {\n baseUrl: normalizeOptionalString(cfg?.openaiCompat?.baseUrl),\n apiKey: normalizeOptionalString(cfg?.openaiCompat?.apiKey),\n model: normalizeOptionalString(cfg?.openaiCompat?.model),\n extraBody: normalizeExtraBody(cfg?.openaiCompat?.extraBody),\n },\n };\n}\n\nfunction normalizeOptionalString(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction normalizeExtraBody(value: Record<string, unknown> | undefined): Record<string, unknown> {\n if (value === undefined) return {};\n if (!isPlainObject(value)) {\n throw new Error(\"Semantic embedding extraBody must be a JSON object.\");\n }\n return { ...value };\n}\n\nfunction requireValidUrl(value: string, label: string): void {\n try {\n new URL(value);\n } catch {\n throw new Error(`${label} must be a valid URL.`);\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n","/** Shared exclude defaults + resolver — chunker, directory_tree, and dashboard read from here. */\n\nimport picomatch from \"picomatch\";\n\nexport interface IndexUserConfig {\n excludeDirs?: string[];\n excludeFiles?: string[];\n excludeExts?: string[];\n excludePatterns?: string[];\n respectGitignore?: boolean;\n maxFileBytes?: number;\n}\n\n/** Plain-data shape — JSON-safe so the dashboard endpoint can serialize. */\nexport interface ResolvedIndexConfig {\n excludeDirs: readonly string[];\n excludeFiles: readonly string[];\n excludeExts: readonly string[];\n excludePatterns: readonly string[];\n respectGitignore: boolean;\n maxFileBytes: number;\n}\n\n/** Hot-path lookup wrapper — built once per indexer run, never serialized. */\nexport interface IndexFilters {\n dirSet: ReadonlySet<string>;\n fileSet: ReadonlySet<string>;\n extSet: ReadonlySet<string>;\n patternMatch: (relPath: string) => boolean;\n respectGitignore: boolean;\n maxFileBytes: number;\n}\n\nexport const DEFAULT_INDEX_EXCLUDES = {\n dirs: [\n \"node_modules\",\n \".git\",\n \".hg\",\n \".svn\",\n \"dist\",\n \"build\",\n \"out\",\n \".next\",\n \".nuxt\",\n \"target\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \".pytest_cache\",\n \".mypy_cache\",\n \".cache\",\n \"coverage\",\n \".turbo\",\n \".vercel\",\n \".reasonix\",\n ] as const,\n files: [\n \"package-lock.json\",\n \"yarn.lock\",\n \"pnpm-lock.yaml\",\n \"Cargo.lock\",\n \"poetry.lock\",\n \"Pipfile.lock\",\n \"go.sum\",\n \".DS_Store\",\n ] as const,\n exts: [\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".bmp\",\n \".ico\",\n \".tiff\",\n \".woff\",\n \".woff2\",\n \".ttf\",\n \".otf\",\n \".eot\",\n \".zip\",\n \".tar\",\n \".gz\",\n \".bz2\",\n \".xz\",\n \".rar\",\n \".7z\",\n \".exe\",\n \".dll\",\n \".so\",\n \".dylib\",\n \".bin\",\n \".class\",\n \".jar\",\n \".war\",\n \".wasm\",\n \".o\",\n \".obj\",\n \".lib\",\n \".a\",\n \".pyc\",\n \".pyo\",\n \".mp3\",\n \".mp4\",\n \".wav\",\n \".ogg\",\n \".webm\",\n \".mov\",\n \".avi\",\n \".pdf\",\n \".sqlite\",\n \".db\",\n ] as const,\n} as const;\n\nexport const DEFAULT_MAX_FILE_BYTES = 256 * 1024;\nexport const DEFAULT_RESPECT_GITIGNORE = true;\n\nexport function defaultIndexConfig(): ResolvedIndexConfig {\n return {\n excludeDirs: [...DEFAULT_INDEX_EXCLUDES.dirs],\n excludeFiles: [...DEFAULT_INDEX_EXCLUDES.files],\n excludeExts: [...DEFAULT_INDEX_EXCLUDES.exts],\n excludePatterns: [],\n respectGitignore: DEFAULT_RESPECT_GITIGNORE,\n maxFileBytes: DEFAULT_MAX_FILE_BYTES,\n };\n}\n\n/** A field present in user config fully replaces the default for that field. Absent → default. */\nexport function resolveIndexConfig(user?: IndexUserConfig | null): ResolvedIndexConfig {\n const d = defaultIndexConfig();\n if (!user) return d;\n return {\n excludeDirs: Array.isArray(user.excludeDirs) ? [...user.excludeDirs] : d.excludeDirs,\n excludeFiles: Array.isArray(user.excludeFiles) ? [...user.excludeFiles] : d.excludeFiles,\n excludeExts: Array.isArray(user.excludeExts)\n ? user.excludeExts.map((e) => e.toLowerCase())\n : d.excludeExts,\n excludePatterns: Array.isArray(user.excludePatterns) ? [...user.excludePatterns] : [],\n respectGitignore:\n typeof user.respectGitignore === \"boolean\" ? user.respectGitignore : d.respectGitignore,\n maxFileBytes:\n typeof user.maxFileBytes === \"number\" && user.maxFileBytes > 0\n ? user.maxFileBytes\n : d.maxFileBytes,\n };\n}\n\nexport function compileFilters(cfg: ResolvedIndexConfig): IndexFilters {\n const matcher =\n cfg.excludePatterns.length === 0\n ? () => false\n : picomatch(cfg.excludePatterns as string[], { dot: true });\n return {\n dirSet: new Set(cfg.excludeDirs),\n fileSet: new Set(cfg.excludeFiles),\n extSet: new Set(cfg.excludeExts.map((e) => e.toLowerCase())),\n patternMatch: matcher as (p: string) => boolean,\n respectGitignore: cfg.respectGitignore,\n maxFileBytes: cfg.maxFileBytes,\n };\n}\n"],"mappings":";;;;;;;AAEA,SAAS,WAAW,WAAW,cAAc,qBAAqB;AAClE,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;;;ACF9B,OAAO,eAAe;AA+Bf,IAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,yBAAyB,MAAM;AACrC,IAAM,4BAA4B;AAElC,SAAS,qBAA0C;AACxD,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,uBAAuB,IAAI;AAAA,IAC5C,cAAc,CAAC,GAAG,uBAAuB,KAAK;AAAA,IAC9C,aAAa,CAAC,GAAG,uBAAuB,IAAI;AAAA,IAC5C,iBAAiB,CAAC;AAAA,IAClB,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AACF;AAGO,SAAS,mBAAmB,MAAoD;AACrF,QAAM,IAAI,mBAAmB;AAC7B,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO;AAAA,IACL,aAAa,MAAM,QAAQ,KAAK,WAAW,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,EAAE;AAAA,IACzE,cAAc,MAAM,QAAQ,KAAK,YAAY,IAAI,CAAC,GAAG,KAAK,YAAY,IAAI,EAAE;AAAA,IAC5E,aAAa,MAAM,QAAQ,KAAK,WAAW,IACvC,KAAK,YAAY,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,IAC3C,EAAE;AAAA,IACN,iBAAiB,MAAM,QAAQ,KAAK,eAAe,IAAI,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC;AAAA,IACpF,kBACE,OAAO,KAAK,qBAAqB,YAAY,KAAK,mBAAmB,EAAE;AAAA,IACzE,cACE,OAAO,KAAK,iBAAiB,YAAY,KAAK,eAAe,IACzD,KAAK,eACL,EAAE;AAAA,EACV;AACF;AAEO,SAAS,eAAe,KAAwC;AACrE,QAAM,UACJ,IAAI,gBAAgB,WAAW,IAC3B,MAAM,QACN,UAAU,IAAI,iBAA6B,EAAE,KAAK,KAAK,CAAC;AAC9D,SAAO;AAAA,IACL,QAAQ,IAAI,IAAI,IAAI,WAAW;AAAA,IAC/B,SAAS,IAAI,IAAI,IAAI,YAAY;AAAA,IACjC,QAAQ,IAAI,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAAA,IAC3D,cAAc;AAAA,IACd,kBAAkB,IAAI;AAAA,IACtB,cAAc,IAAI;AAAA,EACpB;AACF;;;ADxDA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAEpB,SAAS,oBAA4B;AAC1C,SAAO,KAAK,QAAQ,GAAG,aAAa,aAAa;AACnD;AAEO,SAAS,WAAW,OAAe,kBAAkB,GAAmB;AAC7E,MAAI;AACF,UAAM,MAAM,aAAa,MAAM,MAAM;AACrC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,WAAW,SAAU,QAAO;AAAA,EACnD,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAEO,SAAS,YAAY,KAAqB,OAAe,kBAAkB,GAAS;AACzF,YAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,gBAAc,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM;AACxD,MAAI;AACF,cAAU,MAAM,GAAK;AAAA,EACvB,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,aAAa,OAAe,kBAAkB,GAA6B;AACzF,SAAO,WAAW,IAAI,EAAE;AAC1B;AAGO,SAAS,aAAa,MAAoB,OAAe,kBAAkB,GAAS;AACzF,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,OAAO;AACX,cAAY,KAAK,IAAI;AACvB;AAGO,SAAS,WAAW,OAAe,kBAAkB,GAAuB;AACjF,MAAI,QAAQ,IAAI,iBAAkB,QAAO,QAAQ,IAAI;AACrD,SAAO,WAAW,IAAI,EAAE;AAC1B;AAEO,SAAS,cAAc,OAAe,kBAAkB,GAAY;AACzE,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,QAAQ,SAAS,QAAQ,WAAW,QAAQ,IAAK,QAAO;AAC5D,QAAM,MAAM,WAAW,IAAI,EAAE;AAC7B,MAAI,QAAQ,MAAO,QAAO;AAC1B,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAe,kBAAkB,GAAyB;AACxF,QAAM,MAAM,WAAW,IAAI,EAAE;AAC7B,MAAI,QAAQ,UAAW,QAAO;AAC9B,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAe,kBAAkB,GAAW;AAC5E,QAAM,MAAM,WAAW,IAAI,EAAE;AAC7B,MAAI,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC3C,SAAO;AACT;AAEO,SAAS,WAAW,KAAa,OAAe,kBAAkB,GAAS;AAChF,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,SAAS,IAAI,KAAK;AACtB,cAAY,KAAK,IAAI;AACvB;AAGA,SAAS,eAAe,KAAqB,SAAqC;AAChF,QAAM,WAAW,IAAI;AACrB,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,OAAO,OAAO,UAAU,OAAO,EAAG,QAAO;AAC7C,MAAI,QAAQ,aAAa,QAAS,QAAO;AACzC,QAAM,QAAQ,QAAQ,YAAY;AAClC,aAAW,KAAK,OAAO,KAAK,QAAQ,GAAG;AACrC,QAAI,EAAE,YAAY,MAAM,MAAO,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEO,SAAS,wBACd,SACA,OAAe,kBAAkB,GACvB;AACV,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,MAAM,eAAe,KAAK,OAAO;AACvC,MAAI,QAAQ,OAAW,QAAO,CAAC;AAC/B,SAAO,IAAI,WAAW,GAAG,GAAG,gBAAgB,CAAC;AAC/C;AAEO,SAAS,uBACd,SACA,QACA,OAAe,kBAAkB,GAC3B;AACN,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS;AACd,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,CAAC,IAAI,SAAU,KAAI,WAAW,CAAC;AACnC,QAAM,MAAM,eAAe,KAAK,OAAO,KAAK;AAC5C,MAAI,CAAC,IAAI,SAAS,GAAG,EAAG,KAAI,SAAS,GAAG,IAAI,CAAC;AAC7C,QAAM,WAAW,IAAI,SAAS,GAAG,EAAE,gBAAgB,CAAC;AACpD,MAAI,SAAS,SAAS,OAAO,EAAG;AAChC,MAAI,SAAS,GAAG,EAAE,eAAe,CAAC,GAAG,UAAU,OAAO;AACtD,cAAY,KAAK,IAAI;AACvB;AAGO,SAAS,0BACd,SACA,QACA,OAAe,kBAAkB,GACxB;AACT,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,MAAM,eAAe,KAAK,OAAO;AACvC,MAAI,QAAQ,OAAW,QAAO;AAC9B,QAAM,WAAW,IAAI,WAAW,GAAG,GAAG,gBAAgB,CAAC;AACvD,MAAI,CAAC,SAAS,SAAS,OAAO,EAAG,QAAO;AACxC,QAAM,OAAO,SAAS,OAAO,CAAC,MAAM,MAAM,OAAO;AACjD,MAAI,CAAC,IAAI,SAAU,KAAI,WAAW,CAAC;AACnC,MAAI,CAAC,IAAI,SAAS,GAAG,EAAG,KAAI,SAAS,GAAG,IAAI,CAAC;AAC7C,MAAI,SAAS,GAAG,EAAE,eAAe;AACjC,cAAY,KAAK,IAAI;AACrB,SAAO;AACT;AAEO,SAAS,yBACd,SACA,OAAe,kBAAkB,GACzB;AACR,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,MAAM,eAAe,KAAK,OAAO;AACvC,MAAI,QAAQ,OAAW,QAAO;AAC9B,QAAM,WAAW,IAAI,WAAW,GAAG,GAAG,gBAAgB,CAAC;AACvD,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,CAAC,IAAI,SAAU,KAAI,WAAW,CAAC;AACnC,MAAI,CAAC,IAAI,SAAS,GAAG,EAAG,KAAI,SAAS,GAAG,IAAI,CAAC;AAC7C,MAAI,SAAS,GAAG,EAAE,eAAe,CAAC;AAClC,cAAY,KAAK,IAAI;AACrB,SAAO,SAAS;AAClB;AAGO,SAAS,aAAa,OAAe,kBAAkB,GAAa;AACzE,QAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,SAAO,MAAM,SAAS,SAAS;AACjC;AAGO,SAAS,aAAa,MAAgB,OAAe,kBAAkB,GAAS;AACrF,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,WAAW;AACf,cAAY,KAAK,IAAI;AACvB;AAGO,SAAS,kBAAkB,OAAe,kBAAkB,GAAY;AAC7E,SAAO,WAAW,IAAI,EAAE,sBAAsB;AAChD;AAGO,SAAS,wBAAwB,OAAe,kBAAkB,GAAY;AACnF,SAAO,WAAW,IAAI,EAAE,4BAA4B;AACtD;AAGO,SAAS,oBAAoB,OAAe,kBAAkB,GAAoB;AACvF,QAAM,IAAI,WAAW,IAAI,EAAE;AAC3B,SAAO,MAAM,SAAS,SAAS;AACjC;AAEO,SAAS,UAAU,OAAe,kBAAkB,GAAmC;AAC5F,QAAM,QAAQ,WAAW,IAAI,EAAE;AAC/B,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,OAAO,UAAU,YAAY,YAAY,KAAK,EAAG,QAAO;AAC5D,SAAO;AACT;AAEO,SAAS,uBACd,aACA,UACW;AACX,MAAI,eAAe,gBAAgB,OAAQ,QAAO;AAClD,SAAO,iBAAiB,QAAQ;AAClC;AAEO,SAAS,UAAU,OAA2B,OAAe,kBAAkB,GAAS;AAC7F,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,QAAQ;AACZ,cAAY,KAAK,IAAI;AACvB;AAGO,SAAS,oBACd,QACA,OAAe,kBAAkB,GAC3B;AACN,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,kBAAkB;AACtB,cAAY,KAAK,IAAI;AACvB;AAEO,SAAS,oBAAoB,OAAe,kBAAkB,GAAoB;AACvF,SAAO,WAAW,IAAI,EAAE,SAAS,CAAC;AACpC;AAEO,SAAS,gBAAgB,OAAe,kBAAkB,GAAwB;AACvF,SAAO,mBAAmB,WAAW,IAAI,EAAE,KAAK;AAClD;AAQO,SAAS,gCACd,OAAe,kBAAkB,GACJ;AAC7B,SAAO,qCAAqC,WAAW,IAAI,EAAE,QAAQ;AACvE;AAEO,SAAS,4BACd,MACA,OAAe,kBAAkB,GAC3B;AACN,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,WAAW,qCAAqC,IAAI;AACxD,cAAY,KAAK,IAAI;AACvB;AAEO,SAAS,+BACd,OAAe,kBAAkB,GACR;AACzB,QAAM,OAAO,gCAAgC,IAAI;AACjD,QAAM,WAAW,KAAK,YAAY;AAClC,MAAI,aAAa,iBAAiB;AAChC,UAAM,UAAU,KAAK,cAAc,SAAS,KAAK,KAAK;AACtD,UAAM,SAAS,KAAK,cAAc,QAAQ,KAAK,KAAK;AACpD,UAAM,QAAQ,KAAK,cAAc,OAAO,KAAK,KAAK;AAClD,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,kDAAkD;AAChF,oBAAgB,SAAS,2BAA2B;AACpD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,kDAAkD;AAC/E,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,+CAA+C;AAC3E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,mBAAmB,KAAK,cAAc,SAAS;AAAA,MAC1D,WAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,IAAI,cAAc;AAAA,IACnE,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,QAAQ,IAAI,wBAAwB;AAAA,IACzE,WAAW;AAAA,EACb;AACF;AAEO,SAAS,8BACd,MAC6B;AAC7B,QAAM,aAAa,qCAAqC,IAAI;AAC5D,SAAO;AAAA,IACL,UAAU,WAAW,YAAY;AAAA,IACjC,QAAQ;AAAA,MACN,SAAS,WAAW,QAAQ,SAAS,KAAK,KAAK,QAAQ,IAAI,cAAc;AAAA,MACzE,OACE,WAAW,QAAQ,OAAO,KAAK,KAAK,QAAQ,IAAI,wBAAwB;AAAA,IAC5E;AAAA,IACA,cAAc;AAAA,MACZ,SAAS,WAAW,cAAc,SAAS,KAAK,KAAK;AAAA,MACrD,QAAQ,WAAW,cAAc,SAAS,UAAU,WAAW,aAAa,MAAM,IAAI;AAAA,MACtF,WAAW,QAAQ,WAAW,cAAc,QAAQ,KAAK,CAAC;AAAA,MAC1D,OAAO,WAAW,cAAc,OAAO,KAAK,KAAK;AAAA,MACjD,WAAW,mBAAmB,WAAW,cAAc,SAAS;AAAA,IAClE;AAAA,EACF;AACF;AAGO,SAAS,sBAAsB,OAAe,kBAAkB,GAAS;AAC9E,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,IAAI,sBAAsB,KAAM;AACpC,MAAI,oBAAoB;AACxB,cAAY,KAAK,IAAI;AACvB;AAGO,SAAS,4BAA4B,OAAe,kBAAkB,GAAS;AACpF,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,IAAI,4BAA4B,KAAM;AAC1C,MAAI,0BAA0B;AAC9B,cAAY,KAAK,IAAI;AACvB;AAEO,SAAS,eAAe,KAAsB;AACnD,QAAM,UAAU,IAAI,KAAK;AACzB,SAAO,0BAA0B,KAAK,OAAO;AAC/C;AAGO,SAAS,UAAU,KAAqB;AAC7C,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,UAAU,GAAI,QAAO;AAC7B,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,SAAI,IAAI,MAAM,EAAE,CAAC;AAC5C;AAEA,SAAS,qCACP,KAC6B;AAC7B,SAAO;AAAA,IACL,UAAU,KAAK,aAAa,kBAAkB,kBAAkB;AAAA,IAChE,QAAQ;AAAA,MACN,SAAS,wBAAwB,KAAK,QAAQ,OAAO;AAAA,MACrD,OAAO,wBAAwB,KAAK,QAAQ,KAAK;AAAA,IACnD;AAAA,IACA,cAAc;AAAA,MACZ,SAAS,wBAAwB,KAAK,cAAc,OAAO;AAAA,MAC3D,QAAQ,wBAAwB,KAAK,cAAc,MAAM;AAAA,MACzD,OAAO,wBAAwB,KAAK,cAAc,KAAK;AAAA,MACvD,WAAW,mBAAmB,KAAK,cAAc,SAAS;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAA+C;AAC9E,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,UAAU,UAAU;AAC7B;AAEA,SAAS,mBAAmB,OAAqE;AAC/F,MAAI,UAAU,OAAW,QAAO,CAAC;AACjC,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO,EAAE,GAAG,MAAM;AACpB;AAEA,SAAS,gBAAgB,OAAe,OAAqB;AAC3D,MAAI;AACF,QAAI,IAAI,KAAK;AAAA,EACf,QAAQ;AACN,UAAM,IAAI,MAAM,GAAG,KAAK,uBAAuB;AAAA,EACjD;AACF;AAEA,SAAS,cAAc,OAAkD;AACvE,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AAChF,QAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,SAAO,UAAU,OAAO,aAAa,UAAU;AACjD;","names":[]}