@bryanhu/codexly 0.1.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/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/README.zh-CN.md +87 -0
- package/dist/chunk-3OBVX5TN.js +15 -0
- package/dist/chunk-42AR5IS7.js +12543 -0
- package/dist/chunk-K63YBMTG.js +61287 -0
- package/dist/chunk-K6J42667.js +43 -0
- package/dist/chunk-MH54VCZJ.js +5224 -0
- package/dist/chunk-TEPSAXZZ.js +3360 -0
- package/dist/cli.js +889 -0
- package/dist/client/index.js +1010 -0
- package/dist/codex-jsonl-frame-worker.js +120 -0
- package/dist/core/index.js +5 -0
- package/dist/dist-NGSIFQU5.js +252 -0
- package/dist/protocol/index.js +5 -0
- package/dist/providers/codex/index.js +7 -0
- package/dist/server/index.js +9 -0
- package/dist/sqlite-state-worker.js +661 -0
- package/dist/web/.vite/manifest.json +829 -0
- package/dist/web/.vite/manifest.json.br +0 -0
- package/dist/web/.vite/manifest.json.gz +0 -0
- package/dist/web/assets/bash-BiGZg9Om.js +1 -0
- package/dist/web/assets/bash-BiGZg9Om.js.br +0 -0
- package/dist/web/assets/bash-BiGZg9Om.js.gz +0 -0
- package/dist/web/assets/bundle-mjs-rHxsej31.js +1 -0
- package/dist/web/assets/bundle-mjs-rHxsej31.js.br +0 -0
- package/dist/web/assets/bundle-mjs-rHxsej31.js.gz +0 -0
- package/dist/web/assets/button-CG0GNEOD.js +1 -0
- package/dist/web/assets/button-CG0GNEOD.js.br +0 -0
- package/dist/web/assets/button-CG0GNEOD.js.gz +0 -0
- package/dist/web/assets/button-group-D2LfHIjt.js +1 -0
- package/dist/web/assets/button-group-D2LfHIjt.js.br +0 -0
- package/dist/web/assets/button-group-D2LfHIjt.js.gz +0 -0
- package/dist/web/assets/c-DWGmR78Y.js +1 -0
- package/dist/web/assets/c-DWGmR78Y.js.br +1 -0
- package/dist/web/assets/c-DWGmR78Y.js.gz +0 -0
- package/dist/web/assets/c-SSSlmE39.js +1 -0
- package/dist/web/assets/c-SSSlmE39.js.br +0 -0
- package/dist/web/assets/c-SSSlmE39.js.gz +0 -0
- package/dist/web/assets/checkbox-Bvl7MRXT.js +1 -0
- package/dist/web/assets/checkbox-Bvl7MRXT.js.br +0 -0
- package/dist/web/assets/checkbox-Bvl7MRXT.js.gz +0 -0
- package/dist/web/assets/chunk-BO2N2NFS-C72FSBge.js +131 -0
- package/dist/web/assets/chunk-BO2N2NFS-C72FSBge.js.br +0 -0
- package/dist/web/assets/chunk-BO2N2NFS-C72FSBge.js.gz +0 -0
- package/dist/web/assets/code-highlighter-Cm0xdvAd.js +1 -0
- package/dist/web/assets/code-highlighter-Cm0xdvAd.js.br +0 -0
- package/dist/web/assets/code-highlighter-Cm0xdvAd.js.gz +0 -0
- package/dist/web/assets/code-languages-CfwYbccP.js +2 -0
- package/dist/web/assets/code-languages-CfwYbccP.js.br +0 -0
- package/dist/web/assets/code-languages-CfwYbccP.js.gz +0 -0
- package/dist/web/assets/cpp-BcHBJY00.js +1 -0
- package/dist/web/assets/cpp-BcHBJY00.js.br +0 -0
- package/dist/web/assets/cpp-BcHBJY00.js.gz +0 -0
- package/dist/web/assets/cpp-CIkEvbIe.js +1 -0
- package/dist/web/assets/cpp-CIkEvbIe.js.br +0 -0
- package/dist/web/assets/cpp-CIkEvbIe.js.gz +0 -0
- package/dist/web/assets/csharp-oqKa8noW.js +1 -0
- package/dist/web/assets/csharp-oqKa8noW.js.br +0 -0
- package/dist/web/assets/csharp-oqKa8noW.js.gz +0 -0
- package/dist/web/assets/css-CdtkT07m.js +1 -0
- package/dist/web/assets/css-CdtkT07m.js.br +1 -0
- package/dist/web/assets/css-CdtkT07m.js.gz +0 -0
- package/dist/web/assets/css-LbU1hoFO.js +1 -0
- package/dist/web/assets/css-LbU1hoFO.js.br +0 -0
- package/dist/web/assets/css-LbU1hoFO.js.gz +0 -0
- package/dist/web/assets/diff-woXpYk--.js +1 -0
- package/dist/web/assets/diff-woXpYk--.js.br +0 -0
- package/dist/web/assets/diff-woXpYk--.js.gz +0 -0
- package/dist/web/assets/dockerfile-IyjqRm3v.js +1 -0
- package/dist/web/assets/dockerfile-IyjqRm3v.js.br +0 -0
- package/dist/web/assets/dockerfile-IyjqRm3v.js.gz +0 -0
- package/dist/web/assets/dotenv-_5a1GRtc.js +1 -0
- package/dist/web/assets/dotenv-_5a1GRtc.js.br +0 -0
- package/dist/web/assets/dotenv-_5a1GRtc.js.gz +0 -0
- package/dist/web/assets/engine-compile-DQ0HPfe0.js +152 -0
- package/dist/web/assets/engine-compile-DQ0HPfe0.js.br +0 -0
- package/dist/web/assets/engine-compile-DQ0HPfe0.js.gz +0 -0
- package/dist/web/assets/es2015-CIXyxC_2.js +41 -0
- package/dist/web/assets/es2015-CIXyxC_2.js.br +0 -0
- package/dist/web/assets/es2015-CIXyxC_2.js.gz +0 -0
- package/dist/web/assets/file-CEs2ZXvf.js +1 -0
- package/dist/web/assets/file-CEs2ZXvf.js.br +0 -0
- package/dist/web/assets/file-CEs2ZXvf.js.gz +0 -0
- package/dist/web/assets/file-change-D7aZLgtG.js +4 -0
- package/dist/web/assets/file-change-D7aZLgtG.js.br +0 -0
- package/dist/web/assets/file-change-D7aZLgtG.js.gz +0 -0
- package/dist/web/assets/file-review-dialog-CTL5FpHU.js +2 -0
- package/dist/web/assets/file-review-dialog-CTL5FpHU.js.br +0 -0
- package/dist/web/assets/file-review-dialog-CTL5FpHU.js.gz +0 -0
- package/dist/web/assets/file-tree-DRpR7Mu2.js +1 -0
- package/dist/web/assets/file-tree-DRpR7Mu2.js.br +0 -0
- package/dist/web/assets/file-tree-DRpR7Mu2.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-CQWH7rsr.js +1 -0
- package/dist/web/assets/git-commit-horizontal-CQWH7rsr.js.br +0 -0
- package/dist/web/assets/git-commit-horizontal-CQWH7rsr.js.gz +0 -0
- package/dist/web/assets/git-history-panel-BsIopLeA.js +2 -0
- package/dist/web/assets/git-history-panel-BsIopLeA.js.br +0 -0
- package/dist/web/assets/git-history-panel-BsIopLeA.js.gz +0 -0
- package/dist/web/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/web/assets/github-dark-C-LZuMrd.js.br +0 -0
- package/dist/web/assets/github-dark-C-LZuMrd.js.gz +0 -0
- package/dist/web/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/web/assets/github-light-EUqPIrTm.js.br +0 -0
- package/dist/web/assets/github-light-EUqPIrTm.js.gz +0 -0
- package/dist/web/assets/global-settings-dialog-CJA_j2dA.js +1 -0
- package/dist/web/assets/global-settings-dialog-CJA_j2dA.js.br +0 -0
- package/dist/web/assets/global-settings-dialog-CJA_j2dA.js.gz +0 -0
- package/dist/web/assets/go-rLFTqkRN.js +1 -0
- package/dist/web/assets/go-rLFTqkRN.js.br +0 -0
- package/dist/web/assets/go-rLFTqkRN.js.gz +0 -0
- package/dist/web/assets/grammar-cpp-support-CV8oNpIY.js +1 -0
- package/dist/web/assets/grammar-cpp-support-CV8oNpIY.js.br +0 -0
- package/dist/web/assets/grammar-cpp-support-CV8oNpIY.js.gz +0 -0
- package/dist/web/assets/graphql-D5qRqMLb.js +1 -0
- package/dist/web/assets/graphql-D5qRqMLb.js.br +0 -0
- package/dist/web/assets/graphql-D5qRqMLb.js.gz +0 -0
- package/dist/web/assets/graphql-f69H1Mm0.js +1 -0
- package/dist/web/assets/graphql-f69H1Mm0.js.br +0 -0
- package/dist/web/assets/graphql-f69H1Mm0.js.gz +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-NQRGdW--.js +1 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-NQRGdW--.js.br +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-NQRGdW--.js.gz +0 -0
- package/dist/web/assets/html-BcACZWSP.js +1 -0
- package/dist/web/assets/html-BcACZWSP.js.br +0 -0
- package/dist/web/assets/html-BcACZWSP.js.gz +0 -0
- package/dist/web/assets/html-DDNsd9lV.js +1 -0
- package/dist/web/assets/html-DDNsd9lV.js.br +0 -0
- package/dist/web/assets/html-DDNsd9lV.js.gz +0 -0
- package/dist/web/assets/index-B3NtDmQp.css +2 -0
- package/dist/web/assets/index-B3NtDmQp.css.br +0 -0
- package/dist/web/assets/index-B3NtDmQp.css.gz +0 -0
- package/dist/web/assets/index-C_O4z_mI.js +4 -0
- package/dist/web/assets/index-C_O4z_mI.js.br +0 -0
- package/dist/web/assets/index-C_O4z_mI.js.gz +0 -0
- package/dist/web/assets/ini-B5eOa1yu.js +1 -0
- package/dist/web/assets/ini-B5eOa1yu.js.br +5 -0
- package/dist/web/assets/ini-B5eOa1yu.js.gz +0 -0
- package/dist/web/assets/java-BtIQNnN0.js +1 -0
- package/dist/web/assets/java-BtIQNnN0.js.br +0 -0
- package/dist/web/assets/java-BtIQNnN0.js.gz +0 -0
- package/dist/web/assets/java-DxlWrXwe.js +1 -0
- package/dist/web/assets/java-DxlWrXwe.js.br +1 -0
- package/dist/web/assets/java-DxlWrXwe.js.gz +0 -0
- package/dist/web/assets/javascript-BzbQS41l.js +1 -0
- package/dist/web/assets/javascript-BzbQS41l.js.br +0 -0
- package/dist/web/assets/javascript-BzbQS41l.js.gz +0 -0
- package/dist/web/assets/javascript-Yelw-5ZN.js +1 -0
- package/dist/web/assets/javascript-Yelw-5ZN.js.br +0 -0
- package/dist/web/assets/javascript-Yelw-5ZN.js.gz +0 -0
- package/dist/web/assets/json-B88Oqtu5.js +1 -0
- package/dist/web/assets/json-B88Oqtu5.js.br +0 -0
- package/dist/web/assets/json-B88Oqtu5.js.gz +0 -0
- package/dist/web/assets/json-CaljABEy.js +1 -0
- package/dist/web/assets/json-CaljABEy.js.br +1 -0
- package/dist/web/assets/json-CaljABEy.js.gz +0 -0
- package/dist/web/assets/json5-BR5RXkoi.js +1 -0
- package/dist/web/assets/json5-BR5RXkoi.js.br +0 -0
- package/dist/web/assets/json5-BR5RXkoi.js.gz +0 -0
- package/dist/web/assets/jsonc-CYpm1nAK.js +1 -0
- package/dist/web/assets/jsonc-CYpm1nAK.js.br +0 -0
- package/dist/web/assets/jsonc-CYpm1nAK.js.gz +0 -0
- package/dist/web/assets/jsx-D3KKoC5L.js +1 -0
- package/dist/web/assets/jsx-D3KKoC5L.js.br +0 -0
- package/dist/web/assets/jsx-D3KKoC5L.js.gz +0 -0
- package/dist/web/assets/jsx-hEbJ82HF.js +1 -0
- package/dist/web/assets/jsx-hEbJ82HF.js.br +1 -0
- package/dist/web/assets/jsx-hEbJ82HF.js.gz +0 -0
- package/dist/web/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/web/assets/kotlin-DhhofPvG.js.br +0 -0
- package/dist/web/assets/kotlin-DhhofPvG.js.gz +0 -0
- package/dist/web/assets/lazy-message-response-Cy_8wxLM.js +2 -0
- package/dist/web/assets/lazy-message-response-Cy_8wxLM.js.br +0 -0
- package/dist/web/assets/lazy-message-response-Cy_8wxLM.js.gz +0 -0
- package/dist/web/assets/lib-DrPFkMXk.js +1 -0
- package/dist/web/assets/lib-DrPFkMXk.js.br +0 -0
- package/dist/web/assets/lib-DrPFkMXk.js.gz +0 -0
- package/dist/web/assets/lua-BJObVtAx.js +1 -0
- package/dist/web/assets/lua-BJObVtAx.js.br +0 -0
- package/dist/web/assets/lua-BJObVtAx.js.gz +0 -0
- package/dist/web/assets/lua-DjuecEsk.js +1 -0
- package/dist/web/assets/lua-DjuecEsk.js.br +0 -0
- package/dist/web/assets/lua-DjuecEsk.js.gz +0 -0
- package/dist/web/assets/makefile-Dixweg8N.js +1 -0
- package/dist/web/assets/makefile-Dixweg8N.js.br +0 -0
- package/dist/web/assets/makefile-Dixweg8N.js.gz +0 -0
- package/dist/web/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/web/assets/markdown-BYOwaDjH.js.br +0 -0
- package/dist/web/assets/markdown-BYOwaDjH.js.gz +0 -0
- package/dist/web/assets/mdx-DQZ5AkYe.js +1 -0
- package/dist/web/assets/mdx-DQZ5AkYe.js.br +0 -0
- package/dist/web/assets/mdx-DQZ5AkYe.js.gz +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-D0CV54MY.js +1 -0
- package/dist/web/assets/mermaid-GHXKKRXX-D0CV54MY.js.br +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-D0CV54MY.js.gz +0 -0
- package/dist/web/assets/message-response-CBOOkYPm.js +7 -0
- package/dist/web/assets/message-response-CBOOkYPm.js.br +0 -0
- package/dist/web/assets/message-response-CBOOkYPm.js.gz +0 -0
- package/dist/web/assets/patch-diff-viewer-BHcdOhhw.js +1409 -0
- package/dist/web/assets/patch-diff-viewer-BHcdOhhw.js.br +0 -0
- package/dist/web/assets/patch-diff-viewer-BHcdOhhw.js.gz +0 -0
- package/dist/web/assets/perl-Br95gH8g.js +1 -0
- package/dist/web/assets/perl-Br95gH8g.js.br +0 -0
- package/dist/web/assets/perl-Br95gH8g.js.gz +0 -0
- package/dist/web/assets/php-CYrBA5iX.js +1 -0
- package/dist/web/assets/php-CYrBA5iX.js.br +0 -0
- package/dist/web/assets/php-CYrBA5iX.js.gz +0 -0
- package/dist/web/assets/prompt-input-controls-CrypM5HZ.js +1 -0
- package/dist/web/assets/prompt-input-controls-CrypM5HZ.js.br +0 -0
- package/dist/web/assets/prompt-input-controls-CrypM5HZ.js.gz +0 -0
- package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js +1 -0
- package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.br +0 -0
- package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.gz +0 -0
- package/dist/web/assets/provider-connection-queries-C40YvSEy.js +1 -0
- package/dist/web/assets/provider-connection-queries-C40YvSEy.js.br +0 -0
- package/dist/web/assets/provider-connection-queries-C40YvSEy.js.gz +0 -0
- package/dist/web/assets/python-gzcpVVnB.js +1 -0
- package/dist/web/assets/python-gzcpVVnB.js.br +0 -0
- package/dist/web/assets/python-gzcpVVnB.js.gz +0 -0
- package/dist/web/assets/react-runtime-CVaUQXZF.js +9 -0
- package/dist/web/assets/react-runtime-CVaUQXZF.js.br +0 -0
- package/dist/web/assets/react-runtime-CVaUQXZF.js.gz +0 -0
- package/dist/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/dist/web/assets/rolldown-runtime-QTnfLwEv.js.br +0 -0
- package/dist/web/assets/rolldown-runtime-QTnfLwEv.js.gz +0 -0
- package/dist/web/assets/ruby-CbXu8Ywv.js +1 -0
- package/dist/web/assets/ruby-CbXu8Ywv.js.br +0 -0
- package/dist/web/assets/ruby-CbXu8Ywv.js.gz +0 -0
- package/dist/web/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/web/assets/rust-Cfkwpbl8.js.br +0 -0
- package/dist/web/assets/rust-Cfkwpbl8.js.gz +0 -0
- package/dist/web/assets/scss-DHtrkMkT.js +1 -0
- package/dist/web/assets/scss-DHtrkMkT.js.br +0 -0
- package/dist/web/assets/scss-DHtrkMkT.js.gz +0 -0
- package/dist/web/assets/shellscript-BiGZg9Om.js +1 -0
- package/dist/web/assets/shellscript-BiGZg9Om.js.br +0 -0
- package/dist/web/assets/shellscript-BiGZg9Om.js.gz +0 -0
- package/dist/web/assets/shellscript-CqHdAlCp.js +1 -0
- package/dist/web/assets/shellscript-CqHdAlCp.js.br +0 -0
- package/dist/web/assets/shellscript-CqHdAlCp.js.gz +0 -0
- package/dist/web/assets/shiki-bundle-DzEBOJSk.js +1 -0
- package/dist/web/assets/shiki-bundle-DzEBOJSk.js.br +0 -0
- package/dist/web/assets/shiki-bundle-DzEBOJSk.js.gz +0 -0
- package/dist/web/assets/sql-0Qcw9ht3.js +1 -0
- package/dist/web/assets/sql-0Qcw9ht3.js.br +0 -0
- package/dist/web/assets/sql-0Qcw9ht3.js.gz +0 -0
- package/dist/web/assets/sql-CP0rg-5b.js +1 -0
- package/dist/web/assets/sql-CP0rg-5b.js.br +0 -0
- package/dist/web/assets/sql-CP0rg-5b.js.gz +0 -0
- package/dist/web/assets/svelte-BUVJxsYv.js +1 -0
- package/dist/web/assets/svelte-BUVJxsYv.js.br +0 -0
- package/dist/web/assets/svelte-BUVJxsYv.js.gz +0 -0
- package/dist/web/assets/swift-DonLKvLd.js +1 -0
- package/dist/web/assets/swift-DonLKvLd.js.br +0 -0
- package/dist/web/assets/swift-DonLKvLd.js.gz +0 -0
- package/dist/web/assets/toml-CcmNWLt0.js +1 -0
- package/dist/web/assets/toml-CcmNWLt0.js.br +0 -0
- package/dist/web/assets/toml-CcmNWLt0.js.gz +0 -0
- package/dist/web/assets/tsx-5f3ulCja.js +1 -0
- package/dist/web/assets/tsx-5f3ulCja.js.br +0 -0
- package/dist/web/assets/tsx-5f3ulCja.js.gz +0 -0
- package/dist/web/assets/tsx-BOvsFOI6.js +1 -0
- package/dist/web/assets/tsx-BOvsFOI6.js.br +0 -0
- package/dist/web/assets/tsx-BOvsFOI6.js.gz +0 -0
- package/dist/web/assets/typescript-Utq2Cl8c.js +1 -0
- package/dist/web/assets/typescript-Utq2Cl8c.js.br +0 -0
- package/dist/web/assets/typescript-Utq2Cl8c.js.gz +0 -0
- package/dist/web/assets/typescript-j_1H8WHN.js +1 -0
- package/dist/web/assets/typescript-j_1H8WHN.js.br +0 -0
- package/dist/web/assets/typescript-j_1H8WHN.js.gz +0 -0
- package/dist/web/assets/vue-BpAUjojh.js +1 -0
- package/dist/web/assets/vue-BpAUjojh.js.br +0 -0
- package/dist/web/assets/vue-BpAUjojh.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-RHaBVG45.js +1 -0
- package/dist/web/assets/workbench-inspector-changes-RHaBVG45.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-RHaBVG45.js.gz +0 -0
- package/dist/web/assets/workbench-shell--6Y1cx2L.js +12 -0
- package/dist/web/assets/workbench-shell--6Y1cx2L.js.br +0 -0
- package/dist/web/assets/workbench-shell--6Y1cx2L.js.gz +0 -0
- package/dist/web/assets/xml-CoDIzWF0.js +1 -0
- package/dist/web/assets/xml-CoDIzWF0.js.br +0 -0
- package/dist/web/assets/xml-CoDIzWF0.js.gz +0 -0
- package/dist/web/assets/xml-WY0zc4PG.js +1 -0
- package/dist/web/assets/xml-WY0zc4PG.js.br +0 -0
- package/dist/web/assets/xml-WY0zc4PG.js.gz +0 -0
- package/dist/web/assets/yaml-CxbubiML.js +1 -0
- package/dist/web/assets/yaml-CxbubiML.js.br +0 -0
- package/dist/web/assets/yaml-CxbubiML.js.gz +0 -0
- package/dist/web/assets/yaml-DijMHRDA.js +1 -0
- package/dist/web/assets/yaml-DijMHRDA.js.br +0 -0
- package/dist/web/assets/yaml-DijMHRDA.js.gz +0 -0
- package/dist/web/brand/codexly-logo.svg +34 -0
- package/dist/web/brand/codexly-logo.svg.br +0 -0
- package/dist/web/brand/codexly-logo.svg.gz +0 -0
- package/dist/web/brand/codexly-mark.svg +21 -0
- package/dist/web/brand/codexly-mark.svg.br +0 -0
- package/dist/web/brand/codexly-mark.svg.gz +0 -0
- package/dist/web/favicon.svg +20 -0
- package/dist/web/favicon.svg.br +0 -0
- package/dist/web/favicon.svg.gz +0 -0
- package/dist/web/index.html +25 -0
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/package.json +85 -0
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import './chunk-K6J42667.js';
|
|
3
|
+
import { mkdirSync } from 'fs';
|
|
4
|
+
import { resolve } from 'path';
|
|
5
|
+
import { workerData, parentPort } from 'worker_threads';
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
|
|
8
|
+
createRequire(import.meta.url);
|
|
9
|
+
|
|
10
|
+
// packages/server/src/approval-policy-persistence.js
|
|
11
|
+
var GRANULAR_FIELDS = [
|
|
12
|
+
"mcp_elicitations",
|
|
13
|
+
"request_permissions",
|
|
14
|
+
"rules",
|
|
15
|
+
"sandbox_approval",
|
|
16
|
+
"skill_approval"
|
|
17
|
+
];
|
|
18
|
+
function parseGranularApprovalPolicy(value) {
|
|
19
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
20
|
+
throw new Error("Stored approval policy is invalid");
|
|
21
|
+
}
|
|
22
|
+
const outerKeys = Object.keys(value);
|
|
23
|
+
const granular = value.granular;
|
|
24
|
+
if (outerKeys.length !== 1 || outerKeys[0] !== "granular" || typeof granular !== "object" || granular === null || Array.isArray(granular) || Object.keys(granular).length !== GRANULAR_FIELDS.length || GRANULAR_FIELDS.some((field) => typeof granular[field] !== "boolean")) {
|
|
25
|
+
throw new Error("Stored granular approval policy is invalid");
|
|
26
|
+
}
|
|
27
|
+
return { granular: Object.fromEntries(GRANULAR_FIELDS.map((field) => [field, granular[field]])) };
|
|
28
|
+
}
|
|
29
|
+
function deserializeApprovalPolicy(serialized, scope) {
|
|
30
|
+
if (serialized === "on-request" || serialized === "never") {
|
|
31
|
+
return serialized;
|
|
32
|
+
}
|
|
33
|
+
if (scope === "turn" && serialized === "untrusted") {
|
|
34
|
+
return serialized;
|
|
35
|
+
}
|
|
36
|
+
if (typeof serialized !== "string" || !serialized.startsWith("{")) {
|
|
37
|
+
throw new Error(`Stored ${scope} approval policy is invalid`);
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
return parseGranularApprovalPolicy(JSON.parse(serialized));
|
|
41
|
+
} catch (error) {
|
|
42
|
+
if (error instanceof SyntaxError) {
|
|
43
|
+
throw new Error(`Stored ${scope} approval policy JSON is invalid`, { cause: error });
|
|
44
|
+
}
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function serializeApprovalPolicy(policy) {
|
|
49
|
+
return typeof policy === "string" ? policy : JSON.stringify(parseGranularApprovalPolicy(policy));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// packages/server/src/sqlite-state-worker-bootstrap.js
|
|
53
|
+
function projectFromRows(row, rootRows) {
|
|
54
|
+
if (row === void 0) {
|
|
55
|
+
return void 0;
|
|
56
|
+
}
|
|
57
|
+
const roots = rootRows.map((root) => ({ id: root.root_id, path: root.path }));
|
|
58
|
+
if (roots.length === 0) {
|
|
59
|
+
throw new Error(`Project ${row.id} has no stored roots`);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
createdAt: row.created_at,
|
|
63
|
+
id: row.id,
|
|
64
|
+
name: row.name,
|
|
65
|
+
roots
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function projectsFromRows(projectRows, rootRows) {
|
|
69
|
+
const rootsByProject = /* @__PURE__ */ new Map();
|
|
70
|
+
for (const root of rootRows) {
|
|
71
|
+
const roots = rootsByProject.get(root.project_id) ?? [];
|
|
72
|
+
roots.push(root);
|
|
73
|
+
rootsByProject.set(root.project_id, roots);
|
|
74
|
+
}
|
|
75
|
+
return projectRows.map(
|
|
76
|
+
(project) => projectFromRows(project, rootsByProject.get(project.id) ?? [])
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
function projectDefaultsFromRow(row) {
|
|
80
|
+
if (row === void 0) {
|
|
81
|
+
return void 0;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
approvalPolicy: deserializeApprovalPolicy(row.approval_policy, "turn"),
|
|
85
|
+
approvalsReviewer: row.approvals_reviewer,
|
|
86
|
+
fastMode: row.fast_mode === 1,
|
|
87
|
+
model: row.model,
|
|
88
|
+
reasoningEffort: row.reasoning_effort,
|
|
89
|
+
sandboxMode: row.sandbox_mode
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function taskSettingsFromRow(row) {
|
|
93
|
+
if (row === void 0) {
|
|
94
|
+
return void 0;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
approvalPolicy: deserializeApprovalPolicy(row.approval_policy, "turn"),
|
|
98
|
+
approvalsReviewer: row.approvals_reviewer,
|
|
99
|
+
model: row.model,
|
|
100
|
+
reasoningEffort: row.reasoning_effort,
|
|
101
|
+
sandboxMode: row.sandbox_mode
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function globalSettingsFromRow(row) {
|
|
105
|
+
if (row === void 0) {
|
|
106
|
+
return void 0;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
approvalPolicy: deserializeApprovalPolicy(row.approval_policy, "global"),
|
|
110
|
+
approvalsReviewer: row.approvals_reviewer,
|
|
111
|
+
commitMessageModel: row.commit_message_model,
|
|
112
|
+
commitMessagePrompt: row.commit_message_prompt,
|
|
113
|
+
defaultOpenAppId: row.default_open_app_id,
|
|
114
|
+
fastMode: row.fast_mode === 1,
|
|
115
|
+
followUpBehavior: row.follow_up_behavior,
|
|
116
|
+
model: row.model,
|
|
117
|
+
reasoningEffort: row.reasoning_effort,
|
|
118
|
+
sandboxMode: row.sandbox_mode
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function providerConnectionFromRow(row) {
|
|
122
|
+
if (row === void 0) {
|
|
123
|
+
return void 0;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
customBaseUrl: row.custom_base_url,
|
|
127
|
+
customModelsJson: row.custom_models_json,
|
|
128
|
+
mode: row.mode,
|
|
129
|
+
updatedAt: row.updated_at
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function hasTable(database2, tableName) {
|
|
133
|
+
return database2.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(tableName) !== void 0;
|
|
134
|
+
}
|
|
135
|
+
function configureDatabase(database2) {
|
|
136
|
+
database2.pragma("journal_mode = WAL");
|
|
137
|
+
database2.pragma("foreign_keys = ON");
|
|
138
|
+
database2.pragma("synchronous = NORMAL");
|
|
139
|
+
database2.pragma("busy_timeout = 5000");
|
|
140
|
+
}
|
|
141
|
+
function readMigrationVersion(database2) {
|
|
142
|
+
if (!hasTable(database2, "schema_migrations")) {
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
return database2.prepare("SELECT COALESCE(MAX(version), 0) AS version FROM schema_migrations").get().version;
|
|
146
|
+
}
|
|
147
|
+
function runMigrations(database2, migrations, onMigrationApplied = () => {
|
|
148
|
+
}) {
|
|
149
|
+
database2.exec(`
|
|
150
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
151
|
+
version INTEGER PRIMARY KEY,
|
|
152
|
+
name TEXT NOT NULL,
|
|
153
|
+
applied_at TEXT NOT NULL
|
|
154
|
+
) STRICT;
|
|
155
|
+
`);
|
|
156
|
+
const applied = new Set(
|
|
157
|
+
database2.prepare("SELECT version FROM schema_migrations").all().map((row) => row.version)
|
|
158
|
+
);
|
|
159
|
+
let previousVersion = 0;
|
|
160
|
+
for (const migration of migrations) {
|
|
161
|
+
if (!Number.isInteger(migration.version) || migration.version <= previousVersion || typeof migration.name !== "string" || typeof migration.sql !== "string") {
|
|
162
|
+
throw new Error("Invalid SQLite migration definition");
|
|
163
|
+
}
|
|
164
|
+
previousVersion = migration.version;
|
|
165
|
+
if (applied.has(migration.version)) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
database2.transaction(() => {
|
|
169
|
+
database2.exec(migration.sql);
|
|
170
|
+
onMigrationApplied(migration.version);
|
|
171
|
+
database2.prepare("INSERT INTO schema_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(migration.version, migration.name, (/* @__PURE__ */ new Date()).toISOString());
|
|
172
|
+
})();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function initializeProjectSourceMigration(database2, previousMigrationVersion) {
|
|
176
|
+
if (!hasTable(database2, "project_source_migration")) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
database2.prepare(
|
|
180
|
+
`INSERT OR IGNORE INTO project_source_migration
|
|
181
|
+
(id, completed, recover_unassigned) VALUES (1, 0, ?)`
|
|
182
|
+
).run(previousMigrationVersion === 14 ? 1 : 0);
|
|
183
|
+
}
|
|
184
|
+
function ensureGlobalSettingsCompatibility(database2) {
|
|
185
|
+
if (!hasTable(database2, "global_settings")) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const columns = new Set(
|
|
189
|
+
database2.prepare("PRAGMA table_info(global_settings)").all().map((column) => column.name)
|
|
190
|
+
);
|
|
191
|
+
database2.transaction(() => {
|
|
192
|
+
if (!columns.has("fast_mode")) {
|
|
193
|
+
database2.exec(`
|
|
194
|
+
ALTER TABLE global_settings
|
|
195
|
+
ADD COLUMN fast_mode INTEGER NOT NULL DEFAULT 0
|
|
196
|
+
CHECK (fast_mode IN (0, 1));
|
|
197
|
+
`);
|
|
198
|
+
}
|
|
199
|
+
if (!columns.has("commit_message_reasoning_effort")) {
|
|
200
|
+
database2.exec(`
|
|
201
|
+
ALTER TABLE global_settings
|
|
202
|
+
ADD COLUMN commit_message_reasoning_effort TEXT NOT NULL DEFAULT '';
|
|
203
|
+
UPDATE global_settings
|
|
204
|
+
SET commit_message_reasoning_effort = reasoning_effort;
|
|
205
|
+
`);
|
|
206
|
+
}
|
|
207
|
+
})();
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// packages/server/src/sqlite-state-worker.js
|
|
211
|
+
function serializeError(error) {
|
|
212
|
+
return {
|
|
213
|
+
message: error instanceof Error ? error.message : String(error),
|
|
214
|
+
name: error instanceof Error ? error.name : "Error"
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function createOperations(database2) {
|
|
218
|
+
const statements = hasTable(database2, "projects") && hasTable(database2, "project_roots") ? {
|
|
219
|
+
upsertProject: database2.prepare(
|
|
220
|
+
`INSERT INTO projects (id, name, created_at, sort_order, kind)
|
|
221
|
+
VALUES (?, ?, ?, (
|
|
222
|
+
SELECT COALESCE(MAX(sort_order) + 1, 0) FROM projects WHERE kind = 'user'
|
|
223
|
+
), 'user')
|
|
224
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
225
|
+
name = excluded.name,
|
|
226
|
+
created_at = excluded.created_at
|
|
227
|
+
WHERE projects.kind = 'user'`
|
|
228
|
+
),
|
|
229
|
+
upsertProjectAtOrder: database2.prepare(
|
|
230
|
+
`INSERT INTO projects (id, name, created_at, sort_order, kind)
|
|
231
|
+
VALUES (?, ?, ?, ?, 'user')
|
|
232
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
233
|
+
name = excluded.name,
|
|
234
|
+
created_at = excluded.created_at,
|
|
235
|
+
sort_order = excluded.sort_order
|
|
236
|
+
WHERE projects.kind = 'user'`
|
|
237
|
+
),
|
|
238
|
+
listProjects: database2.prepare(
|
|
239
|
+
"SELECT id, name, created_at FROM projects WHERE kind = 'user' ORDER BY sort_order, created_at, id"
|
|
240
|
+
),
|
|
241
|
+
listProjectRoots: database2.prepare(
|
|
242
|
+
`SELECT project_roots.project_id, project_roots.root_id, project_roots.path
|
|
243
|
+
FROM project_roots
|
|
244
|
+
JOIN projects ON projects.id = project_roots.project_id
|
|
245
|
+
WHERE projects.kind = 'user'
|
|
246
|
+
ORDER BY projects.sort_order, projects.created_at, projects.id, project_roots.position`
|
|
247
|
+
),
|
|
248
|
+
listProjectIds: database2.prepare(
|
|
249
|
+
"SELECT id FROM projects WHERE kind = 'user' ORDER BY sort_order, created_at, id"
|
|
250
|
+
),
|
|
251
|
+
readProject: database2.prepare("SELECT id, name, created_at FROM projects WHERE id = ?"),
|
|
252
|
+
readProjectWithOrder: database2.prepare(
|
|
253
|
+
"SELECT id, name, created_at, sort_order FROM projects WHERE id = ? AND kind = 'user'"
|
|
254
|
+
),
|
|
255
|
+
readProjectRoots: database2.prepare(
|
|
256
|
+
"SELECT project_id, root_id, path FROM project_roots WHERE project_id = ? ORDER BY position"
|
|
257
|
+
),
|
|
258
|
+
removeProjectRoots: database2.prepare("DELETE FROM project_roots WHERE project_id = ?"),
|
|
259
|
+
writeProjectRoot: database2.prepare(
|
|
260
|
+
"INSERT INTO project_roots (project_id, position, root_id, path) VALUES (?, ?, ?, ?)"
|
|
261
|
+
),
|
|
262
|
+
removeProject: database2.prepare("DELETE FROM projects WHERE id = ? AND kind = 'user'"),
|
|
263
|
+
copyProjectDefaults: database2.prepare(
|
|
264
|
+
`INSERT INTO project_defaults
|
|
265
|
+
(project_id, model, reasoning_effort, updated_at, sandbox_mode,
|
|
266
|
+
approval_policy, approvals_reviewer, fast_mode)
|
|
267
|
+
SELECT ?, model, reasoning_effort, updated_at, sandbox_mode,
|
|
268
|
+
approval_policy, approvals_reviewer, fast_mode
|
|
269
|
+
FROM project_defaults WHERE project_id = ?
|
|
270
|
+
ON CONFLICT(project_id) DO UPDATE SET
|
|
271
|
+
model = excluded.model,
|
|
272
|
+
reasoning_effort = excluded.reasoning_effort,
|
|
273
|
+
updated_at = excluded.updated_at,
|
|
274
|
+
sandbox_mode = excluded.sandbox_mode,
|
|
275
|
+
approval_policy = excluded.approval_policy,
|
|
276
|
+
approvals_reviewer = excluded.approvals_reviewer,
|
|
277
|
+
fast_mode = excluded.fast_mode`
|
|
278
|
+
),
|
|
279
|
+
copyTaskSettings: database2.prepare(
|
|
280
|
+
`INSERT INTO task_settings
|
|
281
|
+
(project_id, task_id, approval_policy, model, reasoning_effort, updated_at,
|
|
282
|
+
sandbox_mode, approvals_reviewer)
|
|
283
|
+
SELECT ?, task_id, approval_policy, model, reasoning_effort, updated_at,
|
|
284
|
+
sandbox_mode, approvals_reviewer
|
|
285
|
+
FROM task_settings WHERE project_id = ?
|
|
286
|
+
ON CONFLICT(project_id, task_id) DO UPDATE SET
|
|
287
|
+
approval_policy = excluded.approval_policy,
|
|
288
|
+
model = excluded.model,
|
|
289
|
+
reasoning_effort = excluded.reasoning_effort,
|
|
290
|
+
updated_at = excluded.updated_at,
|
|
291
|
+
sandbox_mode = excluded.sandbox_mode,
|
|
292
|
+
approvals_reviewer = excluded.approvals_reviewer`
|
|
293
|
+
),
|
|
294
|
+
writeProjectSortOrder: database2.prepare(
|
|
295
|
+
"UPDATE projects SET sort_order = ? WHERE id = ? AND kind = 'user'"
|
|
296
|
+
),
|
|
297
|
+
readProjectDefaults: database2.prepare(
|
|
298
|
+
`SELECT approval_policy, approvals_reviewer, fast_mode, model,
|
|
299
|
+
reasoning_effort, sandbox_mode
|
|
300
|
+
FROM project_defaults WHERE project_id = ?`
|
|
301
|
+
),
|
|
302
|
+
readGlobalSettings: database2.prepare(
|
|
303
|
+
`SELECT approval_policy, approvals_reviewer, commit_message_model,
|
|
304
|
+
commit_message_prompt, model, reasoning_effort, sandbox_mode,
|
|
305
|
+
default_open_app_id, fast_mode, follow_up_behavior
|
|
306
|
+
FROM global_settings WHERE id = 1`
|
|
307
|
+
),
|
|
308
|
+
readProviderConnection: database2.prepare(
|
|
309
|
+
`SELECT mode, custom_base_url, custom_models_json, updated_at
|
|
310
|
+
FROM provider_connection WHERE id = 1`
|
|
311
|
+
),
|
|
312
|
+
readTaskSettings: database2.prepare(
|
|
313
|
+
"SELECT approval_policy, approvals_reviewer, model, reasoning_effort, sandbox_mode FROM task_settings WHERE project_id = ? AND task_id = ?"
|
|
314
|
+
),
|
|
315
|
+
writeProjectDefaults: database2.prepare(`
|
|
316
|
+
INSERT INTO project_defaults (
|
|
317
|
+
project_id, approval_policy, approvals_reviewer, fast_mode, model,
|
|
318
|
+
reasoning_effort, sandbox_mode, updated_at
|
|
319
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
320
|
+
ON CONFLICT(project_id) DO UPDATE SET
|
|
321
|
+
approval_policy = excluded.approval_policy,
|
|
322
|
+
approvals_reviewer = excluded.approvals_reviewer,
|
|
323
|
+
fast_mode = excluded.fast_mode,
|
|
324
|
+
model = excluded.model,
|
|
325
|
+
reasoning_effort = excluded.reasoning_effort,
|
|
326
|
+
sandbox_mode = excluded.sandbox_mode,
|
|
327
|
+
updated_at = excluded.updated_at
|
|
328
|
+
`),
|
|
329
|
+
writeGlobalSettings: database2.prepare(`
|
|
330
|
+
INSERT INTO global_settings (
|
|
331
|
+
id, approval_policy, approvals_reviewer, commit_message_model, commit_message_prompt,
|
|
332
|
+
model, reasoning_effort, sandbox_mode, default_open_app_id, fast_mode,
|
|
333
|
+
follow_up_behavior, updated_at
|
|
334
|
+
) VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
335
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
336
|
+
approval_policy = excluded.approval_policy,
|
|
337
|
+
approvals_reviewer = excluded.approvals_reviewer,
|
|
338
|
+
commit_message_model = excluded.commit_message_model,
|
|
339
|
+
commit_message_prompt = excluded.commit_message_prompt,
|
|
340
|
+
model = excluded.model,
|
|
341
|
+
reasoning_effort = excluded.reasoning_effort,
|
|
342
|
+
sandbox_mode = excluded.sandbox_mode,
|
|
343
|
+
default_open_app_id = excluded.default_open_app_id,
|
|
344
|
+
fast_mode = excluded.fast_mode,
|
|
345
|
+
follow_up_behavior = excluded.follow_up_behavior,
|
|
346
|
+
updated_at = excluded.updated_at
|
|
347
|
+
`),
|
|
348
|
+
writeProviderConnection: database2.prepare(`
|
|
349
|
+
INSERT INTO provider_connection (
|
|
350
|
+
id, mode, custom_base_url, custom_models_json, updated_at
|
|
351
|
+
) VALUES (1, ?, ?, ?, ?)
|
|
352
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
353
|
+
mode = excluded.mode,
|
|
354
|
+
custom_base_url = excluded.custom_base_url,
|
|
355
|
+
custom_models_json = excluded.custom_models_json,
|
|
356
|
+
updated_at = excluded.updated_at
|
|
357
|
+
`),
|
|
358
|
+
writeTaskSettings: database2.prepare(`
|
|
359
|
+
INSERT INTO task_settings (
|
|
360
|
+
project_id, task_id, approval_policy, approvals_reviewer, model, reasoning_effort, sandbox_mode, updated_at
|
|
361
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
362
|
+
ON CONFLICT(project_id, task_id) DO UPDATE SET
|
|
363
|
+
approval_policy = excluded.approval_policy,
|
|
364
|
+
approvals_reviewer = excluded.approvals_reviewer,
|
|
365
|
+
model = excluded.model,
|
|
366
|
+
reasoning_effort = excluded.reasoning_effort,
|
|
367
|
+
sandbox_mode = excluded.sandbox_mode,
|
|
368
|
+
updated_at = excluded.updated_at
|
|
369
|
+
`)
|
|
370
|
+
} : void 0;
|
|
371
|
+
function requireStatements() {
|
|
372
|
+
if (statements === void 0) {
|
|
373
|
+
throw new Error("SQLite state tables are unavailable");
|
|
374
|
+
}
|
|
375
|
+
return statements;
|
|
376
|
+
}
|
|
377
|
+
function readStoredProject(projectId) {
|
|
378
|
+
const stateStatements = requireStatements();
|
|
379
|
+
return projectFromRows(
|
|
380
|
+
stateStatements.readProject.get(projectId),
|
|
381
|
+
stateStatements.readProjectRoots.all(projectId)
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
function readStoredProjects() {
|
|
385
|
+
const stateStatements = requireStatements();
|
|
386
|
+
return projectsFromRows(
|
|
387
|
+
stateStatements.listProjects.all(),
|
|
388
|
+
stateStatements.listProjectRoots.all()
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
function replaceStoredRoots(project) {
|
|
392
|
+
const stateStatements = requireStatements();
|
|
393
|
+
if (!Array.isArray(project.roots) || project.roots.length === 0) {
|
|
394
|
+
throw new Error("Project roots must contain a primary root");
|
|
395
|
+
}
|
|
396
|
+
const rootIds = project.roots.map((root) => root.id);
|
|
397
|
+
const paths = project.roots.map((root) => root.path);
|
|
398
|
+
if (rootIds.some((rootId) => typeof rootId !== "string" || rootId.length === 0)) {
|
|
399
|
+
throw new Error("Project root ids must be non-empty strings");
|
|
400
|
+
}
|
|
401
|
+
if (new Set(rootIds).size !== rootIds.length) {
|
|
402
|
+
throw new Error("Project root ids must be unique");
|
|
403
|
+
}
|
|
404
|
+
if (paths.some((path) => typeof path !== "string" || path.length === 0)) {
|
|
405
|
+
throw new Error("Project root paths must be non-empty strings");
|
|
406
|
+
}
|
|
407
|
+
if (new Set(paths).size !== paths.length) {
|
|
408
|
+
throw new Error("Project root paths must be unique");
|
|
409
|
+
}
|
|
410
|
+
stateStatements.removeProjectRoots.run(project.id);
|
|
411
|
+
paths.forEach((path, position) => {
|
|
412
|
+
stateStatements.writeProjectRoot.run(project.id, position, rootIds[position], path);
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
const reorderProjects = database2.transaction((projectIds) => {
|
|
416
|
+
const stateStatements = requireStatements();
|
|
417
|
+
const storedProjectIds = stateStatements.listProjectIds.all().map((row) => row.id);
|
|
418
|
+
const requestedProjectIds = new Set(projectIds);
|
|
419
|
+
const containsCompleteProjectSet = projectIds.length === storedProjectIds.length && requestedProjectIds.size === storedProjectIds.length && storedProjectIds.every((projectId) => requestedProjectIds.has(projectId));
|
|
420
|
+
if (!containsCompleteProjectSet) {
|
|
421
|
+
throw new Error("Project order must contain every project exactly once");
|
|
422
|
+
}
|
|
423
|
+
projectIds.forEach((projectId, sortOrder) => {
|
|
424
|
+
stateStatements.writeProjectSortOrder.run(sortOrder, projectId);
|
|
425
|
+
});
|
|
426
|
+
return readStoredProjects();
|
|
427
|
+
});
|
|
428
|
+
const replaceProjects = database2.transaction((projects) => {
|
|
429
|
+
const stateStatements = requireStatements();
|
|
430
|
+
const projectIds = new Set(projects.map((project) => project.id));
|
|
431
|
+
if (projectIds.size !== projects.length) {
|
|
432
|
+
throw new Error("Project projection must contain unique project ids");
|
|
433
|
+
}
|
|
434
|
+
for (const { id } of stateStatements.listProjectIds.all()) {
|
|
435
|
+
if (!projectIds.has(id)) {
|
|
436
|
+
stateStatements.removeProject.run(id);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
projects.forEach((project, sortOrder) => {
|
|
440
|
+
stateStatements.upsertProjectAtOrder.run(
|
|
441
|
+
project.id,
|
|
442
|
+
project.name,
|
|
443
|
+
project.createdAt,
|
|
444
|
+
sortOrder
|
|
445
|
+
);
|
|
446
|
+
replaceStoredRoots(project);
|
|
447
|
+
});
|
|
448
|
+
return readStoredProjects();
|
|
449
|
+
});
|
|
450
|
+
const migrateProject = database2.transaction((legacyProjectId, project) => {
|
|
451
|
+
const stateStatements = requireStatements();
|
|
452
|
+
const legacy = stateStatements.readProjectWithOrder.get(legacyProjectId);
|
|
453
|
+
const sortOrder = legacy?.sort_order ?? stateStatements.listProjectIds.all().length;
|
|
454
|
+
stateStatements.upsertProjectAtOrder.run(
|
|
455
|
+
project.id,
|
|
456
|
+
project.name,
|
|
457
|
+
project.createdAt,
|
|
458
|
+
sortOrder
|
|
459
|
+
);
|
|
460
|
+
replaceStoredRoots(project);
|
|
461
|
+
if (legacyProjectId !== project.id && legacy !== void 0) {
|
|
462
|
+
stateStatements.copyProjectDefaults.run(project.id, legacyProjectId);
|
|
463
|
+
stateStatements.copyTaskSettings.run(project.id, legacyProjectId);
|
|
464
|
+
stateStatements.removeProject.run(legacyProjectId);
|
|
465
|
+
}
|
|
466
|
+
const stored = readStoredProject(project.id);
|
|
467
|
+
if (stored === void 0) {
|
|
468
|
+
throw new Error("Migrated Project projection could not be stored");
|
|
469
|
+
}
|
|
470
|
+
return stored;
|
|
471
|
+
});
|
|
472
|
+
const projectSourceMigrationStatements = hasTable(database2, "project_source_migration") ? {
|
|
473
|
+
complete: database2.prepare(
|
|
474
|
+
"UPDATE project_source_migration SET completed = 1 WHERE id = 1"
|
|
475
|
+
),
|
|
476
|
+
read: database2.prepare(
|
|
477
|
+
"SELECT completed, recover_unassigned FROM project_source_migration WHERE id = 1"
|
|
478
|
+
)
|
|
479
|
+
} : void 0;
|
|
480
|
+
return {
|
|
481
|
+
diagnose() {
|
|
482
|
+
database2.exec("BEGIN IMMEDIATE");
|
|
483
|
+
try {
|
|
484
|
+
database2.prepare(
|
|
485
|
+
"INSERT INTO schema_migrations (version, name, applied_at) VALUES (-1, 'doctor', ?)"
|
|
486
|
+
).run((/* @__PURE__ */ new Date()).toISOString());
|
|
487
|
+
} finally {
|
|
488
|
+
database2.exec("ROLLBACK");
|
|
489
|
+
}
|
|
490
|
+
const synchronousValue = database2.pragma("synchronous", { simple: true });
|
|
491
|
+
return {
|
|
492
|
+
busyTimeout: database2.pragma("busy_timeout", { simple: true }),
|
|
493
|
+
foreignKeys: database2.pragma("foreign_keys", { simple: true }) === 1,
|
|
494
|
+
integrityCheck: database2.pragma("integrity_check", { simple: true }),
|
|
495
|
+
journalMode: database2.pragma("journal_mode", { simple: true }),
|
|
496
|
+
migrationVersion: database2.prepare("SELECT COALESCE(MAX(version), 0) AS version FROM schema_migrations").get().version,
|
|
497
|
+
synchronous: synchronousValue === 1 ? "normal" : String(synchronousValue),
|
|
498
|
+
writable: true
|
|
499
|
+
};
|
|
500
|
+
},
|
|
501
|
+
completeProjectSourceMigration() {
|
|
502
|
+
if (projectSourceMigrationStatements === void 0) {
|
|
503
|
+
throw new Error("Project source migration state is unavailable");
|
|
504
|
+
}
|
|
505
|
+
projectSourceMigrationStatements.complete.run();
|
|
506
|
+
return null;
|
|
507
|
+
},
|
|
508
|
+
listProjects() {
|
|
509
|
+
return readStoredProjects();
|
|
510
|
+
},
|
|
511
|
+
readProject(payload) {
|
|
512
|
+
return readStoredProject(payload.projectId);
|
|
513
|
+
},
|
|
514
|
+
readProjectSourceMigration() {
|
|
515
|
+
if (projectSourceMigrationStatements === void 0) {
|
|
516
|
+
throw new Error("Project source migration state is unavailable");
|
|
517
|
+
}
|
|
518
|
+
const row = projectSourceMigrationStatements.read.get();
|
|
519
|
+
if (row === void 0) {
|
|
520
|
+
throw new Error("Project source migration state is missing");
|
|
521
|
+
}
|
|
522
|
+
return {
|
|
523
|
+
completed: row.completed === 1,
|
|
524
|
+
recoverUnassigned: row.recover_unassigned === 1
|
|
525
|
+
};
|
|
526
|
+
},
|
|
527
|
+
replaceProjects(payload) {
|
|
528
|
+
return replaceProjects(payload.projects);
|
|
529
|
+
},
|
|
530
|
+
upsertProject(payload) {
|
|
531
|
+
return database2.transaction((project) => {
|
|
532
|
+
const stateStatements = requireStatements();
|
|
533
|
+
stateStatements.upsertProject.run(project.id, project.name, project.createdAt);
|
|
534
|
+
replaceStoredRoots(project);
|
|
535
|
+
const stored = readStoredProject(project.id);
|
|
536
|
+
if (stored === void 0) {
|
|
537
|
+
throw new Error("Project projection could not be stored");
|
|
538
|
+
}
|
|
539
|
+
return stored;
|
|
540
|
+
})(payload.project);
|
|
541
|
+
},
|
|
542
|
+
migrateProject(payload) {
|
|
543
|
+
return migrateProject(payload.legacyProjectId, payload.project);
|
|
544
|
+
},
|
|
545
|
+
deleteProject(payload) {
|
|
546
|
+
return requireStatements().removeProject.run(payload.projectId).changes > 0;
|
|
547
|
+
},
|
|
548
|
+
setProjectOrder(payload) {
|
|
549
|
+
return reorderProjects(payload.projectIds);
|
|
550
|
+
},
|
|
551
|
+
readProjectDefaults(payload) {
|
|
552
|
+
return projectDefaultsFromRow(requireStatements().readProjectDefaults.get(payload.projectId));
|
|
553
|
+
},
|
|
554
|
+
readGlobalSettings() {
|
|
555
|
+
return globalSettingsFromRow(requireStatements().readGlobalSettings.get());
|
|
556
|
+
},
|
|
557
|
+
readProviderConnection() {
|
|
558
|
+
return providerConnectionFromRow(requireStatements().readProviderConnection.get());
|
|
559
|
+
},
|
|
560
|
+
readTaskSettings(payload) {
|
|
561
|
+
return taskSettingsFromRow(
|
|
562
|
+
requireStatements().readTaskSettings.get(payload.projectId, payload.taskId)
|
|
563
|
+
);
|
|
564
|
+
},
|
|
565
|
+
writeProjectDefaults(payload) {
|
|
566
|
+
const settings = payload.settings;
|
|
567
|
+
requireStatements().writeProjectDefaults.run(
|
|
568
|
+
payload.projectId,
|
|
569
|
+
serializeApprovalPolicy(settings.approvalPolicy),
|
|
570
|
+
settings.approvalsReviewer,
|
|
571
|
+
settings.fastMode ? 1 : 0,
|
|
572
|
+
settings.model,
|
|
573
|
+
settings.reasoningEffort,
|
|
574
|
+
settings.sandboxMode,
|
|
575
|
+
payload.updatedAt
|
|
576
|
+
);
|
|
577
|
+
return settings;
|
|
578
|
+
},
|
|
579
|
+
writeGlobalSettings(payload) {
|
|
580
|
+
const settings = payload.settings;
|
|
581
|
+
requireStatements().writeGlobalSettings.run(
|
|
582
|
+
serializeApprovalPolicy(settings.approvalPolicy),
|
|
583
|
+
settings.approvalsReviewer,
|
|
584
|
+
settings.commitMessageModel,
|
|
585
|
+
settings.commitMessagePrompt,
|
|
586
|
+
settings.model,
|
|
587
|
+
settings.reasoningEffort,
|
|
588
|
+
settings.sandboxMode,
|
|
589
|
+
settings.defaultOpenAppId,
|
|
590
|
+
settings.fastMode ? 1 : 0,
|
|
591
|
+
settings.followUpBehavior,
|
|
592
|
+
payload.updatedAt
|
|
593
|
+
);
|
|
594
|
+
return settings;
|
|
595
|
+
},
|
|
596
|
+
writeProviderConnection(payload) {
|
|
597
|
+
requireStatements().writeProviderConnection.run(
|
|
598
|
+
payload.mode,
|
|
599
|
+
payload.customBaseUrl,
|
|
600
|
+
payload.customModelsJson,
|
|
601
|
+
payload.updatedAt
|
|
602
|
+
);
|
|
603
|
+
return null;
|
|
604
|
+
},
|
|
605
|
+
writeTaskSettings(payload) {
|
|
606
|
+
const settings = payload.settings;
|
|
607
|
+
requireStatements().writeTaskSettings.run(
|
|
608
|
+
payload.projectId,
|
|
609
|
+
payload.taskId,
|
|
610
|
+
serializeApprovalPolicy(settings.approvalPolicy),
|
|
611
|
+
settings.approvalsReviewer,
|
|
612
|
+
settings.model,
|
|
613
|
+
settings.reasoningEffort,
|
|
614
|
+
settings.sandboxMode,
|
|
615
|
+
payload.updatedAt
|
|
616
|
+
);
|
|
617
|
+
return settings;
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
var database;
|
|
622
|
+
try {
|
|
623
|
+
mkdirSync(resolve(workerData.databasePath, ".."), { recursive: true });
|
|
624
|
+
database = new Database(workerData.databasePath);
|
|
625
|
+
configureDatabase(database);
|
|
626
|
+
const previousMigrationVersion = readMigrationVersion(database);
|
|
627
|
+
runMigrations(database, workerData.migrations, (version) => {
|
|
628
|
+
if (version === 15) {
|
|
629
|
+
initializeProjectSourceMigration(database, previousMigrationVersion);
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
initializeProjectSourceMigration(database, previousMigrationVersion);
|
|
633
|
+
ensureGlobalSettingsCompatibility(database);
|
|
634
|
+
const operations = createOperations(database);
|
|
635
|
+
parentPort.on("message", (message) => {
|
|
636
|
+
try {
|
|
637
|
+
if (message.operation === "close") {
|
|
638
|
+
database.close();
|
|
639
|
+
parentPort.postMessage({ id: message.id, result: null, type: "response" });
|
|
640
|
+
parentPort.close();
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
const operation = operations[message.operation];
|
|
644
|
+
if (typeof operation !== "function") {
|
|
645
|
+
throw new Error(`Unknown SQLite worker operation: ${String(message.operation)}`);
|
|
646
|
+
}
|
|
647
|
+
parentPort.postMessage({
|
|
648
|
+
id: message.id,
|
|
649
|
+
result: operation(message.payload),
|
|
650
|
+
type: "response"
|
|
651
|
+
});
|
|
652
|
+
} catch (error) {
|
|
653
|
+
parentPort.postMessage({ id: message.id, error: serializeError(error), type: "response" });
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
parentPort.postMessage({ type: "ready" });
|
|
657
|
+
} catch (error) {
|
|
658
|
+
database?.close();
|
|
659
|
+
parentPort.postMessage({ error: serializeError(error), type: "fatal" });
|
|
660
|
+
parentPort.close();
|
|
661
|
+
}
|