@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.
Files changed (161) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/dist/capabilities.js +110 -2
  4. package/dist/claude-agent-sdk.js +330 -2
  5. package/dist/claude-channel.js +44 -2
  6. package/dist/codex-app-server.js +510 -2
  7. package/dist/config.js +106 -2
  8. package/dist/connector/node-connector-options.js +1 -2
  9. package/dist/connector/node-operation-router.js +22 -2
  10. package/dist/connector.js +1736 -2
  11. package/dist/control-outbound-scheduler.js +153 -2
  12. package/dist/database.js +639 -2
  13. package/dist/fake-runner.js +129 -2
  14. package/dist/git-askpass.js +12 -0
  15. package/dist/git-execution-helper.js +266 -0
  16. package/dist/health.js +3 -2
  17. package/dist/main.js +57 -2
  18. package/dist/mcp-installation-model.js +1 -2
  19. package/dist/migrations/v004.js +55 -3
  20. package/dist/migrations/v005.js +13 -3
  21. package/dist/migrations/v006.js +90 -3
  22. package/dist/migrations/v007.js +22 -3
  23. package/dist/migrations/v008.js +18 -3
  24. package/dist/migrations/v009.js +70 -4
  25. package/dist/migrations/v010.js +43 -3
  26. package/dist/migrations/v011.js +20 -3
  27. package/dist/migrations/v012.js +8 -0
  28. package/dist/native-jsonl-reader.js +186 -2
  29. package/dist/native-session-history.js +1143 -2
  30. package/dist/opencode-runtime.js +80 -2
  31. package/dist/opencode-server.js +259 -2
  32. package/dist/operational.js +122 -2
  33. package/dist/process-tree.js +18 -2
  34. package/dist/ripgrep-binary.js +31 -2
  35. package/dist/rotating-log.js +67 -2
  36. package/dist/runner/abstract-runner.js +260 -2
  37. package/dist/runner/claude/managed-run-controller.js +355 -2
  38. package/dist/runner/claude/tool-normalizer.js +120 -2
  39. package/dist/runner/claude-code-runner.js +303 -2
  40. package/dist/runner/codex/composer-image-markers.js +8 -2
  41. package/dist/runner/codex/conversation-parser.js +913 -2
  42. package/dist/runner/codex/managed-run-controller.js +494 -2
  43. package/dist/runner/codex/tool-normalizer.js +214 -2
  44. package/dist/runner/codex-runner.js +585 -2
  45. package/dist/runner/fake-test-runner.js +47 -2
  46. package/dist/runner/mar-agent/conversation-normalizer.js +644 -2
  47. package/dist/runner/mar-agent/executor-stdio-client-transport.js +139 -2
  48. package/dist/runner/mar-agent/generated-images.js +41 -2
  49. package/dist/runner/mar-agent/history-projection.js +106 -2
  50. package/dist/runner/mar-agent/hosted-conversation-runtime.js +446 -2
  51. package/dist/runner/mar-agent/managed-run-controller.js +785 -2
  52. package/dist/runner/mar-agent/mcp-client-pool.js +233 -2
  53. package/dist/runner/mar-agent/runtime-model-factory.js +326 -2
  54. package/dist/runner/mar-agent-runner.js +458 -2
  55. package/dist/runner/opencode/conversation-parser.js +221 -2
  56. package/dist/runner/opencode/managed-run-controller.js +588 -2
  57. package/dist/runner/opencode/tool-normalizer.js +80 -2
  58. package/dist/runner/opencode-runner.js +426 -2
  59. package/dist/runner/runner-registry.js +87 -2
  60. package/dist/runner-command-engine.js +71 -2
  61. package/dist/runner-profiles.js +323 -2
  62. package/dist/runner-usage.js +190 -2
  63. package/dist/runtime-command-detector.js +73 -2
  64. package/dist/runtime-model.js +1 -2
  65. package/dist/runtime-state.js +1509 -2
  66. package/dist/service/attachment-domain-state.js +7 -2
  67. package/dist/service/bubblewrap-sandbox-executor.js +543 -2
  68. package/dist/service/continuous-run-coordinator.js +425 -2
  69. package/dist/service/conversation-history-service.js +552 -2
  70. package/dist/service/conversation-hosting-capability-service.js +61 -2
  71. package/dist/service/conversation-hosting-enablement-service.js +91 -2
  72. package/dist/service/conversation-hosting-maintenance-service.js +174 -2
  73. package/dist/service/conversation-segment-service.js +162 -2
  74. package/dist/service/conversation-template-node-service.js +992 -2
  75. package/dist/service/external-session-resume-service.js +152 -2
  76. package/dist/service/fake-managed-run-service.js +60 -2
  77. package/dist/service/git-execution-service.js +418 -0
  78. package/dist/service/git-operation-service.js +57 -0
  79. package/dist/service/hosted-conversation-node-service.js +1982 -2
  80. package/dist/service/hosted-conversation-store.js +1405 -2
  81. package/dist/service/managed-runner-session-service.js +35 -2
  82. package/dist/service/mar-agent-model-transport-test-service.js +88 -2
  83. package/dist/service/mcp-installation-verifier.js +87 -2
  84. package/dist/service/mcp-node-operation-service.js +90 -2
  85. package/dist/service/mission-mcp-server.js +124 -2
  86. package/dist/service/mission-mcp-stdio.js +40 -2
  87. package/dist/service/mission-runtime.js +142 -2
  88. package/dist/service/native-session-projection-service.js +274 -2
  89. package/dist/service/native-session-watch-service.js +683 -2
  90. package/dist/service/node-connection-lifecycle-service.js +88 -2
  91. package/dist/service/node-control-channel.js +85 -2
  92. package/dist/service/node-control-message-service.js +109 -2
  93. package/dist/service/node-request-service.js +62 -2
  94. package/dist/service/node-run-event-bridge.js +88 -2
  95. package/dist/service/node-terminal-channel.js +202 -2
  96. package/dist/service/node-upgrade-coordinator.js +137 -2
  97. package/dist/service/node-workspace-coordinator.js +97 -2
  98. package/dist/service/recent-run-projection-service.js +99 -2
  99. package/dist/service/run-attachment-service.js +321 -2
  100. package/dist/service/run-domain-state.js +4 -2
  101. package/dist/service/run-event-service.js +246 -2
  102. package/dist/service/run-ownership-policy.js +22 -2
  103. package/dist/service/run-workbench-service.js +120 -2
  104. package/dist/service/runner-channel-message-service.js +20 -2
  105. package/dist/service/runner-interaction-service.js +243 -2
  106. package/dist/service/runner-service.js +69 -2
  107. package/dist/service/runtime-credential-control-service.js +95 -2
  108. package/dist/service/session-catalog-service.js +404 -2
  109. package/dist/service/session-command-service.js +125 -2
  110. package/dist/service/session-context-service.js +128 -2
  111. package/dist/service/session-domain-state.js +9 -2
  112. package/dist/service/session-identity-service.js +86 -2
  113. package/dist/service/session-lifecycle-service.js +248 -2
  114. package/dist/service/session-message-service.js +270 -2
  115. package/dist/service/session-presentation-service.js +43 -2
  116. package/dist/service/session-query-service.js +82 -2
  117. package/dist/service/session-watch-slot-coordinator.js +21 -2
  118. package/dist/service/skill-directory-service.js +238 -2
  119. package/dist/service/skill-install-service.js +434 -2
  120. package/dist/service/skill-node-operation-service.js +206 -2
  121. package/dist/service/terminal-relay-state.js +3 -2
  122. package/dist/service/terminal-service.js +90 -2
  123. package/dist/service/web-search-error.js +40 -2
  124. package/dist/service/workbench-event-service.js +21 -2
  125. package/dist/service/workbench-manifest-service.js +69 -2
  126. package/dist/service/workspace-change-service.js +290 -2
  127. package/dist/service/workspace-content-search-service.js +457 -2
  128. package/dist/service/workspace-domain-state.js +41 -2
  129. package/dist/service/workspace-file-service.js +150 -2
  130. package/dist/service/workspace-git-exclude-service.js +119 -2
  131. package/dist/service/workspace-queue-workbench-service.js +176 -2
  132. package/dist/service/workspace-service.js +92 -2
  133. package/dist/service/workspace-session-service.js +154 -2
  134. package/dist/service/workspace-upload-service.js +262 -2
  135. package/dist/service/workspace-watch-controller.js +68 -2
  136. package/dist/service/workspace-watch-service.js +170 -2
  137. package/dist/service/workspace-watch-snapshot-service.js +218 -2
  138. package/dist/service/workspace-workbench-service.js +239 -2
  139. package/dist/service.js +91 -2
  140. package/dist/storage.js +32 -2
  141. package/dist/supervisor.js +136 -2
  142. package/dist/terminal.js +496 -2
  143. package/dist/util/git-credential-client.js +32 -0
  144. package/dist/util/node-operation-data.js +9 -2
  145. package/dist/util/node-operation-parsers.js +382 -2
  146. package/dist/util/personal-instructions.js +34 -2
  147. package/dist/util/runner-error.js +70 -2
  148. package/dist/util/runner-native-session-parsers.js +510 -2
  149. package/dist/util/safe-error.js +8 -2
  150. package/dist/util/secret-environment.js +25 -2
  151. package/dist/workspace.js +1793 -2
  152. package/package.json +11 -8
  153. package/vendor/ripgrep/darwin-arm64/rg +0 -0
  154. package/vendor/ripgrep/darwin-x64/rg +0 -0
  155. package/vendor/ripgrep/manifest.json +12 -0
  156. package/README.md +0 -42
  157. package/dist/event-buffer.js +0 -2
  158. package/dist/migrations/v001.js +0 -107
  159. package/dist/migrations/v002.js +0 -2
  160. package/dist/migrations/v003.js +0 -2
  161. package/dist/service/mcp-package-installer.js +0 -2
package/dist/database.js CHANGED
@@ -1,2 +1,639 @@
1
- /* mar-release-protected */
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
+ }