@cc-monitoring/proxy-core 0.3.1 → 0.4.1
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/cli/__tests__/commands.test.js +20 -1
- package/dist/cli/commands/exec.js +31 -42
- package/dist/cli/commands/repair.d.ts +1 -0
- package/dist/cli/commands/repair.js +15 -0
- package/dist/cli/index.js +30 -0
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.B9A39uFv.js → app.g7N9jkzn.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.IHxQqfJH.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DdhC696L.js → VPLocalSearchBox.BHwI475_.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CfB2tOFi.js → theme.FhAJSNDh.js} +2 -2
- package/dist/docs/assets/{proxy-cli_data-hooks.md.w9Oe1OD3.js → proxy-cli_data-hooks.md.Bz8CVbxO.js} +1 -1
- package/dist/docs/assets/{proxy-core_ui-routes.md.Dyqkeoiv.js → proxy-core_ui-routes.md.B21t1p7R.js} +1 -1
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/index.html +3 -3
- package/dist/docs/overview.html +3 -3
- package/dist/docs/packages-utils.html +3 -3
- package/dist/docs/proxy-admin/env-and-build.html +3 -3
- package/dist/docs/proxy-admin/index.html +3 -3
- package/dist/docs/proxy-admin/layout-and-menu.html +3 -3
- package/dist/docs/proxy-admin/pages.html +3 -3
- package/dist/docs/proxy-admin/routing-and-auth.html +3 -3
- package/dist/docs/proxy-admin/services-and-mock.html +3 -3
- package/dist/docs/proxy-cli/api-layer.html +3 -3
- package/dist/docs/proxy-cli/app-shell.html +3 -3
- package/dist/docs/proxy-cli/components-common.html +3 -3
- package/dist/docs/proxy-cli/components-config.html +3 -3
- package/dist/docs/proxy-cli/components-requests.html +3 -3
- package/dist/docs/proxy-cli/components-stats.html +3 -3
- package/dist/docs/proxy-cli/components-status.html +3 -3
- package/dist/docs/proxy-cli/data-hooks.html +5 -5
- package/dist/docs/proxy-cli/index.html +3 -3
- package/dist/docs/proxy-cli/utils-and-i18n.html +3 -3
- package/dist/docs/proxy-core/chat-api.html +3 -3
- package/dist/docs/proxy-core/cli.html +3 -3
- package/dist/docs/proxy-core/config.html +3 -3
- package/dist/docs/proxy-core/data-layer.html +3 -3
- package/dist/docs/proxy-core/entry.html +3 -3
- package/dist/docs/proxy-core/index.html +3 -3
- package/dist/docs/proxy-core/pm2.html +3 -3
- package/dist/docs/proxy-core/providers.html +3 -3
- package/dist/docs/proxy-core/proxy.html +3 -3
- package/dist/docs/proxy-core/stats.html +3 -3
- package/dist/docs/proxy-core/tool.html +3 -3
- package/dist/docs/proxy-core/ui-routes.html +5 -5
- package/dist/docs/proxy-core/utilities.html +3 -3
- package/dist/docs/quickstart.html +3 -3
- package/dist/docs/request-flow.html +3 -3
- package/dist/logger/index.d.ts +0 -3
- package/dist/logger/index.js +0 -1
- package/dist/mcp-server/tools.js +8 -9
- package/dist/server/__tests__/data-push.test.js +44 -0
- package/dist/server/__tests__/providers-route.test.js +1 -0
- package/dist/server/__tests__/proxy.test.js +281 -2
- package/dist/server/__tests__/server.test.js +15 -10
- package/dist/server/__tests__/ui-route.test.js +43 -0
- package/dist/server/auth.d.ts +0 -1
- package/dist/server/auth.js +1 -1
- package/dist/server/chat-route.js +48 -162
- package/dist/server/data-push.d.ts +2 -1
- package/dist/server/data-push.js +22 -7
- package/dist/server/index.js +4 -3
- package/dist/server/proxy.js +193 -229
- package/dist/server/ui-route.js +84 -60
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/registry.d.ts +0 -4
- package/dist/tools/registry.js +0 -8
- package/dist/types/config.d.ts +0 -13
- package/dist/types/pm2.d.ts +1 -2
- package/dist/ui/assets/{1c-DAu68mP4.js → 1c-CaPSZBmB.js} +1 -1
- package/dist/ui/assets/{abnf-Cu8RHCHK.js → abnf-DBDOsmne.js} +1 -1
- package/dist/ui/assets/{abnfDiagram-VRR7QNED-BUBToPXF.js → abnfDiagram-VRR7QNED-D8zK__Mj.js} +1 -1
- package/dist/ui/assets/{accesslog-BG-34XOy.js → accesslog-BOLs2Kig.js} +1 -1
- package/dist/ui/assets/{actionscript-iw0HHMGM.js → actionscript-BZYKhS1B.js} +1 -1
- package/dist/ui/assets/{ada-qRqj6VGQ.js → ada-DyacnMpg.js} +1 -1
- package/dist/ui/assets/{angelscript-BeaXyx_P.js → angelscript-CAN6j0H3.js} +1 -1
- package/dist/ui/assets/{apache-CU8d-z9X.js → apache-BE4vouiQ.js} +1 -1
- package/dist/ui/assets/{applescript-d1Wxkqz1.js → applescript-CS88I1yz.js} +1 -1
- package/dist/ui/assets/{arc-BMsPIm3j.js → arc-CTMmdrSV.js} +1 -1
- package/dist/ui/assets/{arcade-CtbgrWTM.js → arcade-B0f0f5SD.js} +1 -1
- package/dist/ui/assets/{architectureDiagram-ZJ3FMSHR-CVjC5TrS.js → architectureDiagram-ZJ3FMSHR-Dtvpnopp.js} +1 -1
- package/dist/ui/assets/{arduino-Bc9L39Hr.js → arduino-Bhm-OSb2.js} +1 -1
- package/dist/ui/assets/{armasm-DuWmpjWR.js → armasm-CEy-mDHc.js} +1 -1
- package/dist/ui/assets/{asciidoc-CDIhFTnx.js → asciidoc-CrZqQBTj.js} +1 -1
- package/dist/ui/assets/{aspectj-SYj-57Es.js → aspectj-B4IlFyyJ.js} +1 -1
- package/dist/ui/assets/{autohotkey-hBi5dq37.js → autohotkey-Cihy-FjA.js} +1 -1
- package/dist/ui/assets/{autoit-BSawXzhg.js → autoit-Dis_JVJq.js} +1 -1
- package/dist/ui/assets/{avrasm-CwYom8Np.js → avrasm-CVhMycHj.js} +1 -1
- package/dist/ui/assets/{awk-BvBRfGo2.js → awk-BCViwLf5.js} +1 -1
- package/dist/ui/assets/{axapta-CqUavA8k.js → axapta-pWB4JVB_.js} +1 -1
- package/dist/ui/assets/{bash-BS_ZnmEu.js → bash-B6Giryub.js} +1 -1
- package/dist/ui/assets/{basic-xbP4IXrN.js → basic-DcrjcHB0.js} +1 -1
- package/dist/ui/assets/{blockDiagram-677ZJIJ3-CmpI3f5p.js → blockDiagram-677ZJIJ3-DfhtgI1r.js} +1 -1
- package/dist/ui/assets/{bnf-BECwu6uW.js → bnf-cpKU0967.js} +1 -1
- package/dist/ui/assets/{brainfuck-QQgu4j4N.js → brainfuck-CFFdk4cM.js} +1 -1
- package/dist/ui/assets/{coq-IDMIFfem.js → c-CW6KPMeI.js} +1 -1
- package/dist/ui/assets/{c-like-DYrFOtXy.js → c-like-CWn59vrg.js} +1 -1
- package/dist/ui/assets/{c4Diagram-LMCZKHZV-B6Hgngz9.js → c4Diagram-LMCZKHZV-D1Oh6k37.js} +1 -1
- package/dist/ui/assets/{cal-CNMrJ6v5.js → cal-8i26_L39.js} +1 -1
- package/dist/ui/assets/{capnproto-DYCKl6oY.js → capnproto-CviwnFBf.js} +1 -1
- package/dist/ui/assets/{ceylon-mb8tRPl0.js → ceylon-CQyc4rWs.js} +1 -1
- package/dist/ui/assets/channel-Da2MvpNG.js +1 -0
- package/dist/ui/assets/{chunk-2Q5K7J3B-LxvQ-G67.js → chunk-2Q5K7J3B-oswPBwIn.js} +1 -1
- package/dist/ui/assets/{chunk-32BRIVSS-DxzKK6Aw.js → chunk-32BRIVSS-B5pU_9b9.js} +1 -1
- package/dist/ui/assets/{chunk-5VM5RSS4-CZEoYJ2W.js → chunk-5VM5RSS4-gvtfMc4w.js} +1 -1
- package/dist/ui/assets/{chunk-EX3LRPZG-DS2PytrN.js → chunk-EX3LRPZG-BkBaDMy4.js} +1 -1
- package/dist/ui/assets/{chunk-JWPE2WC7-UX0Sr1Ie.js → chunk-JWPE2WC7-Ch-C75ar.js} +1 -1
- package/dist/ui/assets/{chunk-MOJQB5TN-YbJgT9t4.js → chunk-MOJQB5TN-BfYhj1jN.js} +1 -1
- package/dist/ui/assets/{chunk-RYQCIY6F-DS2VH_U9.js → chunk-RYQCIY6F-D8izfruP.js} +1 -1
- package/dist/ui/assets/{chunk-V7JOEXUC-CZr0pkI1.js → chunk-V7JOEXUC-CbzHnW90.js} +1 -1
- package/dist/ui/assets/{chunk-VR4S4FIN-50opPAD3.js → chunk-VR4S4FIN-Dr4M5qZA.js} +1 -1
- package/dist/ui/assets/{chunk-XXDRQBXY-DAAX9l7U.js → chunk-XXDRQBXY-QE-R8dRe.js} +1 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-mHUiWjcC.js +1 -0
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-mHUiWjcC.js +1 -0
- package/dist/ui/assets/{clean-C4X7dSkh.js → clean-DZeAtQ7H.js} +1 -1
- package/dist/ui/assets/{clojure-DSg9gUa7.js → clojure-U4ebZ7NQ.js} +1 -1
- package/dist/ui/assets/{clojure-repl-CagRYx7h.js → clojure-repl-B4QSIzUI.js} +1 -1
- package/dist/ui/assets/{cmake-CFdBn53c.js → cmake-UHexZySb.js} +1 -1
- package/dist/ui/assets/{coffeescript-CJZtMOPx.js → coffeescript-Dg56H9Mr.js} +1 -1
- package/dist/ui/assets/{c-BRJEPYra.js → coq-C1g3mm0X.js} +1 -1
- package/dist/ui/assets/{cos-Bx2VJuzG.js → cos-BL4DdyGh.js} +1 -1
- package/dist/ui/assets/{cose-bilkent-JH36ORCC-zWRLsZpZ.js → cose-bilkent-JH36ORCC-BHQslHP3.js} +1 -1
- package/dist/ui/assets/{cpp-CsG6DlC4.js → cpp-keZI-XAd.js} +1 -1
- package/dist/ui/assets/{crmsh-DTy9MnmJ.js → crmsh-DdXYVeeA.js} +1 -1
- package/dist/ui/assets/{crystal-BwgrLrZ1.js → crystal-C4AN0m0I.js} +1 -1
- package/dist/ui/assets/{csharp-B2VeTPAF.js → csharp-COUyKsNR.js} +1 -1
- package/dist/ui/assets/{csp-CTpydNhH.js → csp-DBc-rgSJ.js} +1 -1
- package/dist/ui/assets/{css-B0mMUbpY.js → css-B8m6O_Pw.js} +1 -1
- package/dist/ui/assets/{cynefin-VYW2F7L2-BmjQEj6q.js → cynefin-VYW2F7L2-B3L-WcKn.js} +1 -1
- package/dist/ui/assets/{cynefinDiagram-TSTJHNR4-Dr0Zrke0.js → cynefinDiagram-TSTJHNR4-fzaM4qcZ.js} +1 -1
- package/dist/ui/assets/{d-DjuDZnbI.js → d-dgQN4Rko.js} +1 -1
- package/dist/ui/assets/{dagre-VKFMJZFB-xoTPT2Uu.js → dagre-VKFMJZFB-DJHj16mR.js} +1 -1
- package/dist/ui/assets/{dart-xR3GU9TJ.js → dart-D2Y7LOq-.js} +1 -1
- package/dist/ui/assets/{delphi-bJas5QnG.js → delphi-DaGcSk5A.js} +1 -1
- package/dist/ui/assets/{diagram-FQU43EPY-rL_IU7gU.js → diagram-FQU43EPY-iZEZ1f-R.js} +1 -1
- package/dist/ui/assets/{diagram-G47NLZAW-EcDiCVGj.js → diagram-G47NLZAW-rkQb3r-C.js} +1 -1
- package/dist/ui/assets/{diagram-NH7WQ7WH-CGGXOjev.js → diagram-NH7WQ7WH-B4Fy72tP.js} +1 -1
- package/dist/ui/assets/{diagram-OA4YK3LP-DnE7hDjD.js → diagram-OA4YK3LP-BndmuIBq.js} +1 -1
- package/dist/ui/assets/{diagram-WEI45ONY-CTJH5eD8.js → diagram-WEI45ONY-CwlAiqOe.js} +1 -1
- package/dist/ui/assets/{diff-doJFF3fv.js → diff-prcRV1Y3.js} +1 -1
- package/dist/ui/assets/{django-D3b-owa_.js → django-B1zIoGSx.js} +1 -1
- package/dist/ui/assets/{dns-C42KYV-Z.js → dns-ZxI_aTwc.js} +1 -1
- package/dist/ui/assets/{dockerfile-9KUINc2j.js → dockerfile-Dp_fT6E-.js} +1 -1
- package/dist/ui/assets/{dos-CxnlJ6qp.js → dos-Cuu5c8vv.js} +1 -1
- package/dist/ui/assets/{dsconfig-6CMMCwmY.js → dsconfig-DcGTOhbS.js} +1 -1
- package/dist/ui/assets/{dts-D78rdUIB.js → dts-DCF8VaRk.js} +1 -1
- package/dist/ui/assets/{dust-Dv1uTfJU.js → dust-DeCmZWMK.js} +1 -1
- package/dist/ui/assets/{ebnf-BGbG1cFK.js → ebnf-BHQQcuF_.js} +1 -1
- package/dist/ui/assets/{ebnfDiagram-CCIWWBDH-z2VgRSUV.js → ebnfDiagram-CCIWWBDH-DJ_RuhTm.js} +1 -1
- package/dist/ui/assets/{elixir-ZgAQVY1J.js → elixir-BHmweJ4d.js} +1 -1
- package/dist/ui/assets/{elm-CudiFuNu.js → elm-v76Hd2B3.js} +1 -1
- package/dist/ui/assets/{erDiagram-Q63AITRT-X1TODuRv.js → erDiagram-Q63AITRT-DVZkY5RZ.js} +1 -1
- package/dist/ui/assets/{erb-Bz_NZh6W.js → erb-xvWF5bfx.js} +1 -1
- package/dist/ui/assets/{erlang-DNuj1nb2.js → erlang-CKBMURym.js} +1 -1
- package/dist/ui/assets/{erlang-repl-SP1Gan9W.js → erlang-repl-BjcfXt3Z.js} +1 -1
- package/dist/ui/assets/{excel-0K77uECF.js → excel-Cdrtxhml.js} +1 -1
- package/dist/ui/assets/{fix-CalJq7JD.js → fix-CB-So5So.js} +1 -1
- package/dist/ui/assets/{flix-BlIs11_w.js → flix-VM9AOrq6.js} +1 -1
- package/dist/ui/assets/{flowDiagram-23GEKE2U-DA2dnmc0.js → flowDiagram-23GEKE2U-vyGW67Xm.js} +1 -1
- package/dist/ui/assets/{fortran-ZCobXY2R.js → fortran-CcwJVO8H.js} +1 -1
- package/dist/ui/assets/{fsharp-Be8rwUtc.js → fsharp-DiATpw1u.js} +1 -1
- package/dist/ui/assets/{gams-DUat8frQ.js → gams-Csg9YNPz.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-NO4QXBWP-DdFwaIGZ.js → ganttDiagram-NO4QXBWP-C2TRbwLw.js} +1 -1
- package/dist/ui/assets/{gauss-BB4U88dy.js → gauss-Bc4TC8Wh.js} +1 -1
- package/dist/ui/assets/{gcode-DzeUZuZg.js → gcode-Rig_2OoA.js} +1 -1
- package/dist/ui/assets/{gherkin-B_8vW_BO.js → gherkin-ByBU06QB.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-IHSO6WYX-B-Dn8x6I.js → gitGraphDiagram-IHSO6WYX-CEiqfFIF.js} +1 -1
- package/dist/ui/assets/{glsl-DGHGjPC1.js → glsl-C8D6y2Tn.js} +1 -1
- package/dist/ui/assets/{gml-BYEku8Yh.js → gml-PHpGPHbT.js} +1 -1
- package/dist/ui/assets/{go-D8aSgQMc.js → go-BL_o_3ez.js} +1 -1
- package/dist/ui/assets/{golo-CDjCU_jh.js → golo-CWQ6dTUz.js} +1 -1
- package/dist/ui/assets/{gradle-BeUw7tl_.js → gradle-Y_I2KN2z.js} +1 -1
- package/dist/ui/assets/{groovy-5iCQOtR3.js → groovy-JnIv8p2l.js} +1 -1
- package/dist/ui/assets/{haml-BEdL8FJi.js → haml-B8W_h6mZ.js} +1 -1
- package/dist/ui/assets/{handlebars-BuYQNzoK.js → handlebars-DVm8mJuD.js} +1 -1
- package/dist/ui/assets/{haskell-I4FCBcW0.js → haskell-DlDi2Ty7.js} +1 -1
- package/dist/ui/assets/{haxe-yigyKfFr.js → haxe-CftFNVE-.js} +1 -1
- package/dist/ui/assets/{hsp-ZUk4j7d1.js → hsp-C67xnq9C.js} +1 -1
- package/dist/ui/assets/{htmlbars-QYP3lT3u.js → htmlbars-CmJCm67U.js} +1 -1
- package/dist/ui/assets/{http-BJpD1O71.js → http-b-FPEcHP.js} +1 -1
- package/dist/ui/assets/{hy-CIJ1bP6S.js → hy-BWD3ncpN.js} +1 -1
- package/dist/ui/assets/{index-COAgrx1J.js → index-C7s1zgJb.js} +242 -242
- package/dist/ui/assets/{index-BDXWttnT.js → index-D2UBwfSG.js} +3 -3
- package/dist/ui/assets/index-DlsVXaHT.css +10 -0
- package/dist/ui/assets/{infoDiagram-FWYZ7A6U-fTg9eLNt.js → infoDiagram-FWYZ7A6U-C0Px17IN.js} +1 -1
- package/dist/ui/assets/{inform7-DAsu-lC2.js → inform7-C-OYaMO5.js} +1 -1
- package/dist/ui/assets/{ini-Bhz-zHCg.js → ini-CVyYmykw.js} +1 -1
- package/dist/ui/assets/{irpf90-BunhbwBl.js → irpf90-BcpjWXIz.js} +1 -1
- package/dist/ui/assets/{isbl-q9L6hOhP.js → isbl-ZraBBeEr.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-FXEZZL3T-B8G0sdgd.js → ishikawaDiagram-FXEZZL3T-BjmTMgpO.js} +1 -1
- package/dist/ui/assets/{java-Iks5Pkau.js → java-D_mE2DT6.js} +1 -1
- package/dist/ui/assets/{javascript-C4vltXPw.js → javascript-akXESsox.js} +1 -1
- package/dist/ui/assets/{jboss-cli-BQBvd2X2.js → jboss-cli-CFe3gTDt.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-5HDEW3XC-Crbzgrum.js → journeyDiagram-5HDEW3XC-BpgJUvs6.js} +1 -1
- package/dist/ui/assets/{json-DXK0_jUK.js → json-sjN7AzRC.js} +1 -1
- package/dist/ui/assets/{julia-CCYoBiYK.js → julia-BJJYbUMV.js} +1 -1
- package/dist/ui/assets/{julia-repl-y8v2Oorl.js → julia-repl-BwruD8Ix.js} +1 -1
- package/dist/ui/assets/{kanban-definition-HUTT4EX6-C8sCOsBX.js → kanban-definition-HUTT4EX6-DFlE9edA.js} +1 -1
- package/dist/ui/assets/{kotlin-Bnjk7_fw.js → kotlin-CAIQsLCF.js} +1 -1
- package/dist/ui/assets/{lasso-B-al6x63.js → lasso-sU67h-5u.js} +1 -1
- package/dist/ui/assets/{latex-BUmqlb9r.js → latex-CVX-jP88.js} +1 -1
- package/dist/ui/assets/{ldif-D42RWj6Q.js → ldif-DGM9xbFZ.js} +1 -1
- package/dist/ui/assets/{leaf-CrH4BZ0m.js → leaf-AlB_zmwz.js} +1 -1
- package/dist/ui/assets/{less-upmRlQQW.js → less-CKwfEdZQ.js} +1 -1
- package/dist/ui/assets/{lisp-DHYS22SA.js → lisp-CXYLaAPw.js} +1 -1
- package/dist/ui/assets/{livecodeserver-CeQNmFP3.js → livecodeserver-C02fGGTS.js} +1 -1
- package/dist/ui/assets/{livescript-PJWpY1JI.js → livescript-CBMa8QF_.js} +1 -1
- package/dist/ui/assets/{llvm-BKtKWwCt.js → llvm-WXTIohTC.js} +1 -1
- package/dist/ui/assets/{lsl-RWRLRjk7.js → lsl-4obd2U_I.js} +1 -1
- package/dist/ui/assets/{lua-BFUDiPGm.js → lua-DTSy-TjF.js} +1 -1
- package/dist/ui/assets/{makefile-CUDyOz5D.js → makefile-Bf2UEO0i.js} +1 -1
- package/dist/ui/assets/{markdown-zZCLypc6.js → markdown-BgoGmFfJ.js} +1 -1
- package/dist/ui/assets/{mathematica-BHbxKxnq.js → mathematica-CSiA8KQh.js} +1 -1
- package/dist/ui/assets/{matlab-DlGtg--p.js → matlab-DoMvLsGB.js} +1 -1
- package/dist/ui/assets/{maxima-BBBeS3Ra.js → maxima-BFO4dfZO.js} +1 -1
- package/dist/ui/assets/{mel-nh8j7W_6.js → mel-DyBpmDxt.js} +1 -1
- package/dist/ui/assets/{mercury-DyyD-pqr.js → mercury-OL5G5uU6.js} +1 -1
- package/dist/ui/assets/{mindmap-definition-LN4V7U3C-CJlhDHqM.js → mindmap-definition-LN4V7U3C-s-nUZuCs.js} +1 -1
- package/dist/ui/assets/{mipsasm-hiEhRRiq.js → mipsasm-KQwdm39j.js} +1 -1
- package/dist/ui/assets/{mizar-BZa3iAAL.js → mizar-BqndJ30I.js} +1 -1
- package/dist/ui/assets/{mojolicious-BCIm2V_y.js → mojolicious-Bvc1uJd-.js} +1 -1
- package/dist/ui/assets/{monkey-zmK-7N8b.js → monkey-Dl_gLm7-.js} +1 -1
- package/dist/ui/assets/{moonscript-BsS_Mn3D.js → moonscript-BL6R6eAz.js} +1 -1
- package/dist/ui/assets/{n1ql-D7xVgDP0.js → n1ql-C09iOJfQ.js} +1 -1
- package/dist/ui/assets/{nginx-ct2q4dtd.js → nginx-C7W01nBr.js} +1 -1
- package/dist/ui/assets/{nim-RO0UOmW3.js → nim-Dj78szvD.js} +1 -1
- package/dist/ui/assets/{nix-BcRJxPKH.js → nix-BOtGyPmd.js} +1 -1
- package/dist/ui/assets/{node-repl-DgIefwxW.js → node-repl-19nZvZ4A.js} +1 -1
- package/dist/ui/assets/{nsis-DqHs9QhB.js → nsis-ByCl1zIm.js} +1 -1
- package/dist/ui/assets/{objectivec-BBcWqc7Y.js → objectivec-BhdaT_Jr.js} +1 -1
- package/dist/ui/assets/{ocaml-BExfw7D6.js → ocaml-D_NXvSO7.js} +1 -1
- package/dist/ui/assets/{openscad-CHPRELQb.js → openscad-DOhagvnA.js} +1 -1
- package/dist/ui/assets/{oxygene-DpS9uMJW.js → oxygene-5BnkqMRH.js} +1 -1
- package/dist/ui/assets/{parser3-CjJ_QdBp.js → parser3-jSWlxi8m.js} +1 -1
- package/dist/ui/assets/{pegDiagram-2B236MQR-GM70woGy.js → pegDiagram-2B236MQR-CideH-XT.js} +1 -1
- package/dist/ui/assets/{perl-BSNM2Kt8.js → perl-CfsqjZ4b.js} +1 -1
- package/dist/ui/assets/{pf-Z-hKf_88.js → pf-kOewxO29.js} +1 -1
- package/dist/ui/assets/{pgsql-DDgznxBg.js → pgsql-CXm2Xd-Z.js} +1 -1
- package/dist/ui/assets/{php-BzAhxF-l.js → php-CRiA_dH8.js} +1 -1
- package/dist/ui/assets/{php-template-DkgcKHRc.js → php-template-ByMrxqSd.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ENE6RG2P-Bst7mPyz.js → pieDiagram-ENE6RG2P-CJkCdB38.js} +1 -1
- package/dist/ui/assets/{plaintext-BYEppD0R.js → plaintext-BJx0R6A5.js} +1 -1
- package/dist/ui/assets/{pony-BT_kQd1K.js → pony-CozCHtz4.js} +1 -1
- package/dist/ui/assets/{powershell-BfRsuSsf.js → powershell-BT7gMMgn.js} +1 -1
- package/dist/ui/assets/{processing-DpzWe5Iu.js → processing-FOIxn_W_.js} +1 -1
- package/dist/ui/assets/{profile-BCOhS5cM.js → profile-BsoUuD9w.js} +1 -1
- package/dist/ui/assets/{prolog-OxaCCaW8.js → prolog-Bd3gvQ2N.js} +1 -1
- package/dist/ui/assets/{properties-DMFlA2Ca.js → properties-BWGFdny9.js} +1 -1
- package/dist/ui/assets/{protobuf-CRDFkXvZ.js → protobuf-pQSKoOOY.js} +1 -1
- package/dist/ui/assets/{puppet-DnrVyLzx.js → puppet-DnEN_mgS.js} +1 -1
- package/dist/ui/assets/{purebasic-Dht4Hniv.js → purebasic-BqoOGoRw.js} +1 -1
- package/dist/ui/assets/{python-B0aMirWu.js → python-TeVYomkE.js} +1 -1
- package/dist/ui/assets/{python-repl-BlYDBGa7.js → python-repl-zqu5igFS.js} +1 -1
- package/dist/ui/assets/{q-DzrtW9kT.js → q-CZC9Dltd.js} +1 -1
- package/dist/ui/assets/{qml-DnfQsR3i.js → qml-ZNInP45Q.js} +1 -1
- package/dist/ui/assets/{quadrantDiagram-ABIIQ3AL-DNRYurBT.js → quadrantDiagram-ABIIQ3AL-Dd7PwxsF.js} +1 -1
- package/dist/ui/assets/{r-DGI_ZuTD.js → r-B39DAmkC.js} +1 -1
- package/dist/ui/assets/{railroadDiagram-RFXS5EU6-CmbC3Vz4.js → railroadDiagram-RFXS5EU6-DtO5PVFZ.js} +1 -1
- package/dist/ui/assets/{reasonml-3SohMgh2.js → reasonml-B-ZWFJt_.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-TGXJPOKE-8CxrXHco.js → requirementDiagram-TGXJPOKE-DihF4OTj.js} +1 -1
- package/dist/ui/assets/{rib-DfRSd4Qa.js → rib-CnGG0qMF.js} +1 -1
- package/dist/ui/assets/{roboconf-CQczGdGW.js → roboconf-Ewtfps4u.js} +1 -1
- package/dist/ui/assets/{routeros-DCka-T2i.js → routeros-CPcmP1c7.js} +1 -1
- package/dist/ui/assets/{rsl-Dr8MOwMo.js → rsl-NbjWFbPH.js} +1 -1
- package/dist/ui/assets/{ruby-C2zFSkh_.js → ruby-DWDdy5yE.js} +1 -1
- package/dist/ui/assets/{ruleslanguage-C97YsgQq.js → ruleslanguage-Cv_DZe2r.js} +1 -1
- package/dist/ui/assets/{rust-H3h8kd9A.js → rust-NZnsfER5.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-HTMAVEWB-DBXLWjEq.js → sankeyDiagram-HTMAVEWB-D6i-Mzte.js} +1 -1
- package/dist/ui/assets/{sas-04z0Xu8P.js → sas-C4wv0P6G.js} +1 -1
- package/dist/ui/assets/{scala-DyB9Aoiv.js → scala-DUdTOIgx.js} +1 -1
- package/dist/ui/assets/{scheme-DBj6nxUi.js → scheme-DEdFa14t.js} +1 -1
- package/dist/ui/assets/{scilab-Btj7AD9s.js → scilab-xY51J2bR.js} +1 -1
- package/dist/ui/assets/{scss-BXZJyXt7.js → scss-BEYp1sXc.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-DBY2YBRQ-DXIkBFKC.js → sequenceDiagram-DBY2YBRQ-njQlqy_J.js} +1 -1
- package/dist/ui/assets/{shell-BsreQR1Z.js → shell-fq6bkhOw.js} +1 -1
- package/dist/ui/assets/{sizeCapture-X5ZJPWSS-ocS9jxAQ.js → sizeCapture-X5ZJPWSS-tLn70-Fb.js} +1 -1
- package/dist/ui/assets/{smali-D9wQw9zm.js → smali-CsSAuSYg.js} +1 -1
- package/dist/ui/assets/{smalltalk-Dku6G_H3.js → smalltalk-DJ7zrd87.js} +1 -1
- package/dist/ui/assets/{sml-BknyU6ya.js → sml-CnDwl0nH.js} +1 -1
- package/dist/ui/assets/{sqf-DRYMaOg8.js → sqf-Cc2SX4Zy.js} +1 -1
- package/dist/ui/assets/{sql-Cw3Ax4KA.js → sql-DUQA_V_4.js} +1 -1
- package/dist/ui/assets/{sql_more-vWdslLE0.js → sql_more-BHoH-8oO.js} +1 -1
- package/dist/ui/assets/{stan-8XH5bDS6.js → stan-D-7F5jH6.js} +1 -1
- package/dist/ui/assets/{stata-4e77wgfe.js → stata-xKD_DnDE.js} +1 -1
- package/dist/ui/assets/{stateDiagram-2N3HPSRC-RMmL9jMG.js → stateDiagram-2N3HPSRC-B4O8weor.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-CO881_ht.js +1 -0
- package/dist/ui/assets/{step21-ByIeDMY3.js → step21-obc_kzQY.js} +1 -1
- package/dist/ui/assets/{stylus-ZAhJyWsw.js → stylus-CkAUSRd-.js} +1 -1
- package/dist/ui/assets/{subunit-pPW2UGkj.js → subunit-BDv8PGo1.js} +1 -1
- package/dist/ui/assets/{swift-CX3BB5az.js → swift-CHsYyW-p.js} +1 -1
- package/dist/ui/assets/{swimlanes-5IMT3BWC-C2zAuJ56.js → swimlanes-5IMT3BWC-DSr9Ty4A.js} +2 -2
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DFMCDs8b.js +8 -0
- package/dist/ui/assets/{taggerscript-BHcjbWIC.js → taggerscript-C_2JQgO9.js} +1 -1
- package/dist/ui/assets/{tap-BOl1lBlS.js → tap-Bi497Z2c.js} +1 -1
- package/dist/ui/assets/{tcl-DZjeOBDh.js → tcl-B1XMvLaD.js} +1 -1
- package/dist/ui/assets/{thrift-BxboWg4x.js → thrift-D9X0Hmmc.js} +1 -1
- package/dist/ui/assets/{timeline-definition-FHXFAJF6-BOxsxyq_.js → timeline-definition-FHXFAJF6-C4_gj50B.js} +1 -1
- package/dist/ui/assets/{tp-BNM6ql3J.js → tp-CJG4Odbx.js} +1 -1
- package/dist/ui/assets/{twig-Dj9ZiXD4.js → twig-flj72_wc.js} +1 -1
- package/dist/ui/assets/{typescript-7MEJlu_6.js → typescript-CWPwVoLd.js} +1 -1
- package/dist/ui/assets/{vala-DNqOAgHJ.js → vala-LuCNWNuU.js} +1 -1
- package/dist/ui/assets/{vbnet-T0mNKVc_.js → vbnet-CGUT6ss0.js} +1 -1
- package/dist/ui/assets/{vbscript-CeuwVMAI.js → vbscript-CNiUBJhn.js} +1 -1
- package/dist/ui/assets/{vbscript-html-BbJSt2w6.js → vbscript-html-CJGgjjbc.js} +1 -1
- package/dist/ui/assets/{vennDiagram-L72KCM5P-BX9mWeiT.js → vennDiagram-L72KCM5P-BxcAUnYo.js} +1 -1
- package/dist/ui/assets/{verilog-DYuhYfkX.js → verilog-C4f9ZBTK.js} +1 -1
- package/dist/ui/assets/{vhdl-Cf9aT-t7.js → vhdl-CyDQIZve.js} +1 -1
- package/dist/ui/assets/{vim-DciP44K1.js → vim-XAUBqa0M.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-EHGQE667-CDj2rOzu.js → wardleyDiagram-EHGQE667-DlwSH77q.js} +1 -1
- package/dist/ui/assets/{x86asm-E-AN_LXO.js → x86asm-Cp6vHuUx.js} +1 -1
- package/dist/ui/assets/{xl-CxYLJelN.js → xl-BHgDofIM.js} +1 -1
- package/dist/ui/assets/{xml-yz1SRLuU.js → xml-QloVn4s_.js} +1 -1
- package/dist/ui/assets/{xquery-BLzBF3tV.js → xquery-spJZLmyM.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-FW5EYKEG-Czapk9-Z.js → xychartDiagram-FW5EYKEG-BxGVZcnb.js} +1 -1
- package/dist/ui/assets/{yaml-Cv4Y7iN_.js → yaml-CUju4iq0.js} +1 -1
- package/dist/ui/assets/{zephir-KRcdQfEX.js → zephir-ChVpmD0Y.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/utils/__tests__/abort-signals.test.js +67 -0
- package/dist/utils/__tests__/db-maintenance.test.js +55 -0
- package/dist/utils/__tests__/db-migration.test.js +79 -1
- package/dist/utils/__tests__/inject-loop.test.js +1 -53
- package/dist/utils/__tests__/learn-tasks-db.test.js +82 -0
- package/dist/utils/__tests__/openai-converter.test.js +25 -0
- package/dist/utils/__tests__/pi-crawl-tools.test.js +15 -4
- package/dist/utils/__tests__/pi-dedup-reconcile.test.js +11 -9
- package/dist/utils/__tests__/pi-events.test.d.ts +1 -0
- package/dist/utils/__tests__/pi-events.test.js +172 -0
- package/dist/utils/__tests__/pi-learn-orchestrator.test.js +216 -6
- package/dist/utils/__tests__/pi-runtime-json.test.js +38 -3
- package/dist/utils/__tests__/providers-db.test.js +40 -2
- package/dist/utils/__tests__/request-writer.test.js +532 -39
- package/dist/utils/__tests__/sse-protocol.test.d.ts +1 -0
- package/dist/utils/__tests__/sse-protocol.test.js +115 -0
- package/dist/utils/__tests__/stats-aggregator.test.d.ts +1 -0
- package/dist/utils/__tests__/stats-aggregator.test.js +114 -0
- package/dist/utils/__tests__/vault.test.d.ts +1 -0
- package/dist/utils/__tests__/{knowledge-store.test.js → vault.test.js} +16 -16
- package/dist/utils/abort-signals.d.ts +13 -0
- package/dist/utils/abort-signals.js +33 -0
- package/dist/utils/db-maintenance.d.ts +8 -0
- package/dist/utils/db-maintenance.js +18 -0
- package/dist/utils/db.d.ts +2 -0
- package/dist/utils/db.js +86 -0
- package/dist/utils/esm-dirname.d.ts +0 -15
- package/dist/utils/esm-dirname.js +0 -4
- package/dist/utils/inject-loop.d.ts +0 -27
- package/dist/utils/inject-loop.js +2 -56
- package/dist/utils/learn-tasks-db.d.ts +15 -0
- package/dist/utils/learn-tasks-db.js +35 -0
- package/dist/utils/openai-converter.js +88 -78
- package/dist/utils/pi-browser-tools.d.ts +0 -2
- package/dist/utils/pi-browser-tools.js +0 -174
- package/dist/utils/pi-crawl-tools.d.ts +2 -1
- package/dist/utils/pi-crawl-tools.js +16 -11
- package/dist/utils/pi-dedup.d.ts +8 -30
- package/dist/utils/pi-dedup.js +32 -67
- package/dist/utils/pi-events.d.ts +65 -0
- package/dist/utils/pi-events.js +98 -0
- package/dist/utils/pi-learn-orchestrator.d.ts +6 -5
- package/dist/utils/pi-learn-orchestrator.js +71 -106
- package/dist/utils/pi-runtime.d.ts +5 -6
- package/dist/utils/pi-runtime.js +38 -42
- package/dist/utils/pi-sandbox-ops.d.ts +0 -36
- package/dist/utils/pi-sandbox-ops.js +5 -190
- package/dist/utils/providers-db.d.ts +3 -0
- package/dist/utils/providers-db.js +21 -7
- package/dist/utils/request-writer.d.ts +77 -26
- package/dist/utils/request-writer.js +362 -56
- package/dist/utils/sse-protocol.d.ts +34 -0
- package/dist/utils/sse-protocol.js +121 -0
- package/dist/utils/sse-stream-processor.d.ts +4 -9
- package/dist/utils/sse-stream-processor.js +13 -104
- package/dist/utils/sse-writer.d.ts +1 -1
- package/dist/utils/sse-writer.js +3 -2
- package/dist/utils/stats-aggregator.d.ts +1 -1
- package/dist/utils/stats-aggregator.js +44 -24
- package/dist/utils/tool-injector.js +7 -0
- package/dist/utils/vault.d.ts +111 -0
- package/dist/utils/vault.js +434 -0
- package/ecosystem.config.cjs +2 -1
- package/package.json +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.B6Qfxe6W.js +0 -1
- package/dist/server/middleware/__tests__/request-id.test.js +0 -28
- package/dist/server/middleware/request-id.d.ts +0 -2
- package/dist/server/middleware/request-id.js +0 -12
- package/dist/types/api.d.ts +0 -20
- package/dist/types/index.d.ts +0 -4
- package/dist/types/index.js +0 -4
- package/dist/types/log.d.ts +0 -13
- package/dist/ui/assets/channel-Bc4Td8eZ.js +0 -1
- package/dist/ui/assets/classDiagram-OUVF2IWQ-BicxhZFq.js +0 -1
- package/dist/ui/assets/classDiagram-v2-EOCWNBFH-BicxhZFq.js +0 -1
- package/dist/ui/assets/index-C0fxlU9d.css +0 -10
- package/dist/ui/assets/stateDiagram-v2-6OUMAXLB-QvaEO5U6.js +0 -1
- package/dist/ui/assets/swimlanesDiagram-G3AALYLV-DPgCOY0D.js +0 -8
- package/dist/utils/__tests__/sse-accumulator.test.js +0 -83
- package/dist/utils/knowledge-store.d.ts +0 -51
- package/dist/utils/knowledge-store.js +0 -241
- package/dist/utils/migrate-files-to-db.d.ts +0 -1
- package/dist/utils/migrate-files-to-db.js +0 -138
- package/dist/utils/sse-accumulator.d.ts +0 -9
- package/dist/utils/sse-accumulator.js +0 -59
- /package/dist/docs/assets/{proxy-cli_data-hooks.md.w9Oe1OD3.lean.js → proxy-cli_data-hooks.md.Bz8CVbxO.lean.js} +0 -0
- /package/dist/docs/assets/{proxy-core_ui-routes.md.Dyqkeoiv.lean.js → proxy-core_ui-routes.md.B21t1p7R.lean.js} +0 -0
- /package/dist/server/{middleware/__tests__/request-id.test.d.ts → __tests__/data-push.test.d.ts} +0 -0
- /package/dist/{types/api.js → utils/__tests__/abort-signals.test.d.ts} +0 -0
- /package/dist/{types/log.js → utils/__tests__/db-maintenance.test.d.ts} +0 -0
- /package/dist/utils/__tests__/{knowledge-store.test.d.ts → learn-tasks-db.test.d.ts} +0 -0
- /package/dist/utils/__tests__/{sse-accumulator.test.d.ts → openai-converter.test.d.ts} +0 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE 帧协议:字节流 ↔ SSE 帧 的唯一知识收敛点。
|
|
3
|
+
*
|
|
4
|
+
* - SSE 帧(frame):字节流按 SSE 规范切分出的单位,由若干字段行
|
|
5
|
+
* (event: / data: / id: / 注释 / 空行分发)组成。
|
|
6
|
+
* - SSE 事件(event):SSE 帧的 data 字段解析出的 JSON 消息。
|
|
7
|
+
*
|
|
8
|
+
* 解析遵循 HTML spec 的 event stream 语义:残帧缓冲、LF/CRLF/CR 行尾、
|
|
9
|
+
* 空行分发、字段行去掉恰好一个可选空格。
|
|
10
|
+
*/
|
|
11
|
+
/** 创建 SSE 帧解码器:每分发一个完整 SSE 帧回调一次 */
|
|
12
|
+
export function createSSEDecoder(onFrame) {
|
|
13
|
+
// 残帧缓冲:跨 chunk 的不完整行
|
|
14
|
+
let leftover = '';
|
|
15
|
+
let event;
|
|
16
|
+
let data = [];
|
|
17
|
+
let id;
|
|
18
|
+
/** 分发当前帧:至少含一个 data 行才回调;分发后重置字段状态 */
|
|
19
|
+
function dispatch() {
|
|
20
|
+
if (data.length > 0) {
|
|
21
|
+
onFrame({ event, data, id });
|
|
22
|
+
}
|
|
23
|
+
event = undefined;
|
|
24
|
+
id = undefined;
|
|
25
|
+
data = [];
|
|
26
|
+
}
|
|
27
|
+
/** 处理一个完整行 */
|
|
28
|
+
function handleLine(line) {
|
|
29
|
+
// 空行 = 一帧分发
|
|
30
|
+
if (line === '') {
|
|
31
|
+
dispatch();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// 以冒号开头的行是注释,忽略
|
|
35
|
+
if (line.startsWith(':'))
|
|
36
|
+
return;
|
|
37
|
+
let field;
|
|
38
|
+
let value;
|
|
39
|
+
const colon = line.indexOf(':');
|
|
40
|
+
if (colon === -1) {
|
|
41
|
+
field = line;
|
|
42
|
+
value = '';
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
field = line.slice(0, colon);
|
|
46
|
+
value = line.slice(colon + 1);
|
|
47
|
+
// 去掉字段值行首恰好一个可选空格
|
|
48
|
+
if (value.startsWith(' '))
|
|
49
|
+
value = value.slice(1);
|
|
50
|
+
}
|
|
51
|
+
if (field === 'event') {
|
|
52
|
+
event = value;
|
|
53
|
+
}
|
|
54
|
+
else if (field === 'data') {
|
|
55
|
+
// 多行 data 逐行保留,消费时用 \n join
|
|
56
|
+
data.push(value);
|
|
57
|
+
}
|
|
58
|
+
else if (field === 'id') {
|
|
59
|
+
id = value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** 消费文本中所有完整行,末段保留为残帧 */
|
|
63
|
+
function feed(text) {
|
|
64
|
+
// CRLF 与单独 CR 统一为 LF
|
|
65
|
+
const normalized = text.replace(/\r\n?/g, '\n');
|
|
66
|
+
const lines = normalized.split('\n');
|
|
67
|
+
leftover = lines.pop() || '';
|
|
68
|
+
for (const line of lines)
|
|
69
|
+
handleLine(line);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
write(chunk) {
|
|
73
|
+
const chunkText = typeof chunk === 'string' ? chunk : chunk.toString('utf-8');
|
|
74
|
+
feed(leftover + chunkText);
|
|
75
|
+
},
|
|
76
|
+
end() {
|
|
77
|
+
// 先按残帧缓冲补一次切行
|
|
78
|
+
if (leftover !== '') {
|
|
79
|
+
const normalized = leftover.replace(/\r\n?/g, '\n');
|
|
80
|
+
leftover = '';
|
|
81
|
+
for (const line of normalized.split('\n'))
|
|
82
|
+
handleLine(line);
|
|
83
|
+
}
|
|
84
|
+
// 再对缓冲中尚未分发的非空帧做一次分发(末尾无空行也能输出最后一帧)
|
|
85
|
+
if (data.length > 0)
|
|
86
|
+
dispatch();
|
|
87
|
+
// 清空状态
|
|
88
|
+
leftover = '';
|
|
89
|
+
event = undefined;
|
|
90
|
+
id = undefined;
|
|
91
|
+
data = [];
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 编码单个 SSE 帧。data 为已序列化好的字符串(调用方负责 JSON.stringify)。
|
|
97
|
+
* 有 event:`event: <event>\ndata: <data>\n\n`;无 event:`data: <data>\n\n`。
|
|
98
|
+
*/
|
|
99
|
+
export function encodeSSEFrame(args) {
|
|
100
|
+
const prefix = args.event !== undefined ? `event: ${args.event}\n` : '';
|
|
101
|
+
return `${prefix}data: ${args.data}\n\n`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 创建 SSE 事件解码器:帧 data 用 \n join 后,[DONE] 触发 onDone,
|
|
105
|
+
* 其余尝试 JSON.parse 成功后触发 onEvent,解析失败静默跳过。
|
|
106
|
+
*/
|
|
107
|
+
export function createEventDecoder(onEvent, onDone) {
|
|
108
|
+
return createSSEDecoder((frame) => {
|
|
109
|
+
const text = frame.data.join('\n');
|
|
110
|
+
if (text.trim() === '[DONE]') {
|
|
111
|
+
onDone?.();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
onEvent(JSON.parse(text));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// 非 JSON data 静默跳过
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
@@ -4,23 +4,18 @@ import { type ParsedUpstream } from './inject-loop.js';
|
|
|
4
4
|
* SSE 增量流式处理器:边转发原始 chunk 到客户端,边增量解析事件累积状态。
|
|
5
5
|
* stream end 后提供 getParsedUpstream() 和 hasInjectedToolUse() 供注入检测。
|
|
6
6
|
*
|
|
7
|
-
* 跨 chunk
|
|
7
|
+
* 跨 chunk 残帧由内部 sse-protocol decoder 缓冲处理。
|
|
8
8
|
*/
|
|
9
9
|
export declare class SSEStreamProcessor {
|
|
10
10
|
events: any[];
|
|
11
|
-
private
|
|
12
|
-
private stopReason;
|
|
13
|
-
private usage;
|
|
14
|
-
private leftover;
|
|
11
|
+
private decoder;
|
|
15
12
|
private raw;
|
|
16
13
|
constructor(raw: ServerResponse);
|
|
17
14
|
/** 处理一个 chunk:转发到 reply.raw + 增量解析事件 */
|
|
18
15
|
processChunk(chunk: Buffer): void;
|
|
19
|
-
/**
|
|
16
|
+
/** 收尾残帧(stream end 后调用) */
|
|
20
17
|
flushLeftover(): void;
|
|
21
|
-
/**
|
|
22
|
-
private processEvent;
|
|
23
|
-
/** 从累积状态构建 ParsedUpstream */
|
|
18
|
+
/** 从累积事件构建 ParsedUpstream */
|
|
24
19
|
getParsedUpstream(): ParsedUpstream;
|
|
25
20
|
/** 检测是否有注入的 MCP tool_use */
|
|
26
21
|
hasInjectedToolUse(): boolean;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { findInjectedCall } from './inject-loop.js';
|
|
1
|
+
import { findInjectedCall, parseUpstreamEvents } from './inject-loop.js';
|
|
2
|
+
import { createEventDecoder } from './sse-protocol.js';
|
|
2
3
|
/**
|
|
3
4
|
* SSE 增量流式处理器:边转发原始 chunk 到客户端,边增量解析事件累积状态。
|
|
4
5
|
* stream end 后提供 getParsedUpstream() 和 hasInjectedToolUse() 供注入检测。
|
|
5
6
|
*
|
|
6
|
-
* 跨 chunk
|
|
7
|
+
* 跨 chunk 残帧由内部 sse-protocol decoder 缓冲处理。
|
|
7
8
|
*/
|
|
8
9
|
export class SSEStreamProcessor {
|
|
9
10
|
constructor(raw) {
|
|
@@ -13,29 +14,11 @@ export class SSEStreamProcessor {
|
|
|
13
14
|
writable: true,
|
|
14
15
|
value: []
|
|
15
16
|
});
|
|
16
|
-
Object.defineProperty(this, "
|
|
17
|
+
Object.defineProperty(this, "decoder", {
|
|
17
18
|
enumerable: true,
|
|
18
19
|
configurable: true,
|
|
19
20
|
writable: true,
|
|
20
|
-
value:
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(this, "stopReason", {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
configurable: true,
|
|
25
|
-
writable: true,
|
|
26
|
-
value: ''
|
|
27
|
-
});
|
|
28
|
-
Object.defineProperty(this, "usage", {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
configurable: true,
|
|
31
|
-
writable: true,
|
|
32
|
-
value: undefined
|
|
33
|
-
});
|
|
34
|
-
Object.defineProperty(this, "leftover", {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
configurable: true,
|
|
37
|
-
writable: true,
|
|
38
|
-
value: ''
|
|
21
|
+
value: void 0
|
|
39
22
|
});
|
|
40
23
|
Object.defineProperty(this, "raw", {
|
|
41
24
|
enumerable: true,
|
|
@@ -44,101 +27,27 @@ export class SSEStreamProcessor {
|
|
|
44
27
|
value: void 0
|
|
45
28
|
});
|
|
46
29
|
this.raw = raw;
|
|
30
|
+
this.decoder = createEventDecoder((event) => this.events.push(event));
|
|
47
31
|
}
|
|
48
32
|
/** 处理一个 chunk:转发到 reply.raw + 增量解析事件 */
|
|
49
33
|
processChunk(chunk) {
|
|
50
34
|
// 转发原始 chunk 到客户端
|
|
51
35
|
this.raw.write(chunk);
|
|
52
|
-
|
|
53
|
-
const lines = text.split('\n');
|
|
54
|
-
// 最后一行可能不完整,保留到下次
|
|
55
|
-
this.leftover = lines.pop() || '';
|
|
56
|
-
for (const line of lines) {
|
|
57
|
-
if (line.startsWith('data:')) {
|
|
58
|
-
const d = line.slice(5).trim();
|
|
59
|
-
if (!d || d === '[DONE]')
|
|
60
|
-
continue;
|
|
61
|
-
try {
|
|
62
|
-
const event = JSON.parse(d);
|
|
63
|
-
this.events.push(event);
|
|
64
|
-
this.processEvent(event);
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
// 非 JSON 行跳过
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
36
|
+
this.decoder.write(chunk);
|
|
71
37
|
}
|
|
72
|
-
/**
|
|
38
|
+
/** 收尾残帧(stream end 后调用) */
|
|
73
39
|
flushLeftover() {
|
|
74
|
-
|
|
75
|
-
const d = this.leftover.slice(5).trim();
|
|
76
|
-
if (d && d !== '[DONE]') {
|
|
77
|
-
try {
|
|
78
|
-
const event = JSON.parse(d);
|
|
79
|
-
this.events.push(event);
|
|
80
|
-
this.processEvent(event);
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
// skip
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
this.leftover = '';
|
|
40
|
+
this.decoder.end();
|
|
88
41
|
}
|
|
89
|
-
/**
|
|
90
|
-
processEvent(e) {
|
|
91
|
-
if (e?.type === 'content_block_start') {
|
|
92
|
-
const cb = e.content_block || {};
|
|
93
|
-
this.contentBlocks.set(e.index, {
|
|
94
|
-
type: cb.type,
|
|
95
|
-
text: cb.type === 'text' ? '' : undefined,
|
|
96
|
-
id: cb.id,
|
|
97
|
-
name: cb.name,
|
|
98
|
-
input: cb.type === 'tool_use' ? '' : undefined
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
else if (e?.type === 'content_block_delta') {
|
|
102
|
-
const b = this.contentBlocks.get(e.index);
|
|
103
|
-
if (!b)
|
|
104
|
-
return;
|
|
105
|
-
const d = e.delta || {};
|
|
106
|
-
if (d.type === 'text_delta')
|
|
107
|
-
b.text = (b.text || '') + d.text;
|
|
108
|
-
if (d.type === 'thinking_delta')
|
|
109
|
-
b.text = (b.text || '') + d.thinking;
|
|
110
|
-
if (d.type === 'input_json_delta')
|
|
111
|
-
b.input = (b.input || '') + (d.partial_json || '');
|
|
112
|
-
}
|
|
113
|
-
else if (e?.type === 'message_delta') {
|
|
114
|
-
this.stopReason = e.delta?.stop_reason || this.stopReason;
|
|
115
|
-
this.usage = e.usage;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
/** 从累积状态构建 ParsedUpstream */
|
|
42
|
+
/** 从累积事件构建 ParsedUpstream */
|
|
119
43
|
getParsedUpstream() {
|
|
120
|
-
|
|
121
|
-
.sort((a, b) => a[0] - b[0])
|
|
122
|
-
.map(([, b]) => {
|
|
123
|
-
if (b.type === 'tool_use') {
|
|
124
|
-
let input = {};
|
|
125
|
-
try {
|
|
126
|
-
input = b.input ? JSON.parse(b.input) : {};
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
input = {};
|
|
130
|
-
}
|
|
131
|
-
return { ...b, input };
|
|
132
|
-
}
|
|
133
|
-
return b;
|
|
134
|
-
});
|
|
135
|
-
return { blocks: ordered, stopReason: this.stopReason, usage: this.usage };
|
|
44
|
+
return parseUpstreamEvents(this.events);
|
|
136
45
|
}
|
|
137
46
|
/** 检测是否有注入的 MCP tool_use */
|
|
138
47
|
hasInjectedToolUse() {
|
|
139
|
-
if (this.stopReason !== 'tool_use')
|
|
140
|
-
return false;
|
|
141
48
|
const parsed = this.getParsedUpstream();
|
|
49
|
+
if (parsed.stopReason !== 'tool_use')
|
|
50
|
+
return false;
|
|
142
51
|
return !!findInjectedCall(parsed);
|
|
143
52
|
}
|
|
144
53
|
}
|
package/dist/utils/sse-writer.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { encodeSSEFrame } from './sse-protocol.js';
|
|
1
2
|
/**
|
|
2
|
-
* SSE 构造器(后端)—— 与 sse-
|
|
3
|
+
* SSE 构造器(后端)—— 与 sse-protocol(帧解析器)互为逆向。
|
|
3
4
|
*
|
|
4
5
|
* 用于 proxy 主动构造并回写合成 SSE 流,让 Claude Code 客户端
|
|
5
6
|
* 将其识别为一次正常的模型文本回答。事件骨架遵循 Anthropic
|
|
@@ -7,7 +8,7 @@
|
|
|
7
8
|
*/
|
|
8
9
|
/** 写单个 SSE 事件:`event: <type>\ndata: {json}\n\n`(Anthropic 双行格式) */
|
|
9
10
|
export function writeSSEEvent(raw, event) {
|
|
10
|
-
raw.write(
|
|
11
|
+
raw.write(encodeSSEFrame({ event: event.type, data: JSON.stringify(event) }));
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* 把一段文本伪装成模型的正常 text 输出,构造完整合成流写回。
|
|
@@ -16,6 +16,6 @@ export interface TodayStats {
|
|
|
16
16
|
request_count: number;
|
|
17
17
|
models: Record<string, number>;
|
|
18
18
|
}
|
|
19
|
-
export declare function aggregateStats(): void;
|
|
19
|
+
export declare function aggregateStats(maxDays?: number): void;
|
|
20
20
|
export declare function getStatsData(since?: string): StatsData;
|
|
21
21
|
export declare function getTodayStats(since: string): TodayStats;
|
|
@@ -1,26 +1,47 @@
|
|
|
1
1
|
import { initDatabase } from './db.js';
|
|
2
|
+
// 共用 token 聚合列:小时聚合与今日 totals 同口径,避免列漂移
|
|
3
|
+
const TOKEN_AGG_COLUMNS = `
|
|
4
|
+
SUM(input_tokens) as input_tokens,
|
|
5
|
+
SUM(output_tokens) as output_tokens,
|
|
6
|
+
SUM(cache_read_tokens) as cache_read_tokens,
|
|
7
|
+
SUM(cache_creation_tokens) as cache_creation_tokens,
|
|
8
|
+
COUNT(*) as request_count
|
|
9
|
+
`;
|
|
10
|
+
// Build the UTC hourly key ('YYYY-MM-DD-HH') used as stats.period_key
|
|
11
|
+
function toHourKey(date) {
|
|
12
|
+
return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}-${String(date.getUTCHours()).padStart(2, '0')}`;
|
|
13
|
+
}
|
|
2
14
|
// Aggregate stats from requests table (called periodically)
|
|
3
15
|
// Only stores hourly (UTC) entries — daily aggregation is done on the frontend
|
|
4
16
|
// using the user's local timezone.
|
|
5
|
-
|
|
17
|
+
// maxDays: hourly retention window in days. A positive integer shrinks the
|
|
18
|
+
// window (capped at 30); undefined / <=0 falls back to the default 30 days.
|
|
19
|
+
export function aggregateStats(maxDays) {
|
|
6
20
|
const db = initDatabase();
|
|
7
21
|
const now = new Date();
|
|
8
22
|
const nowIso = now.toISOString();
|
|
9
|
-
//
|
|
10
|
-
const
|
|
23
|
+
// windowDays days of hourly data (30 days = 720 entries)
|
|
24
|
+
const windowDays = Number.isInteger(maxDays) && maxDays > 0
|
|
25
|
+
? Math.min(30, maxDays)
|
|
26
|
+
: 30;
|
|
27
|
+
const hourlyCutoff = new Date(now.getTime() - windowDays * 86400000).toISOString();
|
|
11
28
|
// Aggregate hourly stats using SQLite's built-in strftime (UTC)
|
|
12
29
|
const hourlyRows = db.prepare(`
|
|
13
30
|
SELECT
|
|
14
31
|
strftime('%Y-%m-%d-%H', timestamp) as hour,
|
|
15
|
-
|
|
16
|
-
SUM(output_tokens) as output_tokens,
|
|
17
|
-
SUM(cache_read_tokens) as cache_read_tokens,
|
|
18
|
-
SUM(cache_creation_tokens) as cache_creation_tokens,
|
|
19
|
-
COUNT(*) as request_count
|
|
32
|
+
${TOKEN_AGG_COLUMNS}
|
|
20
33
|
FROM requests
|
|
21
34
|
WHERE timestamp >= ?
|
|
22
35
|
GROUP BY hour
|
|
23
36
|
`).all(hourlyCutoff);
|
|
37
|
+
// Recompute the whole window atomically: drop every hourly snapshot inside
|
|
38
|
+
// the window first (source rows may already have been deleted by cleanup, so
|
|
39
|
+
// an upsert-only pass would leave stale snapshots frozen forever), then
|
|
40
|
+
// re-insert from the requests table.
|
|
41
|
+
// Cutoff key uses UTC methods to match the UTC keys stored in the DB.
|
|
42
|
+
// The two deletes (< key / >= key) together clear every hourly row.
|
|
43
|
+
const cutoffKey = toHourKey(new Date(hourlyCutoff));
|
|
44
|
+
const deleteWindow = db.prepare(`DELETE FROM stats WHERE period = 'hourly' AND period_key >= ?`);
|
|
24
45
|
// Upsert hourly stats
|
|
25
46
|
const upsertHourly = db.prepare(`
|
|
26
47
|
INSERT OR REPLACE INTO stats (
|
|
@@ -28,16 +49,19 @@ export function aggregateStats() {
|
|
|
28
49
|
cache_read_tokens, cache_creation_tokens, request_count, updated_at
|
|
29
50
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
30
51
|
`);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
// Clean old hourly entries: compute cutoff key using UTC methods
|
|
35
|
-
// to match the UTC keys stored in the DB
|
|
36
|
-
const cutoffDate = new Date(hourlyCutoff);
|
|
37
|
-
const cutoffKey = `${cutoffDate.getUTCFullYear()}-${String(cutoffDate.getUTCMonth() + 1).padStart(2, '0')}-${String(cutoffDate.getUTCDate()).padStart(2, '0')}-${String(cutoffDate.getUTCHours()).padStart(2, '0')}`;
|
|
38
|
-
db.prepare(`DELETE FROM stats WHERE period = 'hourly' AND period_key < ?`).run(cutoffKey);
|
|
52
|
+
// Clean hourly entries outside the recomputation window
|
|
53
|
+
const deleteOldKeys = db.prepare(`DELETE FROM stats WHERE period = 'hourly' AND period_key < ?`);
|
|
39
54
|
// Clean ALL daily entries (legacy data from old +8h approach)
|
|
40
|
-
db.prepare(`DELETE FROM stats WHERE period = 'daily'`)
|
|
55
|
+
const deleteDaily = db.prepare(`DELETE FROM stats WHERE period = 'daily'`);
|
|
56
|
+
const recompute = db.transaction(() => {
|
|
57
|
+
deleteWindow.run(cutoffKey);
|
|
58
|
+
for (const row of hourlyRows) {
|
|
59
|
+
upsertHourly.run('hourly', row.hour, row.input_tokens || 0, row.output_tokens || 0, row.cache_read_tokens || 0, row.cache_creation_tokens || 0, row.request_count, nowIso);
|
|
60
|
+
}
|
|
61
|
+
deleteOldKeys.run(cutoffKey);
|
|
62
|
+
deleteDaily.run();
|
|
63
|
+
});
|
|
64
|
+
recompute();
|
|
41
65
|
// WAL checkpoint to keep WAL file size bounded
|
|
42
66
|
db.pragma('wal_checkpoint(TRUNCATE)');
|
|
43
67
|
}
|
|
@@ -47,8 +71,7 @@ export function getStatsData(since) {
|
|
|
47
71
|
let hourlyRows;
|
|
48
72
|
if (since) {
|
|
49
73
|
// Convert since (ISO UTC) to UTC hourly key format for filtering
|
|
50
|
-
const
|
|
51
|
-
const sinceKey = `${sinceDate.getUTCFullYear()}-${String(sinceDate.getUTCMonth() + 1).padStart(2, '0')}-${String(sinceDate.getUTCDate()).padStart(2, '0')}-${String(sinceDate.getUTCHours()).padStart(2, '0')}`;
|
|
74
|
+
const sinceKey = toHourKey(new Date(since));
|
|
52
75
|
hourlyRows = db.prepare(`
|
|
53
76
|
SELECT * FROM stats WHERE period = 'hourly' AND period_key >= ? ORDER BY period_key ASC
|
|
54
77
|
`).all(sinceKey);
|
|
@@ -82,12 +105,9 @@ export function getStatsData(since) {
|
|
|
82
105
|
export function getTodayStats(since) {
|
|
83
106
|
const db = initDatabase();
|
|
84
107
|
// Totals: SUM tokens + COUNT requests since local midnight
|
|
108
|
+
// 多选的 cache_creation_tokens 在返回映射时忽略
|
|
85
109
|
const totalRow = db.prepare(`
|
|
86
|
-
SELECT
|
|
87
|
-
SUM(input_tokens) as input_tokens,
|
|
88
|
-
SUM(output_tokens) as output_tokens,
|
|
89
|
-
SUM(cache_read_tokens) as cache_read_tokens,
|
|
90
|
-
COUNT(*) as request_count
|
|
110
|
+
SELECT ${TOKEN_AGG_COLUMNS}
|
|
91
111
|
FROM requests
|
|
92
112
|
WHERE timestamp >= ?
|
|
93
113
|
`).get(since);
|
|
@@ -10,6 +10,13 @@ import { mcpManager } from './mcp-manager.js';
|
|
|
10
10
|
* 无 tools 数组时自动创建,让裸请求也能使用 MCP tool。
|
|
11
11
|
*/
|
|
12
12
|
export function injectMcpTools(body) {
|
|
13
|
+
// 守卫:malformed body 直接返回,避免给原始值赋值抛 TypeError。
|
|
14
|
+
// 判定依据:有效 chat body 至少要有 messages 数组;null/非对象,或既无 tools 也无 messages(如 {}、{tools:'nope'})均不注入。
|
|
15
|
+
if (body === null ||
|
|
16
|
+
typeof body !== 'object' ||
|
|
17
|
+
(!Array.isArray(body?.tools) && !Array.isArray(body?.messages))) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
13
20
|
if (!Array.isArray(body?.tools)) {
|
|
14
21
|
body.tools = [];
|
|
15
22
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export declare function isValidSlug(slug: string): boolean;
|
|
2
|
+
export interface TopicSummary {
|
|
3
|
+
slug: string;
|
|
4
|
+
title: string;
|
|
5
|
+
summary: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface ChunkRef {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
tags: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface TopicIndex {
|
|
15
|
+
slug: string;
|
|
16
|
+
title: string;
|
|
17
|
+
summary: string;
|
|
18
|
+
tags: string[];
|
|
19
|
+
chunks: ChunkRef[];
|
|
20
|
+
}
|
|
21
|
+
interface TopicDetail {
|
|
22
|
+
title: string;
|
|
23
|
+
tags: string[];
|
|
24
|
+
sources: unknown[];
|
|
25
|
+
chunks: ChunkRef[];
|
|
26
|
+
}
|
|
27
|
+
interface ChunkHit {
|
|
28
|
+
topic: string;
|
|
29
|
+
chunkId: string;
|
|
30
|
+
title: string;
|
|
31
|
+
}
|
|
32
|
+
interface QueryHit {
|
|
33
|
+
topic: string;
|
|
34
|
+
chunkId: string;
|
|
35
|
+
title: string;
|
|
36
|
+
body: string;
|
|
37
|
+
}
|
|
38
|
+
export interface OutlineItem {
|
|
39
|
+
id: string;
|
|
40
|
+
title: string;
|
|
41
|
+
oneLine: string;
|
|
42
|
+
}
|
|
43
|
+
interface RootIndex {
|
|
44
|
+
topics: TopicSummary[];
|
|
45
|
+
}
|
|
46
|
+
export interface Vault {
|
|
47
|
+
/** vault 根目录(docsDir)绝对路径 */
|
|
48
|
+
readonly root: string;
|
|
49
|
+
listTopics(): Promise<TopicSummary[]>;
|
|
50
|
+
getTopic(topic: string): Promise<TopicDetail>;
|
|
51
|
+
searchChunks(query: string): Promise<ChunkHit[]>;
|
|
52
|
+
queryKnowledge(query: string, limit?: number): Promise<QueryHit[]>;
|
|
53
|
+
readChunk(topic: string, chunkId: string): Promise<string>;
|
|
54
|
+
upsertTopic(input: {
|
|
55
|
+
slug: string;
|
|
56
|
+
title: string;
|
|
57
|
+
summary: string;
|
|
58
|
+
tags: string[];
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
upsertChunkRef(input: {
|
|
61
|
+
topic: string;
|
|
62
|
+
chunkId: string;
|
|
63
|
+
title: string;
|
|
64
|
+
summary: string;
|
|
65
|
+
tags: string[];
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
readTopicIndex(slug: string): Promise<TopicIndex | null>;
|
|
68
|
+
readSidecarIndex(slug: string): Promise<TopicIndex | null>;
|
|
69
|
+
assertSlug(slug: string, field?: string): void;
|
|
70
|
+
/** 重建 topic 目录:rm -rf 后建 sources/ + chunks/ */
|
|
71
|
+
prepareTopic(slug: string): void;
|
|
72
|
+
/** 写 <slug>/sources/source-NNN.md(content 带 Source 头) */
|
|
73
|
+
writeSourceFile(slug: string, index: number, url: string, text: string): void;
|
|
74
|
+
/** 数 <slug>/sources 下 .md 文件;目录不存在按 0 */
|
|
75
|
+
countSourceFiles(slug: string): number;
|
|
76
|
+
/** 读 <slug>/sources 下全部 .md 正文(按文件名排序);目录缺失抛底层错误 */
|
|
77
|
+
readSourceBodies(slug: string): string[];
|
|
78
|
+
/** 写 <slug>/outline.json(校验目录已 prepare、sources 存在) */
|
|
79
|
+
writeOutline(slug: string, items: OutlineItem[]): void;
|
|
80
|
+
/** 读 <slug>/outline.json 的 items;文件不存在抛「outline 未生成」 */
|
|
81
|
+
readOutlineItems(slug: string): OutlineItem[];
|
|
82
|
+
/** 旁挂:<slug> → <slug>.old */
|
|
83
|
+
parkTopic(slug: string): void;
|
|
84
|
+
/** 还原:<slug>.old → <slug> */
|
|
85
|
+
restoreTopic(slug: string): void;
|
|
86
|
+
/** 重命名 topic 目录:<slug> → <newSlug> */
|
|
87
|
+
renameTopic(slug: string, newSlug: string): void;
|
|
88
|
+
/** 读 <entry>/index.json(entry 可为 slug 或 <slug>.old);缺失/坏抛底层错误 */
|
|
89
|
+
readEntryIndexSync(entry: string): TopicIndex;
|
|
90
|
+
/** 写 <entry>/index.json */
|
|
91
|
+
writeEntryIndexSync(entry: string, idx: TopicIndex): void;
|
|
92
|
+
readRootIndexSync(): RootIndex;
|
|
93
|
+
writeRootIndexSync(root: RootIndex): void;
|
|
94
|
+
/** 列 <entry>/<subdir> 下 .md 文件名(排序);目录缺失视为空 */
|
|
95
|
+
listEntryMd(entry: string, subdir: 'sources' | 'chunks'): string[];
|
|
96
|
+
mkdirEntrySubdir(entry: string, subdir: 'sources' | 'chunks'): void;
|
|
97
|
+
readEntryFile(entry: string, subdir: 'sources' | 'chunks', file: string): Buffer;
|
|
98
|
+
writeEntryFile(entry: string, subdir: 'sources' | 'chunks', file: string, body: Buffer): void;
|
|
99
|
+
unlinkEntryFile(entry: string, subdir: 'sources' | 'chunks', file: string): void;
|
|
100
|
+
/** 删除整个 <entry> 目录 */
|
|
101
|
+
removeEntry(entry: string): void;
|
|
102
|
+
/** docsDir 下存在任何 .old 旁挂目录时抛错 */
|
|
103
|
+
assertNoOldSidecars(): void;
|
|
104
|
+
/** 归一化路径并断言其在 docsDir 内,越界抛错 */
|
|
105
|
+
assertInside(absPath: string): string;
|
|
106
|
+
/** 目标为受管 index.json 时抛错 */
|
|
107
|
+
assertNotManagedIndexJson(absPath: string): void;
|
|
108
|
+
}
|
|
109
|
+
export declare function createVault(docsDir: string): Vault;
|
|
110
|
+
export declare const vault: Vault;
|
|
111
|
+
export {};
|