{"_id":"@aiot-nexus/plugin-sdk","_rev":"14-d6b09a911c33af0d97da92b30149cab0","name":"@aiot-nexus/plugin-sdk","dist-tags":{"latest":"3.2.0"},"versions":{"1.0.0":{"name":"@aiot-nexus/plugin-sdk","version":"1.0.0","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@1.0.0","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"15d8d2c4beb89584a3c9bbf1fc40d247b60797f9","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-1.0.0.tgz","fileCount":47,"integrity":"sha512-RN8BAZiue2EDRvBy/6j2JtzEqG9jBnRYk9VmiQw8TLGQ07phq6C2G4AOISMkIPyv4O5MRicCXM/zzNcd6zn0jw==","signatures":[{"sig":"MEUCIBD+kE94VihlSBM4SAh+s7ZR/2c9N1IIEcZOcp1Lr65lAiEAiLNspAJNR98U2J2BsZB4KNeaA3sRKdCyGWQgSoBcF0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175021},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"5c0cae02d07f54d3406130d7d3597123827cae32","scripts":{"test":"npm run build && node tests/package.test.js && node tests/cli.test.js && node tests/frame-client.test.js","build":"node scripts/build.js","pack:sdk":"npm run build && node scripts/pack.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_1.0.0_1784169247156_0.6023616708450832","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aiot-nexus/plugin-sdk","version":"1.0.1","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@1.0.1","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"e53802e4d96cb79d1dfaf407ccf035e0c9ab205c","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-1.0.1.tgz","fileCount":47,"integrity":"sha512-yCVm4vJ5LUwKIXdjM6wLQVCJIvSah9+EDIrbqj0IbzAMmupu2IYeEdu0f2nMoi6hFBwzOjKph/4lpk9K0ZzzJg==","signatures":[{"sig":"MEQCIAP2gDqXAxBhqlz2nioTmfxta6A211onv/U52lka9WY4AiBKwiPqXvViyyHpe441yUW+pW6wbc/8ZzoOVYcuk5bUtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174915},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"5c0cae02d07f54d3406130d7d3597123827cae32","scripts":{"test":"npm run build && node tests/package.test.js && node tests/cli.test.js && node tests/frame-client.test.js","build":"node scripts/build.js","pack:sdk":"npm run build && node scripts/pack.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_1.0.1_1784172406423_0.6113215805686723","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aiot-nexus/plugin-sdk","version":"1.0.2","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@1.0.2","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"dee97339b23ca52de36c86d465217aa57e9c0161","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-1.0.2.tgz","fileCount":50,"integrity":"sha512-FMnnO+/5bXadHfdY6V/0gFXstF6fy+RxLylhLX/tzkgQkGVWHIY4tRt1xwY2cwSjOPmSLB02FJi8WfO64hRbOg==","signatures":[{"sig":"MEUCIF8bDrKuU6cL4TChvOKEc5GsqBS4uq6z/Mrk7dePSDrsAiEA/epe3TOFj0x3q21/0iMULsfyM1Lh0W9YeXf2rz4PAKk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216703},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"50355cc9a04b9fdc5c8ca04aaca53b41f0ea3005","scripts":{"test":"npm run build && node tests/package.test.js && node tests/cli.test.js && node tests/dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_1.0.2_1784193641184_0.5311514634548558","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aiot-nexus/plugin-sdk","version":"1.1.0","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@1.1.0","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"0b807f3d8e01a153efb25d833037f3a4f2eb9113","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-1.1.0.tgz","fileCount":56,"integrity":"sha512-hJSWxhaSugyPz7553purLyVpBzkr8abP+jGpnV86tcPUP103vK8mEuiAufAdO97Q0pTr5i57WA2J2UzP+XeKYg==","signatures":[{"sig":"MEUCIQD1rzZAWzDlDNmFetwwHmyXCIrlO0nm38+fGcb6bqcYngIgGJCAS1fmUpoZ/L6CBj/RrHDDpy0f36fDYbmcNmHQTU0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278187},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"2e3899cc417a6c507213611824e7e30a7c4eefa3","scripts":{"test":"npm run build && node tests/package.test.js && node tests/cli.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_1.1.0_1784269167674_0.9570905122682207","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@aiot-nexus/plugin-sdk","version":"1.1.1","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@1.1.1","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"e4093159c02ab9ae1fd6c2df0a5e8144ba11f0bb","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-1.1.1.tgz","fileCount":59,"integrity":"sha512-VEVbWtZ7mIokuW83zzzkh2Ns8y3j/0RNtjfNR/wtrDAUrLSY6zJdZtTHYDnGI0m6TwfSABS+MZpaT7ZFgODZ2A==","signatures":[{"sig":"MEYCIQC4GhqPzdSVguiyxYlGHPHoKISNrdwuzzT2mTRdKwlD1AIhAOcTVvuRmlwE5oCqoOsOKScsu5beKz4sGnyyUHUQiGwz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298182},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"dc97f34feb53143b53c38be0a5eaedd8d12643ec","scripts":{"test":"npm run build && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_1.1.1_1784524237148_0.4684018362050706","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@aiot-nexus/plugin-sdk","version":"2.0.0","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@2.0.0","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"6e5af2bb0f334777410aacbd51169bcf90376a33","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-2.0.0.tgz","fileCount":60,"integrity":"sha512-Ib8xK7O4wdSFLiphzec0WqRZcvAfSESztVpTZGbN99u1PxejNwD60UsOdsJXnrY3cn+DFl9V4ExxQr6WzFaaQA==","signatures":[{"sig":"MEUCIQDEYWiSKb3GJ8Wi36HR3sSUdYM48NYw7oQfDcaFsTp9/QIgFxBmGQjoJaIfAmGuo45ty6iMP0sps78j+Buaz5rksP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":319789},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"9dcb8ddca6b81c3f63d4aafc7605df25d5b28247","scripts":{"test":"npm run build && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_2.0.0_1784600210772_0.85860177409595","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@aiot-nexus/plugin-sdk","version":"2.0.1","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@2.0.1","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"34ef41de044c2598f6baf8fab9416a977af4d806","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-2.0.1.tgz","fileCount":60,"integrity":"sha512-517QY2tdEfH9qnqCePKLEiYOqiHXX3wGScCKGmmGsuPoapG0EZeOqkubJKz1dDvL6+AeO5Pr9n9PC8LkZCd71w==","signatures":[{"sig":"MEQCIHCvadmIRhnIfDiewaC4xFfmknJo9VKHbyxY9fljv2/fAiBXBoRsghGeR3NcGNEa07RPmMPj6X8J08OHjQJSN5qQiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321811},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"2d08b94552ba5779507d625485d1eceae1047a1c","scripts":{"test":"npm run build && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_2.0.1_1784613051895_0.5951978453832572","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@aiot-nexus/plugin-sdk","version":"2.0.2","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@2.0.2","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"253da99c36216a8b7b150a5a31732c7a92316c8e","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-2.0.2.tgz","fileCount":60,"integrity":"sha512-ATqQiImORpjIKKXMy4FMAEQdpZhTmVX07tfEErSNWjDzx2MSlYHhW5LDbxmKGp75lr9lNjNACmsymx9C/q7y9A==","signatures":[{"sig":"MEUCIDwHA+vKHuyWLytroJnHQKVDtrzuAMjaqyRNU7stuq5hAiEA7l4rrNlnYPzXN0SNUWQnG4fhF/J+AHYastRAZQBrfeg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":324034},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"71801f0f21359fca0a2d2bb15b2bfb1bcff1b498","scripts":{"test":"npm run build && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"4.9.4","@types/node":"16.18.126"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_2.0.2_1785289002599_0.13204425470823233","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@aiot-nexus/plugin-sdk","version":"2.1.0","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@2.1.0","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"5c110e64968fd70996ed7aff2eeb9b8b0d8aa477","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-2.1.0.tgz","fileCount":70,"integrity":"sha512-zIFo15OmU6EG/Si0mXpiau1/etixgtt+m12qv/bZmsAwHMoOelBtHYrIyt/wnGD2/0BrDKgBomEBEvLcqJs1HA==","signatures":[{"sig":"MEQCIBSsWew4gAIOTYe4w+GVMl/DPQSB6irjmC26LcBon5PWAiAt2eZ7eRFMmq3BuDPwPX1tpVvoVrXdqQqw0BJHvFWgxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":488819},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"68650a2d4344eace03f98685f881c4b83f92a5e4","scripts":{"test":"npm run build && npm run test:types && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","test:types":"tsc -p tsconfig.types-test.json","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"electron":"22.3.27","typescript":"4.9.4","@types/node":"16.18.126"},"peerDependencies":{"electron":"22.3.27"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_2.1.0_1785375887229_0.3272908707662494","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@aiot-nexus/plugin-sdk","version":"2.1.1","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@2.1.1","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"41e4599f972c22fb8f08629e414e2a8dbabba14a","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-2.1.1.tgz","fileCount":70,"integrity":"sha512-xWENOYHMxhJiXpbVUFrsl0UvY5n8qY34VgvXXkHDB0A5iyS3mRctVmJfc1suj4GbDjLU2nOQRr0d2A/craB3Hg==","signatures":[{"sig":"MEYCIQDIK9mjQ9W1j6N4UXLgU/Pm7bBFwf3NMK+8FlLhim0RZQIhAKXKEbk9FtJmNElL0khKku3zXNQE2YO1TatHuir+e4P3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":494961},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"0184835edc75ca544d5705b2ef18d7b5148511a2","scripts":{"test":"npm run build && npm run test:types && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","test:types":"tsc -p tsconfig.types-test.json","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"electron":"22.3.27","typescript":"4.9.4","@types/node":"16.18.126"},"peerDependencies":{"electron":"22.3.27"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_2.1.1_1785380819183_0.2517299378927489","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@aiot-nexus/plugin-sdk","version":"3.0.2","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@3.0.2","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"68ffc96caa099ee6d8ad967d392b18bc7dd6a8e2","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-3.0.2.tgz","fileCount":61,"integrity":"sha512-hcY7ahcG4+TZyF6aXHNvWjhTkf6jRz3lqO7fflVvKZKRFnl8LjrXcWnvBpO8+QmOGvNLkdKxRsUztP9MfJdylA==","signatures":[{"sig":"MEUCIQDqAZb+5vvPZFJVm1i1inTt3dCrfelixMQR5jMt5A7MCAIgNy18AtdXRoxYKHrvr8OK5dwHSeEqc5eMhc+K1ChKfdI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":388527},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"2b85956e946a7f78966b88cc1e5084213295209e","scripts":{"test":"npm run build && npm run test:types && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","test:types":"tsc -p tsconfig.types-test.json","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"electron":"22.3.27","typescript":"4.9.4","@types/node":"16.18.126"},"peerDependencies":{"electron":"22.3.27"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_3.0.2_1785416070333_0.4217769508630169","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@aiot-nexus/plugin-sdk","version":"3.1.0","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@3.1.0","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"e6a584f3e7bed865af8191c19e95716e86acc729","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-3.1.0.tgz","fileCount":65,"integrity":"sha512-u3KrQGXtXLUxZ2aHCRHNMJ3qBiEU35AnR6HClXF4o5VZRKW/4EMvrL8k/90pKiBVYyBlsTxlTGIvZ1AllOhCrA==","signatures":[{"sig":"MEUCIQDfAboJdbbrU7JgbGrpNT3qObYF90933uajdzhVWIqVcgIgBLW/qJTWgqkF4Ih+f7YD4lb/ZaFOawAyW20Ysa7sf0E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":451265},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"09ec05fab17c109611d6e4fa5c7e184970061f05","scripts":{"test":"npm run build && npm run test:types && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/upgrade.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","test:types":"tsc -p tsconfig.types-test.json","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"electron":"22.3.27","typescript":"4.9.4","@types/node":"16.18.126"},"peerDependencies":{"electron":"22.3.27"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_3.1.0_1785761946149_0.7130002732546454","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"@aiot-nexus/plugin-sdk","version":"3.1.1","license":"UNLICENSED","_id":"@aiot-nexus/plugin-sdk@3.1.1","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"bin":{"nexus-plugin":"dist/src/cli.js"},"dist":{"shasum":"1c0093f2cb6f4eb786e3a673143bf9f6a2fb9141","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-3.1.1.tgz","fileCount":65,"integrity":"sha512-UD7l3VV1R2hZ6kfuwt8nWXvNK83iqMV+aAyqDjgnMIuwC3QCtv1Bj+qMPXKQaALlRpT3wneCjIagBfuiOaxzhQ==","signatures":[{"sig":"MEYCIQDttvz3A3aoD20dYD6u7RHb/chFPHZGzrLQNoQ4DWlTEAIhAIirOVoZj/4Mhp0Hxhqaa4d/lIYY0naIfT9cDjW5X75i","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":451668},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"npm":">=6.13.4","node":">=16.20.0 <17"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","require":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./package.json":"./package.json","./manifest-schema":"./dist/.generated/plugin-manifest.schema.json"},"gitHead":"09ec05fab17c109611d6e4fa5c7e184970061f05","scripts":{"test":"npm run build && npm run test:types && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/upgrade.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","build":"node scripts/build.js","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","test:types":"tsc -p tsconfig.types-test.json","postinstall":"node scripts/sdk-update-check.js --install","publish:sdk":"npm publish","verify:package":"node scripts/verify-package.js"},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"_npmVersion":"8.19.4","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","directories":{},"_nodeVersion":"16.20.2","dependencies":{"ajv":"8.17.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"electron":"22.3.27","typescript":"4.9.4","@types/node":"16.18.126"},"peerDependencies":{"electron":"22.3.27"},"_npmOperationalInternal":{"tmp":"tmp/plugin-sdk_3.1.1_1785767127738_0.9108618152771772","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@aiot-nexus/plugin-sdk","version":"3.2.0","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","license":"UNLICENSED","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"main":"./dist/src/index.js","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","require":"./dist/src/index.js","default":"./dist/src/index.js"},"./browser":{"types":"./dist/browser/frame-client.d.ts","import":"./dist/browser/frame-client.mjs","default":"./dist/browser/frame-client.mjs"},"./manifest-schema":"./dist/.generated/plugin-manifest.schema.json","./package.json":"./package.json"},"bin":{"nexus-plugin":"dist/src/cli.js"},"scripts":{"build":"node scripts/build.js","postinstall":"node scripts/sdk-update-check.js --install","verify:package":"node scripts/verify-package.js","test:types":"tsc -p tsconfig.types-test.json","test":"npm run build && npm run test:types && node tests/package.test.js && node tests/sdk-update-check.test.js && node tests/cli.test.js && node tests/cli-entry.test.js && node tests/update-notice.test.js && node tests/upgrade.test.js && node tests/dev.test.js && node tests/nexus-dev.test.js && node tests/frame-client.test.js && node tests/web-dev.test.js && npm run verify:package","prepack":"node scripts/prepack.js","pack:sdk":"npm run build && npm run verify:package && node scripts/pack.js","publish:sdk":"npm publish"},"dependencies":{"ajv":"8.17.1"},"peerDependencies":{"electron":"22.3.27"},"devDependencies":{"@types/node":"16.18.126","electron":"22.3.27","typescript":"4.9.4"},"engines":{"node":">=16.20.0 <17","npm":">=6.13.4"},"gitHead":"0774b04211bc572cb31779b01efb5500eb298318","_id":"@aiot-nexus/plugin-sdk@3.2.0","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-5A6pMnzt+J4navEVq+Sf7lQmufPtCGc0P7RxlAajgEpCP/1wX+NGTrl8qWAp6RBvfUnolYIKppHh6czfczMpnQ==","shasum":"934cd66febeb5afa13526c585e59745afb62c0f5","tarball":"https://registry.npmjs.org/@aiot-nexus/plugin-sdk/-/plugin-sdk-3.2.0.tgz","fileCount":67,"unpackedSize":482438,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCwQG9329H69ksvJuxsUGGSr/Bf9hCWfmn6XejT3FN3jQIhAOKytDgjeThqssSWOVWb41X+4SmY9RxZFDv/S3zlj7LU"}]},"_npmUser":{"name":"aiot-nexus","email":"codex_001@proton.me"},"directories":{},"maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/plugin-sdk_3.2.0_1786341052035_0.00037957723758497153"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-16T02:34:07.006Z","modified":"2026-08-10T05:50:52.335Z","1.0.0":"2026-07-16T02:34:07.315Z","1.0.1":"2026-07-16T03:26:46.562Z","1.0.2":"2026-07-16T09:20:41.308Z","1.1.0":"2026-07-17T06:19:27.834Z","1.1.1":"2026-07-20T05:10:37.295Z","2.0.0":"2026-07-21T02:16:50.904Z","2.0.1":"2026-07-21T05:50:52.072Z","2.0.2":"2026-07-29T01:36:42.780Z","2.1.0":"2026-07-30T01:44:47.397Z","2.1.1":"2026-07-30T03:06:59.329Z","3.0.2":"2026-07-30T12:54:30.497Z","3.1.0":"2026-08-03T12:59:06.349Z","3.1.1":"2026-08-03T14:25:27.871Z","3.2.0":"2026-08-10T05:50:52.181Z"},"license":"UNLICENSED","description":"Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.","maintainers":[{"name":"aiot-nexus","email":"codex_001@proton.me"}],"readme":"# @aiot-nexus/plugin-sdk\n\n> 当前 SDK 包版本为 `3.2.0`，Framework API 为 `3.2.0`，manifest schema 保持 `1`。Framework 3 将可信插件的 `mainEntry` 直接加载到 Nexus Electron 主进程；它不是安全沙箱。PluginFrame iframe 仍保持 sandbox、无 Node/Electron 访问。宿主运行模型见 [Framework v3 架构](../docs/plugin-framework-v3-architecture.md)。\n\n本包提供公开 TypeScript 契约、PluginFrame 浏览器客户端和 `nexus-plugin` CLI。v2 项目升级前请先阅读 [v2 到 v3 迁移说明](../docs/plugin-framework-v2-v3-migration.md)。完整开发流程见 [独立插件开发指南](../docs/standalone-plugin-development-guide.md)。\n\n## 兼容基线\n\n| 项目 | 固定值 |\n| --- | --- |\n| SDK | `3.2.0` |\n| Framework API | `3.2.0` |\n| Manifest schema | `1` |\n| Node 安装和构建 | `>=16.20.0 <17` |\n| Electron | `22.3.27` |\n| TypeScript | `4.9.4` |\n| 目标系统 | Windows 7 x64 |\n\n不要为了新 Electron API、类型或依赖升级这些兼容锁。插件原生模块必须为 Electron 22 ABI 重建。\n\n## CLI\n\n```bash\nnexus-plugin info [--json]\nnexus-plugin validate <plugin-package-directory>\nnexus-plugin create <plugin-id> --template minimal|sqlite --output <parent-directory>\nnexus-plugin upgrade [plugin-project-directory] [--check] [--sdk-source <version-or-local-tgz>]\nnexus-plugin dev [plugin-project-directory]\nnexus-plugin dev:web [plugin-project-directory]\nnexus-plugin dev:nexus [plugin-project-directory] --host <nexus.exe-or-directory>\n```\n\n仓库内 SDK 命令：\n\n```bash\nnpm run build\nnpm test\nnpm run pack:sdk\nnpm run publish:sdk\n```\n\n`pack:sdk` 把离线 tgz 写入 `plugin-sdk/package/`。`publish:sdk` 的 `prepack` 会运行测试、构建和公开文件清单验证。安装阶段和 CLI 启动阶段会非阻塞检查 SDK 更新；设置 `NEXUS_PLUGIN_SDK_UPDATE_CHECK=0` 或 `NO_UPDATE_NOTIFIER=1` 可关闭检查。检查失败不会阻断安装、构建或调试，版本通知本身不会修改依赖；只有显式执行 `upgrade` 才会进入升级事务。\n\n## 升级插件工程 SDK\n\n标准插件工程的 `nexus-plugin` 来自本地 `@aiot-nexus/plugin-sdk`，因此 CLI 和工程 SDK 是同一个依赖。旧工程应由目标版本的 CLI 执行升级，不能只手工修改 `package.json`，因为 lockfile 和 `node_modules` 仍可能保留旧版本。\n\nregistry 升级与只读预检：\n\n```bash\nnpx --package=@aiot-nexus/plugin-sdk@3.2.0 nexus-plugin upgrade . --check\nnpx --package=@aiot-nexus/plugin-sdk@3.2.0 nexus-plugin upgrade .\n```\n\n发布前或本地 tgz：\n\n```bash\nnpx --package=./aiot-nexus-plugin-sdk-3.2.0.tgz nexus-plugin upgrade . \\\n  --sdk-source ./aiot-nexus-plugin-sdk-3.2.0.tgz\n```\n\nCI 可以追加 `--json` 获得 `up-to-date`、`upgrade-available`、`upgraded`、`rolled-back` 或 `blocked`。`--allow-major` 只解除 major 保护，不会改写业务源码；跨 major 必须先阅读迁移指南。`--skip-project-checks` 只跳过项目 typecheck/build，安装后的 SDK、package 和 lockfile 一致性仍会验证。\n\n升级器直接修改的范围只有 SDK 依赖、`package-lock.json`、`node_modules` 和命令管理的 SDK tgz。本地包会保存为 `vendor/aiot-nexus-plugin-sdk-<version>.tgz`，下一次本地升级会安全清理上一份由命令管理的版本化归档。Electron、TypeScript、`@types/node` 和 Node engine 只检查不修改；manifest、模板、README、构建脚本和业务依赖不会被覆盖。\n\n修改前，命令会在项目根目录创建 `.nexus-plugin-upgrade-recovery/`，持久备份 package、lock、受管 tgz 和标准 `dist/<pluginId>`，并写入 `recovery.json` 阶段记录。成功或确定性回滚后该目录自动删除；硬中断、回滚重装失败或清理失败时保留，后续 upgrade 会停止并要求先按 journal 恢复。不要在项目恢复并完成验证前删除它。\n\n安装或项目验证失败时恢复备份，并在原 lockfile 存在时运行 `npm ci`。没有原 lockfile 时会运行 `npm install` 并恢复原 SDK，但无法证明完整传递依赖树与升级前一致，因此返回 `blocked` 并保留恢复数据。标准脚手架 build 的 `dist/<pluginId>` 在回滚范围内；自定义 typecheck/build 若修改其他路径，这些副作用不属于升级事务，项目必须自行管理。\n\nSDK `3.0.x` / `3.1.x` 插件可以由 3.2.x 宿主继续加载。升级到 SDK `3.2.0` 只提供主题能力和新的契约；插件必须引用 `--nexus-color-*` 或读取 `context.theme` 才会使用宿主主题色。没有引用新变量的插件保持原有颜色；需要自定义主题时传入 `autoApplyHostTheme: false`。原有 `hostApiVersion: 3.0.0` 可以保持不变，只有实际使用 `showHostStatusBar` 时才需要声明 `hostApiVersion: 3.1.0` 或更高。SDK 3.1.1 修复 registry 升级命令丢失 npm 包名的问题，作为历史兼容说明保留。\n\n## 创建插件\n\n```bash\nnexus-plugin create my-frame-plugin \\\n  --template minimal \\\n  --output . \\\n  --display-name \"My Frame Plugin\" \\\n  --install\n```\n\n- `minimal` 提供最小 PluginFrame、同步生命周期和原生 Electron 文件对话框示例。\n- `sqlite` 提供 `better-sqlite3@8.7.0` 通用数据库浏览器。\n- `--sdk-source` 可指定严格版本、`@aiot-nexus/plugin-sdk@X.Y.Z` 或本地 `.tgz`。\n- 默认不安装依赖；`--install` 执行 `npm install`。\n- 非空目标目录会被拒绝，不会覆盖现有项目。\n- 两套模板都支持中英文、亮暗主题和同一 iframe 内的 context 更新。\n\n离线示例：\n\n```bash\nnpm run pack:sdk\nnexus-plugin create my-frame-plugin --sdk-source ./package/aiot-nexus-plugin-sdk-3.2.0.tgz --install\n```\n\n生成插件后，可以在 `src/manifest.json` 的业务入口中静态控制 Nexus 宿主状态栏。相关 manifest 片段如下，其余必填字段沿用脚手架生成值：\n\n```json\n{\n  \"hostApiVersion\": \"3.2.0\",\n  \"businessEntries\": [\n    {\n      \"businessId\": \"my-frame-plugin\",\n      \"titleKey\": \"plugin.displayName\",\n      \"iconKey\": \"extension\",\n      \"section\": \"home.main\",\n      \"order\": 50,\n      \"component\": \"PluginFrame\",\n      \"pageRoute\": \"my-frame-plugin\",\n      \"showHostStatusBar\": false\n    }\n  ]\n}\n```\n\n仅显式设置为 `false` 时隐藏。字段省略或设置为 `true` 时显示；离开该业务入口后，宿主状态栏自动恢复。该字段要求 `hostApiVersion >= 3.1.0`。\n\n## Framework 3.2 mainEntry\n\n`mainEntry` 是可信 Electron 主进程代码，可直接导入 Electron、Node 内置模块和插件本地依赖：\n\n```ts\nimport { dialog } from \"electron\";\nimport { promises as fs } from \"fs\";\nimport type { PluginMainActivationContext } from \"@aiot-nexus/plugin-sdk\";\n\nconst maxTextBytes = 1024 * 1024;\n\nexport function activate(context: PluginMainActivationContext): void {\n  const registered = context.host.registerRendererMethod(\"editor.chooseText\", async () => {\n    const selection = await dialog.showOpenDialog({\n      properties: [\"openFile\"],\n      filters: [{ name: \"Text\", extensions: [\"txt\", \"md\"] }]\n    });\n    if (selection.canceled || selection.filePaths.length === 0) {\n      return { canceled: true };\n    }\n    const contentResult = await readTextFile(selection.filePaths[0]);\n    return contentResult.ok\n      ? { canceled: false, content: contentResult.value }\n      : contentResult;\n  });\n  if (!registered.ok) {\n    throw new Error(registered.error.message);\n  }\n}\n\nexport function deactivate(): void {\n  // 同步注销 ipcMain/protocol/shortcut/timer，并关闭窗口、数据库和子进程。\n}\n\nasync function readTextFile(filePath: string) {\n  const file = await fs.open(filePath, \"r\");\n  try {\n    const stat = await file.stat();\n    if (!stat.isFile() || stat.size > maxTextBytes) {\n      return failure(\"FileTooLarge\", \"Select a regular file no larger than 1 MiB.\");\n    }\n    const buffer = Buffer.alloc(maxTextBytes + 1);\n    let bytesRead = 0;\n    while (bytesRead < buffer.length) {\n      const chunk = await file.read(buffer, bytesRead, buffer.length - bytesRead, bytesRead);\n      if (chunk.bytesRead === 0) break;\n      bytesRead += chunk.bytesRead;\n    }\n    return bytesRead > maxTextBytes\n      ? failure(\"FileTooLarge\", \"File grew beyond 1 MiB while reading.\")\n      : { ok: true as const, value: buffer.subarray(0, bytesRead).toString(\"utf8\") };\n  } finally {\n    await file.close();\n  }\n}\n\nfunction failure(code: string, message: string) {\n  return { ok: false as const, error: { code, message } };\n}\n```\n\n固定契约：\n\n- `activate(context)` 和 `deactivate(reason)` 必须同步完成，不能声明为 `async`，也不能返回 Promise。\n- 声明为 `async` 的生命周期函数会在调用前被拒绝；普通函数若返回 Promise，函数体已经执行，但 Framework 不等待该 Promise，并将本次生命周期判定为不受支持。\n- `context.host.*` 直接返回 `NexusResult<T>`，不需要 `await`。\n- 注册的 operation handler 可以返回 Promise，可等待异步文件对话框、网络或其他用户交互。\n- operation 默认没有业务超时。浏览器客户端 `requestTimeoutMs` 默认是 `0`；20 秒仅用于 iframe 初始化握手。\n- 同步 Electron API 也能调用，但 `showOpenDialogSync()`、同步文件 I/O、长 CPU 任务会阻塞 Nexus 主进程、所有窗口和插件，应优先使用异步版本。\n- Framework 不跟踪插件直接创建的 Electron/Node 资源。插件必须在 `deactivate` 中自行清理。\n- Node 模块图和原生模块不能安全热卸载。已加载 `mainEntry`、依赖、原生模块或相关 manifest 变化必须重启 Nexus。\n\nFramework 3 不再提供 `context.host.electron` Facade，也没有 `electronHostControl` 权限。manifest 权限只描述 Host API 能力，不限制可信 `mainEntry` 直接调用 Electron/Node。SDK 保留 `createPluginElectronIpcChannel()` 和 `createPluginElectronProtocolScheme()` 作为命名约定帮助函数；宿主不会自动隔离或清理对应注册。\n\n原生文件、窗口、IPC 与 Monaco 示例见 [Electron/Node 示例](../docs/plugin-electron-node-examples.md)，支持矩阵和风险边界分别见 [兼容矩阵](../docs/plugin-electron-node-compatibility-matrix.md) 与 [安全边界](../docs/plugin-framework-v3-security-boundary.md)。\n\n## Renderer 边界\n\nPluginFrame iframe 不能直接获得 Node、Electron、数据库对象、任意文件路径或完整 `ipcRenderer`。Renderer 应通过 `client.invokeMain()` 调用经过命名和输入校验的业务 operation。\n\n关键 CSP：\n\n```text\nscript-src 'self'; style-src 'self' 'unsafe-inline'; worker-src 'self' blob:\n```\n\n这允许 Monaco 运行时注入样式和同源/Blob Worker，但仍阻止内联脚本、远程脚本和 Node iframe 访问。脚本、Monaco、语言包、字体和 worker 必须随插件作为同源资源交付。\n\n`createPluginFrameClient()` 的首次初始化默认等待 20 秒。业务请求默认不设超时；只有插件显式传入正数 `requestTimeoutMs` 时客户端才会主动超时。进度、取消和恢复仍建议使用 `taskId + getStatus + cancel`，但这是任务 UX 和资源管理策略，不是 worker 存活要求。通信契约见 [插件 IPC 与事件通知示例](../docs/plugin-ipc-event-notification-example.md)。\n\n### 宿主主题色\n\nFramework 3.2 在 `PluginRendererContext.theme` 中提供 `light` 和 `dark` 两套语义 palette。SDK frame client 默认把当前 palette 的固定白名单字段写入 `--nexus-color-*`，并设置 `data-nexus-theme=\"light|dark\"`；`themeMode: \"system\"` 会跟随系统主题变化。SDK 不会修改插件已有的 `--bg`、`--accent`、`data-theme` 或 `color-scheme`。\n\nSDK 升级本身只提供能力。插件需要在 CSS 中引用 `var(--nexus-color-primary, #8fc31f)` 等变量，或从 `context.theme?.dark.primary` 读取值，才会使用宿主主题色。旧宿主或缺少 `theme` 的上下文仍可正常初始化。自定义主题插件可以显式使用 `createPluginFrameClient({ autoApplyHostTheme: false })`，此时不注入变量、不设置宿主主题标记，但仍可手动读取 `context.theme`。\n\n## SQLite 模板\n\n`sqlite` 模板默认打开 `pluginDataDirectory/plugin.db` 并初始化 `plugin_records`。工具栏“打开数据库”由 `mainEntry` 直接调用 `dialog.showOpenDialog()`；iframe 只接收数据库信息和参数化 operation。\n\n模板支持：\n\n- 最近外部数据库路径原子持久化和失效回退。\n- 普通用户表发现、动态 schema、分页和 25/50/100 页大小。\n- rowid、单/复合主键与 `WITHOUT ROWID` 定位。\n- default/null/value 动态插入和 no-change/null/value 更新。\n- 精确 INTEGER、有限 REAL、NUMERIC 文本兼容和 BLOB 十六进制。\n- TEXT 16 KiB 预览、BLOB 字节数和前 32 字节预览。\n- 单字段 1 MiB、单次提交 4 MiB 上限。\n\n模板不暴露任意 SQL、DDL、`ATTACH`、路径输入或 SQL 控制台。它刻意不依赖 Quasar，因此数据库网格使用原生 `<table>`；这是独立、依赖最小化 SDK 模板对宿主 `QTable` 规则的明确例外。\n\n## 调试模式\n\n| 命令 | mainEntry | Electron/Node | 用途 |\n| --- | --- | --- | --- |\n| `npm run dev:web` | 不执行 | 不可用 | 只调试 Renderer；`invokeMain` 返回 `PluginCapabilityUnsupported`。 |\n| `npm run dev` | Electron 调试宿主主进程直接加载 | 可用 | 调试真实生命周期、对话框、SQLite 和插件窗口。 |\n| `npm run dev:debug` | 同 `dev` | 可用 | Electron 主进程以 `--inspect-brk=9229` 启动。 |\n| `npm run dev:nexus -- --host ...` | 正式 Nexus 主进程直接加载 | 可用 | 最终集成和监听更新。 |\n\nElectron 调试壳仅保留 context 工具栏；插件 iframe 无边距、无边框，填满剩余窗口，不设置最小宽高，也不根据内容上报限制尺寸。Renderer DevTools 默认打开。\n\nVS Code 模板提供 `Debug Nexus plugin` 和 `Attach Nexus plugin main process (9229)`。Renderer 断点在 DevTools Sources 中设置。\n\n`dev:nexus` 更新规则：\n\n| 修改范围 | 处理方式 |\n| --- | --- |\n| `src/renderer/**` | 只构建 Renderer 并重载 iframe，Nexus PID 不变。 |\n| 无 `mainEntry` 插件的安全 manifest 展示/贡献字段 | 原子替换 manifest 并重扫，PID 不变。 |\n| 有 `mainEntry` 插件的 manifest 变化 | 完整构建并重启 Nexus。 |\n| `src/main.*`、依赖、原生模块、构建脚本 | 完整构建并重启 Nexus。 |\n\n构建失败保留旧部署；新宿主启动或就绪失败会恢复旧包和旧宿主。`--inspect` / `--inspect-brk` 调试的是 Nexus Electron 主进程，因此会同时暂停或暴露宿主代码。按 `Ctrl+C` 时 CLI 关闭自己启动的宿主。\n\n## 发布前检查\n\n1. `hostApiVersion` 使用当前 `3.2.0`（或按实际能力保持旧版本），manifest schema 仍为 `1`。\n2. 业务入口的 `showHostStatusBar` 可静态声明是否保留宿主状态栏；省略时默认保留，显式使用时要求 `hostApiVersion >= 3.1.0`。\n3. `activate/deactivate` 同步，operation handler 才使用异步。\n4. Renderer 只使用窄口径 operation，所有输入在 mainEntry 再校验。\n5. 窗口保持 `contextIsolation: true`、`sandbox: true`、`nodeIntegration: false`、`webSecurity: true`。\n6. IPC、protocol、快捷键、菜单和文件路径使用插件命名空间并检测冲突。\n7. `deactivate` 关闭窗口、Session 监听、IPC、protocol、快捷键、定时器、数据库和子进程。\n8. 没有同步长任务、无限载荷、任意命令/SQL/路径透传或日志敏感信息。\n9. 主题集成明确引用 `--nexus-color-*` / `context.theme`，或显式关闭 `autoApplyHostTheme`。\n10. 运行 `npm test`、插件构建、正式 Nexus 集成和 Windows 7 真机验收。\n","readmeFilename":"README.md"}