newcraw 1.0.2 → 1.0.4

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 (220) hide show
  1. package/dist/REPL-DECTPCL5.js +50 -0
  2. package/dist/{acp-J4WDYGRX.js → acp-HA476EHW.js} +69 -40
  3. package/dist/acp-HA476EHW.js.map +7 -0
  4. package/dist/{agentsValidate-UBOER2IN.js → agentsValidate-EDPFUUMG.js} +13 -10
  5. package/dist/{agentsValidate-UBOER2IN.js.map → agentsValidate-EDPFUUMG.js.map} +1 -1
  6. package/dist/{ask-MGUO3L35.js → ask-5SP4YYRD.js} +62 -52
  7. package/dist/ask-5SP4YYRD.js.map +7 -0
  8. package/dist/{autoUpdater-2GS6LRPK.js → autoUpdater-FFMM2DR7.js} +5 -4
  9. package/dist/chunk-2BVCVKKB.js +135 -0
  10. package/dist/chunk-2BVCVKKB.js.map +7 -0
  11. package/dist/{chunk-2C43OXE7.js → chunk-2JCTO2EY.js} +38 -59
  12. package/dist/chunk-2JCTO2EY.js.map +7 -0
  13. package/dist/{chunk-OJIMOLIC.js → chunk-3CKC4ABU.js} +3631 -7464
  14. package/dist/chunk-3CKC4ABU.js.map +7 -0
  15. package/dist/chunk-ARCEUG3V.js +88 -0
  16. package/dist/chunk-ARCEUG3V.js.map +7 -0
  17. package/dist/{chunk-RUXIBQ3B.js → chunk-BJYXLCRS.js} +4 -4
  18. package/dist/{chunk-VKI7ORIO.js → chunk-BMKE6FT5.js} +37 -18
  19. package/dist/{chunk-VKI7ORIO.js.map → chunk-BMKE6FT5.js.map} +1 -1
  20. package/dist/chunk-BQCOSNM3.js +93 -0
  21. package/dist/chunk-BQCOSNM3.js.map +7 -0
  22. package/dist/chunk-CHB5K4GI.js +107 -0
  23. package/dist/chunk-CHB5K4GI.js.map +7 -0
  24. package/dist/chunk-D4OZACS2.js +35 -0
  25. package/dist/chunk-EHQ2M5B4.js +166 -0
  26. package/dist/{chunk-ZYSVG4X3.js.map → chunk-EHQ2M5B4.js.map} +2 -2
  27. package/dist/chunk-EUBZGAIN.js +372 -0
  28. package/dist/chunk-EUBZGAIN.js.map +7 -0
  29. package/dist/{chunk-UYRR6F5S.js → chunk-FIMCETCB.js} +9 -3
  30. package/dist/{chunk-UYRR6F5S.js.map → chunk-FIMCETCB.js.map} +1 -1
  31. package/dist/{chunk-DEF3KFP7.js → chunk-GVLJUD6R.js} +4 -2
  32. package/dist/{chunk-DEF3KFP7.js.map → chunk-GVLJUD6R.js.map} +1 -1
  33. package/dist/chunk-HLBLZKZH.js +45 -0
  34. package/dist/chunk-HLBLZKZH.js.map +7 -0
  35. package/dist/{chunk-XS6PU75S.js → chunk-IVWPPTDM.js} +1 -1
  36. package/dist/{chunk-A7X6OCZE.js → chunk-IXFBUXQW.js} +1 -1
  37. package/dist/{chunk-HSJ6HYAO.js → chunk-IZZTKEZH.js} +18 -10
  38. package/dist/chunk-IZZTKEZH.js.map +7 -0
  39. package/dist/{chunk-2EFL22PV.js → chunk-JI4HCLK7.js} +7 -3
  40. package/dist/chunk-JI4HCLK7.js.map +7 -0
  41. package/dist/chunk-JLVECHVJ.js +36 -0
  42. package/dist/chunk-JLVECHVJ.js.map +7 -0
  43. package/dist/{chunk-XXU2NVOE.js → chunk-KJTPUTU7.js} +30 -6
  44. package/dist/chunk-KJTPUTU7.js.map +7 -0
  45. package/dist/{chunk-V5U6BHT2.js → chunk-KS646CDL.js} +7 -3
  46. package/dist/{chunk-V5U6BHT2.js.map → chunk-KS646CDL.js.map} +1 -1
  47. package/dist/{chunk-53A4JHFW.js → chunk-MJ3MLGVB.js} +23 -4
  48. package/dist/chunk-MJ3MLGVB.js.map +7 -0
  49. package/dist/chunk-MJLWBVZP.js +822 -0
  50. package/dist/chunk-MJLWBVZP.js.map +7 -0
  51. package/dist/chunk-MMF5RMLU.js +65 -0
  52. package/dist/chunk-MMF5RMLU.js.map +7 -0
  53. package/dist/{chunk-QH2M65BR.js → chunk-MUW3J7CP.js} +7 -3
  54. package/dist/{chunk-QH2M65BR.js.map → chunk-MUW3J7CP.js.map} +1 -1
  55. package/dist/{chunk-3LMXSKZ7.js → chunk-NFXLN6FJ.js} +1 -1
  56. package/dist/chunk-NT7RDVDA.js +33 -0
  57. package/dist/{chunk-KQSHIOZK.js.map → chunk-NT7RDVDA.js.map} +1 -1
  58. package/dist/{chunk-OZHBEG7U.js → chunk-O4EKE3YR.js} +15 -5
  59. package/dist/{chunk-OZHBEG7U.js.map → chunk-O4EKE3YR.js.map} +1 -1
  60. package/dist/chunk-Q2OBTLBI.js +5473 -0
  61. package/dist/chunk-Q2OBTLBI.js.map +7 -0
  62. package/dist/{chunk-WWDVA4NV.js → chunk-QJ7MQIHN.js} +22 -6
  63. package/dist/{chunk-WWDVA4NV.js.map → chunk-QJ7MQIHN.js.map} +1 -1
  64. package/dist/{chunk-N5OHRWG2.js → chunk-QSRXXZO7.js} +4 -2
  65. package/dist/{chunk-N5OHRWG2.js.map → chunk-QSRXXZO7.js.map} +1 -1
  66. package/dist/{chunk-GZTCXXSS.js → chunk-QT5GS374.js} +57 -46
  67. package/dist/{chunk-GZTCXXSS.js.map → chunk-QT5GS374.js.map} +1 -1
  68. package/dist/chunk-QX5Y5CE5.js +683 -0
  69. package/dist/{chunk-F3COCCAE.js.map → chunk-QX5Y5CE5.js.map} +1 -1
  70. package/dist/{chunk-IIFUDVGS.js → chunk-U6IF5D3J.js} +310 -177
  71. package/dist/chunk-U6IF5D3J.js.map +7 -0
  72. package/dist/{chunk-VQSCECTS.js → chunk-UPRKGNBR.js} +6 -4
  73. package/dist/{chunk-VQSCECTS.js.map → chunk-UPRKGNBR.js.map} +1 -1
  74. package/dist/chunk-UUCRNFMH.js +62 -0
  75. package/dist/chunk-UUCRNFMH.js.map +7 -0
  76. package/dist/chunk-UYWZQVH5.js +35 -0
  77. package/dist/chunk-UYWZQVH5.js.map +7 -0
  78. package/dist/{chunk-XMGUQHMF.js → chunk-VSSVN6WG.js} +11 -1
  79. package/dist/chunk-VSSVN6WG.js.map +7 -0
  80. package/dist/{chunk-VHS2MZQS.js → chunk-W7Q3VYAB.js} +9 -6
  81. package/dist/{chunk-VHS2MZQS.js.map → chunk-W7Q3VYAB.js.map} +1 -1
  82. package/dist/{chunk-JWXQNBBA.js → chunk-WAXMRSVR.js} +7 -1
  83. package/dist/{chunk-JWXQNBBA.js.map → chunk-WAXMRSVR.js.map} +1 -1
  84. package/dist/{chunk-BWYKUDJR.js → chunk-X3NER6FY.js} +14 -8
  85. package/dist/{chunk-BWYKUDJR.js.map → chunk-X3NER6FY.js.map} +1 -1
  86. package/dist/{chunk-IM33F5CM.js → chunk-XYQZLDRB.js} +1668 -1623
  87. package/dist/chunk-XYQZLDRB.js.map +7 -0
  88. package/dist/{chunk-LOIZNQOU.js → chunk-ZM5FMRLS.js} +9 -3
  89. package/dist/{chunk-LOIZNQOU.js.map → chunk-ZM5FMRLS.js.map} +1 -1
  90. package/dist/{chunk-755HIAI3.js → chunk-ZMO4E7IW.js} +3 -42
  91. package/dist/chunk-ZMO4E7IW.js.map +7 -0
  92. package/dist/{cli-KZGF3FV5.js → cli-4KO6TA5J.js} +251 -485
  93. package/dist/cli-4KO6TA5J.js.map +7 -0
  94. package/dist/commands-JSY7CGSU.js +54 -0
  95. package/dist/{config-GTJWCNPF.js → config-DQEFVW3Y.js} +9 -6
  96. package/dist/{context-WF3TTXQU.js → context-HVQCTO5R.js} +8 -7
  97. package/dist/{costTracker-2G3ZI2JF.js → costTracker-VSWW7SRT.js} +3 -2
  98. package/dist/{customCommands-QOWK57EX.js → customCommands-XCINU5TG.js} +6 -5
  99. package/dist/{env-37BAP7QF.js → env-ZOPEXWMF.js} +10 -7
  100. package/dist/{gateway-IZYO6YFJ.js → gateway-SUXSILQL.js} +542 -96
  101. package/dist/gateway-SUXSILQL.js.map +7 -0
  102. package/dist/identity-3KZQQVBG.js +16 -0
  103. package/dist/index.js +8 -6
  104. package/dist/index.js.map +1 -1
  105. package/dist/{kodeAgentSessionId-KTGFX2BE.js → kodeAgentSessionId-4SH24DVH.js} +1 -1
  106. package/dist/{kodeAgentSessionLoad-6F7SJXBC.js → kodeAgentSessionLoad-HB3BYVNG.js} +6 -5
  107. package/dist/{kodeAgentSessionResume-UEEDRJ3N.js → kodeAgentSessionResume-IGSZZY3G.js} +6 -5
  108. package/dist/{kodeAgentStreamJson-VIXFTYL5.js → kodeAgentStreamJson-4ZKIWKS3.js} +4 -2
  109. package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-4L76UC75.js} +15 -4
  110. package/dist/kodeAgentStreamJsonSession-4L76UC75.js.map +7 -0
  111. package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js → kodeAgentStructuredStdio-5DCUC6V6.js} +3 -3
  112. package/dist/{kodeHooks-V36SHCTC.js → kodeHooks-H6DMC3XX.js} +6 -5
  113. package/dist/{llm-CYUDKJNR.js → llm-OJZ6DZVC.js} +306 -60
  114. package/dist/llm-OJZ6DZVC.js.map +7 -0
  115. package/dist/{llmLazy-IXVVBRTN.js → llmLazy-TDLZZDPL.js} +2 -2
  116. package/dist/{loader-OEJ6C3TN.js → loader-MOVYZ76M.js} +6 -5
  117. package/dist/{mcp-KE3SILMX.js → mcp-DUYSIR5L.js} +10 -9
  118. package/dist/{mentionProcessor-GAU2WAYB.js → mentionProcessor-EKVLXJN4.js} +14 -7
  119. package/dist/{mentionProcessor-GAU2WAYB.js.map → mentionProcessor-EKVLXJN4.js.map} +1 -1
  120. package/dist/{messages-WCSGGSEU.js → messages-23ICFVMC.js} +2 -2
  121. package/dist/{model-4TQIV5J2.js → model-FUBCTRTV.js} +10 -7
  122. package/dist/{openai-KTZV6F7N.js → openai-SMYIAIO4.js} +8 -7
  123. package/dist/{outputStyles-WX5RYQOA.js → outputStyles-HBOYJFBE.js} +6 -5
  124. package/dist/{pluginRuntime-JXMJZ2LC.js → pluginRuntime-ATZMDZA7.js} +11 -8
  125. package/dist/{pluginRuntime-JXMJZ2LC.js.map → pluginRuntime-ATZMDZA7.js.map} +1 -1
  126. package/dist/{pluginValidation-JNQZYLUP.js → pluginValidation-7CGOMT6F.js} +8 -7
  127. package/dist/prompts-MFESKNYZ.js +58 -0
  128. package/dist/query-BFEFOX4S.js +58 -0
  129. package/dist/{responsesStreaming-2AIT6GHG.js → responsesStreaming-JORGEFQC.js} +1 -1
  130. package/dist/{ripgrep-KDPQAMB2.js → ripgrep-KNJBCJIQ.js} +5 -4
  131. package/dist/sandbox-P3FR4G4D.js +63 -0
  132. package/dist/{skillMarketplace-IXAGP3Q2.js → skillMarketplace-PCMKVV4O.js} +5 -4
  133. package/dist/{state-MSCYLB6Y.js → state-XBYIQ7R4.js} +6 -3
  134. package/dist/structuredOutput-KAVFUV2Z.js +9 -0
  135. package/dist/theme-4ZSXUILR.js +15 -0
  136. package/dist/thinking-TTNUZUB3.js +18 -0
  137. package/dist/{toolPermissionContext-I3IXPVED.js → toolPermissionContext-JCQ5MFUT.js} +1 -1
  138. package/dist/toolPermissionContext-JCQ5MFUT.js.map +7 -0
  139. package/dist/toolPermissionContextState-R6ZGMKP6.js +24 -0
  140. package/dist/toolPermissionContextState-R6ZGMKP6.js.map +7 -0
  141. package/dist/{toolPermissionSettings-EUZKGZU2.js → toolPermissionSettings-GMEYTJEA.js} +9 -8
  142. package/dist/toolPermissionSettings-GMEYTJEA.js.map +7 -0
  143. package/dist/tools-7FVKB7BG.js +55 -0
  144. package/dist/tools-7FVKB7BG.js.map +7 -0
  145. package/dist/{userInput-LJL4CVOB.js → userInput-SZEUY5J6.js} +49 -34
  146. package/dist/{userInput-LJL4CVOB.js.map → userInput-SZEUY5J6.js.map} +1 -1
  147. package/dist/{uuid-VA3KVASX.js → uuid-RQH3OZ3W.js} +1 -1
  148. package/dist/uuid-RQH3OZ3W.js.map +7 -0
  149. package/dist/workspace-EP63OB5S.js +21 -0
  150. package/dist/workspace-EP63OB5S.js.map +7 -0
  151. package/package.json +2 -2
  152. package/web/dist/assets/index-XuLVvSQF.js +251 -0
  153. package/web/dist/assets/index-pSid9IlY.css +10 -0
  154. package/web/dist/index.html +2 -2
  155. package/dist/REPL-IAK7ZN2Z.js +0 -42
  156. package/dist/acp-J4WDYGRX.js.map +0 -7
  157. package/dist/ask-MGUO3L35.js.map +0 -7
  158. package/dist/chunk-2C43OXE7.js.map +0 -7
  159. package/dist/chunk-2EFL22PV.js.map +0 -7
  160. package/dist/chunk-53A4JHFW.js.map +0 -7
  161. package/dist/chunk-755HIAI3.js.map +0 -7
  162. package/dist/chunk-AXWJI6N5.js +0 -11
  163. package/dist/chunk-F3COCCAE.js +0 -654
  164. package/dist/chunk-HSJ6HYAO.js.map +0 -7
  165. package/dist/chunk-IIFUDVGS.js.map +0 -7
  166. package/dist/chunk-IM33F5CM.js.map +0 -7
  167. package/dist/chunk-KQSHIOZK.js +0 -24
  168. package/dist/chunk-OJIMOLIC.js.map +0 -7
  169. package/dist/chunk-XMGUQHMF.js.map +0 -7
  170. package/dist/chunk-XXU2NVOE.js.map +0 -7
  171. package/dist/chunk-ZYSVG4X3.js +0 -151
  172. package/dist/cli-KZGF3FV5.js.map +0 -7
  173. package/dist/commands-AVEBLFVS.js +0 -46
  174. package/dist/gateway-IZYO6YFJ.js.map +0 -7
  175. package/dist/kodeAgentStreamJsonSession-XC3IPREZ.js.map +0 -7
  176. package/dist/llm-CYUDKJNR.js.map +0 -7
  177. package/dist/prompts-LE6GK75N.js +0 -48
  178. package/dist/query-GGIP6PWG.js +0 -50
  179. package/dist/theme-GAMFOLBW.js +0 -14
  180. package/dist/tools-3HOUIDM3.js +0 -47
  181. package/web/dist/assets/index-COAJqX1Z.css +0 -1
  182. package/web/dist/assets/index-CzS_4LmC.js +0 -179
  183. /package/dist/{REPL-IAK7ZN2Z.js.map → REPL-DECTPCL5.js.map} +0 -0
  184. /package/dist/{autoUpdater-2GS6LRPK.js.map → autoUpdater-FFMM2DR7.js.map} +0 -0
  185. /package/dist/{chunk-RUXIBQ3B.js.map → chunk-BJYXLCRS.js.map} +0 -0
  186. /package/dist/{chunk-AXWJI6N5.js.map → chunk-D4OZACS2.js.map} +0 -0
  187. /package/dist/{chunk-XS6PU75S.js.map → chunk-IVWPPTDM.js.map} +0 -0
  188. /package/dist/{chunk-A7X6OCZE.js.map → chunk-IXFBUXQW.js.map} +0 -0
  189. /package/dist/{chunk-3LMXSKZ7.js.map → chunk-NFXLN6FJ.js.map} +0 -0
  190. /package/dist/{commands-AVEBLFVS.js.map → commands-JSY7CGSU.js.map} +0 -0
  191. /package/dist/{config-GTJWCNPF.js.map → config-DQEFVW3Y.js.map} +0 -0
  192. /package/dist/{context-WF3TTXQU.js.map → context-HVQCTO5R.js.map} +0 -0
  193. /package/dist/{costTracker-2G3ZI2JF.js.map → costTracker-VSWW7SRT.js.map} +0 -0
  194. /package/dist/{customCommands-QOWK57EX.js.map → customCommands-XCINU5TG.js.map} +0 -0
  195. /package/dist/{env-37BAP7QF.js.map → env-ZOPEXWMF.js.map} +0 -0
  196. /package/dist/{kodeAgentSessionId-KTGFX2BE.js.map → identity-3KZQQVBG.js.map} +0 -0
  197. /package/dist/{kodeAgentSessionLoad-6F7SJXBC.js.map → kodeAgentSessionId-4SH24DVH.js.map} +0 -0
  198. /package/dist/{kodeAgentSessionResume-UEEDRJ3N.js.map → kodeAgentSessionLoad-HB3BYVNG.js.map} +0 -0
  199. /package/dist/{kodeAgentStreamJson-VIXFTYL5.js.map → kodeAgentSessionResume-IGSZZY3G.js.map} +0 -0
  200. /package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js.map → kodeAgentStreamJson-4ZKIWKS3.js.map} +0 -0
  201. /package/dist/{kodeHooks-V36SHCTC.js.map → kodeAgentStructuredStdio-5DCUC6V6.js.map} +0 -0
  202. /package/dist/{llmLazy-IXVVBRTN.js.map → kodeHooks-H6DMC3XX.js.map} +0 -0
  203. /package/dist/{loader-OEJ6C3TN.js.map → llmLazy-TDLZZDPL.js.map} +0 -0
  204. /package/dist/{mcp-KE3SILMX.js.map → loader-MOVYZ76M.js.map} +0 -0
  205. /package/dist/{messages-WCSGGSEU.js.map → mcp-DUYSIR5L.js.map} +0 -0
  206. /package/dist/{model-4TQIV5J2.js.map → messages-23ICFVMC.js.map} +0 -0
  207. /package/dist/{openai-KTZV6F7N.js.map → model-FUBCTRTV.js.map} +0 -0
  208. /package/dist/{outputStyles-WX5RYQOA.js.map → openai-SMYIAIO4.js.map} +0 -0
  209. /package/dist/{pluginValidation-JNQZYLUP.js.map → outputStyles-HBOYJFBE.js.map} +0 -0
  210. /package/dist/{prompts-LE6GK75N.js.map → pluginValidation-7CGOMT6F.js.map} +0 -0
  211. /package/dist/{query-GGIP6PWG.js.map → prompts-MFESKNYZ.js.map} +0 -0
  212. /package/dist/{responsesStreaming-2AIT6GHG.js.map → query-BFEFOX4S.js.map} +0 -0
  213. /package/dist/{ripgrep-KDPQAMB2.js.map → responsesStreaming-JORGEFQC.js.map} +0 -0
  214. /package/dist/{skillMarketplace-IXAGP3Q2.js.map → ripgrep-KNJBCJIQ.js.map} +0 -0
  215. /package/dist/{state-MSCYLB6Y.js.map → sandbox-P3FR4G4D.js.map} +0 -0
  216. /package/dist/{theme-GAMFOLBW.js.map → skillMarketplace-PCMKVV4O.js.map} +0 -0
  217. /package/dist/{toolPermissionContext-I3IXPVED.js.map → state-XBYIQ7R4.js.map} +0 -0
  218. /package/dist/{toolPermissionSettings-EUZKGZU2.js.map → structuredOutput-KAVFUV2Z.js.map} +0 -0
  219. /package/dist/{tools-3HOUIDM3.js.map → theme-4ZSXUILR.js.map} +0 -0
  220. /package/dist/{uuid-VA3KVASX.js.map → thinking-TTNUZUB3.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/services/plugins/skillMarketplace.ts"],
4
- "sourcesContent": ["import {\r\n copyFileSync,\r\n existsSync,\r\n lstatSync,\r\n mkdirSync,\r\n readFileSync,\r\n readdirSync,\r\n renameSync,\r\n rmSync,\r\n writeFileSync,\r\n} from 'node:fs'\r\nimport { randomUUID } from 'node:crypto'\r\nimport { homedir } from 'node:os'\r\nimport { basename, dirname, join, resolve, sep } from 'node:path'\r\nimport { unzipSync } from 'fflate'\r\nimport { z } from 'zod'\r\nimport { CONFIG_BASE_DIR } from '@constants/product'\r\nimport { getCwd } from '@utils/state'\r\nimport { getKodeBaseDir } from '@utils/config/env'\r\n\r\nconst KNOWN_MARKETPLACES_FILE = 'known_marketplaces.json'\r\nconst MARKETPLACES_CACHE_DIR = 'marketplaces'\r\nconst INSTALLED_SKILL_PLUGINS_FILE = 'installed-skill-plugins.json'\r\n\r\nconst MarketplaceSourceSchema = z.discriminatedUnion('source', [\r\n z.strictObject({\r\n source: z.literal('github'),\r\n repo: z.string().min(3),\r\n ref: z.string().optional(),\r\n path: z.string().optional(),\r\n }),\r\n z.strictObject({\r\n source: z.literal('git'),\r\n url: z.string().min(3),\r\n ref: z.string().optional(),\r\n path: z.string().optional(),\r\n }),\r\n z.strictObject({\r\n source: z.literal('url'),\r\n url: z.string().url(),\r\n headers: z.record(z.string(), z.string()).optional(),\r\n }),\r\n z.strictObject({\r\n source: z.literal('npm'),\r\n package: z.string().min(1),\r\n }),\r\n z.strictObject({\r\n source: z.literal('file'),\r\n path: z.string().min(1),\r\n }),\r\n z.strictObject({\r\n source: z.literal('directory'),\r\n path: z.string().min(1),\r\n }),\r\n])\r\n\r\nexport type MarketplaceSource = z.infer<typeof MarketplaceSourceSchema>\r\n\r\nconst MarketplacePathListSchema = z.preprocess(value => {\r\n if (typeof value === 'string') return [value]\r\n return value\r\n}, z.array(z.string()))\r\n\r\nconst MarketplacePluginSchema = z\r\n .object({\r\n name: z.string().min(1),\r\n description: z.string().optional(),\r\n source: z.string().optional().default('./'),\r\n strict: z.boolean().optional(),\r\n skills: MarketplacePathListSchema.optional(),\r\n commands: MarketplacePathListSchema.optional(),\r\n })\r\n .passthrough()\r\n\r\nexport const MarketplaceManifestSchema = z\r\n .object({\r\n $schema: z.string().optional(),\r\n description: z.string().optional(),\r\n name: z.string().min(1),\r\n owner: z\r\n .object({\r\n name: z.string().optional(),\r\n email: z.string().optional(),\r\n })\r\n .passthrough()\r\n .optional(),\r\n metadata: z.record(z.string(), z.unknown()).optional().default({}),\r\n plugins: z.array(MarketplacePluginSchema).default([]),\r\n })\r\n .passthrough()\r\n\r\nexport type MarketplaceManifest = z.infer<typeof MarketplaceManifestSchema>\r\nexport type PluginEntry = MarketplaceManifest['plugins'][number]\r\n\r\nconst KnownMarketplacesSchema = z.record(\r\n z.string(),\r\n z.strictObject({\r\n source: MarketplaceSourceSchema,\r\n installLocation: z.string().min(1),\r\n lastUpdated: z.string().min(1),\r\n autoUpdate: z.boolean().optional(),\r\n }),\r\n)\r\n\r\nexport type KnownMarketplacesConfig = z.infer<typeof KnownMarketplacesSchema>\r\n\r\nexport type PluginScope = 'user' | 'project' | 'local'\r\n\r\ntype InstalledSkillPlugin = {\r\n plugin: string\r\n marketplace: string\r\n scope: PluginScope\r\n kind?: 'skill-pack' | 'plugin-pack'\r\n isEnabled?: boolean\r\n projectPath?: string\r\n installedAt: string\r\n pluginRoot?: string\r\n skills: string[]\r\n commands: string[]\r\n sourceMarketplacePath: string\r\n}\r\n\r\ntype InstalledSkillPluginsFile = Record<string, InstalledSkillPlugin>\r\n\r\nfunction userKodeDir(): string {\r\n return getKodeBaseDir()\r\n}\r\n\r\nfunction normalizePluginScope(options?: {\r\n scope?: PluginScope\r\n project?: boolean\r\n}): PluginScope {\r\n if (\r\n options?.scope === 'user' ||\r\n options?.scope === 'project' ||\r\n options?.scope === 'local'\r\n ) {\r\n return options.scope\r\n }\r\n if (options?.project === true) return 'project'\r\n return 'user'\r\n}\r\n\r\nfunction scopeBaseDir(scope: PluginScope): string {\r\n if (scope === 'user') return userKodeDir()\r\n return join(getCwd(), CONFIG_BASE_DIR)\r\n}\r\n\r\nfunction scopeSkillsDir(scope: PluginScope): string {\r\n return join(scopeBaseDir(scope), 'skills')\r\n}\r\n\r\nfunction scopeCommandsDir(scope: PluginScope): string {\r\n return join(scopeBaseDir(scope), 'commands')\r\n}\r\n\r\nfunction scopeDisabledSkillsDir(scope: PluginScope): string {\r\n return join(scopeBaseDir(scope), 'skills.disabled')\r\n}\r\n\r\nfunction scopeDisabledCommandsDir(scope: PluginScope): string {\r\n return join(scopeBaseDir(scope), 'commands.disabled')\r\n}\r\n\r\nfunction scopeInstalledPluginsDir(scope: PluginScope): string {\r\n return join(scopeBaseDir(scope), 'plugins', 'installed')\r\n}\r\n\r\nfunction scopeInstalledPluginRoot(\r\n scope: PluginScope,\r\n plugin: string,\r\n marketplace: string,\r\n): string {\r\n return join(scopeInstalledPluginsDir(scope), plugin, marketplace)\r\n}\r\n\r\nfunction pluginsDir(): string {\r\n return join(userKodeDir(), 'plugins')\r\n}\r\n\r\nfunction knownMarketplacesConfigPath(): string {\r\n return join(pluginsDir(), KNOWN_MARKETPLACES_FILE)\r\n}\r\n\r\nfunction marketplaceCacheBaseDir(): string {\r\n return join(pluginsDir(), MARKETPLACES_CACHE_DIR)\r\n}\r\n\r\nfunction installedSkillPluginsPath(): string {\r\n return join(userKodeDir(), INSTALLED_SKILL_PLUGINS_FILE)\r\n}\r\n\r\nfunction ensureDir(path: string): void {\r\n mkdirSync(path, { recursive: true })\r\n}\r\n\r\nfunction readJsonFile<T>(path: string, fallback: T): T {\r\n try {\r\n if (!existsSync(path)) return fallback\r\n const raw = readFileSync(path, 'utf8')\r\n return JSON.parse(raw) as T\r\n } catch {\r\n return fallback\r\n }\r\n}\r\n\r\nfunction writeJsonFile(path: string, value: unknown): void {\r\n ensureDir(dirname(path))\r\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\r\n}\r\n\r\nfunction normalizeMarketplaceSubPath(path: string | undefined): string | null {\r\n if (!path) return null\r\n const trimmed = path\r\n .trim()\r\n .replace(/^\\.?\\//, '')\r\n .replace(/^\\/+/, '')\r\n if (!trimmed) return null\r\n if (trimmed.includes('..')) {\r\n throw new Error(`Marketplace path contains '..': ${path}`)\r\n }\r\n return trimmed.replace(/\\\\/g, '/').replace(/\\/+$/, '')\r\n}\r\n\r\nfunction safeJoinWithin(baseDir: string, relativePath: string): string {\r\n const normalized = relativePath.replace(/\\\\/g, '/')\r\n if (!normalized || normalized.startsWith('/') || normalized.includes('..')) {\r\n throw new Error(`Unsafe path in archive: ${relativePath}`)\r\n }\r\n const joined = resolve(baseDir, normalized.split('/').join(sep))\r\n const resolvedBase = resolve(baseDir)\r\n if (!joined.startsWith(resolvedBase + sep) && joined !== resolvedBase) {\r\n throw new Error(`Path traversal detected: ${relativePath}`)\r\n }\r\n return joined\r\n}\r\n\r\nfunction ensureEmptyDir(path: string): void {\r\n if (existsSync(path)) rmSync(path, { recursive: true, force: true })\r\n ensureDir(path)\r\n}\r\n\r\nfunction safeCopyDirectory(srcDir: string, destDir: string): void {\r\n ensureDir(destDir)\r\n const entries = readdirSync(srcDir, { withFileTypes: true })\r\n for (const entry of entries) {\r\n const srcPath = join(srcDir, entry.name)\r\n const destPath = join(destDir, entry.name)\r\n\r\n if (entry.isDirectory()) {\r\n safeCopyDirectory(srcPath, destPath)\r\n continue\r\n }\r\n\r\n if (entry.isFile()) {\r\n ensureDir(dirname(destPath))\r\n copyFileSync(srcPath, destPath)\r\n continue\r\n }\r\n\r\n }\r\n}\r\n\r\nfunction readMarketplaceFromDirectory(rootDir: string): MarketplaceManifest {\r\n const primaryMarketplaceFile = resolve(\r\n rootDir,\r\n '.newcraw-plugin',\r\n 'marketplace.json',\r\n )\r\n const legacyMarketplaceFile = resolve(\r\n rootDir,\r\n '.claude-plugin',\r\n 'marketplace.json',\r\n )\r\n const marketplaceFile = existsSync(primaryMarketplaceFile)\r\n ? primaryMarketplaceFile\r\n : legacyMarketplaceFile\r\n if (!existsSync(marketplaceFile)) {\r\n throw new Error(\r\n `Marketplace file not found (expected .newcraw-plugin/marketplace.json or .claude-plugin/marketplace.json)`,\r\n )\r\n }\r\n const raw = readFileSync(marketplaceFile, 'utf8')\r\n const parsed = MarketplaceManifestSchema.safeParse(JSON.parse(raw))\r\n if (!parsed.success) {\r\n throw new Error(\r\n `Invalid marketplace.json: ${parsed.error.issues.map(i => i.message).join('; ')}`,\r\n )\r\n }\r\n return parsed.data\r\n}\r\n\r\nexport function parsePluginSpec(spec: string): {\r\n plugin: string\r\n marketplace: string\r\n} {\r\n const trimmed = spec.trim()\r\n const parts = trimmed.split('@')\r\n if (parts.length !== 2) {\r\n throw new Error(\r\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\r\n )\r\n }\r\n const plugin = parts[0]!.trim()\r\n const marketplace = parts[1]!.trim()\r\n if (!plugin || !marketplace) {\r\n throw new Error(\r\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\r\n )\r\n }\r\n return { plugin, marketplace }\r\n}\r\n\r\nfunction resolvePluginForInstall(pluginInput: string): {\r\n plugin: string\r\n marketplace: string\r\n pluginSpec: string\r\n} {\r\n const trimmed = pluginInput.trim()\r\n if (!trimmed) throw new Error('Plugin is required')\r\n\r\n if (trimmed.includes('@')) {\r\n const resolved = parsePluginSpec(trimmed)\r\n return {\r\n ...resolved,\r\n pluginSpec: `${resolved.plugin}@${resolved.marketplace}`,\r\n }\r\n }\r\n\r\n const config = loadKnownMarketplaces()\r\n const matches: { marketplace: string; entry: PluginEntry }[] = []\r\n for (const [marketplace, entry] of Object.entries(config)) {\r\n try {\r\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\r\n const found = manifest.plugins.find(p => p.name === trimmed)\r\n if (found) matches.push({ marketplace, entry: found })\r\n } catch {\r\n }\r\n }\r\n\r\n if (matches.length === 0) {\r\n const availableMarketplaces = Object.keys(config).sort().join(', ')\r\n throw new Error(\r\n `Plugin '${trimmed}' not found in any marketplace. Available marketplaces: ${availableMarketplaces || '(none)'}`,\r\n )\r\n }\r\n\r\n if (matches.length > 1) {\r\n const options = matches\r\n .map(m => `${trimmed}@${m.marketplace}`)\r\n .sort()\r\n .join(', ')\r\n throw new Error(\r\n `Plugin '${trimmed}' is available in multiple marketplaces. Use an explicit spec: ${options}`,\r\n )\r\n }\r\n\r\n return {\r\n plugin: trimmed,\r\n marketplace: matches[0]!.marketplace,\r\n pluginSpec: `${trimmed}@${matches[0]!.marketplace}`,\r\n }\r\n}\r\n\r\nfunction resolveInstalledPluginSpec(\r\n pluginInput: string,\r\n state: InstalledSkillPluginsFile,\r\n): string {\r\n const trimmed = pluginInput.trim()\r\n if (!trimmed) throw new Error('Plugin is required')\r\n\r\n if (trimmed.includes('@')) {\r\n parsePluginSpec(trimmed)\r\n return trimmed\r\n }\r\n\r\n const matches = Object.entries(state).filter(\r\n ([, record]) => record?.plugin === trimmed,\r\n )\r\n if (matches.length === 0) {\r\n throw new Error(`Plugin '${trimmed}' is not installed`)\r\n }\r\n if (matches.length > 1) {\r\n const options = matches\r\n .map(([spec]) => spec)\r\n .sort()\r\n .join(', ')\r\n throw new Error(\r\n `Plugin '${trimmed}' is installed from multiple marketplaces. Use an explicit spec: ${options}`,\r\n )\r\n }\r\n return matches[0]![0]\r\n}\r\n\r\nfunction baseDirForInstallRecord(record: InstalledSkillPlugin): string {\r\n if (record.scope === 'user') return userKodeDir()\r\n const projectPath =\r\n typeof record.projectPath === 'string' ? record.projectPath.trim() : ''\r\n if (!projectPath) {\r\n throw new Error(\r\n `Installed plugin '${record.plugin}@${record.marketplace}' is missing projectPath for scope=${record.scope}`,\r\n )\r\n }\r\n return join(projectPath, CONFIG_BASE_DIR)\r\n}\r\n\r\nfunction githubRepoFromUrl(input: string): string | null {\r\n const ssh = input.match(/^git@github\\.com:([^/]+\\/[^/]+?)(?:\\.git)?$/)\r\n if (ssh?.[1]) return ssh[1]\r\n const https = input.match(\r\n /^https?:\\/\\/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?$/,\r\n )\r\n if (https?.[1]) return https[1]\r\n return null\r\n}\r\n\r\nfunction parseRefAndPath(input: string): {\r\n base: string\r\n ref?: string\r\n path?: string\r\n} {\r\n const [beforeHash, hashPart] = input.split('#', 2)\r\n const [base, refPart] = beforeHash.split('@', 2)\r\n return {\r\n base,\r\n ref: refPart?.trim() || undefined,\r\n path: hashPart?.trim() || undefined,\r\n }\r\n}\r\n\r\nfunction parseMarketplaceSourceInput(sourceInput: string): MarketplaceSource {\r\n const raw = sourceInput.trim()\r\n if (!raw) throw new Error('Marketplace source is required')\r\n\r\n for (const prefix of [\r\n 'github:',\r\n 'git:',\r\n 'url:',\r\n 'npm:',\r\n 'file:',\r\n 'dir:',\r\n ] as const) {\r\n if (raw.startsWith(prefix)) {\r\n const rest = raw.slice(prefix.length).trim()\r\n const parsed = parseRefAndPath(rest)\r\n if (prefix === 'github:') {\r\n return {\r\n source: 'github',\r\n repo: parsed.base.trim(),\r\n ...(parsed.ref ? { ref: parsed.ref } : {}),\r\n ...(parsed.path ? { path: parsed.path } : {}),\r\n }\r\n }\r\n if (prefix === 'git:') {\r\n const repo = githubRepoFromUrl(parsed.base.trim())\r\n if (repo) {\r\n return {\r\n source: 'github',\r\n repo,\r\n ...(parsed.ref ? { ref: parsed.ref } : {}),\r\n ...(parsed.path ? { path: parsed.path } : {}),\r\n }\r\n }\r\n return {\r\n source: 'git',\r\n url: parsed.base.trim(),\r\n ...(parsed.ref ? { ref: parsed.ref } : {}),\r\n ...(parsed.path ? { path: parsed.path } : {}),\r\n }\r\n }\r\n if (prefix === 'url:') {\r\n return { source: 'url', url: rest }\r\n }\r\n if (prefix === 'npm:') {\r\n return { source: 'npm', package: rest }\r\n }\r\n if (prefix === 'file:') {\r\n return { source: 'file', path: rest }\r\n }\r\n if (prefix === 'dir:') {\r\n return { source: 'directory', path: rest }\r\n }\r\n }\r\n }\r\n\r\n const resolved = resolve(raw)\r\n if (existsSync(resolved)) {\r\n const stat = lstatSync(resolved)\r\n if (stat.isDirectory()) return { source: 'directory', path: resolved }\r\n if (stat.isFile()) return { source: 'file', path: resolved }\r\n throw new Error(`Marketplace source must be a directory or file: ${raw}`)\r\n }\r\n\r\n const parsed = parseRefAndPath(raw)\r\n if (/^[^/\\s]+\\/[^/\\s]+$/.test(parsed.base)) {\r\n return {\r\n source: 'github',\r\n repo: parsed.base,\r\n ...(parsed.ref ? { ref: parsed.ref } : {}),\r\n ...(parsed.path ? { path: parsed.path } : {}),\r\n }\r\n }\r\n\r\n const repo = githubRepoFromUrl(parsed.base)\r\n if (repo) {\r\n return {\r\n source: 'github',\r\n repo,\r\n ...(parsed.ref ? { ref: parsed.ref } : {}),\r\n ...(parsed.path ? { path: parsed.path } : {}),\r\n }\r\n }\r\n\r\n if (/^https?:\\/\\//.test(raw)) {\r\n return { source: 'url', url: raw }\r\n }\r\n\r\n throw new Error(\r\n `Unsupported marketplace source: ${sourceInput}. Use a local path, \"owner/repo\", or prefixes like github:, git:, url:, file:, dir:.`,\r\n )\r\n}\r\n\r\nasync function fetchBinary(url: string): Promise<Uint8Array> {\r\n const resp = await fetch(url, { method: 'GET' })\r\n if (!resp.ok) {\r\n throw new Error(\r\n `Failed to download ${url}: ${resp.status} ${resp.statusText}`,\r\n )\r\n }\r\n const buf = await resp.arrayBuffer()\r\n return new Uint8Array(buf)\r\n}\r\n\r\nasync function tryDownloadGithubZip(\r\n repo: string,\r\n ref: string,\r\n): Promise<Uint8Array> {\r\n const [owner, name] = repo.split('/', 2)\r\n if (!owner || !name) throw new Error(`Invalid GitHub repo: ${repo}`)\r\n\r\n const candidates = ref.startsWith('refs/')\r\n ? [ref]\r\n : [`refs/heads/${ref}`, `refs/tags/${ref}`]\r\n\r\n\t let lastError: Error | null = null\r\n\t for (const candidate of candidates) {\r\n\t const url = `https://codeload.github.com/${owner}/${name}/zip/${candidate}`\r\n\t try {\r\n\t return await fetchBinary(url)\r\n\t } catch (err) {\r\n\t lastError = err instanceof Error ? err : Error(String(err))\r\n\t }\r\n }\r\n throw lastError ?? new Error(`Failed to download GitHub repo ${repo}@${ref}`)\r\n}\r\n\r\nasync function cacheMarketplaceToTempDir(\r\n source: MarketplaceSource,\r\n tempDir: string,\r\n): Promise<void> {\r\n ensureEmptyDir(tempDir)\r\n\r\n if (source.source === 'directory') {\r\n const root = resolve(source.path)\r\n if (!existsSync(root) || !lstatSync(root).isDirectory()) {\r\n throw new Error(`Directory not found: ${source.path}`)\r\n }\r\n safeCopyDirectory(root, tempDir)\r\n return\r\n }\r\n\r\n if (source.source === 'file') {\r\n const file = resolve(source.path)\r\n if (!existsSync(file) || !lstatSync(file).isFile()) {\r\n throw new Error(`File not found: ${source.path}`)\r\n }\r\n const out = join(tempDir, '.newcraw-plugin')\r\n ensureDir(out)\r\n copyFileSync(file, join(out, 'marketplace.json'))\r\n return\r\n }\r\n\r\n if (source.source === 'github') {\r\n const pathWithin = normalizeMarketplaceSubPath(source.path)\r\n\r\n const preferredRef = source.ref?.trim() || ''\r\n const refsToTry = preferredRef ? [preferredRef] : ['main', 'master']\r\n\r\n let zip: Uint8Array | null = null\r\n let usedRef = preferredRef || 'main'\r\n let lastError: Error | null = null\r\n for (const ref of refsToTry) {\r\n try {\r\n zip = await tryDownloadGithubZip(source.repo, ref)\r\n usedRef = ref\r\n break\r\n } catch (err) {\r\n lastError = err instanceof Error ? err : Error(String(err))\r\n }\r\n }\r\n if (!zip)\r\n throw (\r\n lastError ?? new Error(`Failed to download GitHub repo ${source.repo}`)\r\n )\r\n\r\n const files = unzipSync(zip)\r\n const names = Object.keys(files).filter(Boolean)\r\n const topDir = names.length > 0 ? names[0]!.split('/')[0]! : ''\r\n const includePrefix = pathWithin\r\n ? `${topDir}/${pathWithin.replace(/\\/+$/, '')}/`\r\n : `${topDir}/`\r\n\r\n let extractedCount = 0\r\n for (const [name, data] of Object.entries(files)) {\r\n if (!name.startsWith(includePrefix)) continue\r\n const rel = name.slice(includePrefix.length)\r\n if (!rel) continue\r\n if (rel.endsWith('/')) {\r\n ensureDir(safeJoinWithin(tempDir, rel))\r\n continue\r\n }\r\n const dest = safeJoinWithin(tempDir, rel)\r\n ensureDir(dirname(dest))\r\n writeFileSync(dest, data)\r\n extractedCount++\r\n }\r\n\r\n if (extractedCount === 0) {\r\n throw new Error(\r\n `No files extracted from ${source.repo}@${usedRef}${pathWithin ? `#${pathWithin}` : ''}`,\r\n )\r\n }\r\n return\r\n }\r\n\r\n if (source.source === 'url') {\r\n const url = source.url\r\n if (url.toLowerCase().endsWith('.json')) {\r\n const data = await fetchBinary(url)\r\n const out = join(tempDir, '.newcraw-plugin')\r\n ensureDir(out)\r\n writeFileSync(join(out, 'marketplace.json'), Buffer.from(data))\r\n return\r\n }\r\n if (url.toLowerCase().endsWith('.zip')) {\r\n const zip = await fetchBinary(url)\r\n const files = unzipSync(zip)\r\n for (const [name, data] of Object.entries(files)) {\r\n if (!name || name.endsWith('/')) continue\r\n const dest = safeJoinWithin(tempDir, name)\r\n ensureDir(dirname(dest))\r\n writeFileSync(dest, data)\r\n }\r\n return\r\n }\r\n throw new Error(\r\n `Unsupported url marketplace source. Provide a .json or .zip URL: ${url}`,\r\n )\r\n }\r\n\r\n if (source.source === 'git') {\r\n const repo = githubRepoFromUrl(source.url)\r\n if (repo) {\r\n await cacheMarketplaceToTempDir(\r\n {\r\n source: 'github',\r\n repo,\r\n ...(source.ref ? { ref: source.ref } : {}),\r\n ...(source.path ? { path: source.path } : {}),\r\n },\r\n tempDir,\r\n )\r\n return\r\n }\r\n throw new Error(\r\n `git sources are not supported without GitHub conversion (url=${source.url})`,\r\n )\r\n }\r\n\r\n if (source.source === 'npm') {\r\n throw new Error(\r\n `npm marketplace sources are not supported yet (package=${source.package}). Install the package and add it as a local dir instead.`,\r\n )\r\n }\r\n}\r\n\r\nfunction loadKnownMarketplaces(): KnownMarketplacesConfig {\r\n const raw = readJsonFile<unknown>(knownMarketplacesConfigPath(), {})\r\n const parsed = KnownMarketplacesSchema.safeParse(raw)\r\n if (!parsed.success) {\r\n throw new Error(\r\n `Marketplace configuration is corrupted: ${parsed.error.issues.map(i => i.message).join('; ')}`,\r\n )\r\n }\r\n return parsed.data\r\n}\r\n\r\nfunction saveKnownMarketplaces(config: KnownMarketplacesConfig): void {\r\n const parsed = KnownMarketplacesSchema.safeParse(config)\r\n if (!parsed.success) {\r\n throw new Error(`Invalid marketplace config: ${parsed.error.message}`)\r\n }\r\n writeJsonFile(knownMarketplacesConfigPath(), parsed.data)\r\n}\r\n\r\nexport function listMarketplaces(): KnownMarketplacesConfig {\r\n return loadKnownMarketplaces()\r\n}\r\n\r\nexport async function addMarketplace(\r\n sourceInput: string,\r\n): Promise<{ name: string }> {\r\n const source = parseMarketplaceSourceInput(sourceInput)\r\n const validatedSource = MarketplaceSourceSchema.safeParse(source)\r\n if (!validatedSource.success) {\r\n throw new Error(\r\n `Invalid marketplace source: ${validatedSource.error.issues.map(i => i.message).join('; ')}`,\r\n )\r\n }\r\n\r\n const config = loadKnownMarketplaces()\r\n const cacheBase = marketplaceCacheBaseDir()\r\n ensureDir(cacheBase)\r\n\r\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\r\n try {\r\n await cacheMarketplaceToTempDir(validatedSource.data, tempDir)\r\n const manifest = readMarketplaceFromDirectory(tempDir)\r\n const marketplaceName = manifest.name\r\n\r\n if (config[marketplaceName]) {\r\n throw new Error(\r\n `Marketplace '${marketplaceName}' is already installed. Remove it first to re-add.`,\r\n )\r\n }\r\n\r\n const installLocation = join(cacheBase, marketplaceName)\r\n if (existsSync(installLocation)) {\r\n throw new Error(\r\n `Marketplace cache directory already exists: ${installLocation}`,\r\n )\r\n }\r\n\r\n renameSync(tempDir, installLocation)\r\n config[marketplaceName] = {\r\n source: validatedSource.data,\r\n installLocation,\r\n lastUpdated: new Date().toISOString(),\r\n }\r\n saveKnownMarketplaces(config)\r\n return { name: marketplaceName }\r\n } catch (error) {\r\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\r\n throw error\r\n }\r\n}\r\n\r\nexport function removeMarketplace(name: string): void {\r\n const trimmed = name.trim()\r\n if (!trimmed) throw new Error('Marketplace name is required')\r\n\r\n const config = loadKnownMarketplaces()\r\n const entry = config[trimmed]\r\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\r\n\r\n delete config[trimmed]\r\n saveKnownMarketplaces(config)\r\n\r\n try {\r\n if (existsSync(entry.installLocation)) {\r\n rmSync(entry.installLocation, { recursive: true, force: true })\r\n }\r\n } catch {\r\n }\r\n}\r\n\r\nexport async function refreshMarketplaceAsync(name: string): Promise<void> {\r\n const trimmed = name.trim()\r\n if (!trimmed) throw new Error('Marketplace name is required')\r\n\r\n const config = loadKnownMarketplaces()\r\n const entry = config[trimmed]\r\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\r\n\r\n const cacheBase = marketplaceCacheBaseDir()\r\n ensureDir(cacheBase)\r\n\r\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\r\n try {\r\n await cacheMarketplaceToTempDir(entry.source, tempDir)\r\n const manifest = readMarketplaceFromDirectory(tempDir)\r\n if (manifest.name !== trimmed) {\r\n throw new Error(\r\n `Marketplace name mismatch on refresh: expected ${trimmed}, got ${manifest.name}`,\r\n )\r\n }\r\n\r\n if (existsSync(entry.installLocation)) {\r\n rmSync(entry.installLocation, { recursive: true, force: true })\r\n }\r\n renameSync(tempDir, entry.installLocation)\r\n config[trimmed] = {\r\n ...entry,\r\n lastUpdated: new Date().toISOString(),\r\n }\r\n saveKnownMarketplaces(config)\r\n } catch (error) {\r\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\r\n throw error\r\n }\r\n}\r\n\r\nexport async function refreshAllMarketplacesAsync(\r\n onProgress?: (message: string) => void,\r\n): Promise<{ refreshed: string[]; failed: { name: string; error: string }[] }> {\r\n const config = loadKnownMarketplaces()\r\n const names = Object.keys(config).sort()\r\n\r\n const refreshed: string[] = []\r\n const failed: { name: string; error: string }[] = []\r\n\r\n for (const name of names) {\r\n try {\r\n onProgress?.(`Updating marketplace: ${name}...`)\r\n await refreshMarketplaceAsync(name)\r\n refreshed.push(name)\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n failed.push({ name, error: message })\r\n onProgress?.(`Failed to refresh marketplace ${name}: ${message}`)\r\n }\r\n }\r\n\r\n return { refreshed, failed }\r\n}\r\n\r\nexport function getMarketplaceManifest(marketplaceName: string): {\r\n manifest: MarketplaceManifest\r\n rootDir: string\r\n source: MarketplaceSource\r\n} {\r\n const config = loadKnownMarketplaces()\r\n const entry = config[marketplaceName]\r\n if (!entry) {\r\n const available = Object.keys(config).sort().join(', ')\r\n throw new Error(\r\n `Marketplace '${marketplaceName}' not found. Available marketplaces: ${available || '(none)'}`,\r\n )\r\n }\r\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\r\n return { manifest, rootDir: entry.installLocation, source: entry.source }\r\n}\r\n\r\nfunction ensurePluginInstallState(): InstalledSkillPluginsFile {\r\n ensureDir(userKodeDir())\r\n const state = readJsonFile<Record<string, any>>(\r\n installedSkillPluginsPath(),\r\n {},\r\n )\r\n for (const record of Object.values(state)) {\r\n if (!record || typeof record !== 'object') continue\r\n if (\r\n record.scope !== 'user' &&\r\n record.scope !== 'project' &&\r\n record.scope !== 'local'\r\n ) {\r\n record.scope = 'user'\r\n }\r\n if (record.kind !== 'skill-pack' && record.kind !== 'plugin-pack') {\r\n record.kind =\r\n typeof record.pluginRoot === 'string' ? 'plugin-pack' : 'skill-pack'\r\n }\r\n if (record.isEnabled === undefined) record.isEnabled = true\r\n }\r\n return state as InstalledSkillPluginsFile\r\n}\r\n\r\nfunction savePluginInstallState(state: InstalledSkillPluginsFile): void {\r\n writeJsonFile(installedSkillPluginsPath(), state)\r\n}\r\n\r\nexport function installSkillPlugin(\r\n pluginInput: string,\r\n options?: { scope?: PluginScope; project?: boolean; force?: boolean },\r\n): {\r\n pluginSpec: string\r\n installedSkills: string[]\r\n installedCommands: string[]\r\n} {\r\n const scope = normalizePluginScope(options)\r\n const { plugin, marketplace, pluginSpec } =\r\n resolvePluginForInstall(pluginInput)\r\n const { manifest, rootDir, source } = getMarketplaceManifest(marketplace)\r\n\r\n const entry = manifest.plugins.find(p => p.name === plugin)\r\n if (!entry) {\r\n const available = manifest.plugins\r\n .map(p => p.name)\r\n .sort()\r\n .join(', ')\r\n throw new Error(\r\n `Plugin '${plugin}' not found in marketplace '${marketplace}'. Available plugins: ${available || '(none)'}`,\r\n )\r\n }\r\n\r\n const installState = ensurePluginInstallState()\r\n const existing = installState[pluginSpec]\r\n if (existing && existing.scope !== scope && options?.force !== true) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is already installed with scope=${existing.scope}. Uninstall it first to install with scope=${scope}.`,\r\n )\r\n }\r\n if (existing && options?.force !== true) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is already installed. Re-run with --force to reinstall.`,\r\n )\r\n }\r\n\r\n const entrySourceBase = resolve(rootDir, entry.source ?? './')\r\n const primaryManifestPath = join(\r\n entrySourceBase,\r\n '.newcraw-plugin',\r\n 'plugin.json',\r\n )\r\n const legacyManifestPath = join(\r\n entrySourceBase,\r\n '.claude-plugin',\r\n 'plugin.json',\r\n )\r\n const pluginManifestPath = existsSync(primaryManifestPath)\r\n ? primaryManifestPath\r\n : legacyManifestPath\r\n\r\n if (\r\n existsSync(pluginManifestPath) &&\r\n lstatSync(pluginManifestPath).isFile()\r\n ) {\r\n const pluginRoot = scopeInstalledPluginRoot(scope, plugin, marketplace)\r\n if (existsSync(pluginRoot) && options?.force !== true) {\r\n throw new Error(`Destination already exists: ${pluginRoot}`)\r\n }\r\n ensureEmptyDir(pluginRoot)\r\n safeCopyDirectory(entrySourceBase, pluginRoot)\r\n\r\n installState[pluginSpec] = {\r\n plugin,\r\n marketplace,\r\n scope,\r\n kind: 'plugin-pack',\r\n pluginRoot,\r\n isEnabled: true,\r\n projectPath: scope === 'user' ? undefined : getCwd(),\r\n installedAt: new Date().toISOString(),\r\n skills: [],\r\n commands: [],\r\n sourceMarketplacePath:\r\n source.source === 'file' || source.source === 'directory'\r\n ? source.path\r\n : source.source === 'github'\r\n ? `github:${source.repo}`\r\n : source.source === 'url'\r\n ? source.url\r\n : source.source === 'git'\r\n ? source.url\r\n : `npm:${source.package}`,\r\n }\r\n savePluginInstallState(installState)\r\n\r\n return { pluginSpec, installedSkills: [], installedCommands: [] }\r\n }\r\n\r\n const skillsDestBase = scopeSkillsDir(scope)\r\n const commandsDestBase = join(scopeCommandsDir(scope), plugin, marketplace)\r\n\r\n ensureDir(skillsDestBase)\r\n ensureDir(commandsDestBase)\r\n\r\n const installedSkills: string[] = []\r\n const installedCommands: string[] = []\r\n\r\n const skillPaths = entry.skills ?? []\r\n for (const rel of skillPaths) {\r\n const src = safeJoinWithin(entrySourceBase, rel)\r\n if (!existsSync(src) || !lstatSync(src).isDirectory()) {\r\n throw new Error(`Skill path not found or not a directory: ${src}`)\r\n }\r\n const skillName = basename(src)\r\n const dest = join(skillsDestBase, skillName)\r\n\r\n if (existsSync(dest) && options?.force !== true) {\r\n throw new Error(`Destination already exists: ${dest}`)\r\n }\r\n ensureEmptyDir(dest)\r\n safeCopyDirectory(src, dest)\r\n installedSkills.push(skillName)\r\n }\r\n\r\n const commandPaths = entry.commands ?? []\r\n for (const rel of commandPaths) {\r\n const src = safeJoinWithin(entrySourceBase, rel)\r\n if (!existsSync(src)) {\r\n throw new Error(`Command path not found: ${src}`)\r\n }\r\n const stat = lstatSync(src)\r\n if (stat.isDirectory()) {\r\n const dest = join(commandsDestBase, basename(src))\r\n if (existsSync(dest) && options?.force !== true) {\r\n throw new Error(`Destination already exists: ${dest}`)\r\n }\r\n ensureEmptyDir(dest)\r\n safeCopyDirectory(src, dest)\r\n installedCommands.push(dest)\r\n continue\r\n }\r\n if (stat.isFile()) {\r\n const dest = join(commandsDestBase, basename(src))\r\n ensureDir(dirname(dest))\r\n if (existsSync(dest) && options?.force !== true) {\r\n throw new Error(`Destination already exists: ${dest}`)\r\n }\r\n copyFileSync(src, dest)\r\n installedCommands.push(dest)\r\n continue\r\n }\r\n }\r\n\r\n installState[pluginSpec] = {\r\n plugin,\r\n marketplace,\r\n scope,\r\n kind: 'skill-pack',\r\n isEnabled: true,\r\n projectPath: scope === 'user' ? undefined : getCwd(),\r\n installedAt: new Date().toISOString(),\r\n skills: installedSkills,\r\n commands: installedCommands,\r\n sourceMarketplacePath:\r\n source.source === 'file' || source.source === 'directory'\r\n ? source.path\r\n : source.source === 'github'\r\n ? `github:${source.repo}`\r\n : source.source === 'url'\r\n ? source.url\r\n : source.source === 'git'\r\n ? source.url\r\n : `npm:${source.package}`,\r\n }\r\n savePluginInstallState(installState)\r\n\r\n return { pluginSpec, installedSkills, installedCommands }\r\n}\r\n\r\nexport function uninstallSkillPlugin(\r\n pluginInput: string,\r\n options?: { scope?: PluginScope; project?: boolean },\r\n): { pluginSpec: string; removedSkills: string[]; removedCommands: string[] } {\r\n const requestedScope = normalizePluginScope(options)\r\n const state = ensurePluginInstallState()\r\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\r\n const record = state[pluginSpec]\r\n if (!record) {\r\n throw new Error(`Plugin '${pluginSpec}' is not installed`)\r\n }\r\n\r\n if (record.scope !== requestedScope) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\r\n )\r\n }\r\n if (record.scope !== 'user') {\r\n const projectPath = record.projectPath?.trim() || ''\r\n const cwd = getCwd()\r\n if (!projectPath || projectPath !== cwd) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\r\n )\r\n }\r\n }\r\n\r\n if (record.kind === 'plugin-pack') {\r\n const baseDir = baseDirForInstallRecord(record)\r\n const pluginRoot =\r\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\r\n ? record.pluginRoot\r\n : join(\r\n baseDir,\r\n 'plugins',\r\n 'installed',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n\r\n const removedCommands: string[] = []\r\n if (existsSync(pluginRoot)) {\r\n rmSync(pluginRoot, { recursive: true, force: true })\r\n removedCommands.push(pluginRoot)\r\n }\r\n\r\n delete state[pluginSpec]\r\n savePluginInstallState(state)\r\n\r\n return { pluginSpec, removedSkills: [], removedCommands }\r\n }\r\n\r\n const baseDir = baseDirForInstallRecord(record)\r\n const skillsDestBase = join(baseDir, 'skills')\r\n const commandsDestBase = join(\r\n baseDir,\r\n 'commands',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n const disabledSkillsBase = join(\r\n baseDir,\r\n 'skills.disabled',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n const disabledCommandsBase = join(\r\n baseDir,\r\n 'commands.disabled',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n\r\n const removedSkills: string[] = []\r\n for (const skillName of record.skills) {\r\n const dest = join(skillsDestBase, skillName)\r\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\r\n const disabledDest = join(disabledSkillsBase, skillName)\r\n if (existsSync(disabledDest))\r\n rmSync(disabledDest, { recursive: true, force: true })\r\n removedSkills.push(skillName)\r\n }\r\n\r\n const removedCommands: string[] = []\r\n if (existsSync(commandsDestBase)) {\r\n rmSync(commandsDestBase, { recursive: true, force: true })\r\n removedCommands.push(commandsDestBase)\r\n }\r\n if (existsSync(disabledCommandsBase)) {\r\n rmSync(disabledCommandsBase, { recursive: true, force: true })\r\n removedCommands.push(disabledCommandsBase)\r\n }\r\n\r\n delete state[pluginSpec]\r\n savePluginInstallState(state)\r\n\r\n return { pluginSpec, removedSkills, removedCommands }\r\n}\r\n\r\nexport function disableSkillPlugin(\r\n pluginInput: string,\r\n options?: { scope?: PluginScope; project?: boolean },\r\n): {\r\n pluginSpec: string\r\n disabledSkills: string[]\r\n disabledCommands: string[]\r\n} {\r\n const requestedScope = normalizePluginScope(options)\r\n const state = ensurePluginInstallState()\r\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\r\n const record = state[pluginSpec]\r\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\r\n\r\n if (record.scope !== requestedScope) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\r\n )\r\n }\r\n if (record.scope !== 'user') {\r\n const projectPath = record.projectPath?.trim() || ''\r\n const cwd = getCwd()\r\n if (!projectPath || projectPath !== cwd) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\r\n )\r\n }\r\n }\r\n\r\n if (record.isEnabled === false) {\r\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\r\n }\r\n\r\n if (record.kind === 'plugin-pack') {\r\n record.isEnabled = false\r\n state[pluginSpec] = record\r\n savePluginInstallState(state)\r\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\r\n }\r\n\r\n const baseDir = baseDirForInstallRecord(record)\r\n const skillsDir = join(baseDir, 'skills')\r\n const commandsDir = join(\r\n baseDir,\r\n 'commands',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n const disabledSkillsBase = join(\r\n baseDir,\r\n 'skills.disabled',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n const disabledCommandsDir = join(\r\n baseDir,\r\n 'commands.disabled',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n\r\n const disabledSkills: string[] = []\r\n for (const skillName of record.skills) {\r\n const src = join(skillsDir, skillName)\r\n if (!existsSync(src)) continue\r\n const dest = join(disabledSkillsBase, skillName)\r\n ensureDir(dirname(dest))\r\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\r\n renameSync(src, dest)\r\n disabledSkills.push(skillName)\r\n }\r\n\r\n const disabledCommands: string[] = []\r\n if (existsSync(commandsDir)) {\r\n ensureDir(dirname(disabledCommandsDir))\r\n if (existsSync(disabledCommandsDir)) {\r\n rmSync(disabledCommandsDir, { recursive: true, force: true })\r\n }\r\n renameSync(commandsDir, disabledCommandsDir)\r\n disabledCommands.push(disabledCommandsDir)\r\n }\r\n\r\n record.isEnabled = false\r\n state[pluginSpec] = record\r\n savePluginInstallState(state)\r\n\r\n return { pluginSpec, disabledSkills, disabledCommands }\r\n}\r\n\r\nexport function enableSkillPlugin(\r\n pluginInput: string,\r\n options?: { scope?: PluginScope; project?: boolean },\r\n): { pluginSpec: string; enabledSkills: string[]; enabledCommands: string[] } {\r\n const requestedScope = normalizePluginScope(options)\r\n const state = ensurePluginInstallState()\r\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\r\n const record = state[pluginSpec]\r\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\r\n\r\n if (record.scope !== requestedScope) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\r\n )\r\n }\r\n if (record.scope !== 'user') {\r\n const projectPath = record.projectPath?.trim() || ''\r\n const cwd = getCwd()\r\n if (!projectPath || projectPath !== cwd) {\r\n throw new Error(\r\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\r\n )\r\n }\r\n }\r\n\r\n if (record.isEnabled !== false) {\r\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\r\n }\r\n\r\n if (record.kind === 'plugin-pack') {\r\n record.isEnabled = true\r\n state[pluginSpec] = record\r\n savePluginInstallState(state)\r\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\r\n }\r\n\r\n const baseDir = baseDirForInstallRecord(record)\r\n const skillsDir = join(baseDir, 'skills')\r\n const commandsDir = join(\r\n baseDir,\r\n 'commands',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n const disabledSkillsBase = join(\r\n baseDir,\r\n 'skills.disabled',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n const disabledCommandsDir = join(\r\n baseDir,\r\n 'commands.disabled',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n\r\n const enabledSkills: string[] = []\r\n for (const skillName of record.skills) {\r\n const src = join(disabledSkillsBase, skillName)\r\n if (!existsSync(src)) continue\r\n const dest = join(skillsDir, skillName)\r\n ensureDir(dirname(dest))\r\n if (existsSync(dest)) {\r\n throw new Error(`Destination already exists: ${dest}`)\r\n }\r\n renameSync(src, dest)\r\n enabledSkills.push(skillName)\r\n }\r\n\r\n const enabledCommands: string[] = []\r\n if (existsSync(disabledCommandsDir)) {\r\n ensureDir(dirname(commandsDir))\r\n if (existsSync(commandsDir)) {\r\n throw new Error(`Destination already exists: ${commandsDir}`)\r\n }\r\n renameSync(disabledCommandsDir, commandsDir)\r\n enabledCommands.push(commandsDir)\r\n }\r\n\r\n record.isEnabled = true\r\n state[pluginSpec] = record\r\n savePluginInstallState(state)\r\n\r\n return { pluginSpec, enabledSkills, enabledCommands }\r\n}\r\n\r\nexport function listInstalledSkillPlugins(): InstalledSkillPluginsFile {\r\n return ensurePluginInstallState()\r\n}\r\n\r\nexport function listEnabledInstalledPluginPackRoots(): string[] {\r\n const state = ensurePluginInstallState()\r\n const cwd = getCwd()\r\n const roots: string[] = []\r\n\r\n for (const spec of Object.keys(state).sort()) {\r\n const record = state[spec]\r\n if (!record || record.kind !== 'plugin-pack') continue\r\n if (record.isEnabled === false) continue\r\n\r\n if (record.scope !== 'user') {\r\n const projectPath = record.projectPath?.trim() || ''\r\n if (!projectPath || projectPath !== cwd) continue\r\n }\r\n\r\n const baseDir = baseDirForInstallRecord(record)\r\n const pluginRoot =\r\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\r\n ? record.pluginRoot\r\n : join(\r\n baseDir,\r\n 'plugins',\r\n 'installed',\r\n record.plugin,\r\n record.marketplace,\r\n )\r\n\r\n try {\r\n if (!existsSync(pluginRoot) || !lstatSync(pluginRoot).isDirectory())\r\n continue\r\n roots.push(pluginRoot)\r\n } catch {\r\n continue\r\n }\r\n }\r\n\r\n return roots\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["parsed", "repo", "baseDir", "removedCommands"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/core/config/schema.ts", "../src/core/config/defaults.ts", "../src/core/config/loader.ts", "../src/utils/text/json.ts", "../src/core/config/migrations.ts", "../src/core/config/validator.ts"],
4
- "sourcesContent": ["import type { ThemeNames } from '@utils/theme'\r\n\r\nexport type McpStdioServerConfig = {\r\n type?: 'stdio'\r\n command: string\r\n args: string[]\r\n env?: Record<string, string>\r\n}\r\n\r\nexport type McpSSEServerConfig = {\r\n type: 'sse'\r\n url: string\r\n headers?: Record<string, string>\r\n headersHelper?: string\r\n}\r\n\r\nexport type McpHttpServerConfig = {\r\n type: 'http'\r\n url: string\r\n headers?: Record<string, string>\r\n headersHelper?: string\r\n}\r\n\r\nexport type McpSSEIdeServerConfig = {\r\n type: 'sse-ide'\r\n url: string\r\n ideName: string\r\n ideRunningInWindows?: boolean\r\n headers?: Record<string, string>\r\n headersHelper?: string\r\n}\r\n\r\nexport type McpWsServerConfig = {\r\n type: 'ws'\r\n url: string\r\n}\r\n\r\nexport type McpWsIdeServerConfig = {\r\n type: 'ws-ide'\r\n url: string\r\n ideName: string\r\n authToken?: string\r\n ideRunningInWindows?: boolean\r\n}\r\n\r\nexport type McpServerConfig =\r\n | McpStdioServerConfig\r\n | McpSSEServerConfig\r\n | McpHttpServerConfig\r\n | McpSSEIdeServerConfig\r\n | McpWsServerConfig\r\n | McpWsIdeServerConfig\r\n\r\nexport type ProjectConfig = {\r\n allowedTools: string[]\r\n deniedTools?: string[]\r\n askedTools?: string[]\r\n context: Record<string, string>\r\n contextFiles?: string[]\r\n history: string[]\r\n dontCrawlDirectory?: boolean\r\n enableArchitectTool?: boolean\r\n mcpContextUris: string[]\r\n mcpServers?: Record<string, McpServerConfig>\r\n approvedMcprcServers?: string[]\r\n rejectedMcprcServers?: string[]\r\n lastAPIDuration?: number\r\n lastCost?: number\r\n lastDuration?: number\r\n lastSessionId?: string\r\n exampleFiles?: string[]\r\n exampleFilesGeneratedAt?: number\r\n hasTrustDialogAccepted?: boolean\r\n hasCompletedProjectOnboarding?: boolean\r\n}\r\n\r\nexport type AutoUpdaterStatus =\r\n | 'disabled'\r\n | 'enabled'\r\n | 'no_permissions'\r\n | 'not_configured'\r\n\r\nexport function isAutoUpdaterStatus(value: string): value is AutoUpdaterStatus {\r\n return ['disabled', 'enabled', 'no_permissions', 'not_configured'].includes(\r\n value as AutoUpdaterStatus,\r\n )\r\n}\r\n\r\nexport type NotificationChannel =\r\n | 'iterm2'\r\n | 'terminal_bell'\r\n | 'iterm2_with_bell'\r\n | 'notifications_disabled'\r\n\r\nexport type ProviderType =\r\n | 'anthropic'\r\n | 'openai'\r\n | 'mistral'\r\n | 'deepseek'\r\n | 'kimi'\r\n | 'qwen'\r\n | 'glm'\r\n | 'minimax'\r\n | 'baidu-qianfan'\r\n | 'siliconflow'\r\n | 'bigdream'\r\n | 'opendev'\r\n | 'xai'\r\n | 'groq'\r\n | 'gemini'\r\n | 'ollama'\r\n | 'azure'\r\n | 'custom'\r\n | 'custom-openai'\r\n | (string & {})\r\n\r\nexport type ModelProfile = {\r\n name: string\r\n provider: ProviderType\r\n modelName: string\r\n baseURL?: string\r\n apiKey: string\r\n maxTokens: number\r\n contextLength: number\r\n reasoningEffort?: 'low' | 'medium' | 'high' | 'minimal' | string\r\n isActive: boolean\r\n createdAt: number\r\n lastUsed?: number\r\n isGPT5?: boolean\r\n validationStatus?: 'valid' | 'needs_repair' | 'auto_repaired'\r\n lastValidation?: number\r\n}\r\n\r\nexport type ModelPointerType = 'main' | 'task' | 'compact' | 'quick'\r\n\r\nexport type ModelPointers = {\r\n main: string\r\n task: string\r\n compact: string\r\n quick: string\r\n}\r\n\r\nexport type AccountInfo = {\r\n accountUuid: string\r\n emailAddress: string\r\n organizationUuid?: string\r\n}\r\n\r\nexport type GlobalConfig = {\r\n projects?: Record<string, ProjectConfig>\r\n numStartups: number\r\n autoUpdaterStatus?: AutoUpdaterStatus\r\n userID?: string\r\n theme: ThemeNames\r\n hasCompletedOnboarding?: boolean\r\n lastPlanModeUse?: number\r\n lastOnboardingVersion?: string\r\n lastReleaseNotesSeen?: string\r\n mcpServers?: Record<string, McpServerConfig>\r\n preferredNotifChannel: NotificationChannel\r\n verbose: boolean\r\n customApiKeyResponses?: {\r\n approved?: string[]\r\n rejected?: string[]\r\n }\r\n primaryProvider?: ProviderType\r\n maxTokens?: number\r\n autoCompactThreshold?: number\r\n hasAcknowledgedCostThreshold?: boolean\r\n oauthAccount?: AccountInfo\r\n proxy?: string\r\n stream?: boolean\r\n\r\n modelProfiles?: ModelProfile[]\r\n modelPointers?: ModelPointers\r\n defaultModelName?: string\r\n lastDismissedUpdateVersion?: string\r\n}\r\n\r\nexport const GLOBAL_CONFIG_KEYS = [\r\n 'autoUpdaterStatus',\r\n 'theme',\r\n 'hasCompletedOnboarding',\r\n 'lastOnboardingVersion',\r\n 'lastReleaseNotesSeen',\r\n 'verbose',\r\n 'customApiKeyResponses',\r\n 'primaryProvider',\r\n 'preferredNotifChannel',\r\n 'maxTokens',\r\n 'autoCompactThreshold',\r\n] as const\r\n\r\nexport type GlobalConfigKey = (typeof GLOBAL_CONFIG_KEYS)[number]\r\n\r\nexport function isGlobalConfigKey(key: string): key is GlobalConfigKey {\r\n return GLOBAL_CONFIG_KEYS.includes(key as GlobalConfigKey)\r\n}\r\n\r\nexport const PROJECT_CONFIG_KEYS = [\r\n 'dontCrawlDirectory',\r\n 'enableArchitectTool',\r\n 'hasTrustDialogAccepted',\r\n 'hasCompletedProjectOnboarding',\r\n] as const\r\n\r\nexport type ProjectConfigKey = (typeof PROJECT_CONFIG_KEYS)[number]\r\n\r\nexport function isProjectConfigKey(key: string): key is ProjectConfigKey {\r\n return PROJECT_CONFIG_KEYS.includes(key as ProjectConfigKey)\r\n}\r\n\r\nexport type ProjectMcpServerDefinitions = {\r\n servers: Record<string, McpServerConfig>\r\n sources: Record<string, '.mcp.json' | '.mcprc'>\r\n mcpJsonPath: string\r\n mcprcPath: string\r\n}\r\n", "import { homedir } from 'os'\r\nimport type { GlobalConfig, ProjectConfig, ProviderType } from './schema'\r\nimport type { ThemeNames } from '@utils/theme'\r\n\r\nexport const DEFAULT_PROJECT_CONFIG: ProjectConfig = {\r\n allowedTools: [],\r\n deniedTools: [],\r\n askedTools: [],\r\n context: {},\r\n history: [],\r\n dontCrawlDirectory: false,\r\n enableArchitectTool: false,\r\n mcpContextUris: [],\r\n mcpServers: {},\r\n approvedMcprcServers: [],\r\n rejectedMcprcServers: [],\r\n hasTrustDialogAccepted: false,\r\n}\r\n\r\nexport function defaultConfigForProject(projectPath: string): ProjectConfig {\r\n const config = { ...DEFAULT_PROJECT_CONFIG }\r\n if (projectPath === homedir()) {\r\n config.dontCrawlDirectory = true\r\n }\r\n return config\r\n}\r\n\r\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = {\r\n numStartups: 0,\r\n autoUpdaterStatus: 'not_configured',\r\n theme: 'dark' as ThemeNames,\r\n preferredNotifChannel: 'iterm2',\r\n verbose: false,\r\n primaryProvider: 'anthropic' as ProviderType,\r\n customApiKeyResponses: {\r\n approved: [],\r\n rejected: [],\r\n },\r\n stream: true,\r\n\r\n modelProfiles: [],\r\n modelPointers: {\r\n main: '',\r\n task: '',\r\n compact: '',\r\n quick: '',\r\n },\r\n lastDismissedUpdateVersion: undefined,\r\n}\r\n\r\n", "import { existsSync, readFileSync, writeFileSync } from 'fs'\r\nimport { join, posix, resolve, win32 } from 'path'\r\nimport { cloneDeep, memoize, pick } from 'lodash-es'\r\nimport { homedir } from 'os'\r\nimport { randomBytes } from 'crypto'\r\nimport { getGlobalConfigFilePath } from '@utils/config/env'\r\nimport { getCwd } from '@utils/state'\r\nimport { safeParseJSON } from '@utils/text/json'\r\nimport { ConfigParseError } from '@utils/text/errors'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\nimport {\r\n DEFAULT_GLOBAL_CONFIG,\r\n DEFAULT_PROJECT_CONFIG,\r\n defaultConfigForProject,\r\n} from './defaults'\r\nimport {\r\n GLOBAL_CONFIG_KEYS,\r\n PROJECT_CONFIG_KEYS,\r\n isGlobalConfigKey,\r\n isAutoUpdaterStatus,\r\n isProjectConfigKey,\r\n type GlobalConfig,\r\n type McpServerConfig,\r\n type ProjectConfig,\r\n type ProjectMcpServerDefinitions,\r\n} from './schema'\r\nimport { migrateModelProfilesRemoveId } from './migrations'\r\n\r\nfunction expandHomeDirForPlatform(\r\n input: string,\r\n homeDirPath: string,\r\n platform: NodeJS.Platform,\r\n): string {\r\n const trimmed = input.trim()\r\n if (!trimmed) return trimmed\r\n if (trimmed === '~') return homeDirPath\r\n if (trimmed.startsWith('~/') || trimmed.startsWith('~\\\\')) {\r\n const rest = trimmed.slice(2)\r\n return platform === 'win32'\r\n ? win32.join(homeDirPath, rest)\r\n : posix.join(homeDirPath, rest)\r\n }\r\n return trimmed\r\n}\r\n\r\nexport function normalizeProjectPathForComparison(\r\n projectPath: string,\r\n baseDir: string,\r\n opts?: { platform?: NodeJS.Platform; homeDir?: string },\r\n): string {\r\n const platform = opts?.platform ?? process.platform\r\n const homeDirPath = opts?.homeDir ?? homedir()\r\n const expanded = expandHomeDirForPlatform(projectPath, homeDirPath, platform)\r\n if (!expanded) return ''\r\n\r\n if (platform === 'win32') {\r\n const resolved = win32.isAbsolute(expanded)\r\n ? win32.resolve(expanded)\r\n : win32.resolve(baseDir, expanded)\r\n return resolved.toLowerCase()\r\n }\r\n\r\n const resolved = posix.isAbsolute(expanded)\r\n ? posix.resolve(expanded)\r\n : posix.resolve(baseDir, expanded)\r\n return resolved\r\n}\r\n\r\nfunction findMatchingProjectKey(\r\n projects: Record<string, ProjectConfig> | undefined,\r\n absolutePath: string,\r\n): string | undefined {\r\n if (!projects) return undefined\r\n if (projects[absolutePath]) return absolutePath\r\n\r\n const normalizedTarget = normalizeProjectPathForComparison(\r\n absolutePath,\r\n absolutePath,\r\n )\r\n\r\n for (const key of Object.keys(projects)) {\r\n if (\r\n normalizeProjectPathForComparison(key, absolutePath) === normalizedTarget\r\n ) {\r\n return key\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nexport function checkHasTrustDialogAccepted(): boolean {\r\n let currentPath = getCwd()\r\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\r\n\r\n while (true) {\r\n const projectKey = findMatchingProjectKey(config.projects, currentPath)\r\n const projectConfig = projectKey ? config.projects?.[projectKey] : undefined\r\n if (projectConfig?.hasTrustDialogAccepted) {\r\n return true\r\n }\r\n const parentPath = resolve(currentPath, '..')\r\n if (parentPath === currentPath) {\r\n break\r\n }\r\n currentPath = parentPath\r\n }\r\n\r\n return false\r\n}\r\n\r\nconst TEST_GLOBAL_CONFIG_FOR_TESTING: GlobalConfig = {\r\n ...DEFAULT_GLOBAL_CONFIG,\r\n autoUpdaterStatus: 'disabled',\r\n}\r\nconst TEST_PROJECT_CONFIG_FOR_TESTING: ProjectConfig = {\r\n ...DEFAULT_PROJECT_CONFIG,\r\n}\r\n\r\nexport function saveGlobalConfig(config: GlobalConfig): void {\r\n if (process.env.NODE_ENV === 'test') {\r\n for (const key in config) {\r\n TEST_GLOBAL_CONFIG_FOR_TESTING[key] = config[key]\r\n }\r\n return\r\n }\r\n\r\n saveConfig(\r\n getGlobalConfigFilePath(),\r\n {\r\n ...config,\r\n projects: getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\r\n .projects,\r\n },\r\n DEFAULT_GLOBAL_CONFIG,\r\n )\r\n}\r\n\r\nexport function getGlobalConfig(): GlobalConfig {\r\n if (process.env.NODE_ENV === 'test') {\r\n return TEST_GLOBAL_CONFIG_FOR_TESTING\r\n }\r\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\r\n return migrateModelProfilesRemoveId(config)\r\n}\r\n\r\nexport function normalizeApiKeyForConfig(apiKey: string): string {\r\n return apiKey?.slice(-20) ?? ''\r\n}\r\n\r\nexport function getCustomApiKeyStatus(\r\n truncatedApiKey: string,\r\n): 'approved' | 'rejected' | 'new' {\r\n const config = getGlobalConfig()\r\n if (config.customApiKeyResponses?.approved?.includes(truncatedApiKey)) {\r\n return 'approved'\r\n }\r\n if (config.customApiKeyResponses?.rejected?.includes(truncatedApiKey)) {\r\n return 'rejected'\r\n }\r\n return 'new'\r\n}\r\n\r\nfunction saveConfig<A extends object>(\r\n file: string,\r\n config: A,\r\n defaultConfig: A,\r\n): void {\r\n const filteredConfig = Object.fromEntries(\r\n Object.entries(config).filter(\r\n ([key, value]) =>\r\n JSON.stringify(value) !== JSON.stringify(defaultConfig[key as keyof A]),\r\n ),\r\n )\r\n try {\r\n writeFileSync(file, JSON.stringify(filteredConfig, null, 2), 'utf-8')\r\n } catch (error) {\r\n const err = error as NodeJS.ErrnoException\r\n if (\r\n err?.code === 'EACCES' ||\r\n err?.code === 'EPERM' ||\r\n err?.code === 'EROFS'\r\n ) {\r\n debugLogger.state('CONFIG_SAVE_SKIPPED', {\r\n file,\r\n reason: String(err.code),\r\n })\r\n return\r\n }\r\n throw error\r\n }\r\n}\r\n\r\nlet configReadingAllowed = false\r\n\r\nexport function enableConfigs(): void {\r\n configReadingAllowed = true\r\n getConfig(\r\n getGlobalConfigFilePath(),\r\n DEFAULT_GLOBAL_CONFIG,\r\n true,\r\n )\r\n}\r\n\r\nfunction getConfig<A>(\r\n file: string,\r\n defaultConfig: A,\r\n throwOnInvalid?: boolean,\r\n): A {\r\n void configReadingAllowed\r\n\r\n debugLogger.state('CONFIG_LOAD_START', {\r\n file,\r\n fileExists: String(existsSync(file)),\r\n throwOnInvalid: String(!!throwOnInvalid),\r\n })\r\n\r\n if (!existsSync(file)) {\r\n debugLogger.state('CONFIG_LOAD_DEFAULT', {\r\n file,\r\n reason: 'file_not_exists',\r\n defaultConfigKeys: Object.keys(defaultConfig as object).join(', '),\r\n })\r\n return cloneDeep(defaultConfig)\r\n }\r\n\r\n try {\r\n const fileContent = readFileSync(file, 'utf-8')\r\n debugLogger.state('CONFIG_FILE_READ', {\r\n file,\r\n contentLength: String(fileContent.length),\r\n contentPreview:\r\n fileContent.substring(0, 100) + (fileContent.length > 100 ? '...' : ''),\r\n })\r\n\r\n try {\r\n const parsedConfig = JSON.parse(fileContent)\r\n debugLogger.state('CONFIG_JSON_PARSED', {\r\n file,\r\n parsedKeys: Object.keys(parsedConfig).join(', '),\r\n })\r\n\r\n const finalConfig = {\r\n ...cloneDeep(defaultConfig),\r\n ...parsedConfig,\r\n }\r\n\r\n debugLogger.state('CONFIG_LOAD_SUCCESS', {\r\n file,\r\n finalConfigKeys: Object.keys(finalConfig as object).join(', '),\r\n })\r\n\r\n return finalConfig\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error)\r\n\r\n debugLogger.error('CONFIG_JSON_PARSE_ERROR', {\r\n file,\r\n errorMessage,\r\n errorType: error instanceof Error ? error.constructor.name : typeof error,\r\n contentLength: String(fileContent.length),\r\n })\r\n\r\n throw new ConfigParseError(errorMessage, file, defaultConfig)\r\n }\r\n } catch (error: unknown) {\r\n if (error instanceof ConfigParseError && throwOnInvalid) {\r\n debugLogger.error('CONFIG_PARSE_ERROR_RETHROWN', {\r\n file,\r\n throwOnInvalid: String(throwOnInvalid),\r\n errorMessage: error.message,\r\n })\r\n throw error\r\n }\r\n\r\n debugLogger.warn('CONFIG_FALLBACK_TO_DEFAULT', {\r\n file,\r\n errorType: error instanceof Error ? error.constructor.name : typeof error,\r\n errorMessage: error instanceof Error ? error.message : String(error),\r\n action: 'using_default_config',\r\n })\r\n\r\n return cloneDeep(defaultConfig)\r\n }\r\n}\r\n\r\nexport function getCurrentProjectConfig(): ProjectConfig {\r\n if (process.env.NODE_ENV === 'test') {\r\n return TEST_PROJECT_CONFIG_FOR_TESTING\r\n }\r\n\r\n const absolutePath = resolve(getCwd())\r\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\r\n\r\n if (!config.projects) {\r\n return defaultConfigForProject(absolutePath)\r\n }\r\n\r\n const projectKey = findMatchingProjectKey(config.projects, absolutePath)\r\n const projectConfig =\r\n projectKey && config.projects[projectKey]\r\n ? config.projects[projectKey]\r\n : defaultConfigForProject(absolutePath)\r\n if (typeof projectConfig.allowedTools === 'string') {\r\n projectConfig.allowedTools =\r\n (safeParseJSON(projectConfig.allowedTools) as string[]) ?? []\r\n }\r\n if (typeof (projectConfig as any).deniedTools === 'string') {\r\n ;(projectConfig as any).deniedTools =\r\n (safeParseJSON((projectConfig as any).deniedTools) as string[]) ?? []\r\n }\r\n if (typeof (projectConfig as any).askedTools === 'string') {\r\n ;(projectConfig as any).askedTools =\r\n (safeParseJSON((projectConfig as any).askedTools) as string[]) ?? []\r\n }\r\n return projectConfig\r\n}\r\n\r\nexport function saveCurrentProjectConfig(projectConfig: ProjectConfig): void {\r\n if (process.env.NODE_ENV === 'test') {\r\n for (const key in projectConfig) {\r\n TEST_PROJECT_CONFIG_FOR_TESTING[key] = projectConfig[key]\r\n }\r\n return\r\n }\r\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\r\n const resolvedCwd = resolve(getCwd())\r\n const existingKey = findMatchingProjectKey(config.projects, resolvedCwd)\r\n const storageKey = existingKey ?? resolvedCwd\r\n\r\n saveConfig(\r\n getGlobalConfigFilePath(),\r\n {\r\n ...config,\r\n projects: {\r\n ...config.projects,\r\n [storageKey]: projectConfig,\r\n },\r\n },\r\n DEFAULT_GLOBAL_CONFIG,\r\n )\r\n}\r\n\r\nexport async function isAutoUpdaterDisabled(): Promise<boolean> {\r\n const status = getGlobalConfig().autoUpdaterStatus\r\n return status !== 'enabled'\r\n}\r\n\r\nexport const TEST_MCPRC_CONFIG_FOR_TESTING: Record<string, McpServerConfig> = {}\r\n\r\nexport function clearMcprcConfigForTesting(): void {\r\n if (process.env.NODE_ENV === 'test') {\r\n Object.keys(TEST_MCPRC_CONFIG_FOR_TESTING).forEach(key => {\r\n delete TEST_MCPRC_CONFIG_FOR_TESTING[key]\r\n })\r\n }\r\n}\r\n\r\nexport function addMcprcServerForTesting(\r\n name: string,\r\n server: McpServerConfig,\r\n): void {\r\n if (process.env.NODE_ENV === 'test') {\r\n TEST_MCPRC_CONFIG_FOR_TESTING[name] = server\r\n }\r\n}\r\n\r\nexport function removeMcprcServerForTesting(name: string): void {\r\n if (process.env.NODE_ENV === 'test') {\r\n if (!TEST_MCPRC_CONFIG_FOR_TESTING[name]) {\r\n throw new Error(`No MCP server found with name: ${name} in .mcprc`)\r\n }\r\n delete TEST_MCPRC_CONFIG_FOR_TESTING[name]\r\n }\r\n}\r\n\r\nexport const getMcprcConfig = memoize(\r\n (): Record<string, McpServerConfig> => {\r\n if (process.env.NODE_ENV === 'test') {\r\n return TEST_MCPRC_CONFIG_FOR_TESTING\r\n }\r\n\r\n const mcprcPath = join(getCwd(), '.mcprc')\r\n if (!existsSync(mcprcPath)) {\r\n return {}\r\n }\r\n\r\n try {\r\n const mcprcContent = readFileSync(mcprcPath, 'utf-8')\r\n const config = safeParseJSON(mcprcContent)\r\n if (config && typeof config === 'object') {\r\n return config as Record<string, McpServerConfig>\r\n }\r\n } catch {}\r\n return {}\r\n },\r\n () => {\r\n const cwd = getCwd()\r\n const mcprcPath = join(cwd, '.mcprc')\r\n if (existsSync(mcprcPath)) {\r\n try {\r\n const stat = readFileSync(mcprcPath, 'utf-8')\r\n return `${cwd}:${stat}`\r\n } catch {\r\n return cwd\r\n }\r\n }\r\n return cwd\r\n },\r\n)\r\n\r\nfunction parseMcpServersFromMcpJson(\r\n value: unknown,\r\n): Record<string, McpServerConfig> {\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\r\n const raw = (value as { mcpServers?: unknown }).mcpServers\r\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {}\r\n return raw as Record<string, McpServerConfig>\r\n}\r\n\r\nfunction parseMcpServersFromMcprc(\r\n value: unknown,\r\n): Record<string, McpServerConfig> {\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\r\n const maybeNested = (value as { mcpServers?: unknown }).mcpServers\r\n if (\r\n maybeNested &&\r\n typeof maybeNested === 'object' &&\r\n !Array.isArray(maybeNested)\r\n ) {\r\n return maybeNested as Record<string, McpServerConfig>\r\n }\r\n return value as Record<string, McpServerConfig>\r\n}\r\n\r\nexport const getProjectMcpServerDefinitions = memoize(\r\n (): ProjectMcpServerDefinitions => {\r\n if (process.env.NODE_ENV === 'test') {\r\n return {\r\n servers: {},\r\n sources: {},\r\n mcpJsonPath: join(getCwd(), '.mcp.json'),\r\n mcprcPath: join(getCwd(), '.mcprc'),\r\n }\r\n }\r\n\r\n const cwd = getCwd()\r\n const mcpJsonPath = join(cwd, '.mcp.json')\r\n const mcprcPath = join(cwd, '.mcprc')\r\n\r\n let mcpJsonServers: Record<string, McpServerConfig> = {}\r\n let mcprcServers: Record<string, McpServerConfig> = {}\r\n\r\n if (existsSync(mcpJsonPath)) {\r\n try {\r\n const content = readFileSync(mcpJsonPath, 'utf-8')\r\n const parsed = safeParseJSON(content)\r\n mcpJsonServers = parseMcpServersFromMcpJson(parsed)\r\n } catch {}\r\n }\r\n\r\n if (existsSync(mcprcPath)) {\r\n try {\r\n const content = readFileSync(mcprcPath, 'utf-8')\r\n const parsed = safeParseJSON(content)\r\n mcprcServers = parseMcpServersFromMcprc(parsed)\r\n } catch {}\r\n }\r\n\r\n const sources: Record<string, '.mcp.json' | '.mcprc'> = {}\r\n for (const name of Object.keys(mcpJsonServers)) {\r\n sources[name] = '.mcp.json'\r\n }\r\n for (const name of Object.keys(mcprcServers)) {\r\n sources[name] = '.mcprc'\r\n }\r\n\r\n return {\r\n servers: { ...mcpJsonServers, ...mcprcServers },\r\n sources,\r\n mcpJsonPath,\r\n mcprcPath,\r\n }\r\n },\r\n () => {\r\n const cwd = getCwd()\r\n const mcpJsonPath = join(cwd, '.mcp.json')\r\n const mcprcPath = join(cwd, '.mcprc')\r\n\r\n const parts: string[] = [cwd]\r\n\r\n if (existsSync(mcpJsonPath)) {\r\n try {\r\n parts.push('mcp.json')\r\n parts.push(readFileSync(mcpJsonPath, 'utf-8'))\r\n } catch {}\r\n }\r\n\r\n if (existsSync(mcprcPath)) {\r\n try {\r\n parts.push('mcprc')\r\n parts.push(readFileSync(mcprcPath, 'utf-8'))\r\n } catch {}\r\n }\r\n\r\n return parts.join(':')\r\n },\r\n)\r\n\r\nexport function getOrCreateUserID(): string {\r\n const config = getGlobalConfig()\r\n if (config.userID) {\r\n return config.userID\r\n }\r\n\r\n const userID = randomBytes(32).toString('hex')\r\n saveGlobalConfig({ ...config, userID })\r\n return userID\r\n}\r\n\r\nexport function getConfigForCLI(key: string, global: boolean): unknown {\r\n if (global) {\r\n if (!isGlobalConfigKey(key)) {\r\n console.error(\r\n `Error: '${key}' is not a valid config key. Valid keys are: ${GLOBAL_CONFIG_KEYS.join(', ')}`,\r\n )\r\n process.exit(1)\r\n }\r\n return getGlobalConfig()[key]\r\n } else {\r\n if (!isProjectConfigKey(key)) {\r\n console.error(\r\n `Error: '${key}' is not a valid config key. Valid keys are: ${PROJECT_CONFIG_KEYS.join(', ')}`,\r\n )\r\n process.exit(1)\r\n }\r\n return getCurrentProjectConfig()[key]\r\n }\r\n}\r\n\r\nexport function setConfigForCLI(\r\n key: string,\r\n value: unknown,\r\n global: boolean,\r\n): void {\r\n if (global) {\r\n if (!isGlobalConfigKey(key)) {\r\n console.error(\r\n `Error: Cannot set '${key}'. Only these keys can be modified: ${GLOBAL_CONFIG_KEYS.join(', ')}`,\r\n )\r\n process.exit(1)\r\n }\r\n\r\n if (key === 'autoUpdaterStatus' && !isAutoUpdaterStatus(value as string)) {\r\n console.error(\r\n `Error: Invalid value for autoUpdaterStatus. Must be one of: disabled, enabled, no_permissions, not_configured`,\r\n )\r\n process.exit(1)\r\n }\r\n\r\n const currentConfig = getGlobalConfig()\r\n saveGlobalConfig({\r\n ...currentConfig,\r\n [key]: value,\r\n })\r\n } else {\r\n if (!isProjectConfigKey(key)) {\r\n console.error(\r\n `Error: Cannot set '${key}'. Only these keys can be modified: ${PROJECT_CONFIG_KEYS.join(', ')}. Did you mean --global?`,\r\n )\r\n process.exit(1)\r\n }\r\n const currentConfig = getCurrentProjectConfig()\r\n saveCurrentProjectConfig({\r\n ...currentConfig,\r\n [key]: value,\r\n })\r\n }\r\n setTimeout(() => {\r\n process.exit(0)\r\n }, 100)\r\n}\r\n\r\nexport function deleteConfigForCLI(key: string, global: boolean): void {\r\n if (global) {\r\n if (!isGlobalConfigKey(key)) {\r\n console.error(\r\n `Error: Cannot delete '${key}'. Only these keys can be modified: ${GLOBAL_CONFIG_KEYS.join(', ')}`,\r\n )\r\n process.exit(1)\r\n }\r\n const currentConfig = getGlobalConfig()\r\n delete currentConfig[key]\r\n saveGlobalConfig(currentConfig)\r\n } else {\r\n if (!isProjectConfigKey(key)) {\r\n console.error(\r\n `Error: Cannot delete '${key}'. Only these keys can be modified: ${PROJECT_CONFIG_KEYS.join(', ')}. Did you mean --global?`,\r\n )\r\n process.exit(1)\r\n }\r\n const currentConfig = getCurrentProjectConfig()\r\n delete currentConfig[key]\r\n saveCurrentProjectConfig(currentConfig)\r\n }\r\n}\r\n\r\nexport function listConfigForCLI(global: true): GlobalConfig\r\nexport function listConfigForCLI(global: false): ProjectConfig\r\nexport function listConfigForCLI(global: boolean): object {\r\n if (global) {\r\n const currentConfig = pick(getGlobalConfig(), GLOBAL_CONFIG_KEYS)\r\n return currentConfig\r\n } else {\r\n return pick(getCurrentProjectConfig(), PROJECT_CONFIG_KEYS)\r\n }\r\n}\r\n\r\nexport function getOpenAIApiKey(): string | undefined {\r\n return process.env.OPENAI_API_KEY\r\n}\r\n\r\nexport function getAnthropicApiKey(): string {\r\n return process.env.ANTHROPIC_API_KEY || ''\r\n}\r\n", "import { logError } from '@utils/log'\r\n\r\nexport function safeParseJSON(json: string | null | undefined): unknown {\r\n if (!json) {\r\n return null\r\n }\r\n try {\r\n return JSON.parse(json)\r\n } catch (e) {\r\n logError(e)\r\n return null\r\n }\r\n}\r\n", "import type { GlobalConfig, ModelPointers, ModelProfile } from './schema'\r\n\r\nexport function migrateModelProfilesRemoveId(config: GlobalConfig): GlobalConfig {\r\n if (!config.modelProfiles) return config\r\n\r\n const idToModelNameMap = new Map<string, string>()\r\n const migratedProfiles = config.modelProfiles.map(profile => {\r\n if ((profile as any).id && profile.modelName) {\r\n idToModelNameMap.set((profile as any).id, profile.modelName)\r\n }\r\n\r\n const { id, ...profileWithoutId } = profile as any\r\n return profileWithoutId as ModelProfile\r\n })\r\n\r\n const migratedPointers: ModelPointers = {\r\n main: '',\r\n task: '',\r\n compact: '',\r\n quick: '',\r\n }\r\n\r\n const rawPointers = config.modelPointers as\r\n | Record<string, unknown>\r\n | undefined\r\n const rawMain = typeof rawPointers?.main === 'string' ? rawPointers.main : ''\r\n const rawTask = typeof rawPointers?.task === 'string' ? rawPointers.task : ''\r\n const rawQuick =\r\n typeof rawPointers?.quick === 'string' ? rawPointers.quick : ''\r\n const rawCompact =\r\n typeof rawPointers?.compact === 'string'\r\n ? rawPointers.compact\r\n : typeof rawPointers?.reasoning === 'string'\r\n ? rawPointers.reasoning\r\n : ''\r\n\r\n if (rawMain) migratedPointers.main = idToModelNameMap.get(rawMain) || rawMain\r\n if (rawTask) migratedPointers.task = idToModelNameMap.get(rawTask) || rawTask\r\n if (rawCompact)\r\n migratedPointers.compact = idToModelNameMap.get(rawCompact) || rawCompact\r\n if (rawQuick)\r\n migratedPointers.quick = idToModelNameMap.get(rawQuick) || rawQuick\r\n\r\n let defaultModelName: string | undefined\r\n if ((config as any).defaultModelId) {\r\n defaultModelName =\r\n idToModelNameMap.get((config as any).defaultModelId) ||\r\n (config as any).defaultModelId\r\n } else if ((config as any).defaultModelName) {\r\n defaultModelName = (config as any).defaultModelName\r\n }\r\n\r\n const migratedConfig = { ...config }\r\n delete (migratedConfig as any).defaultModelId\r\n delete (migratedConfig as any).currentSelectedModelId\r\n delete (migratedConfig as any).mainAgentModelId\r\n delete (migratedConfig as any).taskToolModelId\r\n\r\n return {\r\n ...migratedConfig,\r\n modelProfiles: migratedProfiles,\r\n modelPointers: migratedPointers,\r\n defaultModelName,\r\n }\r\n}\r\n\r\n", "import type { ModelPointerType, ModelProfile, ProviderType } from './schema'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\nimport { getGlobalConfig, saveGlobalConfig } from './loader'\r\n\r\nexport function setAllPointersToModel(modelName: string): void {\r\n const config = getGlobalConfig()\r\n const updatedConfig = {\r\n ...config,\r\n modelPointers: {\r\n main: modelName,\r\n task: modelName,\r\n compact: modelName,\r\n quick: modelName,\r\n },\r\n defaultModelName: modelName,\r\n }\r\n saveGlobalConfig(updatedConfig)\r\n}\r\n\r\nexport function setModelPointer(\r\n pointer: ModelPointerType,\r\n modelName: string,\r\n): void {\r\n const config = getGlobalConfig()\r\n const updatedConfig = {\r\n ...config,\r\n modelPointers: {\r\n ...config.modelPointers,\r\n [pointer]: modelName,\r\n },\r\n }\r\n saveGlobalConfig(updatedConfig)\r\n\r\n import('../../utils/model').then(({ reloadModelManager }) => {\r\n reloadModelManager()\r\n })\r\n}\r\n\r\nexport function isGPT5ModelName(modelName: string): boolean {\r\n if (!modelName || typeof modelName !== 'string') return false\r\n const lowerName = modelName.toLowerCase()\r\n return lowerName.startsWith('gpt-5') || lowerName.includes('gpt-5')\r\n}\r\n\r\nexport function validateAndRepairGPT5Profile(\r\n profile: ModelProfile,\r\n): ModelProfile {\r\n const isGPT5 = isGPT5ModelName(profile.modelName)\r\n const now = Date.now()\r\n\r\n const repairedProfile: ModelProfile = { ...profile }\r\n let wasRepaired = false\r\n\r\n if (isGPT5 !== profile.isGPT5) {\r\n repairedProfile.isGPT5 = isGPT5\r\n wasRepaired = true\r\n }\r\n\r\n if (isGPT5) {\r\n\r\n const validReasoningEfforts = ['minimal', 'low', 'medium', 'high']\r\n if (\r\n !profile.reasoningEffort ||\r\n !validReasoningEfforts.includes(profile.reasoningEffort)\r\n ) {\r\n repairedProfile.reasoningEffort = 'medium'\r\n wasRepaired = true\r\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\r\n model: profile.modelName,\r\n field: 'reasoningEffort',\r\n value: 'medium',\r\n })\r\n }\r\n\r\n if (profile.contextLength < 128000) {\r\n repairedProfile.contextLength = 128000\r\n wasRepaired = true\r\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\r\n model: profile.modelName,\r\n field: 'contextLength',\r\n value: 128000,\r\n })\r\n }\r\n\r\n if (profile.maxTokens < 4000) {\r\n repairedProfile.maxTokens = 8192\r\n wasRepaired = true\r\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\r\n model: profile.modelName,\r\n field: 'maxTokens',\r\n value: 8192,\r\n })\r\n }\r\n\r\n if (\r\n profile.provider !== 'openai' &&\r\n profile.provider !== 'custom-openai' &&\r\n profile.provider !== 'azure'\r\n ) {\r\n debugLogger.warn('GPT5_CONFIG_UNEXPECTED_PROVIDER', {\r\n model: profile.modelName,\r\n provider: profile.provider,\r\n expectedProviders: ['openai', 'custom-openai', 'azure'],\r\n })\r\n }\r\n\r\n if (profile.modelName.includes('gpt-5') && !profile.baseURL) {\r\n repairedProfile.baseURL = 'https://api.openai.com/v1'\r\n wasRepaired = true\r\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\r\n model: profile.modelName,\r\n field: 'baseURL',\r\n value: 'https://api.openai.com/v1',\r\n })\r\n }\r\n }\r\n\r\n repairedProfile.validationStatus = wasRepaired ? 'auto_repaired' : 'valid'\r\n repairedProfile.lastValidation = now\r\n\r\n if (wasRepaired) {\r\n debugLogger.info('GPT5_CONFIG_AUTO_REPAIRED', { model: profile.modelName })\r\n }\r\n\r\n return repairedProfile\r\n}\r\n\r\nexport function validateAndRepairAllGPT5Profiles(): {\r\n repaired: number\r\n total: number\r\n} {\r\n const config = getGlobalConfig()\r\n if (!config.modelProfiles) {\r\n return { repaired: 0, total: 0 }\r\n }\r\n\r\n let repairCount = 0\r\n const repairedProfiles = config.modelProfiles.map(profile => {\r\n const repairedProfile = validateAndRepairGPT5Profile(profile)\r\n if (repairedProfile.validationStatus === 'auto_repaired') {\r\n repairCount++\r\n }\r\n return repairedProfile\r\n })\r\n\r\n if (repairCount > 0) {\r\n const updatedConfig = {\r\n ...config,\r\n modelProfiles: repairedProfiles,\r\n }\r\n saveGlobalConfig(updatedConfig)\r\n debugLogger.info('GPT5_CONFIG_AUTO_REPAIR_SUMMARY', {\r\n repaired: repairCount,\r\n total: config.modelProfiles.length,\r\n })\r\n }\r\n\r\n return { repaired: repairCount, total: config.modelProfiles.length }\r\n}\r\n\r\nexport function getGPT5ConfigRecommendations(\r\n modelName: string,\r\n): Partial<ModelProfile> {\r\n if (!isGPT5ModelName(modelName)) {\r\n return {}\r\n }\r\n\r\n const recommendations: Partial<ModelProfile> = {\r\n contextLength: 128000,\r\n maxTokens: 8192,\r\n reasoningEffort: 'medium',\r\n isGPT5: true,\r\n }\r\n\r\n if (modelName.includes('gpt-5-mini')) {\r\n recommendations.maxTokens = 4096\r\n recommendations.reasoningEffort = 'low'\r\n } else if (modelName.includes('gpt-5-nano')) {\r\n recommendations.maxTokens = 2048\r\n recommendations.reasoningEffort = 'minimal'\r\n }\r\n\r\n return recommendations\r\n}\r\n\r\nexport function createGPT5ModelProfile(\r\n name: string,\r\n modelName: string,\r\n apiKey: string,\r\n baseURL?: string,\r\n provider: ProviderType = 'openai',\r\n): ModelProfile {\r\n const recommendations = getGPT5ConfigRecommendations(modelName)\r\n\r\n const profile: ModelProfile = {\r\n name,\r\n provider,\r\n modelName,\r\n baseURL: baseURL || 'https://api.openai.com/v1',\r\n apiKey,\r\n maxTokens: recommendations.maxTokens || 8192,\r\n contextLength: recommendations.contextLength || 128000,\r\n reasoningEffort: recommendations.reasoningEffort || 'medium',\r\n isActive: true,\r\n createdAt: Date.now(),\r\n isGPT5: true,\r\n validationStatus: 'valid',\r\n lastValidation: Date.now(),\r\n }\r\n\r\n return profile\r\n}\r\n\r\n"],
5
- "mappings": "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",
6
- "names": ["homedir", "homedir", "resolved"]
7
- }