newcraw 1.0.2 → 1.0.3
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-CTTH53A7.js +50 -0
- package/dist/{acp-J4WDYGRX.js → acp-25PIN25O.js} +69 -40
- package/dist/acp-25PIN25O.js.map +7 -0
- package/dist/{agentsValidate-UBOER2IN.js → agentsValidate-BXDD54YP.js} +13 -10
- package/dist/{agentsValidate-UBOER2IN.js.map → agentsValidate-BXDD54YP.js.map} +1 -1
- package/dist/{ask-MGUO3L35.js → ask-EL4XAA5P.js} +62 -52
- package/dist/ask-EL4XAA5P.js.map +7 -0
- package/dist/{autoUpdater-2GS6LRPK.js → autoUpdater-DKMSJXWW.js} +5 -4
- package/dist/{chunk-2C43OXE7.js → chunk-2OVXJBJV.js} +38 -59
- package/dist/chunk-2OVXJBJV.js.map +7 -0
- package/dist/{chunk-53A4JHFW.js → chunk-3D3C7MRI.js} +23 -4
- package/dist/chunk-3D3C7MRI.js.map +7 -0
- package/dist/{chunk-VKI7ORIO.js → chunk-3ZQRACCP.js} +37 -18
- package/dist/{chunk-VKI7ORIO.js.map → chunk-3ZQRACCP.js.map} +1 -1
- package/dist/chunk-4A6CDBDH.js +822 -0
- package/dist/chunk-4A6CDBDH.js.map +7 -0
- package/dist/{chunk-VQSCECTS.js → chunk-53VETVCP.js} +6 -4
- package/dist/{chunk-VQSCECTS.js.map → chunk-53VETVCP.js.map} +1 -1
- package/dist/{chunk-WWDVA4NV.js → chunk-6WT3ZRYF.js} +22 -6
- package/dist/{chunk-WWDVA4NV.js.map → chunk-6WT3ZRYF.js.map} +1 -1
- package/dist/{chunk-RUXIBQ3B.js → chunk-7E2L7EH2.js} +4 -4
- package/dist/{chunk-VHS2MZQS.js → chunk-7PWVUHQ2.js} +9 -6
- package/dist/{chunk-VHS2MZQS.js.map → chunk-7PWVUHQ2.js.map} +1 -1
- package/dist/{chunk-2EFL22PV.js → chunk-ADJ4YEII.js} +7 -3
- package/dist/chunk-ADJ4YEII.js.map +7 -0
- package/dist/chunk-AKNZJBBU.js +372 -0
- package/dist/chunk-AKNZJBBU.js.map +7 -0
- package/dist/chunk-ALQSPHXV.js +135 -0
- package/dist/chunk-ALQSPHXV.js.map +7 -0
- package/dist/{chunk-XS6PU75S.js → chunk-APSIF3YK.js} +1 -1
- package/dist/{chunk-IM33F5CM.js → chunk-BMJ5XGFR.js} +1668 -1623
- package/dist/chunk-BMJ5XGFR.js.map +7 -0
- package/dist/chunk-BQCOSNM3.js +93 -0
- package/dist/chunk-BQCOSNM3.js.map +7 -0
- package/dist/{chunk-OJIMOLIC.js → chunk-BTCASL4X.js} +3621 -7413
- package/dist/chunk-BTCASL4X.js.map +7 -0
- package/dist/chunk-CHB5K4GI.js +107 -0
- package/dist/chunk-CHB5K4GI.js.map +7 -0
- package/dist/{chunk-QH2M65BR.js → chunk-D2FSAFMO.js} +7 -3
- package/dist/{chunk-QH2M65BR.js.map → chunk-D2FSAFMO.js.map} +1 -1
- package/dist/chunk-D4OZACS2.js +35 -0
- package/dist/{chunk-IIFUDVGS.js → chunk-ENLHVQCX.js} +310 -177
- package/dist/chunk-ENLHVQCX.js.map +7 -0
- package/dist/{chunk-A7X6OCZE.js → chunk-ERKWSZ3K.js} +1 -1
- package/dist/{chunk-UYRR6F5S.js → chunk-FSSZHQEJ.js} +9 -3
- package/dist/{chunk-UYRR6F5S.js.map → chunk-FSSZHQEJ.js.map} +1 -1
- package/dist/chunk-GV73HKJO.js +5473 -0
- package/dist/chunk-GV73HKJO.js.map +7 -0
- package/dist/{chunk-GZTCXXSS.js → chunk-GZ4BEVMZ.js} +57 -46
- package/dist/{chunk-GZTCXXSS.js.map → chunk-GZ4BEVMZ.js.map} +1 -1
- package/dist/chunk-HLBLZKZH.js +45 -0
- package/dist/chunk-HLBLZKZH.js.map +7 -0
- package/dist/chunk-JLVECHVJ.js +36 -0
- package/dist/chunk-JLVECHVJ.js.map +7 -0
- package/dist/chunk-KNSAVNMD.js +683 -0
- package/dist/{chunk-F3COCCAE.js.map → chunk-KNSAVNMD.js.map} +1 -1
- package/dist/{chunk-V5U6BHT2.js → chunk-KRN3WHHL.js} +7 -3
- package/dist/{chunk-V5U6BHT2.js.map → chunk-KRN3WHHL.js.map} +1 -1
- package/dist/{chunk-3LMXSKZ7.js → chunk-NFYAVT54.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-NW7WSLD5.js +166 -0
- package/dist/{chunk-ZYSVG4X3.js.map → chunk-NW7WSLD5.js.map} +2 -2
- package/dist/{chunk-HSJ6HYAO.js → chunk-P52SGBC4.js} +18 -10
- package/dist/chunk-P52SGBC4.js.map +7 -0
- package/dist/{chunk-XXU2NVOE.js → chunk-PC6QOCGI.js} +30 -6
- package/dist/chunk-PC6QOCGI.js.map +7 -0
- 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-DEF3KFP7.js → chunk-QZFKONA3.js} +4 -2
- package/dist/{chunk-DEF3KFP7.js.map → chunk-QZFKONA3.js.map} +1 -1
- package/dist/{chunk-JWXQNBBA.js → chunk-RE226X4F.js} +7 -1
- package/dist/{chunk-JWXQNBBA.js.map → chunk-RE226X4F.js.map} +1 -1
- package/dist/chunk-RF57YWGW.js +88 -0
- package/dist/chunk-RF57YWGW.js.map +7 -0
- package/dist/chunk-UGBECBIR.js +62 -0
- package/dist/chunk-UGBECBIR.js.map +7 -0
- package/dist/chunk-UYWZQVH5.js +35 -0
- package/dist/chunk-UYWZQVH5.js.map +7 -0
- package/dist/{chunk-LOIZNQOU.js → chunk-VHZRJ7RI.js} +9 -3
- package/dist/{chunk-LOIZNQOU.js.map → chunk-VHZRJ7RI.js.map} +1 -1
- package/dist/{chunk-XMGUQHMF.js → chunk-VSSVN6WG.js} +11 -1
- package/dist/chunk-VSSVN6WG.js.map +7 -0
- package/dist/{chunk-OZHBEG7U.js → chunk-XV7LPJNT.js} +15 -5
- package/dist/{chunk-OZHBEG7U.js.map → chunk-XV7LPJNT.js.map} +1 -1
- package/dist/chunk-Y7MDOB3N.js +65 -0
- package/dist/chunk-Y7MDOB3N.js.map +7 -0
- package/dist/{chunk-BWYKUDJR.js → chunk-ZLAB3Z4G.js} +14 -8
- package/dist/{chunk-BWYKUDJR.js.map → chunk-ZLAB3Z4G.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-Z2BNJWHT.js} +251 -485
- package/dist/cli-Z2BNJWHT.js.map +7 -0
- package/dist/commands-3Y3OQOXT.js +54 -0
- package/dist/{config-GTJWCNPF.js → config-5RS7HDIK.js} +9 -6
- package/dist/{context-WF3TTXQU.js → context-XZXRRYKS.js} +8 -7
- package/dist/{costTracker-2G3ZI2JF.js → costTracker-VSWW7SRT.js} +3 -2
- package/dist/{customCommands-QOWK57EX.js → customCommands-6KDAODFQ.js} +6 -5
- package/dist/{env-37BAP7QF.js → env-WIM2DQ4L.js} +10 -7
- package/dist/{gateway-IZYO6YFJ.js → gateway-DKHC7H3K.js} +542 -96
- package/dist/gateway-DKHC7H3K.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-4S452GGD.js} +6 -5
- package/dist/{kodeAgentSessionResume-UEEDRJ3N.js → kodeAgentSessionResume-MSMG4QUR.js} +6 -5
- package/dist/{kodeAgentStreamJson-VIXFTYL5.js → kodeAgentStreamJson-4ZKIWKS3.js} +4 -2
- package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-CYG6MLKP.js} +15 -4
- package/dist/kodeAgentStreamJsonSession-CYG6MLKP.js.map +7 -0
- package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js → kodeAgentStructuredStdio-5DCUC6V6.js} +3 -3
- package/dist/{kodeHooks-V36SHCTC.js → kodeHooks-WX3N6CL6.js} +6 -5
- package/dist/{llm-CYUDKJNR.js → llm-V2W4KJIA.js} +239 -57
- package/dist/llm-V2W4KJIA.js.map +7 -0
- package/dist/{llmLazy-IXVVBRTN.js → llmLazy-I7SO67YA.js} +2 -2
- package/dist/{loader-OEJ6C3TN.js → loader-YJGRGJNH.js} +6 -5
- package/dist/{mcp-KE3SILMX.js → mcp-WG3RQQCZ.js} +10 -9
- package/dist/{mentionProcessor-GAU2WAYB.js → mentionProcessor-PKWDUKTN.js} +14 -7
- package/dist/{mentionProcessor-GAU2WAYB.js.map → mentionProcessor-PKWDUKTN.js.map} +1 -1
- package/dist/{messages-WCSGGSEU.js → messages-RXHQ6VKL.js} +2 -2
- package/dist/{model-4TQIV5J2.js → model-JNWAZGT7.js} +10 -7
- package/dist/{openai-KTZV6F7N.js → openai-6NL5UXO7.js} +8 -7
- package/dist/{outputStyles-WX5RYQOA.js → outputStyles-BVPXT3MW.js} +6 -5
- package/dist/{pluginRuntime-JXMJZ2LC.js → pluginRuntime-XHI3TCRJ.js} +11 -8
- package/dist/{pluginRuntime-JXMJZ2LC.js.map → pluginRuntime-XHI3TCRJ.js.map} +1 -1
- package/dist/{pluginValidation-JNQZYLUP.js → pluginValidation-WDFL352C.js} +8 -7
- package/dist/prompts-C4RUFGX2.js +58 -0
- package/dist/query-IA3UKMGR.js +58 -0
- package/dist/{responsesStreaming-2AIT6GHG.js → responsesStreaming-JORGEFQC.js} +1 -1
- package/dist/{ripgrep-KDPQAMB2.js → ripgrep-BHDXRABJ.js} +5 -4
- package/dist/sandbox-QOXESHL4.js +63 -0
- package/dist/{skillMarketplace-IXAGP3Q2.js → skillMarketplace-RIAMO2YA.js} +5 -4
- package/dist/{state-MSCYLB6Y.js → state-TM2XZQE2.js} +6 -3
- package/dist/structuredOutput-KAVFUV2Z.js +9 -0
- package/dist/theme-BXUQNXSD.js +15 -0
- package/dist/thinking-BCZ4WDT6.js +18 -0
- package/dist/{toolPermissionContext-I3IXPVED.js → toolPermissionContext-JCQ5MFUT.js} +1 -1
- package/dist/toolPermissionContext-JCQ5MFUT.js.map +7 -0
- package/dist/toolPermissionContextState-ILRPUITK.js +24 -0
- package/dist/toolPermissionContextState-ILRPUITK.js.map +7 -0
- package/dist/{toolPermissionSettings-EUZKGZU2.js → toolPermissionSettings-LNYZ6XFE.js} +9 -8
- package/dist/toolPermissionSettings-LNYZ6XFE.js.map +7 -0
- package/dist/tools-HIPUGTF5.js +55 -0
- package/dist/tools-HIPUGTF5.js.map +7 -0
- package/dist/{userInput-LJL4CVOB.js → userInput-I33T2RX2.js} +49 -34
- package/dist/{userInput-LJL4CVOB.js.map → userInput-I33T2RX2.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 +1 -1
- 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-CTTH53A7.js.map} +0 -0
- /package/dist/{autoUpdater-2GS6LRPK.js.map → autoUpdater-DKMSJXWW.js.map} +0 -0
- /package/dist/{chunk-RUXIBQ3B.js.map → chunk-7E2L7EH2.js.map} +0 -0
- /package/dist/{chunk-XS6PU75S.js.map → chunk-APSIF3YK.js.map} +0 -0
- /package/dist/{chunk-AXWJI6N5.js.map → chunk-D4OZACS2.js.map} +0 -0
- /package/dist/{chunk-A7X6OCZE.js.map → chunk-ERKWSZ3K.js.map} +0 -0
- /package/dist/{chunk-3LMXSKZ7.js.map → chunk-NFYAVT54.js.map} +0 -0
- /package/dist/{commands-AVEBLFVS.js.map → commands-3Y3OQOXT.js.map} +0 -0
- /package/dist/{config-GTJWCNPF.js.map → config-5RS7HDIK.js.map} +0 -0
- /package/dist/{context-WF3TTXQU.js.map → context-XZXRRYKS.js.map} +0 -0
- /package/dist/{costTracker-2G3ZI2JF.js.map → costTracker-VSWW7SRT.js.map} +0 -0
- /package/dist/{customCommands-QOWK57EX.js.map → customCommands-6KDAODFQ.js.map} +0 -0
- /package/dist/{env-37BAP7QF.js.map → env-WIM2DQ4L.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-4S452GGD.js.map} +0 -0
- /package/dist/{kodeAgentStreamJson-VIXFTYL5.js.map → kodeAgentSessionResume-MSMG4QUR.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-WX3N6CL6.js.map} +0 -0
- /package/dist/{loader-OEJ6C3TN.js.map → llmLazy-I7SO67YA.js.map} +0 -0
- /package/dist/{mcp-KE3SILMX.js.map → loader-YJGRGJNH.js.map} +0 -0
- /package/dist/{messages-WCSGGSEU.js.map → mcp-WG3RQQCZ.js.map} +0 -0
- /package/dist/{model-4TQIV5J2.js.map → messages-RXHQ6VKL.js.map} +0 -0
- /package/dist/{openai-KTZV6F7N.js.map → model-JNWAZGT7.js.map} +0 -0
- /package/dist/{outputStyles-WX5RYQOA.js.map → openai-6NL5UXO7.js.map} +0 -0
- /package/dist/{pluginValidation-JNQZYLUP.js.map → outputStyles-BVPXT3MW.js.map} +0 -0
- /package/dist/{prompts-LE6GK75N.js.map → pluginValidation-WDFL352C.js.map} +0 -0
- /package/dist/{query-GGIP6PWG.js.map → prompts-C4RUFGX2.js.map} +0 -0
- /package/dist/{responsesStreaming-2AIT6GHG.js.map → query-IA3UKMGR.js.map} +0 -0
- /package/dist/{ripgrep-KDPQAMB2.js.map → responsesStreaming-JORGEFQC.js.map} +0 -0
- /package/dist/{skillMarketplace-IXAGP3Q2.js.map → ripgrep-BHDXRABJ.js.map} +0 -0
- /package/dist/{state-MSCYLB6Y.js.map → sandbox-QOXESHL4.js.map} +0 -0
- /package/dist/{theme-GAMFOLBW.js.map → skillMarketplace-RIAMO2YA.js.map} +0 -0
- /package/dist/{toolPermissionContext-I3IXPVED.js.map → state-TM2XZQE2.js.map} +0 -0
- /package/dist/{toolPermissionSettings-EUZKGZU2.js.map → structuredOutput-KAVFUV2Z.js.map} +0 -0
- /package/dist/{tools-3HOUIDM3.js.map → theme-BXUQNXSD.js.map} +0 -0
- /package/dist/{uuid-VA3KVASX.js.map → thinking-BCZ4WDT6.js.map} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
|
|
2
|
+
Theme: GitHub Dark
|
|
3
|
+
Description: Dark theme as seen on github.com
|
|
4
|
+
Author: github.com
|
|
5
|
+
Maintainer: @Hirse
|
|
6
|
+
Updated: 2021-05-15
|
|
7
|
+
|
|
8
|
+
Outdated base version: https://github.com/primer/github-syntax-dark
|
|
9
|
+
Current colors taken from GitHub's CSS
|
|
10
|
+
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 224 71% 4%;--primary: 220 90% 56%;--primary-foreground: 210 40% 98%;--secondary: 220 14% 96%;--secondary-foreground: 220 9% 46%;--muted: 220 14% 96%;--muted-foreground: 220 9% 46%;--accent: 220 14% 96%;--accent-foreground: 224 71% 4%;--destructive: 0 84% 60%;--destructive-foreground: 210 40% 98%;--border: 220 13% 91%;--input: 220 13% 91%;--ring: 220 90% 56%;--radius: .5rem}.dark{--background: 224 71% 4%;--foreground: 210 40% 98%;--primary: 217 91% 60%;--primary-foreground: 224 71% 4%;--secondary: 215 28% 17%;--secondary-foreground: 210 40% 98%;--muted: 215 28% 17%;--muted-foreground: 218 11% 65%;--accent: 215 28% 17%;--accent-foreground: 210 40% 98%;--destructive: 0 63% 31%;--destructive-foreground: 210 40% 98%;--border: 215 28% 17%;--input: 215 28% 17%;--ring: 217 91% 60%}*{border-color:hsl(var(--border))}html{-webkit-tap-highlight-color:transparent;touch-action:manipulation}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;overscroll-behavior:none}textarea,input,button{font-size:16px}@media(min-width:768px){textarea,input{font-size:14px}}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.top-0{top:0}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-5{margin-left:1.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.table{display:table}.hidden{display:none}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-\[200px\]{max-height:200px}.max-h-full{max-height:100%}.min-h-0{min-height:0px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-full{min-width:100%}.max-w-3xl{max-width:48rem}.max-w-\[140px\]{max-width:140px}.max-w-\[80\%\]{max-width:80%}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:.75rem}.rounded-br-md{border-bottom-right-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-500\/20{border-color:#f59e0b33}.border-blue-500\/20{border-color:#3b82f633}.border-border{border-color:hsl(var(--border))}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-emerald-500\/20{border-color:#10b98133}.border-inherit{border-color:inherit}.border-input{border-color:hsl(var(--input))}.border-orange-500\/20{border-color:#f9731633}.border-primary{border-color:hsl(var(--primary))}.border-red-500\/20{border-color:#ef444433}.border-violet-500\/20{border-color:#8b5cf633}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-background{background-color:hsl(var(--background))}.bg-background\/50{background-color:hsl(var(--background) / .5)}.bg-black\/40{background-color:#0006}.bg-black\/50{background-color:#00000080}.bg-blue-500\/10{background-color:#3b82f61a}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-orange-500\/10{background-color:#f973161a}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-secondary{background-color:hsl(var(--secondary))}.bg-transparent{background-color:transparent}.bg-violet-500\/10{background-color:#8b5cf61a}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-zinc-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-zinc-950{--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/70{color:hsl(var(--foreground) / .7)}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-zinc-100{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.scrollbar-thin{scrollbar-width:thin;scrollbar-color:hsl(var(--muted-foreground) / .3) transparent}.scrollbar-thin::-webkit-scrollbar{width:6px}.scrollbar-thin::-webkit-scrollbar-track{background:transparent}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:hsl(var(--muted-foreground) / .3);border-radius:3px}.\[animation-delay\:-0\.15s\]{animation-delay:-.15s}.\[animation-delay\:-0\.3s\]{animation-delay:-.3s}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-ring:focus-within{--tw-ring-color: hsl(var(--ring))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent) / .5)}.hover\:bg-black\/5:hover{background-color:#0000000d}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive) / .1)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/30:hover{background-color:hsl(var(--primary) / .3)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary\/80:hover{color:hsl(var(--primary) / .8)}.hover\:underline:hover{text-decoration-line:underline}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.active\:bg-primary\/50:active{background-color:hsl(var(--primary) / .5)}.disabled\:opacity-30:disabled{opacity:.3}.group:hover .group-hover\:opacity-100{opacity:1}.dark\:bg-zinc-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-white\/5:hover:is(.dark *){background-color:#ffffff0d}@media(min-width:768px){.md\:static{position:static}.md\:hidden{display:none}.md\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}@media(min-width:1024px){.lg\:flex{display:flex}.lg\:max-w-\[60\%\]{max-width:60%}}
|
package/web/dist/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/newcraw.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
|
7
7
|
<title>NewCraw</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-XuLVvSQF.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-pSid9IlY.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body class="bg-background text-foreground antialiased">
|
|
12
12
|
<div id="root"></div>
|
package/dist/REPL-IAK7ZN2Z.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
|
-
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
-
import {
|
|
4
|
-
REPL
|
|
5
|
-
} from "./chunk-OJIMOLIC.js";
|
|
6
|
-
import "./chunk-XS6PU75S.js";
|
|
7
|
-
import "./chunk-WWDVA4NV.js";
|
|
8
|
-
import "./chunk-VQSCECTS.js";
|
|
9
|
-
import "./chunk-HSJ6HYAO.js";
|
|
10
|
-
import "./chunk-3LMXSKZ7.js";
|
|
11
|
-
import "./chunk-XXU2NVOE.js";
|
|
12
|
-
import "./chunk-JX5ZQYTQ.js";
|
|
13
|
-
import "./chunk-XJQATPV7.js";
|
|
14
|
-
import "./chunk-V5U6BHT2.js";
|
|
15
|
-
import "./chunk-7ZFLZNOW.js";
|
|
16
|
-
import "./chunk-VHS2MZQS.js";
|
|
17
|
-
import "./chunk-QH2M65BR.js";
|
|
18
|
-
import "./chunk-RUXIBQ3B.js";
|
|
19
|
-
import "./chunk-JWXQNBBA.js";
|
|
20
|
-
import "./chunk-2C43OXE7.js";
|
|
21
|
-
import "./chunk-BWYKUDJR.js";
|
|
22
|
-
import "./chunk-2EFL22PV.js";
|
|
23
|
-
import "./chunk-U7S4MEYP.js";
|
|
24
|
-
import "./chunk-UYRR6F5S.js";
|
|
25
|
-
import "./chunk-TY3CCSAT.js";
|
|
26
|
-
import "./chunk-LOIZNQOU.js";
|
|
27
|
-
import "./chunk-INJSFEKL.js";
|
|
28
|
-
import "./chunk-2UO3BFZH.js";
|
|
29
|
-
import "./chunk-A7X6OCZE.js";
|
|
30
|
-
import "./chunk-F3COCCAE.js";
|
|
31
|
-
import "./chunk-53A4JHFW.js";
|
|
32
|
-
import "./chunk-DEF3KFP7.js";
|
|
33
|
-
import "./chunk-IIFUDVGS.js";
|
|
34
|
-
import "./chunk-KQSHIOZK.js";
|
|
35
|
-
import "./chunk-GZTCXXSS.js";
|
|
36
|
-
import "./chunk-IM33F5CM.js";
|
|
37
|
-
import "./chunk-ZYSVG4X3.js";
|
|
38
|
-
import "./chunk-755HIAI3.js";
|
|
39
|
-
import "./chunk-AXWJI6N5.js";
|
|
40
|
-
export {
|
|
41
|
-
REPL
|
|
42
|
-
};
|
package/dist/acp-J4WDYGRX.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/acp/jsonrpc.ts", "../src/acp/stdioTransport.ts", "../src/acp/stdoutGuard.ts", "../src/acp/kodeAcpAgent.ts", "../src/acp/protocol.ts", "../src/entrypoints/acp.ts"],
|
|
4
|
-
"sourcesContent": ["import { format } from 'node:util'\r\n\r\nexport type JsonRpcId = string | number | null\r\n\r\nexport type JsonRpcRequest = {\r\n jsonrpc: '2.0'\r\n id: string | number\r\n method: string\r\n params?: unknown\r\n}\r\n\r\nexport type JsonRpcNotification = {\r\n jsonrpc: '2.0'\r\n method: string\r\n params?: unknown\r\n}\r\n\r\nexport type JsonRpcResponse = {\r\n jsonrpc: '2.0'\r\n id: JsonRpcId\r\n result?: unknown\r\n error?: { code: number; message: string; data?: unknown }\r\n}\r\n\r\ntype JsonRpcIncoming = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse\r\n\r\nexport class JsonRpcError extends Error {\r\n readonly code: number\r\n readonly data?: unknown\r\n\r\n constructor(code: number, message: string, data?: unknown) {\r\n super(message)\r\n this.code = code\r\n this.data = data\r\n }\r\n}\r\n\r\nexport type JsonRpcHandler = (params: unknown) => Promise<unknown> | unknown\r\n\r\nconst JSONRPC_VERSION = '2.0'\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value)\r\n}\r\n\r\nfunction safeStringify(value: unknown): string {\r\n try {\r\n return JSON.stringify(value)\r\n } catch {\r\n return format(value)\r\n }\r\n}\r\n\r\nfunction makeErrorResponse(\r\n id: JsonRpcId,\r\n code: number,\r\n message: string,\r\n data?: unknown,\r\n): JsonRpcResponse {\r\n return {\r\n jsonrpc: JSONRPC_VERSION,\r\n id,\r\n error: data === undefined ? { code, message } : { code, message, data },\r\n }\r\n}\r\n\r\nfunction normalizeId(id: unknown): JsonRpcId {\r\n return typeof id === 'string' || typeof id === 'number' ? id : null\r\n}\r\n\r\nexport class JsonRpcPeer {\r\n private readonly handlers = new Map<string, JsonRpcHandler>()\r\n private readonly pending = new Map<\r\n string | number,\r\n {\r\n resolve: (value: unknown) => void\r\n reject: (err: unknown) => void\r\n abort?: AbortSignal\r\n timeoutId?: NodeJS.Timeout\r\n }\r\n >()\r\n private nextId = 1\r\n private sendLine: ((line: string) => void) | null = null\r\n\r\n setSend(send: (line: string) => void): void {\r\n this.sendLine = send\r\n }\r\n\r\n registerMethod(method: string, handler: JsonRpcHandler): void {\r\n this.handlers.set(method, handler)\r\n }\r\n\r\n async handleIncoming(payload: unknown): Promise<void> {\r\n if (Array.isArray(payload)) {\r\n const responses: JsonRpcResponse[] = []\r\n for (const item of payload) {\r\n const r = await this.handleIncomingOne(item)\r\n if (r) responses.push(r)\r\n }\r\n if (responses.length > 0) {\r\n this.sendRaw(responses)\r\n }\r\n return\r\n }\r\n\r\n const response = await this.handleIncomingOne(payload)\r\n if (response) this.sendRaw(response)\r\n }\r\n\r\n private async handleIncomingOne(payload: unknown): Promise<JsonRpcResponse | null> {\r\n if (!isObject(payload)) {\r\n return makeErrorResponse(null, -32600, 'Invalid Request')\r\n }\r\n\r\n const jsonrpc = payload.jsonrpc\r\n if (jsonrpc !== JSONRPC_VERSION) {\r\n return makeErrorResponse(normalizeId(payload.id), -32600, 'Invalid Request')\r\n }\r\n\r\n const hasMethod = typeof payload.method === 'string' && payload.method.length > 0\r\n const hasId = typeof payload.id === 'string' || typeof payload.id === 'number'\r\n\r\n if (!hasMethod && hasId && ('result' in payload || 'error' in payload)) {\r\n this.handleResponse(payload as unknown as JsonRpcResponse)\r\n return null\r\n }\r\n\r\n if (!hasMethod) {\r\n return makeErrorResponse(normalizeId(payload.id), -32600, 'Invalid Request')\r\n }\r\n\r\n const method = String(payload.method)\r\n const params = 'params' in payload ? (payload as any).params : undefined\r\n const id = hasId ? (payload.id as string | number) : null\r\n\r\n const handler = this.handlers.get(method)\r\n if (!handler) {\r\n if (id === null) return null\r\n return makeErrorResponse(id, -32601, `Method not found: ${method}`)\r\n }\r\n\r\n if (id === null) {\r\n try {\r\n await handler(params)\r\n } catch {\r\n }\r\n return null\r\n }\r\n\r\n try {\r\n const result = await handler(params)\r\n return { jsonrpc: JSONRPC_VERSION, id, result: result ?? null }\r\n } catch (err) {\r\n if (err instanceof JsonRpcError) {\r\n return makeErrorResponse(id, err.code, err.message, err.data)\r\n }\r\n const message = err instanceof Error ? err.message : safeStringify(err)\r\n return makeErrorResponse(id, -32603, message)\r\n }\r\n }\r\n\r\n private handleResponse(msg: JsonRpcResponse): void {\r\n const id = normalizeId(msg.id)\r\n if (id === null) return\r\n const pending = this.pending.get(id)\r\n if (!pending) return\r\n this.pending.delete(id)\r\n\r\n if (pending.timeoutId) clearTimeout(pending.timeoutId)\r\n\r\n if (msg && typeof msg === 'object' && 'error' in msg && (msg as any).error) {\r\n const e = (msg as any).error\r\n const code = typeof e.code === 'number' ? e.code : -32603\r\n const message = typeof e.message === 'string' ? e.message : 'Unknown error'\r\n pending.reject(new JsonRpcError(code, message, e.data))\r\n return\r\n }\r\n\r\n pending.resolve((msg as any).result)\r\n }\r\n\r\n sendNotification(method: string, params?: unknown): void {\r\n this.sendRaw({ jsonrpc: JSONRPC_VERSION, method, ...(params !== undefined ? { params } : {}) })\r\n }\r\n\r\n sendRequest<T = unknown>(args: {\r\n method: string\r\n params?: unknown\r\n signal?: AbortSignal\r\n timeoutMs?: number\r\n }): Promise<T> {\r\n const id = this.nextId++\r\n const timeoutMs = args.timeoutMs\r\n\r\n const p = new Promise<T>((resolve, reject) => {\r\n const entry: {\r\n resolve: (value: unknown) => void\r\n reject: (err: unknown) => void\r\n abort?: AbortSignal\r\n timeoutId?: NodeJS.Timeout\r\n } = { resolve, reject, abort: args.signal }\r\n\r\n if (timeoutMs && Number.isFinite(timeoutMs) && timeoutMs > 0) {\r\n entry.timeoutId = setTimeout(() => {\r\n this.pending.delete(id)\r\n reject(new JsonRpcError(-32000, `Request timed out: ${args.method}`))\r\n }, timeoutMs)\r\n }\r\n\r\n if (args.signal) {\r\n const onAbort = () => {\r\n this.pending.delete(id)\r\n if (entry.timeoutId) clearTimeout(entry.timeoutId)\r\n reject(new JsonRpcError(-32000, `Request aborted: ${args.method}`))\r\n }\r\n if (args.signal.aborted) {\r\n onAbort()\r\n return\r\n }\r\n args.signal.addEventListener('abort', onAbort, { once: true })\r\n }\r\n\r\n this.pending.set(id, entry)\r\n })\r\n\r\n this.sendRaw({\r\n jsonrpc: JSONRPC_VERSION,\r\n id,\r\n method: args.method,\r\n ...(args.params !== undefined ? { params: args.params } : {}),\r\n })\r\n\r\n return p\r\n }\r\n\r\n private sendRaw(obj: unknown): void {\r\n const send = this.sendLine\r\n if (!send) {\r\n throw new Error('JsonRpcPeer send() not configured')\r\n }\r\n const line = JSON.stringify(obj)\r\n send(line)\r\n }\r\n}\r\n\r\n", "import readline from 'node:readline'\r\n\r\nimport { JsonRpcPeer } from './jsonrpc'\r\n\r\ntype TransportOptions = {\r\n writeLine: (line: string) => void\r\n}\r\n\r\nexport class StdioTransport {\r\n private rl: readline.Interface | null = null\r\n private readonly pending = new Set<Promise<void>>()\r\n\r\n constructor(\r\n private readonly peer: JsonRpcPeer,\r\n private readonly opts: TransportOptions,\r\n ) {}\r\n\r\n start(): void {\r\n if (this.rl) return\r\n\r\n this.peer.setSend(this.opts.writeLine)\r\n\r\n this.rl = readline.createInterface({\r\n input: process.stdin,\r\n crlfDelay: Infinity,\r\n })\r\n\r\n this.rl.on('line', line => {\r\n const trimmed = line.trim()\r\n if (!trimmed) return\r\n\r\n try {\r\n const payload = JSON.parse(trimmed)\r\n const p = this.peer.handleIncoming(payload).catch(() => {\r\n })\r\n this.pending.add(p)\r\n void p.finally(() => this.pending.delete(p))\r\n } catch (err) {\r\n this.opts.writeLine(\r\n JSON.stringify({\r\n jsonrpc: '2.0',\r\n id: null,\r\n error: { code: -32700, message: 'Parse error' },\r\n }),\r\n )\r\n }\r\n })\r\n\r\n this.rl.on('close', () => {\r\n void (async () => {\r\n const pending = Array.from(this.pending)\r\n if (pending.length > 0) {\r\n await Promise.allSettled(pending)\r\n }\r\n process.exit(0)\r\n })()\r\n })\r\n }\r\n\r\n stop(): void {\r\n this.rl?.close()\r\n this.rl = null\r\n }\r\n}\r\n", "import { format } from 'node:util'\r\n\r\ntype WriteFn = typeof process.stdout.write\r\n\r\ntype GuardHandle = {\r\n writeAcpLine: (line: string) => void\r\n restore: () => void\r\n originalStdoutWrite: WriteFn\r\n}\r\n\r\nfunction writeTo(\r\n write: WriteFn,\r\n chunk: unknown,\r\n encoding?: BufferEncoding,\r\n cb?: (err?: Error | null) => void,\r\n): boolean {\r\n if (typeof encoding === 'function') {\r\n return write(chunk as any, undefined as any, encoding as any)\r\n }\r\n return write(chunk as any, encoding as any, cb as any)\r\n}\r\n\r\nexport function installStdoutGuard(): GuardHandle {\r\n const originalStdoutWrite = process.stdout.write.bind(process.stdout)\r\n const originalStderrWrite = process.stderr.write.bind(process.stderr)\r\n\r\n const originalConsoleLog = console.log.bind(console)\r\n const originalConsoleInfo = console.info.bind(console)\r\n const originalConsoleDebug = console.debug.bind(console)\r\n const originalConsoleWarn = console.warn.bind(console)\r\n const originalConsoleError = console.error.bind(console)\r\n\r\n const writeAcpLine = (line: string) => {\r\n writeTo(originalStdoutWrite, `${line}\\n`)\r\n }\r\n\r\n const writeLogToStderr = (...args: unknown[]) => {\r\n writeTo(originalStderrWrite, `${format(...args)}\\n`)\r\n }\r\n\r\n console.log = writeLogToStderr as any\r\n console.info = writeLogToStderr as any\r\n console.debug = writeLogToStderr as any\r\n console.warn = writeLogToStderr as any\r\n console.error = writeLogToStderr as any\r\n\r\n process.stdout.write = ((chunk: any, encoding?: any, cb?: any) => {\r\n return writeTo(originalStderrWrite, chunk, encoding, cb)\r\n }) as any\r\n\r\n const restore = () => {\r\n process.stdout.write = originalStdoutWrite as any\r\n console.log = originalConsoleLog as any\r\n console.info = originalConsoleInfo as any\r\n console.debug = originalConsoleDebug as any\r\n console.warn = originalConsoleWarn as any\r\n console.error = originalConsoleError as any\r\n }\r\n\r\n return { writeAcpLine, restore, originalStdoutWrite }\r\n}\r\n\r\n", "import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\r\nimport { dirname, isAbsolute, join, resolve } from 'node:path'\r\n\r\nimport { nanoid } from 'nanoid'\r\n\r\nimport { JsonRpcError, JsonRpcPeer } from './jsonrpc'\r\nimport * as Protocol from './protocol'\r\n\r\nimport { MACRO } from '@constants/macros'\r\nimport { PRODUCT_COMMAND } from '@constants/product'\r\nimport { getContext } from '@context'\r\nimport { getCommands, type Command } from '@commands'\r\nimport { getTools } from '@tools'\r\nimport type { Tool, ToolUseContext } from '@tool'\r\nimport { query, type Message, type UserMessage, type AssistantMessage } from '@query'\r\nimport { hasPermissionsToUseTool } from '@permissions'\r\nimport { createAssistantMessage, createUserMessage } from '@utils/messages'\r\nimport { getSystemPrompt } from '@constants/prompts'\r\nimport { logError } from '@utils/log'\r\nimport { setCwd, setOriginalCwd } from '@utils/state'\r\nimport { grantReadPermissionForOriginalDir } from '@utils/permissions/filesystem'\r\nimport { getKodeBaseDir } from '@utils/config/env'\r\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js'\r\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\r\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\r\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\r\nimport {\r\n loadToolPermissionContextFromDisk,\r\n persistToolPermissionUpdateToDisk,\r\n} from '@utils/permissions/toolPermissionSettings'\r\nimport { applyToolPermissionContextUpdates } from '@newcraw-types/toolPermissionContext'\r\nimport type { ToolPermissionContext } from '@newcraw-types/toolPermissionContext'\r\nimport type { CanUseToolFn } from '@newcraw-types/canUseTool'\r\nimport type { WrappedClient } from '@services/mcpClient'\r\nimport { getClients } from '@services/mcpClient'\r\n\r\ntype SessionState = {\r\n sessionId: string\r\n cwd: string\r\n mcpServers: Protocol.McpServer[]\r\n mcpClients: WrappedClient[]\r\n\r\n commands: Command[]\r\n tools: Tool[]\r\n\r\n systemPrompt: string[]\r\n context: Record<string, string>\r\n\r\n messages: Message[]\r\n toolPermissionContext: ToolPermissionContext\r\n readFileTimestamps: Record<string, number>\r\n responseState: ToolUseContext['responseState']\r\n\r\n currentModeId: Protocol.SessionModeId\r\n activeAbortController: AbortController | null\r\n\r\n toolCalls: Map<\r\n string,\r\n {\r\n title: string\r\n kind: Protocol.ToolKind\r\n status: Protocol.ToolCallStatus\r\n rawInput?: Protocol.JsonObject\r\n fileSnapshot?: {\r\n path: string\r\n content: string\r\n }\r\n }\r\n >\r\n}\r\n\r\nfunction asJsonObject(value: unknown): Protocol.JsonObject | undefined {\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined\r\n try {\r\n JSON.stringify(value)\r\n return value as Protocol.JsonObject\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n\r\nfunction toolKindForName(toolName: string): Protocol.ToolKind {\r\n switch (toolName) {\r\n case 'Read':\r\n return 'read'\r\n case 'Write':\r\n case 'Edit':\r\n case 'MultiEdit':\r\n case 'NotebookEdit':\r\n return 'edit'\r\n case 'Grep':\r\n case 'Glob':\r\n return 'search'\r\n case 'Bash':\r\n case 'TaskOutput':\r\n case 'KillShell':\r\n return 'execute'\r\n case 'SwitchModel':\r\n return 'switch_mode'\r\n default:\r\n return 'other'\r\n }\r\n}\r\n\r\nfunction titleForToolCall(toolName: string, input: Record<string, unknown>): string {\r\n if (toolName === 'Read' && typeof input.file_path === 'string') {\r\n return `Read ${input.file_path}`\r\n }\r\n if ((toolName === 'Write' || toolName === 'Edit' || toolName === 'MultiEdit') && typeof input.file_path === 'string') {\r\n return `${toolName} ${input.file_path}`\r\n }\r\n if (toolName === 'Bash' && typeof input.command === 'string') {\r\n const cmd = input.command.trim().replace(/\\s+/g, ' ')\r\n const clipped = cmd.length > 120 ? `${cmd.slice(0, 117)}...` : cmd\r\n return `Run ${clipped}`\r\n }\r\n return toolName\r\n}\r\n\r\nfunction blocksToText(blocks: Protocol.ContentBlock[]): string {\r\n const parts: string[] = []\r\n\r\n for (const block of blocks) {\r\n if (!block || typeof block !== 'object') continue\r\n\r\n switch ((block as any).type) {\r\n case 'text': {\r\n const text = typeof (block as any).text === 'string' ? (block as any).text : ''\r\n if (text) parts.push(text)\r\n break\r\n }\r\n case 'resource': {\r\n const resource = (block as any).resource || {}\r\n const uri = typeof resource.uri === 'string' ? resource.uri : ''\r\n const mimeType =\r\n typeof resource.mimeType === 'string' && resource.mimeType ? resource.mimeType : 'text/plain'\r\n if (typeof resource.text === 'string') {\r\n parts.push(\r\n [\r\n '',\r\n `@resource ${uri} (${mimeType})`,\r\n '```',\r\n resource.text,\r\n '```',\r\n ].join('\\n'),\r\n )\r\n } else if (typeof resource.blob === 'string') {\r\n parts.push(\r\n [\r\n '',\r\n `@resource ${uri} (${mimeType}) [base64]`,\r\n resource.blob,\r\n ].join('\\n'),\r\n )\r\n } else if (uri) {\r\n parts.push(`@resource ${uri} (${mimeType})`)\r\n }\r\n break\r\n }\r\n case 'resource_link': {\r\n const uri = typeof (block as any).uri === 'string' ? (block as any).uri : ''\r\n const name = typeof (block as any).name === 'string' ? (block as any).name : ''\r\n const title = typeof (block as any).title === 'string' ? (block as any).title : ''\r\n const description =\r\n typeof (block as any).description === 'string' ? (block as any).description : ''\r\n\r\n parts.push(\r\n [\r\n '',\r\n `@resource_link ${name || uri}`,\r\n ...(title ? [title] : []),\r\n ...(description ? [description] : []),\r\n ...(uri ? [uri] : []),\r\n ].join('\\n'),\r\n )\r\n break\r\n }\r\n case 'image':\r\n case 'audio': {\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n }\r\n\r\n return parts.join('\\n').trim()\r\n}\r\n\r\nfunction extractAssistantText(msg: AssistantMessage): string {\r\n const blocks: any[] = Array.isArray((msg as any)?.message?.content) ? ((msg as any).message.content as any[]) : []\r\n const texts: string[] = []\r\n for (const b of blocks) {\r\n if (!b || typeof b !== 'object') continue\r\n if (b.type === 'text' && typeof b.text === 'string') texts.push(b.text)\r\n if (b.type === 'thinking' && typeof (b as any).thinking === 'string') texts.push((b as any).thinking)\r\n }\r\n return texts.join('').trim()\r\n}\r\n\r\nfunction extractToolUses(msg: AssistantMessage): Array<{ id: string; name: string; input: Record<string, unknown> }> {\r\n const blocks: any[] = Array.isArray((msg as any)?.message?.content) ? ((msg as any).message.content as any[]) : []\r\n const out: Array<{ id: string; name: string; input: Record<string, unknown> }> = []\r\n for (const b of blocks) {\r\n if (!b || typeof b !== 'object') continue\r\n if (b.type !== 'tool_use') continue\r\n const id = typeof b.id === 'string' ? b.id : ''\r\n const name = typeof b.name === 'string' ? b.name : ''\r\n const input = b.input && typeof b.input === 'object' && !Array.isArray(b.input) ? (b.input as Record<string, unknown>) : {}\r\n if (id && name) out.push({ id, name, input })\r\n }\r\n return out\r\n}\r\n\r\nfunction extractToolResults(msg: UserMessage): Array<{ toolUseId: string; isError: boolean; content: string }> {\r\n const content = (msg as any)?.message?.content\r\n const blocks: any[] = Array.isArray(content) ? content : []\r\n const out: Array<{ toolUseId: string; isError: boolean; content: string }> = []\r\n\r\n for (const b of blocks) {\r\n if (!b || typeof b !== 'object') continue\r\n if (b.type !== 'tool_result') continue\r\n const toolUseId = typeof b.tool_use_id === 'string' ? b.tool_use_id : ''\r\n const isError = Boolean(b.is_error)\r\n const raw = b.content\r\n const text =\r\n typeof raw === 'string'\r\n ? raw\r\n : Array.isArray(raw)\r\n ? raw\r\n .filter(x => x && typeof x === 'object' && (x as any).type === 'text')\r\n .map(x => String((x as any).text ?? ''))\r\n .join('')\r\n : ''\r\n if (toolUseId) out.push({ toolUseId, isError, content: text })\r\n }\r\n\r\n return out\r\n}\r\n\r\nconst ACP_SESSION_STORE_VERSION = 1\r\nconst MAX_DIFF_FILE_BYTES = 512_000\r\nconst MAX_DIFF_TEXT_CHARS = 400_000\r\n\r\ntype PersistedAcpSession = {\r\n version: number\r\n sessionId: string\r\n cwd: string\r\n mcpServers: Protocol.McpServer[]\r\n messages: Message[]\r\n toolPermissionContext: ToolPermissionContext\r\n readFileTimestamps: Record<string, number>\r\n responseState: ToolUseContext['responseState']\r\n currentModeId: Protocol.SessionModeId\r\n}\r\n\r\nfunction getProjectDirSlug(cwd: string): string {\r\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\r\n}\r\n\r\nfunction sanitizeSessionId(sessionId: string): string {\r\n return sessionId.replace(/[^a-zA-Z0-9_-]/g, '_')\r\n}\r\n\r\nfunction getAcpSessionDir(cwd: string): string {\r\n return join(getKodeBaseDir(), getProjectDirSlug(cwd), 'acp-sessions')\r\n}\r\n\r\nfunction getAcpSessionFilePath(cwd: string, sessionId: string): string {\r\n return join(getAcpSessionDir(cwd), `${sanitizeSessionId(sessionId)}.json`)\r\n}\r\n\r\nfunction readTextFileForDiff(filePath: string): string | null {\r\n try {\r\n const stats = statSync(filePath)\r\n if (!stats.isFile()) return null\r\n if (stats.size > MAX_DIFF_FILE_BYTES) return null\r\n return readFileSync(filePath, 'utf8')\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction truncateDiffText(text: string): string {\r\n if (text.length <= MAX_DIFF_TEXT_CHARS) return text\r\n return `${text.slice(0, MAX_DIFF_TEXT_CHARS)}\\n\\n[truncated ${text.length - MAX_DIFF_TEXT_CHARS} chars]`\r\n}\r\n\r\nfunction persistAcpSessionToDisk(session: SessionState): void {\r\n try {\r\n const dir = getAcpSessionDir(session.cwd)\r\n mkdirSync(dir, { recursive: true })\r\n\r\n const payload: PersistedAcpSession = {\r\n version: ACP_SESSION_STORE_VERSION,\r\n sessionId: session.sessionId,\r\n cwd: session.cwd,\r\n mcpServers: session.mcpServers,\r\n messages: session.messages,\r\n toolPermissionContext: session.toolPermissionContext,\r\n readFileTimestamps: session.readFileTimestamps,\r\n responseState: session.responseState,\r\n currentModeId: session.currentModeId,\r\n }\r\n\r\n const path = getAcpSessionFilePath(session.cwd, session.sessionId)\r\n writeFileSync(path, JSON.stringify(payload, null, 2), 'utf8')\r\n } catch (e) {\r\n logError(e)\r\n }\r\n}\r\n\r\nfunction loadAcpSessionFromDisk(cwd: string, sessionId: string): PersistedAcpSession | null {\r\n try {\r\n const path = getAcpSessionFilePath(cwd, sessionId)\r\n if (!existsSync(path)) return null\r\n const raw = readFileSync(path, 'utf8')\r\n const parsed = JSON.parse(raw) as PersistedAcpSession\r\n if (!parsed || typeof parsed !== 'object') return null\r\n if (parsed.sessionId !== sessionId) return null\r\n if (typeof parsed.cwd !== 'string' || parsed.cwd !== cwd) return null\r\n if (!Array.isArray(parsed.messages)) return null\r\n return parsed\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nasync function connectAcpMcpServers(mcpServers: Protocol.McpServer[]): Promise<WrappedClient[]> {\r\n if (!Array.isArray(mcpServers) || mcpServers.length === 0) return []\r\n\r\n const rawTimeout = process.env.MCP_CONNECTION_TIMEOUT_MS\r\n const parsedTimeout = rawTimeout ? Number.parseInt(rawTimeout, 10) : NaN\r\n const timeoutMs = Number.isFinite(parsedTimeout) ? parsedTimeout : 30_000\r\n\r\n const results: WrappedClient[] = []\r\n\r\n type Candidate = { kind: 'stdio' | 'http' | 'sse'; transport: unknown }\r\n\r\n const connectWithTimeout = async (client: Client, transport: unknown, name: string): Promise<void> => {\r\n const connectPromise = client.connect(transport as any)\r\n if (timeoutMs > 0) {\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n const timeoutId = setTimeout(() => {\r\n reject(new Error(`Connection to MCP server \"${name}\" timed out after ${timeoutMs}ms`))\r\n }, timeoutMs)\r\n connectPromise.then(\r\n () => clearTimeout(timeoutId),\r\n () => clearTimeout(timeoutId),\r\n )\r\n })\r\n await Promise.race([connectPromise, timeoutPromise])\r\n } else {\r\n await connectPromise\r\n }\r\n }\r\n\r\n for (const server of mcpServers) {\r\n const serverType = typeof (server as any)?.type === 'string' ? String((server as any).type) : 'stdio'\r\n\r\n const name = typeof (server as any)?.name === 'string' ? String((server as any).name) : ''\r\n if (!name) {\r\n results.push({ name: '<invalid>', type: 'failed' })\r\n continue\r\n }\r\n\r\n const candidates: Candidate[] = []\r\n\r\n\t if (serverType === 'http' || serverType === 'sse') {\r\n\t const url = typeof (server as any)?.url === 'string' ? String((server as any).url) : ''\r\n\t if (!url) {\r\n\t results.push({ name, type: 'failed' })\r\n\t continue\r\n\t }\r\n\t\r\n\t let parsedUrl: URL\r\n\t try {\r\n\t parsedUrl = new URL(url)\r\n\t } catch (e) {\r\n\t logError(e)\r\n\t results.push({ name, type: 'failed' })\r\n\t continue\r\n\t }\r\n\r\n\t const headerList = Array.isArray((server as any)?.headers) ? ((server as any).headers as unknown[]) : []\r\n\t const headers: Record<string, string> = {}\r\n\t for (const h of headerList) {\r\n\t if (!h || typeof h !== 'object') continue\r\n const k = typeof (h as any).name === 'string' ? String((h as any).name) : ''\r\n const val = typeof (h as any).value === 'string' ? String((h as any).value) : ''\r\n if (k) headers[k] = val\r\n }\r\n\r\n\t const requestInit = Object.keys(headers).length > 0 ? { requestInit: { headers } } : {}\r\n\r\n\t if (serverType === 'http') {\r\n\t candidates.push(\r\n\t { kind: 'http', transport: new StreamableHTTPClientTransport(parsedUrl, requestInit as any) },\r\n\t { kind: 'sse', transport: new SSEClientTransport(parsedUrl, requestInit as any) },\r\n\t )\r\n\t } else {\r\n\t candidates.push(\r\n\t { kind: 'sse', transport: new SSEClientTransport(parsedUrl, requestInit as any) },\r\n\t { kind: 'http', transport: new StreamableHTTPClientTransport(parsedUrl, requestInit as any) },\r\n\t )\r\n\t }\r\n\t } else {\r\n const command = typeof (server as any)?.command === 'string' ? String((server as any).command) : ''\r\n const args = Array.isArray((server as any)?.args) ? ((server as any).args as unknown[]).map(a => String(a)) : []\r\n const envList = Array.isArray((server as any)?.env) ? ((server as any).env as unknown[]) : []\r\n\r\n if (!command) {\r\n results.push({ name, type: 'failed' })\r\n continue\r\n }\r\n\r\n const envFromParams: Record<string, string> = {}\r\n for (const v of envList) {\r\n if (!v || typeof v !== 'object') continue\r\n const k = typeof (v as any).name === 'string' ? String((v as any).name) : ''\r\n const val = typeof (v as any).value === 'string' ? String((v as any).value) : ''\r\n if (k) envFromParams[k] = val\r\n }\r\n\r\n candidates.push({\r\n kind: 'stdio',\r\n transport: new StdioClientTransport({\r\n command,\r\n args,\r\n env: { ...process.env, ...envFromParams } as Record<string, string>,\r\n stderr: 'pipe',\r\n }),\r\n })\r\n }\r\n\r\n let lastError: unknown\r\n for (const candidate of candidates) {\r\n const client = new Client(\r\n { name: PRODUCT_COMMAND, version: MACRO.VERSION || '0.0.0' },\r\n { capabilities: {} },\r\n )\r\n\r\n try {\r\n await connectWithTimeout(client, candidate.transport, name)\r\n\r\n let capabilities: Record<string, unknown> | null = null\r\n try {\r\n capabilities = client.getServerCapabilities() as any\r\n } catch {\r\n capabilities = null\r\n }\r\n\r\n results.push({ name, client, capabilities, type: 'connected' as const })\r\n lastError = null\r\n break\r\n } catch (e) {\r\n lastError = e\r\n try {\r\n await client.close()\r\n } catch {}\r\n }\r\n }\r\n\r\n if (lastError) {\r\n logError(lastError)\r\n results.push({ name, type: 'failed' as const })\r\n }\r\n }\r\n\r\n return results\r\n}\r\n\r\nfunction mergeMcpClients(base: WrappedClient[], extra: WrappedClient[]): WrappedClient[] {\r\n const map = new Map<string, WrappedClient>()\r\n for (const c of base) map.set(c.name, c)\r\n for (const c of extra) map.set(c.name, c)\r\n return Array.from(map.values())\r\n}\r\n\r\nexport class KodeAcpAgent {\r\n private clientCapabilities: Protocol.ClientCapabilities = {}\r\n private sessions = new Map<string, SessionState>()\r\n\r\n constructor(private readonly peer: JsonRpcPeer) {\r\n this.registerMethods()\r\n }\r\n\r\n private registerMethods(): void {\r\n this.peer.registerMethod('initialize', this.handleInitialize.bind(this))\r\n this.peer.registerMethod('authenticate', this.handleAuthenticate.bind(this))\r\n this.peer.registerMethod('session/new', this.handleSessionNew.bind(this))\r\n this.peer.registerMethod('session/load', this.handleSessionLoad.bind(this))\r\n this.peer.registerMethod('session/prompt', this.handleSessionPrompt.bind(this))\r\n this.peer.registerMethod('session/set_mode', this.handleSessionSetMode.bind(this))\r\n this.peer.registerMethod('session/cancel', this.handleSessionCancel.bind(this))\r\n }\r\n\r\n private async handleInitialize(params: unknown): Promise<Protocol.InitializeResponse> {\r\n const p = (params ?? {}) as Partial<Protocol.InitializeParams>\r\n const protocolVersion = typeof p.protocolVersion === 'number' ? p.protocolVersion : Protocol.ACP_PROTOCOL_VERSION\r\n\r\n this.clientCapabilities =\r\n p.clientCapabilities && typeof p.clientCapabilities === 'object' ? (p.clientCapabilities as Protocol.ClientCapabilities) : {}\r\n\r\n return {\r\n protocolVersion: Protocol.ACP_PROTOCOL_VERSION,\r\n agentCapabilities: {\r\n loadSession: true,\r\n promptCapabilities: {\r\n image: false,\r\n audio: false,\r\n embeddedContext: true,\r\n embeddedContent: true,\r\n },\r\n mcpCapabilities: {\r\n http: true,\r\n sse: true,\r\n },\r\n },\r\n agentInfo: {\r\n name: 'newcraw',\r\n title: 'NewCraw',\r\n version: MACRO.VERSION || '0.0.0',\r\n },\r\n authMethods: [],\r\n }\r\n }\r\n\r\n private async handleAuthenticate(_params: unknown): Promise<Protocol.AuthenticateResponse> {\r\n return {}\r\n }\r\n\r\n private async handleSessionNew(params: unknown): Promise<Protocol.NewSessionResponse> {\r\n const p = (params ?? {}) as Partial<Protocol.NewSessionParams>\r\n const cwd = typeof p.cwd === 'string' ? p.cwd : ''\r\n if (!cwd) {\r\n throw new JsonRpcError(-32602, 'Missing required param: cwd')\r\n }\r\n if (!isAbsolute(cwd)) {\r\n throw new JsonRpcError(-32602, `cwd must be an absolute path: ${cwd}`)\r\n }\r\n\r\n setOriginalCwd(cwd)\r\n await setCwd(cwd)\r\n grantReadPermissionForOriginalDir()\r\n\r\n const mcpServers = Array.isArray(p.mcpServers) ? (p.mcpServers as Protocol.McpServer[]) : []\r\n\r\n const [commands, tools, ctx, systemPrompt, configuredMcpClients] = await Promise.all([\r\n getCommands(),\r\n getTools(),\r\n getContext(),\r\n getSystemPrompt({ disableSlashCommands: false }),\r\n getClients().catch(() => [] as WrappedClient[]),\r\n ])\r\n const acpMcpClients = await connectAcpMcpServers(mcpServers)\r\n const mcpClients = mergeMcpClients(configuredMcpClients, acpMcpClients)\r\n\r\n const toolPermissionContext = loadToolPermissionContextFromDisk({\r\n projectDir: cwd,\r\n includeKodeProjectConfig: true,\r\n isBypassPermissionsModeAvailable: true,\r\n })\r\n\r\n const sessionId = `sess_${nanoid()}`\r\n\r\n const session: SessionState = {\r\n sessionId,\r\n cwd,\r\n mcpServers,\r\n mcpClients,\r\n commands,\r\n tools,\r\n systemPrompt,\r\n context: ctx,\r\n messages: [],\r\n toolPermissionContext,\r\n readFileTimestamps: {},\r\n responseState: {},\r\n currentModeId: toolPermissionContext.mode ?? 'default',\r\n activeAbortController: null,\r\n toolCalls: new Map(),\r\n }\r\n\r\n this.sessions.set(sessionId, session)\r\n\r\n this.sendAvailableCommands(session)\r\n this.sendCurrentMode(session)\r\n persistAcpSessionToDisk(session)\r\n\r\n return {\r\n sessionId,\r\n modes: this.getModeState(session),\r\n }\r\n }\r\n\r\n private async handleSessionLoad(params: unknown): Promise<Protocol.LoadSessionResponse> {\r\n const p = (params ?? {}) as Partial<Protocol.LoadSessionParams>\r\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\r\n const cwd = typeof p.cwd === 'string' ? p.cwd : ''\r\n if (!sessionId) throw new JsonRpcError(-32602, 'Missing required param: sessionId')\r\n if (!cwd) throw new JsonRpcError(-32602, 'Missing required param: cwd')\r\n if (!isAbsolute(cwd)) {\r\n throw new JsonRpcError(-32602, `cwd must be an absolute path: ${cwd}`)\r\n }\r\n\r\n setOriginalCwd(cwd)\r\n await setCwd(cwd)\r\n grantReadPermissionForOriginalDir()\r\n\r\n const persisted = loadAcpSessionFromDisk(cwd, sessionId)\r\n if (!persisted) {\r\n throw new JsonRpcError(-32602, `Session not found: ${sessionId}`)\r\n }\r\n\r\n const mcpServers = Array.isArray(p.mcpServers) ? (p.mcpServers as Protocol.McpServer[]) : []\r\n\r\n const [commands, tools, ctx, systemPrompt, configuredMcpClients] = await Promise.all([\r\n getCommands(),\r\n getTools(),\r\n getContext(),\r\n getSystemPrompt({ disableSlashCommands: false }),\r\n getClients().catch(() => [] as WrappedClient[]),\r\n ])\r\n\r\n const acpMcpClients = await connectAcpMcpServers(mcpServers)\r\n const mcpClients = mergeMcpClients(configuredMcpClients, acpMcpClients)\r\n\r\n const toolPermissionContext = loadToolPermissionContextFromDisk({\r\n projectDir: cwd,\r\n includeKodeProjectConfig: true,\r\n isBypassPermissionsModeAvailable: true,\r\n })\r\n\r\n const currentModeId =\r\n typeof persisted.currentModeId === 'string' && persisted.currentModeId\r\n ? persisted.currentModeId\r\n : toolPermissionContext.mode ?? 'default'\r\n toolPermissionContext.mode = currentModeId as any\r\n\r\n const session: SessionState = {\r\n sessionId,\r\n cwd,\r\n mcpServers,\r\n mcpClients,\r\n commands,\r\n tools,\r\n systemPrompt,\r\n context: ctx,\r\n messages: Array.isArray(persisted.messages) ? persisted.messages : [],\r\n toolPermissionContext,\r\n readFileTimestamps:\r\n persisted.readFileTimestamps && typeof persisted.readFileTimestamps === 'object'\r\n ? (persisted.readFileTimestamps as Record<string, number>)\r\n : {},\r\n responseState:\r\n persisted.responseState && typeof persisted.responseState === 'object'\r\n ? (persisted.responseState as ToolUseContext['responseState'])\r\n : {},\r\n currentModeId,\r\n activeAbortController: null,\r\n toolCalls: new Map(),\r\n }\r\n\r\n this.sessions.set(sessionId, session)\r\n this.sendAvailableCommands(session)\r\n this.sendCurrentMode(session)\r\n this.replayConversation(session)\r\n\r\n return { modes: this.getModeState(session) }\r\n }\r\n\r\n private async handleSessionSetMode(params: unknown): Promise<Protocol.SetSessionModeResponse> {\r\n const p = (params ?? {}) as Partial<Protocol.SetSessionModeParams>\r\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\r\n const modeId = typeof p.modeId === 'string' ? p.modeId : ''\r\n\r\n const session = this.sessions.get(sessionId)\r\n if (!session) throw new JsonRpcError(-32602, `Session not found: ${sessionId}`)\r\n\r\n const allowed = new Set(this.getModeState(session).availableModes.map(m => m.id))\r\n if (!allowed.has(modeId)) {\r\n throw new JsonRpcError(-32602, `Unknown modeId: ${modeId}`)\r\n }\r\n\r\n session.currentModeId = modeId\r\n session.toolPermissionContext.mode = modeId as any\r\n this.sendCurrentMode(session)\r\n persistAcpSessionToDisk(session)\r\n\r\n return {}\r\n }\r\n\r\n private async handleSessionCancel(params: unknown): Promise<void> {\r\n const p = (params ?? {}) as Partial<Protocol.SessionCancelParams>\r\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\r\n const session = this.sessions.get(sessionId)\r\n if (!session) return\r\n session.activeAbortController?.abort()\r\n }\r\n\r\n private async handleSessionPrompt(params: unknown): Promise<Protocol.PromptResponse> {\r\n const p = (params ?? {}) as any\r\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\r\n const blocks: Protocol.ContentBlock[] = Array.isArray(p.prompt)\r\n ? (p.prompt as Protocol.ContentBlock[])\r\n : Array.isArray(p.content)\r\n ? (p.content as Protocol.ContentBlock[])\r\n : []\r\n\r\n const session = this.sessions.get(sessionId)\r\n if (!session) throw new JsonRpcError(-32602, `Session not found: ${sessionId}`)\r\n\r\n if (session.activeAbortController) {\r\n throw new JsonRpcError(-32000, `Session already has an active prompt: ${sessionId}`)\r\n }\r\n\r\n setOriginalCwd(session.cwd)\r\n await setCwd(session.cwd)\r\n grantReadPermissionForOriginalDir()\r\n\r\n const promptText = blocksToText(blocks)\r\n const userMsg = createUserMessage(promptText)\r\n\r\n const baseMessages: Message[] = [...session.messages, userMsg]\r\n session.messages.push(userMsg)\r\n\r\n if (process.env.NEWCRAW_ACP_ECHO === '1') {\r\n await this.handleKodeMessage(session, createAssistantMessage(promptText))\r\n persistAcpSessionToDisk(session)\r\n return { stopReason: 'end_turn' }\r\n }\r\n\r\n const abortController = new AbortController()\r\n session.activeAbortController = abortController\r\n\r\n const canUseTool = this.createAcpCanUseTool(session)\r\n\r\n const options = {\r\n commands: session.commands,\r\n tools: session.tools,\r\n verbose: false,\r\n safeMode: false,\r\n forkNumber: 0,\r\n messageLogName: session.sessionId,\r\n maxThinkingTokens: 0,\r\n persistSession: false,\r\n toolPermissionContext: session.toolPermissionContext,\r\n mcpClients: session.mcpClients,\r\n shouldAvoidPermissionPrompts: false,\r\n }\r\n\r\n let stopReason: Protocol.StopReason = 'end_turn'\r\n try {\r\n for await (const m of query(baseMessages, session.systemPrompt, session.context, canUseTool, {\r\n options,\r\n abortController,\r\n messageId: undefined,\r\n readFileTimestamps: session.readFileTimestamps,\r\n setToolJSX: () => {},\r\n agentId: 'main',\r\n responseState: session.responseState,\r\n })) {\r\n if (abortController.signal.aborted) {\r\n stopReason = 'cancelled'\r\n }\r\n await this.handleKodeMessage(session, m)\r\n }\r\n if (abortController.signal.aborted) stopReason = 'cancelled'\r\n } catch (err) {\r\n if (abortController.signal.aborted) {\r\n stopReason = 'cancelled'\r\n } else {\r\n logError(err)\r\n const msg = err instanceof Error ? err.message : String(err)\r\n this.sendAgentMessage(session.sessionId, msg)\r\n stopReason = 'end_turn'\r\n }\r\n } finally {\r\n session.activeAbortController = null\r\n persistAcpSessionToDisk(session)\r\n }\r\n\r\n return { stopReason }\r\n }\r\n\r\n private async handleKodeMessage(session: SessionState, m: Message): Promise<void> {\r\n if (!m || typeof m !== 'object') return\r\n\r\n if (m.type === 'assistant') {\r\n session.messages.push(m)\r\n\r\n const blocks: any[] = Array.isArray((m as any).message?.content) ? ((m as any).message.content as any[]) : []\r\n for (const b of blocks) {\r\n if (!b || typeof b !== 'object') continue\r\n if (b.type === 'text' && typeof b.text === 'string') {\r\n this.sendAgentMessage(session.sessionId, b.text)\r\n } else if (b.type === 'thinking' && typeof (b as any).thinking === 'string') {\r\n this.sendAgentThought(session.sessionId, (b as any).thinking)\r\n } else if (b.type === 'tool_use') {\r\n const toolUseId = typeof b.id === 'string' ? b.id : ''\r\n const toolName = typeof b.name === 'string' ? b.name : ''\r\n const input = b.input && typeof b.input === 'object' && !Array.isArray(b.input) ? (b.input as Record<string, unknown>) : {}\r\n if (!toolUseId || !toolName) continue\r\n const kind = toolKindForName(toolName)\r\n const title = titleForToolCall(toolName, input)\r\n session.toolCalls.set(toolUseId, {\r\n title,\r\n kind,\r\n status: 'pending',\r\n rawInput: asJsonObject(input),\r\n })\r\n this.peer.sendNotification('session/update', {\r\n sessionId: session.sessionId,\r\n update: {\r\n sessionUpdate: 'tool_call',\r\n toolCallId: toolUseId,\r\n title,\r\n kind,\r\n status: 'pending',\r\n rawInput: asJsonObject(input),\r\n } satisfies Protocol.ToolCall,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n }\r\n return\r\n }\r\n\r\n if (m.type === 'progress') {\r\n const toolCallId = m.toolUseID\r\n const existing = session.toolCalls.get(toolCallId)\r\n const title = existing?.title ?? 'Tool'\r\n const kind = existing?.kind ?? 'other'\r\n\r\n if (!existing || existing.status === 'pending') {\r\n session.toolCalls.set(toolCallId, {\r\n title,\r\n kind,\r\n status: 'in_progress',\r\n rawInput: existing?.rawInput,\r\n })\r\n this.sendToolCallUpdate(session.sessionId, {\r\n toolCallId,\r\n status: 'in_progress',\r\n })\r\n }\r\n\r\n const text = extractAssistantText(m.content)\r\n if (text) {\r\n this.sendToolCallUpdate(session.sessionId, {\r\n toolCallId,\r\n content: [\r\n {\r\n type: 'content',\r\n content: { type: 'text', text },\r\n },\r\n ],\r\n })\r\n }\r\n return\r\n }\r\n\r\n if (m.type === 'user') {\r\n const toolResults = extractToolResults(m)\r\n if (toolResults.length === 0) {\r\n session.messages.push(m)\r\n return\r\n }\r\n\r\n for (const tr of toolResults) {\r\n const existing = session.toolCalls.get(tr.toolUseId)\r\n const title = existing?.title ?? 'Tool'\r\n const kind = existing?.kind ?? 'other'\r\n\r\n if (!existing || existing.status === 'pending') {\r\n session.toolCalls.set(tr.toolUseId, {\r\n title,\r\n kind,\r\n status: 'in_progress',\r\n rawInput: existing?.rawInput,\r\n })\r\n this.sendToolCallUpdate(session.sessionId, {\r\n toolCallId: tr.toolUseId,\r\n status: 'in_progress',\r\n })\r\n }\r\n\r\n const status: Protocol.ToolCallStatus = tr.isError ? 'failed' : 'completed'\r\n session.toolCalls.set(tr.toolUseId, {\r\n title,\r\n kind,\r\n status,\r\n rawInput: existing?.rawInput,\r\n })\r\n\r\n const rawOutput = asJsonObject((m as any).toolUseResult?.data)\r\n\r\n const content: Protocol.ToolCallContent[] = []\r\n const diffContent = status === 'completed' ? this.buildDiffContentForToolResult(session, tr.toolUseId, rawOutput) : null\r\n if (diffContent) content.push(diffContent)\r\n if (tr.content) {\r\n content.push({ type: 'content', content: { type: 'text', text: tr.content } })\r\n }\r\n\r\n this.sendToolCallUpdate(session.sessionId, {\r\n toolCallId: tr.toolUseId,\r\n status,\r\n ...(content.length > 0 ? { content } : {}),\r\n ...(rawOutput ? { rawOutput } : {}),\r\n })\r\n }\r\n\r\n session.messages.push(m)\r\n return\r\n }\r\n }\r\n\r\n private createAcpCanUseTool(session: SessionState): CanUseToolFn {\r\n const timeoutMs = (() => {\r\n const raw = process.env.NEWCRAW_ACP_PERMISSION_TIMEOUT_MS\r\n const parsed = raw ? Number(raw) : NaN\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 30_000\r\n })()\r\n\r\n return async (tool, input, toolUseContext, assistantMessage) => {\r\n const toolUseId =\r\n typeof toolUseContext?.toolUseId === 'string' && toolUseContext.toolUseId\r\n ? toolUseContext.toolUseId\r\n : `call_${nanoid()}`\r\n\r\n const base = await hasPermissionsToUseTool(tool, input, toolUseContext, assistantMessage)\r\n if (base.result === true) {\r\n this.captureFileSnapshotForTool(session, toolUseId, tool.name, input)\r\n return base\r\n }\r\n\r\n const denied = base as Extract<typeof base, { result: false }>\r\n if (denied.shouldPromptUser === false) {\r\n return { result: false as const, message: denied.message }\r\n }\r\n\r\n const title = titleForToolCall(tool.name, input as any)\r\n const kind = toolKindForName(tool.name)\r\n\r\n if (!session.toolCalls.has(toolUseId)) {\r\n session.toolCalls.set(toolUseId, { title, kind, status: 'pending', rawInput: asJsonObject(input) })\r\n this.peer.sendNotification('session/update', {\r\n sessionId: session.sessionId,\r\n update: {\r\n sessionUpdate: 'tool_call',\r\n toolCallId: toolUseId,\r\n title,\r\n kind,\r\n status: 'pending',\r\n rawInput: asJsonObject(input),\r\n } satisfies Protocol.ToolCall,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n\r\n const options: Protocol.PermissionOption[] = [\r\n { optionId: 'allow_once', name: 'Allow once', kind: 'allow_once' },\r\n { optionId: 'reject_once', name: 'Reject', kind: 'reject_once' },\r\n ]\r\n if (Array.isArray((denied as any).suggestions) && (denied as any).suggestions.length > 0) {\r\n options.splice(1, 0, {\r\n optionId: 'allow_always',\r\n name: 'Allow always (remember)',\r\n kind: 'allow_always',\r\n })\r\n }\r\n\r\n try {\r\n const response = await this.peer.sendRequest<Protocol.RequestPermissionResponse>({\r\n method: 'session/request_permission',\r\n params: {\r\n sessionId: session.sessionId,\r\n toolCall: {\r\n toolCallId: toolUseId,\r\n title,\r\n kind,\r\n status: 'pending',\r\n content: [\r\n {\r\n type: 'content',\r\n content: { type: 'text', text: denied.message },\r\n },\r\n ],\r\n rawInput: asJsonObject(input),\r\n },\r\n options,\r\n } satisfies Protocol.RequestPermissionParams,\r\n signal: toolUseContext.abortController.signal,\r\n timeoutMs,\r\n })\r\n\r\n const outcome = response?.outcome\r\n if (!outcome || outcome.outcome === 'cancelled') {\r\n toolUseContext.abortController.abort()\r\n return { result: false as const, message: denied.message, shouldPromptUser: false }\r\n }\r\n\r\n if (outcome.outcome === 'selected' && outcome.optionId === 'allow_once') {\r\n this.captureFileSnapshotForTool(session, toolUseId, tool.name, input)\r\n return { result: true as const }\r\n }\r\n\r\n if (outcome.outcome === 'selected' && outcome.optionId === 'allow_always') {\r\n const suggestions = Array.isArray((denied as any).suggestions) ? ((denied as any).suggestions as any[]) : []\r\n if (suggestions.length > 0) {\r\n const next = applyToolPermissionContextUpdates(session.toolPermissionContext, suggestions as any)\r\n session.toolPermissionContext = next\r\n if (toolUseContext?.options) toolUseContext.options.toolPermissionContext = next\r\n for (const update of suggestions) {\r\n try {\r\n persistToolPermissionUpdateToDisk({ update, projectDir: session.cwd })\r\n } catch (e) {\r\n logError(e)\r\n }\r\n }\r\n }\r\n this.captureFileSnapshotForTool(session, toolUseId, tool.name, input)\r\n return { result: true as const }\r\n }\r\n\r\n return { result: false as const, message: denied.message }\r\n } catch (e) {\r\n const msg = e instanceof Error ? e.message : String(e)\r\n return { result: false as const, message: `Permission prompt failed: ${msg}`, shouldPromptUser: false }\r\n }\r\n }\r\n }\r\n\r\n private captureFileSnapshotForTool(\r\n session: SessionState,\r\n toolUseId: string,\r\n toolName: string,\r\n input: unknown,\r\n ): void {\r\n if (toolName !== 'Write' && toolName !== 'MultiEdit') return\r\n\r\n const filePath = input && typeof input === 'object' ? String((input as any).file_path ?? '') : ''\r\n if (!filePath) return\r\n\r\n const absPath = isAbsolute(filePath) ? filePath : resolve(session.cwd, filePath)\r\n\r\n const oldContent = existsSync(absPath) ? readTextFileForDiff(absPath) : ''\r\n if (oldContent === null) return\r\n\r\n const existing = session.toolCalls.get(toolUseId)\r\n if (existing) {\r\n existing.fileSnapshot = { path: absPath, content: oldContent }\r\n session.toolCalls.set(toolUseId, existing)\r\n return\r\n }\r\n\r\n session.toolCalls.set(toolUseId, {\r\n title: toolName,\r\n kind: toolKindForName(toolName),\r\n status: 'pending',\r\n rawInput: asJsonObject(input),\r\n fileSnapshot: { path: absPath, content: oldContent },\r\n })\r\n }\r\n\r\n private buildDiffContentForToolResult(\r\n session: SessionState,\r\n toolUseId: string,\r\n rawOutput: Protocol.JsonObject | undefined,\r\n ): Protocol.ToolCallContent | null {\r\n const existing = session.toolCalls.get(toolUseId)\r\n if (!existing || existing.kind !== 'edit') return null\r\n\r\n const inputFilePath =\r\n typeof existing.rawInput?.file_path === 'string'\r\n ? existing.rawInput.file_path\r\n : rawOutput && typeof (rawOutput as any).filePath === 'string'\r\n ? String((rawOutput as any).filePath)\r\n : ''\r\n\r\n if (!inputFilePath) return null\r\n\r\n const absPath = isAbsolute(inputFilePath) ? inputFilePath : resolve(session.cwd, inputFilePath)\r\n\r\n const oldText =\r\n rawOutput && typeof (rawOutput as any).originalFile === 'string'\r\n ? String((rawOutput as any).originalFile)\r\n : existing.fileSnapshot && existing.fileSnapshot.path === absPath\r\n ? existing.fileSnapshot.content\r\n : undefined\r\n\r\n if (oldText === undefined) return null\r\n\r\n const newTextFromDisk = readTextFileForDiff(absPath)\r\n const newTextFromOutput = rawOutput && typeof (rawOutput as any).content === 'string' ? String((rawOutput as any).content) : null\r\n const newText = newTextFromDisk ?? newTextFromOutput\r\n if (newText === null) return null\r\n\r\n return {\r\n type: 'diff',\r\n path: absPath,\r\n oldText: truncateDiffText(oldText),\r\n newText: truncateDiffText(newText),\r\n }\r\n }\r\n\r\n private replayConversation(session: SessionState): void {\r\n session.toolCalls.clear()\r\n\r\n for (const m of session.messages) {\r\n if (!m || typeof m !== 'object') continue\r\n\r\n if (m.type === 'assistant') {\r\n const blocks: any[] = Array.isArray((m as any).message?.content) ? ((m as any).message.content as any[]) : []\r\n for (const b of blocks) {\r\n if (!b || typeof b !== 'object') continue\r\n if (b.type === 'text' && typeof b.text === 'string') {\r\n this.sendAgentMessage(session.sessionId, b.text)\r\n } else if (b.type === 'thinking' && typeof (b as any).thinking === 'string') {\r\n this.sendAgentThought(session.sessionId, (b as any).thinking)\r\n } else if (b.type === 'tool_use') {\r\n const toolUseId = typeof b.id === 'string' ? b.id : ''\r\n const toolName = typeof b.name === 'string' ? b.name : ''\r\n const input = b.input && typeof b.input === 'object' && !Array.isArray(b.input) ? (b.input as Record<string, unknown>) : {}\r\n if (!toolUseId || !toolName) continue\r\n\r\n if (!session.toolCalls.has(toolUseId)) {\r\n const kind = toolKindForName(toolName)\r\n const title = titleForToolCall(toolName, input)\r\n session.toolCalls.set(toolUseId, {\r\n title,\r\n kind,\r\n status: 'pending',\r\n rawInput: asJsonObject(input),\r\n })\r\n this.peer.sendNotification('session/update', {\r\n sessionId: session.sessionId,\r\n update: {\r\n sessionUpdate: 'tool_call',\r\n toolCallId: toolUseId,\r\n title,\r\n kind,\r\n status: 'pending',\r\n rawInput: asJsonObject(input),\r\n } satisfies Protocol.ToolCall,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (m.type === 'user') {\r\n const content = (m as any)?.message?.content\r\n if (typeof content === 'string' && content.trim()) {\r\n this.sendUserMessage(session.sessionId, content)\r\n }\r\n\r\n const toolResults = extractToolResults(m)\r\n if (toolResults.length === 0) continue\r\n\r\n for (const tr of toolResults) {\r\n const existing = session.toolCalls.get(tr.toolUseId)\r\n const title = existing?.title ?? 'Tool'\r\n const kind = existing?.kind ?? 'other'\r\n\r\n if (!existing) {\r\n session.toolCalls.set(tr.toolUseId, { title, kind, status: 'pending' })\r\n this.peer.sendNotification('session/update', {\r\n sessionId: session.sessionId,\r\n update: {\r\n sessionUpdate: 'tool_call',\r\n toolCallId: tr.toolUseId,\r\n title,\r\n kind,\r\n status: 'pending',\r\n } satisfies Protocol.ToolCall,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n\r\n const status: Protocol.ToolCallStatus = tr.isError ? 'failed' : 'completed'\r\n const contentBlocks: Protocol.ToolCallContent[] = []\r\n if (tr.content) {\r\n contentBlocks.push({ type: 'content', content: { type: 'text', text: tr.content } })\r\n }\r\n\r\n const rawOutput = asJsonObject((m as any).toolUseResult?.data)\r\n\r\n this.sendToolCallUpdate(session.sessionId, {\r\n toolCallId: tr.toolUseId,\r\n status,\r\n ...(contentBlocks.length > 0 ? { content: contentBlocks } : {}),\r\n ...(rawOutput ? { rawOutput } : {}),\r\n })\r\n\r\n session.toolCalls.set(tr.toolUseId, {\r\n title,\r\n kind,\r\n status,\r\n rawInput: existing?.rawInput,\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n private getModeState(session: SessionState): Protocol.SessionModeState {\r\n const availableModes: Protocol.SessionMode[] = [\r\n { id: 'default', name: 'Default', description: 'Normal permissions (prompt when needed)' },\r\n { id: 'acceptEdits', name: 'Accept Edits', description: 'Auto-approve safe file edits' },\r\n { id: 'plan', name: 'Plan', description: 'Read-only planning mode' },\r\n { id: 'dontAsk', name: \"Don't Ask\", description: 'Auto-deny permission prompts' },\r\n { id: 'bypassPermissions', name: 'Bypass', description: 'Bypass permission prompts (dangerous)' },\r\n ]\r\n\r\n const currentModeId = availableModes.some(m => m.id === session.currentModeId) ? session.currentModeId : 'default'\r\n return { currentModeId, availableModes }\r\n }\r\n\r\n private sendAvailableCommands(session: SessionState): void {\r\n const availableCommands: Protocol.AvailableCommand[] = session.commands\r\n .filter(c => !c.isHidden)\r\n .map(c => ({\r\n name: c.userFacingName(),\r\n description: c.description,\r\n ...(c.argumentHint ? { input: { hint: c.argumentHint } } : {}),\r\n }))\r\n\r\n this.peer.sendNotification('session/update', {\r\n sessionId: session.sessionId,\r\n update: {\r\n sessionUpdate: 'available_commands_update',\r\n availableCommands,\r\n } satisfies Protocol.AvailableCommandsUpdate,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n\r\n private sendCurrentMode(session: SessionState): void {\r\n this.peer.sendNotification('session/update', {\r\n sessionId: session.sessionId,\r\n update: {\r\n sessionUpdate: 'current_mode_update',\r\n currentModeId: session.currentModeId,\r\n } satisfies Protocol.CurrentModeUpdate,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n\r\n private sendUserMessage(sessionId: string, text: string): void {\r\n if (!text) return\r\n this.peer.sendNotification('session/update', {\r\n sessionId,\r\n update: {\r\n sessionUpdate: 'user_message_chunk',\r\n content: { type: 'text', text },\r\n } satisfies Protocol.UserMessageChunk,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n\r\n private sendAgentMessage(sessionId: string, text: string): void {\r\n if (!text) return\r\n this.peer.sendNotification('session/update', {\r\n sessionId,\r\n update: {\r\n sessionUpdate: 'agent_message_chunk',\r\n content: { type: 'text', text },\r\n } satisfies Protocol.AgentMessageChunk,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n\r\n private sendAgentThought(sessionId: string, text: string): void {\r\n if (!text) return\r\n this.peer.sendNotification('session/update', {\r\n sessionId,\r\n update: {\r\n sessionUpdate: 'agent_thought_chunk',\r\n content: { type: 'text', text },\r\n } satisfies Protocol.AgentThoughtChunk,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n\r\n private sendToolCallUpdate(sessionId: string, update: Omit<Protocol.ToolCallUpdate, 'sessionUpdate'>): void {\r\n this.peer.sendNotification('session/update', {\r\n sessionId,\r\n update: {\r\n sessionUpdate: 'tool_call_update',\r\n ...update,\r\n } satisfies Protocol.ToolCallUpdate,\r\n } satisfies Protocol.SessionUpdateNotification)\r\n }\r\n}\r\n", "export const ACP_PROTOCOL_VERSION = 1\r\n\r\nexport type JsonObject = Record<string, unknown>\r\n\r\nexport type Implementation = {\r\n name: string\r\n title?: string | null\r\n version: string\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type FileSystemCapability = {\r\n readTextFile?: boolean\r\n writeTextFile?: boolean\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ClientCapabilities = {\r\n fs?: FileSystemCapability\r\n terminal?: boolean\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type PromptCapabilities = {\r\n audio?: boolean\r\n image?: boolean\r\n embeddedContext?: boolean\r\n embeddedContent?: boolean\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type McpCapabilities = {\r\n http?: boolean\r\n sse?: boolean\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AgentCapabilities = {\r\n loadSession?: boolean\r\n promptCapabilities?: PromptCapabilities\r\n mcpCapabilities?: McpCapabilities\r\n sessionCapabilities?: JsonObject\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AuthMethod = {\r\n id: string\r\n name: string\r\n description?: string | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type InitializeParams = {\r\n protocolVersion: number\r\n clientCapabilities?: ClientCapabilities\r\n clientInfo?: Implementation | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type InitializeResponse = {\r\n protocolVersion: number\r\n agentCapabilities: AgentCapabilities\r\n agentInfo?: Implementation | null\r\n authMethods?: AuthMethod[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AuthenticateParams = {\r\n methodId: string\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AuthenticateResponse = JsonObject\r\n\r\nexport type EnvVariable = {\r\n name: string\r\n value: string\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type HttpHeader = {\r\n name: string\r\n value: string\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type McpServerStdio = {\r\n type?: 'stdio'\r\n name: string\r\n command: string\r\n args: string[]\r\n env: EnvVariable[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type McpServerHttp = {\r\n type: 'http'\r\n name: string\r\n url: string\r\n headers: HttpHeader[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type McpServerSse = {\r\n type: 'sse'\r\n name: string\r\n url: string\r\n headers: HttpHeader[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type McpServer = McpServerStdio | McpServerHttp | McpServerSse\r\n\r\nexport type SessionModeId = string\r\n\r\nexport type SessionMode = {\r\n id: SessionModeId\r\n name: string\r\n description?: string | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type SessionModeState = {\r\n currentModeId: SessionModeId\r\n availableModes: SessionMode[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type NewSessionParams = {\r\n cwd: string\r\n mcpServers: McpServer[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type NewSessionResponse = {\r\n sessionId: string\r\n modes?: SessionModeState | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type LoadSessionParams = {\r\n sessionId: string\r\n cwd: string\r\n mcpServers: McpServer[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type LoadSessionResponse = {\r\n modes?: SessionModeState | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type StopReason =\r\n | 'end_turn'\r\n | 'max_tokens'\r\n | 'max_turn_requests'\r\n | 'refusal'\r\n | 'cancelled'\r\n\r\nexport type PromptResponse = {\r\n stopReason: StopReason\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type SessionCancelParams = {\r\n sessionId: string\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type SetSessionModeParams = {\r\n sessionId: string\r\n modeId: SessionModeId\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type SetSessionModeResponse = JsonObject\r\n\r\nexport type TextContent = {\r\n type: 'text'\r\n text: string\r\n annotations?: JsonObject | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ImageContent = {\r\n type: 'image'\r\n data?: string\r\n mimeType?: string\r\n url?: string\r\n annotations?: JsonObject | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AudioContent = {\r\n type: 'audio'\r\n data: string\r\n mimeType: string\r\n annotations?: JsonObject | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type EmbeddedResource = {\r\n uri: string\r\n mimeType?: string | null\r\n text?: string\r\n blob?: string\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type EmbeddedResourceContent = {\r\n type: 'resource'\r\n resource: EmbeddedResource\r\n annotations?: JsonObject | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ResourceLinkContent = {\r\n type: 'resource_link'\r\n uri: string\r\n name: string\r\n title?: string | null\r\n description?: string | null\r\n mimeType?: string | null\r\n size?: number | null\r\n annotations?: JsonObject | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ContentBlock =\r\n | TextContent\r\n | ImageContent\r\n | AudioContent\r\n | EmbeddedResourceContent\r\n | ResourceLinkContent\r\n\r\nexport type PromptParams = {\r\n sessionId: string\r\n prompt: ContentBlock[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type SessionUpdateKind =\r\n | 'user_message_chunk'\r\n | 'agent_message_chunk'\r\n | 'agent_thought_chunk'\r\n | 'tool_call'\r\n | 'tool_call_update'\r\n | 'plan'\r\n | 'available_commands_update'\r\n | 'current_mode_update'\r\n\r\nexport type PlanEntryPriority = 'high' | 'medium' | 'low'\r\n\r\nexport type PlanEntryStatus = 'pending' | 'in_progress' | 'completed'\r\n\r\nexport type PlanEntry = {\r\n content: string\r\n priority: PlanEntryPriority\r\n status: PlanEntryStatus\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type PlanUpdate = {\r\n sessionUpdate: 'plan'\r\n entries: PlanEntry[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ToolKind =\r\n | 'read'\r\n | 'edit'\r\n | 'delete'\r\n | 'move'\r\n | 'search'\r\n | 'execute'\r\n | 'think'\r\n | 'fetch'\r\n | 'switch_mode'\r\n | 'other'\r\n\r\nexport type ToolCallStatus = 'pending' | 'in_progress' | 'completed' | 'failed'\r\n\r\nexport type ToolCallLocation = {\r\n path: string\r\n line?: number | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ToolCallContent =\r\n | { type: 'content'; content: ContentBlock; _meta?: JsonObject | null }\r\n | {\r\n type: 'diff'\r\n path: string\r\n newText: string\r\n oldText?: string | null\r\n _meta?: JsonObject | null\r\n }\r\n | { type: 'terminal'; terminalId: string; _meta?: JsonObject | null }\r\n\r\nexport type ToolCall = {\r\n sessionUpdate: 'tool_call'\r\n toolCallId: string\r\n title: string\r\n kind?: ToolKind\r\n status?: ToolCallStatus\r\n content?: ToolCallContent[]\r\n locations?: ToolCallLocation[]\r\n rawInput?: JsonObject\r\n rawOutput?: JsonObject\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ToolCallUpdate = {\r\n sessionUpdate: 'tool_call_update'\r\n toolCallId: string\r\n title?: string | null\r\n kind?: ToolKind | null\r\n status?: ToolCallStatus | null\r\n content?: ToolCallContent[] | null\r\n locations?: ToolCallLocation[] | null\r\n rawInput?: JsonObject\r\n rawOutput?: JsonObject\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type ToolCallUpdatePermissionRequest = Omit<ToolCallUpdate, 'sessionUpdate'>\r\n\r\nexport type PermissionOptionKind =\r\n | 'allow_once'\r\n | 'allow_always'\r\n | 'reject_once'\r\n | 'reject_always'\r\n\r\nexport type PermissionOption = {\r\n optionId: string\r\n name: string\r\n kind: PermissionOptionKind\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type OutcomeCancelled = { outcome: 'cancelled'; _meta?: JsonObject | null }\r\nexport type OutcomeSelected = {\r\n outcome: 'selected'\r\n optionId: string\r\n _meta?: JsonObject | null\r\n}\r\nexport type RequestPermissionOutcome = OutcomeCancelled | OutcomeSelected\r\n\r\nexport type RequestPermissionParams = {\r\n sessionId: string\r\n toolCall: ToolCallUpdatePermissionRequest\r\n options: PermissionOption[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type RequestPermissionResponse = {\r\n outcome: RequestPermissionOutcome\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AvailableCommandInput = { hint: string; _meta?: JsonObject | null }\r\nexport type AvailableCommand = {\r\n name: string\r\n description: string\r\n input?: AvailableCommandInput | null\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AvailableCommandsUpdate = {\r\n sessionUpdate: 'available_commands_update'\r\n availableCommands: AvailableCommand[]\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type CurrentModeUpdate = {\r\n sessionUpdate: 'current_mode_update'\r\n currentModeId: SessionModeId\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type UserMessageChunk = {\r\n sessionUpdate: 'user_message_chunk'\r\n content: ContentBlock\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AgentMessageChunk = {\r\n sessionUpdate: 'agent_message_chunk'\r\n content: ContentBlock\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type AgentThoughtChunk = {\r\n sessionUpdate: 'agent_thought_chunk'\r\n content: ContentBlock\r\n _meta?: JsonObject | null\r\n}\r\n\r\nexport type SessionUpdate =\r\n | UserMessageChunk\r\n | AgentMessageChunk\r\n | AgentThoughtChunk\r\n | ToolCall\r\n | ToolCallUpdate\r\n | PlanUpdate\r\n | AvailableCommandsUpdate\r\n | CurrentModeUpdate\r\n\r\nexport type SessionUpdateNotification = {\r\n sessionId: string\r\n update: SessionUpdate\r\n _meta?: JsonObject | null\r\n}\r\n", "#!/usr/bin/env bun\r\nimport '@utils/config/sanitizeAnthropicEnv'\r\nimport { initSentry } from '@services/sentry'\r\nimport { ensurePackagedRuntimeEnv } from './cli/bootstrapEnv'\r\nimport { initDebugLogger } from '@utils/log/debugLogger'\r\nimport { enableConfigs } from '@utils/config'\r\nimport { logError } from '@utils/log'\r\n\r\nimport { JsonRpcPeer } from '../acp/jsonrpc'\r\nimport { StdioTransport } from '../acp/stdioTransport'\r\nimport { installStdoutGuard } from '../acp/stdoutGuard'\r\nimport { KodeAcpAgent } from '../acp/kodeAcpAgent'\r\n\r\ninitSentry()\r\nensurePackagedRuntimeEnv()\r\n\r\nconst { writeAcpLine } = installStdoutGuard()\r\n\r\ninitDebugLogger()\r\ntry {\r\n enableConfigs()\r\n} catch (e) {\r\n logError(e)\r\n}\r\n\r\nconst peer = new JsonRpcPeer()\r\nnew KodeAcpAgent(peer)\r\n\r\nconst transport = new StdioTransport(peer, { writeLine: writeAcpLine })\r\ntransport.start()\r\n\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["resolve", "peer", "format", "writeAcpLine", "transport", "peer"]
|
|
7
|
-
}
|
package/dist/ask-MGUO3L35.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/app/ask.ts"],
|
|
4
|
-
"sourcesContent": ["import { last } from 'lodash-es'\r\nimport { Command } from '@commands'\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 { Tool } from '@tool'\r\nimport { getModelManager } from '@utils/model'\r\nimport { setCwd } from '@utils/state'\r\nimport { getMessagesPath, overwriteLog } from '@utils/log'\r\nimport { createUserMessage } from '@utils/messages'\r\n\r\ntype Props = {\r\n commands: Command[]\r\n safeMode?: boolean\r\n hasPermissionsToUseTool: CanUseToolFn\r\n messageLogName: string\r\n prompt: string\r\n cwd: string\r\n tools: Tool[]\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 commands,\r\n safeMode,\r\n hasPermissionsToUseTool,\r\n messageLogName,\r\n prompt,\r\n cwd,\r\n tools,\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, model] = await Promise.all([\r\n getSystemPrompt({ domain }),\r\n getContext(),\r\n getModelManager().getModelName('main'),\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 options: {\r\n commands,\r\n tools,\r\n verbose,\r\n safeMode,\r\n forkNumber: 0,\r\n messageLogName: 'unused',\r\n maxThinkingTokens: 0,\r\n persistSession,\r\n },\r\n abortController: new AbortController(),\r\n messageId: undefined,\r\n readFileTimestamps: {},\r\n setToolJSX: () => {},\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;AA2BrB,eAAsB,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;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,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,gBAAgB,EAAE,OAAO,CAAC;AAAA,IAC1B,WAAW;AAAA,IACX,gBAAgB,EAAE,aAAa,MAAM;AAAA,EACvC,CAAC;AAED,mBAAiB,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,QACnB;AAAA,MACF;AAAA,MACA,iBAAiB,IAAI,gBAAgB;AAAA,MACrC,WAAW;AAAA,MACX,oBAAoB,CAAC;AAAA,MACrB,YAAY,MAAM;AAAA,MAAC;AAAA,IACrB;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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/services/plugins/customCommands.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, readFileSync, readdirSync, statSync } from 'fs'\r\nimport { basename, dirname, join, relative, resolve, sep } from 'path'\r\nimport { homedir } from 'os'\r\nimport { memoize } from 'lodash-es'\r\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\r\nimport type { Command } from '@commands'\r\nimport { getCwd } from '@utils/state'\r\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\r\nimport { getKodeBaseDir } from '@utils/config/env'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\nimport { logError } from '@utils/log'\r\nimport { execFile } from 'child_process'\r\nimport { promisify } from 'util'\r\nimport matter from 'gray-matter'\r\nimport yaml from 'js-yaml'\r\n\r\nconst execFileAsync = promisify(execFile)\r\n\r\nexport async function executeBashCommands(content: string): Promise<string> {\r\n const bashCommandRegex = /!\\`([^`]+)\\`/g\r\n const matches = [...content.matchAll(bashCommandRegex)]\r\n\r\n if (matches.length === 0) {\r\n return content\r\n }\r\n\r\n let result = content\r\n\r\n for (const match of matches) {\r\n const fullMatch = match[0]\r\n const command = match[1].trim()\r\n\r\n try {\r\n const parts = command.split(/\\s+/)\r\n const cmd = parts[0]\r\n const args = parts.slice(1)\r\n\r\n const { stdout, stderr } = await execFileAsync(cmd, args, {\r\n timeout: 5000,\r\n encoding: 'utf8',\r\n cwd: getCwd(),\r\n })\r\n\r\n const output = stdout.trim() || stderr.trim() || '(no output)'\r\n result = result.replace(fullMatch, output)\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('CUSTOM_COMMAND_BASH_EXEC_FAILED', {\r\n command,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n result = result.replace(fullMatch, `(error executing: ${command})`)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport async function resolveFileReferences(content: string): Promise<string> {\r\n const fileRefRegex = /@([a-zA-Z0-9/._-]+(?:\\.[a-zA-Z0-9]+)?)/g\r\n const matches = [...content.matchAll(fileRefRegex)]\r\n\r\n if (matches.length === 0) {\r\n return content\r\n }\r\n\r\n let result = content\r\n\r\n for (const match of matches) {\r\n const fullMatch = match[0]\r\n const filePath = match[1]\r\n\r\n if (filePath.startsWith('agent-')) {\r\n continue\r\n }\r\n\r\n try {\r\n const fullPath = join(getCwd(), filePath)\r\n\r\n if (existsSync(fullPath)) {\r\n const fileContent = readFileSync(fullPath, { encoding: 'utf-8' })\r\n\r\n const formattedContent = `\\n\\n## File: ${filePath}\\n\\`\\`\\`\\n${fileContent}\\n\\`\\`\\`\\n`\r\n result = result.replace(fullMatch, formattedContent)\r\n } else {\r\n result = result.replace(fullMatch, `(file not found: ${filePath})`)\r\n }\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('CUSTOM_COMMAND_FILE_READ_FAILED', {\r\n filePath,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n result = result.replace(fullMatch, `(error reading: ${filePath})`)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport interface CustomCommandFrontmatter {\r\n description?: string\r\n 'allowed-tools'?: string[]\r\n 'argument-hint'?: string\r\n when_to_use?: string\r\n version?: string\r\n model?: string\r\n maxThinkingTokens?: number | string\r\n max_thinking_tokens?: number | string\r\n 'max-thinking-tokens'?: number | string\r\n name?: string\r\n 'disable-model-invocation'?: boolean | string\r\n}\r\n\r\nexport interface CustomCommandWithScope {\r\n type: 'prompt'\r\n name: string\r\n description: string\r\n isEnabled: boolean\r\n isHidden: boolean\r\n aliases?: string[]\r\n progressMessage: string\r\n userFacingName(): string\r\n getPromptForCommand(args: string): Promise<MessageParam[]>\r\n allowedTools?: string[]\r\n maxThinkingTokens?: number\r\n argumentHint?: string\r\n whenToUse?: string\r\n version?: string\r\n model?: string\r\n isSkill?: boolean\r\n disableModelInvocation?: boolean\r\n hasUserSpecifiedDescription?: boolean\r\n source?: 'localSettings' | 'userSettings' | 'pluginDir'\r\n scope?: 'user' | 'project'\r\n filePath?: string\r\n}\r\n\r\nexport interface CustomCommandFile {\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n filePath: string\r\n}\r\n\r\nexport function parseFrontmatter(content: string): {\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n} {\r\n const yamlSchema = (yaml as any).JSON_SCHEMA\r\n const parsed = matter(content, {\r\n engines: {\r\n yaml: {\r\n parse: (input: string) =>\r\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\r\n {},\r\n },\r\n },\r\n })\r\n return {\r\n frontmatter: (parsed.data ?? {}) as CustomCommandFrontmatter,\r\n content: parsed.content ?? '',\r\n }\r\n}\r\n\r\ntype CommandSource = 'localSettings' | 'userSettings' | 'pluginDir'\r\n\r\nfunction isSkillMarkdownFile(filePath: string): boolean {\r\n return /^skill\\.md$/i.test(basename(filePath))\r\n}\r\n\r\nfunction getUserKodeBaseDir(): string {\r\n return getKodeBaseDir()\r\n}\r\n\r\nfunction toBoolean(value: unknown): boolean {\r\n if (typeof value === 'boolean') return value\r\n if (typeof value === 'string') {\r\n const normalized = value.trim().toLowerCase()\r\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\r\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\r\n }\r\n return false\r\n}\r\n\r\nfunction parseAllowedTools(value: unknown): string[] {\r\n if (Array.isArray(value)) {\r\n return value.map(v => String(v).trim()).filter(Boolean)\r\n }\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim()\r\n if (!trimmed) return []\r\n return trimmed\r\n .split(/\\s+/)\r\n .map(v => v.trim())\r\n .filter(Boolean)\r\n }\r\n return []\r\n}\r\n\r\nfunction parseMaxThinkingTokens(\r\n frontmatter: CustomCommandFrontmatter,\r\n): number | undefined {\r\n const raw =\r\n (frontmatter as any).maxThinkingTokens ??\r\n (frontmatter as any).max_thinking_tokens ??\r\n (frontmatter as any)['max-thinking-tokens'] ??\r\n (frontmatter as any)['max_thinking_tokens']\r\n if (raw === undefined || raw === null) return undefined\r\n const value = typeof raw === 'number' ? raw : Number(String(raw).trim())\r\n if (!Number.isFinite(value) || value < 0) return undefined\r\n return Math.floor(value)\r\n}\r\n\r\nfunction sourceLabel(source: CommandSource): string {\r\n if (source === 'localSettings') return 'project'\r\n if (source === 'userSettings') return 'user'\r\n if (source === 'pluginDir') return 'plugin'\r\n return 'unknown'\r\n}\r\n\r\nfunction extractDescriptionFromMarkdown(\r\n markdown: string,\r\n fallback: string,\r\n): string {\r\n const lines = markdown.split(/\\r?\\n/)\r\n for (const line of lines) {\r\n const trimmed = line.trim()\r\n if (!trimmed) continue\r\n const heading = trimmed.match(/^#{1,6}\\s+(.*)$/)\r\n if (heading?.[1]) return heading[1].trim()\r\n return trimmed.length > 120 ? `${trimmed.slice(0, 117)}...` : trimmed\r\n }\r\n return fallback\r\n}\r\n\r\nfunction namespaceFromDirPath(dirPath: string, baseDir: string): string {\r\n const relPath = relative(baseDir, dirPath)\r\n if (!relPath || relPath === '.' || relPath.startsWith('..')) return ''\r\n return relPath.split(sep).join(':')\r\n}\r\n\r\nfunction nameForCommandFile(filePath: string, baseDir: string): string {\r\n if (isSkillMarkdownFile(filePath)) {\r\n const skillDir = dirname(filePath)\r\n const parentDir = dirname(skillDir)\r\n const skillName = basename(skillDir)\r\n const namespace = namespaceFromDirPath(parentDir, baseDir)\r\n return namespace ? `${namespace}:${skillName}` : skillName\r\n }\r\n\r\n const dir = dirname(filePath)\r\n const namespace = namespaceFromDirPath(dir, baseDir)\r\n const fileName = basename(filePath).replace(/\\.md$/i, '')\r\n return namespace ? `${namespace}:${fileName}` : fileName\r\n}\r\n\r\ntype CommandFileRecord = {\r\n baseDir: string\r\n filePath: string\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n source: CommandSource\r\n scope: 'user' | 'project'\r\n}\r\n\r\nfunction buildPluginQualifiedName(\r\n pluginName: string,\r\n localName: string,\r\n): string {\r\n const p = pluginName.trim()\r\n const l = localName.trim()\r\n if (!p) return l\r\n if (!l || l === p) return p\r\n return `${p}:${l}`\r\n}\r\n\r\nfunction nameForPluginCommandFile(\r\n filePath: string,\r\n commandsDir: string,\r\n pluginName: string,\r\n): string {\r\n const rel = relative(commandsDir, filePath)\r\n const noExt = rel.replace(/\\.md$/i, '')\r\n const localName = noExt.split(sep).filter(Boolean).join(':')\r\n return buildPluginQualifiedName(pluginName, localName)\r\n}\r\n\r\nfunction createPluginPromptCommandFromFile(record: {\r\n pluginName: string\r\n commandsDir: string\r\n filePath: string\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n}): CustomCommandWithScope | null {\r\n const name = nameForPluginCommandFile(\r\n record.filePath,\r\n record.commandsDir,\r\n record.pluginName,\r\n )\r\n if (!name) return null\r\n\r\n const descriptionText =\r\n record.frontmatter.description ??\r\n extractDescriptionFromMarkdown(record.content, 'Custom command')\r\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\r\n const argumentHint = record.frontmatter['argument-hint']\r\n const whenToUse = record.frontmatter.when_to_use\r\n const version = record.frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n record.frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n record.frontmatter.model === 'inherit'\r\n ? undefined\r\n : record.frontmatter.model\r\n\r\n return {\r\n type: 'prompt',\r\n name,\r\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\r\n isEnabled: true,\r\n isHidden: false,\r\n filePath: record.filePath,\r\n aliases: [],\r\n progressMessage: 'running',\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill: false,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!record.frontmatter.description,\r\n source: 'pluginDir',\r\n scope: 'project',\r\n userFacingName() {\r\n return name\r\n },\r\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\r\n let prompt = record.content\r\n const trimmedArgs = args.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n }\r\n}\r\n\r\nfunction loadPluginCommandsFromDir(args: {\r\n pluginName: string\r\n commandsDir: string\r\n signal: AbortSignal\r\n}): CustomCommandWithScope[] {\r\n let commandsBaseDir = args.commandsDir\r\n let files: string[] = []\r\n try {\r\n const st = statSync(args.commandsDir)\r\n if (st.isFile()) {\r\n if (!args.commandsDir.toLowerCase().endsWith('.md')) return []\r\n files = [args.commandsDir]\r\n commandsBaseDir = dirname(args.commandsDir)\r\n } else if (st.isDirectory()) {\r\n files = listMarkdownFilesRecursively(args.commandsDir, args.signal)\r\n } else {\r\n return []\r\n }\r\n } catch {\r\n return []\r\n }\r\n\r\n const out: CustomCommandWithScope[] = []\r\n for (const filePath of files) {\r\n if (args.signal.aborted) break\r\n try {\r\n const raw = readFileSync(filePath, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n const cmd = createPluginPromptCommandFromFile({\r\n pluginName: args.pluginName,\r\n commandsDir: commandsBaseDir,\r\n filePath,\r\n frontmatter,\r\n content,\r\n })\r\n if (cmd) out.push(cmd)\r\n } catch {\r\n }\r\n }\r\n return out\r\n}\r\n\r\nfunction loadPluginSkillDirectoryCommandsFromBaseDir(args: {\r\n pluginName: string\r\n skillsDir: string\r\n}): CustomCommandWithScope[] {\r\n if (!existsSync(args.skillsDir)) return []\r\n\r\n const out: CustomCommandWithScope[] = []\r\n let entries\r\n try {\r\n entries = readdirSync(args.skillsDir, { withFileTypes: true })\r\n } catch {\r\n return []\r\n }\r\n\r\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\r\n const validateName = (skillName: string): boolean => {\r\n if (skillName.length < 1 || skillName.length > 64) return false\r\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\r\n const skillDir = join(args.skillsDir, entry.name)\r\n const skillFileCandidates = [\r\n join(skillDir, 'SKILL.md'),\r\n join(skillDir, 'skill.md'),\r\n ]\r\n const skillFile = skillFileCandidates.find(p => existsSync(p))\r\n if (!skillFile) continue\r\n\r\n try {\r\n const raw = readFileSync(skillFile, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n\r\n const dirName = entry.name\r\n const declaredName =\r\n typeof (frontmatter as any).name === 'string'\r\n ? String((frontmatter as any).name).trim()\r\n : ''\r\n const effectiveDeclaredName =\r\n declaredName && declaredName === dirName ? declaredName : ''\r\n if (declaredName && declaredName !== dirName) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\r\n dirName,\r\n declaredName,\r\n skillFile,\r\n })\r\n }\r\n const name = buildPluginQualifiedName(args.pluginName, dirName)\r\n if (!validateName(dirName)) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { dirName, skillFile })\r\n }\r\n const descriptionText =\r\n frontmatter.description ??\r\n extractDescriptionFromMarkdown(content, 'Skill')\r\n if (strictMode) {\r\n const d =\r\n typeof frontmatter.description === 'string'\r\n ? frontmatter.description.trim()\r\n : ''\r\n if (!d || d.length > 1024) continue\r\n }\r\n\r\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\r\n const argumentHint = frontmatter['argument-hint']\r\n const whenToUse = frontmatter.when_to_use\r\n const version = frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\r\n\r\n out.push({\r\n type: 'prompt',\r\n name,\r\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\r\n isEnabled: true,\r\n isHidden: true,\r\n aliases: [],\r\n filePath: skillFile,\r\n progressMessage: 'loading',\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill: true,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!frontmatter.description,\r\n source: 'pluginDir',\r\n scope: 'project',\r\n userFacingName() {\r\n return effectiveDeclaredName\r\n ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName)\r\n : name\r\n },\r\n async getPromptForCommand(argsText: string): Promise<MessageParam[]> {\r\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\r\n const trimmedArgs = argsText.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n })\r\n } catch {\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nfunction applySkillFilePreference(\r\n files: CommandFileRecord[],\r\n): CommandFileRecord[] {\r\n const grouped = new Map<string, CommandFileRecord[]>()\r\n for (const file of files) {\r\n const key = dirname(file.filePath)\r\n const existing = grouped.get(key) ?? []\r\n existing.push(file)\r\n grouped.set(key, existing)\r\n }\r\n\r\n const result: CommandFileRecord[] = []\r\n for (const group of grouped.values()) {\r\n const skillFiles = group.filter(f => isSkillMarkdownFile(f.filePath))\r\n if (skillFiles.length > 0) {\r\n result.push(skillFiles[0]!)\r\n continue\r\n }\r\n result.push(...group)\r\n }\r\n return result\r\n}\r\n\r\nfunction createPromptCommandFromFile(\r\n record: CommandFileRecord,\r\n): CustomCommandWithScope | null {\r\n const isSkill = isSkillMarkdownFile(record.filePath)\r\n const name = nameForCommandFile(record.filePath, record.baseDir)\r\n if (!name) return null\r\n\r\n const descriptionText =\r\n record.frontmatter.description ??\r\n extractDescriptionFromMarkdown(\r\n record.content,\r\n isSkill ? 'Skill' : 'Custom command',\r\n )\r\n\r\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\r\n const argumentHint = record.frontmatter['argument-hint']\r\n const whenToUse = record.frontmatter.when_to_use\r\n const version = record.frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n record.frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n record.frontmatter.model === 'inherit'\r\n ? undefined\r\n : record.frontmatter.model\r\n\r\n const description = `${descriptionText} (${sourceLabel(record.source)})`\r\n const progressMessage = isSkill ? 'loading' : 'running'\r\n const skillBaseDir = isSkill ? dirname(record.filePath) : undefined\r\n\r\n return {\r\n type: 'prompt',\r\n name,\r\n description,\r\n isEnabled: true,\r\n isHidden: false,\r\n filePath: record.filePath,\r\n aliases: [],\r\n progressMessage,\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!record.frontmatter.description,\r\n source: record.source,\r\n scope: record.scope,\r\n userFacingName() {\r\n return name\r\n },\r\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\r\n let prompt = record.content\r\n if (isSkill && skillBaseDir) {\r\n prompt = `Base directory for this skill: ${skillBaseDir}\\n\\n${prompt}`\r\n }\r\n const trimmedArgs = args.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n }\r\n}\r\n\r\nfunction listMarkdownFilesRecursively(\r\n baseDir: string,\r\n signal: AbortSignal,\r\n): string[] {\r\n const results: string[] = []\r\n const queue: string[] = [baseDir]\r\n while (queue.length > 0) {\r\n if (signal.aborted) break\r\n const currentDir = queue.pop()!\r\n let entries\r\n try {\r\n entries = readdirSync(currentDir, { withFileTypes: true })\r\n } catch {\r\n continue\r\n }\r\n for (const entry of entries) {\r\n if (signal.aborted) break\r\n const fullPath = join(currentDir, entry.name)\r\n if (entry.isDirectory()) {\r\n queue.push(fullPath)\r\n continue\r\n }\r\n if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {\r\n results.push(fullPath)\r\n }\r\n }\r\n }\r\n return results\r\n}\r\n\r\nfunction loadCommandMarkdownFilesFromBaseDir(\r\n baseDir: string,\r\n source: CommandSource,\r\n scope: 'user' | 'project',\r\n signal: AbortSignal,\r\n): CommandFileRecord[] {\r\n if (!existsSync(baseDir)) return []\r\n const files = listMarkdownFilesRecursively(baseDir, signal)\r\n const records: CommandFileRecord[] = []\r\n for (const filePath of files) {\r\n if (signal.aborted) break\r\n try {\r\n const raw = readFileSync(filePath, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n records.push({ baseDir, filePath, frontmatter, content, source, scope })\r\n } catch {\r\n }\r\n }\r\n return records\r\n}\r\n\r\nfunction loadSkillDirectoryCommandsFromBaseDir(\r\n skillsDir: string,\r\n source: CommandSource,\r\n scope: 'user' | 'project',\r\n): CustomCommandWithScope[] {\r\n if (!existsSync(skillsDir)) return []\r\n\r\n const out: CustomCommandWithScope[] = []\r\n let entries\r\n try {\r\n entries = readdirSync(skillsDir, { withFileTypes: true })\r\n } catch {\r\n return []\r\n }\r\n\r\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\r\n const validateName = (skillName: string): boolean => {\r\n if (skillName.length < 1 || skillName.length > 64) return false\r\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\r\n const skillDir = join(skillsDir, entry.name)\r\n const skillFileCandidates = [\r\n join(skillDir, 'SKILL.md'),\r\n join(skillDir, 'skill.md'),\r\n ]\r\n const skillFile = skillFileCandidates.find(p => existsSync(p))\r\n if (!skillFile) continue\r\n\r\n try {\r\n const raw = readFileSync(skillFile, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n\r\n const dirName = entry.name\r\n const declaredName =\r\n typeof (frontmatter as any).name === 'string'\r\n ? String((frontmatter as any).name).trim()\r\n : ''\r\n const effectiveDeclaredName =\r\n declaredName && declaredName === dirName ? declaredName : ''\r\n if (declaredName && declaredName !== dirName) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\r\n dirName,\r\n declaredName,\r\n skillFile,\r\n })\r\n }\r\n const name = dirName\r\n if (!validateName(name)) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { name, skillFile })\r\n }\r\n const descriptionText =\r\n frontmatter.description ??\r\n extractDescriptionFromMarkdown(content, 'Skill')\r\n if (strictMode) {\r\n const d =\r\n typeof frontmatter.description === 'string'\r\n ? frontmatter.description.trim()\r\n : ''\r\n if (!d || d.length > 1024) continue\r\n }\r\n\r\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\r\n const argumentHint = frontmatter['argument-hint']\r\n const whenToUse = frontmatter.when_to_use\r\n const version = frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\r\n\r\n out.push({\r\n type: 'prompt',\r\n name,\r\n description: `${descriptionText} (${sourceLabel(source)})`,\r\n isEnabled: true,\r\n isHidden: true,\r\n aliases: [],\r\n filePath: skillFile,\r\n progressMessage: 'loading',\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill: true,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!frontmatter.description,\r\n source,\r\n scope,\r\n userFacingName() {\r\n return effectiveDeclaredName || name\r\n },\r\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\r\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\r\n const trimmedArgs = args.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n })\r\n } catch {\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nexport const loadCustomCommands = memoize(\r\n async (): Promise<CustomCommandWithScope[]> => {\r\n const cwd = getCwd()\r\n const userKodeBaseDir = getUserKodeBaseDir()\r\n const sessionPlugins = getSessionPlugins()\r\n\r\n const projectLegacyCommandsDir = join(cwd, '.claude', 'commands')\r\n const userLegacyCommandsDir = join(homedir(), '.claude', 'commands')\r\n const projectKodeCommandsDir = join(cwd, '.newcraw', 'commands')\r\n const userKodeCommandsDir = join(userKodeBaseDir, 'commands')\r\n\r\n const projectLegacySkillsDir = join(cwd, '.claude', 'skills')\r\n const userLegacySkillsDir = join(homedir(), '.claude', 'skills')\r\n const projectKodeSkillsDir = join(cwd, '.newcraw', 'skills')\r\n const userKodeSkillsDir = join(userKodeBaseDir, 'skills')\r\n\r\n const abortController = new AbortController()\r\n const timeout = setTimeout(() => abortController.abort(), 3000)\r\n\r\n try {\r\n const commandFiles = applySkillFilePreference([\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n projectLegacyCommandsDir,\r\n 'localSettings',\r\n 'project',\r\n abortController.signal,\r\n ),\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n projectKodeCommandsDir,\r\n 'localSettings',\r\n 'project',\r\n abortController.signal,\r\n ),\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n userLegacyCommandsDir,\r\n 'userSettings',\r\n 'user',\r\n abortController.signal,\r\n ),\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n userKodeCommandsDir,\r\n 'userSettings',\r\n 'user',\r\n abortController.signal,\r\n ),\r\n ])\r\n\r\n const fileCommands = commandFiles\r\n .map(createPromptCommandFromFile)\r\n .filter((cmd): cmd is CustomCommandWithScope => cmd !== null)\r\n\r\n const skillDirCommands: CustomCommandWithScope[] = [\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n projectLegacySkillsDir,\r\n 'localSettings',\r\n 'project',\r\n ),\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n projectKodeSkillsDir,\r\n 'localSettings',\r\n 'project',\r\n ),\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n userLegacySkillsDir,\r\n 'userSettings',\r\n 'user',\r\n ),\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n userKodeSkillsDir,\r\n 'userSettings',\r\n 'user',\r\n ),\r\n ]\r\n\r\n const pluginCommands: CustomCommandWithScope[] = []\r\n if (sessionPlugins.length > 0) {\r\n for (const plugin of sessionPlugins) {\r\n for (const commandsDir of plugin.commandsDirs) {\r\n pluginCommands.push(\r\n ...loadPluginCommandsFromDir({\r\n pluginName: plugin.name,\r\n commandsDir,\r\n signal: abortController.signal,\r\n }),\r\n )\r\n }\r\n for (const skillsDir of plugin.skillsDirs) {\r\n pluginCommands.push(\r\n ...loadPluginSkillDirectoryCommandsFromBaseDir({\r\n pluginName: plugin.name,\r\n skillsDir,\r\n }),\r\n )\r\n }\r\n }\r\n }\r\n\r\n const ordered = [\r\n ...fileCommands,\r\n ...skillDirCommands,\r\n ...pluginCommands,\r\n ].filter(cmd => cmd.isEnabled)\r\n\r\n const seen = new Set<string>()\r\n const unique: CustomCommandWithScope[] = []\r\n for (const cmd of ordered) {\r\n const key = cmd.userFacingName()\r\n if (seen.has(key)) continue\r\n seen.add(key)\r\n unique.push(cmd)\r\n }\r\n\r\n return unique\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('CUSTOM_COMMANDS_LOAD_FAILED', {\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n return []\r\n } finally {\r\n clearTimeout(timeout)\r\n }\r\n },\r\n () => {\r\n const cwd = getCwd()\r\n const userKodeBaseDir = getUserKodeBaseDir()\r\n const dirs = [\r\n join(homedir(), '.claude', 'commands'),\r\n join(cwd, '.claude', 'commands'),\r\n join(userKodeBaseDir, 'commands'),\r\n join(cwd, '.newcraw', 'commands'),\r\n join(homedir(), '.claude', 'skills'),\r\n join(cwd, '.claude', 'skills'),\r\n join(userKodeBaseDir, 'skills'),\r\n join(cwd, '.newcraw', 'skills'),\r\n ]\r\n const exists = dirs.map(d => (existsSync(d) ? '1' : '0')).join('')\r\n return `${cwd}:${exists}:${Math.floor(Date.now() / 60000)}`\r\n },\r\n)\r\n\r\nexport const reloadCustomCommands = (): void => {\r\n loadCustomCommands.cache.clear()\r\n}\r\n\r\nexport function getCustomCommandDirectories(): {\r\n userClaudeCommands: string\r\n projectClaudeCommands: string\r\n userClaudeSkills: string\r\n projectClaudeSkills: string\r\n userKodeCommands: string\r\n projectKodeCommands: string\r\n userKodeSkills: string\r\n projectKodeSkills: string\r\n} {\r\n const userKodeBaseDir = getUserKodeBaseDir()\r\n return {\r\n userClaudeCommands: join(homedir(), '.claude', 'commands'),\r\n projectClaudeCommands: join(getCwd(), '.claude', 'commands'),\r\n userClaudeSkills: join(homedir(), '.claude', 'skills'),\r\n projectClaudeSkills: join(getCwd(), '.claude', 'skills'),\r\n userKodeCommands: join(userKodeBaseDir, 'commands'),\r\n projectKodeCommands: join(getCwd(), '.newcraw', 'commands'),\r\n userKodeSkills: join(userKodeBaseDir, 'skills'),\r\n projectKodeSkills: join(getCwd(), '.newcraw', 'skills'),\r\n }\r\n}\r\n\r\nexport function hasCustomCommands(): boolean {\r\n const dirs = getCustomCommandDirectories()\r\n return (\r\n existsSync(dirs.userClaudeCommands) ||\r\n existsSync(dirs.projectClaudeCommands) ||\r\n existsSync(dirs.userClaudeSkills) ||\r\n existsSync(dirs.projectClaudeSkills) ||\r\n existsSync(dirs.userKodeCommands) ||\r\n existsSync(dirs.projectKodeCommands) ||\r\n existsSync(dirs.userKodeSkills) ||\r\n existsSync(dirs.projectKodeSkills)\r\n )\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["namespace"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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 getUserKodeBaseDir(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 getUserKodeBaseDir({ 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
|
-
}
|