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
@@ -0,0 +1,45 @@
1
+ import { createRequire as __newcrawCreateRequire } from "node:module";
2
+ const require = __newcrawCreateRequire(import.meta.url);
3
+
4
+ // src/utils/terminal/format.ts
5
+ function wrapText(text, width) {
6
+ const lines = [];
7
+ let currentLine = "";
8
+ for (const char of text) {
9
+ if ([...currentLine].length < width) {
10
+ currentLine += char;
11
+ } else {
12
+ lines.push(currentLine);
13
+ currentLine = char;
14
+ }
15
+ }
16
+ if (currentLine) lines.push(currentLine);
17
+ return lines;
18
+ }
19
+ function formatDuration(ms) {
20
+ if (ms < 6e4) {
21
+ return `${(ms / 1e3).toFixed(1)}s`;
22
+ }
23
+ const hours = Math.floor(ms / 36e5);
24
+ const minutes = Math.floor(ms % 36e5 / 6e4);
25
+ const seconds = (ms % 6e4 / 1e3).toFixed(1);
26
+ if (hours > 0) {
27
+ return `${hours}h ${minutes}m ${seconds}s`;
28
+ }
29
+ if (minutes > 0) {
30
+ return `${minutes}m ${seconds}s`;
31
+ }
32
+ return `${seconds}s`;
33
+ }
34
+ function formatNumber(number) {
35
+ return new Intl.NumberFormat("en", {
36
+ notation: "compact",
37
+ maximumFractionDigits: 1
38
+ }).format(number).toLowerCase();
39
+ }
40
+
41
+ export {
42
+ wrapText,
43
+ formatDuration,
44
+ formatNumber
45
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/terminal/format.ts"],
4
+ "sourcesContent": ["export function wrapText(text: string, width: number): string[] {\r\n const lines: string[] = []\r\n let currentLine = ''\r\n\r\n for (const char of text) {\r\n if ([...currentLine].length < width) {\r\n currentLine += char\r\n } else {\r\n lines.push(currentLine)\r\n currentLine = char\r\n }\r\n }\r\n\r\n if (currentLine) lines.push(currentLine)\r\n return lines\r\n}\r\n\r\nexport function formatDuration(ms: number): string {\r\n if (ms < 60000) {\r\n return `${(ms / 1000).toFixed(1)}s`\r\n }\r\n\r\n const hours = Math.floor(ms / 3600000)\r\n const minutes = Math.floor((ms % 3600000) / 60000)\r\n const seconds = ((ms % 60000) / 1000).toFixed(1)\r\n\r\n if (hours > 0) {\r\n return `${hours}h ${minutes}m ${seconds}s`\r\n }\r\n if (minutes > 0) {\r\n return `${minutes}m ${seconds}s`\r\n }\r\n return `${seconds}s`\r\n}\r\n\r\nexport function formatNumber(number: number): string {\r\n return new Intl.NumberFormat('en', {\r\n notation: 'compact',\r\n maximumFractionDigits: 1,\r\n })\r\n .format(number)\r\n .toLowerCase()\r\n}\r\n"],
5
+ "mappings": ";;;;AAAO,SAAS,SAAS,MAAc,OAAyB;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,aAAW,QAAQ,MAAM;AACvB,QAAI,CAAC,GAAG,WAAW,EAAE,SAAS,OAAO;AACnC,qBAAe;AAAA,IACjB,OAAO;AACL,YAAM,KAAK,WAAW;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAa,OAAM,KAAK,WAAW;AACvC,SAAO;AACT;AAEO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,KAAO;AACd,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AAEA,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAO;AACrC,QAAM,UAAU,KAAK,MAAO,KAAK,OAAW,GAAK;AACjD,QAAM,WAAY,KAAK,MAAS,KAAM,QAAQ,CAAC;AAE/C,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,OAAO;AAAA,EAC/B;AACA,SAAO,GAAG,OAAO;AACnB;AAEO,SAAS,aAAa,QAAwB;AACnD,SAAO,IAAI,KAAK,aAAa,MAAM;AAAA,IACjC,UAAU;AAAA,IACV,uBAAuB;AAAA,EACzB,CAAC,EACE,OAAO,MAAM,EACb,YAAY;AACjB;",
6
+ "names": []
7
+ }
@@ -3,7 +3,7 @@ const require = __newcrawCreateRequire(import.meta.url);
3
3
  import {
4
4
  getSessionProjectDir,
5
5
  getSessionProjectsDir
6
- } from "./chunk-XXU2NVOE.js";
6
+ } from "./chunk-KJTPUTU7.js";
7
7
  import {
8
8
  isUuid
9
9
  } from "./chunk-JX5ZQYTQ.js";
@@ -455,7 +455,7 @@ function getLastAssistantMessageId(messages) {
455
455
 
456
456
  // src/utils/messages/index.ts
457
457
  async function processUserInput(input, mode, setToolJSX, context, pastedImages) {
458
- const impl = await import("./userInput-LJL4CVOB.js");
458
+ const impl = await import("./userInput-SZEUY5J6.js");
459
459
  return impl.processUserInput(input, mode, setToolJSX, context, pastedImages);
460
460
  }
461
461
 
@@ -1,12 +1,20 @@
1
1
  import { createRequire as __newcrawCreateRequire } from "node:module";
2
2
  const require = __newcrawCreateRequire(import.meta.url);
3
3
  import {
4
- CONFIG_BASE_DIR,
5
4
  getCwd,
6
- getKodeBaseDir
7
- } from "./chunk-IM33F5CM.js";
5
+ getNewcrawBaseDir,
6
+ init_env,
7
+ init_state
8
+ } from "./chunk-XYQZLDRB.js";
9
+ import {
10
+ CONFIG_BASE_DIR,
11
+ init_product
12
+ } from "./chunk-UYWZQVH5.js";
8
13
 
9
14
  // src/services/plugins/skillMarketplace.ts
15
+ init_product();
16
+ init_state();
17
+ init_env();
10
18
  import {
11
19
  copyFileSync,
12
20
  existsSync,
@@ -88,8 +96,8 @@ var KnownMarketplacesSchema = z.record(
88
96
  autoUpdate: z.boolean().optional()
89
97
  })
90
98
  );
91
- function userKodeDir() {
92
- return getKodeBaseDir();
99
+ function userNewcrawDir() {
100
+ return getNewcrawBaseDir();
93
101
  }
94
102
  function normalizePluginScope(options) {
95
103
  if (options?.scope === "user" || options?.scope === "project" || options?.scope === "local") {
@@ -99,7 +107,7 @@ function normalizePluginScope(options) {
99
107
  return "user";
100
108
  }
101
109
  function scopeBaseDir(scope) {
102
- if (scope === "user") return userKodeDir();
110
+ if (scope === "user") return userNewcrawDir();
103
111
  return join(getCwd(), CONFIG_BASE_DIR);
104
112
  }
105
113
  function scopeSkillsDir(scope) {
@@ -115,7 +123,7 @@ function scopeInstalledPluginRoot(scope, plugin, marketplace) {
115
123
  return join(scopeInstalledPluginsDir(scope), plugin, marketplace);
116
124
  }
117
125
  function pluginsDir() {
118
- return join(userKodeDir(), "plugins");
126
+ return join(userNewcrawDir(), "plugins");
119
127
  }
120
128
  function knownMarketplacesConfigPath() {
121
129
  return join(pluginsDir(), KNOWN_MARKETPLACES_FILE);
@@ -124,7 +132,7 @@ function marketplaceCacheBaseDir() {
124
132
  return join(pluginsDir(), MARKETPLACES_CACHE_DIR);
125
133
  }
126
134
  function installedSkillPluginsPath() {
127
- return join(userKodeDir(), INSTALLED_SKILL_PLUGINS_FILE);
135
+ return join(userNewcrawDir(), INSTALLED_SKILL_PLUGINS_FILE);
128
136
  }
129
137
  function ensureDir(path) {
130
138
  mkdirSync(path, { recursive: true });
@@ -288,7 +296,7 @@ function resolveInstalledPluginSpec(pluginInput, state) {
288
296
  return matches[0][0];
289
297
  }
290
298
  function baseDirForInstallRecord(record) {
291
- if (record.scope === "user") return userKodeDir();
299
+ if (record.scope === "user") return userNewcrawDir();
292
300
  const projectPath = typeof record.projectPath === "string" ? record.projectPath.trim() : "";
293
301
  if (!projectPath) {
294
302
  throw new Error(
@@ -673,7 +681,7 @@ function getMarketplaceManifest(marketplaceName) {
673
681
  return { manifest, rootDir: entry.installLocation, source: entry.source };
674
682
  }
675
683
  function ensurePluginInstallState() {
676
- ensureDir(userKodeDir());
684
+ ensureDir(userNewcrawDir());
677
685
  const state = readJsonFile(
678
686
  installedSkillPluginsPath(),
679
687
  {}
@@ -0,0 +1,7 @@
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 { getNewcrawBaseDir } 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 userNewcrawDir(): string {\r\n return getNewcrawBaseDir()\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 userNewcrawDir()\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(userNewcrawDir(), '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(userNewcrawDir(), 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 userNewcrawDir()\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(userNewcrawDir())\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
+ }
@@ -2,10 +2,14 @@ import { createRequire as __newcrawCreateRequire } from "node:module";
2
2
  const require = __newcrawCreateRequire(import.meta.url);
3
3
  import {
4
4
  getCwd,
5
+ init_log,
6
+ init_state,
5
7
  logError
6
- } from "./chunk-IM33F5CM.js";
8
+ } from "./chunk-XYQZLDRB.js";
7
9
 
8
10
  // src/utils/config/settingsFiles.ts
11
+ init_state();
12
+ init_log();
9
13
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
10
14
  import { homedir } from "os";
11
15
  import { dirname, join, resolve } from "path";
@@ -31,7 +35,7 @@ function getDefaultHomeDir() {
31
35
  if (trimmed) return trimmed;
32
36
  return homedir();
33
37
  }
34
- function getUserKodeBaseDir(options) {
38
+ function getUserNewcrawBaseDir(options) {
35
39
  const respectEnvOverride = options?.respectEnvOverride ?? true;
36
40
  if (respectEnvOverride) {
37
41
  const override = normalizeOverride(
@@ -68,7 +72,7 @@ function getSettingsFileCandidates(options) {
68
72
  }
69
73
  case "userSettings": {
70
74
  const primary = join(
71
- getUserKodeBaseDir({ homeDir, respectEnvOverride }),
75
+ getUserNewcrawBaseDir({ homeDir, respectEnvOverride }),
72
76
  "settings.json"
73
77
  );
74
78
  const legacy = dedupeStrings([
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/config/settingsFiles.ts"],
4
+ "sourcesContent": ["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\r\nimport { homedir } from 'os'\r\nimport { dirname, join, resolve } from 'path'\r\nimport { getCwd } from '@utils/state'\r\nimport { logError } from '@utils/log'\r\n\r\nexport type SettingsDestination =\r\n | 'localSettings'\r\n | 'projectSettings'\r\n | 'userSettings'\r\n\r\nexport type SettingsFile = {\r\n [key: string]: unknown\r\n}\r\n\r\nfunction normalizeOverride(value: unknown): string | null {\r\n if (typeof value !== 'string') return null\r\n const trimmed = value.trim()\r\n return trimmed ? resolve(trimmed) : null\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n const out: string[] = []\r\n const seen = new Set<string>()\r\n for (const value of values) {\r\n if (!value) continue\r\n if (seen.has(value)) continue\r\n seen.add(value)\r\n out.push(value)\r\n }\r\n return out\r\n}\r\n\r\nfunction getDefaultHomeDir(): string {\r\n const envHome =\r\n typeof process.env.HOME === 'string'\r\n ? process.env.HOME\r\n : typeof process.env.USERPROFILE === 'string'\r\n ? process.env.USERPROFILE\r\n : ''\r\n const trimmed = envHome.trim()\r\n if (trimmed) return trimmed\r\n return homedir()\r\n}\r\n\r\nfunction getUserNewcrawBaseDir(options?: {\r\n homeDir?: string\r\n respectEnvOverride?: boolean\r\n}): string {\r\n const respectEnvOverride = options?.respectEnvOverride ?? true\r\n if (respectEnvOverride) {\r\n const override = normalizeOverride(\r\n process.env.NEWCRAW_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR,\r\n )\r\n if (override) return override\r\n }\r\n const home = options?.homeDir ?? getDefaultHomeDir()\r\n return join(home, '.newcraw')\r\n}\r\n\r\nfunction getUserLegacyBaseDir(options?: {\r\n homeDir?: string\r\n respectEnvOverride?: boolean\r\n}): string {\r\n const respectEnvOverride = options?.respectEnvOverride ?? true\r\n if (respectEnvOverride) {\r\n const override = normalizeOverride(process.env.CLAUDE_CONFIG_DIR)\r\n if (override) return override\r\n }\r\n const home = options?.homeDir ?? getDefaultHomeDir()\r\n return join(home, '.claude')\r\n}\r\n\r\nexport function getSettingsFileCandidates(options: {\r\n destination: SettingsDestination\r\n projectDir?: string\r\n homeDir?: string\r\n}): { primary: string; legacy: string[] } | null {\r\n const projectDir = options.projectDir ?? getCwd()\r\n const homeDir = options.homeDir ?? getDefaultHomeDir()\r\n const respectEnvOverride = options.homeDir === undefined\r\n\r\n switch (options.destination) {\r\n case 'localSettings': {\r\n const primary = join(projectDir, '.newcraw', 'settings.local.json')\r\n const legacy = [join(projectDir, '.claude', 'settings.local.json')]\r\n return { primary, legacy }\r\n }\r\n case 'projectSettings': {\r\n const primary = join(projectDir, '.newcraw', 'settings.json')\r\n const legacy = [join(projectDir, '.claude', 'settings.json')]\r\n return { primary, legacy }\r\n }\r\n case 'userSettings': {\r\n const primary = join(\r\n getUserNewcrawBaseDir({ homeDir, respectEnvOverride }),\r\n 'settings.json',\r\n )\r\n const legacy = dedupeStrings([\r\n join(\r\n getUserLegacyBaseDir({ homeDir, respectEnvOverride }),\r\n 'settings.json',\r\n ),\r\n join(homeDir, '.claude', 'settings.json'),\r\n ])\r\n return { primary, legacy }\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nexport function readSettingsFile(filePath: string): SettingsFile | null {\r\n if (!existsSync(filePath)) return null\r\n try {\r\n const raw = readFileSync(filePath, 'utf-8')\r\n const parsed = JSON.parse(raw)\r\n if (!parsed || typeof parsed !== 'object') return null\r\n return parsed as SettingsFile\r\n } catch (error) {\r\n logError(error)\r\n return null\r\n }\r\n}\r\n\r\nexport function writeSettingsFile(\r\n filePath: string,\r\n settings: SettingsFile,\r\n): void {\r\n mkdirSync(dirname(filePath), { recursive: true })\r\n writeFileSync(filePath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8')\r\n}\r\n\r\nexport function loadSettingsWithLegacyFallback(options: {\r\n destination: SettingsDestination\r\n projectDir?: string\r\n homeDir?: string\r\n migrateToPrimary?: boolean\r\n}): { settings: SettingsFile | null; usedPath: string | null } {\r\n const candidates = getSettingsFileCandidates(options)\r\n if (!candidates) return { settings: null, usedPath: null }\r\n\r\n const primarySettings = readSettingsFile(candidates.primary)\r\n if (primarySettings)\r\n return { settings: primarySettings, usedPath: candidates.primary }\r\n\r\n for (const legacyPath of candidates.legacy) {\r\n const legacySettings = readSettingsFile(legacyPath)\r\n if (!legacySettings) continue\r\n\r\n if (options.migrateToPrimary && legacyPath !== candidates.primary) {\r\n try {\r\n if (!existsSync(candidates.primary)) {\r\n writeSettingsFile(candidates.primary, legacySettings)\r\n }\r\n } catch (error) {\r\n logError(error)\r\n }\r\n }\r\n\r\n return { settings: legacySettings, usedPath: legacyPath }\r\n }\r\n\r\n return { settings: null, usedPath: null }\r\n}\r\n\r\nexport function saveSettingsToPrimaryAndSyncLegacy(options: {\r\n destination: SettingsDestination\r\n settings: SettingsFile\r\n projectDir?: string\r\n homeDir?: string\r\n syncLegacyIfExists?: boolean\r\n}): void {\r\n const candidates = getSettingsFileCandidates(options)\r\n if (!candidates) return\r\n\r\n writeSettingsFile(candidates.primary, options.settings)\r\n\r\n if (!options.syncLegacyIfExists) return\r\n for (const legacyPath of candidates.legacy) {\r\n if (legacyPath === candidates.primary) continue\r\n if (!existsSync(legacyPath)) continue\r\n try {\r\n writeSettingsFile(legacyPath, options.settings)\r\n } catch (error) {\r\n logError(error)\r\n }\r\n }\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ import { createRequire as __newcrawCreateRequire } from "node:module";
2
+ const require = __newcrawCreateRequire(import.meta.url);
3
+ import {
4
+ PRODUCT_NAME,
5
+ init_product
6
+ } from "./chunk-UYWZQVH5.js";
7
+
8
+ // src/core/identity.ts
9
+ init_product();
10
+ var DEFAULT_IDENTITY = {
11
+ name: PRODUCT_NAME,
12
+ description: "an AI assistant that helps with coding, research, planning, and daily tasks",
13
+ domain: "coding",
14
+ tone: "concise"
15
+ };
16
+ var currentIdentity = { ...DEFAULT_IDENTITY };
17
+ function getIdentity() {
18
+ return currentIdentity;
19
+ }
20
+ function setIdentity(identity) {
21
+ currentIdentity = { ...currentIdentity, ...identity };
22
+ }
23
+ function resetIdentity() {
24
+ currentIdentity = { ...DEFAULT_IDENTITY };
25
+ }
26
+ function getIdentityPrompt() {
27
+ const { name, description } = currentIdentity;
28
+ return `You are ${name}, ${description}.`;
29
+ }
30
+
31
+ export {
32
+ getIdentity,
33
+ setIdentity,
34
+ resetIdentity,
35
+ getIdentityPrompt
36
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/identity.ts"],
4
+ "sourcesContent": ["import { PRODUCT_NAME } from '@constants/product'\r\n\r\nexport type AgentTone = 'concise' | 'friendly' | 'professional'\r\nexport type AgentDomain = 'coding' | 'general' | string\r\n\r\nexport interface AgentIdentity {\r\n name: string\r\n description: string\r\n domain: AgentDomain\r\n tone?: AgentTone\r\n language?: string\r\n}\r\n\r\nconst DEFAULT_IDENTITY: AgentIdentity = {\r\n name: PRODUCT_NAME,\r\n description: \"an AI assistant that helps with coding, research, planning, and daily tasks\",\r\n domain: 'coding',\r\n tone: 'concise',\r\n}\r\n\r\nlet currentIdentity: AgentIdentity = { ...DEFAULT_IDENTITY }\r\n\r\nexport function getIdentity(): AgentIdentity {\r\n return currentIdentity\r\n}\r\n\r\nexport function setIdentity(identity: Partial<AgentIdentity>): void {\r\n currentIdentity = { ...currentIdentity, ...identity }\r\n}\r\n\r\nexport function resetIdentity(): void {\r\n currentIdentity = { ...DEFAULT_IDENTITY }\r\n}\r\n\r\nexport function getIdentityPrompt(): string {\r\n const { name, description } = currentIdentity\r\n return `You are ${name}, ${description}.`\r\n}\r\n"],
5
+ "mappings": ";;;;;;;;AAAA;AAaA,IAAM,mBAAkC;AAAA,EACtC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,IAAI,kBAAiC,EAAE,GAAG,iBAAiB;AAEpD,SAAS,cAA6B;AAC3C,SAAO;AACT;AAEO,SAAS,YAAY,UAAwC;AAClE,oBAAkB,EAAE,GAAG,iBAAiB,GAAG,SAAS;AACtD;AAEO,SAAS,gBAAsB;AACpC,oBAAkB,EAAE,GAAG,iBAAiB;AAC1C;AAEO,SAAS,oBAA4B;AAC1C,QAAM,EAAE,MAAM,YAAY,IAAI;AAC9B,SAAO,WAAW,IAAI,KAAK,WAAW;AACxC;",
6
+ "names": []
7
+ }
@@ -8,13 +8,19 @@ import {
8
8
  PLAN_SLUG_NOUNS,
9
9
  PLAN_SLUG_VERBS,
10
10
  getCwd,
11
- getKodeBaseDir
12
- } from "./chunk-IM33F5CM.js";
11
+ getNewcrawBaseDir,
12
+ init_env,
13
+ init_planSlugWords,
14
+ init_state
15
+ } from "./chunk-XYQZLDRB.js";
13
16
  import {
14
- MACRO
15
- } from "./chunk-ZYSVG4X3.js";
17
+ MACRO,
18
+ init_macros
19
+ } from "./chunk-EHQ2M5B4.js";
16
20
 
17
21
  // src/utils/protocol/kodeAgentSessionLog.ts
22
+ init_macros();
23
+ init_state();
18
24
  import { execFileSync } from "child_process";
19
25
  import {
20
26
  appendFileSync,
@@ -26,8 +32,10 @@ import {
26
32
  } from "fs";
27
33
  import { randomBytes } from "crypto";
28
34
  import { dirname, join } from "path";
35
+ init_env();
36
+ init_planSlugWords();
29
37
  function getSessionStoreBaseDir() {
30
- return getKodeBaseDir();
38
+ return getNewcrawBaseDir();
31
39
  }
32
40
  function sanitizeProjectNameForSessionStore(cwd) {
33
41
  return cwd.replace(/[^a-zA-Z0-9]/g, "-");
@@ -230,11 +238,27 @@ function appendSessionTagRecord(args) {
230
238
  currentSessionTag = args.tag;
231
239
  }
232
240
  }
241
+ function appendStateTransition(args) {
242
+ const sessionId = getKodeAgentSessionId();
243
+ const cwd = getCwd();
244
+ const filePath = getSessionLogFilePath({ cwd, sessionId });
245
+ safeAppendJsonl(filePath, {
246
+ type: "state_transition",
247
+ sessionId,
248
+ agentId: args.agentId,
249
+ from: args.from,
250
+ to: args.to,
251
+ durationMs: args.durationMs,
252
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
253
+ ...args.metadata ? { metadata: args.metadata } : {}
254
+ });
255
+ }
233
256
 
234
257
  export {
235
258
  getSessionProjectsDir,
236
259
  getSessionProjectDir,
237
260
  appendSessionJsonlFromMessage,
238
261
  appendSessionCustomTitleRecord,
239
- appendSessionTagRecord
262
+ appendSessionTagRecord,
263
+ appendStateTransition
240
264
  };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/protocol/kodeAgentSessionLog.ts"],
4
+ "sourcesContent": ["import { execFileSync } from 'child_process'\r\nimport {\r\n appendFileSync,\r\n existsSync,\r\n mkdirSync,\r\n readFileSync,\r\n statSync,\r\n writeFileSync,\r\n} from 'fs'\r\nimport { randomBytes } from 'crypto'\r\nimport { dirname, join } from 'path'\r\nimport type { Message } from '@query'\r\nimport { MACRO } from '@constants/macros'\r\nimport { getCwd } from '@utils/state'\r\nimport { getKodeAgentSessionId } from './kodeAgentSessionId'\r\nimport { getNewcrawBaseDir } from '@utils/config/env'\r\nimport {\r\n PLAN_SLUG_ADJECTIVES,\r\n PLAN_SLUG_NOUNS,\r\n PLAN_SLUG_VERBS,\r\n} from '@utils/plan/planSlugWords'\r\n\r\ntype PersistTarget =\r\n | { kind: 'session'; sessionId: string }\r\n | { kind: 'agent'; agentId: string }\r\n\r\ntype JsonlEnvelopeBase = {\r\n cwd: string\r\n sessionId: string\r\n version: string\r\n gitBranch?: string\r\n userType: string\r\n isSidechain: boolean\r\n parentUuid: string | null\r\n logicalParentUuid?: string\r\n agentId: string\r\n slug: string\r\n uuid: string\r\n timestamp: string\r\n}\r\n\r\ntype SessionJsonlEntry =\r\n | (JsonlEnvelopeBase & {\r\n type: 'user'\r\n message: any\r\n toolUseResult?: any\r\n })\r\n | (JsonlEnvelopeBase & {\r\n type: 'assistant'\r\n message: any\r\n requestId?: string\r\n isApiErrorMessage?: boolean\r\n })\r\n | { type: 'summary'; summary: string; leafUuid: string }\r\n | { type: 'custom-title'; sessionId: string; customTitle: string }\r\n | { type: 'tag'; sessionId: string; tag: string }\r\n | {\r\n type: 'file-history-snapshot'\r\n messageId: string\r\n snapshot: {\r\n messageId: string\r\n trackedFileBackups: Record<string, unknown>\r\n timestamp: string\r\n }\r\n isSnapshotUpdate: boolean\r\n }\r\n | {\r\n type: 'state_transition'\r\n sessionId: string\r\n agentId: string\r\n from: string\r\n to: string\r\n durationMs: number\r\n timestamp: string\r\n metadata?: Record<string, unknown>\r\n }\r\n\r\nfunction getSessionStoreBaseDir(): string {\r\n return getNewcrawBaseDir()\r\n}\r\n\r\nexport function sanitizeProjectNameForSessionStore(cwd: string): string {\r\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\r\n}\r\n\r\nexport function getSessionProjectsDir(): string {\r\n return join(getSessionStoreBaseDir(), 'projects')\r\n}\r\n\r\nexport function getSessionProjectDir(cwd: string): string {\r\n return join(getSessionProjectsDir(), sanitizeProjectNameForSessionStore(cwd))\r\n}\r\n\r\nexport function getSessionLogFilePath(args: {\r\n cwd: string\r\n sessionId: string\r\n}): string {\r\n return join(getSessionProjectDir(args.cwd), `${args.sessionId}.jsonl`)\r\n}\r\n\r\nexport function getAgentLogFilePath(args: {\r\n cwd: string\r\n agentId: string\r\n}): string {\r\n return join(getSessionProjectDir(args.cwd), `agent-${args.agentId}.jsonl`)\r\n}\r\n\r\nfunction safeMkdir(dir: string): void {\r\n if (existsSync(dir)) return\r\n mkdirSync(dir, { recursive: true })\r\n}\r\n\r\nfunction safeEnsureFile(path: string): void {\r\n safeMkdir(dirname(path))\r\n if (!existsSync(path)) writeFileSync(path, '', 'utf8')\r\n}\r\n\r\nfunction safeAppendJsonl(path: string, record: unknown): void {\r\n try {\r\n safeEnsureFile(path)\r\n appendFileSync(path, JSON.stringify(record) + '\\n', 'utf8')\r\n } catch {\r\n }\r\n}\r\n\r\nconst lastUuidByFile = new Map<string, string | null>()\r\nconst snapshotWrittenByFile = new Set<string>()\r\nconst slugBySessionId = new Map<string, string>()\r\nlet currentSessionCustomTitle: string | null = null\r\nlet currentSessionTag: string | null = null\r\n\r\ntype LastPersistedInfo = { uuid: string | null; slug: string | null }\r\n\r\nfunction safeReadLastPersistedInfo(filePath: string): LastPersistedInfo {\r\n try {\r\n if (!existsSync(filePath)) return { uuid: null, slug: null }\r\n const content = readFileSync(filePath, 'utf8')\r\n const lines = content.split('\\n')\r\n\r\n let lastSlug: string | null = null\r\n for (let i = lines.length - 1; i >= 0; i--) {\r\n const line = lines[i]?.trim()\r\n if (!line) continue\r\n let parsed: any\r\n try {\r\n parsed = JSON.parse(line)\r\n } catch {\r\n continue\r\n }\r\n if (!parsed || typeof parsed !== 'object') continue\r\n\r\n if (!lastSlug && typeof parsed.slug === 'string' && parsed.slug.trim()) {\r\n lastSlug = parsed.slug.trim()\r\n }\r\n\r\n if (typeof parsed.uuid === 'string' && parsed.uuid) {\r\n return { uuid: parsed.uuid, slug: lastSlug }\r\n }\r\n }\r\n\r\n return { uuid: null, slug: lastSlug }\r\n } catch {\r\n return { uuid: null, slug: null }\r\n }\r\n}\r\n\r\nfunction pickIndex(length: number): number {\r\n return randomBytes(4).readUInt32BE(0) % length\r\n}\r\n\r\nfunction pickWord(words: readonly string[]): string {\r\n return words[pickIndex(words.length)]!\r\n}\r\n\r\nfunction generateSessionSlug(): string {\r\n const adjective = pickWord(PLAN_SLUG_ADJECTIVES)\r\n const verb = pickWord(PLAN_SLUG_VERBS)\r\n const noun = pickWord(PLAN_SLUG_NOUNS)\r\n return `${adjective}-${verb}-${noun}`\r\n}\r\n\r\nfunction getOrCreateSessionSlug(sessionId: string): string {\r\n const existing = slugBySessionId.get(sessionId)\r\n if (existing) return existing\r\n const slug = generateSessionSlug()\r\n slugBySessionId.set(sessionId, slug)\r\n return slug\r\n}\r\n\r\ntype GitBranchCacheEntry = { cwd: string; value: string | undefined }\r\nlet gitBranchCache: GitBranchCacheEntry | null = null\r\n\r\nfunction getGitBranchBestEffort(cwd: string): string | undefined {\r\n if (gitBranchCache && gitBranchCache.cwd === cwd) return gitBranchCache.value\r\n\r\n let value: string | undefined\r\n try {\r\n const stdout = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\r\n cwd,\r\n stdio: ['ignore', 'pipe', 'ignore'],\r\n timeout: 750,\r\n })\r\n const branch = stdout.toString('utf8').trim()\r\n value = branch || undefined\r\n } catch {\r\n value = undefined\r\n }\r\n\r\n gitBranchCache = { cwd, value }\r\n return value\r\n}\r\n\r\nfunction ensureFileHistorySnapshot(\r\n filePath: string,\r\n firstMessageUuid: string,\r\n): void {\r\n if (snapshotWrittenByFile.has(filePath)) return\r\n\r\n try {\r\n safeEnsureFile(filePath)\r\n const size = statSync(filePath).size\r\n if (size > 0) {\r\n snapshotWrittenByFile.add(filePath)\r\n return\r\n }\r\n } catch {\r\n }\r\n\r\n const now = new Date().toISOString()\r\n safeAppendJsonl(filePath, {\r\n type: 'file-history-snapshot',\r\n messageId: firstMessageUuid,\r\n snapshot: {\r\n messageId: firstMessageUuid,\r\n trackedFileBackups: {},\r\n timestamp: now,\r\n },\r\n isSnapshotUpdate: false,\r\n } satisfies SessionJsonlEntry)\r\n\r\n snapshotWrittenByFile.add(filePath)\r\n}\r\n\r\nfunction resolvePersistTarget(toolUseContext: {\r\n agentId?: string\r\n}): PersistTarget {\r\n const agentId = toolUseContext.agentId\r\n if (agentId && agentId !== 'main') return { kind: 'agent', agentId }\r\n return { kind: 'session', sessionId: getKodeAgentSessionId() }\r\n}\r\n\r\nexport function appendSessionJsonlFromMessage(args: {\r\n message: Message\r\n toolUseContext: { agentId?: string }\r\n}): void {\r\n const { message, toolUseContext } = args\r\n if (message.type !== 'user' && message.type !== 'assistant') return\r\n\r\n const cwd = getCwd()\r\n const userType = (process.env.USER_TYPE ?? 'external').trim() || 'external'\r\n const sessionId = getKodeAgentSessionId()\r\n const agentId = (toolUseContext.agentId ?? 'main').trim() || 'main'\r\n const isSidechain = agentId !== 'main'\r\n const gitBranch = getGitBranchBestEffort(cwd)\r\n\r\n const target = resolvePersistTarget(toolUseContext)\r\n const filePath =\r\n target.kind === 'agent'\r\n ? getAgentLogFilePath({ cwd, agentId: target.agentId })\r\n : getSessionLogFilePath({ cwd, sessionId: target.sessionId })\r\n\r\n if (!lastUuidByFile.has(filePath)) {\r\n const info = safeReadLastPersistedInfo(filePath)\r\n lastUuidByFile.set(filePath, info.uuid)\r\n if (info.slug) slugBySessionId.set(sessionId, info.slug)\r\n }\r\n const previousUuid = lastUuidByFile.get(filePath) ?? null\r\n\r\n const slug = getOrCreateSessionSlug(sessionId)\r\n\r\n if (target.kind === 'session') {\r\n ensureFileHistorySnapshot(filePath, message.uuid)\r\n }\r\n\r\n const base: JsonlEnvelopeBase = {\r\n parentUuid: previousUuid,\r\n logicalParentUuid: undefined,\r\n isSidechain,\r\n userType,\r\n cwd,\r\n sessionId,\r\n version: MACRO.VERSION,\r\n ...(gitBranch ? { gitBranch } : {}),\r\n agentId,\r\n slug,\r\n uuid: message.uuid,\r\n timestamp: new Date().toISOString(),\r\n }\r\n\r\n const record: SessionJsonlEntry =\r\n message.type === 'user'\r\n ? {\r\n ...base,\r\n type: 'user',\r\n message: message.message,\r\n ...(message.toolUseResult?.data !== undefined\r\n ? { toolUseResult: message.toolUseResult.data }\r\n : {}),\r\n }\r\n : {\r\n ...base,\r\n type: 'assistant',\r\n message: message.message,\r\n ...(typeof (message as any).requestId === 'string'\r\n ? { requestId: String((message as any).requestId) }\r\n : {}),\r\n ...(message.isApiErrorMessage ? { isApiErrorMessage: true } : {}),\r\n }\r\n\r\n safeAppendJsonl(filePath, record)\r\n lastUuidByFile.set(filePath, message.uuid)\r\n}\r\n\r\nexport function appendSessionSummaryRecord(args: {\r\n summary: string\r\n leafUuid: string\r\n sessionId?: string\r\n}): void {\r\n const sessionId = args.sessionId ?? getKodeAgentSessionId()\r\n const cwd = getCwd()\r\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId }), {\r\n type: 'summary',\r\n summary: args.summary,\r\n leafUuid: args.leafUuid,\r\n } satisfies SessionJsonlEntry)\r\n}\r\n\r\nexport function appendSessionCustomTitleRecord(args: {\r\n sessionId: string\r\n customTitle: string\r\n}): void {\r\n const cwd = getCwd()\r\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\r\n type: 'custom-title',\r\n sessionId: args.sessionId,\r\n customTitle: args.customTitle,\r\n } satisfies SessionJsonlEntry)\r\n if (args.sessionId === getKodeAgentSessionId()) {\r\n currentSessionCustomTitle = args.customTitle\r\n }\r\n}\r\n\r\nexport function appendSessionTagRecord(args: {\r\n sessionId: string\r\n tag: string\r\n}): void {\r\n const cwd = getCwd()\r\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\r\n type: 'tag',\r\n sessionId: args.sessionId,\r\n tag: args.tag,\r\n } satisfies SessionJsonlEntry)\r\n if (args.sessionId === getKodeAgentSessionId()) {\r\n currentSessionTag = args.tag\r\n }\r\n}\r\n\r\nexport function getCurrentSessionCustomTitle(): string | null {\r\n return currentSessionCustomTitle\r\n}\r\n\r\nexport function getCurrentSessionTag(): string | null {\r\n return currentSessionTag\r\n}\r\n\r\nexport function appendStateTransition(args: {\r\n agentId: string\r\n from: string\r\n to: string\r\n durationMs: number\r\n metadata?: Record<string, unknown>\r\n}): void {\r\n const sessionId = getKodeAgentSessionId()\r\n const cwd = getCwd()\r\n const filePath = getSessionLogFilePath({ cwd, sessionId })\r\n\r\n safeAppendJsonl(filePath, {\r\n type: 'state_transition',\r\n sessionId,\r\n agentId: args.agentId,\r\n from: args.from,\r\n to: args.to,\r\n durationMs: args.durationMs,\r\n timestamp: new Date().toISOString(),\r\n ...(args.metadata ? { metadata: args.metadata } : {}),\r\n } satisfies SessionJsonlEntry)\r\n}\r\n\r\nexport function resetSessionJsonlStateForTests(): void {\r\n lastUuidByFile.clear()\r\n snapshotWrittenByFile.clear()\r\n slugBySessionId.clear()\r\n gitBranchCache = null\r\n currentSessionCustomTitle = null\r\n currentSessionTag = null\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -5,16 +5,20 @@ import {
5
5
  } from "./chunk-7ZFLZNOW.js";
6
6
  import {
7
7
  loadSettingsWithLegacyFallback
8
- } from "./chunk-2EFL22PV.js";
8
+ } from "./chunk-JI4HCLK7.js";
9
9
  import {
10
10
  getSessionPlugins
11
11
  } from "./chunk-2UO3BFZH.js";
12
12
  import {
13
13
  getCwd,
14
+ init_log,
15
+ init_state,
14
16
  logError
15
- } from "./chunk-IM33F5CM.js";
17
+ } from "./chunk-XYQZLDRB.js";
16
18
 
17
19
  // src/utils/session/kodeHooks.ts
20
+ init_log();
21
+ init_state();
18
22
  import { spawn } from "child_process";
19
23
  import { readFileSync, statSync } from "fs";
20
24
  import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "fs";
@@ -502,7 +506,7 @@ async function runPromptHook(args) {
502
506
  fallbackTimeoutMs: args.fallbackTimeoutMs
503
507
  });
504
508
  try {
505
- const { queryQuick } = await import("./llmLazy-IXVVBRTN.js");
509
+ const { queryQuick } = await import("./llmLazy-TDLZZDPL.js");
506
510
  const systemPrompt = [
507
511
  "You are executing a NewCraw prompt hook.",
508
512
  "Return a single JSON object only (no markdown, no prose).",