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.
- package/dist/REPL-DECTPCL5.js +50 -0
- package/dist/{acp-J4WDYGRX.js → acp-HA476EHW.js} +69 -40
- package/dist/acp-HA476EHW.js.map +7 -0
- package/dist/{agentsValidate-UBOER2IN.js → agentsValidate-EDPFUUMG.js} +13 -10
- package/dist/{agentsValidate-UBOER2IN.js.map → agentsValidate-EDPFUUMG.js.map} +1 -1
- package/dist/{ask-MGUO3L35.js → ask-5SP4YYRD.js} +62 -52
- package/dist/ask-5SP4YYRD.js.map +7 -0
- package/dist/{autoUpdater-2GS6LRPK.js → autoUpdater-FFMM2DR7.js} +5 -4
- package/dist/chunk-2BVCVKKB.js +135 -0
- package/dist/chunk-2BVCVKKB.js.map +7 -0
- package/dist/{chunk-2C43OXE7.js → chunk-2JCTO2EY.js} +38 -59
- package/dist/chunk-2JCTO2EY.js.map +7 -0
- package/dist/{chunk-OJIMOLIC.js → chunk-3CKC4ABU.js} +3631 -7464
- package/dist/chunk-3CKC4ABU.js.map +7 -0
- package/dist/chunk-ARCEUG3V.js +88 -0
- package/dist/chunk-ARCEUG3V.js.map +7 -0
- package/dist/{chunk-RUXIBQ3B.js → chunk-BJYXLCRS.js} +4 -4
- package/dist/{chunk-VKI7ORIO.js → chunk-BMKE6FT5.js} +37 -18
- package/dist/{chunk-VKI7ORIO.js.map → chunk-BMKE6FT5.js.map} +1 -1
- package/dist/chunk-BQCOSNM3.js +93 -0
- package/dist/chunk-BQCOSNM3.js.map +7 -0
- package/dist/chunk-CHB5K4GI.js +107 -0
- package/dist/chunk-CHB5K4GI.js.map +7 -0
- package/dist/chunk-D4OZACS2.js +35 -0
- package/dist/chunk-EHQ2M5B4.js +166 -0
- package/dist/{chunk-ZYSVG4X3.js.map → chunk-EHQ2M5B4.js.map} +2 -2
- package/dist/chunk-EUBZGAIN.js +372 -0
- package/dist/chunk-EUBZGAIN.js.map +7 -0
- package/dist/{chunk-UYRR6F5S.js → chunk-FIMCETCB.js} +9 -3
- package/dist/{chunk-UYRR6F5S.js.map → chunk-FIMCETCB.js.map} +1 -1
- package/dist/{chunk-DEF3KFP7.js → chunk-GVLJUD6R.js} +4 -2
- package/dist/{chunk-DEF3KFP7.js.map → chunk-GVLJUD6R.js.map} +1 -1
- package/dist/chunk-HLBLZKZH.js +45 -0
- package/dist/chunk-HLBLZKZH.js.map +7 -0
- package/dist/{chunk-XS6PU75S.js → chunk-IVWPPTDM.js} +1 -1
- package/dist/{chunk-A7X6OCZE.js → chunk-IXFBUXQW.js} +1 -1
- package/dist/{chunk-HSJ6HYAO.js → chunk-IZZTKEZH.js} +18 -10
- package/dist/chunk-IZZTKEZH.js.map +7 -0
- package/dist/{chunk-2EFL22PV.js → chunk-JI4HCLK7.js} +7 -3
- package/dist/chunk-JI4HCLK7.js.map +7 -0
- package/dist/chunk-JLVECHVJ.js +36 -0
- package/dist/chunk-JLVECHVJ.js.map +7 -0
- package/dist/{chunk-XXU2NVOE.js → chunk-KJTPUTU7.js} +30 -6
- package/dist/chunk-KJTPUTU7.js.map +7 -0
- package/dist/{chunk-V5U6BHT2.js → chunk-KS646CDL.js} +7 -3
- package/dist/{chunk-V5U6BHT2.js.map → chunk-KS646CDL.js.map} +1 -1
- package/dist/{chunk-53A4JHFW.js → chunk-MJ3MLGVB.js} +23 -4
- package/dist/chunk-MJ3MLGVB.js.map +7 -0
- package/dist/chunk-MJLWBVZP.js +822 -0
- package/dist/chunk-MJLWBVZP.js.map +7 -0
- package/dist/chunk-MMF5RMLU.js +65 -0
- package/dist/chunk-MMF5RMLU.js.map +7 -0
- package/dist/{chunk-QH2M65BR.js → chunk-MUW3J7CP.js} +7 -3
- package/dist/{chunk-QH2M65BR.js.map → chunk-MUW3J7CP.js.map} +1 -1
- package/dist/{chunk-3LMXSKZ7.js → chunk-NFXLN6FJ.js} +1 -1
- package/dist/chunk-NT7RDVDA.js +33 -0
- package/dist/{chunk-KQSHIOZK.js.map → chunk-NT7RDVDA.js.map} +1 -1
- package/dist/{chunk-OZHBEG7U.js → chunk-O4EKE3YR.js} +15 -5
- package/dist/{chunk-OZHBEG7U.js.map → chunk-O4EKE3YR.js.map} +1 -1
- package/dist/chunk-Q2OBTLBI.js +5473 -0
- package/dist/chunk-Q2OBTLBI.js.map +7 -0
- package/dist/{chunk-WWDVA4NV.js → chunk-QJ7MQIHN.js} +22 -6
- package/dist/{chunk-WWDVA4NV.js.map → chunk-QJ7MQIHN.js.map} +1 -1
- package/dist/{chunk-N5OHRWG2.js → chunk-QSRXXZO7.js} +4 -2
- package/dist/{chunk-N5OHRWG2.js.map → chunk-QSRXXZO7.js.map} +1 -1
- package/dist/{chunk-GZTCXXSS.js → chunk-QT5GS374.js} +57 -46
- package/dist/{chunk-GZTCXXSS.js.map → chunk-QT5GS374.js.map} +1 -1
- package/dist/chunk-QX5Y5CE5.js +683 -0
- package/dist/{chunk-F3COCCAE.js.map → chunk-QX5Y5CE5.js.map} +1 -1
- package/dist/{chunk-IIFUDVGS.js → chunk-U6IF5D3J.js} +310 -177
- package/dist/chunk-U6IF5D3J.js.map +7 -0
- package/dist/{chunk-VQSCECTS.js → chunk-UPRKGNBR.js} +6 -4
- package/dist/{chunk-VQSCECTS.js.map → chunk-UPRKGNBR.js.map} +1 -1
- package/dist/chunk-UUCRNFMH.js +62 -0
- package/dist/chunk-UUCRNFMH.js.map +7 -0
- package/dist/chunk-UYWZQVH5.js +35 -0
- package/dist/chunk-UYWZQVH5.js.map +7 -0
- package/dist/{chunk-XMGUQHMF.js → chunk-VSSVN6WG.js} +11 -1
- package/dist/chunk-VSSVN6WG.js.map +7 -0
- package/dist/{chunk-VHS2MZQS.js → chunk-W7Q3VYAB.js} +9 -6
- package/dist/{chunk-VHS2MZQS.js.map → chunk-W7Q3VYAB.js.map} +1 -1
- package/dist/{chunk-JWXQNBBA.js → chunk-WAXMRSVR.js} +7 -1
- package/dist/{chunk-JWXQNBBA.js.map → chunk-WAXMRSVR.js.map} +1 -1
- package/dist/{chunk-BWYKUDJR.js → chunk-X3NER6FY.js} +14 -8
- package/dist/{chunk-BWYKUDJR.js.map → chunk-X3NER6FY.js.map} +1 -1
- package/dist/{chunk-IM33F5CM.js → chunk-XYQZLDRB.js} +1668 -1623
- package/dist/chunk-XYQZLDRB.js.map +7 -0
- package/dist/{chunk-LOIZNQOU.js → chunk-ZM5FMRLS.js} +9 -3
- package/dist/{chunk-LOIZNQOU.js.map → chunk-ZM5FMRLS.js.map} +1 -1
- package/dist/{chunk-755HIAI3.js → chunk-ZMO4E7IW.js} +3 -42
- package/dist/chunk-ZMO4E7IW.js.map +7 -0
- package/dist/{cli-KZGF3FV5.js → cli-4KO6TA5J.js} +251 -485
- package/dist/cli-4KO6TA5J.js.map +7 -0
- package/dist/commands-JSY7CGSU.js +54 -0
- package/dist/{config-GTJWCNPF.js → config-DQEFVW3Y.js} +9 -6
- package/dist/{context-WF3TTXQU.js → context-HVQCTO5R.js} +8 -7
- package/dist/{costTracker-2G3ZI2JF.js → costTracker-VSWW7SRT.js} +3 -2
- package/dist/{customCommands-QOWK57EX.js → customCommands-XCINU5TG.js} +6 -5
- package/dist/{env-37BAP7QF.js → env-ZOPEXWMF.js} +10 -7
- package/dist/{gateway-IZYO6YFJ.js → gateway-SUXSILQL.js} +542 -96
- package/dist/gateway-SUXSILQL.js.map +7 -0
- package/dist/identity-3KZQQVBG.js +16 -0
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/{kodeAgentSessionId-KTGFX2BE.js → kodeAgentSessionId-4SH24DVH.js} +1 -1
- package/dist/{kodeAgentSessionLoad-6F7SJXBC.js → kodeAgentSessionLoad-HB3BYVNG.js} +6 -5
- package/dist/{kodeAgentSessionResume-UEEDRJ3N.js → kodeAgentSessionResume-IGSZZY3G.js} +6 -5
- package/dist/{kodeAgentStreamJson-VIXFTYL5.js → kodeAgentStreamJson-4ZKIWKS3.js} +4 -2
- package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-4L76UC75.js} +15 -4
- package/dist/kodeAgentStreamJsonSession-4L76UC75.js.map +7 -0
- package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js → kodeAgentStructuredStdio-5DCUC6V6.js} +3 -3
- package/dist/{kodeHooks-V36SHCTC.js → kodeHooks-H6DMC3XX.js} +6 -5
- package/dist/{llm-CYUDKJNR.js → llm-OJZ6DZVC.js} +306 -60
- package/dist/llm-OJZ6DZVC.js.map +7 -0
- package/dist/{llmLazy-IXVVBRTN.js → llmLazy-TDLZZDPL.js} +2 -2
- package/dist/{loader-OEJ6C3TN.js → loader-MOVYZ76M.js} +6 -5
- package/dist/{mcp-KE3SILMX.js → mcp-DUYSIR5L.js} +10 -9
- package/dist/{mentionProcessor-GAU2WAYB.js → mentionProcessor-EKVLXJN4.js} +14 -7
- package/dist/{mentionProcessor-GAU2WAYB.js.map → mentionProcessor-EKVLXJN4.js.map} +1 -1
- package/dist/{messages-WCSGGSEU.js → messages-23ICFVMC.js} +2 -2
- package/dist/{model-4TQIV5J2.js → model-FUBCTRTV.js} +10 -7
- package/dist/{openai-KTZV6F7N.js → openai-SMYIAIO4.js} +8 -7
- package/dist/{outputStyles-WX5RYQOA.js → outputStyles-HBOYJFBE.js} +6 -5
- package/dist/{pluginRuntime-JXMJZ2LC.js → pluginRuntime-ATZMDZA7.js} +11 -8
- package/dist/{pluginRuntime-JXMJZ2LC.js.map → pluginRuntime-ATZMDZA7.js.map} +1 -1
- package/dist/{pluginValidation-JNQZYLUP.js → pluginValidation-7CGOMT6F.js} +8 -7
- package/dist/prompts-MFESKNYZ.js +58 -0
- package/dist/query-BFEFOX4S.js +58 -0
- package/dist/{responsesStreaming-2AIT6GHG.js → responsesStreaming-JORGEFQC.js} +1 -1
- package/dist/{ripgrep-KDPQAMB2.js → ripgrep-KNJBCJIQ.js} +5 -4
- package/dist/sandbox-P3FR4G4D.js +63 -0
- package/dist/{skillMarketplace-IXAGP3Q2.js → skillMarketplace-PCMKVV4O.js} +5 -4
- package/dist/{state-MSCYLB6Y.js → state-XBYIQ7R4.js} +6 -3
- package/dist/structuredOutput-KAVFUV2Z.js +9 -0
- package/dist/theme-4ZSXUILR.js +15 -0
- package/dist/thinking-TTNUZUB3.js +18 -0
- package/dist/{toolPermissionContext-I3IXPVED.js → toolPermissionContext-JCQ5MFUT.js} +1 -1
- package/dist/toolPermissionContext-JCQ5MFUT.js.map +7 -0
- package/dist/toolPermissionContextState-R6ZGMKP6.js +24 -0
- package/dist/toolPermissionContextState-R6ZGMKP6.js.map +7 -0
- package/dist/{toolPermissionSettings-EUZKGZU2.js → toolPermissionSettings-GMEYTJEA.js} +9 -8
- package/dist/toolPermissionSettings-GMEYTJEA.js.map +7 -0
- package/dist/tools-7FVKB7BG.js +55 -0
- package/dist/tools-7FVKB7BG.js.map +7 -0
- package/dist/{userInput-LJL4CVOB.js → userInput-SZEUY5J6.js} +49 -34
- package/dist/{userInput-LJL4CVOB.js.map → userInput-SZEUY5J6.js.map} +1 -1
- package/dist/{uuid-VA3KVASX.js → uuid-RQH3OZ3W.js} +1 -1
- package/dist/uuid-RQH3OZ3W.js.map +7 -0
- package/dist/workspace-EP63OB5S.js +21 -0
- package/dist/workspace-EP63OB5S.js.map +7 -0
- package/package.json +2 -2
- package/web/dist/assets/index-XuLVvSQF.js +251 -0
- package/web/dist/assets/index-pSid9IlY.css +10 -0
- package/web/dist/index.html +2 -2
- package/dist/REPL-IAK7ZN2Z.js +0 -42
- package/dist/acp-J4WDYGRX.js.map +0 -7
- package/dist/ask-MGUO3L35.js.map +0 -7
- package/dist/chunk-2C43OXE7.js.map +0 -7
- package/dist/chunk-2EFL22PV.js.map +0 -7
- package/dist/chunk-53A4JHFW.js.map +0 -7
- package/dist/chunk-755HIAI3.js.map +0 -7
- package/dist/chunk-AXWJI6N5.js +0 -11
- package/dist/chunk-F3COCCAE.js +0 -654
- package/dist/chunk-HSJ6HYAO.js.map +0 -7
- package/dist/chunk-IIFUDVGS.js.map +0 -7
- package/dist/chunk-IM33F5CM.js.map +0 -7
- package/dist/chunk-KQSHIOZK.js +0 -24
- package/dist/chunk-OJIMOLIC.js.map +0 -7
- package/dist/chunk-XMGUQHMF.js.map +0 -7
- package/dist/chunk-XXU2NVOE.js.map +0 -7
- package/dist/chunk-ZYSVG4X3.js +0 -151
- package/dist/cli-KZGF3FV5.js.map +0 -7
- package/dist/commands-AVEBLFVS.js +0 -46
- package/dist/gateway-IZYO6YFJ.js.map +0 -7
- package/dist/kodeAgentStreamJsonSession-XC3IPREZ.js.map +0 -7
- package/dist/llm-CYUDKJNR.js.map +0 -7
- package/dist/prompts-LE6GK75N.js +0 -48
- package/dist/query-GGIP6PWG.js +0 -50
- package/dist/theme-GAMFOLBW.js +0 -14
- package/dist/tools-3HOUIDM3.js +0 -47
- package/web/dist/assets/index-COAJqX1Z.css +0 -1
- package/web/dist/assets/index-CzS_4LmC.js +0 -179
- /package/dist/{REPL-IAK7ZN2Z.js.map → REPL-DECTPCL5.js.map} +0 -0
- /package/dist/{autoUpdater-2GS6LRPK.js.map → autoUpdater-FFMM2DR7.js.map} +0 -0
- /package/dist/{chunk-RUXIBQ3B.js.map → chunk-BJYXLCRS.js.map} +0 -0
- /package/dist/{chunk-AXWJI6N5.js.map → chunk-D4OZACS2.js.map} +0 -0
- /package/dist/{chunk-XS6PU75S.js.map → chunk-IVWPPTDM.js.map} +0 -0
- /package/dist/{chunk-A7X6OCZE.js.map → chunk-IXFBUXQW.js.map} +0 -0
- /package/dist/{chunk-3LMXSKZ7.js.map → chunk-NFXLN6FJ.js.map} +0 -0
- /package/dist/{commands-AVEBLFVS.js.map → commands-JSY7CGSU.js.map} +0 -0
- /package/dist/{config-GTJWCNPF.js.map → config-DQEFVW3Y.js.map} +0 -0
- /package/dist/{context-WF3TTXQU.js.map → context-HVQCTO5R.js.map} +0 -0
- /package/dist/{costTracker-2G3ZI2JF.js.map → costTracker-VSWW7SRT.js.map} +0 -0
- /package/dist/{customCommands-QOWK57EX.js.map → customCommands-XCINU5TG.js.map} +0 -0
- /package/dist/{env-37BAP7QF.js.map → env-ZOPEXWMF.js.map} +0 -0
- /package/dist/{kodeAgentSessionId-KTGFX2BE.js.map → identity-3KZQQVBG.js.map} +0 -0
- /package/dist/{kodeAgentSessionLoad-6F7SJXBC.js.map → kodeAgentSessionId-4SH24DVH.js.map} +0 -0
- /package/dist/{kodeAgentSessionResume-UEEDRJ3N.js.map → kodeAgentSessionLoad-HB3BYVNG.js.map} +0 -0
- /package/dist/{kodeAgentStreamJson-VIXFTYL5.js.map → kodeAgentSessionResume-IGSZZY3G.js.map} +0 -0
- /package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js.map → kodeAgentStreamJson-4ZKIWKS3.js.map} +0 -0
- /package/dist/{kodeHooks-V36SHCTC.js.map → kodeAgentStructuredStdio-5DCUC6V6.js.map} +0 -0
- /package/dist/{llmLazy-IXVVBRTN.js.map → kodeHooks-H6DMC3XX.js.map} +0 -0
- /package/dist/{loader-OEJ6C3TN.js.map → llmLazy-TDLZZDPL.js.map} +0 -0
- /package/dist/{mcp-KE3SILMX.js.map → loader-MOVYZ76M.js.map} +0 -0
- /package/dist/{messages-WCSGGSEU.js.map → mcp-DUYSIR5L.js.map} +0 -0
- /package/dist/{model-4TQIV5J2.js.map → messages-23ICFVMC.js.map} +0 -0
- /package/dist/{openai-KTZV6F7N.js.map → model-FUBCTRTV.js.map} +0 -0
- /package/dist/{outputStyles-WX5RYQOA.js.map → openai-SMYIAIO4.js.map} +0 -0
- /package/dist/{pluginValidation-JNQZYLUP.js.map → outputStyles-HBOYJFBE.js.map} +0 -0
- /package/dist/{prompts-LE6GK75N.js.map → pluginValidation-7CGOMT6F.js.map} +0 -0
- /package/dist/{query-GGIP6PWG.js.map → prompts-MFESKNYZ.js.map} +0 -0
- /package/dist/{responsesStreaming-2AIT6GHG.js.map → query-BFEFOX4S.js.map} +0 -0
- /package/dist/{ripgrep-KDPQAMB2.js.map → responsesStreaming-JORGEFQC.js.map} +0 -0
- /package/dist/{skillMarketplace-IXAGP3Q2.js.map → ripgrep-KNJBCJIQ.js.map} +0 -0
- /package/dist/{state-MSCYLB6Y.js.map → sandbox-P3FR4G4D.js.map} +0 -0
- /package/dist/{theme-GAMFOLBW.js.map → skillMarketplace-PCMKVV4O.js.map} +0 -0
- /package/dist/{toolPermissionContext-I3IXPVED.js.map → state-XBYIQ7R4.js.map} +0 -0
- /package/dist/{toolPermissionSettings-EUZKGZU2.js.map → structuredOutput-KAVFUV2Z.js.map} +0 -0
- /package/dist/{tools-3HOUIDM3.js.map → theme-4ZSXUILR.js.map} +0 -0
- /package/dist/{uuid-VA3KVASX.js.map → thinking-TTNUZUB3.js.map} +0 -0
|
@@ -1,66 +1,79 @@
|
|
|
1
1
|
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
2
|
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
buildSkillMatchDirective,
|
|
5
|
+
createQueryOptions,
|
|
6
|
+
matchSkillForPrompt
|
|
7
|
+
} from "./chunk-ARCEUG3V.js";
|
|
3
8
|
import {
|
|
4
9
|
getSystemPrompt,
|
|
5
10
|
query
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-XXU2NVOE.js";
|
|
11
|
+
} from "./chunk-3CKC4ABU.js";
|
|
12
|
+
import "./chunk-Q2OBTLBI.js";
|
|
13
|
+
import "./chunk-UPRKGNBR.js";
|
|
14
|
+
import "./chunk-NFXLN6FJ.js";
|
|
15
|
+
import "./chunk-IVWPPTDM.js";
|
|
16
|
+
import "./chunk-KJTPUTU7.js";
|
|
13
17
|
import "./chunk-JX5ZQYTQ.js";
|
|
14
18
|
import "./chunk-XJQATPV7.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-BWYKUDJR.js";
|
|
23
|
-
import "./chunk-2EFL22PV.js";
|
|
19
|
+
import "./chunk-MUW3J7CP.js";
|
|
20
|
+
import "./chunk-MMF5RMLU.js";
|
|
21
|
+
import "./chunk-BJYXLCRS.js";
|
|
22
|
+
import "./chunk-QJ7MQIHN.js";
|
|
23
|
+
import "./chunk-IZZTKEZH.js";
|
|
24
|
+
import "./chunk-UUCRNFMH.js";
|
|
25
|
+
import "./chunk-X3NER6FY.js";
|
|
24
26
|
import "./chunk-U7S4MEYP.js";
|
|
25
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-FIMCETCB.js";
|
|
26
28
|
import "./chunk-TY3CCSAT.js";
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-INJSFEKL.js";
|
|
29
|
-
import "./chunk-2UO3BFZH.js";
|
|
29
|
+
import "./chunk-ZM5FMRLS.js";
|
|
30
30
|
import {
|
|
31
31
|
createUserMessage
|
|
32
|
-
} from "./chunk-
|
|
33
|
-
import
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
} from "./chunk-IXFBUXQW.js";
|
|
33
|
+
import "./chunk-WAXMRSVR.js";
|
|
34
|
+
import "./chunk-MJLWBVZP.js";
|
|
35
|
+
import "./chunk-KS646CDL.js";
|
|
36
|
+
import "./chunk-7ZFLZNOW.js";
|
|
37
|
+
import "./chunk-W7Q3VYAB.js";
|
|
38
|
+
import "./chunk-INJSFEKL.js";
|
|
39
|
+
import "./chunk-JI4HCLK7.js";
|
|
40
|
+
import "./chunk-JLVECHVJ.js";
|
|
41
|
+
import "./chunk-2JCTO2EY.js";
|
|
42
|
+
import "./chunk-2UO3BFZH.js";
|
|
43
|
+
import "./chunk-CHB5K4GI.js";
|
|
44
|
+
import "./chunk-QX5Y5CE5.js";
|
|
36
45
|
import {
|
|
37
46
|
getContext
|
|
38
|
-
} from "./chunk-
|
|
39
|
-
import "./chunk-
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
47
|
+
} from "./chunk-MJ3MLGVB.js";
|
|
48
|
+
import "./chunk-GVLJUD6R.js";
|
|
49
|
+
import "./chunk-U6IF5D3J.js";
|
|
50
|
+
import "./chunk-NT7RDVDA.js";
|
|
51
|
+
import "./chunk-QT5GS374.js";
|
|
43
52
|
import {
|
|
44
53
|
getMessagesPath,
|
|
54
|
+
init_log,
|
|
55
|
+
init_state,
|
|
45
56
|
overwriteLog,
|
|
46
57
|
setCwd
|
|
47
|
-
} from "./chunk-
|
|
48
|
-
import "./chunk-
|
|
58
|
+
} from "./chunk-XYQZLDRB.js";
|
|
59
|
+
import "./chunk-UYWZQVH5.js";
|
|
60
|
+
import "./chunk-EHQ2M5B4.js";
|
|
49
61
|
import {
|
|
50
62
|
getTotalCost
|
|
51
|
-
} from "./chunk-
|
|
52
|
-
import "./chunk-
|
|
63
|
+
} from "./chunk-ZMO4E7IW.js";
|
|
64
|
+
import "./chunk-HLBLZKZH.js";
|
|
65
|
+
import "./chunk-D4OZACS2.js";
|
|
53
66
|
|
|
54
67
|
// src/app/ask.ts
|
|
55
68
|
import { last } from "lodash-es";
|
|
69
|
+
init_state();
|
|
70
|
+
init_log();
|
|
56
71
|
async function ask({
|
|
57
|
-
commands,
|
|
58
72
|
safeMode,
|
|
59
73
|
hasPermissionsToUseTool,
|
|
60
74
|
messageLogName,
|
|
61
75
|
prompt,
|
|
62
76
|
cwd,
|
|
63
|
-
tools,
|
|
64
77
|
verbose = false,
|
|
65
78
|
initialMessages,
|
|
66
79
|
persistSession = true,
|
|
@@ -69,32 +82,29 @@ async function ask({
|
|
|
69
82
|
await setCwd(cwd);
|
|
70
83
|
const message = createUserMessage(prompt);
|
|
71
84
|
const messages = [...initialMessages ?? [], message];
|
|
72
|
-
const [systemPrompt, context,
|
|
85
|
+
const [systemPrompt, context, queryOpts, skillMatch] = await Promise.all([
|
|
73
86
|
getSystemPrompt({ domain }),
|
|
74
87
|
getContext(),
|
|
75
|
-
|
|
88
|
+
createQueryOptions({
|
|
89
|
+
messages,
|
|
90
|
+
safeMode,
|
|
91
|
+
messageLogName,
|
|
92
|
+
verbose,
|
|
93
|
+
persistSession
|
|
94
|
+
}),
|
|
95
|
+
matchSkillForPrompt(prompt)
|
|
76
96
|
]);
|
|
97
|
+
if (skillMatch) {
|
|
98
|
+
systemPrompt.unshift(buildSkillMatchDirective(skillMatch));
|
|
99
|
+
}
|
|
77
100
|
for await (const m of query(
|
|
78
101
|
messages,
|
|
79
102
|
systemPrompt,
|
|
80
103
|
context,
|
|
81
104
|
hasPermissionsToUseTool,
|
|
82
105
|
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
tools,
|
|
86
|
-
verbose,
|
|
87
|
-
safeMode,
|
|
88
|
-
forkNumber: 0,
|
|
89
|
-
messageLogName: "unused",
|
|
90
|
-
maxThinkingTokens: 0,
|
|
91
|
-
persistSession
|
|
92
|
-
},
|
|
93
|
-
abortController: new AbortController(),
|
|
94
|
-
messageId: void 0,
|
|
95
|
-
readFileTimestamps: {},
|
|
96
|
-
setToolJSX: () => {
|
|
97
|
-
}
|
|
106
|
+
...queryOpts,
|
|
107
|
+
abortController: new AbortController()
|
|
98
108
|
}
|
|
99
109
|
)) {
|
|
100
110
|
messages.push(m);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/app/ask.ts"],
|
|
4
|
+
"sourcesContent": ["import { last } from 'lodash-es'\r\nimport { getSystemPrompt } from '@constants/prompts'\r\nimport { getContext } from '@context'\r\nimport { getTotalCost } from '@costTracker'\r\nimport { Message, query } from '@query'\r\nimport type { CanUseToolFn } from '@newcraw-types/canUseTool'\r\nimport { setCwd } from '@utils/state'\r\nimport { getMessagesPath, overwriteLog } from '@utils/log'\r\nimport { createUserMessage } from '@utils/messages'\r\nimport { createQueryOptions } from '@core/queryOptionsFactory'\r\nimport { matchSkillForPrompt, buildSkillMatchDirective } from '@core/skillMatcher'\r\n\r\ntype Props = {\r\n safeMode?: boolean\r\n hasPermissionsToUseTool: CanUseToolFn\r\n messageLogName: string\r\n prompt: string\r\n cwd: string\r\n verbose?: boolean\r\n initialMessages?: Message[]\r\n persistSession?: boolean\r\n domain?: string\r\n}\r\n\r\nexport async function ask({\r\n safeMode,\r\n hasPermissionsToUseTool,\r\n messageLogName,\r\n prompt,\r\n cwd,\r\n verbose = false,\r\n initialMessages,\r\n persistSession = true,\r\n domain,\r\n}: Props): Promise<{\r\n resultText: string\r\n totalCost: number\r\n messageHistoryFile: string\r\n}> {\r\n await setCwd(cwd)\r\n const message = createUserMessage(prompt)\r\n const messages: Message[] = [...(initialMessages ?? []), message]\r\n\r\n const [systemPrompt, context, queryOpts, skillMatch] = await Promise.all([\r\n getSystemPrompt({ domain }),\r\n getContext(),\r\n createQueryOptions({\r\n messages,\r\n safeMode,\r\n messageLogName,\r\n verbose,\r\n persistSession,\r\n }),\r\n matchSkillForPrompt(prompt),\r\n ])\r\n\r\n if (skillMatch) {\r\n systemPrompt.unshift(buildSkillMatchDirective(skillMatch))\r\n }\r\n\r\n for await (const m of query(\r\n messages,\r\n systemPrompt,\r\n context,\r\n hasPermissionsToUseTool,\r\n {\r\n ...queryOpts,\r\n abortController: new AbortController(),\r\n },\r\n )) {\r\n messages.push(m)\r\n }\r\n\r\n const result = last(messages)\r\n if (!result || result.type !== 'assistant') {\r\n throw new Error('Expected content to be an assistant message')\r\n }\r\n\r\n const textContent = result.message.content.find(c => c.type === 'text')\r\n if (!textContent) {\r\n throw new Error(\r\n `Expected at least one text content item, but got ${JSON.stringify(\r\n result.message.content,\r\n null,\r\n 2,\r\n )}`,\r\n )\r\n }\r\n\r\n const messageHistoryFile = getMessagesPath(messageLogName, 0, 0)\r\n overwriteLog(messageHistoryFile, messages)\r\n\r\n return {\r\n resultText: textContent.text,\r\n totalCost: getTotalCost(),\r\n messageHistoryFile,\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAMrB;AACA;AAiBA,eAAsB,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAIG;AACD,QAAM,OAAO,GAAG;AAChB,QAAM,UAAU,kBAAkB,MAAM;AACxC,QAAM,WAAsB,CAAC,GAAI,mBAAmB,CAAC,GAAI,OAAO;AAEhE,QAAM,CAAC,cAAc,SAAS,WAAW,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvE,gBAAgB,EAAE,OAAO,CAAC;AAAA,IAC1B,WAAW;AAAA,IACX,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,oBAAoB,MAAM;AAAA,EAC5B,CAAC;AAED,MAAI,YAAY;AACd,iBAAa,QAAQ,yBAAyB,UAAU,CAAC;AAAA,EAC3D;AAEA,mBAAiB,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,iBAAiB,IAAI,gBAAgB;AAAA,IACvC;AAAA,EACF,GAAG;AACD,aAAS,KAAK,CAAC;AAAA,EACjB;AAEA,QAAM,SAAS,KAAK,QAAQ;AAC5B,MAAI,CAAC,UAAU,OAAO,SAAS,aAAa;AAC1C,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,QAAM,cAAc,OAAO,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AACtE,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,oDAAoD,KAAK;AAAA,QACvD,OAAO,QAAQ;AAAA,QACf;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,qBAAqB,gBAAgB,gBAAgB,GAAG,CAAC;AAC/D,eAAa,oBAAoB,QAAQ;AAEzC,SAAO;AAAA,IACL,YAAY,YAAY;AAAA,IACxB,WAAW,aAAa;AAAA,IACxB;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -5,10 +5,11 @@ import {
|
|
|
5
5
|
checkAndNotifyUpdate,
|
|
6
6
|
getLatestVersion,
|
|
7
7
|
getUpdateCommandSuggestions
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-O4EKE3YR.js";
|
|
9
|
+
import "./chunk-XYQZLDRB.js";
|
|
10
|
+
import "./chunk-UYWZQVH5.js";
|
|
11
|
+
import "./chunk-EHQ2M5B4.js";
|
|
12
|
+
import "./chunk-D4OZACS2.js";
|
|
12
13
|
export {
|
|
13
14
|
assertMinVersion,
|
|
14
15
|
checkAndNotifyUpdate,
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
|
+
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
debug,
|
|
5
|
+
init_debugLogger
|
|
6
|
+
} from "./chunk-QT5GS374.js";
|
|
7
|
+
|
|
8
|
+
// src/services/ai/healthCheck.ts
|
|
9
|
+
init_debugLogger();
|
|
10
|
+
var healthRegistry = /* @__PURE__ */ new Map();
|
|
11
|
+
var HEALTH_CHECK_INTERVAL_MS = 6e4;
|
|
12
|
+
var FAILURE_THRESHOLD = 3;
|
|
13
|
+
var RECOVERY_CHECK_INTERVAL_MS = 3e4;
|
|
14
|
+
function getProviderHealth(provider) {
|
|
15
|
+
if (!healthRegistry.has(provider)) {
|
|
16
|
+
healthRegistry.set(provider, {
|
|
17
|
+
provider,
|
|
18
|
+
available: true,
|
|
19
|
+
lastCheckedAt: 0,
|
|
20
|
+
consecutiveFailures: 0
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return healthRegistry.get(provider);
|
|
24
|
+
}
|
|
25
|
+
function markProviderSuccess(provider, latencyMs) {
|
|
26
|
+
const health = getProviderHealth(provider);
|
|
27
|
+
health.available = true;
|
|
28
|
+
health.lastCheckedAt = Date.now();
|
|
29
|
+
health.consecutiveFailures = 0;
|
|
30
|
+
health.latencyMs = latencyMs;
|
|
31
|
+
debug.flow("PROVIDER_HEALTH_SUCCESS", {
|
|
32
|
+
provider,
|
|
33
|
+
latencyMs
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function markProviderFailure(provider, error) {
|
|
37
|
+
const health = getProviderHealth(provider);
|
|
38
|
+
health.consecutiveFailures++;
|
|
39
|
+
health.lastErrorAt = Date.now();
|
|
40
|
+
health.lastCheckedAt = Date.now();
|
|
41
|
+
if (health.consecutiveFailures >= FAILURE_THRESHOLD) {
|
|
42
|
+
health.available = false;
|
|
43
|
+
debug.warn("PROVIDER_MARKED_UNAVAILABLE", {
|
|
44
|
+
provider,
|
|
45
|
+
consecutiveFailures: health.consecutiveFailures,
|
|
46
|
+
error
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function isProviderAvailable(provider) {
|
|
51
|
+
const health = getProviderHealth(provider);
|
|
52
|
+
if (health.available) return true;
|
|
53
|
+
if (health.lastCheckedAt && Date.now() - health.lastCheckedAt > RECOVERY_CHECK_INTERVAL_MS) {
|
|
54
|
+
debug.flow("PROVIDER_RECOVERY_CHECK", { provider });
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
function shouldCheckHealth(provider) {
|
|
60
|
+
const health = getProviderHealth(provider);
|
|
61
|
+
return Date.now() - health.lastCheckedAt > HEALTH_CHECK_INTERVAL_MS;
|
|
62
|
+
}
|
|
63
|
+
function selectAvailableProvider(chain) {
|
|
64
|
+
if (isProviderAvailable(chain.primary)) {
|
|
65
|
+
return chain.primary;
|
|
66
|
+
}
|
|
67
|
+
for (const fallback of chain.fallbacks) {
|
|
68
|
+
if (isProviderAvailable(fallback)) {
|
|
69
|
+
debug.flow("PROVIDER_FAILOVER", {
|
|
70
|
+
from: chain.primary,
|
|
71
|
+
to: fallback
|
|
72
|
+
});
|
|
73
|
+
return fallback;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
debug.warn("ALL_PROVIDERS_UNAVAILABLE", {
|
|
77
|
+
primary: chain.primary,
|
|
78
|
+
fallbacks: chain.fallbacks
|
|
79
|
+
});
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
var probeInterval = null;
|
|
83
|
+
var registeredProbe = null;
|
|
84
|
+
var PROBE_INTERVAL_MS = 12e4;
|
|
85
|
+
function registerHealthProbe(probe) {
|
|
86
|
+
registeredProbe = probe;
|
|
87
|
+
}
|
|
88
|
+
function startPeriodicHealthCheck(providers) {
|
|
89
|
+
if (probeInterval) return;
|
|
90
|
+
probeInterval = setInterval(async () => {
|
|
91
|
+
if (!registeredProbe) return;
|
|
92
|
+
for (const provider of providers) {
|
|
93
|
+
const health = getProviderHealth(provider);
|
|
94
|
+
if (!health.available || shouldCheckHealth(provider)) {
|
|
95
|
+
try {
|
|
96
|
+
const ok = await registeredProbe(provider);
|
|
97
|
+
if (ok) {
|
|
98
|
+
markProviderSuccess(provider);
|
|
99
|
+
} else {
|
|
100
|
+
markProviderFailure(provider, "probe returned false");
|
|
101
|
+
}
|
|
102
|
+
} catch (err) {
|
|
103
|
+
markProviderFailure(
|
|
104
|
+
provider,
|
|
105
|
+
err instanceof Error ? err.message : String(err)
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}, PROBE_INTERVAL_MS);
|
|
111
|
+
if (probeInterval && typeof probeInterval === "object" && "unref" in probeInterval) {
|
|
112
|
+
probeInterval.unref();
|
|
113
|
+
}
|
|
114
|
+
debug.flow("HEALTH_PROBE_STARTED", {
|
|
115
|
+
providers,
|
|
116
|
+
intervalMs: PROBE_INTERVAL_MS
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function stopPeriodicHealthCheck() {
|
|
120
|
+
if (probeInterval) {
|
|
121
|
+
clearInterval(probeInterval);
|
|
122
|
+
probeInterval = null;
|
|
123
|
+
debug.flow("HEALTH_PROBE_STOPPED", {});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export {
|
|
128
|
+
markProviderSuccess,
|
|
129
|
+
markProviderFailure,
|
|
130
|
+
isProviderAvailable,
|
|
131
|
+
selectAvailableProvider,
|
|
132
|
+
registerHealthProbe,
|
|
133
|
+
startPeriodicHealthCheck,
|
|
134
|
+
stopPeriodicHealthCheck
|
|
135
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/ai/healthCheck.ts"],
|
|
4
|
+
"sourcesContent": ["import { logError } from '@utils/log'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\n\r\nexport interface ProviderHealth {\r\n provider: string\r\n available: boolean\r\n lastCheckedAt: number\r\n lastErrorAt?: number\r\n consecutiveFailures: number\r\n latencyMs?: number\r\n}\r\n\r\nconst healthRegistry = new Map<string, ProviderHealth>()\r\n\r\nconst HEALTH_CHECK_INTERVAL_MS = 60_000\r\nconst FAILURE_THRESHOLD = 3\r\nconst RECOVERY_CHECK_INTERVAL_MS = 30_000\r\n\r\nexport function getProviderHealth(provider: string): ProviderHealth {\r\n if (!healthRegistry.has(provider)) {\r\n healthRegistry.set(provider, {\r\n provider,\r\n available: true,\r\n lastCheckedAt: 0,\r\n consecutiveFailures: 0,\r\n })\r\n }\r\n return healthRegistry.get(provider)!\r\n}\r\n\r\nexport function markProviderSuccess(provider: string, latencyMs?: number): void {\r\n const health = getProviderHealth(provider)\r\n health.available = true\r\n health.lastCheckedAt = Date.now()\r\n health.consecutiveFailures = 0\r\n health.latencyMs = latencyMs\r\n\r\n debugLogger.flow('PROVIDER_HEALTH_SUCCESS', {\r\n provider,\r\n latencyMs,\r\n })\r\n}\r\n\r\nexport function markProviderFailure(provider: string, error?: string): void {\r\n const health = getProviderHealth(provider)\r\n health.consecutiveFailures++\r\n health.lastErrorAt = Date.now()\r\n health.lastCheckedAt = Date.now()\r\n\r\n if (health.consecutiveFailures >= FAILURE_THRESHOLD) {\r\n health.available = false\r\n debugLogger.warn('PROVIDER_MARKED_UNAVAILABLE', {\r\n provider,\r\n consecutiveFailures: health.consecutiveFailures,\r\n error,\r\n })\r\n }\r\n}\r\n\r\nexport function isProviderAvailable(provider: string): boolean {\r\n const health = getProviderHealth(provider)\r\n\r\n if (health.available) return true\r\n\r\n if (\r\n health.lastCheckedAt &&\r\n Date.now() - health.lastCheckedAt > RECOVERY_CHECK_INTERVAL_MS\r\n ) {\r\n debugLogger.flow('PROVIDER_RECOVERY_CHECK', { provider })\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport function shouldCheckHealth(provider: string): boolean {\r\n const health = getProviderHealth(provider)\r\n return Date.now() - health.lastCheckedAt > HEALTH_CHECK_INTERVAL_MS\r\n}\r\n\r\nexport interface FallbackChain {\r\n primary: string\r\n fallbacks: string[]\r\n}\r\n\r\nexport function selectAvailableProvider(chain: FallbackChain): string | null {\r\n if (isProviderAvailable(chain.primary)) {\r\n return chain.primary\r\n }\r\n\r\n for (const fallback of chain.fallbacks) {\r\n if (isProviderAvailable(fallback)) {\r\n debugLogger.flow('PROVIDER_FAILOVER', {\r\n from: chain.primary,\r\n to: fallback,\r\n })\r\n return fallback\r\n }\r\n }\r\n\r\n debugLogger.warn('ALL_PROVIDERS_UNAVAILABLE', {\r\n primary: chain.primary,\r\n fallbacks: chain.fallbacks,\r\n })\r\n return null\r\n}\r\n\r\nexport function getAllProviderHealth(): ProviderHealth[] {\r\n return Array.from(healthRegistry.values())\r\n}\r\n\r\nexport function resetProviderHealth(provider: string): void {\r\n healthRegistry.delete(provider)\r\n}\r\n\r\nexport function resetAllHealth(): void {\r\n healthRegistry.clear()\r\n}\r\n\r\nexport type ProbeFunction = (provider: string) => Promise<boolean>\r\n\r\nlet probeInterval: ReturnType<typeof setInterval> | null = null\r\nlet registeredProbe: ProbeFunction | null = null\r\nconst PROBE_INTERVAL_MS = 120_000\r\n\r\nexport function registerHealthProbe(probe: ProbeFunction): void {\r\n registeredProbe = probe\r\n}\r\n\r\nexport function startPeriodicHealthCheck(providers: string[]): void {\r\n if (probeInterval) return\r\n\r\n probeInterval = setInterval(async () => {\r\n if (!registeredProbe) return\r\n\r\n for (const provider of providers) {\r\n const health = getProviderHealth(provider)\r\n if (!health.available || shouldCheckHealth(provider)) {\r\n try {\r\n const ok = await registeredProbe(provider)\r\n if (ok) {\r\n markProviderSuccess(provider)\r\n } else {\r\n markProviderFailure(provider, 'probe returned false')\r\n }\r\n } catch (err) {\r\n markProviderFailure(\r\n provider,\r\n err instanceof Error ? err.message : String(err),\r\n )\r\n }\r\n }\r\n }\r\n }, PROBE_INTERVAL_MS)\r\n\r\n if (probeInterval && typeof probeInterval === 'object' && 'unref' in probeInterval) {\r\n probeInterval.unref()\r\n }\r\n\r\n debugLogger.flow('HEALTH_PROBE_STARTED', {\r\n providers,\r\n intervalMs: PROBE_INTERVAL_MS,\r\n })\r\n}\r\n\r\nexport function stopPeriodicHealthCheck(): void {\r\n if (probeInterval) {\r\n clearInterval(probeInterval)\r\n probeInterval = null\r\n debugLogger.flow('HEALTH_PROBE_STOPPED', {})\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -4,19 +4,26 @@ import {
|
|
|
4
4
|
getSessionPlugins
|
|
5
5
|
} from "./chunk-2UO3BFZH.js";
|
|
6
6
|
import {
|
|
7
|
-
debug
|
|
8
|
-
|
|
7
|
+
debug,
|
|
8
|
+
init_debugLogger
|
|
9
|
+
} from "./chunk-QT5GS374.js";
|
|
9
10
|
import {
|
|
10
11
|
getCwd,
|
|
11
|
-
|
|
12
|
+
getNewcrawBaseDir,
|
|
13
|
+
init_env,
|
|
14
|
+
init_log,
|
|
15
|
+
init_state,
|
|
12
16
|
logError
|
|
13
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-XYQZLDRB.js";
|
|
14
18
|
|
|
15
19
|
// src/services/plugins/customCommands.ts
|
|
20
|
+
init_state();
|
|
16
21
|
import { existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
17
22
|
import { basename, dirname, join, relative, sep } from "path";
|
|
18
|
-
import { homedir } from "os";
|
|
19
23
|
import { memoize } from "lodash-es";
|
|
24
|
+
init_env();
|
|
25
|
+
init_debugLogger();
|
|
26
|
+
init_log();
|
|
20
27
|
import { execFile } from "child_process";
|
|
21
28
|
import { promisify } from "util";
|
|
22
29
|
import matter from "gray-matter";
|
|
@@ -110,8 +117,8 @@ function parseFrontmatter(content) {
|
|
|
110
117
|
function isSkillMarkdownFile(filePath) {
|
|
111
118
|
return /^skill\.md$/i.test(basename(filePath));
|
|
112
119
|
}
|
|
113
|
-
function
|
|
114
|
-
return
|
|
120
|
+
function getUserNewcrawBaseDir() {
|
|
121
|
+
return getNewcrawBaseDir();
|
|
115
122
|
}
|
|
116
123
|
function toBoolean(value) {
|
|
117
124
|
if (typeof value === "boolean") return value;
|
|
@@ -356,6 +363,9 @@ function loadPluginSkillDirectoryCommandsFromBaseDir(args) {
|
|
|
356
363
|
hasUserSpecifiedDescription: !!frontmatter.description,
|
|
357
364
|
source: "pluginDir",
|
|
358
365
|
scope: "project",
|
|
366
|
+
runtime: frontmatter.runtime,
|
|
367
|
+
executionScript: frontmatter["execution-script"],
|
|
368
|
+
dependencies: frontmatter.dependencies,
|
|
359
369
|
userFacingName() {
|
|
360
370
|
return effectiveDeclaredName ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName) : name;
|
|
361
371
|
},
|
|
@@ -581,6 +591,9 @@ function loadSkillDirectoryCommandsFromBaseDir(skillsDir, source, scope) {
|
|
|
581
591
|
hasUserSpecifiedDescription: !!frontmatter.description,
|
|
582
592
|
source,
|
|
583
593
|
scope,
|
|
594
|
+
runtime: frontmatter.runtime,
|
|
595
|
+
executionScript: frontmatter["execution-script"],
|
|
596
|
+
dependencies: frontmatter.dependencies,
|
|
584
597
|
userFacingName() {
|
|
585
598
|
return effectiveDeclaredName || name;
|
|
586
599
|
},
|
|
@@ -609,40 +622,24 @@ ARGUMENTS: ${trimmedArgs}`;
|
|
|
609
622
|
var loadCustomCommands = memoize(
|
|
610
623
|
async () => {
|
|
611
624
|
const cwd = getCwd();
|
|
612
|
-
const
|
|
625
|
+
const userBaseDir = getUserNewcrawBaseDir();
|
|
613
626
|
const sessionPlugins = getSessionPlugins();
|
|
614
|
-
const
|
|
615
|
-
const
|
|
616
|
-
const
|
|
617
|
-
const
|
|
618
|
-
const projectLegacySkillsDir = join(cwd, ".claude", "skills");
|
|
619
|
-
const userLegacySkillsDir = join(homedir(), ".claude", "skills");
|
|
620
|
-
const projectKodeSkillsDir = join(cwd, ".newcraw", "skills");
|
|
621
|
-
const userKodeSkillsDir = join(userKodeBaseDir, "skills");
|
|
627
|
+
const projectCommandsDir = join(cwd, ".newcraw", "commands");
|
|
628
|
+
const userCommandsDir = join(userBaseDir, "commands");
|
|
629
|
+
const projectSkillsDir = join(cwd, ".newcraw", "skills");
|
|
630
|
+
const userSkillsDir = join(userBaseDir, "skills");
|
|
622
631
|
const abortController = new AbortController();
|
|
623
632
|
const timeout = setTimeout(() => abortController.abort(), 3e3);
|
|
624
633
|
try {
|
|
625
634
|
const commandFiles = applySkillFilePreference([
|
|
626
635
|
...loadCommandMarkdownFilesFromBaseDir(
|
|
627
|
-
|
|
636
|
+
projectCommandsDir,
|
|
628
637
|
"localSettings",
|
|
629
638
|
"project",
|
|
630
639
|
abortController.signal
|
|
631
640
|
),
|
|
632
641
|
...loadCommandMarkdownFilesFromBaseDir(
|
|
633
|
-
|
|
634
|
-
"localSettings",
|
|
635
|
-
"project",
|
|
636
|
-
abortController.signal
|
|
637
|
-
),
|
|
638
|
-
...loadCommandMarkdownFilesFromBaseDir(
|
|
639
|
-
userLegacyCommandsDir,
|
|
640
|
-
"userSettings",
|
|
641
|
-
"user",
|
|
642
|
-
abortController.signal
|
|
643
|
-
),
|
|
644
|
-
...loadCommandMarkdownFilesFromBaseDir(
|
|
645
|
-
userKodeCommandsDir,
|
|
642
|
+
userCommandsDir,
|
|
646
643
|
"userSettings",
|
|
647
644
|
"user",
|
|
648
645
|
abortController.signal
|
|
@@ -651,22 +648,12 @@ var loadCustomCommands = memoize(
|
|
|
651
648
|
const fileCommands = commandFiles.map(createPromptCommandFromFile).filter((cmd) => cmd !== null);
|
|
652
649
|
const skillDirCommands = [
|
|
653
650
|
...loadSkillDirectoryCommandsFromBaseDir(
|
|
654
|
-
|
|
655
|
-
"localSettings",
|
|
656
|
-
"project"
|
|
657
|
-
),
|
|
658
|
-
...loadSkillDirectoryCommandsFromBaseDir(
|
|
659
|
-
projectKodeSkillsDir,
|
|
651
|
+
projectSkillsDir,
|
|
660
652
|
"localSettings",
|
|
661
653
|
"project"
|
|
662
654
|
),
|
|
663
655
|
...loadSkillDirectoryCommandsFromBaseDir(
|
|
664
|
-
|
|
665
|
-
"userSettings",
|
|
666
|
-
"user"
|
|
667
|
-
),
|
|
668
|
-
...loadSkillDirectoryCommandsFromBaseDir(
|
|
669
|
-
userKodeSkillsDir,
|
|
656
|
+
userSkillsDir,
|
|
670
657
|
"userSettings",
|
|
671
658
|
"user"
|
|
672
659
|
)
|
|
@@ -719,15 +706,11 @@ var loadCustomCommands = memoize(
|
|
|
719
706
|
},
|
|
720
707
|
() => {
|
|
721
708
|
const cwd = getCwd();
|
|
722
|
-
const
|
|
709
|
+
const userBaseDir = getUserNewcrawBaseDir();
|
|
723
710
|
const dirs = [
|
|
724
|
-
join(
|
|
725
|
-
join(cwd, ".claude", "commands"),
|
|
726
|
-
join(userKodeBaseDir, "commands"),
|
|
711
|
+
join(userBaseDir, "commands"),
|
|
727
712
|
join(cwd, ".newcraw", "commands"),
|
|
728
|
-
join(
|
|
729
|
-
join(cwd, ".claude", "skills"),
|
|
730
|
-
join(userKodeBaseDir, "skills"),
|
|
713
|
+
join(userBaseDir, "skills"),
|
|
731
714
|
join(cwd, ".newcraw", "skills")
|
|
732
715
|
];
|
|
733
716
|
const exists = dirs.map((d) => existsSync(d) ? "1" : "0").join("");
|
|
@@ -738,21 +721,17 @@ var reloadCustomCommands = () => {
|
|
|
738
721
|
loadCustomCommands.cache.clear();
|
|
739
722
|
};
|
|
740
723
|
function getCustomCommandDirectories() {
|
|
741
|
-
const
|
|
724
|
+
const userBaseDir = getUserNewcrawBaseDir();
|
|
742
725
|
return {
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
userKodeCommands: join(userKodeBaseDir, "commands"),
|
|
748
|
-
projectKodeCommands: join(getCwd(), ".newcraw", "commands"),
|
|
749
|
-
userKodeSkills: join(userKodeBaseDir, "skills"),
|
|
750
|
-
projectKodeSkills: join(getCwd(), ".newcraw", "skills")
|
|
726
|
+
userCommands: join(userBaseDir, "commands"),
|
|
727
|
+
projectCommands: join(getCwd(), ".newcraw", "commands"),
|
|
728
|
+
userSkills: join(userBaseDir, "skills"),
|
|
729
|
+
projectSkills: join(getCwd(), ".newcraw", "skills")
|
|
751
730
|
};
|
|
752
731
|
}
|
|
753
732
|
function hasCustomCommands() {
|
|
754
733
|
const dirs = getCustomCommandDirectories();
|
|
755
|
-
return existsSync(dirs.
|
|
734
|
+
return existsSync(dirs.userCommands) || existsSync(dirs.projectCommands) || existsSync(dirs.userSkills) || existsSync(dirs.projectSkills);
|
|
756
735
|
}
|
|
757
736
|
|
|
758
737
|
export {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/plugins/customCommands.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync, readFileSync, readdirSync, statSync } from 'fs'\nimport { basename, dirname, join, relative, resolve, sep } from 'path'\nimport { memoize } from 'lodash-es'\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { Command } from '@commands'\nimport { getCwd } from '@utils/state'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { getNewcrawBaseDir } from '@utils/config/env'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { execFile } from 'child_process'\nimport { promisify } from 'util'\nimport matter from 'gray-matter'\nimport yaml from 'js-yaml'\n\nconst execFileAsync = promisify(execFile)\n\nexport async function executeBashCommands(content: string): Promise<string> {\n const bashCommandRegex = /!\\`([^`]+)\\`/g\n const matches = [...content.matchAll(bashCommandRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const command = match[1].trim()\n\n try {\n const parts = command.split(/\\s+/)\n const cmd = parts[0]\n const args = parts.slice(1)\n\n const { stdout, stderr } = await execFileAsync(cmd, args, {\n timeout: 5000,\n encoding: 'utf8',\n cwd: getCwd(),\n })\n\n const output = stdout.trim() || stderr.trim() || '(no output)'\n result = result.replace(fullMatch, output)\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_BASH_EXEC_FAILED', {\n command,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error executing: ${command})`)\n }\n }\n\n return result\n}\n\nexport async function resolveFileReferences(content: string): Promise<string> {\n const fileRefRegex = /@([a-zA-Z0-9/._-]+(?:\\.[a-zA-Z0-9]+)?)/g\n const matches = [...content.matchAll(fileRefRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const filePath = match[1]\n\n if (filePath.startsWith('agent-')) {\n continue\n }\n\n try {\n const fullPath = join(getCwd(), filePath)\n\n if (existsSync(fullPath)) {\n const fileContent = readFileSync(fullPath, { encoding: 'utf-8' })\n\n const formattedContent = `\\n\\n## File: ${filePath}\\n\\`\\`\\`\\n${fileContent}\\n\\`\\`\\`\\n`\n result = result.replace(fullMatch, formattedContent)\n } else {\n result = result.replace(fullMatch, `(file not found: ${filePath})`)\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_FILE_READ_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error reading: ${filePath})`)\n }\n }\n\n return result\n}\n\nexport interface CustomCommandFrontmatter {\n description?: string\n 'allowed-tools'?: string[]\n 'argument-hint'?: string\n when_to_use?: string\n version?: string\n model?: string\n maxThinkingTokens?: number | string\n max_thinking_tokens?: number | string\n 'max-thinking-tokens'?: number | string\n name?: string\n 'disable-model-invocation'?: boolean | string\n runtime?: 'python' | 'node' | 'bash'\n 'execution-script'?: string\n dependencies?: string\n}\n\nexport interface CustomCommandWithScope {\n type: 'prompt'\n name: string\n description: string\n isEnabled: boolean\n isHidden: boolean\n aliases?: string[]\n progressMessage: string\n userFacingName(): string\n getPromptForCommand(args: string): Promise<MessageParam[]>\n allowedTools?: string[]\n maxThinkingTokens?: number\n argumentHint?: string\n whenToUse?: string\n version?: string\n model?: string\n isSkill?: boolean\n disableModelInvocation?: boolean\n hasUserSpecifiedDescription?: boolean\n source?: 'localSettings' | 'userSettings' | 'pluginDir'\n scope?: 'user' | 'project'\n filePath?: string\n runtime?: 'python' | 'node' | 'bash'\n executionScript?: string\n dependencies?: string\n}\n\nexport interface CustomCommandFile {\n frontmatter: CustomCommandFrontmatter\n content: string\n filePath: string\n}\n\nexport function parseFrontmatter(content: string): {\n frontmatter: CustomCommandFrontmatter\n content: string\n} {\n const yamlSchema = (yaml as any).JSON_SCHEMA\n const parsed = matter(content, {\n engines: {\n yaml: {\n parse: (input: string) =>\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\n {},\n },\n },\n })\n return {\n frontmatter: (parsed.data ?? {}) as CustomCommandFrontmatter,\n content: parsed.content ?? '',\n }\n}\n\ntype CommandSource = 'localSettings' | 'userSettings' | 'pluginDir'\n\nfunction isSkillMarkdownFile(filePath: string): boolean {\n return /^skill\\.md$/i.test(basename(filePath))\n}\n\nfunction getUserNewcrawBaseDir(): string {\n return getNewcrawBaseDir()\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n }\n return false\n}\n\nfunction parseAllowedTools(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(v => String(v).trim()).filter(Boolean)\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return []\n return trimmed\n .split(/\\s+/)\n .map(v => v.trim())\n .filter(Boolean)\n }\n return []\n}\n\nfunction parseMaxThinkingTokens(\n frontmatter: CustomCommandFrontmatter,\n): number | undefined {\n const raw =\n (frontmatter as any).maxThinkingTokens ??\n (frontmatter as any).max_thinking_tokens ??\n (frontmatter as any)['max-thinking-tokens'] ??\n (frontmatter as any)['max_thinking_tokens']\n if (raw === undefined || raw === null) return undefined\n const value = typeof raw === 'number' ? raw : Number(String(raw).trim())\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\n}\n\nfunction sourceLabel(source: CommandSource): string {\n if (source === 'localSettings') return 'project'\n if (source === 'userSettings') return 'user'\n if (source === 'pluginDir') return 'plugin'\n return 'unknown'\n}\n\nfunction extractDescriptionFromMarkdown(\n markdown: string,\n fallback: string,\n): string {\n const lines = markdown.split(/\\r?\\n/)\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const heading = trimmed.match(/^#{1,6}\\s+(.*)$/)\n if (heading?.[1]) return heading[1].trim()\n return trimmed.length > 120 ? `${trimmed.slice(0, 117)}...` : trimmed\n }\n return fallback\n}\n\nfunction namespaceFromDirPath(dirPath: string, baseDir: string): string {\n const relPath = relative(baseDir, dirPath)\n if (!relPath || relPath === '.' || relPath.startsWith('..')) return ''\n return relPath.split(sep).join(':')\n}\n\nfunction nameForCommandFile(filePath: string, baseDir: string): string {\n if (isSkillMarkdownFile(filePath)) {\n const skillDir = dirname(filePath)\n const parentDir = dirname(skillDir)\n const skillName = basename(skillDir)\n const namespace = namespaceFromDirPath(parentDir, baseDir)\n return namespace ? `${namespace}:${skillName}` : skillName\n }\n\n const dir = dirname(filePath)\n const namespace = namespaceFromDirPath(dir, baseDir)\n const fileName = basename(filePath).replace(/\\.md$/i, '')\n return namespace ? `${namespace}:${fileName}` : fileName\n}\n\ntype CommandFileRecord = {\n baseDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n source: CommandSource\n scope: 'user' | 'project'\n}\n\nfunction buildPluginQualifiedName(\n pluginName: string,\n localName: string,\n): string {\n const p = pluginName.trim()\n const l = localName.trim()\n if (!p) return l\n if (!l || l === p) return p\n return `${p}:${l}`\n}\n\nfunction nameForPluginCommandFile(\n filePath: string,\n commandsDir: string,\n pluginName: string,\n): string {\n const rel = relative(commandsDir, filePath)\n const noExt = rel.replace(/\\.md$/i, '')\n const localName = noExt.split(sep).filter(Boolean).join(':')\n return buildPluginQualifiedName(pluginName, localName)\n}\n\nfunction createPluginPromptCommandFromFile(record: {\n pluginName: string\n commandsDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n}): CustomCommandWithScope | null {\n const name = nameForPluginCommandFile(\n record.filePath,\n record.commandsDir,\n record.pluginName,\n )\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(record.content, 'Custom command')\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n return {\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage: 'running',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: false,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction loadPluginCommandsFromDir(args: {\n pluginName: string\n commandsDir: string\n signal: AbortSignal\n}): CustomCommandWithScope[] {\n let commandsBaseDir = args.commandsDir\n let files: string[] = []\n try {\n const st = statSync(args.commandsDir)\n if (st.isFile()) {\n if (!args.commandsDir.toLowerCase().endsWith('.md')) return []\n files = [args.commandsDir]\n commandsBaseDir = dirname(args.commandsDir)\n } else if (st.isDirectory()) {\n files = listMarkdownFilesRecursively(args.commandsDir, args.signal)\n } else {\n return []\n }\n } catch {\n return []\n }\n\n const out: CustomCommandWithScope[] = []\n for (const filePath of files) {\n if (args.signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n const cmd = createPluginPromptCommandFromFile({\n pluginName: args.pluginName,\n commandsDir: commandsBaseDir,\n filePath,\n frontmatter,\n content,\n })\n if (cmd) out.push(cmd)\n } catch {\n }\n }\n return out\n}\n\nfunction loadPluginSkillDirectoryCommandsFromBaseDir(args: {\n pluginName: string\n skillsDir: string\n}): CustomCommandWithScope[] {\n if (!existsSync(args.skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(args.skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(args.skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = buildPluginQualifiedName(args.pluginName, dirName)\n if (!validateName(dirName)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { dirName, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n runtime: frontmatter.runtime,\n executionScript: frontmatter['execution-script'],\n dependencies: frontmatter.dependencies,\n userFacingName() {\n return effectiveDeclaredName\n ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName)\n : name\n },\n async getPromptForCommand(argsText: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = argsText.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nfunction applySkillFilePreference(\n files: CommandFileRecord[],\n): CommandFileRecord[] {\n const grouped = new Map<string, CommandFileRecord[]>()\n for (const file of files) {\n const key = dirname(file.filePath)\n const existing = grouped.get(key) ?? []\n existing.push(file)\n grouped.set(key, existing)\n }\n\n const result: CommandFileRecord[] = []\n for (const group of grouped.values()) {\n const skillFiles = group.filter(f => isSkillMarkdownFile(f.filePath))\n if (skillFiles.length > 0) {\n result.push(skillFiles[0]!)\n continue\n }\n result.push(...group)\n }\n return result\n}\n\nfunction createPromptCommandFromFile(\n record: CommandFileRecord,\n): CustomCommandWithScope | null {\n const isSkill = isSkillMarkdownFile(record.filePath)\n const name = nameForCommandFile(record.filePath, record.baseDir)\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(\n record.content,\n isSkill ? 'Skill' : 'Custom command',\n )\n\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n const description = `${descriptionText} (${sourceLabel(record.source)})`\n const progressMessage = isSkill ? 'loading' : 'running'\n const skillBaseDir = isSkill ? dirname(record.filePath) : undefined\n\n return {\n type: 'prompt',\n name,\n description,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage,\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: record.source,\n scope: record.scope,\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n if (isSkill && skillBaseDir) {\n prompt = `Base directory for this skill: ${skillBaseDir}\\n\\n${prompt}`\n }\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction listMarkdownFilesRecursively(\n baseDir: string,\n signal: AbortSignal,\n): string[] {\n const results: string[] = []\n const queue: string[] = [baseDir]\n while (queue.length > 0) {\n if (signal.aborted) break\n const currentDir = queue.pop()!\n let entries\n try {\n entries = readdirSync(currentDir, { withFileTypes: true })\n } catch {\n continue\n }\n for (const entry of entries) {\n if (signal.aborted) break\n const fullPath = join(currentDir, entry.name)\n if (entry.isDirectory()) {\n queue.push(fullPath)\n continue\n }\n if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {\n results.push(fullPath)\n }\n }\n }\n return results\n}\n\nfunction loadCommandMarkdownFilesFromBaseDir(\n baseDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n signal: AbortSignal,\n): CommandFileRecord[] {\n if (!existsSync(baseDir)) return []\n const files = listMarkdownFilesRecursively(baseDir, signal)\n const records: CommandFileRecord[] = []\n for (const filePath of files) {\n if (signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n records.push({ baseDir, filePath, frontmatter, content, source, scope })\n } catch {\n }\n }\n return records\n}\n\nfunction loadSkillDirectoryCommandsFromBaseDir(\n skillsDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n): CustomCommandWithScope[] {\n if (!existsSync(skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = dirName\n if (!validateName(name)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { name, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel(source)})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source,\n scope,\n runtime: frontmatter.runtime,\n executionScript: frontmatter['execution-script'],\n dependencies: frontmatter.dependencies,\n userFacingName() {\n return effectiveDeclaredName || name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nexport const loadCustomCommands = memoize(\n async (): Promise<CustomCommandWithScope[]> => {\n const cwd = getCwd()\n const userBaseDir = getUserNewcrawBaseDir()\n const sessionPlugins = getSessionPlugins()\n\n const projectCommandsDir = join(cwd, '.newcraw', 'commands')\n const userCommandsDir = join(userBaseDir, 'commands')\n\n const projectSkillsDir = join(cwd, '.newcraw', 'skills')\n const userSkillsDir = join(userBaseDir, 'skills')\n\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 3000)\n\n try {\n const commandFiles = applySkillFilePreference([\n ...loadCommandMarkdownFilesFromBaseDir(\n projectCommandsDir,\n 'localSettings',\n 'project',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n userCommandsDir,\n 'userSettings',\n 'user',\n abortController.signal,\n ),\n ])\n\n const fileCommands = commandFiles\n .map(createPromptCommandFromFile)\n .filter((cmd): cmd is CustomCommandWithScope => cmd !== null)\n\n const skillDirCommands: CustomCommandWithScope[] = [\n ...loadSkillDirectoryCommandsFromBaseDir(\n projectSkillsDir,\n 'localSettings',\n 'project',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n userSkillsDir,\n 'userSettings',\n 'user',\n ),\n ]\n\n const pluginCommands: CustomCommandWithScope[] = []\n if (sessionPlugins.length > 0) {\n for (const plugin of sessionPlugins) {\n for (const commandsDir of plugin.commandsDirs) {\n pluginCommands.push(\n ...loadPluginCommandsFromDir({\n pluginName: plugin.name,\n commandsDir,\n signal: abortController.signal,\n }),\n )\n }\n for (const skillsDir of plugin.skillsDirs) {\n pluginCommands.push(\n ...loadPluginSkillDirectoryCommandsFromBaseDir({\n pluginName: plugin.name,\n skillsDir,\n }),\n )\n }\n }\n }\n\n const ordered = [\n ...fileCommands,\n ...skillDirCommands,\n ...pluginCommands,\n ].filter(cmd => cmd.isEnabled)\n\n const seen = new Set<string>()\n const unique: CustomCommandWithScope[] = []\n for (const cmd of ordered) {\n const key = cmd.userFacingName()\n if (seen.has(key)) continue\n seen.add(key)\n unique.push(cmd)\n }\n\n return unique\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMANDS_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return []\n } finally {\n clearTimeout(timeout)\n }\n },\n () => {\n const cwd = getCwd()\n const userBaseDir = getUserNewcrawBaseDir()\n const dirs = [\n join(userBaseDir, 'commands'),\n join(cwd, '.newcraw', 'commands'),\n join(userBaseDir, 'skills'),\n join(cwd, '.newcraw', 'skills'),\n ]\n const exists = dirs.map(d => (existsSync(d) ? '1' : '0')).join('')\n return `${cwd}:${exists}:${Math.floor(Date.now() / 60000)}`\n },\n)\n\nexport const reloadCustomCommands = (): void => {\n loadCustomCommands.cache.clear()\n}\n\nexport function getCustomCommandDirectories(): {\n userCommands: string\n projectCommands: string\n userSkills: string\n projectSkills: string\n} {\n const userBaseDir = getUserNewcrawBaseDir()\n return {\n userCommands: join(userBaseDir, 'commands'),\n projectCommands: join(getCwd(), '.newcraw', 'commands'),\n userSkills: join(userBaseDir, 'skills'),\n projectSkills: join(getCwd(), '.newcraw', 'skills'),\n }\n}\n\nexport function hasCustomCommands(): boolean {\n const dirs = getCustomCommandDirectories()\n return (\n existsSync(dirs.userCommands) ||\n existsSync(dirs.projectCommands) ||\n existsSync(dirs.userSkills) ||\n existsSync(dirs.projectSkills)\n )\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAKA;AALA,SAAS,YAAY,cAAc,aAAa,gBAAgB;AAChE,SAAS,UAAU,SAAS,MAAM,UAAmB,WAAW;AAChE,SAAS,eAAe;AAKxB;AACA;AACA;AACA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,OAAO,YAAY;AACnB,OAAO,UAAU;AAEjB,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAsB,oBAAoB,SAAkC;AAC1E,QAAM,mBAAmB;AACzB,QAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,gBAAgB,CAAC;AAEtD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,UAAU,MAAM,CAAC,EAAE,KAAK;AAE9B,QAAI;AACF,YAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,YAAM,MAAM,MAAM,CAAC;AACnB,YAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,KAAK,MAAM;AAAA,QACxD,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK,OAAO;AAAA,MACd,CAAC;AAED,YAAM,SAAS,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK;AACjD,eAAS,OAAO,QAAQ,WAAW,MAAM;AAAA,IAC3C,SAAS,OAAO;AACd,eAAS,KAAK;AACd,YAAY,KAAK,mCAAmC;AAAA,QAClD;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,eAAS,OAAO,QAAQ,WAAW,qBAAqB,OAAO,GAAG;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,sBAAsB,SAAkC;AAC5E,QAAM,eAAe;AACrB,QAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,YAAY,CAAC;AAElD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,WAAW,MAAM,CAAC;AAExB,QAAI,SAAS,WAAW,QAAQ,GAAG;AACjC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,KAAK,OAAO,GAAG,QAAQ;AAExC,UAAI,WAAW,QAAQ,GAAG;AACxB,cAAM,cAAc,aAAa,UAAU,EAAE,UAAU,QAAQ,CAAC;AAEhE,cAAM,mBAAmB;AAAA;AAAA,WAAgB,QAAQ;AAAA;AAAA,EAAa,WAAW;AAAA;AAAA;AACzE,iBAAS,OAAO,QAAQ,WAAW,gBAAgB;AAAA,MACrD,OAAO;AACL,iBAAS,OAAO,QAAQ,WAAW,oBAAoB,QAAQ,GAAG;AAAA,MACpE;AAAA,IACF,SAAS,OAAO;AACd,eAAS,KAAK;AACd,YAAY,KAAK,mCAAmC;AAAA,QAClD;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,eAAS,OAAO,QAAQ,WAAW,mBAAmB,QAAQ,GAAG;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AACT;AAoDO,SAAS,iBAAiB,SAG/B;AACA,QAAM,aAAc,KAAa;AACjC,QAAM,SAAS,OAAO,SAAS;AAAA,IAC7B,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,OAAO,CAAC,UACN,KAAK,KAAK,OAAO,aAAa,EAAE,QAAQ,WAAW,IAAI,MAAS,KAChE,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,aAAc,OAAO,QAAQ,CAAC;AAAA,IAC9B,SAAS,OAAO,WAAW;AAAA,EAC7B;AACF;AAIA,SAAS,oBAAoB,UAA2B;AACtD,SAAO,eAAe,KAAK,SAAS,QAAQ,CAAC;AAC/C;AAEA,SAAS,wBAAgC;AACvC,SAAO,kBAAkB;AAC3B;AAEA,SAAS,UAAU,OAAyB;AAC1C,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAI,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,UAAU,EAAG,QAAO;AAC5D,QAAI,CAAC,KAAK,SAAS,MAAM,KAAK,EAAE,SAAS,UAAU,EAAG,QAAO;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA0B;AACnD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,OAAK,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,EACxD;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,QACJ,MAAM,KAAK,EACX,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAAA,EACnB;AACA,SAAO,CAAC;AACV;AAEA,SAAS,uBACP,aACoB;AACpB,QAAM,MACH,YAAoB,qBACpB,YAAoB,uBACpB,YAAoB,qBAAqB,KACzC,YAAoB,qBAAqB;AAC5C,MAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,QAAM,QAAQ,OAAO,QAAQ,WAAW,MAAM,OAAO,OAAO,GAAG,EAAE,KAAK,CAAC;AACvE,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,QAAO;AACjD,SAAO,KAAK,MAAM,KAAK;AACzB;AAEA,SAAS,YAAY,QAA+B;AAClD,MAAI,WAAW,gBAAiB,QAAO;AACvC,MAAI,WAAW,eAAgB,QAAO;AACtC,MAAI,WAAW,YAAa,QAAO;AACnC,SAAO;AACT;AAEA,SAAS,+BACP,UACA,UACQ;AACR,QAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,UAAM,UAAU,QAAQ,MAAM,iBAAiB;AAC/C,QAAI,UAAU,CAAC,EAAG,QAAO,QAAQ,CAAC,EAAE,KAAK;AACzC,WAAO,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,QAAQ;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAiB,SAAyB;AACtE,QAAM,UAAU,SAAS,SAAS,OAAO;AACzC,MAAI,CAAC,WAAW,YAAY,OAAO,QAAQ,WAAW,IAAI,EAAG,QAAO;AACpE,SAAO,QAAQ,MAAM,GAAG,EAAE,KAAK,GAAG;AACpC;AAEA,SAAS,mBAAmB,UAAkB,SAAyB;AACrE,MAAI,oBAAoB,QAAQ,GAAG;AACjC,UAAM,WAAW,QAAQ,QAAQ;AACjC,UAAM,YAAY,QAAQ,QAAQ;AAClC,UAAM,YAAY,SAAS,QAAQ;AACnC,UAAMA,aAAY,qBAAqB,WAAW,OAAO;AACzD,WAAOA,aAAY,GAAGA,UAAS,IAAI,SAAS,KAAK;AAAA,EACnD;AAEA,QAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAM,YAAY,qBAAqB,KAAK,OAAO;AACnD,QAAM,WAAW,SAAS,QAAQ,EAAE,QAAQ,UAAU,EAAE;AACxD,SAAO,YAAY,GAAG,SAAS,IAAI,QAAQ,KAAK;AAClD;AAWA,SAAS,yBACP,YACA,WACQ;AACR,QAAM,IAAI,WAAW,KAAK;AAC1B,QAAM,IAAI,UAAU,KAAK;AACzB,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,CAAC,KAAK,MAAM,EAAG,QAAO;AAC1B,SAAO,GAAG,CAAC,IAAI,CAAC;AAClB;AAEA,SAAS,yBACP,UACA,aACA,YACQ;AACR,QAAM,MAAM,SAAS,aAAa,QAAQ;AAC1C,QAAM,QAAQ,IAAI,QAAQ,UAAU,EAAE;AACtC,QAAM,YAAY,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC3D,SAAO,yBAAyB,YAAY,SAAS;AACvD;AAEA,SAAS,kCAAkC,QAMT;AAChC,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,kBACJ,OAAO,YAAY,eACnB,+BAA+B,OAAO,SAAS,gBAAgB;AACjE,QAAM,eAAe,kBAAkB,OAAO,YAAY,eAAe,CAAC;AAC1E,QAAM,oBAAoB,uBAAuB,OAAO,WAAW;AACnE,QAAM,eAAe,OAAO,YAAY,eAAe;AACvD,QAAM,YAAY,OAAO,YAAY;AACrC,QAAM,UAAU,OAAO,YAAY;AACnC,QAAM,yBAAyB;AAAA,IAC7B,OAAO,YAAY,0BAA0B;AAAA,EAC/C;AACA,QAAM,QACJ,OAAO,YAAY,UAAU,YACzB,SACA,OAAO,YAAY;AAEzB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,aAAa,GAAG,eAAe,KAAK,YAAY,WAAW,CAAC;AAAA,IAC5D,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,SAAS,CAAC;AAAA,IACV,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,6BAA6B,CAAC,CAAC,OAAO,YAAY;AAAA,IAClD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBAAiB;AACf,aAAO;AAAA,IACT;AAAA,IACA,MAAM,oBAAoB,MAAuC;AAC/D,UAAI,SAAS,OAAO;AACpB,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,aAAa;AACf,YAAI,OAAO,SAAS,YAAY,GAAG;AACjC,mBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,QACtD,OAAO;AACL,mBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,QACjD;AAAA,MACF;AACA,aAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,MAIN;AAC3B,MAAI,kBAAkB,KAAK;AAC3B,MAAI,QAAkB,CAAC;AACvB,MAAI;AACF,UAAM,KAAK,SAAS,KAAK,WAAW;AACpC,QAAI,GAAG,OAAO,GAAG;AACf,UAAI,CAAC,KAAK,YAAY,YAAY,EAAE,SAAS,KAAK,EAAG,QAAO,CAAC;AAC7D,cAAQ,CAAC,KAAK,WAAW;AACzB,wBAAkB,QAAQ,KAAK,WAAW;AAAA,IAC5C,WAAW,GAAG,YAAY,GAAG;AAC3B,cAAQ,6BAA6B,KAAK,aAAa,KAAK,MAAM;AAAA,IACpE,OAAO;AACL,aAAO,CAAC;AAAA,IACV;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAgC,CAAC;AACvC,aAAW,YAAY,OAAO;AAC5B,QAAI,KAAK,OAAO,QAAS;AACzB,QAAI;AACF,YAAM,MAAM,aAAa,UAAU,MAAM;AACzC,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AACrD,YAAM,MAAM,kCAAkC;AAAA,QAC5C,YAAY,KAAK;AAAA,QACjB,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,IAAK,KAAI,KAAK,GAAG;AAAA,IACvB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,4CAA4C,MAGxB;AAC3B,MAAI,CAAC,WAAW,KAAK,SAAS,EAAG,QAAO,CAAC;AAEzC,QAAM,MAAgC,CAAC;AACvC,MAAI;AACJ,MAAI;AACF,cAAU,YAAY,KAAK,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,EAC/D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,UAAU,QAAQ,IAAI,qBAAqB;AAC9D,QAAM,eAAe,CAAC,cAA+B;AACnD,QAAI,UAAU,SAAS,KAAK,UAAU,SAAS,GAAI,QAAO;AAC1D,WAAO,6BAA6B,KAAK,SAAS;AAAA,EACpD;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,eAAe,EAAG;AACrD,UAAM,WAAW,KAAK,KAAK,WAAW,MAAM,IAAI;AAChD,UAAM,sBAAsB;AAAA,MAC1B,KAAK,UAAU,UAAU;AAAA,MACzB,KAAK,UAAU,UAAU;AAAA,IAC3B;AACA,UAAM,YAAY,oBAAoB,KAAK,OAAK,WAAW,CAAC,CAAC;AAC7D,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,MAAM,aAAa,WAAW,MAAM;AAC1C,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AAErD,YAAM,UAAU,MAAM;AACtB,YAAM,eACJ,OAAQ,YAAoB,SAAS,WACjC,OAAQ,YAAoB,IAAI,EAAE,KAAK,IACvC;AACN,YAAM,wBACJ,gBAAgB,iBAAiB,UAAU,eAAe;AAC5D,UAAI,gBAAgB,iBAAiB,SAAS;AAC5C,YAAI,WAAY;AAChB,cAAY,KAAK,sCAAsC;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,OAAO,yBAAyB,KAAK,YAAY,OAAO;AAC9D,UAAI,CAAC,aAAa,OAAO,GAAG;AAC1B,YAAI,WAAY;AAChB,cAAY,KAAK,oCAAoC,EAAE,SAAS,UAAU,CAAC;AAAA,MAC7E;AACA,YAAM,kBACJ,YAAY,eACZ,+BAA+B,SAAS,OAAO;AACjD,UAAI,YAAY;AACd,cAAM,IACJ,OAAO,YAAY,gBAAgB,WAC/B,YAAY,YAAY,KAAK,IAC7B;AACN,YAAI,CAAC,KAAK,EAAE,SAAS,KAAM;AAAA,MAC7B;AAEA,YAAM,eAAe,kBAAkB,YAAY,eAAe,CAAC;AACnE,YAAM,oBAAoB,uBAAuB,WAAkB;AACnE,YAAM,eAAe,YAAY,eAAe;AAChD,YAAM,YAAY,YAAY;AAC9B,YAAM,UAAU,YAAY;AAC5B,YAAM,yBAAyB;AAAA,QAC7B,YAAY,0BAA0B;AAAA,MACxC;AACA,YAAM,QACJ,YAAY,UAAU,YAAY,SAAY,YAAY;AAE5D,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,aAAa,GAAG,eAAe,KAAK,YAAY,WAAW,CAAC;AAAA,QAC5D,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,QACV,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,6BAA6B,CAAC,CAAC,YAAY;AAAA,QAC3C,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,SAAS,YAAY;AAAA,QACrB,iBAAiB,YAAY,kBAAkB;AAAA,QAC/C,cAAc,YAAY;AAAA,QAC1B,iBAAiB;AACf,iBAAO,wBACH,yBAAyB,KAAK,YAAY,qBAAqB,IAC/D;AAAA,QACN;AAAA,QACA,MAAM,oBAAoB,UAA2C;AACnE,cAAI,SAAS,kCAAkC,QAAQ;AAAA;AAAA,EAAO,OAAO;AACrE,gBAAM,cAAc,SAAS,KAAK;AAClC,cAAI,aAAa;AACf,gBAAI,OAAO,SAAS,YAAY,GAAG;AACjC,uBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,YACtD,OAAO;AACL,uBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,YACjD;AAAA,UACF;AACA,iBAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,OACqB;AACrB,QAAM,UAAU,oBAAI,IAAiC;AACrD,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,QAAQ,KAAK,QAAQ;AACjC,UAAM,WAAW,QAAQ,IAAI,GAAG,KAAK,CAAC;AACtC,aAAS,KAAK,IAAI;AAClB,YAAQ,IAAI,KAAK,QAAQ;AAAA,EAC3B;AAEA,QAAM,SAA8B,CAAC;AACrC,aAAW,SAAS,QAAQ,OAAO,GAAG;AACpC,UAAM,aAAa,MAAM,OAAO,OAAK,oBAAoB,EAAE,QAAQ,CAAC;AACpE,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO,KAAK,WAAW,CAAC,CAAE;AAC1B;AAAA,IACF;AACA,WAAO,KAAK,GAAG,KAAK;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,4BACP,QAC+B;AAC/B,QAAM,UAAU,oBAAoB,OAAO,QAAQ;AACnD,QAAM,OAAO,mBAAmB,OAAO,UAAU,OAAO,OAAO;AAC/D,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,kBACJ,OAAO,YAAY,eACnB;AAAA,IACE,OAAO;AAAA,IACP,UAAU,UAAU;AAAA,EACtB;AAEF,QAAM,eAAe,kBAAkB,OAAO,YAAY,eAAe,CAAC;AAC1E,QAAM,oBAAoB,uBAAuB,OAAO,WAAW;AACnE,QAAM,eAAe,OAAO,YAAY,eAAe;AACvD,QAAM,YAAY,OAAO,YAAY;AACrC,QAAM,UAAU,OAAO,YAAY;AACnC,QAAM,yBAAyB;AAAA,IAC7B,OAAO,YAAY,0BAA0B;AAAA,EAC/C;AACA,QAAM,QACJ,OAAO,YAAY,UAAU,YACzB,SACA,OAAO,YAAY;AAEzB,QAAM,cAAc,GAAG,eAAe,KAAK,YAAY,OAAO,MAAM,CAAC;AACrE,QAAM,kBAAkB,UAAU,YAAY;AAC9C,QAAM,eAAe,UAAU,QAAQ,OAAO,QAAQ,IAAI;AAE1D,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,SAAS,CAAC;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,6BAA6B,CAAC,CAAC,OAAO,YAAY;AAAA,IAClD,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,iBAAiB;AACf,aAAO;AAAA,IACT;AAAA,IACA,MAAM,oBAAoB,MAAuC;AAC/D,UAAI,SAAS,OAAO;AACpB,UAAI,WAAW,cAAc;AAC3B,iBAAS,kCAAkC,YAAY;AAAA;AAAA,EAAO,MAAM;AAAA,MACtE;AACA,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,aAAa;AACf,YAAI,OAAO,SAAS,YAAY,GAAG;AACjC,mBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,QACtD,OAAO;AACL,mBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,QACjD;AAAA,MACF;AACA,aAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAAS,6BACP,SACA,QACU;AACV,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAAkB,CAAC,OAAO;AAChC,SAAO,MAAM,SAAS,GAAG;AACvB,QAAI,OAAO,QAAS;AACpB,UAAM,aAAa,MAAM,IAAI;AAC7B,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,IAC3D,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,OAAO,QAAS;AACpB,YAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAC5C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,QAAQ;AACnB;AAAA,MACF;AACA,UAAI,MAAM,OAAO,KAAK,MAAM,KAAK,YAAY,EAAE,SAAS,KAAK,GAAG;AAC9D,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oCACP,SACA,QACA,OACA,QACqB;AACrB,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO,CAAC;AAClC,QAAM,QAAQ,6BAA6B,SAAS,MAAM;AAC1D,QAAM,UAA+B,CAAC;AACtC,aAAW,YAAY,OAAO;AAC5B,QAAI,OAAO,QAAS;AACpB,QAAI;AACF,YAAM,MAAM,aAAa,UAAU,MAAM;AACzC,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AACrD,cAAQ,KAAK,EAAE,SAAS,UAAU,aAAa,SAAS,QAAQ,MAAM,CAAC;AAAA,IACzE,QAAQ;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sCACP,WACA,QACA,OAC0B;AAC1B,MAAI,CAAC,WAAW,SAAS,EAAG,QAAO,CAAC;AAEpC,QAAM,MAAgC,CAAC;AACvC,MAAI;AACJ,MAAI;AACF,cAAU,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,UAAU,QAAQ,IAAI,qBAAqB;AAC9D,QAAM,eAAe,CAAC,cAA+B;AACnD,QAAI,UAAU,SAAS,KAAK,UAAU,SAAS,GAAI,QAAO;AAC1D,WAAO,6BAA6B,KAAK,SAAS;AAAA,EACpD;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,eAAe,EAAG;AACrD,UAAM,WAAW,KAAK,WAAW,MAAM,IAAI;AAC3C,UAAM,sBAAsB;AAAA,MAC1B,KAAK,UAAU,UAAU;AAAA,MACzB,KAAK,UAAU,UAAU;AAAA,IAC3B;AACA,UAAM,YAAY,oBAAoB,KAAK,OAAK,WAAW,CAAC,CAAC;AAC7D,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,MAAM,aAAa,WAAW,MAAM;AAC1C,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AAErD,YAAM,UAAU,MAAM;AACtB,YAAM,eACJ,OAAQ,YAAoB,SAAS,WACjC,OAAQ,YAAoB,IAAI,EAAE,KAAK,IACvC;AACN,YAAM,wBACJ,gBAAgB,iBAAiB,UAAU,eAAe;AAC5D,UAAI,gBAAgB,iBAAiB,SAAS;AAC5C,YAAI,WAAY;AAChB,cAAY,KAAK,sCAAsC;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,OAAO;AACb,UAAI,CAAC,aAAa,IAAI,GAAG;AACvB,YAAI,WAAY;AAChB,cAAY,KAAK,oCAAoC,EAAE,MAAM,UAAU,CAAC;AAAA,MAC1E;AACA,YAAM,kBACJ,YAAY,eACZ,+BAA+B,SAAS,OAAO;AACjD,UAAI,YAAY;AACd,cAAM,IACJ,OAAO,YAAY,gBAAgB,WAC/B,YAAY,YAAY,KAAK,IAC7B;AACN,YAAI,CAAC,KAAK,EAAE,SAAS,KAAM;AAAA,MAC7B;AAEA,YAAM,eAAe,kBAAkB,YAAY,eAAe,CAAC;AACnE,YAAM,oBAAoB,uBAAuB,WAAkB;AACnE,YAAM,eAAe,YAAY,eAAe;AAChD,YAAM,YAAY,YAAY;AAC9B,YAAM,UAAU,YAAY;AAC5B,YAAM,yBAAyB;AAAA,QAC7B,YAAY,0BAA0B;AAAA,MACxC;AACA,YAAM,QACJ,YAAY,UAAU,YAAY,SAAY,YAAY;AAE5D,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,aAAa,GAAG,eAAe,KAAK,YAAY,MAAM,CAAC;AAAA,QACvD,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,QACV,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,6BAA6B,CAAC,CAAC,YAAY;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,SAAS,YAAY;AAAA,QACrB,iBAAiB,YAAY,kBAAkB;AAAA,QAC/C,cAAc,YAAY;AAAA,QAC1B,iBAAiB;AACf,iBAAO,yBAAyB;AAAA,QAClC;AAAA,QACA,MAAM,oBAAoB,MAAuC;AAC/D,cAAI,SAAS,kCAAkC,QAAQ;AAAA;AAAA,EAAO,OAAO;AACrE,gBAAM,cAAc,KAAK,KAAK;AAC9B,cAAI,aAAa;AACf,gBAAI,OAAO,SAAS,YAAY,GAAG;AACjC,uBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,YACtD,OAAO;AACL,uBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,YACjD;AAAA,UACF;AACA,iBAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,qBAAqB;AAAA,EAChC,YAA+C;AAC7C,UAAM,MAAM,OAAO;AACnB,UAAM,cAAc,sBAAsB;AAC1C,UAAM,iBAAiB,kBAAkB;AAEzC,UAAM,qBAAqB,KAAK,KAAK,YAAY,UAAU;AAC3D,UAAM,kBAAkB,KAAK,aAAa,UAAU;AAEpD,UAAM,mBAAmB,KAAK,KAAK,YAAY,QAAQ;AACvD,UAAM,gBAAgB,KAAK,aAAa,QAAQ;AAEhD,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,UAAU,WAAW,MAAM,gBAAgB,MAAM,GAAG,GAAI;AAE9D,QAAI;AACF,YAAM,eAAe,yBAAyB;AAAA,QAC5C,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AAED,YAAM,eAAe,aAClB,IAAI,2BAA2B,EAC/B,OAAO,CAAC,QAAuC,QAAQ,IAAI;AAE9D,YAAM,mBAA6C;AAAA,QACjD,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,iBAA2C,CAAC;AAClD,UAAI,eAAe,SAAS,GAAG;AAC7B,mBAAW,UAAU,gBAAgB;AACnC,qBAAW,eAAe,OAAO,cAAc;AAC7C,2BAAe;AAAA,cACb,GAAG,0BAA0B;AAAA,gBAC3B,YAAY,OAAO;AAAA,gBACnB;AAAA,gBACA,QAAQ,gBAAgB;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF;AACA,qBAAW,aAAa,OAAO,YAAY;AACzC,2BAAe;AAAA,cACb,GAAG,4CAA4C;AAAA,gBAC7C,YAAY,OAAO;AAAA,gBACnB;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU;AAAA,QACd,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,EAAE,OAAO,SAAO,IAAI,SAAS;AAE7B,YAAM,OAAO,oBAAI,IAAY;AAC7B,YAAM,SAAmC,CAAC;AAC1C,iBAAW,OAAO,SAAS;AACzB,cAAM,MAAM,IAAI,eAAe;AAC/B,YAAI,KAAK,IAAI,GAAG,EAAG;AACnB,aAAK,IAAI,GAAG;AACZ,eAAO,KAAK,GAAG;AAAA,MACjB;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,eAAS,KAAK;AACd,YAAY,KAAK,+BAA+B;AAAA,QAC9C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EACA,MAAM;AACJ,UAAM,MAAM,OAAO;AACnB,UAAM,cAAc,sBAAsB;AAC1C,UAAM,OAAO;AAAA,MACX,KAAK,aAAa,UAAU;AAAA,MAC5B,KAAK,KAAK,YAAY,UAAU;AAAA,MAChC,KAAK,aAAa,QAAQ;AAAA,MAC1B,KAAK,KAAK,YAAY,QAAQ;AAAA,IAChC;AACA,UAAM,SAAS,KAAK,IAAI,OAAM,WAAW,CAAC,IAAI,MAAM,GAAI,EAAE,KAAK,EAAE;AACjE,WAAO,GAAG,GAAG,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,GAAK,CAAC;AAAA,EAC3D;AACF;AAEO,IAAM,uBAAuB,MAAY;AAC9C,qBAAmB,MAAM,MAAM;AACjC;AAEO,SAAS,8BAKd;AACA,QAAM,cAAc,sBAAsB;AAC1C,SAAO;AAAA,IACL,cAAc,KAAK,aAAa,UAAU;AAAA,IAC1C,iBAAiB,KAAK,OAAO,GAAG,YAAY,UAAU;AAAA,IACtD,YAAY,KAAK,aAAa,QAAQ;AAAA,IACtC,eAAe,KAAK,OAAO,GAAG,YAAY,QAAQ;AAAA,EACpD;AACF;AAEO,SAAS,oBAA6B;AAC3C,QAAM,OAAO,4BAA4B;AACzC,SACE,WAAW,KAAK,YAAY,KAC5B,WAAW,KAAK,eAAe,KAC/B,WAAW,KAAK,UAAU,KAC1B,WAAW,KAAK,aAAa;AAEjC;",
|
|
6
|
+
"names": ["namespace"]
|
|
7
|
+
}
|