@pasko70/pibo 1.0.0
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/.codex/skills/pi-agent-harness/SKILL.md +319 -0
- package/.codex/skills/pi-agent-harness/agents/openai.yaml +4 -0
- package/README.md +318 -0
- package/context/codex-base-prompt.md +144 -0
- package/context/pibo-compaction-prompt.md +100 -0
- package/context/pibo-system-prompt.md +17 -0
- package/dist/apps/chat/agent-profiles.js +26 -0
- package/dist/apps/chat/agent-store.js +336 -0
- package/dist/apps/chat/event-log.js +307 -0
- package/dist/apps/chat/read-model.js +218 -0
- package/dist/apps/chat/rooms.js +321 -0
- package/dist/apps/chat/session-metadata.js +14 -0
- package/dist/apps/chat/stream.js +122 -0
- package/dist/apps/chat/trace.js +1182 -0
- package/dist/apps/chat/web-app.js +2569 -0
- package/dist/apps/chat-ui/assets/apl-BxEMbctQ.js +1 -0
- package/dist/apps/chat-ui/assets/asciiarmor-eFjeGRuZ.js +1 -0
- package/dist/apps/chat-ui/assets/asn1-Cfx-0pt9.js +1 -0
- package/dist/apps/chat-ui/assets/asterisk-B5BHTsBr.js +1 -0
- package/dist/apps/chat-ui/assets/brainfuck-CAA2xofr.js +1 -0
- package/dist/apps/chat-ui/assets/clike-BoDCOLzN.js +1 -0
- package/dist/apps/chat-ui/assets/clojure-kVFSWX0o.js +1 -0
- package/dist/apps/chat-ui/assets/cmake-BUPAhezI.js +1 -0
- package/dist/apps/chat-ui/assets/cobol-BfgHZgup.js +1 -0
- package/dist/apps/chat-ui/assets/coffeescript-G1Pe_1AZ.js +1 -0
- package/dist/apps/chat-ui/assets/commonlisp-B3N0CjHn.js +1 -0
- package/dist/apps/chat-ui/assets/crystal-C15ndaGM.js +1 -0
- package/dist/apps/chat-ui/assets/css-BqOeyZOV.js +1 -0
- package/dist/apps/chat-ui/assets/cypher-KjIKv-wW.js +1 -0
- package/dist/apps/chat-ui/assets/d-BlT5AEC-.js +1 -0
- package/dist/apps/chat-ui/assets/diff-oF98tbqj.js +1 -0
- package/dist/apps/chat-ui/assets/dist--55mTWk3.js +1 -0
- package/dist/apps/chat-ui/assets/dist-B5rcjVCj.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BPv5MdlL.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BZ39rB1W.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BsedZGJo.js +1 -0
- package/dist/apps/chat-ui/assets/dist-BvO6SpaM.js +9 -0
- package/dist/apps/chat-ui/assets/dist-C5YJOwhH.js +1 -0
- package/dist/apps/chat-ui/assets/dist-C5oXtFSP.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CG_gRSwv.js +23 -0
- package/dist/apps/chat-ui/assets/dist-CKM5j-iy.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CUp9us2q.js +1 -0
- package/dist/apps/chat-ui/assets/dist-CZ9T4Cly.js +1 -0
- package/dist/apps/chat-ui/assets/dist-D4HhiFWB.js +6 -0
- package/dist/apps/chat-ui/assets/dist-DHE-yBLH.js +1 -0
- package/dist/apps/chat-ui/assets/dist-DSKQpPaz.js +1 -0
- package/dist/apps/chat-ui/assets/dist-L1B-KWZO.js +1 -0
- package/dist/apps/chat-ui/assets/dist-SVPsM5Oi.js +13 -0
- package/dist/apps/chat-ui/assets/dist-Zqt9kNG9.js +1 -0
- package/dist/apps/chat-ui/assets/dist-_DPv0-QF.js +1 -0
- package/dist/apps/chat-ui/assets/dist-_oM7g0eh.js +11 -0
- package/dist/apps/chat-ui/assets/dist-laadbMWg.js +1 -0
- package/dist/apps/chat-ui/assets/dist-nFui3f-r.js +2 -0
- package/dist/apps/chat-ui/assets/dist-tGfufz3b.js +1 -0
- package/dist/apps/chat-ui/assets/dockerfile-CUaqzcqp.js +1 -0
- package/dist/apps/chat-ui/assets/dtd-VCA9yr61.js +1 -0
- package/dist/apps/chat-ui/assets/dylan-O-V5Dw5W.js +1 -0
- package/dist/apps/chat-ui/assets/ebnf-SPmdBkvT.js +1 -0
- package/dist/apps/chat-ui/assets/ecl-ChfCttfI.js +1 -0
- package/dist/apps/chat-ui/assets/eiffel-cB9EbjeN.js +1 -0
- package/dist/apps/chat-ui/assets/elm-BTiVflBU.js +1 -0
- package/dist/apps/chat-ui/assets/erlang-egf0TXFm.js +1 -0
- package/dist/apps/chat-ui/assets/factor-C2tAxNob.js +1 -0
- package/dist/apps/chat-ui/assets/fcl-BiCjh1tj.js +1 -0
- package/dist/apps/chat-ui/assets/forth-C4kDGW6u.js +1 -0
- package/dist/apps/chat-ui/assets/fortran-DzkLaPnd.js +1 -0
- package/dist/apps/chat-ui/assets/gas-DMOxskQF.js +1 -0
- package/dist/apps/chat-ui/assets/gherkin-BPxBpp-k.js +1 -0
- package/dist/apps/chat-ui/assets/groovy-CkEnc0ZY.js +1 -0
- package/dist/apps/chat-ui/assets/haskell-Dadpo9-w.js +1 -0
- package/dist/apps/chat-ui/assets/haxe-CDNZL9MW.js +1 -0
- package/dist/apps/chat-ui/assets/http-jy9Zxxt3.js +1 -0
- package/dist/apps/chat-ui/assets/idl-CGSB6iiy.js +1 -0
- package/dist/apps/chat-ui/assets/index-BdcqTugD.js +151 -0
- package/dist/apps/chat-ui/assets/index-Dk-opWl3.css +1 -0
- package/dist/apps/chat-ui/assets/javascript-DSlzRUd8.js +1 -0
- package/dist/apps/chat-ui/assets/julia-DTiF9v6R.js +1 -0
- package/dist/apps/chat-ui/assets/livescript-Ci8Xxna6.js +1 -0
- package/dist/apps/chat-ui/assets/lua-eVxIrt9t.js +1 -0
- package/dist/apps/chat-ui/assets/mathematica-Da3grj36.js +1 -0
- package/dist/apps/chat-ui/assets/mbox-BWBMSafM.js +1 -0
- package/dist/apps/chat-ui/assets/mirc-CtHu9S1B.js +1 -0
- package/dist/apps/chat-ui/assets/mllike-wTFlPWXS.js +1 -0
- package/dist/apps/chat-ui/assets/modelica-cKbQ0UXu.js +1 -0
- package/dist/apps/chat-ui/assets/mscgen-C5pXQCMK.js +1 -0
- package/dist/apps/chat-ui/assets/mumps-CKBHkOQq.js +1 -0
- package/dist/apps/chat-ui/assets/nginx-B00AiQel.js +1 -0
- package/dist/apps/chat-ui/assets/nsis-SMDwKltR.js +1 -0
- package/dist/apps/chat-ui/assets/ntriples-B_36EBV0.js +1 -0
- package/dist/apps/chat-ui/assets/octave-BXPjzAif.js +1 -0
- package/dist/apps/chat-ui/assets/oz-Dedpat1M.js +1 -0
- package/dist/apps/chat-ui/assets/pascal-CMcUg72K.js +1 -0
- package/dist/apps/chat-ui/assets/perl-DoVTbnzt.js +1 -0
- package/dist/apps/chat-ui/assets/pig-CULXT1YV.js +1 -0
- package/dist/apps/chat-ui/assets/powershell-Cv5Uhf6b.js +1 -0
- package/dist/apps/chat-ui/assets/properties-CQ1C2P-M.js +1 -0
- package/dist/apps/chat-ui/assets/protobuf-SRlvzrl6.js +1 -0
- package/dist/apps/chat-ui/assets/pug-Bo3wfL-f.js +1 -0
- package/dist/apps/chat-ui/assets/puppet-ClSqCGj6.js +1 -0
- package/dist/apps/chat-ui/assets/python-C2_X1GpX.js +1 -0
- package/dist/apps/chat-ui/assets/q-B_6Gdyzl.js +1 -0
- package/dist/apps/chat-ui/assets/r-BD07NGED.js +1 -0
- package/dist/apps/chat-ui/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- package/dist/apps/chat-ui/assets/rpm-CRu5Z2Jl.js +1 -0
- package/dist/apps/chat-ui/assets/ruby-dZPnOz8h.js +1 -0
- package/dist/apps/chat-ui/assets/sas-S2t8_sDI.js +1 -0
- package/dist/apps/chat-ui/assets/scheme-WcyFWLW2.js +1 -0
- package/dist/apps/chat-ui/assets/shell-DUelnYSh.js +1 -0
- package/dist/apps/chat-ui/assets/sieve-jDjlVhNh.js +1 -0
- package/dist/apps/chat-ui/assets/simple-mode-CL04yRVp.js +1 -0
- package/dist/apps/chat-ui/assets/smalltalk-ddWDYy10.js +1 -0
- package/dist/apps/chat-ui/assets/solr-C7rQhLuW.js +1 -0
- package/dist/apps/chat-ui/assets/sparql--fPCCgVd.js +1 -0
- package/dist/apps/chat-ui/assets/spreadsheet-DjthqD5G.js +1 -0
- package/dist/apps/chat-ui/assets/sql-D_dieYbr.js +1 -0
- package/dist/apps/chat-ui/assets/stex-rHcFYcA0.js +1 -0
- package/dist/apps/chat-ui/assets/stylus-DxF70RNr.js +1 -0
- package/dist/apps/chat-ui/assets/swift-T0hDoOb-.js +1 -0
- package/dist/apps/chat-ui/assets/tcl-Dlzy1mPk.js +1 -0
- package/dist/apps/chat-ui/assets/textile-Dy5rFZe5.js +1 -0
- package/dist/apps/chat-ui/assets/tiddlywiki-DQP1OymS.js +1 -0
- package/dist/apps/chat-ui/assets/tiki-0vOj3DB2.js +1 -0
- package/dist/apps/chat-ui/assets/toml-DEltN0lI.js +1 -0
- package/dist/apps/chat-ui/assets/troff-CRbBpEqY.js +1 -0
- package/dist/apps/chat-ui/assets/ttcn-M5q1nLKg.js +1 -0
- package/dist/apps/chat-ui/assets/ttcn-cfg-Rmw9NWq9.js +1 -0
- package/dist/apps/chat-ui/assets/turtle-BCDWhJK0.js +1 -0
- package/dist/apps/chat-ui/assets/vb-QQ7LGlOz.js +1 -0
- package/dist/apps/chat-ui/assets/vbscript-BiSEdUzz.js +1 -0
- package/dist/apps/chat-ui/assets/velocity-CzMg5_6w.js +1 -0
- package/dist/apps/chat-ui/assets/verilog-BJOO83gk.js +1 -0
- package/dist/apps/chat-ui/assets/vhdl-ed4zAZAA.js +1 -0
- package/dist/apps/chat-ui/assets/webidl-Ddy6hbV6.js +1 -0
- package/dist/apps/chat-ui/assets/xquery-Bw1zwhh6.js +1 -0
- package/dist/apps/chat-ui/assets/yacas-DZdTXy3s.js +1 -0
- package/dist/apps/chat-ui/assets/z80-DMG02_YV.js +1 -0
- package/dist/apps/chat-ui/index.html +15 -0
- package/dist/apps/context-files-ui/assets/apl-14BqhLYK.js +1 -0
- package/dist/apps/context-files-ui/assets/asciiarmor-WLvjqI7d.js +1 -0
- package/dist/apps/context-files-ui/assets/asn1-Bg4FbdCg.js +1 -0
- package/dist/apps/context-files-ui/assets/asterisk-B2MO-X4d.js +1 -0
- package/dist/apps/context-files-ui/assets/brainfuck-CV9kufud.js +1 -0
- package/dist/apps/context-files-ui/assets/clike-CjmcUpt6.js +1 -0
- package/dist/apps/context-files-ui/assets/clojure-De3QGfx6.js +1 -0
- package/dist/apps/context-files-ui/assets/cmake-i2VDNaRq.js +1 -0
- package/dist/apps/context-files-ui/assets/cobol-BwO6DF08.js +1 -0
- package/dist/apps/context-files-ui/assets/coffeescript-BtivDvRz.js +1 -0
- package/dist/apps/context-files-ui/assets/commonlisp-DFkEQdLP.js +1 -0
- package/dist/apps/context-files-ui/assets/crystal-CU0NkcVL.js +1 -0
- package/dist/apps/context-files-ui/assets/css-CbMZAQ1W.js +1 -0
- package/dist/apps/context-files-ui/assets/cypher-Dke5QOzv.js +1 -0
- package/dist/apps/context-files-ui/assets/d-TPqSVaHM.js +1 -0
- package/dist/apps/context-files-ui/assets/diff-B365LSoZ.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-B5PTVnox.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-B5ZAfwf5.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-BJW3917N.js +11 -0
- package/dist/apps/context-files-ui/assets/dist-BkUONE3N.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-CKQF1zEu.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-CwbH_3RN.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-CxRLRmMx.js +2 -0
- package/dist/apps/context-files-ui/assets/dist-D1KyNDg5.js +13 -0
- package/dist/apps/context-files-ui/assets/dist-DFi2YGux.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DKoyMSNr.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DLMjd26T.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DQXzt2Ng.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DotDq_kD.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-DyfSeBMu.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-MyZgX9K2.js +9 -0
- package/dist/apps/context-files-ui/assets/dist-QQuDy4KA.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-YwR9dpb-.js +1 -0
- package/dist/apps/context-files-ui/assets/dist-dTBsFYAl.js +1 -0
- package/dist/apps/context-files-ui/assets/dockerfile-CJb2sekW.js +1 -0
- package/dist/apps/context-files-ui/assets/dtd-CBMymJ7O.js +1 -0
- package/dist/apps/context-files-ui/assets/dylan-08Azy1NK.js +1 -0
- package/dist/apps/context-files-ui/assets/ebnf-Dkum_1J8.js +1 -0
- package/dist/apps/context-files-ui/assets/ecl-dhxjHL8y.js +1 -0
- package/dist/apps/context-files-ui/assets/eiffel-C446m6dI.js +1 -0
- package/dist/apps/context-files-ui/assets/elm-po1E9de0.js +1 -0
- package/dist/apps/context-files-ui/assets/erlang-BD5LkVkR.js +1 -0
- package/dist/apps/context-files-ui/assets/factor-B2EMQZkP.js +1 -0
- package/dist/apps/context-files-ui/assets/fcl-DkEOamHd.js +1 -0
- package/dist/apps/context-files-ui/assets/forth-dCg2_HVB.js +1 -0
- package/dist/apps/context-files-ui/assets/fortran-3ZpXLFh1.js +1 -0
- package/dist/apps/context-files-ui/assets/gas-DMmxLZRI.js +1 -0
- package/dist/apps/context-files-ui/assets/gherkin-DUSFg2R6.js +1 -0
- package/dist/apps/context-files-ui/assets/groovy-Cmduloe1.js +1 -0
- package/dist/apps/context-files-ui/assets/haskell-Cyr255R9.js +1 -0
- package/dist/apps/context-files-ui/assets/haxe-BJVKtprM.js +1 -0
- package/dist/apps/context-files-ui/assets/http-DszHFpc-.js +1 -0
- package/dist/apps/context-files-ui/assets/idl-Cati9Nrv.js +1 -0
- package/dist/apps/context-files-ui/assets/index-BwRDoHMC.css +1 -0
- package/dist/apps/context-files-ui/assets/index-GwvjXytt.js +202 -0
- package/dist/apps/context-files-ui/assets/javascript-C5pDVaoP.js +1 -0
- package/dist/apps/context-files-ui/assets/julia-DlqY1cTU.js +1 -0
- package/dist/apps/context-files-ui/assets/livescript-C6p8-2W1.js +1 -0
- package/dist/apps/context-files-ui/assets/lua-BxuTHaF7.js +1 -0
- package/dist/apps/context-files-ui/assets/mathematica-nDHZUMJT.js +1 -0
- package/dist/apps/context-files-ui/assets/mbox-DAaR0Hcz.js +1 -0
- package/dist/apps/context-files-ui/assets/mirc-CCA0FRfl.js +1 -0
- package/dist/apps/context-files-ui/assets/mllike-Cw3Iccsb.js +1 -0
- package/dist/apps/context-files-ui/assets/modelica-Czx80fNR.js +1 -0
- package/dist/apps/context-files-ui/assets/mscgen-BmfuTbzG.js +1 -0
- package/dist/apps/context-files-ui/assets/mumps-Ds_ZaumL.js +1 -0
- package/dist/apps/context-files-ui/assets/nginx-D9M2PQ4U.js +1 -0
- package/dist/apps/context-files-ui/assets/nsis-DOo3SJmd.js +1 -0
- package/dist/apps/context-files-ui/assets/ntriples-DLHGTvHs.js +1 -0
- package/dist/apps/context-files-ui/assets/octave-8jj96JiC.js +1 -0
- package/dist/apps/context-files-ui/assets/oz-BmMq7iC4.js +1 -0
- package/dist/apps/context-files-ui/assets/pascal-BgMr6XpT.js +1 -0
- package/dist/apps/context-files-ui/assets/perl-D6YJObi_.js +1 -0
- package/dist/apps/context-files-ui/assets/pig-nx7uchs8.js +1 -0
- package/dist/apps/context-files-ui/assets/powershell-B4IPkVxR.js +1 -0
- package/dist/apps/context-files-ui/assets/properties-CoavQdLC.js +1 -0
- package/dist/apps/context-files-ui/assets/protobuf-D5EWhcmc.js +1 -0
- package/dist/apps/context-files-ui/assets/pug-QU72BPAa.js +1 -0
- package/dist/apps/context-files-ui/assets/puppet-B_0GFuyD.js +1 -0
- package/dist/apps/context-files-ui/assets/python-Cs7sNzy_.js +1 -0
- package/dist/apps/context-files-ui/assets/q-BIB9pPtI.js +1 -0
- package/dist/apps/context-files-ui/assets/r-CN5s4f3o.js +1 -0
- package/dist/apps/context-files-ui/assets/rpm-Ct_Ck8mQ.js +1 -0
- package/dist/apps/context-files-ui/assets/ruby-BVPradRk.js +1 -0
- package/dist/apps/context-files-ui/assets/sas-DN4j74IF.js +1 -0
- package/dist/apps/context-files-ui/assets/scheme-CvNgHAnh.js +1 -0
- package/dist/apps/context-files-ui/assets/shell-BjiMLAaM.js +1 -0
- package/dist/apps/context-files-ui/assets/sieve-C2U1O5Z4.js +1 -0
- package/dist/apps/context-files-ui/assets/simple-mode-DnMbQuKW.js +1 -0
- package/dist/apps/context-files-ui/assets/smalltalk-DkYwYufV.js +1 -0
- package/dist/apps/context-files-ui/assets/solr-BopnSD-v.js +1 -0
- package/dist/apps/context-files-ui/assets/sparql-Cpg3YQfd.js +1 -0
- package/dist/apps/context-files-ui/assets/spreadsheet-kRxtVt9J.js +1 -0
- package/dist/apps/context-files-ui/assets/sql-DYI2GwJR.js +1 -0
- package/dist/apps/context-files-ui/assets/stex-BCRT8IJ3.js +1 -0
- package/dist/apps/context-files-ui/assets/stylus-CARoeVE9.js +1 -0
- package/dist/apps/context-files-ui/assets/swift-DKNaLAK6.js +1 -0
- package/dist/apps/context-files-ui/assets/tcl-CQyXkgMH.js +1 -0
- package/dist/apps/context-files-ui/assets/textile-Yg_UWn-t.js +1 -0
- package/dist/apps/context-files-ui/assets/tiddlywiki-dqVbkfX4.js +1 -0
- package/dist/apps/context-files-ui/assets/tiki-CC_ic8g0.js +1 -0
- package/dist/apps/context-files-ui/assets/toml-B7gGzVkJ.js +1 -0
- package/dist/apps/context-files-ui/assets/troff-Bq3z6oAu.js +1 -0
- package/dist/apps/context-files-ui/assets/ttcn-GvRgs2AT.js +1 -0
- package/dist/apps/context-files-ui/assets/ttcn-cfg-CGCXz7Vo.js +1 -0
- package/dist/apps/context-files-ui/assets/turtle-CwIpz2yy.js +1 -0
- package/dist/apps/context-files-ui/assets/vb-BmcHUM2C.js +1 -0
- package/dist/apps/context-files-ui/assets/vbscript-Cs9dylre.js +1 -0
- package/dist/apps/context-files-ui/assets/velocity-CBWU0VCy.js +1 -0
- package/dist/apps/context-files-ui/assets/verilog-DVCHmufx.js +1 -0
- package/dist/apps/context-files-ui/assets/vhdl-BGDk4f1d.js +1 -0
- package/dist/apps/context-files-ui/assets/webidl-egXQEWlC.js +1 -0
- package/dist/apps/context-files-ui/assets/xquery-5f0hn7cg.js +1 -0
- package/dist/apps/context-files-ui/assets/yacas-DNs9XkmQ.js +1 -0
- package/dist/apps/context-files-ui/assets/z80-B7Dfb4UO.js +1 -0
- package/dist/apps/context-files-ui/index.html +14 -0
- package/dist/auth/better-auth.js +129 -0
- package/dist/auth/types.js +14 -0
- package/dist/bin/pibo.js +3 -0
- package/dist/channels/types.js +1 -0
- package/dist/cli-errors.js +18 -0
- package/dist/cli.js +264 -0
- package/dist/config/config.js +167 -0
- package/dist/core/base-prompt.js +104 -0
- package/dist/core/codex-compat.js +44 -0
- package/dist/core/compaction-prompt.js +258 -0
- package/dist/core/events.js +1 -0
- package/dist/core/profiles.js +138 -0
- package/dist/core/routed-session.js +538 -0
- package/dist/core/runtime.js +323 -0
- package/dist/core/session-router.js +437 -0
- package/dist/core/system-prompt-template.js +56 -0
- package/dist/core/thinking.js +9 -0
- package/dist/core/workspace.js +5 -0
- package/dist/debug/events.js +92 -0
- package/dist/debug/index.js +631 -0
- package/dist/debug/session.js +200 -0
- package/dist/debug/sql.js +238 -0
- package/dist/debug/stores.js +49 -0
- package/dist/debug/trace.js +245 -0
- package/dist/env.js +32 -0
- package/dist/gateway/client.js +200 -0
- package/dist/gateway/protocol.js +46 -0
- package/dist/gateway/request.js +146 -0
- package/dist/gateway/server.js +221 -0
- package/dist/gateway/tool.js +69 -0
- package/dist/gateway/web.js +80 -0
- package/dist/index.js +23 -0
- package/dist/local/client.js +77 -0
- package/dist/local/extension.js +548 -0
- package/dist/local/tui.js +25 -0
- package/dist/mcp/agent-context.js +123 -0
- package/dist/mcp/client.js +332 -0
- package/dist/mcp/commands/call.js +146 -0
- package/dist/mcp/commands/grep.js +145 -0
- package/dist/mcp/commands/info.js +71 -0
- package/dist/mcp/commands/list.js +94 -0
- package/dist/mcp/config-command.js +217 -0
- package/dist/mcp/config.js +440 -0
- package/dist/mcp/daemon-client.js +266 -0
- package/dist/mcp/daemon.js +327 -0
- package/dist/mcp/errors.js +287 -0
- package/dist/mcp/index.js +431 -0
- package/dist/mcp/output.js +171 -0
- package/dist/mcp/python-runtime.js +131 -0
- package/dist/mcp/registry.js +116 -0
- package/dist/mcp/version.js +5 -0
- package/dist/pi-packages/cli.js +92 -0
- package/dist/pi-packages/installer.js +70 -0
- package/dist/pi-packages/metadata.js +231 -0
- package/dist/pi-packages/runtime.js +61 -0
- package/dist/pi-packages/store.js +175 -0
- package/dist/pi-packages/types.js +1 -0
- package/dist/plugins/better-auth.js +11 -0
- package/dist/plugins/builtin.js +249 -0
- package/dist/plugins/chat-web.js +11 -0
- package/dist/plugins/codex-compat.js +72 -0
- package/dist/plugins/context-files-store.js +354 -0
- package/dist/plugins/context-files.js +999 -0
- package/dist/plugins/core-tools.js +94 -0
- package/dist/plugins/example.js +67 -0
- package/dist/plugins/registry.js +368 -0
- package/dist/plugins/remote-agent.js +9 -0
- package/dist/plugins/types.js +1 -0
- package/dist/plugins/web.js +11 -0
- package/dist/reliability/store.js +759 -0
- package/dist/remote/channel.js +176 -0
- package/dist/remote/client.js +92 -0
- package/dist/remote/examples/tui-controller.js +263 -0
- package/dist/remote/protocol.js +55 -0
- package/dist/remote/session-client.js +189 -0
- package/dist/runs/registry.js +323 -0
- package/dist/runs/tools.js +185 -0
- package/dist/sessions/bindings.js +41 -0
- package/dist/sessions/sqlite-store.js +154 -0
- package/dist/sessions/store.js +125 -0
- package/dist/shared/trace-order.js +83 -0
- package/dist/subagents/tool.js +63 -0
- package/dist/tools/browser-use-cdp.js +207 -0
- package/dist/tools/browser-use-leases.js +338 -0
- package/dist/tools/browser-use-wrapper.js +338 -0
- package/dist/tools/codex-compat.js +85 -0
- package/dist/tools/desktop-env.js +90 -0
- package/dist/tools/guides.js +276 -0
- package/dist/tools/index.js +366 -0
- package/dist/tools/python-runtime.js +154 -0
- package/dist/tools/registry.js +107 -0
- package/dist/tools/web-search.js +137 -0
- package/dist/web/auth.js +10 -0
- package/dist/web/channel.js +151 -0
- package/dist/web/http.js +110 -0
- package/dist/web/types.js +1 -0
- package/package.json +74 -0
- package/src/mcp/LICENSE.mcp-cli +21 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { normalizeLimit, openReadOnlyDebugDatabase, withStorePath } from "./sql.js";
|
|
2
|
+
export function parseDebugSessionInput(input) {
|
|
3
|
+
const raw = input.trim();
|
|
4
|
+
if (!raw)
|
|
5
|
+
throw new Error("Session input is required");
|
|
6
|
+
const pathname = raw.startsWith("http://") || raw.startsWith("https://") ? new URL(raw).pathname : raw;
|
|
7
|
+
const roomMatch = /^\/apps\/chat\/rooms\/([^/]+)\/sessions\/([^/]+)\/?$/.exec(pathname);
|
|
8
|
+
if (roomMatch) {
|
|
9
|
+
return { raw, roomId: decodeURIComponent(roomMatch[1]), piboSessionId: decodeURIComponent(roomMatch[2]) };
|
|
10
|
+
}
|
|
11
|
+
const sessionMatch = /^\/apps\/chat\/sessions\/([^/]+)\/?$/.exec(pathname);
|
|
12
|
+
if (sessionMatch) {
|
|
13
|
+
return { raw, piboSessionId: decodeURIComponent(sessionMatch[1]) };
|
|
14
|
+
}
|
|
15
|
+
return { raw, piboSessionId: raw };
|
|
16
|
+
}
|
|
17
|
+
export function inspectDebugSession(input, stores, options = {}) {
|
|
18
|
+
const parsed = parseDebugSessionInput(input);
|
|
19
|
+
const limit = normalizeLimit(options.limit);
|
|
20
|
+
if (!stores.sessions.exists) {
|
|
21
|
+
throw new Error(`Debug store "sessions" not found at ${stores.sessions.defaultPath}`);
|
|
22
|
+
}
|
|
23
|
+
const sessionsDb = openReadOnlyDebugDatabase(stores.sessions);
|
|
24
|
+
try {
|
|
25
|
+
const session = sessionsDb.prepare("SELECT * FROM pibo_sessions WHERE id = ?").get(parsed.piboSessionId);
|
|
26
|
+
if (!session)
|
|
27
|
+
throw new Error(`Pibo session "${parsed.piboSessionId}" not found`);
|
|
28
|
+
const metadata = parseObject(session.metadata_json);
|
|
29
|
+
const sessionRoomId = stringValue(metadata.chatRoomId);
|
|
30
|
+
const warnings = parsed.roomId && sessionRoomId && parsed.roomId !== sessionRoomId
|
|
31
|
+
? [`URL roomId "${parsed.roomId}" does not match session metadata chatRoomId "${sessionRoomId}".`]
|
|
32
|
+
: [];
|
|
33
|
+
const summary = {
|
|
34
|
+
input: parsed,
|
|
35
|
+
warnings,
|
|
36
|
+
session: compactSessionRow(session),
|
|
37
|
+
metadata,
|
|
38
|
+
room: {
|
|
39
|
+
urlRoomId: parsed.roomId,
|
|
40
|
+
sessionRoomId,
|
|
41
|
+
matches: parsed.roomId && sessionRoomId ? parsed.roomId === sessionRoomId : undefined,
|
|
42
|
+
},
|
|
43
|
+
children: listChildSessions(sessionsDb, parsed.piboSessionId, limit),
|
|
44
|
+
};
|
|
45
|
+
if (stores.chat.exists) {
|
|
46
|
+
const chatDb = openReadOnlyDebugDatabase(stores.chat);
|
|
47
|
+
try {
|
|
48
|
+
summary.chat = readChatSession(chatDb, parsed.piboSessionId);
|
|
49
|
+
if (options.events)
|
|
50
|
+
summary.events = readEventSummaries(chatDb, parsed.piboSessionId, limit);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw withStorePath(error, stores.chat);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
chatDb.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return summary;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw withStorePath(error, stores.sessions);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
sessionsDb.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function formatDebugSessionSummary(summary) {
|
|
69
|
+
const lines = [];
|
|
70
|
+
lines.push(`piboSessionId: ${summary.input.piboSessionId}`);
|
|
71
|
+
if (summary.input.roomId)
|
|
72
|
+
lines.push(`urlRoomId: ${summary.input.roomId}`);
|
|
73
|
+
if (summary.room.sessionRoomId)
|
|
74
|
+
lines.push(`sessionRoomId: ${summary.room.sessionRoomId}`);
|
|
75
|
+
if (summary.room.matches !== undefined)
|
|
76
|
+
lines.push(`roomMatch: ${String(summary.room.matches)}`);
|
|
77
|
+
for (const warning of summary.warnings)
|
|
78
|
+
lines.push(`warning: ${warning}`);
|
|
79
|
+
lines.push("");
|
|
80
|
+
lines.push("Session:");
|
|
81
|
+
for (const [key, value] of Object.entries(summary.session)) {
|
|
82
|
+
lines.push(` ${key}: ${formatValue(value)}`);
|
|
83
|
+
}
|
|
84
|
+
if (Object.keys(summary.metadata).length) {
|
|
85
|
+
lines.push("");
|
|
86
|
+
lines.push("Metadata:");
|
|
87
|
+
for (const [key, value] of Object.entries(summary.metadata)) {
|
|
88
|
+
lines.push(` ${key}: ${formatValue(value)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
lines.push("");
|
|
92
|
+
lines.push(`Children: ${summary.children.length}`);
|
|
93
|
+
for (const child of summary.children) {
|
|
94
|
+
lines.push(` ${formatValue(child.id)}\t${formatValue(child.profile)}\t${formatValue(child.kind)}\t${formatValue(child.subagentName)}\t${formatValue(child.threadKey)}`);
|
|
95
|
+
}
|
|
96
|
+
if (summary.chat) {
|
|
97
|
+
lines.push("");
|
|
98
|
+
lines.push("Chat Web:");
|
|
99
|
+
for (const [key, value] of Object.entries(summary.chat)) {
|
|
100
|
+
lines.push(` ${key}: ${formatValue(value)}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (summary.events) {
|
|
104
|
+
lines.push("");
|
|
105
|
+
lines.push(`Events: ${summary.events.length}`);
|
|
106
|
+
for (const event of summary.events) {
|
|
107
|
+
lines.push(` ${formatValue(event.created_at)}\t${formatValue(event.type)}\t${formatValue(event.event_id)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return lines.join("\n");
|
|
111
|
+
}
|
|
112
|
+
function listChildSessions(db, piboSessionId, limit) {
|
|
113
|
+
const rows = db
|
|
114
|
+
.prepare(`
|
|
115
|
+
SELECT id, pi_session_id, channel, kind, profile, parent_id, metadata_json, created_at, updated_at
|
|
116
|
+
FROM pibo_sessions
|
|
117
|
+
WHERE parent_id = ?
|
|
118
|
+
ORDER BY created_at
|
|
119
|
+
LIMIT ?
|
|
120
|
+
`)
|
|
121
|
+
.all(piboSessionId, limit);
|
|
122
|
+
return rows.map((row) => {
|
|
123
|
+
const metadata = parseObject(row.metadata_json);
|
|
124
|
+
return {
|
|
125
|
+
id: row.id,
|
|
126
|
+
pi_session_id: row.pi_session_id,
|
|
127
|
+
channel: row.channel,
|
|
128
|
+
kind: row.kind,
|
|
129
|
+
profile: row.profile,
|
|
130
|
+
parent_id: row.parent_id,
|
|
131
|
+
subagentName: stringValue(metadata.subagentName),
|
|
132
|
+
subagentToolName: stringValue(metadata.subagentToolName),
|
|
133
|
+
threadKey: stringValue(metadata.threadKey),
|
|
134
|
+
chatRoomId: stringValue(metadata.chatRoomId),
|
|
135
|
+
created_at: row.created_at,
|
|
136
|
+
updated_at: row.updated_at,
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function readChatSession(db, piboSessionId) {
|
|
141
|
+
if (!tableExists(db, "web_chat_sessions"))
|
|
142
|
+
return undefined;
|
|
143
|
+
return db.prepare("SELECT * FROM web_chat_sessions WHERE pibo_session_id = ?").get(piboSessionId);
|
|
144
|
+
}
|
|
145
|
+
function readEventSummaries(db, piboSessionId, limit) {
|
|
146
|
+
if (!tableExists(db, "web_chat_events"))
|
|
147
|
+
return [];
|
|
148
|
+
return db
|
|
149
|
+
.prepare(`
|
|
150
|
+
SELECT type, event_id, created_at
|
|
151
|
+
FROM web_chat_events
|
|
152
|
+
WHERE pibo_session_id = ?
|
|
153
|
+
ORDER BY rowid DESC
|
|
154
|
+
LIMIT ?
|
|
155
|
+
`)
|
|
156
|
+
.all(piboSessionId, limit);
|
|
157
|
+
}
|
|
158
|
+
function tableExists(db, table) {
|
|
159
|
+
const row = db.prepare("SELECT name FROM sqlite_schema WHERE type = 'table' AND name = ?").get(table);
|
|
160
|
+
return row !== undefined;
|
|
161
|
+
}
|
|
162
|
+
function compactSessionRow(row) {
|
|
163
|
+
return {
|
|
164
|
+
id: row.id,
|
|
165
|
+
pi_session_id: row.pi_session_id,
|
|
166
|
+
channel: row.channel,
|
|
167
|
+
kind: row.kind,
|
|
168
|
+
profile: row.profile,
|
|
169
|
+
owner_scope: row.owner_scope,
|
|
170
|
+
parent_id: row.parent_id,
|
|
171
|
+
origin_id: row.origin_id,
|
|
172
|
+
workspace: row.workspace,
|
|
173
|
+
title: row.title,
|
|
174
|
+
created_at: row.created_at,
|
|
175
|
+
updated_at: row.updated_at,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function parseObject(value) {
|
|
179
|
+
if (!value)
|
|
180
|
+
return {};
|
|
181
|
+
try {
|
|
182
|
+
const parsed = JSON.parse(value);
|
|
183
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
184
|
+
return {};
|
|
185
|
+
return parsed;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return {};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function stringValue(value) {
|
|
192
|
+
return typeof value === "string" && value ? value : undefined;
|
|
193
|
+
}
|
|
194
|
+
function formatValue(value) {
|
|
195
|
+
if (value === null || value === undefined)
|
|
196
|
+
return "";
|
|
197
|
+
if (typeof value === "object")
|
|
198
|
+
return JSON.stringify(value);
|
|
199
|
+
return String(value);
|
|
200
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
const DEFAULT_QUERY_LIMIT = 50;
|
|
3
|
+
const MAX_QUERY_LIMIT = 1000;
|
|
4
|
+
const MUTATING_KEYWORDS = new Set([
|
|
5
|
+
"alter",
|
|
6
|
+
"attach",
|
|
7
|
+
"create",
|
|
8
|
+
"delete",
|
|
9
|
+
"detach",
|
|
10
|
+
"drop",
|
|
11
|
+
"insert",
|
|
12
|
+
"replace",
|
|
13
|
+
"update",
|
|
14
|
+
"vacuum",
|
|
15
|
+
]);
|
|
16
|
+
const READ_ONLY_PRAGMAS = new Set(["table_info", "index_list", "index_info"]);
|
|
17
|
+
export function normalizeLimit(value) {
|
|
18
|
+
const raw = value === undefined ? DEFAULT_QUERY_LIMIT : Number(value);
|
|
19
|
+
if (!Number.isInteger(raw) || raw < 1) {
|
|
20
|
+
throw new Error("Limit must be a positive integer");
|
|
21
|
+
}
|
|
22
|
+
return Math.min(raw, MAX_QUERY_LIMIT);
|
|
23
|
+
}
|
|
24
|
+
export function listTables(store) {
|
|
25
|
+
return withReadOnlyDatabase(store, (db) => db
|
|
26
|
+
.prepare("SELECT name FROM sqlite_schema WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")
|
|
27
|
+
.all().map((row) => row.name));
|
|
28
|
+
}
|
|
29
|
+
export function getStoreSchema(store) {
|
|
30
|
+
return withReadOnlyDatabase(store, (db) => {
|
|
31
|
+
const tables = listTablesFromDb(db);
|
|
32
|
+
return tables.map((table) => ({
|
|
33
|
+
name: table,
|
|
34
|
+
columns: db.prepare(`PRAGMA table_info(${quoteIdentifier(table)})`).all().map((column) => ({
|
|
35
|
+
name: column.name,
|
|
36
|
+
type: column.type,
|
|
37
|
+
notNull: column.notnull === 1,
|
|
38
|
+
primaryKey: column.pk > 0,
|
|
39
|
+
})),
|
|
40
|
+
indexes: db.prepare(`PRAGMA index_list(${quoteIdentifier(table)})`).all().map((index) => ({
|
|
41
|
+
name: index.name,
|
|
42
|
+
unique: index.unique === 1,
|
|
43
|
+
origin: index.origin,
|
|
44
|
+
partial: index.partial === 1,
|
|
45
|
+
})),
|
|
46
|
+
}));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function runReadOnlyQuery(store, sql, options = {}) {
|
|
50
|
+
const limit = normalizeLimit(options.limit);
|
|
51
|
+
const statement = validateReadOnlySql(sql);
|
|
52
|
+
return withReadOnlyDatabase(store, (db) => {
|
|
53
|
+
const hasLimit = hasToken(statement, "limit");
|
|
54
|
+
const isPragma = firstToken(statement) === "pragma";
|
|
55
|
+
const query = hasLimit || isPragma ? statement : `SELECT * FROM (${statement}) LIMIT ?`;
|
|
56
|
+
const params = hasLimit || isPragma ? [] : [limit + 1];
|
|
57
|
+
const rows = db.prepare(query).all(...params);
|
|
58
|
+
const limited = rows.length > limit;
|
|
59
|
+
return {
|
|
60
|
+
store: store.name,
|
|
61
|
+
path: store.path,
|
|
62
|
+
rows: rows.slice(0, limit),
|
|
63
|
+
limited,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function formatRows(rows, options = {}) {
|
|
68
|
+
if (rows.length === 0)
|
|
69
|
+
return "rows: 0";
|
|
70
|
+
const columns = Object.keys(rows[0] ?? {});
|
|
71
|
+
const lines = [columns.join("\t")];
|
|
72
|
+
for (const row of rows) {
|
|
73
|
+
lines.push(columns.map((column) => formatCell(row[column])).join("\t"));
|
|
74
|
+
}
|
|
75
|
+
lines.push(`rows: ${rows.length}${options.limited ? " (limited)" : ""}`);
|
|
76
|
+
return lines.join("\n");
|
|
77
|
+
}
|
|
78
|
+
export function formatJson(value) {
|
|
79
|
+
return JSON.stringify(value, null, 2);
|
|
80
|
+
}
|
|
81
|
+
export function openReadOnlyDebugDatabase(store) {
|
|
82
|
+
if (!store.exists) {
|
|
83
|
+
throw new Error(`Debug store "${store.name}" not found at ${store.defaultPath}`);
|
|
84
|
+
}
|
|
85
|
+
const db = new DatabaseSync(store.path, { readOnly: true });
|
|
86
|
+
db.exec("PRAGMA busy_timeout = 5000");
|
|
87
|
+
return db;
|
|
88
|
+
}
|
|
89
|
+
function withReadOnlyDatabase(store, action) {
|
|
90
|
+
const db = openReadOnlyDebugDatabase(store);
|
|
91
|
+
try {
|
|
92
|
+
return action(db);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
throw withStorePath(error, store);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
db.close();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function withStorePath(error, store) {
|
|
102
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
+
if (message.startsWith("Debug store "))
|
|
104
|
+
return error instanceof Error ? error : new Error(message);
|
|
105
|
+
if (!/database is locked/i.test(message))
|
|
106
|
+
return error instanceof Error ? error : new Error(message);
|
|
107
|
+
return new Error(`Debug store "${store.name}" at ${store.path} is locked: ${message}`);
|
|
108
|
+
}
|
|
109
|
+
function listTablesFromDb(db) {
|
|
110
|
+
return db
|
|
111
|
+
.prepare("SELECT name FROM sqlite_schema WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")
|
|
112
|
+
.all().map((row) => row.name);
|
|
113
|
+
}
|
|
114
|
+
function validateReadOnlySql(sql) {
|
|
115
|
+
const statement = normalizeSingleStatement(sql);
|
|
116
|
+
const token = firstToken(statement);
|
|
117
|
+
if (token === "pragma") {
|
|
118
|
+
const match = /^pragma\s+([a-z_][a-z0-9_]*)\s*\(/i.exec(statement);
|
|
119
|
+
if (!match || !READ_ONLY_PRAGMAS.has(match[1].toLowerCase())) {
|
|
120
|
+
throw new Error("Only read-only PRAGMA table_info(...), index_list(...), and index_info(...) are allowed");
|
|
121
|
+
}
|
|
122
|
+
return statement;
|
|
123
|
+
}
|
|
124
|
+
const tokens = readSqlTokens(statement);
|
|
125
|
+
for (const item of tokens) {
|
|
126
|
+
if (MUTATING_KEYWORDS.has(item)) {
|
|
127
|
+
throw new Error(`Mutating SQL is not allowed: ${item}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (token === "select")
|
|
131
|
+
return statement;
|
|
132
|
+
if (token === "with" && tokens.includes("select"))
|
|
133
|
+
return statement;
|
|
134
|
+
throw new Error("Only SELECT, WITH ... SELECT, and read-only PRAGMA statements are allowed");
|
|
135
|
+
}
|
|
136
|
+
function normalizeSingleStatement(sql) {
|
|
137
|
+
let statement = sql.trim();
|
|
138
|
+
if (!statement)
|
|
139
|
+
throw new Error("SQL query is required");
|
|
140
|
+
if (statement.endsWith(";"))
|
|
141
|
+
statement = statement.slice(0, -1).trim();
|
|
142
|
+
if (containsSemicolon(statement)) {
|
|
143
|
+
throw new Error("Only one SQL statement is allowed");
|
|
144
|
+
}
|
|
145
|
+
return statement;
|
|
146
|
+
}
|
|
147
|
+
function firstToken(sql) {
|
|
148
|
+
return readSqlTokens(sql)[0] ?? "";
|
|
149
|
+
}
|
|
150
|
+
function hasToken(sql, token) {
|
|
151
|
+
return readSqlTokens(sql).includes(token);
|
|
152
|
+
}
|
|
153
|
+
function readSqlTokens(sql) {
|
|
154
|
+
const tokens = [];
|
|
155
|
+
let quote = null;
|
|
156
|
+
let current = "";
|
|
157
|
+
for (let index = 0; index < sql.length; index += 1) {
|
|
158
|
+
const char = sql[index];
|
|
159
|
+
const next = sql[index + 1];
|
|
160
|
+
if (quote) {
|
|
161
|
+
if (char === quote) {
|
|
162
|
+
if (next === quote) {
|
|
163
|
+
index += 1;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
quote = null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (char === "-" && next === "-") {
|
|
172
|
+
index += 2;
|
|
173
|
+
while (index < sql.length && sql[index] !== "\n")
|
|
174
|
+
index += 1;
|
|
175
|
+
flushToken();
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (char === "/" && next === "*") {
|
|
179
|
+
index += 2;
|
|
180
|
+
while (index < sql.length && !(sql[index] === "*" && sql[index + 1] === "/"))
|
|
181
|
+
index += 1;
|
|
182
|
+
index += 1;
|
|
183
|
+
flushToken();
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (char === "'" || char === '"' || char === "`") {
|
|
187
|
+
flushToken();
|
|
188
|
+
quote = char;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (/[A-Za-z0-9_]/.test(char)) {
|
|
192
|
+
current += char.toLowerCase();
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
flushToken();
|
|
196
|
+
}
|
|
197
|
+
flushToken();
|
|
198
|
+
return tokens;
|
|
199
|
+
function flushToken() {
|
|
200
|
+
if (!current)
|
|
201
|
+
return;
|
|
202
|
+
tokens.push(current);
|
|
203
|
+
current = "";
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function containsSemicolon(sql) {
|
|
207
|
+
let quote = null;
|
|
208
|
+
for (let index = 0; index < sql.length; index += 1) {
|
|
209
|
+
const char = sql[index];
|
|
210
|
+
const next = sql[index + 1];
|
|
211
|
+
if (quote) {
|
|
212
|
+
if (char === quote) {
|
|
213
|
+
if (next === quote)
|
|
214
|
+
index += 1;
|
|
215
|
+
else
|
|
216
|
+
quote = null;
|
|
217
|
+
}
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (char === "'" || char === '"' || char === "`") {
|
|
221
|
+
quote = char;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (char === ";")
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
function quoteIdentifier(value) {
|
|
230
|
+
return `"${value.replaceAll('"', '""')}"`;
|
|
231
|
+
}
|
|
232
|
+
function formatCell(value) {
|
|
233
|
+
if (value === null || value === undefined)
|
|
234
|
+
return "";
|
|
235
|
+
if (typeof value === "object")
|
|
236
|
+
return JSON.stringify(value);
|
|
237
|
+
return String(value).replaceAll("\n", "\\n");
|
|
238
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
export const PIBO_DEBUG_STORES = [
|
|
4
|
+
{
|
|
5
|
+
name: "sessions",
|
|
6
|
+
description: "canonical Pibo Session metadata",
|
|
7
|
+
defaultPath: ".pibo/pibo-sessions.sqlite",
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: "chat",
|
|
11
|
+
description: "Chat Web read model, rooms, and durable chat events",
|
|
12
|
+
defaultPath: ".pibo/web-chat.sqlite",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "agents",
|
|
16
|
+
description: "custom Agent Designer profiles",
|
|
17
|
+
defaultPath: ".pibo/chat-agents.sqlite",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "auth",
|
|
21
|
+
description: "Better Auth local auth data",
|
|
22
|
+
defaultPath: ".pibo/auth.sqlite",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "bindings",
|
|
26
|
+
description: "local session binding data",
|
|
27
|
+
defaultPath: ".pibo/session-bindings.sqlite",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "reliability",
|
|
31
|
+
description: "Pibo event stream, durable jobs, and yielded runs",
|
|
32
|
+
defaultPath: ".pibo/pibo-events.sqlite",
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
export function resolveDebugStores(cwd = process.cwd()) {
|
|
36
|
+
return PIBO_DEBUG_STORES.map((store) => resolveDebugStore(store.name, cwd));
|
|
37
|
+
}
|
|
38
|
+
export function resolveDebugStore(name, cwd = process.cwd()) {
|
|
39
|
+
const store = PIBO_DEBUG_STORES.find((item) => item.name === name);
|
|
40
|
+
if (!store) {
|
|
41
|
+
throw new Error(`Unknown debug store "${name}". Use one of: ${PIBO_DEBUG_STORES.map((item) => item.name).join(", ")}`);
|
|
42
|
+
}
|
|
43
|
+
const path = resolve(cwd, store.defaultPath);
|
|
44
|
+
return {
|
|
45
|
+
...store,
|
|
46
|
+
path,
|
|
47
|
+
exists: existsSync(path),
|
|
48
|
+
};
|
|
49
|
+
}
|