{"_id":"@hyuga/llm-safe-sql","_rev":"28-bf13554894a86611f576b9e6f15d5fa5","name":"@hyuga/llm-safe-sql","dist-tags":{"latest":"0.11.2"},"versions":{"0.1.0":{"name":"@hyuga/llm-safe-sql","version":"0.1.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.1.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"b69ada4689ca66028b1fd6337d42cb8b66ee5e92","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.1.0.tgz","fileCount":101,"integrity":"sha512-H68fFLsBNE6R/nL3AO5ksWc9b50W6tkqavWh33IC1wWLnJYOz9In62DQ1QIsqoANG+ol41i3AdtLuVRh6Ni3nw==","signatures":[{"sig":"MEYCIQDJ7qbhBp5uqixFmIQ80NZlcD/BbDA/eaABAPJcALmIxwIhAKUaMo80ribWs6MTSa21DjjmYxtfbvm0sW7aXJZkJQ/6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":585683},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"46b43eeba43078066e8e335e162dd9e1c3e709f6","scripts":{"test":"tsc -p tsconfig.json && node --test \"dist/test/*.test.js\"","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node --test \"dist/test/integration/*.test.js\""},"_npmUser":{"name":"hyuga","email":"maronsan611@gmail.com"},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"11.12.1","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.1.0_1786243007531_0.6254918739260975","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@hyuga/llm-safe-sql","version":"0.1.1","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.1.1","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"71dc961799adcec3e7bbff457790a04d3bc2def9","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.1.1.tgz","fileCount":101,"integrity":"sha512-5St+uhgsbrwFNgaNpcnHQFd3mPm/0s52tbfbki29hL+kpsvXttmtbhtPXLCdQ11MVQ1427o34+Db8pvMdLF0RQ==","signatures":[{"sig":"MEUCIQCi2zu3zcYCT6R0gcMKmnLeCjdLEFbOyI3XaTStVUFabAIgDVN3h66NMwLXzk6HLRhmFJ1bKCd0WjDKeSK0fdAGiRI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":591411},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"2352dbc205be4602ee607f8adff969efcb14e5e8","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.1.1_1786248891716_0.021710670631140516","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@hyuga/llm-safe-sql","version":"0.2.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.2.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"f870bf2589d4ce1cb886c206b174e071997ca1fb","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.2.0.tgz","fileCount":105,"integrity":"sha512-pIjXXULdiPPBFIsMXxb7xFjRdxgjFDGizojvOD71ap8F8itNl9g93gW8OIp4DKY4hVfTOERJIMvFVLEHvZMVrQ==","signatures":[{"sig":"MEUCIQDcQbk/TEZ4ifVV3toYbx25QlLpbus5ctCP1NmxgisR4AIgAjDvzaVOYTrF6/UIklbxlVKU/oDadCWDKHGBKfg03sA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":677500},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"843289af107f53948c267a8a5e1920b7e4060427","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.2.0_1786261268509_0.3225219039366034","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@hyuga/llm-safe-sql","version":"0.3.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.3.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"352337e2a7f82514b23838d070c7be98b9a89ec1","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.3.0.tgz","fileCount":105,"integrity":"sha512-R6ql64Fh2HdUFUAAJojh8lf1sw4yEvQ3qahGX9+eq8PPrJHNAN8ip3mIjC/z/I/grFkmiSfz6jqC3WgtK/LYqA==","signatures":[{"sig":"MEUCIATo72mkt7TqLWyyzNZliTaHzZ507hXkDDJCJHq41SIJAiEAlUBJMAvkyfKgcHo7Dj7tsybAPto6gx1s74lSK18AB90=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":704105},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"b0f60211333d76e56e2f089b99954b866c3c2243","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.3.0_1786267687272_0.9214389018520965","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@hyuga/llm-safe-sql","version":"0.3.1","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.3.1","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"0b9112d4a683ec0c2a1b9cb11d4413b80d591970","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.3.1.tgz","fileCount":105,"integrity":"sha512-3snninzLBRPfnxtatj09x/8CjtfpzxTW7m7KaY4E/p1Fili3LrNd6w4cQUH2deYAE+i8j4yaC2mG/QLPqAdHRw==","signatures":[{"sig":"MEUCIQDCnF021hElnQ37TldJ0VdPSOX5RXkj8+E+eynVzr+UbQIgKQQgR25BfWcadRxWc/JY9vqyLD7DjyRQ5L+gTv89UEs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":716105},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"b418ec11b39736e62be1b5cec1ecddd7127050a6","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.3.1_1786270946199_0.5206744013555049","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@hyuga/llm-safe-sql","version":"0.4.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"f1a56c06ffe72407093df28d5e34591998dd3cd0","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.0.tgz","fileCount":105,"integrity":"sha512-kpYOuDkXRIGyWkviv71qoLP2b/dyK8945ZomnI5uNxZT2q9EUSOdGTDCQe0wAL+nrj5ap0HcisXTSO049LOA2A==","signatures":[{"sig":"MEUCIFXky3FfSl83qk39o5b8cfHI1lsqM3jPt8TPpQPrxxyCAiEA8CkFNLZbBgXTI6MLJ5j1SC1TEH0+WuDph0eN80xeRio=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":829770},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"51e9365e71da84ef7944f151925be78ca1f9e9a7","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.0_1786278723976_0.9223254418341422","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@hyuga/llm-safe-sql","version":"0.4.1","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.1","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"88cf64131d1d0496ad2d9fd9766eb4e170a4fed2","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.1.tgz","fileCount":105,"integrity":"sha512-9euIjor9s7t7dYtzXWhN9U4ib3+9/omvjDp0F1taoV+ikf4cT3AMP+EM5VI5WMsjs0LBm2n/JI6QhCIsSNybAg==","signatures":[{"sig":"MEQCIDQButkmv+dyR3wpdmFRIJs3HciQR9RYinOKReuke9b4AiBRTVHOc5ihiLMDNjQurUhbvafPz4bOEm/ghAe2R/zaYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":879558},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"68fb4074927be3505f1e239feaeff05805f82510","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.1_1786282430902_0.5467705079002616","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@hyuga/llm-safe-sql","version":"0.4.2","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.2","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"190848a2740fc88824815b95c36e6c3e1987f8f9","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.2.tgz","fileCount":105,"integrity":"sha512-uSeZ/nw68CYDgeE6TDJLF5VnJ14sW86kvgb26iW1oD6n7QXekcL4zk4PeGaF3pzUgh51LyPqsthhOoZL8kWo/g==","signatures":[{"sig":"MEQCIC7wg0CaVKWabvSlM/W42hDMSArSAHotNWwWftLR15E0AiBhPw08BI5WwygTs2hO+5zlkJ64vCl7e0uv4GCXJUOszA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":893375},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"3571872c3de04bb5e43539ba68261a889a04e710","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.2_1786351187915_0.07441393483936798","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@hyuga/llm-safe-sql","version":"0.4.3","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.3","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"404a8ed4e0b80ad9663c3b94ff0d3504fa502826","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.3.tgz","fileCount":105,"integrity":"sha512-ZhpDI12H9AiYaI/8Kb/LBExb15DQZh1/3cTTpF3nlqscst/0McxL45PxQreF4fbLHm1ttBZ3MLdLun2nHYtRDA==","signatures":[{"sig":"MEYCIQDf8+w5TTZ8EVkhVu8l5kX54hbxD4k/JdpXuqS2vqowmAIhAMeAI9wkQqChEQURx0pMoCJTvVAkRaYIeEIEX6wvtCsh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":907141},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"db38e556a3129404161477d2de719d49b6185cac","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.3_1786364325052_0.46718298175022577","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@hyuga/llm-safe-sql","version":"0.4.4","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.4","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"2949da851bda2b89e6b377ff12e36d11f9aa2c69","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.4.tgz","fileCount":109,"integrity":"sha512-Qjw0gYmFb/P12QH9JA3Rm0GQPiJGye2zDUEpOa95EWa/baf0KFIBx4vDlRbcBRTXfZWUH4QO0DaaBtNpKCNyuw==","signatures":[{"sig":"MEUCIQCt1VYUwFWC5qU1d6xkiNrVfUz7M1B8NVDrQiNhsPA9awIgT1IehG2BpgbHvZp1iV4rAO+SSNxJE4dVNjzvsl+XfaQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":927446},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"1ac2a85a178fadbf638fce5fb58a7ffc79cd1c3c","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.4_1786365952829_0.6291394454227319","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@hyuga/llm-safe-sql","version":"0.4.5","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.5","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"20d5232097a11d10b882c14f00b038de1543557b","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.5.tgz","fileCount":109,"integrity":"sha512-Qrpy9Hc1pUzr5K8Ji60tLnA6J2o1Szm/ii6TogUjlPvHAdkYBBwwnKko/KOU5+IgVz4tz8GyfnaQbLVt/UoGFQ==","signatures":[{"sig":"MEUCIQD10TltB2LZp4T2xfwIBXdozEAWs7qEoaRJfhosW7ZzZAIgFC+YobYdK8GDIfuVhXzJNjJMZg5uEvgIYba9tmkYQv4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":937444},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"7a140444406934c399e3af8937028f8a0568e089","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.5_1786366695587_0.6893815105996652","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@hyuga/llm-safe-sql","version":"0.4.6","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.6","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"6cedeca3b3dacf19d081901b1443c5082e6c05e7","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.6.tgz","fileCount":109,"integrity":"sha512-sGOVkga/SI9AUYQChTJlfn4INtRp9ZQ2ufu/j4oh8SNEqZ1HrkbzAJP93vFqVPuO6Dwhik02GbWsh0Bkh3UXFQ==","signatures":[{"sig":"MEUCIAx4ig9p7rrRuzdg557tOBpWJWSdJf9Yr1p5a2t4ut/7AiEAzPgCeqn4jnjKDuIaSJ0fWSYpHVof5KFeFKGa4NNa6Jc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":953690},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"cd372dd0851227cb011a85fd53f742750e5b15b2","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.6_1786368004144_0.019617074921567168","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@hyuga/llm-safe-sql","version":"0.4.7","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.7","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"ca0e886e00885f9cfc163552e3b33fbbb48d6d90","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.7.tgz","fileCount":109,"integrity":"sha512-0mir2PX6ucBaY4phpaq6yMfRmt+ZD+R448p4UdJq6eddbqDdv/Aq24oqrmVxiklQ8f6rTi9XQ+RRpg70ocmvGQ==","signatures":[{"sig":"MEYCIQD7elfD0mtSMpJImTy+EcgOm90IgLbLg/WFTFj4Vatc1QIhANTYaW+0LNjef+UGChXlH3EMUfOtrpq8Il7a39Nr0G8J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":964496},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"eac46b68559f0863a225fd1f1070b96c771be1ad","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.7_1786368490435_0.3331636141862031","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@hyuga/llm-safe-sql","version":"0.4.8","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.8","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"5b923c282a2c0c0d9748df142951f8c4e27f5803","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.8.tgz","fileCount":109,"integrity":"sha512-t5G+xzXBmqwpGath04lBq1x0PdyRli6LoYBw9J7mEtiiNpEU41+OB0Dg++zQRy3y8De9krd6AxFjPNINffZCQQ==","signatures":[{"sig":"MEYCIQDWxwpcdVBFgZJ+uXU5koA4w+jmcMA5O5OaT65wEGR/PQIhAPFLW/Jl6T4px6XTMorF8X8fP9OjWUMBxJ3NCtRvyAIj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":983245},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"0dba876c9b0f50ca7baa18a6a59d42dbdeded88d","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.8_1786435228205_0.45242356247600046","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"@hyuga/llm-safe-sql","version":"0.4.9","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.9","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"c4a330fec02831fc0773de888cf9c68f5924614a","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.9.tgz","fileCount":109,"integrity":"sha512-nltwpumb8oHMBJm0G4cfySOT4eDT4we5q9/BXooqtYzhcqbjR48wAsaOg7FKpICjW1gfSSr4lBgT0ATkMq3Rbw==","signatures":[{"sig":"MEQCIDBhmkrURx+A5mNTO5ItVtVug4pg9TRrQYTWZ2VpjXZGAiB3wOVRSF+T184u7c0fDdSDfn6iho62u/6FSV2bsGLHbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":993011},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"27d743a134c60f02d7b77d679d5d19161ef16aa6","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.9_1786437221241_0.4272516842140395","host":"s3://npm-registry-packages-npm-production"}},"0.4.10":{"name":"@hyuga/llm-safe-sql","version":"0.4.10","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.4.10","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"b623ee395e944b0db97168a8cd116d42ec14153c","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.4.10.tgz","fileCount":109,"integrity":"sha512-15b5Ct+iA0IpOWab9D4TALJR8quhk8RqDAC3LpM4LMuxZXXwVesv9mk0vo77+KNex8Ce0duwaQRqXeZ3d78Nhg==","signatures":[{"sig":"MEUCIAHg2TjNrVTX8faYoTKb7jgBAhGpffhmGtDGUsmimHimAiEA54LZNMCHQwYQRDKQKqjd1+WLE90GcmTQKdX0pBINaNE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.4.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1007937},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"4db0bb30cdbda5bc5b4a412549fe6a0a865df713","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.4.10_1786451454551_0.3836009200222068","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@hyuga/llm-safe-sql","version":"0.5.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.5.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"33aa9069bc2a9f4035729e0d8c8377a935b05dee","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.5.0.tgz","fileCount":109,"integrity":"sha512-nMcgRcFXItaytlcVDrfA/VsrJFPM1e5zzmrUsjwGQpJblB/Qr2BgG4IBWqPml82gvNRT8mq/aZkkiMOUMO4Img==","signatures":[{"sig":"MEUCIDWnfEgp+suwxf7sVzOeKg8kBYDJpp7AZ1UJzU6ELuViAiEAooFSu9gf02e29cR1ulnaGPZU+cD33h+caPBAVa0MIWc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1055450},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"49035ab47fb583d719b9a4b6b7727b4b8cb281c2","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.5.0_1786455307930_0.21376114113506883","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@hyuga/llm-safe-sql","version":"0.5.1","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.5.1","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"0276fd2a9599a70df96474b20fc926de8eb182f2","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.5.1.tgz","fileCount":109,"integrity":"sha512-h0bq3f8piVvGqi9BRk5a2U1u94lgiCo+1URtaFzaqH10qGvHHzH+C8WhaHKsJopuQQoernGzgysZQ2tB0O1Thw==","signatures":[{"sig":"MEYCIQDZFF8La+xpuFpPpE2gZ3srHYbAGryoisJx5gb+t4HsEAIhAKckaa+aG2aG7MuHFGa8RiQO3qfmaiJ35IJV9n1vl/IT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1065321},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"4ad829893c250d1a6bbee5afb74751903261b2ea","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.5.1_1786456931741_0.21156789197400094","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@hyuga/llm-safe-sql","version":"0.5.2","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.5.2","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"d6b136283bb6ab03219f59d8397ee45d629c3959","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.5.2.tgz","fileCount":109,"integrity":"sha512-he4pVeGEwxXRXxjqFqEGgga88QwRq1hsYosj2dyRSQpsGxciiy77uKZ4LItIIW9hsWlTypIlVTr5Hih9QrfthQ==","signatures":[{"sig":"MEYCIQDJPfGHPw0Zxx8ToQ9Y4t6BA9hcKx62ZQ6ie80T5RA/NAIhAMrAU7FFuEuzv59yHFC0hDzSWiAXIBs8PjWRVI7P8YRr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1091971},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"da7bfcde35819a382af6723d435f0e16ae987867","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.5.2_1786493453410_0.5557682358975693","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@hyuga/llm-safe-sql","version":"0.6.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.6.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"c30812262576f6c0f32a89004f1b0b7f798485df","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.6.0.tgz","fileCount":109,"integrity":"sha512-J1bJxmhJyOXrzHLCI/fCCTcSxUQyUT6CGZQzG7Y25GG2flubbE+eDH2mr97V//+76Yz5UZnACmfSTNjiuaqCjg==","signatures":[{"sig":"MEUCIBSh1KnFR8YnuZ/raWvGDQEl5VUoX6wLNdyIpJ4GRxOlAiEA1to7jA8UBi4Q0c6OwccdsQS22NGqFw7nLbsBUvlPOds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1115230},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"934c20ae85d8cc9af71245232679e6ab06e1bce4","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.6.0_1786614175955_0.32503280665912726","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@hyuga/llm-safe-sql","version":"0.7.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.7.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"b079972c123d3f5f1803f55a9c6f7c234a2d0951","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.7.0.tgz","fileCount":109,"integrity":"sha512-WUFBkCSiJkR1Mcc2b5cLuN8W1jO3y+Pk12Hon0l0vqLD05x5Kf95srQlJ5eIDBfw+AmtONy7J3TlZzcamB9uZw==","signatures":[{"sig":"MEUCIGay43e20ovM0pbsgPqRrj+wYudt8jZuTJ4UOPpDcC4JAiEAztFp/2IQQh2VImT4MmBhUUdGy0Rt/WJhszmP+P2lqEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1133829},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"e4ee2dbe347ec54cb93bf235a61de91092885204","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.7.0_1786624182728_0.6503361992751682","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@hyuga/llm-safe-sql","version":"0.8.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.8.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"eb2e1205e1a46c5fa50570051b78a28720aca371","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.8.0.tgz","fileCount":109,"integrity":"sha512-HH3CkEYG+sOK4s+QDcFVz7PiBnjNF2Wxmei7I6+Yi01rxB0WTHwcJfV08Y2ruVxsQQW5R+PEirHsc2pqRyywzg==","signatures":[{"sig":"MEYCIQDWafo8Oseg/2lCloRSP3Ic9orVj/reW0mwbCymvCKzUwIhAJrnoRc/OFv3CYVCTfQedChMzwhQeWDc/aDX9AV3Cil7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1152950},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"1b9e02cfa223cacbc3a10f11295949b48382b8d0","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.8.0_1786880334575_0.013573510879468342","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@hyuga/llm-safe-sql","version":"0.9.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.9.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/llm-safe-sql#readme","bugs":{"url":"https://github.com/hyuga611/llm-safe-sql/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"ebb1148a8e464cdada59020dff5d41430d9fe72b","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.9.0.tgz","fileCount":109,"integrity":"sha512-KbZjogXjTXfDn+tP2PQ9juRIgqC8MSf2wlPaxk5R00WpFy3DfTKbiB2nwZ3xbJnxJEVY8cFIqEFWc4zt8WATEw==","signatures":[{"sig":"MEQCICq/UQYkjskhO/8IllBxMun2Mq/XMtOCmHHn4D5+i140AiBElmrciXHyP1k7jy9P/2oh62EVxrbycfR+HZqN6jf11A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1213115},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"f5d0c7084db193d981d55fabb10bd9cab399ad17","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:edea14bb-de65-4d84-8570-05ad5b622571"}},"repository":{"url":"git+https://github.com/hyuga611/llm-safe-sql.git","type":"git"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.9.0_1787539413952_0.5031338432135037","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@hyuga/llm-safe-sql","version":"0.10.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.10.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/airframe/tree/main/packages/llm-safe-sql","bugs":{"url":"https://github.com/hyuga611/airframe/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"340d6f34f98fab2fa76b761ce4d2b68b512731c7","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.10.0.tgz","fileCount":113,"integrity":"sha512-HIpdYmnEDzenyIvitj5sufJKmUWwa8uTKmkSk5Bv+Y2eFeUNT6muPzucujdWJwybENnAwRXcu+g0WThF9yddhg==","signatures":[{"sig":"MEQCIHigUpBDn9v9J/+zo3RypoxZX9vXP9v8JFm0056VHB97AiB5JkQWfkDaMahwRofzENHEoZuO+n3rtf4m73VHUlQ66Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1220766},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"ce9d655765e2cb9425e4c7113e91058bc3b5f7a4","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"hyuga","email":"maronsan611@gmail.com"},"repository":{"url":"git+https://github.com/hyuga611/airframe.git","type":"git","directory":"packages/llm-safe-sql"},"_npmVersion":"11.11.0","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.10.0_1788076699396_0.9232995509800925","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@hyuga/llm-safe-sql","version":"0.10.1","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.10.1","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/airframe/tree/main/packages/llm-safe-sql","bugs":{"url":"https://github.com/hyuga611/airframe/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"bf32381395c72de4e99d34ba3b608dba18ae6bf7","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.10.1.tgz","fileCount":114,"integrity":"sha512-ISUfWZZJd+jNsQfK41VSvqgReJFdeogPluKYqrHaUMT/7+RTF73d5VeuZblHlGs+g+SGEtfXsXHOqoMyorpd9w==","signatures":[{"sig":"MEQCIF1xVa7zRsvIVoB0dW/vyO0k9ykiYLyyI8B2zfX9IkcjAiBCi0nqwsUn2S1o6GDahBVF/bCP3JME70xRnuWggV3Z3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1222357},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"712c19c5cb32751e61298e403bfd12e53d140bd1","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4e19392e-e91a-4d29-b7e1-00956fe85317"}},"repository":{"url":"git+https://github.com/hyuga611/airframe.git","type":"git","directory":"packages/llm-safe-sql"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.10.1_1788101693559_0.37677575474008407","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@hyuga/llm-safe-sql","version":"0.11.0","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.11.0","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/airframe/tree/main/packages/llm-safe-sql","bugs":{"url":"https://github.com/hyuga611/airframe/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"c2d15802e090fce361f76004bee99790791ab2f4","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.11.0.tgz","fileCount":114,"integrity":"sha512-teBuWj2EjeVJ/c881CRdMdPmb1fh7jrCuYiT8HJds0Ivy7BouSJRnX9V3W7ty6X8uo+DVIZ1Mtqzc0Z0u13BDA==","signatures":[{"sig":"MEYCIQCmi2QCFdlm1/DRo34YBQeQg+2dwef4BMd4wkXJnKLjtQIhALNQ1nSQmjTVWnAB1zxvU1BGW0zwdFfmA7KGOEzpvII1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1255623},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"a4c8c8265bae0f58e0258022b8447673e41268bd","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4e19392e-e91a-4d29-b7e1-00956fe85317"}},"repository":{"url":"git+https://github.com/hyuga611/airframe.git","type":"git","directory":"packages/llm-safe-sql"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.11.0_1788429468517_0.7336083881700888","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@hyuga/llm-safe-sql","version":"0.11.1","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"author":{"name":"hyuga611"},"license":"MIT","_id":"@hyuga/llm-safe-sql@0.11.1","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"homepage":"https://github.com/hyuga611/airframe/tree/main/packages/llm-safe-sql","bugs":{"url":"https://github.com/hyuga611/airframe/issues"},"bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"dist":{"shasum":"c57b14aee266a88c72bd44a4acc9eb9fa7e90c56","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.11.1.tgz","fileCount":114,"integrity":"sha512-ey0COw41OuHtHodvGkflSXbCb9enABtSnzAVaX5Ik+As6RmDXiR7xW77tkZTX863j2b9UvyCLRNiLV9otHIB4Q==","signatures":[{"sig":"MEYCIQD8wbvqUoVOta3VVFAzyTMGbu/fltg6/2OB3/IA6Zt2wgIhAKhn/zlhslFuNWw+vsZdEXgVvgrUveJjab4kw/ninpxz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDzdc0ZePPiTh/BhTkjyImCS4Vs7VuKuCRr5j2Yo7UbIQIhAN3/OhVde3meyc2DbnKfz4eM0qQX6p4AY9TpHypT4/r/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.11.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1284368},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"e8ba1ae37d404061def04b0c72e9b416b7d05d9b","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4e19392e-e91a-4d29-b7e1-00956fe85317"}},"repository":{"url":"git+https://github.com/hyuga611/airframe.git","type":"git","directory":"packages/llm-safe-sql"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llm-safe-sql_0.11.1_1789455665973_0.1337694637874094","host":"s3://npm-registry-packages-npm-production"}},"0.11.2":{"_id":"@hyuga/llm-safe-sql@0.11.2","bin":{"llm-safe-sql":"dist/src/cli.js","llm-safe-sql-mcp":"dist/src/mcp/bin.js"},"bugs":{"url":"https://github.com/hyuga611/airframe/issues"},"dist":{"shasum":"2758c23cd6f2a4a70944cb72e12abde7dc7dec0c","tarball":"https://registry.npmjs.org/@hyuga/llm-safe-sql/-/llm-safe-sql-0.11.2.tgz","fileCount":114,"integrity":"sha512-CJYLTfoXvNO0/OT3ZnFQw8ux+aF3shq1absWZkXsB2p5z5wALnxuOOpSci2FTEAjoN92IF0zY/r4TZHWJZtB4A==","signatures":[{"sig":"MEUCIQDGVzJ2NJTI+9oCFszQcpYqPvlO+yjSohXcmXMcO7OddAIgYA3pEEBShgjDpAV0PiYmFQXO84O8zJykJQh08/5gXgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCYZtYuhOItGzK+Pwsmty+naDpndn0N7xPngc/4FXbJFAIgK40Ah8WSwboJLAQf6MtDKgjz5iEH4QooffiC+/xKNW4="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@hyuga%2fllm-safe-sql@0.11.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1294440},"main":"dist/src/index.js","name":"@hyuga/llm-safe-sql","type":"module","types":"dist/src/index.d.ts","author":{"name":"hyuga611"},"engines":{"node":">=20"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./mcp":{"types":"./dist/src/mcp/server.d.ts","default":"./dist/src/mcp/server.js"},"./mysql":{"types":"./dist/src/adapters/mysql.d.ts","default":"./dist/src/adapters/mysql.js"},"./sqlite":{"types":"./dist/src/adapters/sqlite.d.ts","default":"./dist/src/adapters/sqlite.js"},"./postgres":{"types":"./dist/src/adapters/postgres.d.ts","default":"./dist/src/adapters/postgres.js"},"./package.json":"./package.json"},"gitHead":"7c1cfbc1f7133bc9a33d32368153ff40f76f19c2","license":"MIT","scripts":{"test":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test","build":"tsc -p tsconfig.json","db:up":"docker compose up -d --wait","db:down":"docker compose down -v","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build && npm test","test:integration":"tsc -p tsconfig.json && node scripts/run-tests.mjs dist/test/integration --serial"},"version":"0.11.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4e19392e-e91a-4d29-b7e1-00956fe85317"}},"homepage":"https://github.com/hyuga611/airframe/tree/main/packages/llm-safe-sql","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"repository":{"url":"git+https://github.com/hyuga611/airframe.git","type":"git","directory":"packages/llm-safe-sql"},"_npmVersion":"12.0.2","description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","directories":{},"maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.22.0","mysql2":"^3.23.2","@types/pg":"^8.21.0","typescript":"^5.7.2","@types/node":"^26.2.0"},"peerDependencies":{"pg":">=8.11.0","mysql2":">=3.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/llm-safe-sql_0.11.2_1789458383929_0.7081119608731727"}}},"time":{"created":"2026-08-09T02:36:47.294Z","modified":"2026-09-15T07:46:24.384Z","0.1.0":"2026-08-09T02:36:47.675Z","0.1.1":"2026-08-09T04:14:51.877Z","0.2.0":"2026-08-09T07:41:08.666Z","0.3.0":"2026-08-09T09:28:07.441Z","0.3.1":"2026-08-09T10:22:26.352Z","0.4.0":"2026-08-09T12:32:04.150Z","0.4.1":"2026-08-09T13:33:51.055Z","0.4.2":"2026-08-10T08:39:48.086Z","0.4.3":"2026-08-10T12:18:45.214Z","0.4.4":"2026-08-10T12:45:52.975Z","0.4.5":"2026-08-10T12:58:15.742Z","0.4.6":"2026-08-10T13:20:04.307Z","0.4.7":"2026-08-10T13:28:10.613Z","0.4.8":"2026-08-11T08:00:28.396Z","0.4.9":"2026-08-11T08:33:41.389Z","0.4.10":"2026-08-11T12:30:54.716Z","0.5.0":"2026-08-11T13:35:08.112Z","0.5.1":"2026-08-11T14:02:12.056Z","0.5.2":"2026-08-12T00:10:53.588Z","0.6.0":"2026-08-13T09:42:56.111Z","0.7.0":"2026-08-13T12:29:42.964Z","0.8.0":"2026-08-16T11:38:54.728Z","0.9.0":"2026-08-24T02:43:34.100Z","0.10.0":"2026-08-30T07:58:19.614Z","0.10.1":"2026-08-30T14:54:53.702Z","0.11.0":"2026-09-03T09:57:48.666Z","0.11.1":"2026-09-15T07:01:06.100Z","0.11.2":"2026-09-15T07:46:24.052Z"},"bugs":{"url":"https://github.com/hyuga611/airframe/issues"},"author":{"name":"hyuga611"},"license":"MIT","homepage":"https://github.com/hyuga611/airframe/tree/main/packages/llm-safe-sql","keywords":["sql","llm","mcp","human-in-the-loop","dry-run","rollback","sqlite","mysql","postgresql","ai-safety","database"],"repository":{"url":"git+https://github.com/hyuga611/airframe.git","type":"git","directory":"packages/llm-safe-sql"},"description":"Let an LLM propose UPDATE/DELETE, then actually run it, measure the real before/after diff, and always roll back — so the human approves measured facts, not the model's claim.","maintainers":[{"name":"hyuga","email":"maronsan611@gmail.com"}],"readme":"# llm-safe-sql\n\n[![CI](https://github.com/hyuga611/airframe/actions/workflows/ci.yml/badge.svg)](https://github.com/hyuga611/airframe/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/@hyuga/llm-safe-sql.svg)](https://www.npmjs.com/package/@hyuga/llm-safe-sql)\n\n*[日本語版は README.ja.md にあります](README.ja.md)*\n\n**Let a language model propose an `UPDATE` or `DELETE`. Run it for real inside a\ntransaction, measure the actual before/after values, and always roll back. Show a\nhuman the measurement. Only then, on their word, do it for real.**\n\nThe confirmation is not a prediction and not a summary the model wrote. It is\nwhat the database itself did when the statement ran.\n\n---\n\n## The problem this exists for\n\nEvery \"AI agent with database access\" ends the same way: the model writes SQL,\nsomething asks *\"Run this?\"*, and a person clicks yes based on a sentence the\nmodel wrote about its own SQL.\n\nThat sentence is a guess, and so is any static analysis of the statement.\n`SET price = price * 1.1` is an expression. Triggers fire. Defaults apply. `WHERE\nstatus = 'pending'` matches whatever it matches at the moment it runs, which is\nnot the moment it was written. Nothing short of executing the statement can tell\nyou what it does — so this executes it, and then takes it back.\n\nHere is a real case from this library's own test suite, which an earlier version\nof it got wrong:\n\n```sql\nUPDATE members SET quota = quota + 10, profile = '{\"role\":\"admin\"}' WHERE id = 7\n```\n\nA confirmation that compares values with `String(a) === String(b)` reports\n`quota: 5 → 15` and says nothing else, because `String({role:'user'})` and\n`String({role:'admin'})` are both `[object Object]`. The privilege escalation\nrides along under an approved quota change and is never displayed. The same hole\nswallows every JSON, JSONB, array and binary column, and every 64-bit id that a\ndriver hands back as a float.\n\nThat class of bug is the reason this library compares by type and by content, and\nthe reason [SPEC.md](SPEC.md) exists as a testable list rather than a description.\n\n## What it does\n\n```\n  model                    llm-safe-sql                        human\n    │                           │                                │\n    ├── \"UPDATE orders …\" ─────►│                                │\n    │                           ├── BEGIN                        │\n    │                           ├── SELECT … (before)            │\n    │                           ├── UPDATE …      ← really runs  │\n    │                           ├── SELECT … (after)             │\n    │                           ├── ROLLBACK, then prove it      │\n    │◄── plan id + card ────────┤                                │\n    │                           ├── card ───────────────────────►│\n    │                           │                                ├── reads it\n    │                           │◄── approve (different tool) ───┤\n    │                           ├── lock rows, check unchanged   │\n    │                           ├── execute, reconcile, COMMIT   │\n```\n\nThe model gets a plan id. It cannot approve and it cannot apply, for two separate\nreasons, and the second one is why this library reached 0.6.0 with a hole in it.\n\nThe first is deployment: `approve` and `apply` live in a different process the\nmodel has no path to. The two halves can run as different OS users against\ndifferent database accounts, so the separation survives a bug in this library.\nThat is the arrangement worth building, and it is not the one you get by running\n`npx` in one terminal.\n\nThe second is the rule itself. **Whoever proposed a plan cannot approve it.**\nUntil 0.6.0 that was not checked, so a single actor could propose, approve and\napply its own `UPDATE`, and produce an audit trail that read as a review —\n`planned` by `kenji`, `approved` by `kenji`. The card is worth something only\nbecause the person reading it did not write the statement, so approving your own\nplan is now refused (`SELF_APPROVAL`) rather than recorded. If you genuinely hold\nboth roles — a solo operator with nobody to hand the card to — say so with\n`--allow-self-approve`, and the trail will keep both acts under your one name\ninstead of dressing them up as two.\n\n## What a confirmation card looks like\n\n```\nPlan 6f5a1c8e-... — proposed, not applied. Nothing in the database has changed.\n\n  UPDATE orders SET status = 'shipped' WHERE id = 42\n\nWhat this touches\n  orders — Changing an order moves money: the ship date decides which month\n           the supplier is paid in.\n  1 row would change, across 1 column: status\n\nMeasured by running the statement and rolling it back\n  id = 42\n      status: 'pending' -> 'shipped'\n\nThis needs a person. Neither the assistant nor this tool can approve it:\n  llm-safe-sql approve 6f5a1c8e-... --as you@example.com\n  llm-safe-sql apply   6f5a1c8e-... --as you@example.com\n```\n\nThe sentence under **What this touches** is required configuration. Without it a\nnon-engineer is being shown column names and asked to judge them, which they\ncannot do — so a table with no declared consequence cannot be written at all.\n\n## Try it without setting up a database\n\nSQLite ships inside Node, so there is no server, no container and no credential\nto arrange. Copy this and watch the rollback happen to a real file.\n\n```bash\nmkdir demo && cd demo && npm install @hyuga/llm-safe-sql\n\ncat > seed.mjs <<'EOF'\nimport { DatabaseSync } from 'node:sqlite';\nconst db = new DatabaseSync('app.db');\ndb.exec(\"CREATE TABLE orders (id INTEGER PRIMARY KEY, ref TEXT NOT NULL, status TEXT NOT NULL)\");\ndb.exec(\"INSERT INTO orders VALUES (1,'R-1','packed'),(2,'R-2','packed'),(3,'R-3','shipped')\");\nEOF\nnode seed.mjs\n\ncat > llm-safe-sql.config.json <<'JSON'\n{\n  \"dialect\": \"sqlite\",\n  \"connection\": { \"file\": \"app.db\" },\n  \"policy\": {\n    \"allow\": [\"orders\"],\n    \"impact\": { \"orders\": \"Marking an order shipped emails the customer.\" }\n  }\n}\nJSON\n\nnpx llm-safe-sql migrate\nnpx llm-safe-sql check\nnpx llm-safe-sql plan \"UPDATE orders SET status='shipped' WHERE status='packed'\"\n```\n\nThe card that comes back names the two rows and the values they would move\nbetween. Then check the table:\n\n```bash\nnode -e \"const{DatabaseSync}=require('node:sqlite');\nconsole.log(new DatabaseSync('app.db').prepare('SELECT id,status FROM orders').all())\"\n# id 1 and 2 are still 'packed'\n```\n\nThe statement really ran. The values on the card were read back out of the\ndatabase after it ran. And the rows are still as they were, because the\ntransaction was rolled back — which is the entire claim, demonstrated in about a\nminute on a file you can delete afterwards.\n\n`npx llm-safe-sql approve <id> --as you@example.com` and then `apply` will\ncommit it, and only then does anything change.\n\n**Requires Node 24 or later** (`node:sqlite` ships unflagged from Node 23.4).\nMySQL and PostgreSQL work on Node 20+.\n\n## Quick start\n\n```bash\nnpm install @hyuga/llm-safe-sql pg        # or: mysql2, or nothing at all for sqlite\nnpx llm-safe-sql init > llm-safe-sql.config.json\n$EDITOR llm-safe-sql.config.json          # name your tables and what they mean\nexport LLM_SAFE_SQL_PASSWORD=…\n\nnpx llm-safe-sql migrate                  # creates the plan + audit tables\nnpx llm-safe-sql check                    # verifies the environment, per table\n```\n\n`migrate` first, and if you forget, `check` says so and exits non-zero. It did\nnot until 0.4.2: it verified that the store *connection* worked and never that\nthe store *existed*, so it reported every table as ready and the omission\nsurfaced on the first `plan`, as a driver error.\n\n**[`examples/`](examples/) has this filled in and run.** Four database accounts\nwith the exact grants, for MySQL and PostgreSQL, plus a config file for each —\ntested against real servers rather than written from memory, which is how two of\nthe privilege lists in there got corrected.\n\n`check` is worth reading. It reports, per table, whether a dry run is even\npossible there — a non-transactional storage engine, a missing primary key, a\nforeign key that cascades, a trigger whose columns you have not declared. Each of\nthose is a case where a plan would either be refused later or, worse, be wrong.\n\nThen propose, approve and apply:\n\n```bash\nnpx llm-safe-sql plan \"UPDATE orders SET status='shipped' WHERE id=42\"\nnpx llm-safe-sql approve <id> --as you@example.com\nnpx llm-safe-sql apply   <id> --as you@example.com\n```\n\n### Giving it to an assistant\n\n```bash\nclaude mcp add database -- npx -y -p @hyuga/llm-safe-sql llm-safe-sql-mcp \\\n  --config /absolute/path/to/llm-safe-sql.config.json\n```\n\nor, for any MCP client that reads a JSON config:\n\n```json\n{\n  \"mcpServers\": {\n    \"database\": {\n      \"command\": \"llm-safe-sql-mcp\",\n      \"args\": [\"--config\", \"/absolute/path/to/llm-safe-sql.config.json\"],\n      \"env\": { \"LLM_SAFE_SQL_PASSWORD\": \"…\" }\n    }\n  }\n}\n```\n\nThe assistant gets four tools: `sql_read`, `sql_plan`, `sql_plan_status` and\n`sql_schema`. There is no fifth one.\n\n### Using it as a library\n\n```ts\nimport { Engine, Applier, Policy, SqlPlanStore, recordPlan } from '@hyuga/llm-safe-sql';\nimport { PostgresAdapter } from '@hyuga/llm-safe-sql/postgres';\n\nconst policy = new Policy({\n  allow: ['orders'],\n  impact: { orders: 'Changing an order moves money: the ship date decides the payment month.' },\n  denyIdentifiers: { password_hash: 'a stored credential' },\n});\n\nconst engine = new Engine({ adapter: await PostgresAdapter.connect(planningCreds), policy });\nconst plan   = await engine.plan(\"UPDATE orders SET status='shipped' WHERE id=42\");\n\n// plan.rows[0] === { key: {id: 42}, changed: ['status'],\n//                    before: {status: 'pending'}, after: {status: 'shipped'} }\n```\n\n## What it refuses, and why\n\nRefusing is always safe; a plan that describes something other than what will\nhappen is not. Every rule below exists because the alternative produces a\nconfirmation card that disagrees with the database.\n\n| Refused | Because |\n|---|---|\n| A table you did not allowlist | Default deny. A denylist has to predict every dangerous name; an allowlist only has to know the safe ones, which you do know |\n| `INSERT` | There is no \"before\" for a row that does not exist yet |\n| No `WHERE` | Every row is the target |\n| `JOIN`, multi-table `UPDATE a, b SET …` | Rows cannot be shown one-to-one, and the second table never appears on the card |\n| `ORDER BY` / `LIMIT` on a write | Which rows are affected stops being determined |\n| `now()`, `rand()`, `nextval()` in the statement | The rows shown are provably not the rows changed, and the value written was never displayed |\n| A table with an inbound `ON DELETE CASCADE` | Approving one row would silently destroy rows in another table, irreversibly |\n| A non-transactional table (MyISAM, a foreign table) | The \"dry run\" would be a permanent write, announced as harmless |\n| A table with no primary key | Rows cannot be shown to you one by one |\n| A trigger, on a dialect that cannot report auto-maintained columns | Guessing \"none\" makes every plan fail to confirm with an error that looks like a concurrency problem |\n| A credential that is not allowed to see the triggers or the foreign keys | The two rows above are answered out of `information_schema`, and MySQL filters it by privilege — silently, by returning fewer rows |\n| A statement that matched nothing, or changed nothing | Nothing to approve |\n| More rows than the ceiling | Every row is displayed individually; the ceiling is what a person can actually read |\n| An approval by the actor who proposed the plan | A card read by its own author confirms nothing, and recording it as an approval puts a review in the audit trail that never happened. `--allow-self-approve` if one person really holds both roles |\n| Reading a column you marked secret — named, aliased, or swept up by a `SELECT *` | Naming it is matched on the *reference*, so an alias does not help. Never naming it is matched on the columns that came back, so a wildcard does not help either. Both halves are needed: until 0.7.0 only the first existed, and `SELECT *` returned the column |\n| The library's own plan and audit tables, always | A model that can write the plan table can approve its own writes |\n\nAt apply time it also refuses if the rows have moved on: a different set now\nmatches the condition, or a value you approved is no longer what is there.\n\n### MySQL needs two more grants than you would expect\n\nTwo of the refusals above are decided from `information_schema`, and MySQL\nfilters those views by privilege — by returning fewer rows, not an error. A\nconnection without the `TRIGGER` privilege is told a table has no triggers. A\nconnection with no privilege on a *child* table is told no foreign key points at\nthe parent, because the constraint's rows belong to the child.\n\nThrough 0.4.10 this package's own `examples/mysql/roles.sql` granted neither, so\non the deployment it recommended, both guards were off and nothing said so:\n\n```text\n                        as root          as the recommended planning role\ntriggers on the table   1                0\nforeign keys onto it    1                0\nUPDATE                  refused          approvable card\nDELETE                  refused          approvable card, \"1 row would be deleted outright\"\n```\n\nMeasured on MySQL 8.4.11 and 5.7.44; MariaDB 11.8 shows the trigger to that role\nbut still hides the foreign key. PostgreSQL and SQLite do not filter their\ncatalogues, and answer a least-privilege role exactly as they answer a superuser.\n\nFrom 0.5.0 the planning and applying roles need:\n\n```sql\nGRANT SELECT  ON shop.* TO 'llm_plan'@'%';   -- so foreign keys onto your tables are visible\nGRANT TRIGGER ON shop.* TO 'llm_plan'@'%';   -- so \"no triggers\" means there are none\n```\n\nWithout them, `plan` refuses with `CASCADES_UNKNOWN` or `AUTO_COLUMNS_UNKNOWN`\nand `check` names the grant to add, instead of printing `ready`.\n\n`GRANT SELECT ON shop.*` genuinely widens what the planning role can read, and\nthat is the trade: either it can see the tables your writes reach, or nobody can\ntell you what your writes reach.\n\n**And it does not refuse for reasons that are not real.** Somebody else editing a\ncolumn your plan does not touch is not a conflict. A concurrent write during the\ndry run is not a failed rollback. A statement refused before it ran does not\nreport a rollback problem. Those three were bugs here, found by adversarial\nreview, and each has a test named after it — because a safety check that cries\nwolf is a safety check somebody eventually switches off.\n\n## What it does not do\n\n- **`INSERT`** — no before-image to show. Use an ordinary migration.\n- **Schema changes**, even where the dialect could roll them back.\n- **Bulk work.** The ceiling is a few hundred rows, by design: every row is shown.\n- **Protect you from a compromised applier.** The apply path holds a credential\n  that can write. Point it at a different database user from the planning one.\n\n## Where the guard is enforced\n\nMost of what this library does runs *inside this process*, holding a credential\nthat can write. The allowlist, the denied columns, the row ceilings — all of them\nare guards a bug in here can get past. That is worth saying out loud, because the\nalternative is an operator believing in a boundary that turns out to be one `if`\nstatement in a library they have never read.\n\nSo `llm-safe-sql check` prints where each guard actually sits:\n\n```text\nWhere the guards actually sit\n  read   app_ro@db:5432/app   — the model reads through this\n  plan   app@db:5432/app      — writes for real, always rolls back\n  apply  app@db:5432/app      — this one commits\n  store  app@db:5432/app      — plans and audit records\n  + read is a credential the database itself refuses writes from — probed on your own tables.\n\n  ! apply uses the SAME credential as plan. The separation between proposing and\n    committing then rests entirely on this library being correct.\n```\n\nThat `+` line is the only one that reports on the database rather than on your\nconfig file, so it is the only one that costs anything to produce. `check`\nattempts a real `DELETE ... WHERE 1 = 0` and `UPDATE ... SET c = c WHERE 1 = 0`\non your allowlisted tables, inside a transaction it rolls back — the privilege is\nchecked before a row is matched, so nothing is touched. If it cannot establish\nthe answer it says so in those words; it never reports \"constrained\" by staying\nquiet.\n\nFour connections can be configured, and each one you actually separate moves a\nguarantee below this code, where it survives our mistakes:\n\n| | what it is for | if you leave it at the default |\n|---|---|---|\n| `connection` | the dry run — must be able to write | — |\n| `applyConnection` | commits approved plans | the credential the model's tools reach is the one that commits |\n| `readConnection` | reads | reads run on a connection that can write, and the allowlist is the only thing stopping them |\n| `storeConnection` | plans and audit records | whatever can commit a change can also edit the record of its approval |\n\nSeparating `storeConnection` is necessary and is not sufficient, because that\naccount is *supposed* to write plans. A stored plan carries a checksum, and the\nfunction that computes it is exported from this package — so whoever holds the\nstore credential can replace an approved plan with a different one, recompute the\nchecksum, and the apply commits what it finds, with the card, the audit row and\nthe approver's name all still describing the plan that was replaced.\n\nSet `sealKey` and they would also need that value:\n\n```json\n{\n  \"sealKey\": \"${LLM_SAFE_SQL_SEAL_KEY}\"\n}\n```\n\nThe same secret goes to the process that plans and the process that applies, and\nnowhere the store account can read. Set it on one side only and every plan is\nrefused (`PLAN_UNSEALED`) — deliberately, because a deployment that believes it\nis sealing and is not is worse than one that never tried. `check` prints which of\nthe two you are running.\n\nThe approval is sealed too, and separately, because it happens later. Sealing\nonly the plan would leave `status` and `approved_by` as two ordinary columns —\nso the same party could not change what a plan said and could still mark it\napproved and have it applied with nobody having read it, which for this library\nis the worse of the two.\n\nIt is worth being exact about what is left. It does not defend against a\ncompromised planning process, which mints seals and can therefore seal anything.\nAnd it does not see a status rollback: setting `applied` back to `approved`\nreplays an approval that genuinely happened, so both seals still verify. That\none is refused a layer down instead — the rows now hold the values the plan\ncalls \"after\", so the pre-apply comparison fails with `ROW_CHANGED`, and a\nrepeated `DELETE` fails with `ROWS_MOVED`.\n\nOn PostgreSQL each of these also carries a `schema`, defaulting to `public`, and\nit is pinned on the connection rather than inherited. PostgreSQL's own default is\n`\"$user\", public`, which resolves differently for every role — so separating the\nplan and apply roles, which is the whole point of the table above, is what makes\n`orders` able to mean two different tables. Set `schema` if your tables do not\nlive in `public`; get it wrong and you are told the relation does not exist,\nrather than writing to the wrong one.\n\n`readConnection` is the cheapest real win: point it at a role with no write\nprivileges. Reading is the larger surface — it is what an injected instruction\nreaches first, and exfiltration needs no write at all. The dry run genuinely\ncannot use such a connection, which is why it is a separate setting.\n\nNone of this makes the in-process guards pointless. They catch the ordinary\nmistakes, and they produce the explanations. But when the two disagree, the\ndatabase wins, and it should.\n\n**Who you say you are is not one of the guards.** `--as` is taken at its word\neverywhere in this tool. The 0.6.0 refusal that stops a proposer approving their\nown plan compares two names this process was handed, from the same untrusted\nplace — so it catches one identity running both halves, which is what a single\nterminal gives you and the case that produces a plausible-looking audit trail by\naccident, and it does nothing about somebody who types a different name. It turns\na silent non-review into a refusal. It is not an authorisation boundary, and\n`check` says so every time rather than waiting to be asked, because a guard\nmistaken for a stronger one is worse than no guard at all.\n\nThe identity that does mean something is `applyConnection`: a database account the\nproposing side has no password for. That is the same answer as everywhere else on\nthis page — put the boundary below this code, where it survives our mistakes.\n\n### A guard can be dead without being wrong\n\nAll of the above depends on the question underneath a guard being able to come\nback unanswered. `information_schema.TRIGGERS` is the case that taught it: MySQL\nfilters that view by the TRIGGER privilege, so a credential without it gets `0`\nrows — the same well-formed answer as a table that genuinely has no triggers. Not\nan error. A zero.\n\nThe general shape is worth more than the instance. A guard written to catch\n\"could not tell\" never runs if anything between the channel and the guard turns\nthe missing answer into an ordinary value first. MySQL's privilege filter does it\nin the server. In shell, `printf '%.2f' \"\"` does it two lines above the\n`[ -z \"$x\" ]` that was supposed to catch it. The check still reads correctly on\nthe page. It just cannot fail.\n\nThat is why `CASCADES_UNKNOWN` and `AUTO_COLUMNS_UNKNOWN` are refusal reasons of\ntheir own rather than folded into \"no triggers\", and why `check` reports that it\ncould not establish an answer in those words rather than staying quiet.\n\nThe shape was named in [discussion #3](https://github.com/hyuga611/llm-safe-sql/discussions/3)\nby [@joeyycli](https://github.com/joeyycli), who ran the same test against a\nsystem of their own, confirmed both paths this side predicted, and found a third\nthat the prediction had missed. That thread is also a longer write-up of the\nlayer question above, covering how the other tools in this space answer it.\n\n## Measured, not assumed\n\nFacts marked 🔬 in [SPEC.md](SPEC.md) were established by measuring MySQL 8.4.11\nand PostgreSQL 16.14 in CI, not by reading documentation. Where measurement\ncontradicted the docs, the measurement won. A few that change how this is built:\n\n| | MySQL | PostgreSQL | SQLite |\n|---|---|---|---|\n| Statement timeout on a **write** | **None** — `max_execution_time` is read-only statements only | `statement_timeout` applies | **None at all** — said on every card |\n| A statement cut short by a timeout | can return **success** | raises | n/a |\n| Row locks after `ROLLBACK TO SAVEPOINT`, when the caller wrote first | **retained** to end of transaction | released | no row locks exist |\n| DDL in a transaction | commits implicitly | transactional | transactional |\n| \"rows affected\" can mean \"rows changed\" | yes | no | no |\n| 64-bit integers arrive as | strings | strings | `bigint` |\n\nThe third row is why a dry run always gets its own connection: nested inside\nyour transaction, on MySQL, it would hold exclusive locks on rows it only\npretended to touch. Testing only the easy shape — savepoint first, then write —\ngives the comfortable and wrong answer that locks are always released.\n\nSQLite has no row locks to retain, so it takes the whole-database write lock up\nfront with `BEGIN IMMEDIATE` instead; that is what makes the apply's\ncheck-then-write atomic without a `FOR UPDATE` to append. Its missing statement\ntimeout is not hidden in this table — the adapter declares it and the engine\nprints it as a warning on every confirmation card, because a limit that is\nconfigured, believed and absent is the exact failure this library was built\nafter.\n\n## Dependencies\n\nNone at runtime. The database driver (`pg` or `mysql2`) is an optional peer, so\nyou install the one you use. The MCP server speaks the protocol directly rather\nthan through the official SDK, whose dependency tree is an HTTP server, a JWT\nlibrary and thirty-odd other packages that a stdio server never executes. For a\nprogram that sits between a language model and a production database, a tree an\noperator can actually audit is worth more than the convenience.\n\n## Contributing\n\nReal bug reports are the most useful thing, especially \"it refused something it\nshould not have\" — false refusals are as much a defect here as false approvals.\nSee [CONTRIBUTING.md](CONTRIBUTING.md); every rule in [SPEC.md](SPEC.md) has an\nid, and tests are named after it.\n\nMIT licensed.\n","readmeFilename":"README.md"}