{"_id":"@superdangerous/app-framework","_rev":"59-3bf1f9f4760980aff7663ada8b8f867d","name":"@superdangerous/app-framework","dist-tags":{"latest":"4.17.18"},"versions":{"4.9.0":{"name":"@superdangerous/app-framework","version":"4.9.0","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.9.0","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js","build-sidecar":"dist/cli/build-sidecar.js"},"dist":{"shasum":"8ab358fab7589af5994e5be0e8d14a1559f916da","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.9.0.tgz","fileCount":239,"integrity":"sha512-xBscYgxX1Hss+eiGxJcH3a599PklI5RsBICLjlQZWVRSx1ezXoxQC3C8XVR+7Hr61Bz3srO4OaUk4EPrw113mQ==","signatures":[{"sig":"MEYCIQDu+x7MzuHsANfpOj/zp95reSYdWgDKOxI46drhFfqNDwIhAJIgJ7mtlZElremAKqM2pIpP/SCD9xHnKw3UX2SEjtCS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11020091},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"b99ece36b63aba9f0326a9187026a2aef8b61338","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.9.0_1767479404744_0.5179927746440565","host":"s3://npm-registry-packages-npm-production"}},"4.9.1":{"name":"@superdangerous/app-framework","version":"4.9.1","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.9.1","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js","build-sidecar":"dist/cli/build-sidecar.js"},"dist":{"shasum":"55f3f0928d395c2cddd296b1fe45367df2929ddf","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.9.1.tgz","fileCount":239,"integrity":"sha512-VuIkrSfqSxUl3Lwjqy8xNpzIfR7FdiHk6Ty8m39U5pdHnA6WJy0+ios2/jtxcdWcr5wkV1glgg0jw2MHBCNhjA==","signatures":[{"sig":"MEUCIEePW9q3tjYGfQbSmqRu1Te/wgFX5pnuWrBoi52tqefRAiEA0ieM2hXc3NKh0WGM24rWv5jbTl+Qdeds+/6n+xxgeP0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11020117},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"ad41939be123380d281c3c19e2a4e0d7aa4e6bff","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.9.1_1767480126961_0.7540810372223419","host":"s3://npm-registry-packages-npm-production"}},"4.9.2":{"name":"@superdangerous/app-framework","version":"4.9.2","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.9.2","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js","build-sidecar":"dist/cli/build-sidecar.js"},"dist":{"shasum":"934dc5660a37fdd230e066dd00651d487e47533a","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.9.2.tgz","fileCount":239,"integrity":"sha512-QlJVEpDSHFlOsQRh+ijDu+zmWnvFyNPln4+KTeC8T2Q4HXF6QxOjnH/NHpfVojTeteDctUXmhCTg/7JnkBpEbg==","signatures":[{"sig":"MEUCIBZpP/0/lT+bCzjZxTxZj2yzYv7m1V2T1awLEFkD8T14AiEA9J2Q7+q/WmuCckwt1h+Bgx5F1/ZLRRXv2mMFbYxeg0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11020436},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f3602971ebecd90c70aeaae2c1c41f74120933fb","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.9.2_1767482586511_0.8310252688113131","host":"s3://npm-registry-packages-npm-production"}},"4.14.0":{"name":"@superdangerous/app-framework","version":"4.14.0","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.14.0","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"bcb26684dca5297a8c4be13025926eaf7a1e453f","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.14.0.tgz","fileCount":239,"integrity":"sha512-ps0Du4Jzo8k0nMBPvKByijbr9vDUzjhDqxKI7PMCBYI8umZvaXhtP9KYqK6Qk1g36SVozV/eWXANfAaaKYuXKA==","signatures":[{"sig":"MEUCIFCZ1LY9/6hMpTqD0YpIWJ6XKx4TfX9iQ4NZKYvdI88/AiEAsjrcuMa9FoQmd/ytSE+UQIX3+nfSOXgbpi62V+/mFiM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11020344},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"5e28401a8a958f79fdc702ee116f71c57d712799","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.14.0_1767618899549_0.12034468727761438","host":"s3://npm-registry-packages-npm-production"}},"4.15.0":{"name":"@superdangerous/app-framework","version":"4.15.0","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.0","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"f35584978e4436ffb2c498810c6c45f4a1b0f158","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.0.tgz","fileCount":257,"integrity":"sha512-a62nUMIbW8DsZO6KIgUZHzXF61aKoTwN+lO0CcO+/z3pmXxPmY7FUrphiFqsVoI+u1XCOnfjVM6vEY8+kfzKxQ==","signatures":[{"sig":"MEYCIQCuvCPu6oOWaSwTlwpOSAq1iVbCNBt5Z0hq7PyXh/Dq8AIhAOded8VIQuzIwsPgiBFotE2ceh41ejJzDBnjDDzLOJ+d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11348088},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"2603cd8dd2f729734166e7ace6750f03496fa754","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.0_1768474572629_0.28047416724562546","host":"s3://npm-registry-packages-npm-production"}},"4.15.1":{"name":"@superdangerous/app-framework","version":"4.15.1","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.1","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"e75c16f4846c79e86e91a87479fa08e929397ba1","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.1.tgz","fileCount":259,"integrity":"sha512-XOw5hxroH34vJ8olKzkZGT279gDIsdHrkYp+nP4dc6tE/bJlPcIRFaFnYotVBqSqP2o2Vz42Vo+S0VbUgT/CvA==","signatures":[{"sig":"MEQCID6l8pOPJm3mvx7ttG+jJNE9QFZMrSVPnkzpLfybnSeGAiBXpS1n0wNQG1W1vu/dwtkY3PpHq8d1FxI3X9MC3nf30A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11371128},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"2603cd8dd2f729734166e7ace6750f03496fa754","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.1_1768475710991_0.985798864888692","host":"s3://npm-registry-packages-npm-production"}},"4.15.2":{"name":"@superdangerous/app-framework","version":"4.15.2","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.2","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"ca4a6339ec7553ed7df2bf1133800a9ecce1ecb5","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.2.tgz","fileCount":259,"integrity":"sha512-RZz7db+gBGMxf7iY3+anTTtuS3HgogLNohJT3VvRvBUfBv3GNTNRMHJZBajbYEbRdbtL/Q/l0KDQZ9Pz/vTWuw==","signatures":[{"sig":"MEQCIDLm0Hz1P4rdIvUfffGQJDkm4L0C7kcNKcFyDkJEir4QAiAVONOo6yvzJ7/8UymoTUI2/bBz4k5ztR0RWaS+h8voDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11371153},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"2603cd8dd2f729734166e7ace6750f03496fa754","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.2_1768475964653_0.1009028845514679","host":"s3://npm-registry-packages-npm-production"}},"4.15.3":{"name":"@superdangerous/app-framework","version":"4.15.3","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.3","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"a64776b6a8fab30cbad6ce28791a96e88e7cffd4","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.3.tgz","fileCount":259,"integrity":"sha512-LEQqn3A/u1FPz2yCb+88AJiNLC7Bm/8B/OBBpcpoBzHwdpOiXgdgfwVtB3qswzy0SlPeoAp/Y41FccCzs1UoaQ==","signatures":[{"sig":"MEUCIE0bnOWAnCyd8/fQvc3tUe9rPPw4PgI6tauS2KnyreflAiEAtfc/KFO3UMyLbX7gIvPjnlKBs8jzFQVlhN5uYZyo/tk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11694041},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"2603cd8dd2f729734166e7ace6750f03496fa754","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.3_1768476130976_0.5733828599244377","host":"s3://npm-registry-packages-npm-production"}},"4.15.4":{"name":"@superdangerous/app-framework","version":"4.15.4","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.4","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"7728387afa3fb6e7a980ddd085bfa4b5b7e60392","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.4.tgz","fileCount":259,"integrity":"sha512-IPRFglK1SGrkuNACFYsc0cJKVyVB5LWmVgbt9WZT5YbdBmoM9JHmFXZN3ag1kiiHX9kmfwTs6Qil4lIwo8ECCg==","signatures":[{"sig":"MEUCIHBglQGk88KYahIwtXGfGItO2a9Y4BJnpF0/igf8uXnuAiEAn4TbrOiE9vuNdOYyBDhmtgV9dqdGM1FdC87A9ZrMoxY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11696524},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"2603cd8dd2f729734166e7ace6750f03496fa754","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.4_1768477846548_0.9253531441091998","host":"s3://npm-registry-packages-npm-production"}},"4.15.5":{"name":"@superdangerous/app-framework","version":"4.15.5","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.5","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"6360ff4a5596fe6b180ecada9af5200c73ba787a","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.5.tgz","fileCount":259,"integrity":"sha512-+GJdut/Zpgxa/gFJCutYQsKuCihGTiQ74hTrSQQqRQdRZSynqEI7KTbL8EaY2oXJbxO9LnJpZHmXhR0Nh4Ph1A==","signatures":[{"sig":"MEYCIQDlnkpHfT8Cindc5xMZr+dyv8E7N3JSmcrSRGRSIWtrBQIhAPSB3JluQybR6zEyvOgh8IhIsQq0R/9autjYfkHYGs59","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11696524},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"3b8015afb5e40ee04bf7fda242eb110377139e38","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.5_1768485927927_0.5840029868265899","host":"s3://npm-registry-packages-npm-production"}},"4.15.6":{"name":"@superdangerous/app-framework","version":"4.15.6","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.6","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"5c4eb260eb4b6450e3509881e77a899fae13318e","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.6.tgz","fileCount":259,"integrity":"sha512-D05hoUDRQnuA2plc7w4tDnJ7S7dimCMpKwJnPrs7e55LITg6rc0Cdm8NNwnohlCErcaIPmMNCaAAy/sGuVk2OA==","signatures":[{"sig":"MEYCIQD516BW+Vu7lrEPCHyLmBjDhEKk5VXvqUpCYObMElaxAQIhAKBgy2sTuicicvVAdfUgCBh1ArQ4QrCzjyZ5yXxOFCvM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11696874},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"b153fe38aa303ab9d438d2fafa123a6cab8a0c41","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.6_1768486545159_0.47526798481733934","host":"s3://npm-registry-packages-npm-production"}},"4.15.7":{"name":"@superdangerous/app-framework","version":"4.15.7","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.7","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"5b21cf12dc5bf11788e05a50908dd39dabe83833","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.7.tgz","fileCount":259,"integrity":"sha512-fCtKLVm/Isa22LJZ1gckKrKr4jtOfJeQhJRtHjs4GAIgsjR44vatRcrvk1oBBUSWc3NKrC1JNCAbOTtMwBNoHA==","signatures":[{"sig":"MEUCIHEr9GEsuggWOGsT/lFM1eChwVit4wrankKkHM5Ws6W4AiEA9CnxHnHh1N7svuu/tmwd95Vt8nyNGi4OaDUZUtJl4yg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11698617},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d517869ffa05284ce0d1387c9f7b71d6da8c5871","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.7_1768488176854_0.7954673887035988","host":"s3://npm-registry-packages-npm-production"}},"4.15.8":{"name":"@superdangerous/app-framework","version":"4.15.8","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.8","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"a321923fb6ee6045e81ccbe76a80b56a2c703d38","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.8.tgz","fileCount":259,"integrity":"sha512-aKP1zDBm0bBvVq85uWc9pXXsoTlb4cuOXsIuQiecUh5viW09AHG+/7H7hRmdjDX/wmhIrvU2EK5V60x1p4YA1Q==","signatures":[{"sig":"MEYCIQCYItX1iy41eNXlqnAafjZGQ+Ik2TW+KZ92XaYb9ajZBAIhAK8wQMZ9OY70fkjY8pX3HPBEXhH5KpinHw+eIR3K5PAm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11698617},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f293365818e567e354fbfebe479caf13c4e89227","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.8_1768489026342_0.27717871937085947","host":"s3://npm-registry-packages-npm-production"}},"4.15.9":{"name":"@superdangerous/app-framework","version":"4.15.9","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.15.9","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"67c19c63b120e8f456b82c4bd143d953b5adaceb","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.15.9.tgz","fileCount":259,"integrity":"sha512-4aZVC18DKIuv+URc3Ajm260lspYYkOzMoAt9kSzJc7sjajsmyFCP5hkctjIZHVnGVJqMogzARb4yOScuKhCSSw==","signatures":[{"sig":"MEUCIQCC/hARlX23WGBkhgXV833laKiBZWTKvfyn1yquoOKEiQIgOHfKB0OO1lpiOj1YL5wMuu+Oex4UnCSd71LB6zUmyyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11698617},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f293365818e567e354fbfebe479caf13c4e89227","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.15.9_1768489850992_0.6604156128774725","host":"s3://npm-registry-packages-npm-production"}},"4.16.0":{"name":"@superdangerous/app-framework","version":"4.16.0","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.0","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"f96d1d31ac2600915e4dbcb8d324c381288736a8","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.0.tgz","fileCount":259,"integrity":"sha512-+v8ipc66NqpUuWDuohJMCtFtTCtaxOlik4UW5t62GRSlbT/3Pq0LjmTXNKmHBDiRYvxqVRriOg4GSZ+8KGuRmQ==","signatures":[{"sig":"MEUCIGhqNCVy6Q6RBW4yBtUTSP7BTYyG+B6rY0BkvID/4MY0AiEAuKALDiYpTtE1Jq1OWAtEqr+X9K+AbzNx9ZFXFtfShYo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11698956},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f293365818e567e354fbfebe479caf13c4e89227","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.0_1768554890470_0.15845683412357658","host":"s3://npm-registry-packages-npm-production"}},"4.16.1":{"name":"@superdangerous/app-framework","version":"4.16.1","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.1","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"0254b521fc47297418cfe360c5c2a750d67b3859","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.1.tgz","fileCount":259,"integrity":"sha512-1RWpCSRrO6EOPLmTu229jnPz+w8bmduptgWnAhUGrhffKjuAdQQMia5ln4L3/+1lmvJAiT5zWvP2Xb16lywUHQ==","signatures":[{"sig":"MEQCIDqIi8fxIkPUfeBpOHHyhFfhzH+Rr2llUNW8lVwt7MP9AiAfFxaS/d4moIbUehn4wlA4xAFtwxuxvQ9erYxRYKS1MA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11698956},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f293365818e567e354fbfebe479caf13c4e89227","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.1_1768556511149_0.8646748182066777","host":"s3://npm-registry-packages-npm-production"}},"4.16.2":{"name":"@superdangerous/app-framework","version":"4.16.2","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.2","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"a1818ca23a032c29dd7e80d58545cac33baf20d2","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.2.tgz","fileCount":259,"integrity":"sha512-JqjXsszKIS8hkvm8puvgsOAQzgfsJjW165TolAbBmFLt4o44PsXmZw8yRYU9LO5qPbF7FZH5Ny0nulZVktoO1g==","signatures":[{"sig":"MEUCIQD31HcNYhGy/6Fq9AHjtKMl8l4oMiBTM336Q2pEygGWqgIgMImSUQHLzjKZV0i8TtT/ri9ugEfOAtrV0i7l12Jb8+E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11704676},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f293365818e567e354fbfebe479caf13c4e89227","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.2_1768557410772_0.8936177611767364","host":"s3://npm-registry-packages-npm-production"}},"4.16.3":{"name":"@superdangerous/app-framework","version":"4.16.3","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.3","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"d26f141d6e0d8bbf5a92f393d173e58402d0e8da","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.3.tgz","fileCount":259,"integrity":"sha512-4CXOVQt6sAkm9D+3OJmzKhjzKQ0BNTidcrtFv3EwqAkCxXY9ftQrA3zCuAhtVvibrdgikiF3Wh/OJnLF5fdwVg==","signatures":[{"sig":"MEQCID8Z16N7TJdgeaSPD6sRMRPezKQCkSJo/2GHBTi9zaSTAiAeXNO8pqsEJJ+WSQmjXmR91PNgEo4XXZpQ4z4XCd4zqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11704646},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"44c28de6614617326589f606f8fe21d4896e0423","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.3_1768600759728_0.6559766686040474","host":"s3://npm-registry-packages-npm-production"}},"4.16.4":{"name":"@superdangerous/app-framework","version":"4.16.4","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.4","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"5055e95684dd1f09ce7ab9e09bf25bfd0cc3c3bc","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.4.tgz","fileCount":259,"integrity":"sha512-QdnPa68pDY81tcQ22t6L76zTsVIPMlX0wDODThSN39J4Hio2ejCwGaamDBmL+ha1GguOuhm5KTik7utB8VpGVA==","signatures":[{"sig":"MEUCIQCr7jd9qcXL/tuJZN4d3i1YP6tHokna3JvG8fGD3TmIQQIgEwO0SYmETtcJgE4Vg8a2DDKyGPRnfR1wocejFDaAsSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11704631},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f5280485f5758126ababd390cab250c632d43074","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.4_1768601299029_0.9746773670761004","host":"s3://npm-registry-packages-npm-production"}},"4.16.5":{"name":"@superdangerous/app-framework","version":"4.16.5","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.5","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"992c678af910178b251d12bd7da966914db091c2","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.5.tgz","fileCount":259,"integrity":"sha512-sqczNpjWdqHX1Sx4h/BOtBHzfOJgvUpyzkG8fgf+DY2yXQ2cL9Fb30QcbbAdOgRC0R3vHI+wcxj2KRWUnICB8g==","signatures":[{"sig":"MEYCIQCkDis9H8ghREaYZMl6WGphgmiL7XkJaJ22k0k3py79fAIhAPsXLdsS+U+kqtsy0LTHsQ4nYa+PaXplc73Gijx1arKh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11704711},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.5_1768601492147_0.4885571928677799","host":"s3://npm-registry-packages-npm-production"}},"4.16.6":{"name":"@superdangerous/app-framework","version":"4.16.6","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.6","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"cf01f046da2eb17f412c8005bd1e03b6d7e5a750","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.6.tgz","fileCount":259,"integrity":"sha512-j4+bu3ADEaelNb/nOgFV/9wdHYTP1t6PCQWzWtm/33bCBoqX2+XwctmTu9/HzdB9I9S70QVS6hgvDbqgwD0ueQ==","signatures":[{"sig":"MEQCIEsRPezzU36ZOMqR3WN09o1/eFzh4eDdCW08SpbMpEXHAiBf7QYi1+jZ30mkke80XwxefnRXHZm1ZrHBIAt26V/fmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11704719},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.6_1769254547385_0.14388768169780586","host":"s3://npm-registry-packages-npm-production"}},"4.16.7":{"name":"@superdangerous/app-framework","version":"4.16.7","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.7","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"7ae85c4961026cff3c71953ccf943394ad977871","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.7.tgz","fileCount":259,"integrity":"sha512-AMjVxcUNVDBRN2bLa742B6LZqN867SY7l35I/SX3NCZttNjXq2/iDMMl4rw3JcwVFIQHILwIJddedcgcynXdwQ==","signatures":[{"sig":"MEUCIDcJVcD0bzbkmZDy/Pe71JXNipvsy7AkDv781uMQrqzEAiEAiRMahQZ2KnYId1ImW1WED95Q91W2WpEP/coz0kMLNNk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11711464},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.7_1769255142530_0.02350531947553236","host":"s3://npm-registry-packages-npm-production"}},"4.16.8":{"name":"@superdangerous/app-framework","version":"4.16.8","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.8","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"2fedc304bd8268ae4f949bf63636aa3da0f7c125","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.8.tgz","fileCount":259,"integrity":"sha512-MiQA5/PoeXHJalv+Tc+i6FFck4z2v6i1CCMLa5eeTReRNw47P5Ght7Eg4wTmOMvK/HF5xAhlxKGm27QhaYbUpg==","signatures":[{"sig":"MEQCIDoergnX0Ttu4BvyBMbEkJfTncy4vNFfCssewVOR2i8KAiAjw7SIxbhZDhwnyga1PiR9fkcwiekg8W9RiXKbor+eAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11736292},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.8_1769255682018_0.26297312440149123","host":"s3://npm-registry-packages-npm-production"}},"4.16.9":{"name":"@superdangerous/app-framework","version":"4.16.9","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.9","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"32510b6f794d26a6d835273af4b3c3e7ed265795","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.9.tgz","fileCount":259,"integrity":"sha512-dvWwtm6wHWC1a720S3Aj55k04Ip1Ot4lJpN296QG3Q0c7o8Y0l63brRFd3f1SsvkVcUxPYQ0Cfosu38DMUrKPg==","signatures":[{"sig":"MEYCIQDAnanCQwUQ36+0LSmSoGaZ4nEjWgQQAlSPYQ41y/nnUAIhAMB3/iAy9+w9LuZuOXx7uG7y4jLkNO17K4rvDsBZsRbD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11736356},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.9_1769256151380_0.18876595727506906","host":"s3://npm-registry-packages-npm-production"}},"4.16.10":{"name":"@superdangerous/app-framework","version":"4.16.10","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.10","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"5dbd437f39e762dfcad77d10ce4d60b64b48eb83","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.10.tgz","fileCount":259,"integrity":"sha512-KjYPnKd/PU2OoehCbdrmo/vHiFqqcN9dejxORCJlW+CQ8cumSMdyXzCarObaqd5UMXrh6xG1F8NwIG0ELAjW8A==","signatures":[{"sig":"MEUCIFlVaFtE0rIvmyg0GH3Ndp/AbI7yc45NMvzTlAWNXYb8AiEA7XwliCYPURQjyiPdmupR73stYpYTLEJoUgOqVToLtEw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11748269},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.10_1769256818474_0.6387659175067257","host":"s3://npm-registry-packages-npm-production"}},"4.16.11":{"name":"@superdangerous/app-framework","version":"4.16.11","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.11","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"c198cf962b686c10dd698d15e02b637c3b66f2d1","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.11.tgz","fileCount":259,"integrity":"sha512-7OMoKlyQy+Tb5pjB57K/ZLfHimOQ1BzrXZJISyoh3HExCE2kipojegUl6U5WhSJcgoC94mO4mBV+r+zz7yytPw==","signatures":[{"sig":"MEYCIQCrSED1I4UYzh/tbE6iI5RMbQdZU0AVR6tvzOTPU6NAsQIhAJGYqKB2E9NNY09oW4//K52tmymfPuug3UcxtHZ+fz4o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11750620},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.11_1769257561811_0.687093522595063","host":"s3://npm-registry-packages-npm-production"}},"4.16.12":{"name":"@superdangerous/app-framework","version":"4.16.12","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.12","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"bceea30606305e109ec104ae8612440a488d1dd7","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.12.tgz","fileCount":259,"integrity":"sha512-B1Hur063A9Hfg0rHXzkmlPlxe47XJQRS84bGAiSXjGcuNXq8prTkUIZwCTCHeBAUC7GcrIgbDxAFCtG+g4AZOA==","signatures":[{"sig":"MEYCIQD1lyFOZ+LzA/s9wC/XA7yR3pFYfOkeU/cEEIRA3DpifgIhAKNPtq+qhoj/DKYV78P5CrSOBUdH4JcNA2O4UhXF/6vY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11750463},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.12_1769257957214_0.20163412801653258","host":"s3://npm-registry-packages-npm-production"}},"4.16.13":{"name":"@superdangerous/app-framework","version":"4.16.13","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.13","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"53cbf7425d48bbe3ba9041c4e6959f15f91dbf6c","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.13.tgz","fileCount":259,"integrity":"sha512-98qQBcm/lgPxyJwdlZul4FlWAGfQ1hnHiNLHl+t3moewp3xMC8iCM3iyd5K7mLCCrltXOzeLFdQL6aTy+lTZyA==","signatures":[{"sig":"MEQCICgtV62dzuoHwOLzYxyrSWr5ZWw46jU+6Z3naA5yExy+AiAbXvi13GAd6b20Te2bsEPYqgEcx5qZpri2cNJYo1RjLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11776616},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.13_1769258859509_0.1740025807143264","host":"s3://npm-registry-packages-npm-production"}},"4.16.14":{"name":"@superdangerous/app-framework","version":"4.16.14","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.14","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"9cf5e674abcc5a4efa8e587654b42746550afb8c","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.14.tgz","fileCount":259,"integrity":"sha512-aPcUrFqXLchqg4SivmOsKc7hMDG1FZFnBdn0B3cMTMDHn6fTvL637ctTxLKwozySps6g3cla6gFIIzDP6B07Kw==","signatures":[{"sig":"MEYCIQCmilsq0Klgkl25NZggeU9Q/h+Jm0+SfRXcajUT1+asswIhAJBNbB/QNujrRRQRs0F0iTFAbeIY43rzDhyi6MUEOfym","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11864414},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.14_1769260711753_0.3606505831382445","host":"s3://npm-registry-packages-npm-production"}},"4.16.15":{"name":"@superdangerous/app-framework","version":"4.16.15","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.15","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"9ef05b97a9f20f3552d39a6b8a4fdd003dbc79d6","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.15.tgz","fileCount":259,"integrity":"sha512-UE9H2evzW2oVQWuJhSSNka6mz4gmFHh5b0Ren9YXm6/Ua4u2KBAlLypThAYwvtQ06dbKhc53oCmh7+uUr0jCww==","signatures":[{"sig":"MEQCIH/eVpShgohdFZ3AQ2A61jtemSlsaJYWymuBGBi46wwJAiBpO0FEG03vq19S8v/4PZcJYNwc6jI4Kvkq7KHxHFpdng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11866369},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.15_1769260986955_0.19833675717146138","host":"s3://npm-registry-packages-npm-production"}},"4.16.16":{"name":"@superdangerous/app-framework","version":"4.16.16","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.16","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"e1f652e4a3cfc32245c4961a9fe8552b317df5b2","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.16.tgz","fileCount":260,"integrity":"sha512-UTSZK9A+gWRfcrSGw2aTIc/hMnzQGDDyD7veFZR0DTQ+o8Plv4+CMjQpvawhM9FhmOo80hZCX4YIWzvl0GQThQ==","signatures":[{"sig":"MEUCIQCbedV9blcNTA//a0B/QMyMALRNdPdYC/mIWOseSRKpngIgar03OFIeZpKX8bh0Rf4ReAg9CH8gr5b374GRPiZAyfE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11891964},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d127c3a6bc39424d8a2645866b366199be122f19","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.16_1769551221574_0.5199849524284559","host":"s3://npm-registry-packages-npm-production"}},"4.16.17":{"name":"@superdangerous/app-framework","version":"4.16.17","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.17","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"8b2c00ac04ab7445ad40dff442f086bbe3cf999f","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.17.tgz","fileCount":260,"integrity":"sha512-hRJzCOjt9KBvVh+0ZesP8NGV3zQAf3MjKKVjpKKaJnuhn+BFZQvJvJAgXheHiXABf5zKDOUpYyEJiMuqx49Skw==","signatures":[{"sig":"MEUCIQCXO1HC3UQg5M9wlCNFImAD0ZZYTtbSegvHj/Cq3tDBsQIgGoYVic89k9ebKdXky7eSsB1Brta32llmO5SPIcptbws=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11892177},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f5ab97901753fc2d6b7839a4f3c5528636c06d4f","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.17_1769767855644_0.6746091080719316","host":"s3://npm-registry-packages-npm-production"}},"4.16.18":{"name":"@superdangerous/app-framework","version":"4.16.18","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.18","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"6f0df6efa1297bff36d845bdc6af5a108a9c625a","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.18.tgz","fileCount":260,"integrity":"sha512-BkgPWTjLuTAbJtZmLfUPF7OCviJXsCpHtbvlRAo8WiU2lqvR4RwFPwBr6sqj1EhBmuFoHQwEpPockx8/6hQ3iw==","signatures":[{"sig":"MEUCIQCVqr2k/qzeodZWQI/6LdpPfXGcphkJ+R/ZeLYbZESvEwIgF0cNAKge5EMdGot4r/LB8ow/AvpRPMHN9sLaCvPWJGs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11892177},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"b8c314b92be5256cb1317b315244431f932e167a","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.18_1769767980376_0.5148639730060445","host":"s3://npm-registry-packages-npm-production"}},"4.16.19":{"name":"@superdangerous/app-framework","version":"4.16.19","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.19","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"3a5ad8b49b350ac9563e49e499b31deea94dc0c9","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.19.tgz","fileCount":260,"integrity":"sha512-xilE3mHFsI/py1IUepfbcS/5GwsVXTuPT2rT86BaqRNu5Exl3mCdtyCNUGCGOB7ewCqgg0J4s1zaQ/GjuHGBpg==","signatures":[{"sig":"MEYCIQDw7gPfNAdnoqkFLquVkG4SvxKNEg+vFdMaGYAPjhb/oAIhALi/NWTGH143VqqRJViRSTzCQx3d+KclLuR3bVN0Fa5f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11891485},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"fef11e5ec3689ef76c2a395d0613cc640df8f15e","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.19_1769768487076_0.5076770769587673","host":"s3://npm-registry-packages-npm-production"}},"4.16.20":{"name":"@superdangerous/app-framework","version":"4.16.20","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.20","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"d88cfbb15149b55066d2c5de1e6930b6e57e5d1d","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.20.tgz","fileCount":260,"integrity":"sha512-OX6hTwcffYmNMhV4s4DkpzjavwzGRAmpPSNppQT4mDK8XEaRVi4/LkdULq14EM85LMNPOnZOWbnx1jajzoaQyw==","signatures":[{"sig":"MEQCID/BdwxFZMr/+ThpatzeiyzE0UMnFKzAlcyIXHhiZS0EAiBbvXt4xyDH5iIAJLXO54csCKQ2Yj0D3y2cjI625OAzPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11890935},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"14f05160fb0f7daa959ee112274ddbcfb5ec6b26","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.20_1769770269320_0.9063095902396783","host":"s3://npm-registry-packages-npm-production"}},"4.16.22":{"name":"@superdangerous/app-framework","version":"4.16.22","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.22","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"25d5e9ab927d2629f95df6977381c24c8581c109","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.22.tgz","fileCount":260,"integrity":"sha512-/SeU9uWv/57caqCtmbvxkU/1g3J0AN5uwzTxWbCkd0IikpdHGuTsBc0hZQO8jxNwp2ScqGUY9iNS4vBX0EbJrA==","signatures":[{"sig":"MEYCIQDCXLGNdgPPy2viw+LnwFVRsLhV2jTRnVPjnKZJsafmeQIhAJGzH80EfVyETKtue+uOYwur/LRY9ft6t+CeOr0XFvl5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11896149},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"c6f83b883b11d1a9ee89b44517afc10191edfc8c","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.22_1769950964583_0.6717854173022704","host":"s3://npm-registry-packages-npm-production"}},"4.16.24":{"name":"@superdangerous/app-framework","version":"4.16.24","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.24","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"696b7947074171c5810c02f09955988d74825974","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.24.tgz","fileCount":260,"integrity":"sha512-pUiQ6bhN1zDp2G3mAGxWOvKdiVoBJX+GqjXREaTPcrWEW9PZ5r1hcKWL/sc9C2q0pjB6nyXR6iN/1E0xsoRClQ==","signatures":[{"sig":"MEUCIQDoWqHykf66jczlletXoNqLYlrMyhasjl969ypcc9ukDQIgCj/TeSnFisn6R/XJC1qMdoX9HEVGOH6c7TZvb6QXUEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11897295},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f0e6cac3cc71d7e10ec900661433ea792505ed8e","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.24_1769951763938_0.9844432099715328","host":"s3://npm-registry-packages-npm-production"}},"4.16.25":{"name":"@superdangerous/app-framework","version":"4.16.25","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.25","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"28a81104f0f44ebcd76e6d528f4a5b445b6d3c80","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.25.tgz","fileCount":260,"integrity":"sha512-intetSyvy1xQuUGX8Op8SRW2u+5GrAAr+cdKHUDAqwADy3wdvXKgMSILNvAgxoju390IdlqxgoZg7meeI/J7xA==","signatures":[{"sig":"MEUCIDs+40XhY3ESf+H0ulKeNbPuzGfLpOe0L2ZPX7pebBDuAiEA57OJnq3EkA3oN22EJZjE+FbpXM/YBUXAFjSOXmKaWGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11898199},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"a2a2bca618f7c8de275e2e164d6f5202b5f65b34","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.25_1769952332188_0.5456955012102618","host":"s3://npm-registry-packages-npm-production"}},"4.16.27":{"name":"@superdangerous/app-framework","version":"4.16.27","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.27","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"10dca039fd9154c9fc1a149b98f4902acae7fe0d","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.27.tgz","fileCount":260,"integrity":"sha512-KXvsjvZ6GaCtFiJ4RjuD4fyzYe7VT9orFRoKcKgoD7R1LplFVt9PRST6TPo+FMNQg98YiFMewPo1LmL0pP3gwg==","signatures":[{"sig":"MEQCIHqWm6UUO19+qLspdKRWprRDaXs95BH81qG4PVtlDwE8AiBdwHJzjkc/F3N+WSil8Py+0PhVceC4cxJDGgl0u8atvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11898413},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"12f958035ff412c77fa6998af1e3af7edaae882c","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.27_1770154435256_0.11976535095522456","host":"s3://npm-registry-packages-npm-production"}},"4.16.29":{"name":"@superdangerous/app-framework","version":"4.16.29","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.29","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"4b5f5526ae1a9b759efe29161445315068049c6a","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.29.tgz","fileCount":260,"integrity":"sha512-FyJkrnYbXALjotOQqzTaKtgG0uv8ZBv9W+nb+jVEzEuW2chqy0AkN8TdaDo/gKLRGQ3kwyYdwbHL3ctgdZDYCw==","signatures":[{"sig":"MEUCIQCymQt7pcj7iztAVWdoOBdwQykhDFuetox7xjQVuoyGkwIgCzlxOO+uY6EUJBuVjD6QAoCC2XQivwUD1R70zpG9bpI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11898318},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"14391993f680678bdf98136e07c669f006632065","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.29_1770155082149_0.5663811626516835","host":"s3://npm-registry-packages-npm-production"}},"4.16.35":{"name":"@superdangerous/app-framework","version":"4.16.35","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.35","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"98fb4ff34f84584095d4f49107c2451d6a2867b2","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.35.tgz","fileCount":260,"integrity":"sha512-ORAVmHVfD85DKsEFMpMNe1hDLOamZk7xe3l8fa6aFbkJGTBpv3IIr5aAfUP3JVHLYKzOLvq8HOQ+aNdj2WCAAg==","signatures":[{"sig":"MEQCID8gbzMSbjpLbsIRuA7QD2cYMq9UugyprfkDBwHQT2QlAiBmkh/JelNzDD0cuKo27RzeTVG8yqbFP1VGAGKOjpwY6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11905246},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/data-table/index.ts","import":"./ui/data-table/index.ts"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"e1971a400f0effc4880996bb4a43fc2b08f3e82e","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.35_1770496628730_0.8402620159508125","host":"s3://npm-registry-packages-npm-production"}},"4.16.36":{"name":"@superdangerous/app-framework","version":"4.16.36","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.36","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"1a85f8477c5d64a595913c77ab1402408d5f37e7","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.36.tgz","fileCount":250,"integrity":"sha512-DQIdoMR3GQ8vqmgHR9c2kNQokxc6o0fhC5dKuf/y/JPLCEQEbFdxRYmWaFl9/KYWnGg6LgzL7JgSInc6Ny+g7A==","signatures":[{"sig":"MEYCIQCzFc7Tp/vlxZIltGUk5G8cXmMczjo8dujk7N3r/AFWMgIhAJEBNFw98n5ZRtrykJX0XH8K2cG8f28Jo6veNdv/WiT4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12223278},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"da39c5afc67963620869793e3a8d3759e7cd37ce","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.36_1770497123922_0.35323830631806374","host":"s3://npm-registry-packages-npm-production"}},"4.16.37":{"name":"@superdangerous/app-framework","version":"4.16.37","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.16.37","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"a8e251f6ffb9f4f8a5a6f8ec41ef4a31449563d8","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.16.37.tgz","fileCount":250,"integrity":"sha512-/+UgHRdeXWg4sRMnph0/g4R25uM0HuaINtcEsYSqeFESIidLxM8iiwdsH5IhBiytjxGwxJqPgaMkQqxnMXcssA==","signatures":[{"sig":"MEYCIQCcCilrDCuXTEU396LAtOzZUAHx09tQhqXNc84WFE7m2AIhAN3yyHiGP3cGefR6ccqQ1tL5dyz1UdmEdYawNI/We351","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12279753},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"ac20ed2684ce370d4f984cc2f2fb7d29e79ff0e4","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"10.9.2","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","archiver":"^7.0.1","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","@types/multer":"^2.0.0","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","@types/nodemailer":"^7.0.5","swagger-ui-express":"^5.0.1","@types/express-session":"^1.18.2","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","ts-node":"^10.9.2","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/express":"^4.17.23","@types/archiver":"^6.0.3","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.16.37_1770713110993_0.7525442430545806","host":"s3://npm-registry-packages-npm-production"}},"4.17.1":{"name":"@superdangerous/app-framework","version":"4.17.1","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.1","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"fbf0fa74b680a5911bad4c90cc7db1781489d430","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.1.tgz","fileCount":253,"integrity":"sha512-XHzH8HdwYqQspkydVbK7n9N+Cdu7zlVlgdilX1r4klvWGjoqWA52uzLU8a+gCaXPEfeX9tnwItJhvdjCu2g5JQ==","signatures":[{"sig":"MEQCIFqiHM0F/Csh2MqJduTkkUbDYOXJL2ioLbwTpGVE0QpnAiBvah8KqLxIo14JiYEe4rYxSjrIINmzA/mXIfOQGwaBcw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12361333},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"6af2fab85808cc66432b940da5cecba89d27e22a","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.1_1770719273613_0.01625266170379369","host":"s3://npm-registry-packages-npm-production"}},"4.17.2":{"name":"@superdangerous/app-framework","version":"4.17.2","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.2","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"612600309b0696692cbd2ca6b0d1d96a94a462a6","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.2.tgz","fileCount":253,"integrity":"sha512-G34+ljyvXuQaU5IcX/5JxQZRgsHGS8kA6GrT76tVh7CilDydUoy6v3ehHEO5aUx73wAEh7lDVxADxeZ54ri75g==","signatures":[{"sig":"MEUCIBzm0nvdTkOJhcucX6qvFhyzCzFNtxnIomeJwCbrGs50AiEAiwiNbV7F70GnUJ2/tQWOkris8gjmBNL02s7GklJPUwY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12361333},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"7117ee5073be4d13409c2b85637a611ef2636107","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.2_1771170106798_0.5485390194199775","host":"s3://npm-registry-packages-npm-production"}},"4.17.3":{"name":"@superdangerous/app-framework","version":"4.17.3","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.3","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"53126d8af48609d327f914efa7ec3a2b9dceba7c","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.3.tgz","fileCount":253,"integrity":"sha512-kv1IkXWgU52e8UAy4rduXrMSJ1km4rVGxMry4tGuqJuj3MaaelJaUPH606MzYmCFW4t55yi9M4Ni492B2jnfZw==","signatures":[{"sig":"MEYCIQC3FKpSIM89/BiZVjM3CNuHgUVzr82xNREJWdd333IM7QIhAIR3Z8mqTzRIMesf+OrEDvD7Gh97FDeJnQ8XR/gZvSPl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12361434},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"f000d7b4c64aa178dd806c1337981fed4b7774fb","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.3_1771170530701_0.3237244545288447","host":"s3://npm-registry-packages-npm-production"}},"4.17.4":{"name":"@superdangerous/app-framework","version":"4.17.4","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.4","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"5689a4818c9d8e7f6d21a6c6c39427fe5705ca61","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.4.tgz","fileCount":253,"integrity":"sha512-E0csWXI7MLDRBe+nLdMyEUG0cNYznTjT+R3k5m/j/WoOTEz40luMete9NB9vBwVy0rPOVKsxxuRax6u9J8pkEA==","signatures":[{"sig":"MEUCIDSxzCoVdBEDhpkKZYxaFIVbaTeoAWuZIQhLQhLXjfhKAiEAt5XPCt5DkTgSl7HPbIbPItLeZR/z2obb2AQSzQWAkmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12361434},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"54408946ecef9d0caee497d069aaaacf7da794d3","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.4_1771174698030_0.5491326960627618","host":"s3://npm-registry-packages-npm-production"}},"4.17.5":{"name":"@superdangerous/app-framework","version":"4.17.5","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.5","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"6a32afafca39f8c60de48b0c722744560c2ff7ff","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.5.tgz","fileCount":253,"integrity":"sha512-haCHaNH6C2WSXf1l8EXmn/S+7mNqXXT8g4nQEyRynGAU6Tg2aCe+1uTuShx4xSwhae677a7nIcsRiJPpk+Bgfw==","signatures":[{"sig":"MEYCIQDkjCfxfEWprkBpPCZ8PlhgtspaGO6fECsLQ4NqjjWR0wIhALf5H2k+DddlmQ4nTUuJPnzqexFMRhhj/Lo7bAe5yf5b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12378445},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for structured vibecoding - building internal web and desktop apps with batteries included","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.5_1774030673423_0.05582226208790653","host":"s3://npm-registry-packages-npm-production"}},"4.17.6":{"name":"@superdangerous/app-framework","version":"4.17.6","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.6","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"40ec089645b1bba440f3a35fcbc4d0df7ee50b9f","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.6.tgz","fileCount":253,"integrity":"sha512-DK1buC+K/jvcNFyqHs/mxlXqF8+AgFJMOtXNnv1Yjm9ZTo63E/jYl7FbsRP4ebam4NZ9Vhd55ldT9vTCdjI/8A==","signatures":[{"sig":"MEQCIEfO8P4cq+v2Z4tFRZGroR0XTI2RrfA7FQOhCk6rus+dAiAQdDd3wDgVZYmcjlQ/pRZBEgDppb+9AmK4o5lgRAV+5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12412077},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"3d123ecc649bac62f9a0742e68b0ac320fe22fb9","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.6_1774044217292_0.3836369042462744","host":"s3://npm-registry-packages-npm-production"}},"4.17.7":{"name":"@superdangerous/app-framework","version":"4.17.7","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.7","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"60b0be2de84669a6046144917d45c09868e3d8e9","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.7.tgz","fileCount":253,"integrity":"sha512-9zpQz5I9OES8jW7VYdmk+50AzWCqSnTghH7vvQfMTjJ/O2d+bKTOUbDW6cnMNPezAaVaZiIhK7M+rupGIa0Mog==","signatures":[{"sig":"MEQCIBvPdp0EDXiBibgwlz23e+3gAObB19HM3gSpbGeSzKIOAiANxMfw/eKi1+p5JFrT76mAN9l6/SYbjOi+eSxdFe/L0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12412099},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"a795489437f651ce9815c276b343a21cd6a42fba","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.7_1774044403076_0.7888316499166828","host":"s3://npm-registry-packages-npm-production"}},"4.17.8":{"name":"@superdangerous/app-framework","version":"4.17.8","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.8","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"bc202b94a5def289359a5318bf1337603264e9b4","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.8.tgz","fileCount":253,"integrity":"sha512-majXCH+NF2SJP5i1VouxPeW1SG3iyadbIalzH+tYJDHVWB6PgpwG40tetlSHtCWux7CQBLASHpgv/+00aUta0Q==","signatures":[{"sig":"MEQCICeRqbz3hVatgMEcT63vCpodFywp10o/18bQ918OhpHYAiAm6dQJqKdbMt9PMvdkUKtiB/hZGYTvuk5t7q73GQoeKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12443546},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.8_1774046782632_0.6099747971310565","host":"s3://npm-registry-packages-npm-production"}},"4.17.9":{"name":"@superdangerous/app-framework","version":"4.17.9","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.9","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"119d499bbb60308248983fa4d6f25450eded0331","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.9.tgz","fileCount":253,"integrity":"sha512-UKGp4jX9bG5x/P8V7NbLsXQslbP8qxMQ1n7wEkt6rDoVsJtGxq8GIPV6qVmQuHeMkN8GYX0AFmcdBxo2fanmoQ==","signatures":[{"sig":"MEUCIQCrRbRPtsV4uwHMR1la+fjjO9XdY3w0gKclwamT2+MrcAIgUCPR4xJFGLp8sycOk2DkvcjK4ng1YItFu7cU/BKdHRY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12443582},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepack":"npm run build:all","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.9_1774048225838_0.45694034378021664","host":"s3://npm-registry-packages-npm-production"}},"4.17.10":{"name":"@superdangerous/app-framework","version":"4.17.10","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.10","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"0705dbd65a23c95b49ee2794bbe575e1cd5bc2bc","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.10.tgz","fileCount":253,"integrity":"sha512-ZSZ3e2CyXNjwJSueF6adYNp1euIxTxSfBEfsW685Qen6N829PsoWwfOtUF9KVzREDXPR21OZmvla9TTCzv4BqA==","signatures":[{"sig":"MEUCIEkG7HlubL3ACb8iPzDfLRNMapwKfKxojkQyAq6dRym1AiEA2lr1h5Nmzaw3BXgKnOqpOQiqMSgKCPcB2xxZwW1rjkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12456066},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepack":"npm run build:all","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.10_1774083525081_0.23669162433509872","host":"s3://npm-registry-packages-npm-production"}},"4.17.11":{"name":"@superdangerous/app-framework","version":"4.17.11","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.11","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"cc12bfb9c6e33829d88f5f609dca8dfc3b370722","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.11.tgz","fileCount":253,"integrity":"sha512-5RYB0zBk8cVT+TSN24kHTe+kmdhjdEWAGbt19GmnVMI1VphqXKBAosqLNqLs6Fy1pZ2aGljN28H0BffFoFmHpQ==","signatures":[{"sig":"MEUCIHHPWZoByK+O3mABpeyeCaquUVPfpK2sWZs0uYWq/L2FAiEAvbUuCfD3Cy/ZUNN/HSQSlDlaV4yFkMzHb+LstjOBwt4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12464157},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepack":"npm run build:all","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.11_1774084123845_0.9248229818071929","host":"s3://npm-registry-packages-npm-production"}},"4.17.12":{"name":"@superdangerous/app-framework","version":"4.17.12","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.12","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"1feaa7f660ed29f0312a6fafed50d8a19c81ed64","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.12.tgz","fileCount":253,"integrity":"sha512-j7xOR06/ghbivUvqsF0YV2ZJeMPWGm0RYtVSiiMXpqL3azfIfnowsaEQs3tbte9rX6PIdgKOc8Xp7twGrjBeHQ==","signatures":[{"sig":"MEUCIQC6CKh+zSdhcU+y7rCoMMTy9y7t4r2nN1Ej/2mHEo4wwQIgLmCI14PHyJsm+mHEsg6qBYKU5HZZSLhhuoihWeBYWzg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12511500},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepack":"npm run build:all","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.12_1774257408481_0.8433234917385501","host":"s3://npm-registry-packages-npm-production"}},"4.17.13":{"name":"@superdangerous/app-framework","version":"4.17.13","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.13","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"18d3c00db5150d3f2f2b2b661c80d4f62a8055fe","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.13.tgz","fileCount":253,"integrity":"sha512-PsFW0fyYKqVpRBYsHq5b6sf2GU/wwSILAoArLzDpYCiqjlFmCfhvej9ois+6DWOst2zdbieWTYzp/E17Ve0CuA==","signatures":[{"sig":"MEQCIEh1jR80fcvRXtaBYJjb2uP3NS3XEbyKxNd/5tQlfCb+AiAtWmAhiMfWAHmw4xCqdr4UuTNVCaA6teFJjkWRyX5gUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12519425},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"041b16f50117fb22549189db6f8d243f53da4e98","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepack":"npm run build:all","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.13_1775653171193_0.44591267361693077","host":"s3://npm-registry-packages-npm-production"}},"4.17.14":{"name":"@superdangerous/app-framework","version":"4.17.14","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.14","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"f12b85a98a2ea0675eacd5074f82fdc22e14cae9","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.14.tgz","fileCount":253,"integrity":"sha512-ETx/heul+7689tDYoEfuUtiGk/xZB/b6dLzEDIigJDgW2THpcrKcFjUfraTyQCFwv2i+EC/R88j7aiDZIjlLBw==","signatures":[{"sig":"MEYCIQDTuwWE1UzQFV/DN2BdjiQaHqo5MujdPGuPSoPzUJXT9gIhAP+8pM5aBUp3PP2rxhMI3YVKKC2xtvwMcFgN8eNtMk1p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12519164},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"041b16f50117fb22549189db6f8d243f53da4e98","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepack":"npm run build:all","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.14_1775663534236_0.06200574281343374","host":"s3://npm-registry-packages-npm-production"}},"4.17.17":{"name":"@superdangerous/app-framework","version":"4.17.17","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","_id":"@superdangerous/app-framework@4.17.17","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"homepage":"https://github.com/SuperDangerous/app-framework#readme","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"bin":{"framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js","app-framework":"dist/cli/index.js"},"dist":{"shasum":"cee42c8a6c036ed68184b09ce8870caf3c95e0cb","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.17.tgz","fileCount":253,"integrity":"sha512-uhDdtgRF98PSUsctb7Ey0hxXAwOhdObul2qXLbGf49hquWLKzcm0EKyml+RFp2oN/7PZv0Wuaw+2X8A+r5aO6Q==","signatures":[{"sig":"MEYCIQC4k7+H4pn0lqj0EqxxC02lsrMyFs8C1k0h0Q7Oht/ylAIhAIXhBlxBV6819xXXLU7a6REyV6ap1eANTC1cX7GGWkSP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12546244},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"gitHead":"d1adc3ab26fd41c5608f721c4bbea300b5d0405a","scripts":{"lint":"eslint src/ --ext .ts","test":"npm run test:unit && npm run test:integration && npm run test:ui","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' '*.md'","prepack":"npm run build:all","prepare":"npm run build:all","test:ui":"npm --prefix ui test -- --runInBand","build:ui":"cd ui && npm ci --include=dev && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src/ --ext .ts --fix","prebuild":"npm run clean","benchmark":"node benchmarks/index.js","build:all":"npm run build && npm run build:ui","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","test:unit":"vitest run --config vitest.config.ts tests/unit","typecheck":"tsc --noEmit","docs:build":"echo 'Documentation site build not yet configured'","test:watch":"vitest","build:watch":"tsc --watch","format:check":"prettier --check 'src/**/*.ts' '*.md'","security:deps":"npm audit fix --audit-level moderate --dry-run","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration"},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"repository":{"url":"git+https://github.com/SuperDangerous/app-framework.git","type":"git"},"_npmVersion":"11.0.0","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","directories":{},"_nodeVersion":"23.6.0","dependencies":{"zod":"^3.23.8","cmdk":"^1.1.1","cors":"^2.8.5","boxen":"^8.0.1","chalk":"^5.5.0","lowdb":"^7.0.1","sharp":"^0.34.3","dotenv":"^17.2.1","multer":"^2.0.2","openai":"^5.13.1","resend":"^6.7.0","esbuild":"^0.25.9","express":"^4.21.2","winston":"^3.17.0","unzipper":"^0.12.3","commander":"^12.1.0","papaparse":"^5.5.3","socket.io":"^4.8.1","nodemailer":"^7.0.12","swagger-jsdoc":"^6.2.8","express-session":"^1.18.2","swagger-ui-express":"^5.0.1","winston-daily-rotate-file":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.4","react":"^18.3.1","eslint":"^9.32.0","vitest":"^4.0.13","globals":"^16.3.0","typedoc":"^0.28.12","prettier":"^3.5.1","@types/ws":"^8.18.1","react-dom":"^18.3.1","supertest":"^7.1.4","typescript":"^5.7.2","@types/cors":"^2.8.17","@types/node":"^20.10.0","npm-run-all":"^4.1.5","@types/boxen":"^2.1.0","@types/multer":"^2.0.0","@types/express":"^4.17.23","@types/fs-extra":"^11.0.4","@types/supertest":"^6.0.3","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","@types/nodemailer":"^7.0.9","@vitest/coverage-v8":"^4.0.13","@types/swagger-jsdoc":"^6.0.4","@types/express-session":"^1.18.2","@types/swagger-ui-express":"^4.1.8","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/app-framework_4.17.17_1783436882784_0.6472421348242354","host":"s3://npm-registry-packages-npm-production"}},"4.17.18":{"name":"@superdangerous/app-framework","version":"4.17.18","description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"app-framework":"dist/cli/index.js","framework":"dist/cli/index.js","dev-server":"dist/cli/dev-server.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.js"},"./middleware":{"types":"./dist/middleware/index.d.ts","import":"./dist/middleware/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js"},"./desktop":{"types":"./dist/desktop/index.d.ts","import":"./dist/desktop/index.js"},"./ui":{"types":"./ui/dist/index.d.ts","import":"./ui/dist/index.mjs","require":"./ui/dist/index.js"},"./data-table":{"types":"./ui/dist/data-table.d.ts","import":"./ui/dist/data-table.mjs","require":"./ui/dist/data-table.js"},"./ui/utils":{"types":"./dist/ui/utils/index.d.ts","import":"./dist/ui/utils/index.js"},"./styles/globals.css":"./ui/src/styles/globals.css"},"scripts":{"build":"tsc","build:ui":"cd ui && npm ci --include=dev && npm run build","build:all":"npm run build && npm run build:ui","build:watch":"tsc --watch","clean":"rm -rf dist","prebuild":"npm run clean","postbuild":"node ./scripts/postbuild-ensure-cli-executables.cjs","prepack":"npm run build:all","test":"npm run test:unit && npm run test:integration && npm run test:ui","test:unit":"vitest run --config vitest.config.ts tests/unit","test:integration":"vitest run --config tests/vitest.integration.config.ts tests/integration","test:ui":"npm --prefix ui test -- --runInBand","test:watch":"vitest","test:coverage":"vitest run --config vitest.config.ts --coverage","test:security":"npm audit --audit-level moderate","security:deps":"npm audit fix --audit-level moderate --dry-run","benchmark":"node benchmarks/index.js","docs:api":"typedoc --out docs/api src/index.ts","docs:build":"echo 'Documentation site build not yet configured'","lint":"eslint src/ --ext .ts","lint:fix":"eslint src/ --ext .ts --fix","format":"prettier --write 'src/**/*.ts' '*.md'","format:check":"prettier --check 'src/**/*.ts' '*.md'","typecheck":"tsc --noEmit","prepare":"npm run build:all"},"keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"author":{"name":"SuperDangerous"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/SuperDangerous/app-framework.git"},"dependencies":{"boxen":"^8.0.1","chalk":"^5.5.0","cmdk":"^1.1.1","commander":"^12.1.0","cors":"^2.8.5","dotenv":"^17.2.1","esbuild":"^0.25.9","express":"^4.21.2","express-session":"^1.18.2","lowdb":"^7.0.1","multer":"^2.0.2","nodemailer":"^7.0.12","openai":"^5.13.1","papaparse":"^5.5.3","resend":"^6.7.0","sharp":"^0.34.3","socket.io":"^4.8.1","swagger-jsdoc":"^6.2.8","swagger-ui-express":"^5.0.1","unzipper":"^0.12.3","winston":"^3.17.0","winston-daily-rotate-file":"^5.0.0","zod":"^3.23.8"},"devDependencies":{"@types/boxen":"^2.1.0","@types/cors":"^2.8.17","@types/express":"^4.17.23","@types/express-session":"^1.18.2","@types/fs-extra":"^11.0.4","@types/multer":"^2.0.0","@types/node":"^20.10.0","@types/nodemailer":"^7.0.9","@types/supertest":"^6.0.3","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.8","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.18.2","@typescript-eslint/parser":"^8.18.2","@vitest/coverage-v8":"^4.0.13","eslint":"^9.32.0","globals":"^16.3.0","npm-run-all":"^4.1.5","prettier":"^3.5.1","react":"^18.3.1","react-dom":"^18.3.1","react-router-dom":"^7.13.0","socket.io-client":"^4.8.1","supertest":"^7.1.4","tsx":"^4.20.4","typedoc":"^0.28.12","typescript":"^5.7.2","vitest":"^4.0.13"},"engines":{"node":">=18.0.0"},"_id":"@superdangerous/app-framework@4.17.18","gitHead":"643191ca6cdd83a57dedae2308fce9c3d120d15d","bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"homepage":"https://github.com/SuperDangerous/app-framework#readme","_nodeVersion":"23.6.0","_npmVersion":"11.0.0","dist":{"integrity":"sha512-QQbmGhz1UJ8eDeJ4oWIqVjCBxQO2bXR+IUTl2LbavXUbYdTGB4IunVIYZs8u9mlYdF8zwHJ/EPsfWchV3mbKtg==","shasum":"a9161a04a09ff5b76f47b77311b930c01eb981dd","tarball":"https://registry.npmjs.org/@superdangerous/app-framework/-/app-framework-4.17.18.tgz","fileCount":253,"unpackedSize":12550799,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHm4E2mC3rDmzcTWTzBPyoiQaF2grG/KuXpg/khshtd2AiBA1LvTqKZLr6e+OXFBqZqaWSRh2yMAC0a2Lr45TUdcfQ=="}]},"_npmUser":{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"},"directories":{},"maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/app-framework_4.17.18_1783440373463_0.08523880574449905"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-03T22:30:04.640Z","modified":"2026-07-07T16:06:13.827Z","4.9.0":"2026-01-03T22:30:05.019Z","4.9.1":"2026-01-03T22:42:07.254Z","4.9.2":"2026-01-03T23:23:06.798Z","4.14.0":"2026-01-05T13:14:59.795Z","4.15.0":"2026-01-15T10:56:12.870Z","4.15.1":"2026-01-15T11:15:11.263Z","4.15.2":"2026-01-15T11:19:24.913Z","4.15.3":"2026-01-15T11:22:11.276Z","4.15.4":"2026-01-15T11:50:46.805Z","4.15.5":"2026-01-15T14:05:28.218Z","4.15.6":"2026-01-15T14:15:45.405Z","4.15.7":"2026-01-15T14:42:57.156Z","4.15.8":"2026-01-15T14:57:06.619Z","4.15.9":"2026-01-15T15:10:51.292Z","4.16.0":"2026-01-16T09:14:50.712Z","4.16.1":"2026-01-16T09:41:51.434Z","4.16.2":"2026-01-16T09:56:51.094Z","4.16.3":"2026-01-16T21:59:19.950Z","4.16.4":"2026-01-16T22:08:19.286Z","4.16.5":"2026-01-16T22:11:32.512Z","4.16.6":"2026-01-24T11:35:47.659Z","4.16.7":"2026-01-24T11:45:42.827Z","4.16.8":"2026-01-24T11:54:42.352Z","4.16.9":"2026-01-24T12:02:31.655Z","4.16.10":"2026-01-24T12:13:38.782Z","4.16.11":"2026-01-24T12:26:02.079Z","4.16.12":"2026-01-24T12:32:37.545Z","4.16.13":"2026-01-24T12:47:39.836Z","4.16.14":"2026-01-24T13:18:32.068Z","4.16.15":"2026-01-24T13:23:07.230Z","4.16.16":"2026-01-27T22:00:21.870Z","4.16.17":"2026-01-30T10:10:55.965Z","4.16.18":"2026-01-30T10:13:00.606Z","4.16.19":"2026-01-30T10:21:27.335Z","4.16.20":"2026-01-30T10:51:09.607Z","4.16.22":"2026-02-01T13:02:44.855Z","4.16.24":"2026-02-01T13:16:04.214Z","4.16.25":"2026-02-01T13:25:32.555Z","4.16.27":"2026-02-03T21:33:55.529Z","4.16.29":"2026-02-03T21:44:42.463Z","4.16.35":"2026-02-07T20:37:09.039Z","4.16.36":"2026-02-07T20:45:24.235Z","4.16.37":"2026-02-10T08:45:11.271Z","4.17.1":"2026-02-10T10:27:53.905Z","4.17.2":"2026-02-15T15:41:47.093Z","4.17.3":"2026-02-15T15:48:51.016Z","4.17.4":"2026-02-15T16:58:18.333Z","4.17.5":"2026-03-20T18:17:53.858Z","4.17.6":"2026-03-20T22:03:37.609Z","4.17.7":"2026-03-20T22:06:43.370Z","4.17.8":"2026-03-20T22:46:22.915Z","4.17.9":"2026-03-20T23:10:26.078Z","4.17.10":"2026-03-21T08:58:45.365Z","4.17.11":"2026-03-21T09:08:44.280Z","4.17.12":"2026-03-23T09:16:48.778Z","4.17.13":"2026-04-08T12:59:31.449Z","4.17.14":"2026-04-08T15:52:14.507Z","4.17.17":"2026-07-07T15:08:03.016Z","4.17.18":"2026-07-07T16:06:13.692Z"},"bugs":{"url":"https://github.com/SuperDangerous/app-framework/issues"},"author":{"name":"SuperDangerous"},"license":"MIT","homepage":"https://github.com/SuperDangerous/app-framework#readme","keywords":["framework","typescript","nodejs","industrial","iot","device-simulation","logging","configuration","websockets"],"repository":{"type":"git","url":"git+https://github.com/SuperDangerous/app-framework.git"},"description":"Opinionated TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired","maintainers":[{"name":"brendan-carroll","email":"brendan.carroll@episensor.com"}],"readme":"# SuperDangerous App Framework\n\nA full-stack TypeScript framework for vibecoding enterprise web and desktop apps — 20+ UI components, WebSocket, Electron, and production services pre-wired.\n\n## 📋 Documentation\n\n### Core Guides\n\n- **[API](./docs/API.md)** - Complete API documentation with best practices\n- **[Development](./docs/DEVELOPMENT.md)** - How to build applications with the framework\n- **[Architecture](./docs/ARCHITECTURE.md)** - System design and structure\n\n### Features\n\n- **[WebSocket](./docs/WEBSOCKET.md)** - Real-time communication implementation\n- **[Desktop](./docs/DESKTOP.md)** - Desktop application support with Electron\n- **[Bundling](./docs/BUNDLING.md)** - Desktop bundling guide\n- **[AI](./docs/AI.md)** - AI service integration\n- **[Patterns](./docs/PATTERNS.md)** - Proven architectural patterns\n\n### Configuration & Testing\n\n- **[Testing](./docs/TESTING.md)** - Testing guidelines and patterns\n- **[Logging](./docs/LOGGING.md)** - Logging system documentation\n- **[Theme](./docs/THEME.md)** - Theme system and customization\n- **[Ports](./docs/PORTS.md)** - Port configuration standards\n- **[CORS](./docs/CORS.md)** - Dynamic CORS middleware\n\n#### Test Suite Overview\n\nThe framework includes extensive test coverage:\n\n- **Unit Tests**: 362+ tests covering all core modules\n- **Integration Tests**: API and service integration testing\n- **TestServer**: Built-in test server for application testing\n- **Mock Services**: Comprehensive mocking utilities\n\n#### Running Tests\n\n```bash\n# Run all tests\nnpm test\n\n# Run with coverage\nnpm run test:coverage\n\n# Run specific suites\nnpm run test:unit\nnpm run test:integration\n\n# Type checking\nnpm run typecheck\n```\n\n#### Test Infrastructure\n\n- Vitest with TypeScript support (framework core)\n- Jest with TypeScript support (UI package tests under `ui/`)\n- Built-in TestServer class for app testing\n- Mock implementations for all services\n- Async operation handling\n- Port management utilities\n\n## 🚀 Quick Start\n\n```bash\n# Install framework\nnpm install @superdangerous/app-framework\n\n# Create your app\nmkdir my-app && cd my-app\nnpm init -y\nnpm install @superdangerous/app-framework\n```\n\n### Minimal Application\n\n```typescript\nimport { StandardServer } from \"@superdangerous/app-framework\";\n\nconst server = new StandardServer({\n  appName: \"My App\",\n  appVersion: \"1.0.0\",\n  port: 8080,\n  enableWebSocket: true,\n  onInitialize: async (app) => {\n    app.get(\"/health\", (req, res) => res.json({ status: \"ok\" }));\n  },\n});\n\nawait server.initialize();\nawait server.start();\n```\n\n## ✨ Core Features\n\n### 🖥️ Server Management\n\n- **StandardServer** - Simplified server setup with Express\n- **Request Correlation** - Automatic request IDs with structured request logging\n- **Safer Defaults** - Request body limits, trust proxy, and sane HTTP timeouts\n- **Port Management** - Automatic port conflict resolution\n- **Graceful Shutdown** - Clean resource cleanup\n- **Health Checks** - Real system metrics (CPU, memory, disk) - informational only\n- **Startup Banner** - Professional application startup display\n\n### 📝 Logging System\n\n- **Dual Logger System** - Simple console + production file logging\n- **Enhanced Logger** - File rotation, compression, archiving\n- **Category-based Logging** - Organize logs by service/module\n- **Log Management** - Statistics, cleanup, migration utilities\n- **Flat Structure** - All logs in `/data/logs` for easy backup/restore\n\n### 🔌 Real-Time Communication\n\n- **WebSocketManager** - Unified Socket.IO management with namespace support\n- **Redis Adapter** - Optional Redis adapter for scaling\n- **Room Management** - Built-in room join/leave handlers\n- **Client Tracking** - Track connected clients across namespaces\n- **Broadcast Options** - Selective broadcasting with compression/volatile options\n- **React Hooks** - `useSocketIO`, `useConnectionStatus`\n- **Connection Status** - Monitor connection health\n\n### 🔒 Security & Authentication\n\n- **Session Management** - Express sessions with Redis support\n- **Authentication Middleware** - Role-based access control\n- **Input Validation** - Zod/Joi schema validation\n- **File Security** - Safe file operations with validation\n- **CORS Configuration** - Cross-origin resource sharing\n\n### ⚙️ Configuration & Settings\n\n- **Settings Service** - Dynamic settings with UI generation\n- **Environment Merging** Automatic env variable merging\n- **File Watching** Auto-reload on config file changes\n- **Change Events** EventEmitter for config change tracking\n- **Common Schemas** Pre-built Zod schemas for common configs\n\n### 📊 Health Monitoring\n\n- **HealthCheckService** Real system metrics collection\n- **CPU Metrics** Real CPU usage with history tracking\n- **Memory Metrics** Memory usage percentage and details\n- **Disk Metrics** Disk space monitoring (platform-aware)\n- **Process Metrics** Node.js process statistics\n- **Custom Health Checks** Extensible health check framework\n- **Dependency Checks** Monitor external service health\n- **Informational Only** Never interrupts service operation\n\n### 🔧 Services & Utilities\n\n- **Queue Service** - Background job processing with persistence\n- **AI Service** - Multi-provider AI integration (OpenAI, Claude)\n- **Port Utilities** - Port availability checking and management\n- **File Handler** - Secure file operations with MIME validation\n- **Network Service** - Network interface discovery\n- **System Monitor** - System resource monitoring\n\n### 🎨 UI Components Library\n\n#### Base Components (20+)\n\n- **Forms** - Input, Select, Checkbox, Radio, Switch, Textarea\n- **Layout** - Card, Dialog, Tabs, Accordion, Separator\n- **Data Display** - Table, Badge, Alert, Progress, Avatar\n- **Navigation** - Button, Dropdown, Context Menu, Navigation Menu\n- **Feedback** - Toast, Tooltip, Popover, Alert Dialog\n\n#### Advanced Components\n\n- **SettingsFramework** - Complete settings UI with validation\n- **LogViewer** - Real-time log display with filtering, stack coalescing, ANSI stripping, auto-refresh, archives, and per-level badges\n- **ConnectionStatus** - WebSocket connection monitoring\n- **AppLayout** - Standard application layout with navigation\n- **RealtimeDataTable** - Live updating data tables\n- **DashboardStats** - Metric display cards\n- **UpdateNotification** - Application update notifications\n\n> UI bundle note: the UI package bundles ESM-heavy dependencies (`react-markdown`, `remark-gfm`, `react-syntax-highlighter`) for better Jest/Node compatibility. The LogViewer is now single-source and virtualized; legacy variants have been removed.\n\n### 🧪 Testing Utilities\n\n- **TestServer** - Standardized test server for integration tests\n- **Test Utilities** - Request helpers, WebSocket testing\n- **Mock Services** - Pre-configured mocks for services\n\n### 📊 Middleware\n\n- **Validation** - Request/response validation\n- **Error Handling** - Centralized error management\n- **File Upload** - Secure file upload handling\n- **OpenAPI** - Automatic API documentation\n- **Health Checks** - Liveness/readiness probes\n- **Rate Limiting** - API rate limiting\n\n## 📦 Installation\n\n### Full Framework (Backend + Frontend)\n\n```bash\nnpm install @superdangerous/app-framework\n```\n\n### Import Examples\n\n```javascript\n// Backend\nimport { StandardServer, createLogger } from \"@superdangerous/app-framework\";\n\n// Frontend UI components\nimport {\n  Button,\n  Card,\n  useSocketIO,\n  useConnectionStatus,\n} from \"@superdangerous/app-framework/ui\";\n```\n\n````\n\n## 💡 Usage Examples\n\n### REST API with Database\n\n```typescript\nimport { StandardServer, validate, createLogger } from '@superdangerous/app-framework';\nimport { z } from 'zod';\n\nconst logger = createLogger('API');\n\nconst server = new StandardServer({\n  appName: 'REST API',\n  appVersion: '1.0.0',\n  onInitialize: async (app) => {\n    // Validation middleware\n    const userSchema = z.object({\n      name: z.string(),\n      email: z.string().email()\n    });\n\n    app.post('/api/users', validate(userSchema), async (req, res) => {\n      // Validated request body\n      const user = await createUser(req.body);\n      res.json({ success: true, data: user });\n    });\n  }\n});\n````\n\n### Real-Time Dashboard\n\n```typescript\nimport {\n  StandardServer,\n  getWebSocketServer,\n} from \"@superdangerous/app-framework\";\n\nconst server = new StandardServer({\n  appName: \"Dashboard\",\n  appVersion: \"1.0.0\",\n  enableWebSocket: true,\n  onStart: async () => {\n    const ws = getWebSocketServer();\n\n    // Stream metrics every second\n    setInterval(() => {\n      const metrics = collectMetrics();\n      ws.broadcast(\"metrics:update\", metrics);\n    }, 1000);\n  },\n});\n```\n\n### React WebSocket Integration\n\n```tsx\nimport {\n  useSocketIO,\n  useConnectionStatus,\n} from \"@superdangerous/app-framework/ui\";\n\nfunction Dashboard() {\n  const [state, actions] = useSocketIO();\n  const { connected } = useConnectionStatus();\n  const [metrics, setMetrics] = useState([]);\n\n  useEffect(() => {\n    if (!connected) return;\n    const handler = (data) => setMetrics(data);\n    actions.on(\"metrics:update\", handler);\n    return () => actions.off(\"metrics:update\", handler);\n  }, [connected, actions]);\n\n  return <MetricsDisplay data={metrics} />;\n}\n```\n\n### Background Job Processing\n\n```typescript\nimport { QueueService } from \"@superdangerous/app-framework\";\n\nconst queue = new QueueService({\n  concurrent: 5,\n  persistent: true,\n});\n\nqueue.registerHandler(\"send-email\", async (job) => {\n  await sendEmail(job.data);\n});\n\nawait queue.addJob(\"send-email\", {\n  to: \"user@example.com\",\n  subject: \"Welcome!\",\n});\n```\n\n### Settings Management\n\n```typescript\nimport { SettingsService } from '@superdangerous/app-framework';\n\nconst settings = new SettingsService();\n\nsettings.registerCategory({\n  id: 'general',\n  label: 'General Settings',\n  settings: [{\n    key: 'app.theme',\n    label: 'Theme',\n    type: 'select',\n    options: ['light', 'dark', 'auto'],\n    defaultValue: 'auto'\n  }]\n});\n\n// React component\n<SettingsFramework\n  categories={settings.getUISchema()}\n  onSave={async (values) => settings.update(values)}\n/>\n```\n\n### Health Monitoring\n\n```typescript\nimport {\n  createHealthCheckRouter,\n  getHealthCheckService,\n} from \"@superdangerous/app-framework\";\n\n// Add health check endpoints\nconst healthRouter = createHealthCheckRouter({\n  version: \"1.0.0\",\n  customChecks: [\n    {\n      name: \"database\",\n      check: async () => ({\n        name: \"database\",\n        status: (await db.ping()) ? \"healthy\" : \"unhealthy\",\n      }),\n    },\n  ],\n});\n\napp.use(\"/api\", healthRouter);\n\n// Get real-time metrics\nconst healthService = getHealthCheckService();\nconst metrics = await healthService.getMetrics();\nconsole.log(\n  `CPU: ${metrics.cpu.usage}%, Memory: ${metrics.memory.percentage}%`,\n);\n```\n\n### Settings Management\n\n```typescript\nimport {\n  SettingsService,\n  CommonSettingsCategories,\n} from \"@superdangerous/app-framework\";\n\n// Initialize settings service\nconst settings = new SettingsService({\n  filePath: \"./settings.json\",\n  categories: CommonSettingsCategories,\n  onSettingChange: async (key, value) => {\n    console.log(`Setting ${key} changed to ${value}`);\n  },\n});\n\nawait settings.initialize();\n\n// Get setting value\nconst port = await settings.get(\"server.port\");\n\n// Update setting\nawait settings.set(\"server.port\", 8080);\n```\n\n### WebSocket Manager\n\n```typescript\nimport { getWebSocketManager } from \"@superdangerous/app-framework\";\n\n// Initialize WebSocket manager\nconst wsManager = getWebSocketManager({\n  cors: { origin: \"http://localhost:3000\" },\n  adapter: \"redis\", // Optional Redis scaling\n  redisUrl: process.env.REDIS_URL,\n});\n\nawait wsManager.initialize(httpServer);\n\n// Register namespace with handlers\nwsManager.registerNamespace(\"/dashboard\", {\n  subscribe: (socket, topic) => {\n    socket.join(`topic:${topic}`);\n    socket.emit(\"subscribed\", { topic });\n  },\n  unsubscribe: (socket, topic) => {\n    socket.leave(`topic:${topic}`);\n  },\n});\n\n// Broadcast to specific rooms\nwsManager.broadcast(\"update\", data, {\n  namespace: \"/dashboard\",\n  room: \"topic:metrics\",\n  compress: true,\n});\n\n// Get connection stats\nconst stats = wsManager.getStats();\nconsole.log(`Connected clients: ${stats.totalClients}`);\n```\n\n## 🏗️ Architecture\n\n```\nFramework Structure:\n├── Core Layer\n│   ├── StandardServer      # Server management\n│   ├── Logger System       # Logging infrastructure\n│   ├── Port Utilities      # Port management\n│   └── File Handler        # Secure file operations\n├── Service Layer\n│   ├── WebSocket Server    # Real-time communication\n│   ├── Configuration       # Config management\n│   ├── Queue Service       # Job processing\n│   ├── AI Service          # AI integration\n│   └── Settings Service    # Settings management\n├── Middleware Layer\n│   ├── Authentication      # Auth & sessions\n│   ├── Validation         # Input validation\n│   ├── Error Handling     # Error management\n│   └── Health Checks      # Health monitoring\n└── UI Layer\n    ├── Base Components    # Core UI elements\n    ├── Advanced Components # Complex UI patterns\n    ├── Hooks              # React hooks\n    └── Utilities          # UI helpers\n```\n\n## 🔧 Configuration\n\n### Environment Variables\n\n```bash\n# Server\nNODE_ENV=production\nPORT=8080\nHOST=0.0.0.0\n\n# Logging\nLOG_LEVEL=info\nLOG_DIR=./logs\n\n# Session\nSESSION_SECRET=your-secret-key\n\n# Database\nDATABASE_URL=postgresql://...\n\n# Redis\nREDIS_HOST=localhost\nREDIS_PORT=6379\n\n# AI Services (optional)\nOPENAI_API_KEY=sk-...\nCLAUDE_API_KEY=sk-ant-...\n\n# WebSocket\nWS_PING_INTERVAL=25000\nWS_PING_TIMEOUT=60000\n```\n\n### Configuration Files\n\n```json\n// data/config/app.json\n{\n  \"server\": {\n    \"port\": 8080,\n    \"cors\": {\n      \"origins\": [\"http://localhost:3000\"]\n    }\n  },\n  \"features\": {\n    \"enableWebSocket\": true,\n    \"enableMetrics\": true\n  }\n}\n```\n\n## 📚 TypeScript Support\n\nFull TypeScript support with comprehensive type definitions:\n\n```typescript\nimport type {\n  StandardServerConfig,\n  Logger,\n  WebSocketClient,\n  JobStatus,\n  SettingType,\n  ApiResponse,\n  ValidationSchema,\n} from \"@superdangerous/app-framework\";\n\nimport type {\n  ButtonProps,\n  TableColumn,\n  SettingCategory,\n  WebSocketHook,\n} from \"@superdangerous/app-framework/ui\";\n```\n\n## 🧪 Testing\n\n```typescript\nimport { TestServer, setupTestServer } from \"@superdangerous/app-framework\";\n\ndescribe(\"API Tests\", () => {\n  let server: TestServer;\n\n  beforeAll(async () => {\n    server = await setupTestServer({\n      setupApp: (app) => {\n        app.get(\"/test\", (req, res) => res.json({ ok: true }));\n      },\n    });\n  });\n\n  test(\"endpoint works\", async () => {\n    const res = await server.request(\"/test\");\n    expect(res.body.ok).toBe(true);\n  });\n});\n```\n\n## 🚀 Production Deployment\n\n### Docker\n\n```dockerfile\nFROM node:18-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY dist/ ./dist/\nENV NODE_ENV=production\nHEALTHCHECK CMD curl -f http://localhost:8080/health || exit 1\nCMD [\"node\", \"dist/index.js\"]\n```\n\n### PM2\n\n```javascript\nmodule.exports = {\n  apps: [\n    {\n      name: \"my-app\",\n      script: \"./dist/index.js\",\n      instances: \"max\",\n      exec_mode: \"cluster\",\n      env: {\n        NODE_ENV: \"production\",\n      },\n    },\n  ],\n};\n```\n\n## 🛠️ Development Tools\n\n- **Hot Reload** - Automatic restart on changes\n- **TypeScript** - Full type safety\n- **ESLint** - Code quality enforcement\n- **Prettier** - Code formatting\n- **Jest** - Testing framework\n- **Nodemon** - Development server\n\n## 📖 For AI Assistants\n\nThis framework is designed to be AI-friendly. When building applications:\n\n1. **Always use StandardServer** - Never use deprecated StartupOrchestrator\n2. **Validate all inputs** - Use zod schemas for validation\n3. **Handle errors properly** - Use try-catch and error middleware\n4. **Use TypeScript** - Define interfaces for all data structures\n5. **Follow the patterns** - See [Development Guide](./docs/DEVELOPMENT.md)\n\n## 🔒 Security\n\n- Input validation on all endpoints\n- Secure session management\n- File upload restrictions\n- Rate limiting support\n- CORS configuration\n- Environment variable secrets\n\n## 🛠️ Development Tools\n\n### Node Process Monitor\n\nMonitor and manage all your running framework apps from the macOS menu bar.\n\n- **Real-time monitoring** of all processes started with `dev-server`\n- **Grouped by app** with hierarchical view of backend/frontend/websocket processes\n- **Resource tracking** - CPU, memory, uptime for each process\n- **Easy management** - Kill individual processes or entire apps\n- **Lightweight** - Built in Rust for minimal overhead\n\n#### Installation\n\n```bash\n# Quick install (macOS)\ncurl -sSL https://raw.githubusercontent.com/EPISENSOR/epi-node-process-monitor/main/install.sh | bash\n```\n\nLearn more: [github.com/SuperDangerous/epi-node-process-monitor](https://github.com/SuperDangerous/epi-node-process-monitor)\n\n## 📄 License\n\nMIT License - see [LICENSE](./LICENSE) for details\n\n## 🤝 Support\n\n- **Documentation**: See `/docs` folder for all guides\n- **Issues**: Internal issue tracker\n- **Examples**: Check example applications using this framework\n\n---\n\nBuilt with ❤️ by SuperDangerous\n","readmeFilename":"README.md"}