@myagentroam/node 0.9.62 → 0.9.65
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/LICENSE +202 -0
- package/NOTICE +4 -0
- package/dist/capabilities.js +110 -2
- package/dist/claude-agent-sdk.js +330 -2
- package/dist/claude-channel.js +44 -2
- package/dist/codex-app-server.js +510 -2
- package/dist/config.js +106 -2
- package/dist/connector/node-connector-options.js +1 -2
- package/dist/connector/node-operation-router.js +22 -2
- package/dist/connector.js +1736 -2
- package/dist/control-outbound-scheduler.js +153 -2
- package/dist/database.js +639 -2
- package/dist/fake-runner.js +129 -2
- package/dist/git-askpass.js +12 -0
- package/dist/git-execution-helper.js +266 -0
- package/dist/health.js +3 -2
- package/dist/main.js +57 -2
- package/dist/mcp-installation-model.js +1 -2
- package/dist/migrations/v004.js +55 -3
- package/dist/migrations/v005.js +13 -3
- package/dist/migrations/v006.js +90 -3
- package/dist/migrations/v007.js +22 -3
- package/dist/migrations/v008.js +18 -3
- package/dist/migrations/v009.js +70 -4
- package/dist/migrations/v010.js +43 -3
- package/dist/migrations/v011.js +20 -3
- package/dist/migrations/v012.js +8 -0
- package/dist/native-jsonl-reader.js +186 -2
- package/dist/native-session-history.js +1143 -2
- package/dist/opencode-runtime.js +80 -2
- package/dist/opencode-server.js +259 -2
- package/dist/operational.js +122 -2
- package/dist/process-tree.js +18 -2
- package/dist/ripgrep-binary.js +31 -2
- package/dist/rotating-log.js +67 -2
- package/dist/runner/abstract-runner.js +260 -2
- package/dist/runner/claude/managed-run-controller.js +355 -2
- package/dist/runner/claude/tool-normalizer.js +120 -2
- package/dist/runner/claude-code-runner.js +303 -2
- package/dist/runner/codex/composer-image-markers.js +8 -2
- package/dist/runner/codex/conversation-parser.js +913 -2
- package/dist/runner/codex/managed-run-controller.js +494 -2
- package/dist/runner/codex/tool-normalizer.js +214 -2
- package/dist/runner/codex-runner.js +585 -2
- package/dist/runner/fake-test-runner.js +47 -2
- package/dist/runner/mar-agent/conversation-normalizer.js +644 -2
- package/dist/runner/mar-agent/executor-stdio-client-transport.js +139 -2
- package/dist/runner/mar-agent/generated-images.js +41 -2
- package/dist/runner/mar-agent/history-projection.js +106 -2
- package/dist/runner/mar-agent/hosted-conversation-runtime.js +446 -2
- package/dist/runner/mar-agent/managed-run-controller.js +785 -2
- package/dist/runner/mar-agent/mcp-client-pool.js +233 -2
- package/dist/runner/mar-agent/runtime-model-factory.js +326 -2
- package/dist/runner/mar-agent-runner.js +458 -2
- package/dist/runner/opencode/conversation-parser.js +221 -2
- package/dist/runner/opencode/managed-run-controller.js +588 -2
- package/dist/runner/opencode/tool-normalizer.js +80 -2
- package/dist/runner/opencode-runner.js +426 -2
- package/dist/runner/runner-registry.js +87 -2
- package/dist/runner-command-engine.js +71 -2
- package/dist/runner-profiles.js +323 -2
- package/dist/runner-usage.js +190 -2
- package/dist/runtime-command-detector.js +73 -2
- package/dist/runtime-model.js +1 -2
- package/dist/runtime-state.js +1509 -2
- package/dist/service/attachment-domain-state.js +7 -2
- package/dist/service/bubblewrap-sandbox-executor.js +543 -2
- package/dist/service/continuous-run-coordinator.js +425 -2
- package/dist/service/conversation-history-service.js +552 -2
- package/dist/service/conversation-hosting-capability-service.js +61 -2
- package/dist/service/conversation-hosting-enablement-service.js +91 -2
- package/dist/service/conversation-hosting-maintenance-service.js +174 -2
- package/dist/service/conversation-segment-service.js +162 -2
- package/dist/service/conversation-template-node-service.js +992 -2
- package/dist/service/external-session-resume-service.js +152 -2
- package/dist/service/fake-managed-run-service.js +60 -2
- package/dist/service/git-execution-service.js +418 -0
- package/dist/service/git-operation-service.js +57 -0
- package/dist/service/hosted-conversation-node-service.js +1982 -2
- package/dist/service/hosted-conversation-store.js +1405 -2
- package/dist/service/managed-runner-session-service.js +35 -2
- package/dist/service/mar-agent-model-transport-test-service.js +88 -2
- package/dist/service/mcp-installation-verifier.js +87 -2
- package/dist/service/mcp-node-operation-service.js +90 -2
- package/dist/service/mission-mcp-server.js +124 -2
- package/dist/service/mission-mcp-stdio.js +40 -2
- package/dist/service/mission-runtime.js +142 -2
- package/dist/service/native-session-projection-service.js +274 -2
- package/dist/service/native-session-watch-service.js +683 -2
- package/dist/service/node-connection-lifecycle-service.js +88 -2
- package/dist/service/node-control-channel.js +85 -2
- package/dist/service/node-control-message-service.js +109 -2
- package/dist/service/node-request-service.js +62 -2
- package/dist/service/node-run-event-bridge.js +88 -2
- package/dist/service/node-terminal-channel.js +202 -2
- package/dist/service/node-upgrade-coordinator.js +137 -2
- package/dist/service/node-workspace-coordinator.js +97 -2
- package/dist/service/recent-run-projection-service.js +99 -2
- package/dist/service/run-attachment-service.js +321 -2
- package/dist/service/run-domain-state.js +4 -2
- package/dist/service/run-event-service.js +246 -2
- package/dist/service/run-ownership-policy.js +22 -2
- package/dist/service/run-workbench-service.js +120 -2
- package/dist/service/runner-channel-message-service.js +20 -2
- package/dist/service/runner-interaction-service.js +243 -2
- package/dist/service/runner-service.js +69 -2
- package/dist/service/runtime-credential-control-service.js +95 -2
- package/dist/service/session-catalog-service.js +404 -2
- package/dist/service/session-command-service.js +125 -2
- package/dist/service/session-context-service.js +128 -2
- package/dist/service/session-domain-state.js +9 -2
- package/dist/service/session-identity-service.js +86 -2
- package/dist/service/session-lifecycle-service.js +248 -2
- package/dist/service/session-message-service.js +270 -2
- package/dist/service/session-presentation-service.js +43 -2
- package/dist/service/session-query-service.js +82 -2
- package/dist/service/session-watch-slot-coordinator.js +21 -2
- package/dist/service/skill-directory-service.js +238 -2
- package/dist/service/skill-install-service.js +434 -2
- package/dist/service/skill-node-operation-service.js +206 -2
- package/dist/service/terminal-relay-state.js +3 -2
- package/dist/service/terminal-service.js +90 -2
- package/dist/service/web-search-error.js +40 -2
- package/dist/service/workbench-event-service.js +21 -2
- package/dist/service/workbench-manifest-service.js +69 -2
- package/dist/service/workspace-change-service.js +290 -2
- package/dist/service/workspace-content-search-service.js +457 -2
- package/dist/service/workspace-domain-state.js +41 -2
- package/dist/service/workspace-file-service.js +150 -2
- package/dist/service/workspace-git-exclude-service.js +119 -2
- package/dist/service/workspace-queue-workbench-service.js +176 -2
- package/dist/service/workspace-service.js +92 -2
- package/dist/service/workspace-session-service.js +154 -2
- package/dist/service/workspace-upload-service.js +262 -2
- package/dist/service/workspace-watch-controller.js +68 -2
- package/dist/service/workspace-watch-service.js +170 -2
- package/dist/service/workspace-watch-snapshot-service.js +218 -2
- package/dist/service/workspace-workbench-service.js +239 -2
- package/dist/service.js +91 -2
- package/dist/storage.js +32 -2
- package/dist/supervisor.js +136 -2
- package/dist/terminal.js +496 -2
- package/dist/util/git-credential-client.js +32 -0
- package/dist/util/node-operation-data.js +9 -2
- package/dist/util/node-operation-parsers.js +382 -2
- package/dist/util/personal-instructions.js +34 -2
- package/dist/util/runner-error.js +70 -2
- package/dist/util/runner-native-session-parsers.js +510 -2
- package/dist/util/safe-error.js +8 -2
- package/dist/util/secret-environment.js +25 -2
- package/dist/workspace.js +1793 -2
- package/package.json +11 -8
- package/vendor/ripgrep/darwin-arm64/rg +0 -0
- package/vendor/ripgrep/darwin-x64/rg +0 -0
- package/vendor/ripgrep/manifest.json +12 -0
- package/README.md +0 -42
- package/dist/event-buffer.js +0 -2
- package/dist/migrations/v001.js +0 -107
- package/dist/migrations/v002.js +0 -2
- package/dist/migrations/v003.js +0 -2
- package/dist/service/mcp-package-installer.js +0 -2
package/dist/database.js
CHANGED
|
@@ -1,2 +1,639 @@
|
|
|
1
|
-
|
|
2
|
-
const _0x43ccad=_0x33f4;(function(_0x4b3a43,_0x10df21){const _0x18d031=_0x33f4,_0x2808ce=_0x4b3a43();while(!![]){try{const _0x2c0c2d=-parseInt(_0x18d031(0x100))/(-0x1f73+0x21*0x61+0x4d*0x3f)+parseInt(_0x18d031(0xf8))/(-0x2021+0x114a+-0x4f3*-0x3)*(parseInt(_0x18d031(0x153))/(0x1*-0x127f+0x3b*0x95+-0xfd5))+parseInt(_0x18d031(0x125))/(0xd6c+0x51c+-0x4f*0x3c)+parseInt(_0x18d031(0x142))/(-0x103b+-0x21ed*-0x1+0x19*-0xb5)+parseInt(_0x18d031(0x147))/(-0x20ed+0x1*-0x349+0x243c)+-parseInt(_0x18d031(0xea))/(0x6fb*0x5+-0x20a2+-0x23e)+parseInt(_0x18d031(0x156))/(-0x11ca+-0x1641+0x2813*0x1);if(_0x2c0c2d===_0x10df21)break;else _0x2808ce['push'](_0x2808ce['shift']());}catch(_0x4f05eb){_0x2808ce['push'](_0x2808ce['shift']());}}}(_0x9f82,0x1*-0x48f4b+0x47669+-0xb1a*-0xa1));function _0x9f82(){const _0x13d5b6=['u0vtu0LptL9ot1rFueLotKve','C2fMzvbHCNnL','D2fPDa','DhjPBq','u0vmrunuideGrLjptsbZCwXPDgvFBwfZDgvYifDirvjfihr5CguGpsaNDgfIBguNieforcbUyw1Lid0Gj25VzgvFC2nOzw1Hx21Pz3jHDgLVBNmN','u0vtu0LptL9usvrmrv9jtLzbteLe','zxH0zxjUywXtzxnZAw9Uswq','C3rHDgu','zw5HyMXLza','Bwv0ywrHDge','mLjjtM9vAa','BgLZDfDVCMTZCgfJzxm','revmrvrfiezst00GywDLBNrFC2vZC2LVBNmGv0HfuKuGAwqGpsa/','tK9erv9eqvrbqKftrv9nsuDsqvrjt05FseLtve9swv9jtLzbteLe','ufjbr01bigzVCMvPz25FA2v5CYa9ie9grG','zwzMB3j0','A2LUza','su5trvjuieLove8GBwnWx2LUC3rHBgXHDgLVBNmkicaGicaGicaGkhrHCMDLDf9RAw5KlhrHCMDLDf9PzcXJyxrHBg9Nx2vUDhj5x2LKlhnLCNzLCL9Uyw1LlgrPC3bSyxLFBMfTzsX2zxjZAw9UlgvUywjSzwqSCNvUDgLTzsXJB25MAwD1CMf0Aw9UlgLUC3rHBgXLzf9HDcKkicaGicaGicaGvKfmvuvticG/ld8SpYW/ld8SpYW/ld8SpYW/kqOGicaGicaGicbptIbdt05gteLdvcH0yxjNzxrFA2LUzcX0yxjNzxrFAwqSC2vYDMvYx25HBwuPierpifvqrefursbtrvqkicaGicaGicaGicbJyxrHBg9Nx2vUDhj5x2LKpwv4y2X1zgvKlMnHDgfSB2DFzw50CNLFAwqSzgLZCgXHEv9Uyw1Lpwv4y2X1zgvKlMrPC3bSyxLFBMfTzsWkicaGicaGicaGicb2zxjZAw9Upwv4y2X1zgvKlNzLCNnPB24Szw5HyMXLzd1LEgnSDwrLzc5LBMfIBgvKlhj1BNrPBwu9zxHJBhvKzwqUCNvUDgLTzsWkicaGicaGicaGicbJB25MAwD1CMf0Aw9Upwv4y2X1zgvKlMnVBMzPz3vYyxrPB24SAw5ZDgfSBgvKx2f0pwv4y2X1zgvKlMLUC3rHBgXLzf9HDa','ody3nZeZDLHsv2rL','u0vmrunuideGrLjptsbZCwXPDgvFBwfZDgvYifDirvjfihr5CguGpsaNDgfIBguNieforcbUyw1Lie5pvcbmsuTficDZCwXPDgvFjsCGteLnsvqGmq','BgvUz3rO','tK9erv9eqvrbqKftrv9nsuDsqvrjt05Fte9ds19vtKfwquLmqujmrq','u0vmrunuihbPBL9VCMrLCIWGBwv0ywrHDgeGrLjptsbHz2vUDf9ZzxnZAw9UCYbxsevsrsbPzca9id8Gqu5eihj1BM5LCIa9id8Gqu5eihDVCMTZCgfJzv9Pzca9id8','Bw92zvbPBM5LzfnLC3nPB24','C2f2zu1JCeLUC3rHBgXHDgLVBG','DMfSDwvZ','revmrvrfiezst00GBwnWx2LUC3rHBgXHDgLVBNmGv0HfuKuGDgfYz2v0x2TPBMq9j1DpuKTtuefdrsCGqu5eihrHCMDLDf9Pzca9id8','zxHLyW','u0vmrunuihzLCNnPB24GrLjptsbUB2rLx3nJAgvTyv9TAwDYyxrPB25Zie9srevsiejzihzLCNnPB24','su5trvjuieLove8GDgvYBwLUywXFC2vZC2LVBNmkicaGicaGicaGicHPzcWGD29YA3nWywnLx2LKlcbWCM9MAwXLx2LKlcbZDgf0zsWGzxHPDf9JB2rLlcbYB3DZlcbJB2XZlcbSyxrLC3rFC2vXDwvUy2uSignYzwf0zwrFyxqSihvWzgf0zwrFyxqPcIaGicaGicaGifzbtfvfuYaOpYWGpYWGpYWGpYWGpYWGpYWGpYWGpYWGpYWGpYKkicaGicaGicaGt04Gq09orKXjq1qOAwqPierpifvqrefursbtrvqGD29YA3nWywnLx2LKid0GzxHJBhvKzwqUD29YA3nWywnLx2LKlcbWCM9MAwXLx2LKid0GzxHJBhvKzwqUChjVzMLSzv9PzcWGC3rHDguGpsbLEgnSDwrLzc5ZDgf0zsWkicaGicaGicaGicbLEgL0x2nVzguGpsbLEgnSDwrLzc5LEgL0x2nVzguSihjVD3mGpsbLEgnSDwrLzc5YB3DZlcbJB2XZid0GzxHJBhvKzwqUy29SCYWkicaGicaGicaGicbSyxrLC3rFC2vXDwvUy2uGpsbLEgnSDwrLzc5SyxrLC3rFC2vXDwvUy2uSihvWzgf0zwrFyxqGpsbLEgnSDwrLzc51CgrHDgvKx2f0','z2L0x3n1Bw1HCNK','u0vmrunuigLKlcbWyxrOlcbRAw5KlcbNAxrFC3vTBwfYEsbguK9nihDVCMTZCgfJzxmGt1jerviGqLKGy3jLyxrLzf9HDcbbu0m','vvbeqvrfigfNzw50x3nLC3nPB25ZifnfvcbWAw5FB3jKzxiGpsbWAw5FB3jKzxiGkYaXifDirvjfihDVCMTZCgfJzv9Pzca9id8Gqu5eihbPBL9VCMrLCIbjuYbot1qGtLvmta','su5trvjuieLove8GBM9Kzv9Zy2HLBwfFBwLNCMf0Aw9UCYaODMvYC2LVBIWGyxbWBgLLzf9HDcKGvKfmvuvticG/lca/kq','z2v0vgvYBwLUywXtzxnZAw9U','BNvTyMvY','C2vYDMvYx25HBwu','su5trvjuieLove8GD29YA3nWywnLCYaOAwqSihbHDgGSigTPBMqSigDPDf9ZDw1Tyxj5lcbJCMvHDgvKx2f0lcb1CgrHDgvKx2f0kqOGicaGicaGicbwquXvrvmGkd8Sid8Sid8Sid8Sid8Sid8PcIaGicaGicaGie9oienptKzmsunukhbHDgGPierpifvqrefursbtrvqGA2LUzca9igv4y2X1zgvKlMTPBMqScIaGicaGicaGicaGz2L0x3n1Bw1HCNKGpsbLEgnSDwrLzc5NAxrFC3vTBwfYEsWGDxbKyxrLzf9HDca9igv4y2X1zgvKlNvWzgf0zwrFyxq','C3vJy2vZCW','u0vmrunuihrHCMDLDf9RAw5KlhrHCMDLDf9PzcXJyxrHBg9Nx2vUDhj5x2LKlhnLCNzLCL9Uyw1LlgrPC3bSyxLFBMfTzsX2zxjZAw9UlaOGicaGicaGicaGicaGicaGzw5HyMXLzcXYDw50Aw1LlgnVBMzPz3vYyxrPB24SAw5ZDgfSBgvKx2f0cIaGicaGicaGiezst00GBwnWx2LUC3rHBgXHDgLVBNmGv0HfuKuGDgfYz2v0x2TPBMq9pYbbtKqGDgfYz2v0x2LKpt8Gt1jerviGqLKGzgLZCgXHEv9Uyw1LlhnLCNzLCL9Uyw1L','revmrvrfiezst00GywDLBNrFC2vZC2LVBNmGv0HfuKuGD29YA3nWywnLx2LKid0GpW','Bw9KzwW','DxbKyxrLzef0','z2L0u3vTBwfYEq','y3jLyxrLzf9HDa','DxbKyxrLzf9HDa','BM93','CgLUBMvK','su5trvjuieLove8GywDLBNrFC2vZC2LVBNmGkgLKlcb3B3jRC3bHy2vFAwqSihj1BM5LCIWGCgLUx29YzgvYlcbTzxrHzgf0ysKkicaGicaGicaGicbwquXvrvmGkd8Sid8Sid8Sid8Sid8PcIaGicaGicaGicaGt04Gq09orKXjq1qOAwqPierpifvqrefursbtrvqGD29YA3nWywnLx2LKid0GzxHJBhvKzwqUD29YA3nWywnLx2LKlaOGicaGicaGicaGicaGCNvUBMvYid0GzxHJBhvKzwqUCNvUBMvYlcbWAw5FB3jKzxiGpsbLEgnSDwrLzc5WAw5FB3jKzxiSig1LDgfKyxrHid0GzxHJBhvKzwqUBwv0ywrHDge','ywnJzxnZ','CgLUt3jKzxi','ufjbr01bigzVCMvPz25FA2v5CYa9ie9o','DgfYz2v0swq','rvHjveve','BgLZDe1JCeLUC3rHBgXHDgLVBNm','mteWoteYoeHuwKflza','CNvUDgLTzq','Aw5ZDgfSBgvKx2f0','su5trvjuieLove8GCNvUBMvYx2rLzMf1BhrZicHYDw5UzxiSig1VzgvSlcbLzMzVCNqSigfJy2vZCYKkicaGicaGicaGvKfmvuvticG/lca/lca/lca/kqOGicaGicaGicbptIbdt05gteLdvcHYDw5UzxiPierpifvqrefursbtrvqkicaGicaGicaGicbTB2rLBca9igv4y2X1zgvKlM1VzgvSlcbLzMzVCNqGpsbLEgnSDwrLzc5LzMzVCNqScIaGicaGicaGicaGywnJzxnZid0GzxHJBhvKzwqUywnJzxnZ','u0vmrunuihj1BM5LCIWGBw9KzwWSigvMzM9YDcWGywnJzxnZiezst00GCNvUBMvYx2rLzMf1BhrZie9srevsiejzihj1BM5LCG','z2v0v29YA3nWywnL','u0vmrunuigLKlcb3B3jRC3bHy2vFAwqSihbYB2zPBgvFAwqSihn0yxrLlcbLEgL0x2nVzguSihjVD3mSignVBhmSigXHDgvZDf9Zzxf1zw5JzsWGy3jLyxrLzf9HDcWGDxbKyxrLzf9HDaOGicaGicaGicbguK9nihrLCM1PBMfSx3nLC3nPB25ZifDirvjfihn0yxrLid0Gj1jvtK5jtKCNie9srevsiejzignYzwf0zwrFyxqGqvndlcbPzcbbu0m','u0vmrunuigLKlcb3B3jRC3bHy2vFAwqSihbYB2zPBgvFAwqSihn0yxrLlcbLEgL0x2nVzguSihjVD3mSignVBhmSigXHDgvZDf9Zzxf1zw5JzsWGy3jLyxrLzf9HDcWGDxbKyxrLzf9HDaOGicaGicaGicbguK9nihrLCM1PBMfSx3nLC3nPB25ZifDirvjfigLKid0GpW','CgfYC2u','tK9erv9eqvrbqKftrv9wrvjtsu9ox1vou1vque9sveve','y29SCW','y2HHBMDLCW','vvbeqvrfigfNzw50x3nLC3nPB25ZifnfvcbWAw5FB3jKzxiGpsa/ifDirvjfigLKid0GpW','CNvU','refuqujbu0vFvKfmvuvFsu5wquXjrdP0zxjTAw5HBf9ZDgf0zq','u0vmrunuigLKlcbWyxrOlcbRAw5KlcbNAxrFC3vTBwfYEsbguK9nihDVCMTZCgfJzxmGv0HfuKuGAwqGpsa/','ChjVzMLSzuLK','CMvTB3zLv29YA3nWywnL','u0vmrunuigLKlcbWAw5FB3jKzxiGrLjptsbHz2vUDf9ZzxnZAw9UCYbxsevsrsb3B3jRC3bHy2vFAwqGpsa/ieforcbWAw5FB3jKzxiGpca/ie9srevsiejzihbPBL9VCMrLCIbervndieXjtuLuide','y29UzMLNDxjHDgLVBG','z2v0','zMLSDgvY','qKvhsu4Gsu1nrurjqvrf','zxHPDf9JB2rL','CNvUBMvYvgL0Bgvqzw5KAw5N','ChjLCgfYzq','Aw5JBhvKzxm','CNvUBMvYvgL0Bgu','y29Kzq','mtiXndq3mfHjr3v1sW','refuqujbu0vFvKfmvuvFsu5wquXjrdO','qKvhsu4','C2f2zvDVCMTZCgfJzq','CMf3','mJG2mZC0nK1ksgTpEG','u0vmrunuie1bwcH2zxjZAw9UksbbuYb2zxjZAw9Uiezst00GBM9Kzv9Zy2HLBwfFBwLNCMf0Aw9UCW','D29YA3nWywnLx2LK','v09ss1nqqunf','z2v0tMf0AxzLu2vZC2LVBK1LDgfKyxrH','D29YA3nWywnLswq','C3rYAw5NAwz5','Bgf0zxn0u2vXDwvUy2u','u0vmrunuigLKiezst00GD29YA3nWywnLCYbxsevsrsbWyxrOid0GpW','BwfW','Cgf0Aa','uK9mtejbq0S','mtq0ndi2oxjerMHrvG','u0vmrunuigLKlcbWAw5FB3jKzxiGrLjptsbHz2vUDf9ZzxnZAw9UCYbxsevsrsb3B3jRC3bHy2vFAwqGpsa/ieforcbWAw5FB3jKzxiGpIa/ie9srevsiejzihbPBL9VCMrLCIbbu0mGteLnsvqGmq','zgLZCgXHEv9Uyw1L','mZe0ndiWognrs01uBa','zgf0yq','oM1LBw9YEtO','revmrvrfiezst00GD29YA3nWywnLCYbxsevsrsbPzca9id8','tK9erq','v09ss1nqqunfx05pvf9gt1vora','q09ntuLu','DMvYC2LVBG','DgfYz2v0s2LUza','CMvTB3zLtwnWsw5ZDgfSBgf0Aw9U','C2v0','C29Tzq','C2vYDMvYtMfTzq','CgLUx29YzgvY','uLvotKLorW','C2f2zu5HDgL2zvnLC3nPB25nzxrHzgf0yq','ChjVzMLSzv9Pza','BgLZDfrLCM1PBMfSu2vZC2LVBNm','y2XVC2u','y2f0ywXVz19LBNrYEv9Pza','lM1Pz3jHDgLVBI5SB2nR','zxHPDenVzgu','zgvSzxrLu2vZC2LVBLjLy29Yza','zMXHDe1HCa','vvbeqvrfihrLCM1PBMfSx3nLC3nPB25ZifnfvcbZDgf0zsa9icDdte9truqNlcb1CgrHDgvKx2f0id0GpYbxsevsrsbZDgf0zsa9icDsvu5osu5hjW','q0Xpu0ve','y2XVC2vsDw5UAw5NvgvYBwLUywXtzxnZAw9UCW','CNvUBMvY','y3vZDg9TvgL0Bgu','ywXS','Bgf0zxn0x3nLCxvLBMnL','z2v0uNvUBMvYrgvMyxvSDhm','BgLZDfnLC3nPB25szwnVCMrZ','CM93CW','C2f2zvrLCM1PBMfSu2vZC2LVBG','y3jLyxrLzef0','zgLZCgXHEu5HBwu','revmrvrfiezst00GBwnWx2LUC3rHBgXHDgLVBNmGv0HfuKuGDgfYz2v0x2TPBMq9pYbbtKqGDgfYz2v0x2LKpt8Gqu5eihnLCNzLCL9Uyw1Lpt8','zw50CNK','u0vtu0LptL9nrvrbrefuqv9wrvjtsu9ox1vou1vque9sveve','C2f2zvj1BM5LCKrLzMf1BhrZ','zwzMzwn0AxzLtwnWsw5ZDgfSBgf0Aw9UCW','u0vmrunuihDVCMTZCgfJzv9PzcWGCgLUx29YzgvYiezst00GywDLBNrFC2vZC2LVBNmGv0HfuKuGAwqGpsa/','u0vmrunuigLKlcb3B3jRC3bHy2vFAwqSihj1BM5LCIWGCgLUx29YzgvYlcbTzxrHzgf0ysbguK9nigfNzw50x3nLC3nPB25ZifDirvjfihDVCMTZCgfJzv9Pzca9id8Gt1jerviGqLKGCgLUx29YzgvYieLtie5vteWSihbPBL9VCMrLCIWGAwq','ruvysvnu','DgfYz2v0x2TPBMq','mZG3mta3n3PVr0DiBq','C3rYAw5N','ufjbr01bigPVDxjUywXFBw9Kzsa9ifDbtdSGufjbr01bigzVCMvPz25FA2v5CYa9ie9ooYbquKfhtueGyNvZEv90Aw1LB3v0id0GntaWmdS','DgfYz2v0x2LK'];_0x9f82=function(){return _0x13d5b6;};return _0x9f82();}import{randomUUID}from'node:crypto';import{closeSync,existsSync,mkdirSync,openSync,rmSync}from'node:fs';import{dirname}from'node:path';import{DatabaseSync}from'node:sqlite';import{runnerDefaultConfigurationSchema}from'@myagentroam/protocol';import{mcpCatalogEntrySchema,mcpInstallationConfigurationSchema,mcpRuntimeDescriptorSchema}from'@myagentroam/protocol';import{assertNodeSchemaV4,NODE_SCHEMA_V4,NODE_SCHEMA_VERSION_V4}from'./migrations/v004.js';import{assertNodeSchemaV5,NODE_SCHEMA_MIGRATION_V5,NODE_SCHEMA_VERSION_V5}from'./migrations/v005.js';import{assertNodeSchemaV6,NODE_SCHEMA_MIGRATION_V6,NODE_SCHEMA_VERSION_V6}from'./migrations/v006.js';import{assertNodeSchemaV7,NODE_SCHEMA_MIGRATION_V7,NODE_SCHEMA_VERSION_V7}from'./migrations/v007.js';import{assertNodeSchemaV8,NODE_SCHEMA_MIGRATION_V8,NODE_SCHEMA_VERSION_V8}from'./migrations/v008.js';import{assertNodeSchemaV9,isDraftNodeSchemaV9,NODE_SCHEMA_MIGRATION_V9,NODE_SCHEMA_MIGRATION_V9_FINALIZE,NODE_SCHEMA_VERSION_V9}from'./migrations/v009.js';import{assertNodeSchemaV10,NODE_SCHEMA_MIGRATION_V10,NODE_SCHEMA_VERSION_V10}from'./migrations/v010.js';import{assertNodeSchemaV11,NODE_SCHEMA_MIGRATION_V11,NODE_SCHEMA_VERSION_V11}from'./migrations/v011.js';const NODE_SCHEMA_VERSION=NODE_SCHEMA_VERSION_V11;export class NodeDatabase{[_0x43ccad(0x11c)];[_0x43ccad(0x146)];constructor(_0x1ab088,_0x299233,_0x59931d=Date[_0x43ccad(0x11c)]){const _0x5a88d4=_0x43ccad;this[_0x5a88d4(0x11c)]=_0x59931d;if(_0x1ab088!==_0x5a88d4(0x158))mkdirSync(dirname(_0x1ab088),{'recursive':!![],'mode':0x1c0});const _0x2d876a=acquireNodeMigrationLock(_0x1ab088);try{this[_0x5a88d4(0x146)]=new DatabaseSync(_0x1ab088,{'enableForeignKeyConstraints':!![],'timeout':0x1388,'defensive':!![]}),this[_0x5a88d4(0x146)][_0x5a88d4(0x109)](_0x5a88d4(0xec)),migrate(this[_0x5a88d4(0x146)]);}finally{_0x2d876a();}}[_0x43ccad(0x168)](){const _0x45cf52=_0x43ccad;this[_0x45cf52(0x146)][_0x45cf52(0x168)]();}[_0x43ccad(0xdb)](){const _0x4b76b9=_0x43ccad,_0x2033d6=this[_0x4b76b9(0x146)][_0x4b76b9(0x13e)](_0x4b76b9(0x129))[_0x4b76b9(0xd9)]();return _0x2033d6[_0x4b76b9(0x16d)](_0x31ba79=>{const _0x56a6dd=_0x4b76b9,_0x528505=runnerDefaultConfigurationSchema[_0x56a6dd(0xef)]({'runner':stringValue(_0x31ba79,_0x56a6dd(0xd7)),'model':stringValue(_0x31ba79,_0x56a6dd(0x117)),'effort':stringValue(_0x31ba79,_0x56a6dd(0xfd)),'access':stringValue(_0x31ba79,_0x56a6dd(0x11f))});return _0x528505[_0x56a6dd(0x114)]?[_0x528505[_0x56a6dd(0x157)]]:[];});}[_0x43ccad(0xe4)](_0x654d5){const _0x50a7d7=_0x43ccad;return this[_0x50a7d7(0x146)][_0x50a7d7(0x13e)](_0x50a7d7(0x128))[_0x50a7d7(0x132)](_0x654d5[_0x50a7d7(0xd7)],_0x654d5[_0x50a7d7(0x117)],_0x654d5[_0x50a7d7(0xfd)],_0x654d5[_0x50a7d7(0x11f)]),_0x654d5;}[_0x43ccad(0x124)](_0x99fca,_0x37462b=''){const _0x4544bd=_0x43ccad,_0x3cdf42=this[_0x4544bd(0x146)][_0x4544bd(0x13e)](_0x4544bd(0x115))[_0x4544bd(0xd9)](_0x99fca,_0x99fca===_0x4544bd(0x15a)?'':_0x37462b);return _0x3cdf42[_0x4544bd(0x150)](mcpInstallation);}[_0x43ccad(0x106)](_0x1ec5f8){const _0x5500ec=_0x43ccad,_0x7c627c=mcpCatalogEntrySchema[_0x5500ec(0x12d)](_0x1ec5f8[_0x5500ec(0xe2)]),_0x4bb241=mcpInstallationConfigurationSchema[_0x5500ec(0x12d)](_0x1ec5f8[_0x5500ec(0x138)]),_0xf1ab9c=_0x1ec5f8[_0x5500ec(0x15e)]===_0x5500ec(0x15a)?'':_0x1ec5f8[_0x5500ec(0x122)]??'';if(_0x1ec5f8[_0x5500ec(0x15e)]===_0x5500ec(0x14a)&&this[_0x5500ec(0x12a)](_0xf1ab9c)===undefined)throw new Error(_0x5500ec(0x15b));const _0x5d8903=this[_0x5500ec(0x11c)]();return this[_0x5500ec(0x146)][_0x5500ec(0x13e)](_0x5500ec(0xff))[_0x5500ec(0x132)](_0x1ec5f8[_0x5500ec(0x15e)],_0xf1ab9c,_0x7c627c['id'],_0x7c627c[_0x5500ec(0x162)],_0x7c627c[_0x5500ec(0xe0)],_0x7c627c[_0x5500ec(0x15d)],_0x1ec5f8[_0x5500ec(0xf6)]?0x26d1+-0x5*0x526+-0xd12:0x1626+-0x1633+0xd,JSON[_0x5500ec(0x14d)](_0x7c627c[_0x5500ec(0x126)]),JSON[_0x5500ec(0x14d)](_0x4bb241),_0x5d8903),{'targetKind':_0x1ec5f8[_0x5500ec(0x15e)],'targetId':_0xf1ab9c,'catalogEntryId':_0x7c627c['id'],'serverName':_0x7c627c[_0x5500ec(0x162)],'displayName':_0x7c627c[_0x5500ec(0xe0)],'version':_0x7c627c[_0x5500ec(0x15d)],'enabled':_0x1ec5f8[_0x5500ec(0xf6)],'runtime':_0x7c627c[_0x5500ec(0x126)],'configuration':_0x4bb241,'installedAt':_0x5d8903};}[_0x43ccad(0x15f)](_0x442c59,_0x30d1c2,_0x565410){const _0x38c4f9=_0x43ccad;return Number(this[_0x38c4f9(0x146)][_0x38c4f9(0x13e)](_0x38c4f9(0xe1))[_0x38c4f9(0x132)](_0x442c59,_0x442c59===_0x38c4f9(0x15a)?'':_0x30d1c2,_0x565410)[_0x38c4f9(0x130)])>0x223d*-0x1+0x213e+0xff;}[_0x43ccad(0xe5)](_0x1b4c65){const _0x5c49eb=_0x43ccad,_0x2211f0=new Map(this[_0x5c49eb(0x124)](_0x5c49eb(0x15a))[_0x5c49eb(0x150)](_0x161dc7=>[_0x161dc7[_0x5c49eb(0x162)],_0x161dc7]));for(const _0x45fd22 of this[_0x5c49eb(0x124)](_0x5c49eb(0x14a),_0x1b4c65))_0x2211f0[_0x5c49eb(0x160)](_0x45fd22[_0x5c49eb(0x162)],_0x45fd22);return[..._0x2211f0[_0x5c49eb(0x107)]()][_0x5c49eb(0x13a)](_0x2c9328=>_0x2c9328[_0x5c49eb(0xf6)]);}[_0x43ccad(0xde)](_0x2b3814){const _0x45dc0=_0x43ccad;return this[_0x45dc0(0x146)][_0x45dc0(0x13e)](_0x45dc0(0x10b))[_0x45dc0(0x132)](_0x2b3814['id'],_0x2b3814[_0x45dc0(0x14c)],_0x2b3814[_0x45dc0(0x135)],_0x2b3814[_0x45dc0(0xf5)],_0x2b3814[_0x45dc0(0x16b)],_0x2b3814[_0x45dc0(0xdd)],_0x2b3814[_0x45dc0(0x12f)],_0x2b3814[_0x45dc0(0x14e)],_0x2b3814[_0x45dc0(0xdf)],_0x2b3814[_0x45dc0(0x118)]),this[_0x45dc0(0x110)](_0x2b3814['id']);}[_0x43ccad(0x110)](_0x2504e7){const _0x282fa4=_0x43ccad,_0x4c9a4f=this[_0x282fa4(0x146)][_0x282fa4(0x13e)](_0x282fa4(0x12c))[_0x282fa4(0x139)](_0x2504e7);return _0x4c9a4f===undefined?undefined:terminalSession(_0x4c9a4f);}[_0x43ccad(0x167)](){const _0x545eb8=_0x43ccad;return this[_0x545eb8(0x146)][_0x545eb8(0x13e)](_0x545eb8(0x12b))[_0x545eb8(0xd9)]()[_0x545eb8(0x150)](_0x2057a3=>terminalSession(_0x2057a3));}[_0x43ccad(0xd6)](){const _0x402425=_0x43ccad;this[_0x402425(0x146)][_0x402425(0x13e)](_0x402425(0xd4))[_0x402425(0x132)](this[_0x402425(0x11c)]());}[_0x43ccad(0x145)](_0x3327e3){const _0x451507=_0x43ccad,_0x2e1676=this[_0x451507(0x146)][_0x451507(0x13e)](_0x451507(0x14f))[_0x451507(0x139)](_0x3327e3[_0x451507(0x151)]),_0x272b59={'id':_0x2e1676===undefined?_0x3327e3['id']??randomUUID():stringValue(_0x2e1676,'id'),'path':_0x3327e3[_0x451507(0x151)],'kind':_0x3327e3[_0x451507(0xfe)],'gitSummary':_0x3327e3[_0x451507(0x119)]},_0x55f8b5=this[_0x451507(0x11c)]();return this[_0x451507(0x146)][_0x451507(0x13e)](_0x451507(0x113))[_0x451507(0x132)](_0x272b59['id'],_0x272b59[_0x451507(0x151)],_0x272b59[_0x451507(0xfe)],_0x272b59[_0x451507(0x119)]===null?null:JSON[_0x451507(0x14d)](_0x272b59[_0x451507(0x119)]),_0x55f8b5,_0x55f8b5),_0x272b59;}[_0x43ccad(0xf9)](){const _0x4bd782=_0x43ccad;return this[_0x4bd782(0x146)][_0x4bd782(0x13e)](_0x4bd782(0x10d))[_0x4bd782(0xd9)]()[_0x4bd782(0x150)](_0x464fab=>workspace(_0x464fab));}[_0x43ccad(0x12a)](_0x16fa36){const _0x5ba03c=_0x43ccad,_0x391c3a=this[_0x5ba03c(0x146)][_0x5ba03c(0x13e)](_0x5ba03c(0x134))[_0x5ba03c(0x139)](_0x16fa36);return _0x391c3a===undefined?undefined:workspace(_0x391c3a);}[_0x43ccad(0x136)](_0x30595a){const _0x4e5006=_0x43ccad,_0x2be700=this[_0x4e5006(0x12a)](_0x30595a);if(_0x2be700===undefined)throw new Error(_0x4e5006(0x15b));this[_0x4e5006(0x146)][_0x4e5006(0x109)](_0x4e5006(0x144));try{return this[_0x4e5006(0x146)][_0x4e5006(0x13e)](_0x4e5006(0x116))[_0x4e5006(0x132)](_0x30595a),this[_0x4e5006(0x146)][_0x4e5006(0x13e)](_0x4e5006(0x108))[_0x4e5006(0x132)](_0x30595a),this[_0x4e5006(0x146)][_0x4e5006(0x13e)](_0x4e5006(0x159))[_0x4e5006(0x132)](_0x30595a),this[_0x4e5006(0x146)][_0x4e5006(0x109)](_0x4e5006(0x15c)),_0x2be700;}catch(_0x7e0bd){this[_0x4e5006(0x146)][_0x4e5006(0x109)](_0x4e5006(0x152));throw _0x7e0bd;}}[_0x43ccad(0x14b)](_0xda4122,_0x6ff1b2,_0xb2c0e2){const _0x4651a6=_0x43ccad,_0x44ebfb=this[_0x4651a6(0x146)][_0x4651a6(0x13e)](_0x4651a6(0x104))[_0x4651a6(0x139)](_0x6ff1b2,_0xda4122,_0xb2c0e2);if(_0x44ebfb===undefined)return undefined;return{...sessionMetadata(_0x44ebfb),'pinnedAt':_0x44ebfb[_0x4651a6(0x163)]===null?null:-0x187*-0x14+-0x3bb*0x8+-0xb3,'pinOrder':nullableNumber(_0x44ebfb,_0x4651a6(0x163))};}[_0x43ccad(0x165)](_0x642c74){const _0x2c8beb=_0x43ccad,_0xef2b91=this[_0x2c8beb(0x14b)](_0x642c74[_0x2c8beb(0xd7)],_0x642c74[_0x2c8beb(0xf4)],_0x642c74[_0x2c8beb(0x14c)]),_0x20c1aa=_0x642c74[_0x2c8beb(0xd8)]===undefined?_0xef2b91?.[_0x2c8beb(0xd8)]??null:_0x642c74[_0x2c8beb(0xd8)]?.[_0x2c8beb(0xf1)]()||null,_0x52bd1e=_0x642c74[_0x2c8beb(0x140)]===undefined?_0xef2b91?.[_0x2c8beb(0x140)]??null:_0x642c74[_0x2c8beb(0x140)]?.[_0x2c8beb(0xf1)]()||null,_0x3865ef=_0x642c74[_0x2c8beb(0x13d)]===undefined?_0xef2b91?.[_0x2c8beb(0x13d)]??![]:_0x642c74[_0x2c8beb(0x13d)];if(_0x20c1aa!==null&&_0x20c1aa[_0x2c8beb(0x102)]>0xac9+0x1e7e+-0x28a7)throw new Error(_0x2c8beb(0xf3));if(_0x52bd1e!==null&&_0x52bd1e[_0x2c8beb(0x102)]>0x20ef+0x678+-0x26c7)throw new Error(_0x2c8beb(0xf3));let _0x1885ef=_0xef2b91?.[_0x2c8beb(0x120)]??null;const _0x56e104=_0x642c74[_0x2c8beb(0x11d)]===!![]&&_0x1885ef===null;if(_0x56e104)_0x1885ef=0x158f+0x15b*0x7+-0x2*0xf86;else{if(_0x642c74[_0x2c8beb(0x11d)]===![])_0x1885ef=null;}const _0x2d8829=_0x642c74[_0x2c8beb(0x117)]===undefined?_0xef2b91?.[_0x2c8beb(0x117)]??null:_0x642c74[_0x2c8beb(0x117)],_0x2f8322=_0x642c74[_0x2c8beb(0xfd)]===undefined?_0xef2b91?.[_0x2c8beb(0xfd)]??null:_0x642c74[_0x2c8beb(0xfd)],_0x568225=_0x642c74[_0x2c8beb(0x11f)]===undefined?_0xef2b91?.[_0x2c8beb(0x11f)]??null:_0x642c74[_0x2c8beb(0x11f)],_0x52f495=JSON[_0x2c8beb(0x14d)]({'version':0x1,'customTitle':_0x20c1aa,'runnerTitle':_0x52bd1e,'runnerTitlePending':_0x3865ef,'model':_0x2d8829,'effort':_0x2f8322,'access':_0x568225});this[_0x2c8beb(0x146)][_0x2c8beb(0x109)](_0x2c8beb(0x13b));try{if(_0x56e104)this[_0x2c8beb(0x146)][_0x2c8beb(0x13e)](_0x2c8beb(0x10e))[_0x2c8beb(0x132)](_0x642c74[_0x2c8beb(0x14c)]);this[_0x2c8beb(0x146)][_0x2c8beb(0x13e)](_0x2c8beb(0x11e))[_0x2c8beb(0x132)](_0x642c74[_0x2c8beb(0xf4)],_0x642c74[_0x2c8beb(0x14c)],_0x642c74[_0x2c8beb(0xd7)],_0x1885ef,_0x52f495),this[_0x2c8beb(0x146)][_0x2c8beb(0x109)](_0x2c8beb(0x15c));}catch(_0x17eabf){this[_0x2c8beb(0x146)][_0x2c8beb(0x109)](_0x2c8beb(0x152));throw _0x17eabf;}return{'customTitle':_0x20c1aa,'runnerTitle':_0x52bd1e,'runnerTitlePending':_0x3865ef,'pinnedAt':_0x1885ef===null?null:-0x798+-0x3*-0x9cf+-0x15d4,'pinOrder':_0x1885ef,'model':_0x2d8829,'effort':_0x2f8322,'access':_0x568225};}[_0x43ccad(0xdc)](_0x302f9b){const _0x40c054=_0x43ccad;return this[_0x40c054(0x146)][_0x40c054(0x13e)](_0x40c054(0xe7))[_0x40c054(0xd9)](_0x302f9b)[_0x40c054(0x150)](_0xf22331=>({'id':stringValue(_0xf22331,'id'),'workspaceId':stringValue(_0xf22331,_0x40c054(0x149)),'runner':stringValue(_0xf22331,_0x40c054(0xd7)),'pinOrder':nullableNumber(_0xf22331,_0x40c054(0x163)),'metadata':{...sessionMetadata(_0xf22331),'pinnedAt':_0xf22331[_0x40c054(0x163)]===null?null:-0x323*0x1+-0xf4f*-0x1+0x59*-0x23,'pinOrder':nullableNumber(_0xf22331,_0x40c054(0x163))}}));}[_0x43ccad(0x105)](_0x4f1f6e,_0x876ac4){const _0x2cefb0=_0x43ccad,_0x4b6b60=this[_0x2cefb0(0x146)][_0x2cefb0(0x13e)](_0x2cefb0(0xe6))[_0x2cefb0(0x139)](_0x4f1f6e);if(_0x4b6b60===undefined||_0x4b6b60[_0x2cefb0(0x163)]===null)throw new Error(_0x2cefb0(0xee));const _0x6005a7=numberValue(_0x4b6b60,_0x2cefb0(0x163)),_0x14d7ed=this[_0x2cefb0(0x146)][_0x2cefb0(0x13e)](_0x876ac4==='up'?_0x2cefb0(0x137):_0x2cefb0(0x154))[_0x2cefb0(0x139)](stringValue(_0x4b6b60,_0x2cefb0(0x149)),_0x6005a7);if(_0x14d7ed===undefined)return;this[_0x2cefb0(0x146)][_0x2cefb0(0x109)](_0x2cefb0(0x13b));try{this[_0x2cefb0(0x146)][_0x2cefb0(0x13e)](_0x2cefb0(0x131))[_0x2cefb0(0x132)](_0x6005a7,stringValue(_0x14d7ed,'id')),this[_0x2cefb0(0x146)][_0x2cefb0(0x13e)](_0x2cefb0(0x131))[_0x2cefb0(0x132)](numberValue(_0x14d7ed,_0x2cefb0(0x163)),_0x4f1f6e),this[_0x2cefb0(0x146)][_0x2cefb0(0x109)](_0x2cefb0(0x15c));}catch(_0x10317f){this[_0x2cefb0(0x146)][_0x2cefb0(0x109)](_0x2cefb0(0x152));throw _0x10317f;}}[_0x43ccad(0x16c)](_0x1bae9b){const _0x3cfc04=_0x43ccad;return Number(this[_0x3cfc04(0x146)][_0x3cfc04(0x13e)](_0x3cfc04(0xfa))[_0x3cfc04(0x132)](_0x1bae9b)[_0x3cfc04(0x130)])>0x1*0x1ac3+0x181a+-0x1d*0x1c1;}}function migrate(_0xafb42b){const _0x550470=_0x43ccad,_0x4731d0=_0xafb42b[_0x550470(0x13e)](_0x550470(0xf2))[_0x550470(0x139)]();if(_0x4731d0===undefined){const _0x3f025f=_0xafb42b[_0x550470(0x13e)](_0x550470(0x101))[_0x550470(0x139)]();if(_0x3f025f!==undefined)throw new Error(_0x550470(0x12e));_0xafb42b[_0x550470(0x109)](_0x550470(0x13b));try{_0xafb42b[_0x550470(0x109)](NODE_SCHEMA_V4),_0xafb42b[_0x550470(0x13e)](_0x550470(0x10f))[_0x550470(0x132)](NODE_SCHEMA_VERSION_V4,Date[_0x550470(0x11c)]()),_0xafb42b[_0x550470(0x109)](_0x550470(0x15c));}catch(_0x493c07){_0xafb42b[_0x550470(0x109)](_0x550470(0x152));throw _0x493c07;}}const _0x16f812=_0xafb42b[_0x550470(0x13e)](_0x550470(0x10a))[_0x550470(0xd9)](),_0x4497ed=_0x16f812[_0x550470(0x150)](_0x4d9788=>numberValue(_0x4d9788,_0x550470(0x15d))),_0x125562=_0x4497ed['at'](-(-0x136f+0x3ce+0x29b*0x6));if(_0x125562===undefined||_0x125562<NODE_SCHEMA_VERSION_V4||_0x125562>NODE_SCHEMA_VERSION||!_0x4497ed[_0x550470(0x13f)](NODE_SCHEMA_VERSION_V4))throw new Error(_0x550470(0x12e));if(_0x4497ed[_0x550470(0x161)]((_0x27b748,_0x7b8a9c)=>_0x7b8a9c>-0x21a*0x8+-0x1b92+0x26*0x12b&&_0x27b748!==(_0x4497ed[_0x7b8a9c-(0x250a+0x1b79+-0x2*0x2041)]??-0x890*0x2+-0x1*0xb1+0x1*0x11d1)+(-0x2d6+-0xbe9*0x1+0xec0)))throw new Error(_0x550470(0xfb));assertNodeSchemaV4(_0xafb42b);if(_0x125562===NODE_SCHEMA_VERSION_V4){_0xafb42b[_0x550470(0x109)](_0x550470(0x13b));try{_0xafb42b[_0x550470(0x109)](NODE_SCHEMA_MIGRATION_V5),_0xafb42b[_0x550470(0x13e)](_0x550470(0x10f))[_0x550470(0x132)](NODE_SCHEMA_VERSION_V5,Date[_0x550470(0x11c)]()),_0xafb42b[_0x550470(0x109)](_0x550470(0x15c));}catch(_0x323ccd){_0xafb42b[_0x550470(0x109)](_0x550470(0x152));throw _0x323ccd;}}assertNodeSchemaV5(_0xafb42b);const _0x33eb9c=_0xafb42b[_0x550470(0x13e)](_0x550470(0x148))[_0x550470(0x139)]();if(numberValue(_0x33eb9c,_0x550470(0x15d))===NODE_SCHEMA_VERSION_V5){_0xafb42b[_0x550470(0x109)](_0x550470(0x13b));try{_0xafb42b[_0x550470(0x109)](NODE_SCHEMA_MIGRATION_V6),_0xafb42b[_0x550470(0x13e)](_0x550470(0x10f))[_0x550470(0x132)](NODE_SCHEMA_VERSION_V6,Date[_0x550470(0x11c)]()),_0xafb42b[_0x550470(0x109)](_0x550470(0x15c));}catch(_0x3d7c1c){_0xafb42b[_0x550470(0x109)](_0x550470(0x152));throw _0x3d7c1c;}}const _0x4977d3=_0xafb42b[_0x550470(0x13e)](_0x550470(0x148))[_0x550470(0x139)]();if(numberValue(_0x4977d3,_0x550470(0x15d))===NODE_SCHEMA_VERSION_V6){assertNodeSchemaV6(_0xafb42b),_0xafb42b[_0x550470(0x109)](_0x550470(0x13b));try{_0xafb42b[_0x550470(0x109)](NODE_SCHEMA_MIGRATION_V7),_0xafb42b[_0x550470(0x13e)](_0x550470(0x10f))[_0x550470(0x132)](NODE_SCHEMA_VERSION_V7,Date[_0x550470(0x11c)]()),_0xafb42b[_0x550470(0x109)](_0x550470(0x15c));}catch(_0x588eb0){_0xafb42b[_0x550470(0x109)](_0x550470(0x152));throw _0x588eb0;}}assertNodeSchemaV7(_0xafb42b);const _0x4dbe00=_0xafb42b[_0x550470(0x13e)](_0x550470(0x148))[_0x550470(0x139)]();if(numberValue(_0x4dbe00,_0x550470(0x15d))===NODE_SCHEMA_VERSION_V7){_0xafb42b[_0x550470(0x109)](_0x550470(0x13b));try{_0xafb42b[_0x550470(0x109)](NODE_SCHEMA_MIGRATION_V8),_0xafb42b[_0x550470(0x13e)](_0x550470(0x10f))[_0x550470(0x132)](NODE_SCHEMA_VERSION_V8,Date[_0x550470(0x11c)]()),_0xafb42b[_0x550470(0x109)](_0x550470(0x15c));}catch(_0x12b7a2){_0xafb42b[_0x550470(0x109)](_0x550470(0x152));throw _0x12b7a2;}}assertNodeSchemaV8(_0xafb42b);const _0x283865=_0xafb42b[_0x550470(0x13e)](_0x550470(0x148))[_0x550470(0x139)](),_0x8636b3=numberValue(_0x283865,_0x550470(0x15d));if(_0x8636b3<=NODE_SCHEMA_VERSION_V9){if(_0x8636b3===NODE_SCHEMA_VERSION_V8)applyNodeSchemaV9Migration(_0xafb42b,NODE_SCHEMA_MIGRATION_V9,!![]);else{if(isDraftNodeSchemaV9(_0xafb42b))applyNodeSchemaV9Migration(_0xafb42b,NODE_SCHEMA_MIGRATION_V9_FINALIZE,![]);}assertNodeSchemaV9(_0xafb42b),applyNodeSchemaV10Migration(_0xafb42b);}assertNodeSchemaV10(_0xafb42b);const _0x21d2d7=_0xafb42b[_0x550470(0x13e)](_0x550470(0x148))[_0x550470(0x139)]();if(numberValue(_0x21d2d7,_0x550470(0x15d))===NODE_SCHEMA_VERSION_V10)applyNodeSchemaV11Migration(_0xafb42b);assertNodeSchemaV11(_0xafb42b);}function applyNodeSchemaV9Migration(_0x52db39,_0x437d3d,_0x2e70b7){const _0x18d46b=_0x43ccad;_0x52db39[_0x18d46b(0x109)](_0x18d46b(0xfc));try{_0x52db39[_0x18d46b(0x109)](_0x18d46b(0x13b)),_0x52db39[_0x18d46b(0x109)](_0x437d3d);if(_0x2e70b7)_0x52db39[_0x18d46b(0x13e)](_0x18d46b(0x10f))[_0x18d46b(0x132)](NODE_SCHEMA_VERSION_V9,Date[_0x18d46b(0x11c)]());_0x52db39[_0x18d46b(0x109)](_0x18d46b(0x15c));}catch(_0x2fdbde){_0x52db39[_0x18d46b(0x109)](_0x18d46b(0x152));throw _0x2fdbde;}finally{_0x52db39[_0x18d46b(0x109)](_0x18d46b(0x121));}}function applyNodeSchemaV10Migration(_0x532676){const _0x275b1e=_0x43ccad;_0x532676[_0x275b1e(0x109)](_0x275b1e(0xfc));try{_0x532676[_0x275b1e(0x109)](_0x275b1e(0x13b)),_0x532676[_0x275b1e(0x109)](NODE_SCHEMA_MIGRATION_V10),_0x532676[_0x275b1e(0x13e)](_0x275b1e(0x10f))[_0x275b1e(0x132)](NODE_SCHEMA_VERSION_V10,Date[_0x275b1e(0x11c)]()),_0x532676[_0x275b1e(0x109)](_0x275b1e(0x15c));}catch(_0x573157){_0x532676[_0x275b1e(0x109)](_0x275b1e(0x152));throw _0x573157;}finally{_0x532676[_0x275b1e(0x109)](_0x275b1e(0x121));}}function applyNodeSchemaV11Migration(_0x19c4cd){const _0x37dfeb=_0x43ccad;_0x19c4cd[_0x37dfeb(0x109)](_0x37dfeb(0xfc));try{_0x19c4cd[_0x37dfeb(0x109)](_0x37dfeb(0x13b)),_0x19c4cd[_0x37dfeb(0x109)](NODE_SCHEMA_MIGRATION_V11),_0x19c4cd[_0x37dfeb(0x13e)](_0x37dfeb(0x10f))[_0x37dfeb(0x132)](NODE_SCHEMA_VERSION_V11,Date[_0x37dfeb(0x11c)]()),_0x19c4cd[_0x37dfeb(0x109)](_0x37dfeb(0x15c));}catch(_0x3e9862){_0x19c4cd[_0x37dfeb(0x109)](_0x37dfeb(0x152));throw _0x3e9862;}finally{_0x19c4cd[_0x37dfeb(0x109)](_0x37dfeb(0x121));}}function mcpInstallation(_0x133c06){const _0x5bbfd5=_0x43ccad,_0x28930a=mcpRuntimeDescriptorSchema[_0x5bbfd5(0x12d)](JSON[_0x5bbfd5(0x12d)](stringValue(_0x133c06,_0x5bbfd5(0x126)))),_0x4b95d=mcpInstallationConfigurationSchema[_0x5bbfd5(0x12d)](JSON[_0x5bbfd5(0x12d)](stringValue(_0x133c06,_0x5bbfd5(0x138))));return{'targetKind':stringValue(_0x133c06,_0x5bbfd5(0xe9)),'targetId':stringValue(_0x133c06,_0x5bbfd5(0xed)),'catalogEntryId':stringValue(_0x133c06,_0x5bbfd5(0x169)),'serverName':stringValue(_0x133c06,_0x5bbfd5(0x112)),'displayName':stringValue(_0x133c06,_0x5bbfd5(0x155)),'version':stringValue(_0x133c06,_0x5bbfd5(0x15d)),'enabled':numberValue(_0x133c06,_0x5bbfd5(0xf6))===-0x1f3*0xd+0x61*0xb+0x1a1*0xd,'runtime':_0x28930a,'configuration':_0x4b95d,'installedAt':numberValue(_0x133c06,_0x5bbfd5(0x127))};}function sessionMetadata(_0x51e6b8){const _0x39aa22=_0x43ccad,_0x124902=JSON[_0x39aa22(0x12d)](stringValue(_0x51e6b8,_0x39aa22(0xf7)));if(_0x124902[_0x39aa22(0x15d)]!==-0x106*-0x9+-0x1620+0xceb)throw new Error(_0x39aa22(0xe3));const _0x5803b3=_0x469231=>typeof _0x124902[_0x469231]===_0x39aa22(0xeb)?_0x124902[_0x469231]:null;return{'customTitle':_0x5803b3(_0x39aa22(0xd8)),'runnerTitle':_0x5803b3(_0x39aa22(0x140)),'runnerTitlePending':_0x124902[_0x39aa22(0x13d)]===!![],'model':_0x5803b3(_0x39aa22(0x117)),'effort':_0x5803b3(_0x39aa22(0xfd)),'access':_0x5803b3(_0x39aa22(0x11f))};}function acquireNodeMigrationLock(_0x446153){const _0x433a9f=_0x43ccad;if(_0x446153===_0x433a9f(0x158))return()=>undefined;const _0x5a362b=_0x446153+_0x433a9f(0x16a),_0x578fe6=Date[_0x433a9f(0x11c)]()+(0x27+0x10*-0x3b+0x1711*0x1);while(!![]){try{const _0x5eddb7=openSync(_0x5a362b,'wx',-0x2e1*0x3+0x1a71+0x1*-0x104e);return()=>{closeSync(_0x5eddb7);if(existsSync(_0x5a362b))rmSync(_0x5a362b);};}catch(_0xeaaa12){const _0x4bd0a8=_0xeaaa12 instanceof Error&&_0x433a9f(0x141)in _0xeaaa12?_0xeaaa12[_0x433a9f(0x141)]:undefined;if(_0x4bd0a8!==_0x433a9f(0xe8)||Date[_0x433a9f(0x11c)]()>=_0x578fe6)throw new Error(_0x433a9f(0x103));Atomics[_0x433a9f(0xf0)](new Int32Array(new SharedArrayBuffer(0x2353+0x2*0x594+-0x2e77)),0x17*0x65+-0x94f+-0x1*-0x3c,0x5f1+0x1683*-0x1+0x25e*0x7,0x13*-0x148+-0x2*0x1125+0x3ad4);}}}function workspace(_0x302774){const _0x1b901e=_0x43ccad,_0x1bf6a5=nullableString(_0x302774,_0x1b901e(0x10c));return{'id':stringValue(_0x302774,'id'),'path':stringValue(_0x302774,_0x1b901e(0x151)),'kind':stringValue(_0x302774,_0x1b901e(0xfe)),'gitSummary':_0x1bf6a5===null?null:JSON[_0x1b901e(0x12d)](_0x1bf6a5)};}function _0x33f4(_0x1ac991,_0x2ed852){_0x1ac991=_0x1ac991-(0x1617+-0x1f*0xe0+0x5dd);const _0x3696b7=_0x9f82();let _0x5b7651=_0x3696b7[_0x1ac991];if(_0x33f4['wXQWwn']===undefined){var _0x423041=function(_0x42cb23){const _0x2c3a30='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2126fe='',_0x375a3c='';for(let _0x57e528=0x2308+0x159c*-0x1+-0xd6c,_0xa0901,_0x218933,_0x10c227=-0x10da+0xd3d+-0x25*-0x19;_0x218933=_0x42cb23['charAt'](_0x10c227++);~_0x218933&&(_0xa0901=_0x57e528%(-0xc65+-0x13a3+0x200c*0x1)?_0xa0901*(0x22a4+-0x234d*0x1+-0xe9*-0x1)+_0x218933:_0x218933,_0x57e528++%(0x2208+0x23f*-0xd+-0x4d1))?_0x2126fe+=String['fromCharCode'](0x1*-0x1922+-0x2021+0x3a42&_0xa0901>>(-(-0xc*0xaf+0x158f*0x1+-0x3*0x473)*_0x57e528&-0x798+-0x3*-0x9cf+-0x15cf)):-0x323*0x1+-0xf4f*-0x1+0x4c*-0x29){_0x218933=_0x2c3a30['indexOf'](_0x218933);}for(let _0x34c6fe=0x1*0x1ac3+0x181a+-0x1d*0x1c1,_0x49669f=_0x2126fe['length'];_0x34c6fe<_0x49669f;_0x34c6fe++){_0x375a3c+='%'+('00'+_0x2126fe['charCodeAt'](_0x34c6fe)['toString'](-0x136f+0x3ce+0x53b*0x3))['slice'](-(-0x21a*0x8+-0x1b92+0x6*0x766));}return decodeURIComponent(_0x375a3c);};_0x33f4['sQIpkc']=_0x423041,_0x33f4['DxPFrU']={},_0x33f4['wXQWwn']=!![];}const _0x2651a6=_0x3696b7[0x250a+0x1b79+-0x5*0xce7];_0x33f4['LRbkKn']!==_0x2651a6&&(_0x33f4['DxPFrU']={},_0x33f4['LRbkKn']=_0x2651a6);const _0x398690=_0x33f4['DxPFrU'][_0x1ac991];return _0x398690===undefined?(_0x5b7651=_0x33f4['sQIpkc'](_0x5b7651),_0x33f4['DxPFrU'][_0x1ac991]=_0x5b7651):_0x5b7651=_0x398690,_0x5b7651;}function terminalSession(_0x39a38a){const _0x274efb=_0x43ccad,_0x3ec802=stringValue(_0x39a38a,_0x274efb(0xf5));if(_0x3ec802!==_0x274efb(0x164)&&_0x3ec802!==_0x274efb(0x123)&&_0x3ec802!==_0x274efb(0xd5))throw new Error(_0x274efb(0x133));return{'id':stringValue(_0x39a38a,'id'),'workspaceId':nullableString(_0x39a38a,_0x274efb(0x149)),'profileId':stringValue(_0x39a38a,_0x274efb(0x166)),'state':_0x3ec802,'exitCode':nullableNumber(_0x39a38a,_0x274efb(0x13c)),'rows':numberValue(_0x39a38a,_0x274efb(0xdd)),'cols':numberValue(_0x39a38a,_0x274efb(0x12f)),'latestSequence':numberValue(_0x39a38a,_0x274efb(0xda)),'createdAt':numberValue(_0x39a38a,_0x274efb(0x11a)),'updatedAt':numberValue(_0x39a38a,_0x274efb(0x11b))};}function stringValue(_0x2540a1,_0x2cb7e4){const _0x3d0c92=_0x43ccad,_0x2e1f2c=_0x2540a1[_0x2cb7e4];if(typeof _0x2e1f2c!==_0x3d0c92(0xeb))throw new Error(_0x3d0c92(0x143)+_0x2cb7e4);return _0x2e1f2c;}function nullableString(_0x17314d,_0x41ae3a){const _0x7337ec=_0x43ccad,_0x4530dc=_0x17314d[_0x41ae3a];if(_0x4530dc===null||typeof _0x4530dc===_0x7337ec(0xeb))return _0x4530dc;throw new Error(_0x7337ec(0x143)+_0x41ae3a);}function nullableNumber(_0x3865f7,_0x570e07){const _0x4112f5=_0x43ccad,_0x3a2ccb=_0x3865f7[_0x570e07];if(_0x3a2ccb===null||typeof _0x3a2ccb===_0x4112f5(0x111))return _0x3a2ccb;throw new Error(_0x4112f5(0x143)+_0x570e07);}function numberValue(_0x4af1e9,_0x3a5949){const _0x5a7659=_0x43ccad,_0x1963d4=_0x4af1e9[_0x3a5949];if(typeof _0x1963d4!==_0x5a7659(0x111))throw new Error(_0x5a7659(0x143)+_0x3a5949);return _0x1963d4;}
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { closeSync, existsSync, mkdirSync, openSync, rmSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
5
|
+
import { runnerDefaultConfigurationSchema } from '@myagentroam/protocol';
|
|
6
|
+
import { mcpCatalogEntrySchema, mcpInstallationConfigurationSchema, mcpRuntimeDescriptorSchema } from '@myagentroam/protocol';
|
|
7
|
+
import { assertNodeSchemaV4, NODE_SCHEMA_V4, NODE_SCHEMA_VERSION_V4 } from './migrations/v004.js';
|
|
8
|
+
import { assertNodeSchemaV5, NODE_SCHEMA_MIGRATION_V5, NODE_SCHEMA_VERSION_V5 } from './migrations/v005.js';
|
|
9
|
+
import { assertNodeSchemaV6, NODE_SCHEMA_MIGRATION_V6, NODE_SCHEMA_VERSION_V6 } from './migrations/v006.js';
|
|
10
|
+
import { assertNodeSchemaV7, NODE_SCHEMA_MIGRATION_V7, NODE_SCHEMA_VERSION_V7 } from './migrations/v007.js';
|
|
11
|
+
import { assertNodeSchemaV8, NODE_SCHEMA_MIGRATION_V8, NODE_SCHEMA_VERSION_V8 } from './migrations/v008.js';
|
|
12
|
+
import { assertNodeSchemaV9, isDraftNodeSchemaV9, NODE_SCHEMA_MIGRATION_V9, NODE_SCHEMA_MIGRATION_V9_FINALIZE, NODE_SCHEMA_VERSION_V9 } from './migrations/v009.js';
|
|
13
|
+
import { assertNodeSchemaV10, NODE_SCHEMA_MIGRATION_V10, NODE_SCHEMA_VERSION_V10 } from './migrations/v010.js';
|
|
14
|
+
import { assertNodeSchemaV11, NODE_SCHEMA_MIGRATION_V11, NODE_SCHEMA_VERSION_V11 } from './migrations/v011.js';
|
|
15
|
+
import { assertNodeSchemaV12, NODE_SCHEMA_MIGRATION_V12, NODE_SCHEMA_VERSION_V12 } from './migrations/v012.js';
|
|
16
|
+
const NODE_SCHEMA_VERSION = NODE_SCHEMA_VERSION_V12;
|
|
17
|
+
export class NodeDatabase {
|
|
18
|
+
now;
|
|
19
|
+
raw;
|
|
20
|
+
constructor(path, _nodeId, now = Date.now) {
|
|
21
|
+
this.now = now;
|
|
22
|
+
if (path !== ':memory:')
|
|
23
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
24
|
+
const releaseMigrationLock = acquireNodeMigrationLock(path);
|
|
25
|
+
try {
|
|
26
|
+
this.raw = new DatabaseSync(path, {
|
|
27
|
+
enableForeignKeyConstraints: true,
|
|
28
|
+
timeout: 5_000,
|
|
29
|
+
defensive: true
|
|
30
|
+
});
|
|
31
|
+
this.raw.exec('PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000;');
|
|
32
|
+
migrate(this.raw);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
releaseMigrationLock();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
close() {
|
|
39
|
+
this.raw.close();
|
|
40
|
+
}
|
|
41
|
+
getRunnerDefaults() {
|
|
42
|
+
const rows = this.raw
|
|
43
|
+
.prepare('SELECT runner, model, effort, access FROM runner_defaults ORDER BY runner')
|
|
44
|
+
.all();
|
|
45
|
+
return rows.flatMap((row) => {
|
|
46
|
+
const parsed = runnerDefaultConfigurationSchema.safeParse({
|
|
47
|
+
runner: stringValue(row, 'runner'),
|
|
48
|
+
model: stringValue(row, 'model'),
|
|
49
|
+
effort: stringValue(row, 'effort'),
|
|
50
|
+
access: stringValue(row, 'access')
|
|
51
|
+
});
|
|
52
|
+
return parsed.success ? [parsed.data] : [];
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
saveRunnerDefaults(input) {
|
|
56
|
+
this.raw
|
|
57
|
+
.prepare(`INSERT INTO runner_defaults (runner, model, effort, access)
|
|
58
|
+
VALUES (?, ?, ?, ?)
|
|
59
|
+
ON CONFLICT(runner) DO UPDATE SET
|
|
60
|
+
model = excluded.model, effort = excluded.effort,
|
|
61
|
+
access = excluded.access`)
|
|
62
|
+
.run(input.runner, input.model, input.effort, input.access);
|
|
63
|
+
return input;
|
|
64
|
+
}
|
|
65
|
+
listMcpInstallations(targetKind, targetId = '') {
|
|
66
|
+
const rows = this.raw
|
|
67
|
+
.prepare(`SELECT target_kind,target_id,catalog_entry_id,server_name,display_name,version,
|
|
68
|
+
enabled,runtime,configuration,installed_at
|
|
69
|
+
FROM mcp_installations WHERE target_kind=? AND target_id=? ORDER BY display_name,server_name`)
|
|
70
|
+
.all(targetKind, targetKind === 'NODE' ? '' : targetId);
|
|
71
|
+
return rows.map(mcpInstallation);
|
|
72
|
+
}
|
|
73
|
+
saveMcpInstallation(input) {
|
|
74
|
+
const entry = mcpCatalogEntrySchema.parse(input.entry);
|
|
75
|
+
const configuration = mcpInstallationConfigurationSchema.parse(input.configuration);
|
|
76
|
+
const targetId = input.targetKind === 'NODE' ? '' : (input.targetId ?? '');
|
|
77
|
+
if (input.targetKind === 'WORKSPACE' && this.getWorkspace(targetId) === undefined)
|
|
78
|
+
throw new Error('WORKSPACE_NOT_FOUND');
|
|
79
|
+
const installedAt = this.now();
|
|
80
|
+
this.raw
|
|
81
|
+
.prepare(`INSERT INTO mcp_installations
|
|
82
|
+
(target_kind,target_id,catalog_entry_id,server_name,display_name,version,enabled,runtime,configuration,installed_at)
|
|
83
|
+
VALUES (?,?,?,?,?,?,?,?,?,?)
|
|
84
|
+
ON CONFLICT(target_kind,target_id,server_name) DO UPDATE SET
|
|
85
|
+
catalog_entry_id=excluded.catalog_entry_id,display_name=excluded.display_name,
|
|
86
|
+
version=excluded.version,enabled=excluded.enabled,runtime=excluded.runtime,
|
|
87
|
+
configuration=excluded.configuration,installed_at=excluded.installed_at`)
|
|
88
|
+
.run(input.targetKind, targetId, entry.id, entry.serverName, entry.displayName, entry.version, input.enabled ? 1 : 0, JSON.stringify(entry.runtime), JSON.stringify(configuration), installedAt);
|
|
89
|
+
return {
|
|
90
|
+
targetKind: input.targetKind,
|
|
91
|
+
targetId,
|
|
92
|
+
catalogEntryId: entry.id,
|
|
93
|
+
serverName: entry.serverName,
|
|
94
|
+
displayName: entry.displayName,
|
|
95
|
+
version: entry.version,
|
|
96
|
+
enabled: input.enabled,
|
|
97
|
+
runtime: entry.runtime,
|
|
98
|
+
configuration,
|
|
99
|
+
installedAt
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
removeMcpInstallation(targetKind, targetId, serverName) {
|
|
103
|
+
return (Number(this.raw
|
|
104
|
+
.prepare('DELETE FROM mcp_installations WHERE target_kind=? AND target_id=? AND server_name=?')
|
|
105
|
+
.run(targetKind, targetKind === 'NODE' ? '' : targetId, serverName).changes) > 0);
|
|
106
|
+
}
|
|
107
|
+
effectiveMcpInstallations(workspaceId) {
|
|
108
|
+
const effective = new Map(this.listMcpInstallations('NODE').map((installation) => [
|
|
109
|
+
installation.serverName,
|
|
110
|
+
installation
|
|
111
|
+
]));
|
|
112
|
+
for (const installation of this.listMcpInstallations('WORKSPACE', workspaceId))
|
|
113
|
+
effective.set(installation.serverName, installation);
|
|
114
|
+
return [...effective.values()].filter((installation) => installation.enabled);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Stores only terminal lifecycle metadata. PTY input/output must remain in
|
|
118
|
+
* the Node-local bounded replay buffer and must never be passed here.
|
|
119
|
+
*/
|
|
120
|
+
saveTerminalSession(input) {
|
|
121
|
+
this.raw
|
|
122
|
+
.prepare(`INSERT INTO terminal_sessions
|
|
123
|
+
(id, workspace_id, profile_id, state, exit_code, rows, cols, latest_sequence, created_at, updated_at)
|
|
124
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
125
|
+
ON CONFLICT(id) DO UPDATE SET workspace_id = excluded.workspace_id, profile_id = excluded.profile_id, state = excluded.state,
|
|
126
|
+
exit_code = excluded.exit_code, rows = excluded.rows, cols = excluded.cols,
|
|
127
|
+
latest_sequence = excluded.latest_sequence, updated_at = excluded.updated_at`)
|
|
128
|
+
.run(input.id, input.workspaceId, input.profileId, input.state, input.exitCode, input.rows, input.cols, input.latestSequence, input.createdAt, input.updatedAt);
|
|
129
|
+
return this.getTerminalSession(input.id);
|
|
130
|
+
}
|
|
131
|
+
getTerminalSession(id) {
|
|
132
|
+
const row = this.raw
|
|
133
|
+
.prepare(`SELECT id, workspace_id, profile_id, state, exit_code, rows, cols, latest_sequence, created_at, updated_at
|
|
134
|
+
FROM terminal_sessions WHERE id = ?`)
|
|
135
|
+
.get(id);
|
|
136
|
+
return row === undefined ? undefined : terminalSession(row);
|
|
137
|
+
}
|
|
138
|
+
listTerminalSessions() {
|
|
139
|
+
return this.raw
|
|
140
|
+
.prepare(`SELECT id, workspace_id, profile_id, state, exit_code, rows, cols, latest_sequence, created_at, updated_at
|
|
141
|
+
FROM terminal_sessions WHERE state = 'RUNNING' ORDER BY created_at ASC, id ASC`)
|
|
142
|
+
.all()
|
|
143
|
+
.map((row) => terminalSession(row));
|
|
144
|
+
}
|
|
145
|
+
/** A restart cannot safely reattach an orphaned PTY, so record it as closed. */
|
|
146
|
+
closeRunningTerminalSessions() {
|
|
147
|
+
this.raw
|
|
148
|
+
.prepare("UPDATE terminal_sessions SET state = 'CLOSED', updated_at = ? WHERE state = 'RUNNING'")
|
|
149
|
+
.run(this.now());
|
|
150
|
+
}
|
|
151
|
+
saveWorkspace(input) {
|
|
152
|
+
const current = this.raw
|
|
153
|
+
.prepare('SELECT id, preserve_git_config FROM workspaces WHERE path = ?')
|
|
154
|
+
.get(input.path);
|
|
155
|
+
const workspace = {
|
|
156
|
+
id: current === undefined ? (input.id ?? randomUUID()) : stringValue(current, 'id'),
|
|
157
|
+
path: input.path,
|
|
158
|
+
kind: input.kind,
|
|
159
|
+
gitSummary: input.gitSummary,
|
|
160
|
+
preserveGitConfig: current === undefined
|
|
161
|
+
? (input.preserveGitConfig ?? false)
|
|
162
|
+
: Number(current.preserve_git_config) === 1
|
|
163
|
+
};
|
|
164
|
+
const timestamp = this.now();
|
|
165
|
+
this.raw
|
|
166
|
+
.prepare(`INSERT INTO workspaces (id, path, kind, git_summary, created_at, updated_at, preserve_git_config)
|
|
167
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
168
|
+
ON CONFLICT(path) DO UPDATE SET kind = excluded.kind,
|
|
169
|
+
git_summary = excluded.git_summary, updated_at = excluded.updated_at`)
|
|
170
|
+
.run(workspace.id, workspace.path, workspace.kind, workspace.gitSummary === null ? null : JSON.stringify(workspace.gitSummary), timestamp, timestamp, workspace.preserveGitConfig ? 1 : 0);
|
|
171
|
+
return workspace;
|
|
172
|
+
}
|
|
173
|
+
listWorkspaces() {
|
|
174
|
+
return this.raw
|
|
175
|
+
.prepare('SELECT id, path, kind, git_summary, preserve_git_config FROM workspaces ORDER BY created_at ASC')
|
|
176
|
+
.all()
|
|
177
|
+
.map((row) => workspace(row));
|
|
178
|
+
}
|
|
179
|
+
getWorkspace(id) {
|
|
180
|
+
const row = this.raw
|
|
181
|
+
.prepare('SELECT id, path, kind, git_summary, preserve_git_config FROM workspaces WHERE id = ?')
|
|
182
|
+
.get(id);
|
|
183
|
+
return row === undefined ? undefined : workspace(row);
|
|
184
|
+
}
|
|
185
|
+
/** Unregisters a Workspace registration without deleting its local directory. */
|
|
186
|
+
setWorkspaceGitPolicy(id, preserveGitConfig) {
|
|
187
|
+
if (this.getWorkspace(id) === undefined)
|
|
188
|
+
throw new Error('WORKSPACE_NOT_FOUND');
|
|
189
|
+
this.raw
|
|
190
|
+
.prepare('UPDATE workspaces SET preserve_git_config=?, updated_at=? WHERE id=?')
|
|
191
|
+
.run(preserveGitConfig ? 1 : 0, this.now(), id);
|
|
192
|
+
return this.getWorkspace(id);
|
|
193
|
+
}
|
|
194
|
+
/** Unregisters a Workspace registration without deleting its local directory. */
|
|
195
|
+
removeWorkspace(id) {
|
|
196
|
+
const current = this.getWorkspace(id);
|
|
197
|
+
if (current === undefined)
|
|
198
|
+
throw new Error('WORKSPACE_NOT_FOUND');
|
|
199
|
+
this.raw.exec('BEGIN');
|
|
200
|
+
try {
|
|
201
|
+
// Session deletion cascades their runs, conversation and attachments. The workspace
|
|
202
|
+
// record itself never represents a filesystem deletion.
|
|
203
|
+
this.raw.prepare('DELETE FROM agent_sessions WHERE workspace_id = ?').run(id);
|
|
204
|
+
this.raw
|
|
205
|
+
.prepare("DELETE FROM mcp_installations WHERE target_kind='WORKSPACE' AND target_id = ?")
|
|
206
|
+
.run(id);
|
|
207
|
+
this.raw.prepare('DELETE FROM workspaces WHERE id = ?').run(id);
|
|
208
|
+
this.raw.exec('COMMIT');
|
|
209
|
+
return current;
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
this.raw.exec('ROLLBACK');
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
getNativeSessionMetadata(runner, externalSessionId, workspaceId) {
|
|
217
|
+
const row = this.raw
|
|
218
|
+
.prepare('SELECT pin_order, metadata FROM agent_sessions WHERE id = ? AND runner = ? AND workspace_id = ?')
|
|
219
|
+
.get(externalSessionId, runner, workspaceId);
|
|
220
|
+
if (row === undefined)
|
|
221
|
+
return undefined;
|
|
222
|
+
return {
|
|
223
|
+
...sessionMetadata(row),
|
|
224
|
+
pinnedAt: row['pin_order'] === null ? null : 1,
|
|
225
|
+
pinOrder: nullableNumber(row, 'pin_order')
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
saveNativeSessionMetadata(input) {
|
|
229
|
+
const current = this.getNativeSessionMetadata(input.runner, input.externalSessionId, input.workspaceId);
|
|
230
|
+
const customTitle = input.customTitle === undefined
|
|
231
|
+
? (current?.customTitle ?? null)
|
|
232
|
+
: input.customTitle?.trim() || null;
|
|
233
|
+
const runnerTitle = input.runnerTitle === undefined
|
|
234
|
+
? (current?.runnerTitle ?? null)
|
|
235
|
+
: input.runnerTitle?.trim() || null;
|
|
236
|
+
const runnerTitlePending = input.runnerTitlePending === undefined
|
|
237
|
+
? (current?.runnerTitlePending ?? false)
|
|
238
|
+
: input.runnerTitlePending;
|
|
239
|
+
if (customTitle !== null && customTitle.length > 160)
|
|
240
|
+
throw new Error('SESSION_TITLE_INVALID');
|
|
241
|
+
if (runnerTitle !== null && runnerTitle.length > 160)
|
|
242
|
+
throw new Error('SESSION_TITLE_INVALID');
|
|
243
|
+
let pinOrder = current?.pinOrder ?? null;
|
|
244
|
+
const pinAtTop = input.pinned === true && pinOrder === null;
|
|
245
|
+
if (pinAtTop)
|
|
246
|
+
pinOrder = 0;
|
|
247
|
+
else if (input.pinned === false)
|
|
248
|
+
pinOrder = null;
|
|
249
|
+
const model = input.model === undefined ? (current?.model ?? null) : input.model;
|
|
250
|
+
const effort = input.effort === undefined ? (current?.effort ?? null) : input.effort;
|
|
251
|
+
const access = input.access === undefined ? (current?.access ?? null) : input.access;
|
|
252
|
+
const metadata = JSON.stringify({
|
|
253
|
+
version: 1,
|
|
254
|
+
customTitle,
|
|
255
|
+
runnerTitle,
|
|
256
|
+
runnerTitlePending,
|
|
257
|
+
model,
|
|
258
|
+
effort,
|
|
259
|
+
access
|
|
260
|
+
});
|
|
261
|
+
this.raw.exec('BEGIN IMMEDIATE');
|
|
262
|
+
try {
|
|
263
|
+
if (pinAtTop)
|
|
264
|
+
this.raw
|
|
265
|
+
.prepare('UPDATE agent_sessions SET pin_order = pin_order + 1 WHERE workspace_id = ? AND pin_order IS NOT NULL')
|
|
266
|
+
.run(input.workspaceId);
|
|
267
|
+
this.raw
|
|
268
|
+
.prepare(`INSERT INTO agent_sessions (id, workspace_id, runner, pin_order, metadata)
|
|
269
|
+
VALUES (?, ?, ?, ?, ?)
|
|
270
|
+
ON CONFLICT(id) DO UPDATE SET workspace_id = excluded.workspace_id,
|
|
271
|
+
runner = excluded.runner, pin_order = excluded.pin_order, metadata = excluded.metadata`)
|
|
272
|
+
.run(input.externalSessionId, input.workspaceId, input.runner, pinOrder, metadata);
|
|
273
|
+
this.raw.exec('COMMIT');
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
this.raw.exec('ROLLBACK');
|
|
277
|
+
throw error;
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
customTitle,
|
|
281
|
+
runnerTitle,
|
|
282
|
+
runnerTitlePending,
|
|
283
|
+
pinnedAt: pinOrder === null ? null : 1,
|
|
284
|
+
pinOrder,
|
|
285
|
+
model,
|
|
286
|
+
effort,
|
|
287
|
+
access
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
listSessionRecords(workspaceId) {
|
|
291
|
+
return this.raw
|
|
292
|
+
.prepare('SELECT id, workspace_id, runner, pin_order, metadata FROM agent_sessions WHERE workspace_id = ? ORDER BY pin_order IS NULL, pin_order, id')
|
|
293
|
+
.all(workspaceId).map((row) => ({
|
|
294
|
+
id: stringValue(row, 'id'),
|
|
295
|
+
workspaceId: stringValue(row, 'workspace_id'),
|
|
296
|
+
runner: stringValue(row, 'runner'),
|
|
297
|
+
pinOrder: nullableNumber(row, 'pin_order'),
|
|
298
|
+
metadata: {
|
|
299
|
+
...sessionMetadata(row),
|
|
300
|
+
pinnedAt: row['pin_order'] === null ? null : 1,
|
|
301
|
+
pinOrder: nullableNumber(row, 'pin_order')
|
|
302
|
+
}
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
movePinnedSession(sessionId, direction) {
|
|
306
|
+
const current = this.raw
|
|
307
|
+
.prepare('SELECT workspace_id, pin_order FROM agent_sessions WHERE id = ?')
|
|
308
|
+
.get(sessionId);
|
|
309
|
+
if (current === undefined || current['pin_order'] === null)
|
|
310
|
+
throw new Error('SESSION_NOT_PINNED');
|
|
311
|
+
const order = numberValue(current, 'pin_order');
|
|
312
|
+
const adjacent = this.raw
|
|
313
|
+
.prepare(direction === 'up'
|
|
314
|
+
? 'SELECT id, pin_order FROM agent_sessions WHERE workspace_id = ? AND pin_order < ? ORDER BY pin_order DESC LIMIT 1'
|
|
315
|
+
: 'SELECT id, pin_order FROM agent_sessions WHERE workspace_id = ? AND pin_order > ? ORDER BY pin_order ASC LIMIT 1')
|
|
316
|
+
.get(stringValue(current, 'workspace_id'), order);
|
|
317
|
+
if (adjacent === undefined)
|
|
318
|
+
return;
|
|
319
|
+
this.raw.exec('BEGIN IMMEDIATE');
|
|
320
|
+
try {
|
|
321
|
+
this.raw
|
|
322
|
+
.prepare('UPDATE agent_sessions SET pin_order = ? WHERE id = ?')
|
|
323
|
+
.run(order, stringValue(adjacent, 'id'));
|
|
324
|
+
this.raw
|
|
325
|
+
.prepare('UPDATE agent_sessions SET pin_order = ? WHERE id = ?')
|
|
326
|
+
.run(numberValue(adjacent, 'pin_order'), sessionId);
|
|
327
|
+
this.raw.exec('COMMIT');
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
this.raw.exec('ROLLBACK');
|
|
331
|
+
throw error;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
deleteSessionRecord(sessionId) {
|
|
335
|
+
return (Number(this.raw.prepare('DELETE FROM agent_sessions WHERE id = ?').run(sessionId).changes) > 0);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function migrate(database) {
|
|
339
|
+
const existingMigrationTable = database
|
|
340
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'node_schema_migrations'")
|
|
341
|
+
.get();
|
|
342
|
+
if (existingMigrationTable === undefined) {
|
|
343
|
+
const existingApplicationTable = database
|
|
344
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' LIMIT 1")
|
|
345
|
+
.get();
|
|
346
|
+
if (existingApplicationTable !== undefined)
|
|
347
|
+
throw new Error('NODE_DATABASE_VERSION_UNSUPPORTED');
|
|
348
|
+
database.exec('BEGIN IMMEDIATE');
|
|
349
|
+
try {
|
|
350
|
+
database.exec(NODE_SCHEMA_V4);
|
|
351
|
+
database
|
|
352
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
353
|
+
.run(NODE_SCHEMA_VERSION_V4, Date.now());
|
|
354
|
+
database.exec('COMMIT');
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
database.exec('ROLLBACK');
|
|
358
|
+
throw error;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const migrations = database
|
|
362
|
+
.prepare('SELECT version FROM node_schema_migrations ORDER BY version')
|
|
363
|
+
.all();
|
|
364
|
+
const versions = migrations.map((row) => numberValue(row, 'version'));
|
|
365
|
+
const current = versions.at(-1);
|
|
366
|
+
if (current === undefined ||
|
|
367
|
+
current < NODE_SCHEMA_VERSION_V4 ||
|
|
368
|
+
current > NODE_SCHEMA_VERSION ||
|
|
369
|
+
!versions.includes(NODE_SCHEMA_VERSION_V4))
|
|
370
|
+
throw new Error('NODE_DATABASE_VERSION_UNSUPPORTED');
|
|
371
|
+
if (versions.some((version, index) => index > 0 && version !== (versions[index - 1] ?? 0) + 1))
|
|
372
|
+
throw new Error('NODE_DATABASE_MIGRATION_HISTORY_INVALID');
|
|
373
|
+
assertNodeSchemaV4(database);
|
|
374
|
+
if (current === NODE_SCHEMA_VERSION_V4) {
|
|
375
|
+
database.exec('BEGIN IMMEDIATE');
|
|
376
|
+
try {
|
|
377
|
+
database.exec(NODE_SCHEMA_MIGRATION_V5);
|
|
378
|
+
database
|
|
379
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
380
|
+
.run(NODE_SCHEMA_VERSION_V5, Date.now());
|
|
381
|
+
database.exec('COMMIT');
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
database.exec('ROLLBACK');
|
|
385
|
+
throw error;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
assertNodeSchemaV5(database);
|
|
389
|
+
const migrated = database
|
|
390
|
+
.prepare('SELECT MAX(version) AS version FROM node_schema_migrations')
|
|
391
|
+
.get();
|
|
392
|
+
if (numberValue(migrated, 'version') === NODE_SCHEMA_VERSION_V5) {
|
|
393
|
+
database.exec('BEGIN IMMEDIATE');
|
|
394
|
+
try {
|
|
395
|
+
database.exec(NODE_SCHEMA_MIGRATION_V6);
|
|
396
|
+
database
|
|
397
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
398
|
+
.run(NODE_SCHEMA_VERSION_V6, Date.now());
|
|
399
|
+
database.exec('COMMIT');
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
database.exec('ROLLBACK');
|
|
403
|
+
throw error;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
const migratedV6 = database
|
|
407
|
+
.prepare('SELECT MAX(version) AS version FROM node_schema_migrations')
|
|
408
|
+
.get();
|
|
409
|
+
if (numberValue(migratedV6, 'version') === NODE_SCHEMA_VERSION_V6) {
|
|
410
|
+
assertNodeSchemaV6(database);
|
|
411
|
+
database.exec('BEGIN IMMEDIATE');
|
|
412
|
+
try {
|
|
413
|
+
database.exec(NODE_SCHEMA_MIGRATION_V7);
|
|
414
|
+
database
|
|
415
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
416
|
+
.run(NODE_SCHEMA_VERSION_V7, Date.now());
|
|
417
|
+
database.exec('COMMIT');
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
database.exec('ROLLBACK');
|
|
421
|
+
throw error;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
assertNodeSchemaV7(database);
|
|
425
|
+
const migratedV7 = database
|
|
426
|
+
.prepare('SELECT MAX(version) AS version FROM node_schema_migrations')
|
|
427
|
+
.get();
|
|
428
|
+
if (numberValue(migratedV7, 'version') === NODE_SCHEMA_VERSION_V7) {
|
|
429
|
+
database.exec('BEGIN IMMEDIATE');
|
|
430
|
+
try {
|
|
431
|
+
database.exec(NODE_SCHEMA_MIGRATION_V8);
|
|
432
|
+
database
|
|
433
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
434
|
+
.run(NODE_SCHEMA_VERSION_V8, Date.now());
|
|
435
|
+
database.exec('COMMIT');
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
database.exec('ROLLBACK');
|
|
439
|
+
throw error;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
assertNodeSchemaV8(database);
|
|
443
|
+
const migratedV8 = database
|
|
444
|
+
.prepare('SELECT MAX(version) AS version FROM node_schema_migrations')
|
|
445
|
+
.get();
|
|
446
|
+
const migratedV8Version = numberValue(migratedV8, 'version');
|
|
447
|
+
if (migratedV8Version <= NODE_SCHEMA_VERSION_V9) {
|
|
448
|
+
if (migratedV8Version === NODE_SCHEMA_VERSION_V8)
|
|
449
|
+
applyNodeSchemaV9Migration(database, NODE_SCHEMA_MIGRATION_V9, true);
|
|
450
|
+
else if (isDraftNodeSchemaV9(database))
|
|
451
|
+
applyNodeSchemaV9Migration(database, NODE_SCHEMA_MIGRATION_V9_FINALIZE, false);
|
|
452
|
+
assertNodeSchemaV9(database);
|
|
453
|
+
applyNodeSchemaV10Migration(database);
|
|
454
|
+
}
|
|
455
|
+
assertNodeSchemaV10(database);
|
|
456
|
+
const migratedV10 = database
|
|
457
|
+
.prepare('SELECT MAX(version) AS version FROM node_schema_migrations')
|
|
458
|
+
.get();
|
|
459
|
+
if (numberValue(migratedV10, 'version') === NODE_SCHEMA_VERSION_V10)
|
|
460
|
+
applyNodeSchemaV11Migration(database);
|
|
461
|
+
assertNodeSchemaV11(database);
|
|
462
|
+
const migratedV11 = database
|
|
463
|
+
.prepare('SELECT MAX(version) AS version FROM node_schema_migrations')
|
|
464
|
+
.get();
|
|
465
|
+
if (numberValue(migratedV11, 'version') === NODE_SCHEMA_VERSION_V11) {
|
|
466
|
+
database.exec('BEGIN IMMEDIATE');
|
|
467
|
+
try {
|
|
468
|
+
database.exec(NODE_SCHEMA_MIGRATION_V12);
|
|
469
|
+
database
|
|
470
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
471
|
+
.run(NODE_SCHEMA_VERSION_V12, Date.now());
|
|
472
|
+
assertNodeSchemaV12(database);
|
|
473
|
+
database.exec('COMMIT');
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
database.exec('ROLLBACK');
|
|
477
|
+
throw error;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
assertNodeSchemaV12(database);
|
|
481
|
+
}
|
|
482
|
+
function applyNodeSchemaV9Migration(database, migration, recordVersion) {
|
|
483
|
+
database.exec('PRAGMA foreign_keys = OFF');
|
|
484
|
+
try {
|
|
485
|
+
database.exec('BEGIN IMMEDIATE');
|
|
486
|
+
database.exec(migration);
|
|
487
|
+
if (recordVersion)
|
|
488
|
+
database
|
|
489
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
490
|
+
.run(NODE_SCHEMA_VERSION_V9, Date.now());
|
|
491
|
+
database.exec('COMMIT');
|
|
492
|
+
}
|
|
493
|
+
catch (error) {
|
|
494
|
+
database.exec('ROLLBACK');
|
|
495
|
+
throw error;
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
database.exec('PRAGMA foreign_keys = ON');
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
function applyNodeSchemaV10Migration(database) {
|
|
502
|
+
database.exec('PRAGMA foreign_keys = OFF');
|
|
503
|
+
try {
|
|
504
|
+
database.exec('BEGIN IMMEDIATE');
|
|
505
|
+
database.exec(NODE_SCHEMA_MIGRATION_V10);
|
|
506
|
+
database
|
|
507
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
508
|
+
.run(NODE_SCHEMA_VERSION_V10, Date.now());
|
|
509
|
+
database.exec('COMMIT');
|
|
510
|
+
}
|
|
511
|
+
catch (error) {
|
|
512
|
+
database.exec('ROLLBACK');
|
|
513
|
+
throw error;
|
|
514
|
+
}
|
|
515
|
+
finally {
|
|
516
|
+
database.exec('PRAGMA foreign_keys = ON');
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
function applyNodeSchemaV11Migration(database) {
|
|
520
|
+
database.exec('PRAGMA foreign_keys = OFF');
|
|
521
|
+
try {
|
|
522
|
+
database.exec('BEGIN IMMEDIATE');
|
|
523
|
+
database.exec(NODE_SCHEMA_MIGRATION_V11);
|
|
524
|
+
database
|
|
525
|
+
.prepare('INSERT INTO node_schema_migrations (version, applied_at) VALUES (?, ?)')
|
|
526
|
+
.run(NODE_SCHEMA_VERSION_V11, Date.now());
|
|
527
|
+
database.exec('COMMIT');
|
|
528
|
+
}
|
|
529
|
+
catch (error) {
|
|
530
|
+
database.exec('ROLLBACK');
|
|
531
|
+
throw error;
|
|
532
|
+
}
|
|
533
|
+
finally {
|
|
534
|
+
database.exec('PRAGMA foreign_keys = ON');
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
function mcpInstallation(row) {
|
|
538
|
+
const runtime = mcpRuntimeDescriptorSchema.parse(JSON.parse(stringValue(row, 'runtime')));
|
|
539
|
+
const configuration = mcpInstallationConfigurationSchema.parse(JSON.parse(stringValue(row, 'configuration')));
|
|
540
|
+
return {
|
|
541
|
+
targetKind: stringValue(row, 'target_kind'),
|
|
542
|
+
targetId: stringValue(row, 'target_id'),
|
|
543
|
+
catalogEntryId: stringValue(row, 'catalog_entry_id'),
|
|
544
|
+
serverName: stringValue(row, 'server_name'),
|
|
545
|
+
displayName: stringValue(row, 'display_name'),
|
|
546
|
+
version: stringValue(row, 'version'),
|
|
547
|
+
enabled: numberValue(row, 'enabled') === 1,
|
|
548
|
+
runtime,
|
|
549
|
+
configuration,
|
|
550
|
+
installedAt: numberValue(row, 'installed_at')
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
function sessionMetadata(row) {
|
|
554
|
+
const raw = JSON.parse(stringValue(row, 'metadata'));
|
|
555
|
+
if (raw['version'] !== 1)
|
|
556
|
+
throw new Error('SESSION_METADATA_VERSION_UNSUPPORTED');
|
|
557
|
+
const value = (key) => typeof raw[key] === 'string' ? raw[key] : null;
|
|
558
|
+
return {
|
|
559
|
+
customTitle: value('customTitle'),
|
|
560
|
+
runnerTitle: value('runnerTitle'),
|
|
561
|
+
runnerTitlePending: raw['runnerTitlePending'] === true,
|
|
562
|
+
model: value('model'),
|
|
563
|
+
effort: value('effort'),
|
|
564
|
+
access: value('access')
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
function acquireNodeMigrationLock(databasePath) {
|
|
568
|
+
if (databasePath === ':memory:')
|
|
569
|
+
return () => undefined;
|
|
570
|
+
const lockPath = `${databasePath}.migration.lock`;
|
|
571
|
+
const deadline = Date.now() + 5_000;
|
|
572
|
+
while (true) {
|
|
573
|
+
try {
|
|
574
|
+
const descriptor = openSync(lockPath, 'wx', 0o600);
|
|
575
|
+
return () => {
|
|
576
|
+
closeSync(descriptor);
|
|
577
|
+
if (existsSync(lockPath))
|
|
578
|
+
rmSync(lockPath);
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
catch (error) {
|
|
582
|
+
const code = error instanceof Error && 'code' in error ? error.code : undefined;
|
|
583
|
+
if (code !== 'EEXIST' || Date.now() >= deadline)
|
|
584
|
+
throw new Error('NODE_DATABASE_MIGRATION_LOCK_UNAVAILABLE');
|
|
585
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 50);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
function workspace(row) {
|
|
590
|
+
const summary = nullableString(row, 'git_summary');
|
|
591
|
+
return {
|
|
592
|
+
id: stringValue(row, 'id'),
|
|
593
|
+
preserveGitConfig: Number(row.preserve_git_config) === 1,
|
|
594
|
+
path: stringValue(row, 'path'),
|
|
595
|
+
kind: stringValue(row, 'kind'),
|
|
596
|
+
gitSummary: summary === null ? null : JSON.parse(summary)
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
function terminalSession(row) {
|
|
600
|
+
const state = stringValue(row, 'state');
|
|
601
|
+
if (state !== 'RUNNING' && state !== 'EXITED' && state !== 'CLOSED')
|
|
602
|
+
throw new Error('DATABASE_VALUE_INVALID:terminal_state');
|
|
603
|
+
return {
|
|
604
|
+
id: stringValue(row, 'id'),
|
|
605
|
+
workspaceId: nullableString(row, 'workspace_id'),
|
|
606
|
+
profileId: stringValue(row, 'profile_id'),
|
|
607
|
+
state,
|
|
608
|
+
exitCode: nullableNumber(row, 'exit_code'),
|
|
609
|
+
rows: numberValue(row, 'rows'),
|
|
610
|
+
cols: numberValue(row, 'cols'),
|
|
611
|
+
latestSequence: numberValue(row, 'latest_sequence'),
|
|
612
|
+
createdAt: numberValue(row, 'created_at'),
|
|
613
|
+
updatedAt: numberValue(row, 'updated_at')
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
function stringValue(row, key) {
|
|
617
|
+
const value = row[key];
|
|
618
|
+
if (typeof value !== 'string')
|
|
619
|
+
throw new Error(`DATABASE_VALUE_INVALID:${key}`);
|
|
620
|
+
return value;
|
|
621
|
+
}
|
|
622
|
+
function nullableString(row, key) {
|
|
623
|
+
const value = row[key];
|
|
624
|
+
if (value === null || typeof value === 'string')
|
|
625
|
+
return value;
|
|
626
|
+
throw new Error(`DATABASE_VALUE_INVALID:${key}`);
|
|
627
|
+
}
|
|
628
|
+
function nullableNumber(row, key) {
|
|
629
|
+
const value = row[key];
|
|
630
|
+
if (value === null || typeof value === 'number')
|
|
631
|
+
return value;
|
|
632
|
+
throw new Error(`DATABASE_VALUE_INVALID:${key}`);
|
|
633
|
+
}
|
|
634
|
+
function numberValue(row, key) {
|
|
635
|
+
const value = row[key];
|
|
636
|
+
if (typeof value !== 'number')
|
|
637
|
+
throw new Error(`DATABASE_VALUE_INVALID:${key}`);
|
|
638
|
+
return value;
|
|
639
|
+
}
|