reasonix 0.40.0 → 0.43.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 (194) hide show
  1. package/README.md +47 -16
  2. package/README.zh-CN.md +19 -13
  3. package/dashboard/app.css +8 -4
  4. package/dashboard/dist/app.js +377 -227
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/dist/cli/acp-DAGPCVFZ.js +713 -0
  7. package/dist/cli/acp-DAGPCVFZ.js.map +1 -0
  8. package/dist/cli/chat-7ES4IBNH.js +50 -0
  9. package/dist/cli/{chunk-E46ECXJD.js → chunk-2425HK6U.js} +2 -1
  10. package/dist/cli/{chunk-E46ECXJD.js.map → chunk-2425HK6U.js.map} +1 -1
  11. package/dist/cli/chunk-25T6CVUP.js +172 -0
  12. package/dist/cli/chunk-25T6CVUP.js.map +1 -0
  13. package/dist/cli/{chunk-7DLHHBGN.js → chunk-2K65GZBT.js} +16 -5
  14. package/dist/cli/chunk-2K65GZBT.js.map +1 -0
  15. package/dist/cli/{chunk-KMWKGPFZ.js → chunk-2KDUS647.js} +14 -4
  16. package/dist/cli/chunk-2KDUS647.js.map +1 -0
  17. package/dist/cli/chunk-2R4QCDOZ.js +11392 -0
  18. package/dist/cli/chunk-2R4QCDOZ.js.map +1 -0
  19. package/dist/cli/{chunk-3Q3C4W66.js → chunk-2UQP6H6T.js} +2 -1
  20. package/dist/cli/{chunk-3Q3C4W66.js.map → chunk-2UQP6H6T.js.map} +1 -1
  21. package/dist/cli/chunk-2Z35JOA4.js +96 -0
  22. package/dist/cli/chunk-2Z35JOA4.js.map +1 -0
  23. package/dist/cli/chunk-32TIKD5U.js +54 -0
  24. package/dist/cli/{chunk-JWCTX5S4.js.map → chunk-32TIKD5U.js.map} +1 -1
  25. package/dist/cli/{chunk-UVRXTSK3.js → chunk-3BXRZFWS.js} +65 -3
  26. package/dist/cli/chunk-3BXRZFWS.js.map +1 -0
  27. package/dist/cli/chunk-3Z6IBU3D.js +249 -0
  28. package/dist/cli/chunk-3Z6IBU3D.js.map +1 -0
  29. package/dist/cli/{chunk-VLNRQMCI.js → chunk-45U62RI3.js} +12 -5
  30. package/dist/cli/chunk-45U62RI3.js.map +1 -0
  31. package/dist/cli/{chunk-5GKJLNP2.js → chunk-4QUNBQQ2.js} +3 -2
  32. package/dist/cli/{chunk-5GKJLNP2.js.map → chunk-4QUNBQQ2.js.map} +1 -1
  33. package/dist/cli/{chunk-R4YTW7PR.js → chunk-5JJRUIPA.js} +57 -12
  34. package/dist/cli/chunk-5JJRUIPA.js.map +1 -0
  35. package/dist/cli/{chunk-HCC42PEI.js → chunk-6AK4EY3D.js} +12 -6
  36. package/dist/cli/chunk-6AK4EY3D.js.map +1 -0
  37. package/dist/cli/chunk-6G3CUUFG.js +34320 -0
  38. package/dist/cli/chunk-6G3CUUFG.js.map +1 -0
  39. package/dist/cli/{chunk-XST7BSZJ.js → chunk-6PBZN4VI.js} +21 -3
  40. package/dist/cli/chunk-6PBZN4VI.js.map +1 -0
  41. package/dist/cli/{chunk-A5LSGEEK.js → chunk-6PZ3CXBP.js} +88 -66
  42. package/dist/cli/chunk-6PZ3CXBP.js.map +1 -0
  43. package/dist/cli/chunk-74EX7SUH.js +25293 -0
  44. package/dist/cli/chunk-74EX7SUH.js.map +1 -0
  45. package/dist/cli/{chunk-FFNOMR32.js → chunk-7O5ALB4C.js} +3 -2
  46. package/dist/cli/{chunk-FFNOMR32.js.map → chunk-7O5ALB4C.js.map} +1 -1
  47. package/dist/cli/{chunk-UCMTWZKU.js → chunk-DOYHN4KB.js} +3 -2
  48. package/dist/cli/{chunk-UCMTWZKU.js.map → chunk-DOYHN4KB.js.map} +1 -1
  49. package/dist/cli/{chunk-XJLZ4HKU.js → chunk-F3PXYSNN.js} +3 -2
  50. package/dist/cli/{chunk-XJLZ4HKU.js.map → chunk-F3PXYSNN.js.map} +1 -1
  51. package/dist/cli/{chunk-XHQIK7B6.js → chunk-FHOGSSCH.js} +4 -3
  52. package/dist/cli/{chunk-XHQIK7B6.js.map → chunk-FHOGSSCH.js.map} +1 -1
  53. package/dist/cli/{chunk-IYF36OCJ.js → chunk-H6PS7IUE.js} +3 -2
  54. package/dist/cli/{chunk-IYF36OCJ.js.map → chunk-H6PS7IUE.js.map} +1 -1
  55. package/dist/cli/{chunk-ZTLZO42A.js → chunk-HFEAY5DT.js} +3 -2
  56. package/dist/cli/{chunk-ZTLZO42A.js.map → chunk-HFEAY5DT.js.map} +1 -1
  57. package/dist/cli/{chunk-FWGEHRB7.js → chunk-J5XJHLWM.js} +2 -1
  58. package/dist/cli/{chunk-FWGEHRB7.js.map → chunk-J5XJHLWM.js.map} +1 -1
  59. package/dist/cli/chunk-JMBMLOBP.js +26 -0
  60. package/dist/cli/chunk-JMBMLOBP.js.map +1 -0
  61. package/dist/cli/{chunk-SZH34P45.js → chunk-O52OLQL3.js} +52 -18
  62. package/dist/cli/chunk-O52OLQL3.js.map +1 -0
  63. package/dist/cli/{chunk-4DCHFFEY.js → chunk-OSZC7C6F.js} +3 -2
  64. package/dist/cli/{chunk-4DCHFFEY.js.map → chunk-OSZC7C6F.js.map} +1 -1
  65. package/dist/cli/chunk-P7EKE5ZQ.js +60641 -0
  66. package/dist/cli/chunk-P7EKE5ZQ.js.map +1 -0
  67. package/dist/cli/{chunk-FM57FNPJ.js → chunk-PLHAZOLZ.js} +2 -1
  68. package/dist/cli/{chunk-FM57FNPJ.js.map → chunk-PLHAZOLZ.js.map} +1 -1
  69. package/dist/cli/{chunk-RFX7TYVV.js → chunk-PQXPXJBJ.js} +16 -2
  70. package/dist/cli/chunk-PQXPXJBJ.js.map +1 -0
  71. package/dist/cli/{chunk-DAEAAVDF.js → chunk-PV55UMTO.js} +2 -1
  72. package/dist/cli/{chunk-DAEAAVDF.js.map → chunk-PV55UMTO.js.map} +1 -1
  73. package/dist/cli/{chunk-H7PHYVPM.js → chunk-RE4RAVFF.js} +85 -14
  74. package/dist/cli/chunk-RE4RAVFF.js.map +1 -0
  75. package/dist/cli/chunk-S4XVGLRW.js +499 -0
  76. package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
  77. package/dist/cli/{chunk-WJ3YX4PZ.js → chunk-SZ5XES2N.js} +3 -2
  78. package/dist/cli/{chunk-WJ3YX4PZ.js.map → chunk-SZ5XES2N.js.map} +1 -1
  79. package/dist/cli/{chunk-4X3NY5ZM.js → chunk-TJX6BFZZ.js} +16 -9
  80. package/dist/cli/{chunk-4X3NY5ZM.js.map → chunk-TJX6BFZZ.js.map} +1 -1
  81. package/dist/cli/chunk-TUK7OWJA.js +51 -0
  82. package/dist/cli/{chunk-WKOMCPXP.js → chunk-VK5HG73G.js} +26 -17
  83. package/dist/cli/chunk-VK5HG73G.js.map +1 -0
  84. package/dist/cli/{chunk-CLAN6PVH.js → chunk-XCGGEJTI.js} +21 -8
  85. package/dist/cli/chunk-XCGGEJTI.js.map +1 -0
  86. package/dist/cli/{chunk-SOZE7V7V.js → chunk-XJXDHAES.js} +3 -2
  87. package/dist/cli/{chunk-SOZE7V7V.js.map → chunk-XJXDHAES.js.map} +1 -1
  88. package/dist/cli/chunk-XPDVG52A.js +2648 -0
  89. package/dist/cli/chunk-XPDVG52A.js.map +1 -0
  90. package/dist/cli/{chunk-CRPQUBP6.js → chunk-XXC2BYTV.js} +2 -1
  91. package/dist/cli/{chunk-CRPQUBP6.js.map → chunk-XXC2BYTV.js.map} +1 -1
  92. package/dist/cli/{chunk-AVB3WZWU.js → chunk-YFGF5NKA.js} +17 -14
  93. package/dist/cli/{chunk-AVB3WZWU.js.map → chunk-YFGF5NKA.js.map} +1 -1
  94. package/dist/cli/{chunk-ORM6PK57.js → chunk-YQ6NTIIE.js} +2 -1
  95. package/dist/cli/{chunk-ORM6PK57.js.map → chunk-YQ6NTIIE.js.map} +1 -1
  96. package/dist/cli/{chunk-ULBW7DYL.js → chunk-YYQAUTTN.js} +3 -2
  97. package/dist/cli/{chunk-ULBW7DYL.js.map → chunk-YYQAUTTN.js.map} +1 -1
  98. package/dist/cli/chunk-ZZM6QJ4W.js +109 -0
  99. package/dist/cli/chunk-ZZM6QJ4W.js.map +1 -0
  100. package/dist/cli/code-SMKEW6CD.js +154 -0
  101. package/dist/cli/code-SMKEW6CD.js.map +1 -0
  102. package/dist/cli/{commands-FQZOBLLZ.js → commands-FVVB5FZF.js} +7 -5
  103. package/dist/cli/{commands-FQZOBLLZ.js.map → commands-FVVB5FZF.js.map} +1 -1
  104. package/dist/cli/{commit-ZS24SHPG.js → commit-HE4VSPZ7.js} +7 -4
  105. package/dist/cli/{commit-ZS24SHPG.js.map → commit-HE4VSPZ7.js.map} +1 -1
  106. package/dist/cli/{desktop-6OLENOOO.js → desktop-Q7NDXCON.js} +379 -72
  107. package/dist/cli/desktop-Q7NDXCON.js.map +1 -0
  108. package/dist/cli/devtools-YECO25QO.js +3719 -0
  109. package/dist/cli/devtools-YECO25QO.js.map +1 -0
  110. package/dist/cli/diff-435UTPC5.js +165 -0
  111. package/dist/cli/{diff-2VUKNGEI.js.map → diff-435UTPC5.js.map} +1 -1
  112. package/dist/cli/doctor-OT7KH75K.js +27 -0
  113. package/dist/cli/{events-APSVNROZ.js → events-XEFAD5VX.js} +6 -4
  114. package/dist/cli/{events-APSVNROZ.js.map → events-XEFAD5VX.js.map} +1 -1
  115. package/dist/cli/index.js +3233 -123
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/{mcp-DCKOE5RF.js → mcp-WUL2WO75.js} +6 -4
  118. package/dist/cli/{mcp-DCKOE5RF.js.map → mcp-WUL2WO75.js.map} +1 -1
  119. package/dist/cli/{mcp-browse-D6GBP5RQ.js → mcp-browse-RR7R4XET.js} +34 -19
  120. package/dist/cli/mcp-browse-RR7R4XET.js.map +1 -0
  121. package/dist/cli/{mcp-inspect-KFGFPJ3E.js → mcp-inspect-REGLYBWT.js} +9 -8
  122. package/dist/cli/{mcp-inspect-KFGFPJ3E.js.map → mcp-inspect-REGLYBWT.js.map} +1 -1
  123. package/dist/cli/package.json +3 -0
  124. package/dist/cli/prompt-UW6EFLVR.js +16 -0
  125. package/dist/cli/{prune-sessions-LV33R47N.js → prune-sessions-3RWUBYRS.js} +4 -2
  126. package/dist/cli/{prune-sessions-LV33R47N.js.map → prune-sessions-3RWUBYRS.js.map} +1 -1
  127. package/dist/cli/{replay-WFCYX7XF.js → replay-YOURXV4C.js} +42 -30
  128. package/dist/cli/{replay-WFCYX7XF.js.map → replay-YOURXV4C.js.map} +1 -1
  129. package/dist/cli/{run-IUJYEPMT.js → run-Q6BUXV66.js} +28 -27
  130. package/dist/cli/{run-IUJYEPMT.js.map → run-Q6BUXV66.js.map} +1 -1
  131. package/dist/cli/{server-CN4QPPVJ.js → server-XGDBRWMB.js} +44 -43
  132. package/dist/cli/server-XGDBRWMB.js.map +1 -0
  133. package/dist/cli/{sessions-F5GPGTJN.js → sessions-FH7QVYSY.js} +22 -19
  134. package/dist/cli/{sessions-F5GPGTJN.js.map → sessions-FH7QVYSY.js.map} +1 -1
  135. package/dist/cli/setup-VDS6SVEP.js +618 -0
  136. package/dist/cli/setup-VDS6SVEP.js.map +1 -0
  137. package/dist/cli/stats-MQVI2XQH.js +14 -0
  138. package/dist/cli/update-6ITLPRDV.js +15 -0
  139. package/dist/cli/update-6ITLPRDV.js.map +1 -0
  140. package/dist/cli/version-DAHGZY5N.js +33 -0
  141. package/dist/cli/{version-KQUPV6T5.js.map → version-DAHGZY5N.js.map} +1 -1
  142. package/dist/index.d.ts +157 -103
  143. package/dist/index.js +597 -178
  144. package/dist/index.js.map +1 -1
  145. package/package.json +2 -1
  146. package/dist/cli/chat-G7CUW4ZI.js +0 -45
  147. package/dist/cli/chunk-26UDIXLD.js +0 -16481
  148. package/dist/cli/chunk-26UDIXLD.js.map +0 -1
  149. package/dist/cli/chunk-4YV2GBYG.js +0 -5237
  150. package/dist/cli/chunk-4YV2GBYG.js.map +0 -1
  151. package/dist/cli/chunk-5X7LZJDE.js +0 -36
  152. package/dist/cli/chunk-5X7LZJDE.js.map +0 -1
  153. package/dist/cli/chunk-7DLHHBGN.js.map +0 -1
  154. package/dist/cli/chunk-A5LSGEEK.js.map +0 -1
  155. package/dist/cli/chunk-AFFZF3MW.js +0 -36
  156. package/dist/cli/chunk-AFFZF3MW.js.map +0 -1
  157. package/dist/cli/chunk-CLAN6PVH.js.map +0 -1
  158. package/dist/cli/chunk-CPOV2O73.js +0 -39
  159. package/dist/cli/chunk-CPOV2O73.js.map +0 -1
  160. package/dist/cli/chunk-CPTZ5OHX.js +0 -18
  161. package/dist/cli/chunk-CPTZ5OHX.js.map +0 -1
  162. package/dist/cli/chunk-CZSJILQP.js +0 -854
  163. package/dist/cli/chunk-CZSJILQP.js.map +0 -1
  164. package/dist/cli/chunk-H7PHYVPM.js.map +0 -1
  165. package/dist/cli/chunk-HCC42PEI.js.map +0 -1
  166. package/dist/cli/chunk-JWCTX5S4.js +0 -46
  167. package/dist/cli/chunk-KMWKGPFZ.js.map +0 -1
  168. package/dist/cli/chunk-MRLXEMZ7.js +0 -26
  169. package/dist/cli/chunk-MRLXEMZ7.js.map +0 -1
  170. package/dist/cli/chunk-R4YTW7PR.js.map +0 -1
  171. package/dist/cli/chunk-RFX7TYVV.js.map +0 -1
  172. package/dist/cli/chunk-SZH34P45.js.map +0 -1
  173. package/dist/cli/chunk-UVRXTSK3.js.map +0 -1
  174. package/dist/cli/chunk-VLNRQMCI.js.map +0 -1
  175. package/dist/cli/chunk-WKOMCPXP.js.map +0 -1
  176. package/dist/cli/chunk-XST7BSZJ.js.map +0 -1
  177. package/dist/cli/code-YQGVLIT2.js +0 -147
  178. package/dist/cli/code-YQGVLIT2.js.map +0 -1
  179. package/dist/cli/desktop-6OLENOOO.js.map +0 -1
  180. package/dist/cli/diff-2VUKNGEI.js +0 -153
  181. package/dist/cli/doctor-JO2WNN6C.js +0 -24
  182. package/dist/cli/mcp-browse-D6GBP5RQ.js.map +0 -1
  183. package/dist/cli/prompt-PKCCLLAD.js +0 -13
  184. package/dist/cli/server-CN4QPPVJ.js.map +0 -1
  185. package/dist/cli/setup-WWMDBPSB.js +0 -516
  186. package/dist/cli/setup-WWMDBPSB.js.map +0 -1
  187. package/dist/cli/stats-5RJCATCE.js +0 -12
  188. package/dist/cli/update-GUCWB4UN.js +0 -13
  189. package/dist/cli/version-KQUPV6T5.js +0 -30
  190. /package/dist/cli/{chat-G7CUW4ZI.js.map → chat-7ES4IBNH.js.map} +0 -0
  191. /package/dist/cli/{doctor-JO2WNN6C.js.map → chunk-TUK7OWJA.js.map} +0 -0
  192. /package/dist/cli/{prompt-PKCCLLAD.js.map → doctor-OT7KH75K.js.map} +0 -0
  193. /package/dist/cli/{stats-5RJCATCE.js.map → prompt-UW6EFLVR.js.map} +0 -0
  194. /package/dist/cli/{update-GUCWB4UN.js.map → stats-MQVI2XQH.js.map} +0 -0
@@ -1,4 +1,8 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
+ import {
4
+ require_react
5
+ } from "./chunk-6G3CUUFG.js";
2
6
  import {
3
7
  CARD,
4
8
  DEFAULT_THEME_NAME,
@@ -9,29 +13,32 @@ import {
9
13
  TONE_ACTIVE,
10
14
  resolveThemeName,
11
15
  setActiveTheme
12
- } from "./chunk-CZSJILQP.js";
16
+ } from "./chunk-XPDVG52A.js";
17
+ import {
18
+ __toESM
19
+ } from "./chunk-TUK7OWJA.js";
13
20
 
14
21
  // src/cli/ui/theme/context.tsx
15
- import React from "react";
16
- var ThemeContext = React.createContext(THEMES[DEFAULT_THEME_NAME]);
22
+ var import_react = __toESM(require_react(), 1);
23
+ var ThemeContext = import_react.default.createContext(THEMES[DEFAULT_THEME_NAME]);
17
24
  function ThemeProvider({
18
25
  children,
19
26
  name
20
27
  }) {
21
28
  const theme = THEMES[resolveThemeName(name)];
22
29
  const restoreActiveTheme = setActiveTheme(theme);
23
- React.useLayoutEffect(() => restoreActiveTheme, [restoreActiveTheme]);
24
- return /* @__PURE__ */ React.createElement(ThemeContext.Provider, { value: theme }, children);
30
+ import_react.default.useLayoutEffect(() => restoreActiveTheme, [restoreActiveTheme]);
31
+ return /* @__PURE__ */ import_react.default.createElement(ThemeContext.Provider, { value: theme }, children);
25
32
  }
26
33
  function useThemeTokens() {
27
- return React.useContext(ThemeContext);
34
+ return import_react.default.useContext(ThemeContext);
28
35
  }
29
36
  function useTheme() {
30
37
  return useThemeTokens();
31
38
  }
32
39
 
33
40
  // src/cli/ui/theme.ts
34
- import React2 from "react";
41
+ var import_react2 = __toESM(require_react(), 1);
35
42
  function gradientFromTheme(theme) {
36
43
  return [
37
44
  theme.tone.ok,
@@ -107,7 +114,7 @@ function currentTheme() {
107
114
  }
108
115
  function useColor() {
109
116
  const theme = useThemeTokens();
110
- return React2.useMemo(() => colorFromTheme(theme), [theme]);
117
+ return import_react2.default.useMemo(() => colorFromTheme(theme), [theme]);
111
118
  }
112
119
  var GRADIENT = proxyThemeValue(() => gradientFromTheme(currentTheme()));
113
120
  var COLOR = proxyThemeValue(() => colorFromTheme(currentTheme()));
@@ -150,4 +157,4 @@ export {
150
157
  COLOR,
151
158
  GLYPH
152
159
  };
153
- //# sourceMappingURL=chunk-4X3NY5ZM.js.map
160
+ //# sourceMappingURL=chunk-TJX6BFZZ.js.map
@@ -1 +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
+ {"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","import_react","React","SURFACE","FG"]}
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
10
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
11
+ }) : x)(function(x) {
12
+ if (typeof require !== "undefined") return require.apply(this, arguments);
13
+ throw Error('Dynamic require of "' + x + '" is not supported');
14
+ });
15
+ var __esm = (fn, res) => function __init() {
16
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
17
+ };
18
+ var __commonJS = (cb, mod) => function __require2() {
19
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
20
+ };
21
+ var __export = (target, all) => {
22
+ for (var name in all)
23
+ __defProp(target, name, { get: all[name], enumerable: true });
24
+ };
25
+ var __copyProps = (to, from, except, desc) => {
26
+ if (from && typeof from === "object" || typeof from === "function") {
27
+ for (let key of __getOwnPropNames(from))
28
+ if (!__hasOwnProp.call(to, key) && key !== except)
29
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
30
+ }
31
+ return to;
32
+ };
33
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
34
+ // If the importer is in node compatibility mode or this is not an ESM
35
+ // file that has been converted to a CommonJS file using a Babel-
36
+ // compatible transform (i.e. "__esModule" has not been set), then set
37
+ // "default" to the CommonJS "module.exports" for node compatibility.
38
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
39
+ mod
40
+ ));
41
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
42
+
43
+ export {
44
+ __require,
45
+ __esm,
46
+ __commonJS,
47
+ __export,
48
+ __toESM,
49
+ __toCommonJS
50
+ };
51
+ //# sourceMappingURL=chunk-TUK7OWJA.js.map
@@ -1,40 +1,42 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
2
3
  import {
3
4
  detectProxyUrl
4
- } from "./chunk-AFFZF3MW.js";
5
+ } from "./chunk-74EX7SUH.js";
5
6
  import {
6
7
  resolveDataPath
7
- } from "./chunk-DAEAAVDF.js";
8
+ } from "./chunk-PV55UMTO.js";
8
9
  import {
9
- DeepSeekClient
10
- } from "./chunk-KMWKGPFZ.js";
10
+ DeepSeekClient,
11
+ pickPrimaryBalance
12
+ } from "./chunk-2KDUS647.js";
11
13
  import {
12
14
  loadDotenv
13
- } from "./chunk-3Q3C4W66.js";
15
+ } from "./chunk-2UQP6H6T.js";
14
16
  import {
15
17
  checkOllamaStatus
16
- } from "./chunk-UCMTWZKU.js";
18
+ } from "./chunk-DOYHN4KB.js";
17
19
  import {
18
20
  indexExists
19
- } from "./chunk-CLAN6PVH.js";
21
+ } from "./chunk-XCGGEJTI.js";
20
22
  import {
21
23
  loadHooks
22
- } from "./chunk-FFNOMR32.js";
24
+ } from "./chunk-7O5ALB4C.js";
23
25
  import {
24
26
  listSessions
25
- } from "./chunk-XST7BSZJ.js";
27
+ } from "./chunk-6PBZN4VI.js";
26
28
  import {
27
29
  t
28
- } from "./chunk-H7PHYVPM.js";
30
+ } from "./chunk-RE4RAVFF.js";
29
31
  import {
30
32
  defaultConfigPath,
31
33
  loadBaseUrl,
32
34
  readConfig,
33
35
  resolveSemanticEmbeddingConfig
34
- } from "./chunk-CZSJILQP.js";
36
+ } from "./chunk-XPDVG52A.js";
35
37
  import {
36
38
  VERSION
37
- } from "./chunk-CRPQUBP6.js";
39
+ } from "./chunk-XXC2BYTV.js";
38
40
 
39
41
  // src/cli/commands/doctor.ts
40
42
  import { existsSync, readFileSync, statSync } from "fs";
@@ -186,21 +188,20 @@ async function checkApiReach() {
186
188
  detail: "/user/balance returned null \u2014 auth failed or network blocked"
187
189
  };
188
190
  }
191
+ const summary = summarizeBalances(balance.balance_infos);
189
192
  if (!balance.is_available) {
190
- const info2 = balance.balance_infos[0];
191
193
  return {
192
194
  id: "api-reach",
193
195
  label: "api reach ",
194
196
  level: "warn",
195
- detail: `account flagged not-available${info2 ? ` (${info2.total_balance} ${info2.currency})` : ""} \u2014 top up or check your dashboard`
197
+ detail: `account flagged not-available${summary ? ` (${summary})` : ""} \u2014 top up or check your dashboard`
196
198
  };
197
199
  }
198
- const info = balance.balance_infos[0];
199
200
  return {
200
201
  id: "api-reach",
201
202
  label: "api reach ",
202
203
  level: "ok",
203
- detail: info ? `/user/balance ok \u2014 ${info.total_balance} ${info.currency}` : "/user/balance ok"
204
+ detail: summary ? `/user/balance ok \u2014 ${summary}` : "/user/balance ok"
204
205
  };
205
206
  } catch (err) {
206
207
  return {
@@ -211,6 +212,14 @@ async function checkApiReach() {
211
212
  };
212
213
  }
213
214
  }
215
+ function summarizeBalances(infos) {
216
+ if (infos.length === 0) return "";
217
+ const primary = pickPrimaryBalance(infos);
218
+ if (infos.length === 1 || !primary)
219
+ return primary ? `${primary.total_balance} ${primary.currency}` : "";
220
+ const rest = infos.filter((i) => i !== primary).map((i) => `${i.total_balance} ${i.currency}`);
221
+ return `${primary.total_balance} ${primary.currency} + ${rest.join(" + ")}`;
222
+ }
214
223
  async function checkTokenizer() {
215
224
  const path = resolveDataPath();
216
225
  if (existsSync(path)) {
@@ -440,4 +449,4 @@ export {
440
449
  formatDoctorJson,
441
450
  doctorCommand
442
451
  };
443
- //# sourceMappingURL=chunk-WKOMCPXP.js.map
452
+ //# sourceMappingURL=chunk-VK5HG73G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/doctor.ts"],"sourcesContent":["/** Plain-text (not Ink) — must work when everything else is broken. fail → exit 1; warn → exit 0. */\n\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { DeepSeekClient, pickPrimaryBalance } from \"../../client.js\";\nimport {\n defaultConfigPath,\n loadBaseUrl,\n readConfig,\n resolveSemanticEmbeddingConfig,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { loadHooks } from \"../../hooks.js\";\nimport { t } from \"../../i18n/index.js\";\nimport { indexExists } from \"../../index/semantic/builder.js\";\nimport { checkOllamaStatus } from \"../../index/semantic/ollama-launcher.js\";\nimport { listSessions } from \"../../memory/session.js\";\nimport { detectProxyUrl } from \"../../net/proxy.js\";\nimport { resolveDataPath } from \"../../tokenizer.js\";\nimport { VERSION } from \"../../version.js\";\n\nexport type DoctorLevel = \"ok\" | \"warn\" | \"fail\";\n\nexport interface DoctorCheck {\n id: string;\n label: string;\n level: DoctorLevel;\n detail: string;\n}\n\nexport interface DoctorOptions {\n json?: boolean;\n}\n\ntype Level = DoctorLevel;\ntype Check = DoctorCheck;\n\nexport async function runDoctorChecks(projectRoot: string): Promise<DoctorCheck[]> {\n return Promise.all([\n checkApiKey(),\n checkConfig(),\n checkProxy(),\n checkApiReach(),\n checkTokenizer(),\n checkSessions(),\n checkHooks(projectRoot),\n checkOllama(projectRoot),\n checkProject(projectRoot),\n ]);\n}\n\nfunction checkProxy(): Check {\n const url = detectProxyUrl();\n if (!url) {\n return {\n id: \"proxy\",\n label: \"http proxy \",\n level: \"ok\",\n detail: \"no HTTPS_PROXY / HTTP_PROXY / ALL_PROXY set — direct connection\",\n };\n }\n let redacted = url;\n try {\n const u = new URL(url);\n if (u.username || u.password) {\n u.username = \"***\";\n u.password = \"\";\n redacted = u.toString();\n }\n } catch {\n /* not a URL — leave raw */\n }\n return {\n id: \"proxy\",\n label: \"http proxy \",\n level: \"ok\",\n detail: `routing fetch through ${redacted}`,\n };\n}\n\nconst TTY = process.stdout.isTTY && process.env.TERM !== \"dumb\";\n\nfunction color(text: string, code: string): string {\n if (!TTY) return text;\n return `\\x1b[${code}m${text}\\x1b[0m`;\n}\n\nfunction badge(level: Level): string {\n if (level === \"ok\") return color(\"✓\", \"32\");\n if (level === \"warn\") return color(\"⚠\", \"33\");\n return color(\"✗\", \"31\");\n}\n\nfunction tail4(s: string): string {\n return s.length <= 4 ? s : `…${s.slice(-4)}`;\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n\nasync function checkApiKey(): Promise<Check> {\n const fromEnv = process.env.DEEPSEEK_API_KEY;\n if (fromEnv) {\n return {\n id: \"api-key\",\n label: \"api key \",\n level: \"ok\",\n detail: `set via env DEEPSEEK_API_KEY (${tail4(fromEnv)})`,\n };\n }\n try {\n const cfg = readConfig();\n if (cfg.apiKey) {\n return {\n id: \"api-key\",\n label: \"api key \",\n level: \"ok\",\n detail: `from ${defaultConfigPath()} (${tail4(cfg.apiKey)})`,\n };\n }\n } catch {\n /* fall through */\n }\n return {\n id: \"api-key\",\n label: \"api key \",\n level: \"fail\",\n detail:\n \"not set — `reasonix setup` to save one, or export DEEPSEEK_API_KEY. Get a key at https://platform.deepseek.com/api_keys\",\n };\n}\n\nasync function checkConfig(): Promise<Check> {\n const path = defaultConfigPath();\n if (!existsSync(path)) {\n return {\n id: \"config\",\n label: \"config \",\n level: \"warn\",\n detail: \"missing — running with library defaults. `reasonix setup` writes one.\",\n };\n }\n try {\n const cfg = readConfig(path);\n const parts: string[] = [];\n if (cfg.preset) parts.push(`preset=${cfg.preset}`);\n if (cfg.editMode) parts.push(`editMode=${cfg.editMode}`);\n if (cfg.mcp && cfg.mcp.length > 0) parts.push(`mcp=${cfg.mcp.length}`);\n return {\n id: \"config\",\n label: \"config \",\n level: \"ok\",\n detail: `${path}${parts.length ? ` (${parts.join(\", \")})` : \"\"}`,\n };\n } catch (err) {\n return {\n id: \"config\",\n label: \"config \",\n level: \"fail\",\n detail: t(\"doctorErrors.unreadable\", { path, message: (err as Error).message }),\n };\n }\n}\n\nasync function checkApiReach(): Promise<Check> {\n const key = process.env.DEEPSEEK_API_KEY ?? readConfig().apiKey;\n if (!key) {\n return {\n id: \"api-reach\",\n label: \"api reach \",\n level: \"warn\",\n detail: \"skipped — no api key to test with\",\n };\n }\n try {\n const client = new DeepSeekClient({ apiKey: key, baseUrl: loadBaseUrl() });\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 8_000);\n let balance: Awaited<ReturnType<DeepSeekClient[\"getBalance\"]>>;\n try {\n balance = await client.getBalance({ signal: ctl.signal });\n } finally {\n clearTimeout(timer);\n }\n if (!balance) {\n return {\n id: \"api-reach\",\n label: \"api reach \",\n level: \"fail\",\n detail: \"/user/balance returned null — auth failed or network blocked\",\n };\n }\n const summary = summarizeBalances(balance.balance_infos);\n if (!balance.is_available) {\n return {\n id: \"api-reach\",\n label: \"api reach \",\n level: \"warn\",\n detail: `account flagged not-available${summary ? ` (${summary})` : \"\"} — top up or check your dashboard`,\n };\n }\n return {\n id: \"api-reach\",\n label: \"api reach \",\n level: \"ok\",\n detail: summary ? `/user/balance ok — ${summary}` : \"/user/balance ok\",\n };\n } catch (err) {\n return {\n id: \"api-reach\",\n label: \"api reach \",\n level: \"fail\",\n detail: `${(err as Error).message}`,\n };\n }\n}\n\nfunction summarizeBalances(\n infos: ReadonlyArray<{ currency: string; total_balance: string }>,\n): string {\n if (infos.length === 0) return \"\";\n const primary = pickPrimaryBalance(infos);\n if (infos.length === 1 || !primary)\n return primary ? `${primary.total_balance} ${primary.currency}` : \"\";\n const rest = infos.filter((i) => i !== primary).map((i) => `${i.total_balance} ${i.currency}`);\n return `${primary.total_balance} ${primary.currency} + ${rest.join(\" + \")}`;\n}\n\nasync function checkTokenizer(): Promise<Check> {\n // Reuse the runtime's resolver so the doctor never disagrees with what\n // the tokenizer actually loads — three candidates including a global\n // npm install probe via createRequire.\n const path = resolveDataPath();\n if (existsSync(path)) {\n try {\n const stat = statSync(path);\n return {\n id: \"tokenizer\",\n label: \"tokenizer \",\n level: \"ok\",\n detail: `${path} (${fmtBytes(stat.size)})`,\n };\n } catch {\n /* fall through to warn */\n }\n }\n return {\n id: \"tokenizer\",\n label: \"tokenizer \",\n level: \"warn\",\n detail:\n \"data/deepseek-tokenizer.json.gz not found — token counts will fall back to char heuristics\",\n };\n}\n\nasync function checkSessions(): Promise<Check> {\n try {\n const list = listSessions();\n if (list.length === 0) {\n return {\n id: \"sessions\",\n label: \"sessions \",\n level: \"ok\",\n detail: \"0 saved\",\n };\n }\n const totalBytes = list.reduce((s, e) => s + e.size, 0);\n const oldest = list[list.length - 1]!;\n const ageDays = Math.floor((Date.now() - oldest.mtime.getTime()) / (24 * 60 * 60 * 1000));\n const stale = list.filter(\n (e) => Date.now() - e.mtime.getTime() >= 90 * 24 * 60 * 60 * 1000,\n ).length;\n const detail = `${list.length} saved · ${fmtBytes(totalBytes)} · oldest ${ageDays}d`;\n if (stale > 0) {\n return {\n id: \"sessions\",\n label: \"sessions \",\n level: \"warn\",\n detail: `${detail} · ${stale} idle ≥90d (run \\`reasonix prune-sessions\\`)`,\n };\n }\n return { id: \"sessions\", label: \"sessions \", level: \"ok\", detail };\n } catch (err) {\n return {\n id: \"sessions\",\n label: \"sessions \",\n level: \"warn\",\n detail: t(\"doctorErrors.cannotList\", { message: (err as Error).message }),\n };\n }\n}\n\nasync function checkHooks(projectRoot: string): Promise<Check> {\n try {\n const all = loadHooks({ projectRoot });\n const global = all.filter((h) => h.scope === \"global\").length;\n const project = all.filter((h) => h.scope === \"project\").length;\n return {\n id: \"hooks\",\n label: \"hooks \",\n level: \"ok\",\n detail: `${global} global, ${project} project`,\n };\n } catch (err) {\n return {\n id: \"hooks\",\n label: \"hooks \",\n level: \"warn\",\n detail: t(\"doctorErrors.parseFailed\", { message: (err as Error).message }),\n };\n }\n}\n\nasync function checkOllama(projectRoot: string): Promise<Check> {\n let exists = false;\n try {\n exists = await indexExists(projectRoot);\n } catch {\n /* treat as no index */\n }\n if (!exists) {\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"ok\",\n detail: \"not in use (no semantic index built; `reasonix index` to enable)\",\n };\n }\n const meta = readSemanticMeta(projectRoot);\n if (meta?.provider === \"openai-compat\") {\n const resolved = resolveSemanticEmbeddingConfig();\n if (resolved.provider !== \"openai-compat\") {\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"warn\",\n detail: `index uses openai-compat/${meta.model} but current config resolves to ${resolved.provider}/${resolved.model} — rebuild before searching`,\n };\n }\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"ok\",\n detail: `openai-compat · ${resolved.baseUrl} · model ${resolved.model} · api key configured`,\n };\n }\n try {\n const model = meta?.model || process.env.REASONIX_EMBED_MODEL || \"nomic-embed-text\";\n const status = await checkOllamaStatus(model);\n if (!status.binaryFound) {\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"warn\",\n detail:\n \"ollama binary not on PATH — semantic_search will fail; install from https://ollama.com\",\n };\n }\n if (!status.daemonRunning) {\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"warn\",\n detail:\n \"ollama daemon not running — `ollama serve` (or call /semantic in TUI to auto-start)\",\n };\n }\n if (!status.modelPulled) {\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"warn\",\n detail: `model ${status.modelName} not pulled — \\`ollama pull ${status.modelName}\\``,\n };\n }\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"ok\",\n detail: `ollama daemon up · model ${status.modelName} ready`,\n };\n } catch (err) {\n return {\n id: \"semantic\",\n label: \"semantic \",\n level: \"warn\",\n detail: t(\"doctorErrors.probeFailed\", { message: (err as Error).message }),\n };\n }\n}\n\nfunction readSemanticMeta(\n projectRoot: string,\n): { provider: \"ollama\" | \"openai-compat\"; model: string } | null {\n try {\n const raw = readFileSync(join(projectRoot, \".reasonix\", \"semantic\", \"index.meta.json\"), \"utf8\");\n const parsed = JSON.parse(raw) as { provider?: string; model?: string };\n return {\n provider: parsed.provider === \"openai-compat\" ? \"openai-compat\" : \"ollama\",\n model: typeof parsed.model === \"string\" ? parsed.model : \"\",\n };\n } catch {\n return null;\n }\n}\n\nasync function checkProject(projectRoot: string): Promise<Check> {\n // Heuristic: a \"real\" project has either .git, REASONIX.md, or\n // package.json. Lacking all three, `reasonix code` still works but\n // @-mentions and the project-memory pin won't surface much.\n const markers = [\".git\", \"REASONIX.md\", \"package.json\", \"pyproject.toml\", \"Cargo.toml\", \"go.mod\"];\n const found = markers.filter((m) => existsSync(join(projectRoot, m)));\n if (found.length === 0) {\n return {\n id: \"project\",\n label: \"project \",\n level: \"warn\",\n detail: `${projectRoot} has none of: ${markers.slice(0, 3).join(\", \")} … — \\`reasonix code\\` will still run, but @-mentions and project memory have nothing to anchor`,\n };\n }\n return {\n id: \"project\",\n label: \"project \",\n level: \"ok\",\n detail: `${projectRoot} (${found.join(\", \")})`,\n };\n}\n\nexport function formatDoctorJson(checks: DoctorCheck[], version: string): string {\n const ok = checks.filter((c) => c.level === \"ok\").length;\n const warn = checks.filter((c) => c.level === \"warn\").length;\n const fail = checks.filter((c) => c.level === \"fail\").length;\n return JSON.stringify({\n version,\n summary: { ok, warn, fail },\n checks: checks.map((c) => ({ id: c.id, status: c.level, message: c.detail })),\n });\n}\n\nexport async function doctorCommand(opts: DoctorOptions = {}): Promise<void> {\n loadDotenv();\n\n const projectRoot = resolve(process.cwd());\n const json = !!opts.json;\n\n if (!json) {\n console.log(`${color(`reasonix ${VERSION} · doctor`, \"1\")} (cwd: ${projectRoot})`);\n console.log(` home: ${homedir()}`);\n console.log(\"\");\n }\n\n // Run independent checks in parallel — saves ~5s when api-reach has\n // to time out. Each handler swallows its own throws into a `fail`\n // result so a thrown promise can't kill the whole report.\n const checks = await runDoctorChecks(projectRoot);\n\n const ok = checks.filter((c) => c.level === \"ok\").length;\n const warn = checks.filter((c) => c.level === \"warn\").length;\n const fail = checks.filter((c) => c.level === \"fail\").length;\n\n if (json) {\n console.log(formatDoctorJson(checks, VERSION));\n if (fail > 0) process.exit(1);\n return;\n }\n\n for (const c of checks) {\n console.log(` ${badge(c.level)} ${c.label} ${c.detail}`);\n }\n\n console.log(\"\");\n const summary = `${ok} ok · ${warn} warn · ${fail} fail`;\n if (fail > 0) {\n console.log(color(summary, \"31\"));\n process.exit(1);\n } else if (warn > 0) {\n console.log(color(summary, \"33\"));\n } else {\n console.log(color(summary, \"32\"));\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
2
3
  import {
3
4
  ignoredByLayers,
4
5
  loadGitignoreAt
5
- } from "./chunk-5X7LZJDE.js";
6
+ } from "./chunk-S4XVGLRW.js";
6
7
  import {
7
8
  compileFilters,
8
9
  defaultIndexConfig,
9
10
  resolveSemanticEmbeddingConfig
10
- } from "./chunk-CZSJILQP.js";
11
+ } from "./chunk-XPDVG52A.js";
11
12
 
12
13
  // src/index/semantic/builder.ts
13
14
  import { promises as fs3 } from "fs";
@@ -274,12 +275,28 @@ async function embedOllama(text, opts) {
274
275
  }
275
276
  async function embedOpenAICompat(text, opts) {
276
277
  const vectors = await requestOpenAICompatEmbeddings(text, opts);
277
- return vectors[0] ?? new Float32Array(0);
278
+ const v = vectors[0];
279
+ if (!v) {
280
+ throw new EmbeddingError(
281
+ `Embedding provider returned no vector for the input (model ${opts.model})`
282
+ );
283
+ }
284
+ return v;
278
285
  }
279
286
  async function embedAllOpenAICompat(texts, opts) {
280
287
  if (texts.length === 0) return [];
281
288
  if (opts.signal?.aborted) throw new EmbeddingError("embedding aborted");
282
289
  const vectors = await requestOpenAICompatEmbeddings([...texts], opts);
290
+ for (let i = 0; i < vectors.length; i++) {
291
+ if (vectors[i] === null) {
292
+ opts.onError?.(
293
+ i,
294
+ new EmbeddingError(
295
+ `provider dropped input ${i} from the batch (model ${opts.model} returned no embedding for it)`
296
+ )
297
+ );
298
+ }
299
+ }
283
300
  opts.onProgress?.(texts.length, texts.length);
284
301
  return vectors;
285
302
  }
@@ -351,10 +368,6 @@ async function requestOpenAICompatEmbeddings(input, opts) {
351
368
  }
352
369
  out[index] = toFloat32Array(row.embedding, `data[${index}].embedding`);
353
370
  }
354
- for (let i = 0; i < out.length; i++) {
355
- if (!out[i])
356
- throw new EmbeddingError(`OpenAI-compatible response missing embedding at index ${i}`);
357
- }
358
371
  return out;
359
372
  }
360
373
  function toFloat32Array(values, label) {
@@ -857,4 +870,4 @@ export {
857
870
  indexExists,
858
871
  indexCompatible
859
872
  };
860
- //# sourceMappingURL=chunk-CLAN6PVH.js.map
873
+ //# sourceMappingURL=chunk-XCGGEJTI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index/semantic/builder.ts","../../src/index/semantic/chunker.ts","../../src/index/semantic/embedding.ts","../../src/index/semantic/store.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { type ResolvedEmbeddingConfig, resolveSemanticEmbeddingConfig } from \"../../config.js\";\nimport { type ResolvedIndexConfig, defaultIndexConfig } from \"../config.js\";\nimport { walkChunks } from \"./chunker.js\";\nimport type { CodeChunk, SkipReason } from \"./chunker.js\";\nimport { embed, embedAll, probeOllama } from \"./embedding.js\";\nimport type { EmbedOptions } from \"./embedding.js\";\nimport {\n compareIndexIdentity,\n normalize,\n openStore,\n readIndexMeta,\n wipeStoreFiles,\n} from \"./store.js\";\nimport type { IndexEntry, IndexIdentity, IndexMismatch, SearchHit } from \"./store.js\";\n\nexport const INDEX_DIR_NAME = path.join(\".reasonix\", \"semantic\");\n\ntype BuildOptions = {\n provider?: \"ollama\" | \"openai-compat\";\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n windowLines?: number;\n overlap?: number;\n rebuild?: boolean;\n indexConfig?: ResolvedIndexConfig;\n onProgress?: (info: BuildProgress) => void;\n configPath?: string;\n};\n\nexport type SkipBuckets = Record<SkipReason, number>;\n\nexport interface BuildProgress {\n phase: \"setup\" | \"scan\" | \"embed\" | \"write\" | \"done\";\n filesScanned?: number;\n chunksTotal?: number;\n chunksDone?: number;\n filesSkipped?: number;\n filesChanged?: number;\n skipBuckets?: SkipBuckets;\n}\n\nexport interface BuildResult {\n filesScanned: number;\n filesChanged: number;\n chunksAdded: number;\n chunksRemoved: number;\n chunksSkipped: number;\n skipBuckets: SkipBuckets;\n durationMs: number;\n}\n\nfunction emptyBuckets(): SkipBuckets {\n return {\n defaultDir: 0,\n defaultFile: 0,\n binaryExt: 0,\n binaryContent: 0,\n tooLarge: 0,\n gitignore: 0,\n pattern: 0,\n readError: 0,\n };\n}\n\nexport async function buildIndex(root: string, opts: BuildOptions = {}): Promise<BuildResult> {\n const t0 = Date.now();\n const indexDir = path.join(root, INDEX_DIR_NAME);\n const resolved = resolveBuildEmbeddingConfig(opts);\n\n opts.onProgress?.({ phase: \"setup\" });\n throwIfAborted(opts.signal);\n await probeEmbeddingProvider(resolved, opts.signal);\n throwIfAborted(opts.signal);\n\n if (opts.rebuild) await wipeStoreFiles(indexDir);\n const store = await openStore(indexDir, {\n provider: resolved.provider,\n model: resolved.model,\n });\n\n const lastMtimes = store.fileMtimes();\n const seenPaths = new Set<string>();\n const fileChunks = new Map<string, { chunks: CodeChunk[]; mtimeMs: number }>();\n let filesScanned = 0;\n let filesSkipped = 0;\n const skipBuckets = emptyBuckets();\n for await (const chunk of walkChunks(root, {\n windowLines: opts.windowLines,\n overlap: opts.overlap,\n config: opts.indexConfig ?? defaultIndexConfig(),\n onSkip: (_p, reason) => {\n skipBuckets[reason]++;\n },\n })) {\n throwIfAborted(opts.signal);\n seenPaths.add(chunk.path);\n let bucket = fileChunks.get(chunk.path);\n if (!bucket) {\n filesScanned++;\n const abs = path.join(root, chunk.path);\n let mtimeMs = 0;\n try {\n const stat = await fs.stat(abs);\n mtimeMs = stat.mtimeMs;\n } catch {\n continue;\n }\n const last = lastMtimes.get(chunk.path);\n if (last !== undefined && last === mtimeMs && !opts.rebuild) {\n filesSkipped++;\n continue;\n }\n bucket = { chunks: [], mtimeMs };\n fileChunks.set(chunk.path, bucket);\n }\n bucket.chunks.push(chunk);\n opts.onProgress?.({ phase: \"scan\", filesScanned });\n }\n\n throwIfAborted(opts.signal);\n const deletedPaths: string[] = [];\n for (const oldPath of lastMtimes.keys()) {\n if (!seenPaths.has(oldPath)) deletedPaths.push(oldPath);\n }\n const replacePaths = [...fileChunks.keys()].filter((p) => lastMtimes.has(p));\n throwIfAborted(opts.signal);\n const removed = await store.remove([...deletedPaths, ...replacePaths]);\n\n let chunksAdded = 0;\n let chunksSkipped = 0;\n const filesChanged = fileChunks.size;\n let chunksTotal = 0;\n for (const { chunks } of fileChunks.values()) chunksTotal += chunks.length;\n let chunksDone = 0;\n for (const [, bucket] of fileChunks) {\n throwIfAborted(opts.signal);\n if (bucket.chunks.length === 0) continue;\n const texts = bucket.chunks.map((c) => c.text);\n const vectors = await embedAll(texts, {\n ...resolved,\n signal: opts.signal,\n onProgress: (done, total) => {\n opts.onProgress?.({\n phase: \"embed\",\n filesScanned,\n filesChanged,\n chunksTotal,\n chunksDone: chunksDone + done,\n });\n if (done === total) chunksDone += total;\n },\n onError: (idx, err) => {\n chunksSkipped++;\n const c = bucket.chunks[idx];\n const where = c ? `${c.path}:${c.startLine}-${c.endLine}` : `chunk #${idx}`;\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`\\n ! skipped ${where}: ${msg}\\n`);\n },\n });\n throwIfAborted(opts.signal);\n const entries: IndexEntry[] = [];\n for (let i = 0; i < bucket.chunks.length; i++) {\n const vec = vectors[i];\n if (!vec) continue;\n const c = bucket.chunks[i];\n if (!c) continue;\n normalize(vec);\n entries.push({\n path: c.path,\n startLine: c.startLine,\n endLine: c.endLine,\n text: c.text,\n embedding: vec,\n mtimeMs: bucket.mtimeMs,\n });\n }\n throwIfAborted(opts.signal);\n if (entries.length > 0) await store.add(entries);\n chunksAdded += entries.length;\n }\n\n throwIfAborted(opts.signal);\n opts.onProgress?.({\n phase: \"done\",\n filesScanned,\n filesSkipped,\n filesChanged,\n chunksTotal,\n chunksDone,\n skipBuckets,\n });\n\n return {\n filesScanned,\n filesChanged,\n chunksAdded,\n chunksRemoved: removed,\n chunksSkipped,\n skipBuckets,\n durationMs: Date.now() - t0,\n };\n}\n\ntype QueryOptions = {\n provider?: \"ollama\" | \"openai-compat\";\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n topK?: number;\n minScore?: number;\n configPath?: string;\n};\n\nexport async function querySemantic(\n root: string,\n query: string,\n opts: QueryOptions = {},\n): Promise<SearchHit[] | null> {\n const indexDir = path.join(root, INDEX_DIR_NAME);\n const resolved = resolveQueryEmbeddingConfig(opts);\n const store = await openStore(indexDir, {\n provider: resolved.provider,\n model: resolved.model,\n });\n if (store.empty) return null;\n const qvec = await embed(query, { ...resolved, signal: opts.signal });\n normalize(qvec);\n return store.search(qvec, opts.topK ?? 8, opts.minScore ?? 0.3);\n}\n\nexport async function indexExists(root: string): Promise<boolean> {\n const meta = path.join(root, INDEX_DIR_NAME, \"index.meta.json\");\n try {\n await fs.access(meta);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function indexCompatible(\n root: string,\n opts: { provider?: \"ollama\" | \"openai-compat\"; model?: string; configPath?: string } = {},\n): Promise<boolean> {\n const meta = await readIndexMeta(path.join(root, INDEX_DIR_NAME));\n if (!meta) return false;\n return compareIndexIdentity(meta, resolveIndexIdentity(opts)) === null;\n}\n\nfunction resolveBuildEmbeddingConfig(opts: BuildOptions): ResolvedEmbeddingConfig {\n if (opts.provider === \"openai-compat\") {\n if (!opts.baseUrl || !opts.apiKey || !opts.model) {\n throw new Error(\n \"OpenAI-compatible embeddings require baseUrl, apiKey, and model when passed directly.\",\n );\n }\n return {\n provider: \"openai-compat\",\n baseUrl: opts.baseUrl,\n apiKey: opts.apiKey,\n model: opts.model,\n extraBody: opts.extraBody ?? {},\n timeoutMs: opts.timeoutMs ?? 30_000,\n };\n }\n if (opts.baseUrl || opts.model) {\n return {\n provider: \"ollama\",\n baseUrl: opts.baseUrl ?? process.env.OLLAMA_URL ?? \"http://localhost:11434\",\n model: opts.model ?? process.env.REASONIX_EMBED_MODEL ?? \"nomic-embed-text\",\n timeoutMs: opts.timeoutMs ?? 30_000,\n };\n }\n return resolveSemanticEmbeddingConfig(opts.configPath);\n}\n\nfunction resolveIndexIdentity(opts: {\n provider?: \"ollama\" | \"openai-compat\";\n model?: string;\n configPath?: string;\n}): IndexIdentity {\n if (opts.provider && opts.model) {\n return { provider: opts.provider, model: opts.model };\n }\n const resolved = resolveSemanticEmbeddingConfig(opts.configPath);\n return { provider: resolved.provider, model: resolved.model };\n}\n\nfunction resolveQueryEmbeddingConfig(opts: QueryOptions): ResolvedEmbeddingConfig {\n return resolveBuildEmbeddingConfig(opts);\n}\n\nasync function probeEmbeddingProvider(\n config: ResolvedEmbeddingConfig,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (config.provider === \"openai-compat\") return;\n const probe = await probeOllama({ baseUrl: config.baseUrl, signal });\n if (!probe.ok) {\n throw new Error(\n `Ollama is not reachable: ${probe.error}. Install from https://ollama.com, then \\`ollama serve\\` and \\`ollama pull ${config.model}\\`.`,\n );\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new Error(\"semantic indexing aborted\");\n }\n}\n","/** Line-window chunker (not AST) — language-agnostic, every chunk carries exact startLine/endLine for cite-back. */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { type GitignoreLayer, ignoredByLayers, loadGitignoreAt } from \"../../gitignore.js\";\nimport {\n type IndexFilters,\n type ResolvedIndexConfig,\n compileFilters,\n defaultIndexConfig,\n} from \"../config.js\";\n\nexport interface CodeChunk {\n /** Path relative to the index root, forward slashes. Stable across OS. */\n path: string;\n /** 1-based, inclusive. */\n startLine: number;\n endLine: number;\n text: string;\n}\n\nexport type SkipReason =\n | \"defaultDir\"\n | \"defaultFile\"\n | \"binaryExt\"\n | \"binaryContent\"\n | \"tooLarge\"\n | \"gitignore\"\n | \"pattern\"\n | \"readError\";\n\nexport interface ChunkOptions {\n /** Lines per window. Default 60. */\n windowLines?: number;\n /** Lines of overlap between consecutive windows. Default 12. */\n overlap?: number;\n /** Default 4000 — keeps unicode-heavy slices under nomic-embed-text's 8K-token window. */\n maxChunkChars?: number;\n /** Resolved exclude/limit settings. Falls back to package defaults when omitted. */\n config?: ResolvedIndexConfig;\n /** Tally callback for files that didn't make it into the index. */\n onSkip?: (relPath: string, reason: SkipReason) => void;\n}\n\n/** Default character cap per chunk — sized for nomic-embed-text. */\nexport const DEFAULT_MAX_CHUNK_CHARS = 4000;\n\nexport function chunkText(\n text: string,\n filePath: string,\n windowLines: number,\n overlap: number,\n maxChunkChars: number = DEFAULT_MAX_CHUNK_CHARS,\n): CodeChunk[] {\n const lines = text.split(/\\r?\\n/);\n if (lines.length === 0 || (lines.length === 1 && lines[0] === \"\")) return [];\n const stride = Math.max(1, windowLines - overlap);\n const chunks: CodeChunk[] = [];\n for (let start = 0; start < lines.length; start += stride) {\n const end = Math.min(lines.length, start + windowLines);\n const slice = lines.slice(start, end).join(\"\\n\").trim();\n if (slice.length === 0) {\n if (end >= lines.length) break;\n continue;\n }\n const window: CodeChunk = {\n path: filePath,\n startLine: start + 1,\n endLine: end,\n text: slice,\n };\n for (const sub of safeSplit(window, maxChunkChars)) chunks.push(sub);\n if (end >= lines.length) break;\n }\n return chunks;\n}\n\nfunction safeSplit(chunk: CodeChunk, maxChars: number): CodeChunk[] {\n if (chunk.text.length <= maxChars) return [chunk];\n const lines = chunk.text.split(\"\\n\");\n const out: CodeChunk[] = [];\n let bufLines: string[] = [];\n let bufStart = chunk.startLine;\n let bufLen = 0;\n const flush = (untilLineNo: number): void => {\n if (bufLines.length === 0) return;\n out.push({\n path: chunk.path,\n startLine: bufStart,\n endLine: untilLineNo,\n text: bufLines.join(\"\\n\"),\n });\n bufLines = [];\n bufLen = 0;\n };\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const lineLen = line.length + 1;\n if (lineLen > maxChars) {\n flush(chunk.startLine + i - 1);\n out.push({\n path: chunk.path,\n startLine: chunk.startLine + i,\n endLine: chunk.startLine + i,\n text: line.slice(0, maxChars),\n });\n bufStart = chunk.startLine + i + 1;\n continue;\n }\n if (bufLen + lineLen > maxChars && bufLines.length > 0) {\n flush(chunk.startLine + i - 1);\n bufStart = chunk.startLine + i;\n }\n bufLines.push(line);\n bufLen += lineLen;\n }\n flush(chunk.endLine);\n return out;\n}\n\nfunction toForwardRel(root: string, abs: string): string {\n return path.relative(root, abs).split(path.sep).join(\"/\");\n}\n\ninterface WalkFrame {\n dir: string;\n layers: readonly GitignoreLayer[];\n}\n\nexport async function* walkChunks(\n root: string,\n opts: ChunkOptions = {},\n): AsyncGenerator<CodeChunk> {\n const windowLines = opts.windowLines ?? 60;\n const overlap = Math.min(opts.overlap ?? 12, Math.max(0, windowLines - 1));\n const maxChunkChars = opts.maxChunkChars ?? DEFAULT_MAX_CHUNK_CHARS;\n const filters: IndexFilters = compileFilters(opts.config ?? defaultIndexConfig());\n const onSkip = opts.onSkip ?? (() => {});\n\n const initial: GitignoreLayer[] = [];\n if (filters.respectGitignore) {\n const rootIg = await loadGitignoreAt(root);\n if (rootIg) initial.push({ dirAbs: root, ig: rootIg });\n }\n\n const stack: WalkFrame[] = [{ dir: root, layers: initial }];\n while (stack.length > 0) {\n const frame = stack.pop();\n if (!frame) break;\n const { dir, layers } = frame;\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n const name = entry.name;\n const abs = path.join(dir, name);\n const rel = toForwardRel(root, abs);\n if (entry.isDirectory()) {\n if (filters.dirSet.has(name)) {\n onSkip(rel, \"defaultDir\");\n continue;\n }\n if (filters.respectGitignore && ignoredByLayers(layers, abs, true)) {\n onSkip(rel, \"gitignore\");\n continue;\n }\n if (filters.patternMatch(`${rel}/`) || filters.patternMatch(rel)) {\n onSkip(rel, \"pattern\");\n continue;\n }\n const childLayers = filters.respectGitignore ? await extendLayers(layers, abs) : layers;\n stack.push({ dir: abs, layers: childLayers });\n continue;\n }\n if (!entry.isFile()) continue;\n if (filters.fileSet.has(name)) {\n onSkip(rel, \"defaultFile\");\n continue;\n }\n const ext = path.extname(name).toLowerCase();\n if (filters.extSet.has(ext)) {\n onSkip(rel, \"binaryExt\");\n continue;\n }\n if (filters.respectGitignore && ignoredByLayers(layers, abs, false)) {\n onSkip(rel, \"gitignore\");\n continue;\n }\n if (filters.patternMatch(rel)) {\n onSkip(rel, \"pattern\");\n continue;\n }\n // Open once and check size + read against the same fd. Skipping\n // a path-based `fs.stat` upstream is intentional — stat→open is\n // the TOCTOU shape CodeQL flags as js/file-system-race.\n const result = await readSizeBoundedFile(abs, filters.maxFileBytes);\n if (result.kind === \"skip\") {\n onSkip(rel, result.reason);\n continue;\n }\n const text = result.text;\n if (text.indexOf(\"\\0\") !== -1) {\n onSkip(rel, \"binaryContent\");\n continue;\n }\n for (const chunk of chunkText(text, rel, windowLines, overlap, maxChunkChars)) {\n yield chunk;\n }\n }\n }\n}\n\nasync function extendLayers(\n layers: readonly GitignoreLayer[],\n dirAbs: string,\n): Promise<readonly GitignoreLayer[]> {\n const ig = await loadGitignoreAt(dirAbs);\n return ig ? [...layers, { dirAbs, ig }] : layers;\n}\n\nexport async function chunkDirectory(root: string, opts: ChunkOptions = {}): Promise<CodeChunk[]> {\n const out: CodeChunk[] = [];\n for await (const c of walkChunks(root, opts)) out.push(c);\n return out;\n}\n\ntype ReadFileResult = { kind: \"ok\"; text: string } | { kind: \"skip\"; reason: SkipReason };\n\nasync function readSizeBoundedFile(abs: string, maxBytes: number): Promise<ReadFileResult> {\n try {\n const fh = await fs.open(abs, \"r\");\n try {\n const stat = await fh.stat();\n if (stat.size > maxBytes) return { kind: \"skip\", reason: \"tooLarge\" };\n return { kind: \"ok\", text: await fh.readFile(\"utf8\") };\n } finally {\n await fh.close();\n }\n } catch {\n return { kind: \"skip\", reason: \"readError\" };\n }\n}\n","const DEFAULT_OLLAMA_URL = \"http://localhost:11434\";\nconst DEFAULT_EMBED_MODEL = \"nomic-embed-text\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport type EmbedOptions =\n | {\n provider?: \"ollama\";\n baseUrl?: string;\n model?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }\n | {\n provider: \"openai-compat\";\n baseUrl: string;\n apiKey: string;\n model: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n };\n\nexport class EmbeddingError extends Error {\n constructor(\n message: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"EmbeddingError\";\n }\n}\n\nexport async function embed(text: string, opts: EmbedOptions = {}): Promise<Float32Array> {\n if (opts.provider === \"openai-compat\") return await embedOpenAICompat(text, opts);\n return await embedOllama(text, opts);\n}\n\nexport async function embedAll(\n texts: readonly string[],\n opts: EmbedOptions & {\n onProgress?: (done: number, total: number) => void;\n onError?: (index: number, err: unknown) => void;\n } = {},\n): Promise<Array<Float32Array | null>> {\n if (opts.provider === \"openai-compat\") return await embedAllOpenAICompat(texts, opts);\n const out: Array<Float32Array | null> = [];\n for (let i = 0; i < texts.length; i++) {\n if (opts.signal?.aborted) throw new EmbeddingError(\"embedding aborted\");\n const text = texts[i];\n if (text === undefined) continue;\n try {\n out.push(await embed(text, opts));\n } catch (err) {\n if (isAbortError(err) || opts.signal?.aborted) {\n throw new EmbeddingError(\"embedding aborted\", err);\n }\n opts.onError?.(i, err);\n out.push(null);\n }\n opts.onProgress?.(i + 1, texts.length);\n }\n return out;\n}\n\nexport async function probeOllama(\n opts: { baseUrl?: string; signal?: AbortSignal } = {},\n): Promise<{ ok: true; models: string[] } | { ok: false; error: string }> {\n const baseUrl = opts.baseUrl ?? process.env.OLLAMA_URL ?? DEFAULT_OLLAMA_URL;\n try {\n const res = await fetch(`${baseUrl}/api/tags`, { signal: opts.signal });\n if (!res.ok) return { ok: false, error: `Ollama returned ${res.status}` };\n const json = (await res.json()) as { models?: Array<{ name?: string }> };\n const models = (json.models ?? [])\n .map((m) => m.name)\n .filter((n): n is string => typeof n === \"string\");\n return { ok: true, models };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { ok: false, error: msg };\n }\n}\n\nasync function embedOllama(\n text: string,\n opts: Extract<EmbedOptions, { provider?: \"ollama\" }>,\n): Promise<Float32Array> {\n const baseUrl = opts.baseUrl ?? process.env.OLLAMA_URL ?? DEFAULT_OLLAMA_URL;\n const model = opts.model ?? process.env.REASONIX_EMBED_MODEL ?? DEFAULT_EMBED_MODEL;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const { controller, cleanup } = composeAbort(opts.signal, timeoutMs, \"embedding timeout\");\n\n let res: Response;\n try {\n res = await fetch(`${baseUrl}/api/embeddings`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ model, prompt: text }),\n signal: controller.signal,\n });\n } catch (err) {\n cleanup();\n const msg = err instanceof Error ? err.message : String(err);\n if (/ECONNREFUSED|connect ECONNREFUSED|fetch failed/i.test(msg)) {\n throw new EmbeddingError(\n `Cannot reach Ollama at ${baseUrl}. Install from https://ollama.com, then run \\`ollama pull ${model}\\` and \\`ollama serve\\`. Override the URL via OLLAMA_URL.`,\n err,\n );\n }\n throw new EmbeddingError(`embedding request failed: ${msg}`, err);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n if (res.status === 404 && /model.*not found/i.test(body)) {\n throw new EmbeddingError(\n `Embedding model \"${model}\" not pulled. Run \\`ollama pull ${model}\\` once, then retry.`,\n );\n }\n throw new EmbeddingError(`Ollama returned ${res.status}: ${body.slice(0, 200)}`);\n }\n\n const json = (await res.json()) as { embedding?: unknown };\n if (!json.embedding || !Array.isArray(json.embedding)) {\n throw new EmbeddingError(\"Ollama response missing 'embedding' array\");\n }\n return toFloat32Array(json.embedding, \"embedding\");\n}\n\nasync function embedOpenAICompat(\n text: string,\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }>,\n): Promise<Float32Array> {\n const vectors = await requestOpenAICompatEmbeddings(text, opts);\n const v = vectors[0];\n if (!v) {\n throw new EmbeddingError(\n `Embedding provider returned no vector for the input (model ${opts.model})`,\n );\n }\n return v;\n}\n\nasync function embedAllOpenAICompat(\n texts: readonly string[],\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }> & {\n onProgress?: (done: number, total: number) => void;\n onError?: (index: number, err: unknown) => void;\n },\n): Promise<Array<Float32Array | null>> {\n if (texts.length === 0) return [];\n if (opts.signal?.aborted) throw new EmbeddingError(\"embedding aborted\");\n const vectors = await requestOpenAICompatEmbeddings([...texts], opts);\n for (let i = 0; i < vectors.length; i++) {\n if (vectors[i] === null) {\n opts.onError?.(\n i,\n new EmbeddingError(\n `provider dropped input ${i} from the batch (model ${opts.model} returned no embedding for it)`,\n ),\n );\n }\n }\n opts.onProgress?.(texts.length, texts.length);\n return vectors;\n}\n\nasync function requestOpenAICompatEmbeddings(\n input: string | string[],\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }>,\n): Promise<Array<Float32Array | null>> {\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const { controller, cleanup } = composeAbort(opts.signal, timeoutMs, \"embedding timeout\");\n const url = opts.baseUrl.trim();\n const body = {\n ...(opts.extraBody ?? {}),\n model: opts.model,\n input,\n encoding_format: \"float\",\n };\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${opts.apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (err) {\n cleanup();\n if (isAbortError(err) || opts.signal?.aborted) {\n throw new EmbeddingError(\"embedding aborted\", err);\n }\n const msg = err instanceof Error ? err.message : String(err);\n throw new EmbeddingError(`Cannot reach OpenAI-compatible embeddings at ${url}: ${msg}`, err);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n const raw = await res.text().catch(() => \"\");\n const bodyText = raw.slice(0, 300);\n if (res.status === 401 || res.status === 403) {\n throw new EmbeddingError(\n `OpenAI-compatible API rejected the API key for ${url}. Response ${res.status}: ${bodyText}`,\n );\n }\n if (res.status === 404) {\n throw new EmbeddingError(\n `Embeddings endpoint not found at ${url}. Check the configured API URL. Response ${res.status}: ${bodyText}`,\n );\n }\n if (res.status === 400) {\n throw new EmbeddingError(\n `Embedding provider returned 400: ${bodyText}. Check model and custom request body fields.`,\n );\n }\n throw new EmbeddingError(`OpenAI-compatible API returned ${res.status}: ${bodyText}`);\n }\n\n const json = (await res.json()) as {\n data?: Array<{ index?: unknown; embedding?: unknown }>;\n };\n if (!Array.isArray(json.data)) {\n throw new EmbeddingError(\"OpenAI-compatible response missing 'data' array\");\n }\n const size = Array.isArray(input) ? input.length : 1;\n const out: Array<Float32Array | null> = new Array(size).fill(null);\n for (const row of json.data) {\n const rawIndex = row.index;\n if (\n typeof rawIndex !== \"number\" ||\n !Number.isInteger(rawIndex) ||\n rawIndex < 0 ||\n rawIndex >= size\n ) {\n throw new EmbeddingError(\"OpenAI-compatible response returned an invalid embedding index\");\n }\n const index = rawIndex;\n if (!Array.isArray(row.embedding)) {\n throw new EmbeddingError(`OpenAI-compatible response missing embedding for index ${index}`);\n }\n out[index] = toFloat32Array(row.embedding, `data[${index}].embedding`);\n }\n return out;\n}\n\nfunction toFloat32Array(values: unknown[], label: string): Float32Array {\n const out = new Float32Array(values.length);\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new EmbeddingError(`${label}[${i}] is not a finite number`);\n }\n out[i] = value;\n }\n return out;\n}\n\nfunction composeAbort(\n signal: AbortSignal | undefined,\n timeoutMs: number,\n reason: string,\n): { controller: AbortController; cleanup: () => void } {\n const controller = new AbortController();\n const onCallerAbort = () => controller.abort(signal?.reason);\n if (signal) {\n if (signal.aborted) controller.abort(signal.reason);\n else signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n }\n const timer = setTimeout(() => controller.abort(new Error(reason)), timeoutMs);\n return {\n controller,\n cleanup: () => {\n clearTimeout(timer);\n if (signal) signal.removeEventListener(\"abort\", onCallerAbort);\n },\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (err instanceof Error) {\n if (err.name === \"AbortError\") return true;\n if (/aborted/i.test(err.message)) return true;\n }\n return false;\n}\n","/** JSONL append-only (Ctrl+C-safe) + linear cosine scan over unboxed Float32Array — fast enough for ≤10k chunks. */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { EmbeddingProvider } from \"../../config.js\";\nimport type { CodeChunk } from \"./chunker.js\";\n\nexport interface IndexEntry extends CodeChunk {\n embedding: Float32Array;\n mtimeMs: number;\n}\n\nexport interface SearchHit {\n entry: IndexEntry;\n score: number;\n}\n\nexport type IndexMismatch = \"provider\" | \"model\";\n\nexport interface IndexIdentity {\n provider: EmbeddingProvider;\n model: string;\n}\n\nexport interface IndexMeta extends IndexIdentity {\n version: number;\n dim: number;\n updatedAt: string;\n}\n\nexport const STORE_VERSION = 1;\n\nconst META_FILE = \"index.meta.json\";\nconst DATA_FILE = \"index.jsonl\";\n\nexport async function readIndexMeta(indexDir: string): Promise<IndexMeta | null> {\n try {\n const raw = await fs.readFile(path.join(indexDir, META_FILE), \"utf8\");\n return normalizeMeta(JSON.parse(raw) as Partial<IndexMeta>);\n } catch {\n return null;\n }\n}\n\nexport function compareIndexIdentity(\n meta: IndexIdentity,\n identity: IndexIdentity,\n): IndexMismatch | null {\n if (meta.provider !== identity.provider) return \"provider\";\n if (meta.model !== identity.model) return \"model\";\n return null;\n}\n\nexport async function wipeStoreFiles(indexDir: string): Promise<void> {\n await fs.rm(path.join(indexDir, DATA_FILE), { force: true });\n await fs.rm(path.join(indexDir, META_FILE), { force: true });\n}\n\nexport class SemanticStore {\n private entries: IndexEntry[] = [];\n private byPath = new Map<string, IndexEntry[]>();\n private dim = 0;\n\n constructor(\n public readonly indexDir: string,\n public readonly identity: IndexIdentity,\n ) {}\n\n get provider(): EmbeddingProvider {\n return this.identity.provider;\n }\n\n get model(): string {\n return this.identity.model;\n }\n\n get empty(): boolean {\n return this.entries.length === 0;\n }\n\n get size(): number {\n return this.entries.length;\n }\n\n get all(): readonly IndexEntry[] {\n return this.entries;\n }\n\n fileMtimes(): Map<string, number> {\n const out = new Map<string, number>();\n for (const [p, group] of this.byPath) {\n const first = group[0];\n if (first) out.set(p, first.mtimeMs);\n }\n return out;\n }\n\n async add(entries: readonly IndexEntry[]): Promise<void> {\n if (entries.length === 0) return;\n if (this.dim === 0) this.dim = entries[0]!.embedding.length;\n const lines: string[] = [];\n for (const e of entries) {\n if (e.embedding.length !== this.dim) {\n throw new Error(\n `embedding dim mismatch: expected ${this.dim}, got ${e.embedding.length} for ${e.path}:${e.startLine}`,\n );\n }\n this.entries.push(e);\n const list = this.byPath.get(e.path);\n if (list) list.push(e);\n else this.byPath.set(e.path, [e]);\n lines.push(serializeEntry(e));\n }\n await fs.mkdir(this.indexDir, { recursive: true });\n await fs.appendFile(path.join(this.indexDir, DATA_FILE), `${lines.join(\"\\n\")}\\n`, \"utf8\");\n await this.writeMeta();\n }\n\n async remove(paths: readonly string[]): Promise<number> {\n if (paths.length === 0) return 0;\n const drop = new Set(paths);\n const before = this.entries.length;\n this.entries = this.entries.filter((e) => !drop.has(e.path));\n for (const p of paths) this.byPath.delete(p);\n const removed = before - this.entries.length;\n if (removed > 0) await this.flush();\n return removed;\n }\n\n search(query: Float32Array, topK = 8, minScore = 0): SearchHit[] {\n if (this.entries.length === 0) return [];\n if (query.length !== this.dim && this.dim !== 0) {\n throw new Error(`query dim ${query.length} ≠ index dim ${this.dim}`);\n }\n const heap: SearchHit[] = [];\n for (const entry of this.entries) {\n const score = dot(query, entry.embedding);\n if (score < minScore) continue;\n if (heap.length < topK) {\n heap.push({ entry, score });\n if (heap.length === topK) heap.sort((a, b) => a.score - b.score);\n } else if (score > heap[0]!.score) {\n heap[0] = { entry, score };\n for (let i = 0; i < heap.length - 1; i++) {\n if (heap[i]!.score > heap[i + 1]!.score) {\n const tmp = heap[i]!;\n heap[i] = heap[i + 1]!;\n heap[i + 1] = tmp;\n }\n }\n }\n }\n return heap.sort((a, b) => b.score - a.score);\n }\n\n private async flush(): Promise<void> {\n await fs.mkdir(this.indexDir, { recursive: true });\n const tmp = path.join(this.indexDir, `${DATA_FILE}.tmp`);\n const final = path.join(this.indexDir, DATA_FILE);\n const lines = this.entries.map(serializeEntry).join(\"\\n\");\n await fs.writeFile(tmp, lines.length > 0 ? `${lines}\\n` : \"\", \"utf8\");\n await fs.rename(tmp, final);\n await this.writeMeta();\n }\n\n private async writeMeta(): Promise<void> {\n const meta: IndexMeta = {\n version: STORE_VERSION,\n provider: this.provider,\n model: this.model,\n dim: this.dim,\n updatedAt: new Date().toISOString(),\n };\n await fs.writeFile(\n path.join(this.indexDir, META_FILE),\n `${JSON.stringify(meta, null, 2)}\\n`,\n \"utf8\",\n );\n }\n\n async wipe(): Promise<void> {\n this.entries = [];\n this.byPath.clear();\n this.dim = 0;\n await wipeStoreFiles(this.indexDir);\n }\n}\n\nexport async function openStore(indexDir: string, identity: IndexIdentity): Promise<SemanticStore> {\n const store = new SemanticStore(indexDir, identity);\n const dataPath = path.join(indexDir, DATA_FILE);\n\n const meta = await readIndexMeta(indexDir);\n\n if (meta) {\n if (meta.version !== STORE_VERSION) {\n throw new Error(\n `Index format version ${meta.version} does not match current ${STORE_VERSION}. Run \\`reasonix index --rebuild\\`.`,\n );\n }\n const mismatch = compareIndexIdentity(meta, identity);\n if (mismatch !== null) {\n throw new Error(\n `Index was built with provider \"${meta.provider}\" model \"${meta.model}\" but current config is provider \"${identity.provider}\" model \"${identity.model}\". Run \\`reasonix index --rebuild\\`.`,\n );\n }\n }\n\n let raw: string;\n try {\n raw = await fs.readFile(dataPath, \"utf8\");\n } catch {\n return store;\n }\n for (const line of raw.split(\"\\n\")) {\n if (line.length === 0) continue;\n try {\n const entry = deserializeEntry(line);\n (store as unknown as { dim: number }).dim = entry.embedding.length;\n (store as unknown as { entries: IndexEntry[] }).entries.push(entry);\n const map = (store as unknown as { byPath: Map<string, IndexEntry[]> }).byPath;\n const list = map.get(entry.path);\n if (list) list.push(entry);\n else map.set(entry.path, [entry]);\n } catch {\n /* tolerate malformed line */\n }\n }\n return store;\n}\n\nexport function normalize(v: Float32Array): Float32Array {\n let sum = 0;\n for (let i = 0; i < v.length; i++) sum += v[i]! * v[i]!;\n const inv = sum > 0 ? 1 / Math.sqrt(sum) : 0;\n for (let i = 0; i < v.length; i++) v[i] = v[i]! * inv;\n return v;\n}\n\nfunction dot(a: Float32Array, b: Float32Array): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += a[i]! * b[i]!;\n return s;\n}\n\nfunction serializeEntry(e: IndexEntry): string {\n const buf = Buffer.from(e.embedding.buffer, e.embedding.byteOffset, e.embedding.byteLength);\n return JSON.stringify({\n p: e.path,\n s: e.startLine,\n e: e.endLine,\n m: e.mtimeMs,\n t: e.text,\n v: buf.toString(\"base64\"),\n });\n}\n\nfunction deserializeEntry(line: string): IndexEntry {\n const parsed = JSON.parse(line) as {\n p: string;\n s: number;\n e: number;\n m: number;\n t: string;\n v: string;\n };\n const buf = Buffer.from(parsed.v, \"base64\");\n const embedding = new Float32Array(\n buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength),\n );\n return {\n path: parsed.p,\n startLine: parsed.s,\n endLine: parsed.e,\n mtimeMs: parsed.m,\n text: parsed.t,\n embedding: new Float32Array(embedding),\n };\n}\n\nfunction normalizeMeta(meta: Partial<IndexMeta>): IndexMeta {\n return {\n version: typeof meta.version === \"number\" ? meta.version : STORE_VERSION,\n provider: meta.provider === \"openai-compat\" ? \"openai-compat\" : \"ollama\",\n model: typeof meta.model === \"string\" ? meta.model : \"\",\n dim: typeof meta.dim === \"number\" ? meta.dim : 0,\n updatedAt: typeof meta.updatedAt === \"string\" ? meta.updatedAt : new Date(0).toISOString(),\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,YAAYA,WAAU;AAC/B,OAAOC,WAAU;;;ACCjB,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AA0CV,IAAM,0BAA0B;AAEhC,SAAS,UACd,MACA,UACA,aACA,SACA,gBAAwB,yBACX;AACb,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,MAAM,WAAW,KAAM,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,GAAK,QAAO,CAAC;AAC3E,QAAM,SAAS,KAAK,IAAI,GAAG,cAAc,OAAO;AAChD,QAAM,SAAsB,CAAC;AAC7B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AACzD,UAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,QAAQ,WAAW;AACtD,UAAM,QAAQ,MAAM,MAAM,OAAO,GAAG,EAAE,KAAK,IAAI,EAAE,KAAK;AACtD,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,OAAO,MAAM,OAAQ;AACzB;AAAA,IACF;AACA,UAAM,SAAoB;AAAA,MACxB,MAAM;AAAA,MACN,WAAW,QAAQ;AAAA,MACnB,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AACA,eAAW,OAAO,UAAU,QAAQ,aAAa,EAAG,QAAO,KAAK,GAAG;AACnE,QAAI,OAAO,MAAM,OAAQ;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAkB,UAA+B;AAClE,MAAI,MAAM,KAAK,UAAU,SAAU,QAAO,CAAC,KAAK;AAChD,QAAM,QAAQ,MAAM,KAAK,MAAM,IAAI;AACnC,QAAM,MAAmB,CAAC;AAC1B,MAAI,WAAqB,CAAC;AAC1B,MAAI,WAAW,MAAM;AACrB,MAAI,SAAS;AACb,QAAM,QAAQ,CAAC,gBAA8B;AAC3C,QAAI,SAAS,WAAW,EAAG;AAC3B,QAAI,KAAK;AAAA,MACP,MAAM,MAAM;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,MAAM,SAAS,KAAK,IAAI;AAAA,IAC1B,CAAC;AACD,eAAW,CAAC;AACZ,aAAS;AAAA,EACX;AACA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC,KAAK;AACzB,UAAM,UAAU,KAAK,SAAS;AAC9B,QAAI,UAAU,UAAU;AACtB,YAAM,MAAM,YAAY,IAAI,CAAC;AAC7B,UAAI,KAAK;AAAA,QACP,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM,YAAY;AAAA,QAC7B,SAAS,MAAM,YAAY;AAAA,QAC3B,MAAM,KAAK,MAAM,GAAG,QAAQ;AAAA,MAC9B,CAAC;AACD,iBAAW,MAAM,YAAY,IAAI;AACjC;AAAA,IACF;AACA,QAAI,SAAS,UAAU,YAAY,SAAS,SAAS,GAAG;AACtD,YAAM,MAAM,YAAY,IAAI,CAAC;AAC7B,iBAAW,MAAM,YAAY;AAAA,IAC/B;AACA,aAAS,KAAK,IAAI;AAClB,cAAU;AAAA,EACZ;AACA,QAAM,MAAM,OAAO;AACnB,SAAO;AACT;AAEA,SAAS,aAAa,MAAc,KAAqB;AACvD,SAAO,KAAK,SAAS,MAAM,GAAG,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AAC1D;AAOA,gBAAuB,WACrB,MACA,OAAqB,CAAC,GACK;AAC3B,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,UAAU,KAAK,IAAI,KAAK,WAAW,IAAI,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AACzE,QAAM,gBAAgB,KAAK,iBAAiB;AAC5C,QAAM,UAAwB,eAAe,KAAK,UAAU,mBAAmB,CAAC;AAChF,QAAM,SAAS,KAAK,WAAW,MAAM;AAAA,EAAC;AAEtC,QAAM,UAA4B,CAAC;AACnC,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,QAAI,OAAQ,SAAQ,KAAK,EAAE,QAAQ,MAAM,IAAI,OAAO,CAAC;AAAA,EACvD;AAEA,QAAM,QAAqB,CAAC,EAAE,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAC1D,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,QAAQ,MAAM,IAAI;AACxB,QAAI,CAAC,MAAO;AACZ,UAAM,EAAE,KAAK,OAAO,IAAI;AACxB,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACzD,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,YAAM,OAAO,MAAM;AACnB,YAAM,MAAM,KAAK,KAAK,KAAK,IAAI;AAC/B,YAAM,MAAM,aAAa,MAAM,GAAG;AAClC,UAAI,MAAM,YAAY,GAAG;AACvB,YAAI,QAAQ,OAAO,IAAI,IAAI,GAAG;AAC5B,iBAAO,KAAK,YAAY;AACxB;AAAA,QACF;AACA,YAAI,QAAQ,oBAAoB,gBAAgB,QAAQ,KAAK,IAAI,GAAG;AAClE,iBAAO,KAAK,WAAW;AACvB;AAAA,QACF;AACA,YAAI,QAAQ,aAAa,GAAG,GAAG,GAAG,KAAK,QAAQ,aAAa,GAAG,GAAG;AAChE,iBAAO,KAAK,SAAS;AACrB;AAAA,QACF;AACA,cAAM,cAAc,QAAQ,mBAAmB,MAAM,aAAa,QAAQ,GAAG,IAAI;AACjF,cAAM,KAAK,EAAE,KAAK,KAAK,QAAQ,YAAY,CAAC;AAC5C;AAAA,MACF;AACA,UAAI,CAAC,MAAM,OAAO,EAAG;AACrB,UAAI,QAAQ,QAAQ,IAAI,IAAI,GAAG;AAC7B,eAAO,KAAK,aAAa;AACzB;AAAA,MACF;AACA,YAAM,MAAM,KAAK,QAAQ,IAAI,EAAE,YAAY;AAC3C,UAAI,QAAQ,OAAO,IAAI,GAAG,GAAG;AAC3B,eAAO,KAAK,WAAW;AACvB;AAAA,MACF;AACA,UAAI,QAAQ,oBAAoB,gBAAgB,QAAQ,KAAK,KAAK,GAAG;AACnE,eAAO,KAAK,WAAW;AACvB;AAAA,MACF;AACA,UAAI,QAAQ,aAAa,GAAG,GAAG;AAC7B,eAAO,KAAK,SAAS;AACrB;AAAA,MACF;AAIA,YAAM,SAAS,MAAM,oBAAoB,KAAK,QAAQ,YAAY;AAClE,UAAI,OAAO,SAAS,QAAQ;AAC1B,eAAO,KAAK,OAAO,MAAM;AACzB;AAAA,MACF;AACA,YAAM,OAAO,OAAO;AACpB,UAAI,KAAK,QAAQ,IAAI,MAAM,IAAI;AAC7B,eAAO,KAAK,eAAe;AAC3B;AAAA,MACF;AACA,iBAAW,SAAS,UAAU,MAAM,KAAK,aAAa,SAAS,aAAa,GAAG;AAC7E,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,aACb,QACA,QACoC;AACpC,QAAM,KAAK,MAAM,gBAAgB,MAAM;AACvC,SAAO,KAAK,CAAC,GAAG,QAAQ,EAAE,QAAQ,GAAG,CAAC,IAAI;AAC5C;AAUA,eAAe,oBAAoB,KAAa,UAA2C;AACzF,MAAI;AACF,UAAM,KAAK,MAAM,GAAG,KAAK,KAAK,GAAG;AACjC,QAAI;AACF,YAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,UAAI,KAAK,OAAO,SAAU,QAAO,EAAE,MAAM,QAAQ,QAAQ,WAAW;AACpE,aAAO,EAAE,MAAM,MAAM,MAAM,MAAM,GAAG,SAAS,MAAM,EAAE;AAAA,IACvD,UAAE;AACA,YAAM,GAAG,MAAM;AAAA,IACjB;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,MAAM,QAAQ,QAAQ,YAAY;AAAA,EAC7C;AACF;;;ACpPA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAoBpB,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACyB,OACzB;AACA,UAAM,OAAO;AAFY;AAGzB,SAAK,OAAO;AAAA,EACd;AAAA,EAJ2B;AAK7B;AAEA,eAAsB,MAAM,MAAc,OAAqB,CAAC,GAA0B;AACxF,MAAI,KAAK,aAAa,gBAAiB,QAAO,MAAM,kBAAkB,MAAM,IAAI;AAChF,SAAO,MAAM,YAAY,MAAM,IAAI;AACrC;AAEA,eAAsB,SACpB,OACA,OAGI,CAAC,GACgC;AACrC,MAAI,KAAK,aAAa,gBAAiB,QAAO,MAAM,qBAAqB,OAAO,IAAI;AACpF,QAAM,MAAkC,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,eAAe,mBAAmB;AACtE,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,SAAS,OAAW;AACxB,QAAI;AACF,UAAI,KAAK,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,UAAI,aAAa,GAAG,KAAK,KAAK,QAAQ,SAAS;AAC7C,cAAM,IAAI,eAAe,qBAAqB,GAAG;AAAA,MACnD;AACA,WAAK,UAAU,GAAG,GAAG;AACrB,UAAI,KAAK,IAAI;AAAA,IACf;AACA,SAAK,aAAa,IAAI,GAAG,MAAM,MAAM;AAAA,EACvC;AACA,SAAO;AACT;AAEA,eAAsB,YACpB,OAAmD,CAAC,GACoB;AACxE,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,cAAc;AAC1D,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,aAAa,EAAE,QAAQ,KAAK,OAAO,CAAC;AACtE,QAAI,CAAC,IAAI,GAAI,QAAO,EAAE,IAAI,OAAO,OAAO,mBAAmB,IAAI,MAAM,GAAG;AACxE,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,UAAU,CAAC,GAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AACnD,WAAO,EAAE,IAAI,MAAM,OAAO;AAAA,EAC5B,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,EAAE,IAAI,OAAO,OAAO,IAAI;AAAA,EACjC;AACF;AAEA,eAAe,YACb,MACA,MACuB;AACvB,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,cAAc;AAC1D,QAAM,QAAQ,KAAK,SAAS,QAAQ,IAAI,wBAAwB;AAChE,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,EAAE,YAAY,QAAQ,IAAI,aAAa,KAAK,QAAQ,WAAW,mBAAmB;AAExF,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,OAAO,mBAAmB;AAAA,MAC7C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC5C,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ;AACR,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAI,kDAAkD,KAAK,GAAG,GAAG;AAC/D,YAAM,IAAI;AAAA,QACR,0BAA0B,OAAO,6DAA6D,KAAK;AAAA,QACnG;AAAA,MACF;AAAA,IACF;AACA,UAAM,IAAI,eAAe,6BAA6B,GAAG,IAAI,GAAG;AAAA,EAClE,UAAE;AACA,YAAQ;AAAA,EACV;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,QAAI,IAAI,WAAW,OAAO,oBAAoB,KAAK,IAAI,GAAG;AACxD,YAAM,IAAI;AAAA,QACR,oBAAoB,KAAK,mCAAmC,KAAK;AAAA,MACnE;AAAA,IACF;AACA,UAAM,IAAI,eAAe,mBAAmB,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACjF;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,CAAC,KAAK,aAAa,CAAC,MAAM,QAAQ,KAAK,SAAS,GAAG;AACrD,UAAM,IAAI,eAAe,2CAA2C;AAAA,EACtE;AACA,SAAO,eAAe,KAAK,WAAW,WAAW;AACnD;AAEA,eAAe,kBACb,MACA,MACuB;AACvB,QAAM,UAAU,MAAM,8BAA8B,MAAM,IAAI;AAC9D,QAAM,IAAI,QAAQ,CAAC;AACnB,MAAI,CAAC,GAAG;AACN,UAAM,IAAI;AAAA,MACR,8DAA8D,KAAK,KAAK;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,qBACb,OACA,MAIqC;AACrC,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,MAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,eAAe,mBAAmB;AACtE,QAAM,UAAU,MAAM,8BAA8B,CAAC,GAAG,KAAK,GAAG,IAAI;AACpE,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,QAAQ,CAAC,MAAM,MAAM;AACvB,WAAK;AAAA,QACH;AAAA,QACA,IAAI;AAAA,UACF,0BAA0B,CAAC,0BAA0B,KAAK,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,OAAK,aAAa,MAAM,QAAQ,MAAM,MAAM;AAC5C,SAAO;AACT;AAEA,eAAe,8BACb,OACA,MACqC;AACrC,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,EAAE,YAAY,QAAQ,IAAI,aAAa,KAAK,QAAQ,WAAW,mBAAmB;AACxF,QAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,QAAM,OAAO;AAAA,IACX,GAAI,KAAK,aAAa,CAAC;AAAA,IACvB,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,EACnB;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ;AACR,QAAI,aAAa,GAAG,KAAK,KAAK,QAAQ,SAAS;AAC7C,YAAM,IAAI,eAAe,qBAAqB,GAAG;AAAA,IACnD;AACA,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAM,IAAI,eAAe,gDAAgD,GAAG,KAAK,GAAG,IAAI,GAAG;AAAA,EAC7F,UAAE;AACA,YAAQ;AAAA,EACV;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC3C,UAAM,WAAW,IAAI,MAAM,GAAG,GAAG;AACjC,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,YAAM,IAAI;AAAA,QACR,kDAAkD,GAAG,cAAc,IAAI,MAAM,KAAK,QAAQ;AAAA,MAC5F;AAAA,IACF;AACA,QAAI,IAAI,WAAW,KAAK;AACtB,YAAM,IAAI;AAAA,QACR,oCAAoC,GAAG,4CAA4C,IAAI,MAAM,KAAK,QAAQ;AAAA,MAC5G;AAAA,IACF;AACA,QAAI,IAAI,WAAW,KAAK;AACtB,YAAM,IAAI;AAAA,QACR,oCAAoC,QAAQ;AAAA,MAC9C;AAAA,IACF;AACA,UAAM,IAAI,eAAe,kCAAkC,IAAI,MAAM,KAAK,QAAQ,EAAE;AAAA,EACtF;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAG7B,MAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC7B,UAAM,IAAI,eAAe,iDAAiD;AAAA,EAC5E;AACA,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,SAAS;AACnD,QAAM,MAAkC,IAAI,MAAM,IAAI,EAAE,KAAK,IAAI;AACjE,aAAW,OAAO,KAAK,MAAM;AAC3B,UAAM,WAAW,IAAI;AACrB,QACE,OAAO,aAAa,YACpB,CAAC,OAAO,UAAU,QAAQ,KAC1B,WAAW,KACX,YAAY,MACZ;AACA,YAAM,IAAI,eAAe,gEAAgE;AAAA,IAC3F;AACA,UAAM,QAAQ;AACd,QAAI,CAAC,MAAM,QAAQ,IAAI,SAAS,GAAG;AACjC,YAAM,IAAI,eAAe,0DAA0D,KAAK,EAAE;AAAA,IAC5F;AACA,QAAI,KAAK,IAAI,eAAe,IAAI,WAAW,QAAQ,KAAK,aAAa;AAAA,EACvE;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAmB,OAA6B;AACtE,QAAM,MAAM,IAAI,aAAa,OAAO,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,YAAM,IAAI,eAAe,GAAG,KAAK,IAAI,CAAC,0BAA0B;AAAA,IAClE;AACA,QAAI,CAAC,IAAI;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,aACP,QACA,WACA,QACsD;AACtD,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,gBAAgB,MAAM,WAAW,MAAM,QAAQ,MAAM;AAC3D,MAAI,QAAQ;AACV,QAAI,OAAO,QAAS,YAAW,MAAM,OAAO,MAAM;AAAA,QAC7C,QAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,EACrE;AACA,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,IAAI,MAAM,MAAM,CAAC,GAAG,SAAS;AAC7E,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AACb,mBAAa,KAAK;AAClB,UAAI,OAAQ,QAAO,oBAAoB,SAAS,aAAa;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,aAAa,KAAuB;AAC3C,MAAI,eAAe,OAAO;AACxB,QAAI,IAAI,SAAS,aAAc,QAAO;AACtC,QAAI,WAAW,KAAK,IAAI,OAAO,EAAG,QAAO;AAAA,EAC3C;AACA,SAAO;AACT;;;ACjSA,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AA2BV,IAAM,gBAAgB;AAE7B,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,eAAsB,cAAc,UAA6C;AAC/E,MAAI;AACF,UAAM,MAAM,MAAMD,IAAG,SAASC,MAAK,KAAK,UAAU,SAAS,GAAG,MAAM;AACpE,WAAO,cAAc,KAAK,MAAM,GAAG,CAAuB;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBACd,MACA,UACsB;AACtB,MAAI,KAAK,aAAa,SAAS,SAAU,QAAO;AAChD,MAAI,KAAK,UAAU,SAAS,MAAO,QAAO;AAC1C,SAAO;AACT;AAEA,eAAsB,eAAe,UAAiC;AACpE,QAAMD,IAAG,GAAGC,MAAK,KAAK,UAAU,SAAS,GAAG,EAAE,OAAO,KAAK,CAAC;AAC3D,QAAMD,IAAG,GAAGC,MAAK,KAAK,UAAU,SAAS,GAAG,EAAE,OAAO,KAAK,CAAC;AAC7D;AAEO,IAAM,gBAAN,MAAoB;AAAA,EAKzB,YACkB,UACA,UAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAFe;AAAA,EACA;AAAA,EANV,UAAwB,CAAC;AAAA,EACzB,SAAS,oBAAI,IAA0B;AAAA,EACvC,MAAM;AAAA,EAOd,IAAI,WAA8B;AAChC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,QAAiB;AACnB,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,MAA6B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAkC;AAChC,UAAM,MAAM,oBAAI,IAAoB;AACpC,eAAW,CAAC,GAAG,KAAK,KAAK,KAAK,QAAQ;AACpC,YAAM,QAAQ,MAAM,CAAC;AACrB,UAAI,MAAO,KAAI,IAAI,GAAG,MAAM,OAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,SAA+C;AACvD,QAAI,QAAQ,WAAW,EAAG;AAC1B,QAAI,KAAK,QAAQ,EAAG,MAAK,MAAM,QAAQ,CAAC,EAAG,UAAU;AACrD,UAAM,QAAkB,CAAC;AACzB,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,UAAU,WAAW,KAAK,KAAK;AACnC,cAAM,IAAI;AAAA,UACR,oCAAoC,KAAK,GAAG,SAAS,EAAE,UAAU,MAAM,QAAQ,EAAE,IAAI,IAAI,EAAE,SAAS;AAAA,QACtG;AAAA,MACF;AACA,WAAK,QAAQ,KAAK,CAAC;AACnB,YAAM,OAAO,KAAK,OAAO,IAAI,EAAE,IAAI;AACnC,UAAI,KAAM,MAAK,KAAK,CAAC;AAAA,UAChB,MAAK,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChC,YAAM,KAAK,eAAe,CAAC,CAAC;AAAA,IAC9B;AACA,UAAMD,IAAG,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AACjD,UAAMA,IAAG,WAAWC,MAAK,KAAK,KAAK,UAAU,SAAS,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,GAAM,MAAM;AACxF,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,OAA2C;AACtD,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC;AAC3D,eAAW,KAAK,MAAO,MAAK,OAAO,OAAO,CAAC;AAC3C,UAAM,UAAU,SAAS,KAAK,QAAQ;AACtC,QAAI,UAAU,EAAG,OAAM,KAAK,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAqB,OAAO,GAAG,WAAW,GAAgB;AAC/D,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO,CAAC;AACvC,QAAI,MAAM,WAAW,KAAK,OAAO,KAAK,QAAQ,GAAG;AAC/C,YAAM,IAAI,MAAM,aAAa,MAAM,MAAM,qBAAgB,KAAK,GAAG,EAAE;AAAA,IACrE;AACA,UAAM,OAAoB,CAAC;AAC3B,eAAW,SAAS,KAAK,SAAS;AAChC,YAAM,QAAQ,IAAI,OAAO,MAAM,SAAS;AACxC,UAAI,QAAQ,SAAU;AACtB,UAAI,KAAK,SAAS,MAAM;AACtB,aAAK,KAAK,EAAE,OAAO,MAAM,CAAC;AAC1B,YAAI,KAAK,WAAW,KAAM,MAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,MACjE,WAAW,QAAQ,KAAK,CAAC,EAAG,OAAO;AACjC,aAAK,CAAC,IAAI,EAAE,OAAO,MAAM;AACzB,iBAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,cAAI,KAAK,CAAC,EAAG,QAAQ,KAAK,IAAI,CAAC,EAAG,OAAO;AACvC,kBAAM,MAAM,KAAK,CAAC;AAClB,iBAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AACpB,iBAAK,IAAI,CAAC,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EAC9C;AAAA,EAEA,MAAc,QAAuB;AACnC,UAAMD,IAAG,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AACjD,UAAM,MAAMC,MAAK,KAAK,KAAK,UAAU,GAAG,SAAS,MAAM;AACvD,UAAM,QAAQA,MAAK,KAAK,KAAK,UAAU,SAAS;AAChD,UAAM,QAAQ,KAAK,QAAQ,IAAI,cAAc,EAAE,KAAK,IAAI;AACxD,UAAMD,IAAG,UAAU,KAAK,MAAM,SAAS,IAAI,GAAG,KAAK;AAAA,IAAO,IAAI,MAAM;AACpE,UAAMA,IAAG,OAAO,KAAK,KAAK;AAC1B,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAc,YAA2B;AACvC,UAAM,OAAkB;AAAA,MACtB,SAAS;AAAA,MACT,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,UAAMA,IAAG;AAAA,MACPC,MAAK,KAAK,KAAK,UAAU,SAAS;AAAA,MAClC,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,UAAU,CAAC;AAChB,SAAK,OAAO,MAAM;AAClB,SAAK,MAAM;AACX,UAAM,eAAe,KAAK,QAAQ;AAAA,EACpC;AACF;AAEA,eAAsB,UAAU,UAAkB,UAAiD;AACjG,QAAM,QAAQ,IAAI,cAAc,UAAU,QAAQ;AAClD,QAAM,WAAWA,MAAK,KAAK,UAAU,SAAS;AAE9C,QAAM,OAAO,MAAM,cAAc,QAAQ;AAEzC,MAAI,MAAM;AACR,QAAI,KAAK,YAAY,eAAe;AAClC,YAAM,IAAI;AAAA,QACR,wBAAwB,KAAK,OAAO,2BAA2B,aAAa;AAAA,MAC9E;AAAA,IACF;AACA,UAAM,WAAW,qBAAqB,MAAM,QAAQ;AACpD,QAAI,aAAa,MAAM;AACrB,YAAM,IAAI;AAAA,QACR,kCAAkC,KAAK,QAAQ,YAAY,KAAK,KAAK,qCAAqC,SAAS,QAAQ,YAAY,SAAS,KAAK;AAAA,MACvJ;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAMD,IAAG,SAAS,UAAU,MAAM;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,QAAI,KAAK,WAAW,EAAG;AACvB,QAAI;AACF,YAAM,QAAQ,iBAAiB,IAAI;AACnC,MAAC,MAAqC,MAAM,MAAM,UAAU;AAC5D,MAAC,MAA+C,QAAQ,KAAK,KAAK;AAClE,YAAM,MAAO,MAA2D;AACxE,YAAM,OAAO,IAAI,IAAI,MAAM,IAAI;AAC/B,UAAI,KAAM,MAAK,KAAK,KAAK;AAAA,UACpB,KAAI,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC;AAAA,IAClC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAU,GAA+B;AACvD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,QAAO,EAAE,CAAC,IAAK,EAAE,CAAC;AACrD,QAAM,MAAM,MAAM,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI;AAC3C,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,GAAE,CAAC,IAAI,EAAE,CAAC,IAAK;AAClD,SAAO;AACT;AAEA,SAAS,IAAI,GAAiB,GAAyB;AACrD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,MAAK,EAAE,CAAC,IAAK,EAAE,CAAC;AACnD,SAAO;AACT;AAEA,SAAS,eAAe,GAAuB;AAC7C,QAAM,MAAM,OAAO,KAAK,EAAE,UAAU,QAAQ,EAAE,UAAU,YAAY,EAAE,UAAU,UAAU;AAC1F,SAAO,KAAK,UAAU;AAAA,IACpB,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,IAAI,SAAS,QAAQ;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,iBAAiB,MAA0B;AAClD,QAAM,SAAS,KAAK,MAAM,IAAI;AAQ9B,QAAM,MAAM,OAAO,KAAK,OAAO,GAAG,QAAQ;AAC1C,QAAM,YAAY,IAAI;AAAA,IACpB,IAAI,OAAO,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,UAAU;AAAA,EAClE;AACA,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,MAAM,OAAO;AAAA,IACb,WAAW,IAAI,aAAa,SAAS;AAAA,EACvC;AACF;AAEA,SAAS,cAAc,MAAqC;AAC1D,SAAO;AAAA,IACL,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,IAC3D,UAAU,KAAK,aAAa,kBAAkB,kBAAkB;AAAA,IAChE,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,IACrD,KAAK,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;AAAA,IAC/C,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,aAAY,oBAAI,KAAK,CAAC,GAAE,YAAY;AAAA,EAC3F;AACF;;;AH/QO,IAAM,iBAAiBE,MAAK,KAAK,aAAa,UAAU;AAwC/D,SAAS,eAA4B;AACnC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAEA,eAAsB,WAAW,MAAc,OAAqB,CAAC,GAAyB;AAC5F,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,WAAWA,MAAK,KAAK,MAAM,cAAc;AAC/C,QAAM,WAAW,4BAA4B,IAAI;AAEjD,OAAK,aAAa,EAAE,OAAO,QAAQ,CAAC;AACpC,iBAAe,KAAK,MAAM;AAC1B,QAAM,uBAAuB,UAAU,KAAK,MAAM;AAClD,iBAAe,KAAK,MAAM;AAE1B,MAAI,KAAK,QAAS,OAAM,eAAe,QAAQ;AAC/C,QAAM,QAAQ,MAAM,UAAU,UAAU;AAAA,IACtC,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,EAClB,CAAC;AAED,QAAM,aAAa,MAAM,WAAW;AACpC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,aAAa,oBAAI,IAAsD;AAC7E,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,QAAM,cAAc,aAAa;AACjC,mBAAiB,SAAS,WAAW,MAAM;AAAA,IACzC,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK,eAAe,mBAAmB;AAAA,IAC/C,QAAQ,CAAC,IAAI,WAAW;AACtB,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF,CAAC,GAAG;AACF,mBAAe,KAAK,MAAM;AAC1B,cAAU,IAAI,MAAM,IAAI;AACxB,QAAI,SAAS,WAAW,IAAI,MAAM,IAAI;AACtC,QAAI,CAAC,QAAQ;AACX;AACA,YAAM,MAAMA,MAAK,KAAK,MAAM,MAAM,IAAI;AACtC,UAAI,UAAU;AACd,UAAI;AACF,cAAM,OAAO,MAAMC,IAAG,KAAK,GAAG;AAC9B,kBAAU,KAAK;AAAA,MACjB,QAAQ;AACN;AAAA,MACF;AACA,YAAM,OAAO,WAAW,IAAI,MAAM,IAAI;AACtC,UAAI,SAAS,UAAa,SAAS,WAAW,CAAC,KAAK,SAAS;AAC3D;AACA;AAAA,MACF;AACA,eAAS,EAAE,QAAQ,CAAC,GAAG,QAAQ;AAC/B,iBAAW,IAAI,MAAM,MAAM,MAAM;AAAA,IACnC;AACA,WAAO,OAAO,KAAK,KAAK;AACxB,SAAK,aAAa,EAAE,OAAO,QAAQ,aAAa,CAAC;AAAA,EACnD;AAEA,iBAAe,KAAK,MAAM;AAC1B,QAAM,eAAyB,CAAC;AAChC,aAAW,WAAW,WAAW,KAAK,GAAG;AACvC,QAAI,CAAC,UAAU,IAAI,OAAO,EAAG,cAAa,KAAK,OAAO;AAAA,EACxD;AACA,QAAM,eAAe,CAAC,GAAG,WAAW,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC;AAC3E,iBAAe,KAAK,MAAM;AAC1B,QAAM,UAAU,MAAM,MAAM,OAAO,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC;AAErE,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,QAAM,eAAe,WAAW;AAChC,MAAI,cAAc;AAClB,aAAW,EAAE,OAAO,KAAK,WAAW,OAAO,EAAG,gBAAe,OAAO;AACpE,MAAI,aAAa;AACjB,aAAW,CAAC,EAAE,MAAM,KAAK,YAAY;AACnC,mBAAe,KAAK,MAAM;AAC1B,QAAI,OAAO,OAAO,WAAW,EAAG;AAChC,UAAM,QAAQ,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAC7C,UAAM,UAAU,MAAM,SAAS,OAAO;AAAA,MACpC,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,MACb,YAAY,CAAC,MAAM,UAAU;AAC3B,aAAK,aAAa;AAAA,UAChB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,aAAa;AAAA,QAC3B,CAAC;AACD,YAAI,SAAS,MAAO,eAAc;AAAA,MACpC;AAAA,MACA,SAAS,CAAC,KAAK,QAAQ;AACrB;AACA,cAAM,IAAI,OAAO,OAAO,GAAG;AAC3B,cAAM,QAAQ,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,OAAO,KAAK,UAAU,GAAG;AACzE,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,gBAAQ,OAAO,MAAM;AAAA,cAAiB,KAAK,KAAK,GAAG;AAAA,CAAI;AAAA,MACzD;AAAA,IACF,CAAC;AACD,mBAAe,KAAK,MAAM;AAC1B,UAAM,UAAwB,CAAC;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAC7C,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,CAAC,IAAK;AACV,YAAM,IAAI,OAAO,OAAO,CAAC;AACzB,UAAI,CAAC,EAAG;AACR,gBAAU,GAAG;AACb,cAAQ,KAAK;AAAA,QACX,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,QACb,SAAS,EAAE;AAAA,QACX,MAAM,EAAE;AAAA,QACR,WAAW;AAAA,QACX,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AACA,mBAAe,KAAK,MAAM;AAC1B,QAAI,QAAQ,SAAS,EAAG,OAAM,MAAM,IAAI,OAAO;AAC/C,mBAAe,QAAQ;AAAA,EACzB;AAEA,iBAAe,KAAK,MAAM;AAC1B,OAAK,aAAa;AAAA,IAChB,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAeA,eAAsB,cACpB,MACA,OACA,OAAqB,CAAC,GACO;AAC7B,QAAM,WAAWD,MAAK,KAAK,MAAM,cAAc;AAC/C,QAAM,WAAW,4BAA4B,IAAI;AACjD,QAAM,QAAQ,MAAM,UAAU,UAAU;AAAA,IACtC,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,EAClB,CAAC;AACD,MAAI,MAAM,MAAO,QAAO;AACxB,QAAM,OAAO,MAAM,MAAM,OAAO,EAAE,GAAG,UAAU,QAAQ,KAAK,OAAO,CAAC;AACpE,YAAU,IAAI;AACd,SAAO,MAAM,OAAO,MAAM,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG;AAChE;AAEA,eAAsB,YAAY,MAAgC;AAChE,QAAM,OAAOA,MAAK,KAAK,MAAM,gBAAgB,iBAAiB;AAC9D,MAAI;AACF,UAAMC,IAAG,OAAO,IAAI;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBACpB,MACA,OAAuF,CAAC,GACtE;AAClB,QAAM,OAAO,MAAM,cAAcD,MAAK,KAAK,MAAM,cAAc,CAAC;AAChE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,qBAAqB,MAAM,qBAAqB,IAAI,CAAC,MAAM;AACpE;AAEA,SAAS,4BAA4B,MAA6C;AAChF,MAAI,KAAK,aAAa,iBAAiB;AACrC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU,CAAC,KAAK,OAAO;AAChD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,aAAa,CAAC;AAAA,MAC9B,WAAW,KAAK,aAAa;AAAA,IAC/B;AAAA,EACF;AACA,MAAI,KAAK,WAAW,KAAK,OAAO;AAC9B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,KAAK,WAAW,QAAQ,IAAI,cAAc;AAAA,MACnD,OAAO,KAAK,SAAS,QAAQ,IAAI,wBAAwB;AAAA,MACzD,WAAW,KAAK,aAAa;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,+BAA+B,KAAK,UAAU;AACvD;AAEA,SAAS,qBAAqB,MAIZ;AAChB,MAAI,KAAK,YAAY,KAAK,OAAO;AAC/B,WAAO,EAAE,UAAU,KAAK,UAAU,OAAO,KAAK,MAAM;AAAA,EACtD;AACA,QAAM,WAAW,+BAA+B,KAAK,UAAU;AAC/D,SAAO,EAAE,UAAU,SAAS,UAAU,OAAO,SAAS,MAAM;AAC9D;AAEA,SAAS,4BAA4B,MAA6C;AAChF,SAAO,4BAA4B,IAAI;AACzC;AAEA,eAAe,uBACb,QACA,QACe;AACf,MAAI,OAAO,aAAa,gBAAiB;AACzC,QAAM,QAAQ,MAAM,YAAY,EAAE,SAAS,OAAO,SAAS,OAAO,CAAC;AACnE,MAAI,CAAC,MAAM,IAAI;AACb,UAAM,IAAI;AAAA,MACR,4BAA4B,MAAM,KAAK,8EAA8E,OAAO,KAAK;AAAA,IACnI;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAAuC;AAC7D,MAAI,QAAQ,SAAS;AACnB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACF;","names":["fs","path","fs","path","path","fs"]}
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
2
3
  import {
3
4
  MCP_CATALOG
4
- } from "./chunk-FM57FNPJ.js";
5
+ } from "./chunk-PLHAZOLZ.js";
5
6
 
6
7
  // src/mcp/registry-fetch.ts
7
8
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -337,4 +338,4 @@ export {
337
338
  specStringFor,
338
339
  handleToFetchResult
339
340
  };
340
- //# sourceMappingURL=chunk-SOZE7V7V.js.map
341
+ //# sourceMappingURL=chunk-XJXDHAES.js.map