{"_id":"@aivin-labs/sdk","_rev":"10-c8e190ea8943e9d5b3648c081a2118af","name":"@aivin-labs/sdk","dist-tags":{"latest":"1.1.5"},"versions":{"1.0.0":{"name":"@aivin-labs/sdk","version":"1.0.0","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.0.0","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin":"bin/cli.mjs"},"dist":{"shasum":"55034c660f103dac4f3640e0f4ce90f600630063","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.0.0.tgz","fileCount":49,"integrity":"sha512-XO+qmPe5AWunG9cMaamY7kI9uB6G16tplJnZz3KkF8a+w2/XvEd4azzlt8Kb5ATp3JB+OXAzvbp4r06uGAKaGA==","signatures":[{"sig":"MEQCIGODiq+fA5jlbFhA9igtcCQzOlXGau6cDrhq/eYlnUNHAiBDBxekbN6ct1SimHlBvDDAzhGomYT+4l8LGfnMQohz/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":347847},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"}},"gitHead":"1bbca85a3b57ddffa2f7e07fe206d0dc609d1ca1","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/cli.validate.test.mjs test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"axios":"^1.18.1","chalk":"^5.6.2","dotenv":"^17.4.2","inquirer":"^14.0.2","commander":"^15.0.0","@grpc/grpc-js":"^1.14.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","@types/inquirer":"^9.0.10","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1785136244858_0.2398129875180537","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aivin-labs/sdk","version":"1.0.1","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.0.1","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin":"bin/cli.mjs"},"dist":{"shasum":"a29b911b13e6629bc17494b03046bedd27d4b5d7","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.0.1.tgz","fileCount":57,"integrity":"sha512-12hFh5bjHn9ME6ORDmTrZB8X6kuz/O+HOINtbhe8/nHaszW9srfBzSuHaGU5LomeDFZu7faHjSRPmLlODt1rGA==","signatures":[{"sig":"MEYCIQDX/IJizRSMQMAt1J/CIQIM1syHKrOPRBgDYGjjF19xpwIhAIr8dG0iWzrjxha2sel4Jhq3fmornvhiTh8ZGjOdtGd3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":578368},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"}},"gitHead":"0d277e25c176714f55db1b95425663ccf988ca9a","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/cli.validate.test.mjs test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3","axios":"^1.18.1","chalk":"^5.6.2","dotenv":"^17.4.2","inquirer":"^14.0.2","commander":"^15.0.0","@grpc/grpc-js":"^1.14.3","socket.io-client":"^4.8.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","@types/inquirer":"^9.0.10","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.1_1785308955893_0.18819958420316207","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aivin-labs/sdk","version":"1.0.2","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.0.2","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin":"bin/cli.mjs"},"dist":{"shasum":"4654e26e2bbd9dc10c384430b59a3b6e697ff703","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.0.2.tgz","fileCount":57,"integrity":"sha512-vFCbQxziyFzGVxV2q1mEju7uWczNJ8YQIiOxmGUEtmr3BGNfCa8gnlU46/oUY9ttyd8oOCmRWLG3lSWgZbyRUQ==","signatures":[{"sig":"MEYCIQC3aLhIjdcOp/GgUCpgctOQ2UMANYeFoKDcFBQSyOMJfwIhAIVWfbsyVpO0Pk23clgWYRppf5/suxK70L1yDKl5rUQ1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":579410},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"}},"gitHead":"de4f5f3068afec99fe13d6773a5da0db4faeb9a3","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/cli.validate.test.mjs test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3","axios":"^1.18.1","chalk":"^5.6.2","dotenv":"^17.4.2","inquirer":"^14.0.2","commander":"^15.0.0","@grpc/grpc-js":"^1.14.3","socket.io-client":"^4.8.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","@types/inquirer":"^9.0.10","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.2_1786321017642_0.03588850046500891","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@aivin-labs/sdk","version":"1.0.3","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.0.3","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin":"bin/cli.mjs"},"dist":{"shasum":"037231ef95ee22a9fa5cf130766de6a3276c4933","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.0.3.tgz","fileCount":57,"integrity":"sha512-rNt/lCFHcy5P7UCSxubXlhPi/57qrt8DENO2fBsEjnCKdur9zNNoRkOZlWsIGjMAD+zXajkh/cqaBjQIfB8YwA==","signatures":[{"sig":"MEQCIFLEt7t/SLqFCwQgT1A6sKBaWtp28bgDzuLKos2xz2rKAiAaPgvbRPTmSTErpIHhd2qwM+r8HQngkfotGRpA2UvgfQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":581194},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"}},"gitHead":"1cc504b7e32c5b7e106dce3c63af17aa518d9b2d","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/cli.validate.test.mjs test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3","axios":"^1.18.1","chalk":"^5.6.2","dotenv":"^17.4.2","inquirer":"^14.0.2","commander":"^15.0.0","@grpc/grpc-js":"^1.14.3","socket.io-client":"^4.8.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","@types/inquirer":"^9.0.10","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.3_1786360109436_0.1810836468234338","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@aivin-labs/sdk","version":"1.0.4","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.0.4","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin":"bin/cli.mjs"},"dist":{"shasum":"2202cea6964c37ed95ca4fa63219d260f5fe2646","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.0.4.tgz","fileCount":57,"integrity":"sha512-TOVm0CNI+lbCeS3Z/cRiceeCI9FmPChQDB545psQpdK/u074kylUKFwTxSu/t/6LyFBO/ra/zmOQ8RIvvxQ8CA==","signatures":[{"sig":"MEUCIGHto6VjR38yqDmU3e76v3c3d5QmFOGWYZBkkk1g2pg2AiEAiCy2QQ4Vk1YRfmwZtX6FDP3pxH16EZSFS6/2E9FpzoM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":666640},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"}},"gitHead":"f650fb948eab24ec32110e47a5b5adc3c09fb47a","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/cli.validate.test.mjs test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3","axios":"^1.18.1","chalk":"^5.6.2","dotenv":"^17.4.2","inquirer":"^14.0.2","commander":"^15.0.0","@grpc/grpc-js":"^1.14.3","socket.io-client":"^4.8.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","@types/inquirer":"^9.0.10","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.4_1786461114677_0.1875128963570829","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@aivin-labs/sdk","version":"1.0.5","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.0.5","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin":"bin/cli.mjs"},"dist":{"shasum":"d00d5cc757118d46440db4a5afae4db10563ee05","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.0.5.tgz","fileCount":73,"integrity":"sha512-Pi8zcF6ukxz4t91RbF7jPFP9b/c5i6C7z3hCGg3j9iJdgi6/2tTPQ331+abC4/QQVAVhRk1xCBJbZvmce6ypfg==","signatures":[{"sig":"MEQCIFasegiaYF7MUR5jPQjumW5ZU0gbY8iwebjVEOqNhVbjAiAr4ryeTcGQnf49fAtl8+lX1EcmXuVen8A72yGHgU6N5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":774535},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"}},"gitHead":"5bf99dcc9d1632ed551670f099cc18a8624a06c8","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/cli.validate.test.mjs test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts test/pluginServer.test.ts test/pluginWorkerHost.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"ws":"^8.18.0","zod":"^4.4.3","axios":"^1.18.1","chalk":"^5.6.2","dotenv":"^17.4.2","inquirer":"^14.0.2","commander":"^15.0.0","@grpc/grpc-js":"^1.14.3","socket.io-client":"^4.8.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","@types/inquirer":"^9.0.10","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.5_1786527738027_0.2510671873633852","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aivin-labs/sdk","version":"1.1.0","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.1.0","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin-server":"bin/server.mjs"},"dist":{"shasum":"6229f081be060932e2a4bb2d19b03dfa3d058d99","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.1.0.tgz","fileCount":77,"integrity":"sha512-di9Vt61A6tM3qNl6xypDns5Gg69XtUJuZqxeYKJBP2VH0Saw9z5aakF+Fo4pUm2Q6ccskDrakPBgg0IqhvfIUw==","signatures":[{"sig":"MEUCIQCSWmC3kp1D/iQN4siHM1fPp1FcOJqRtGuTKzxPZurItwIgA1cwrEAAY8cwO++j0Ruk3DYq1rZxuL9bG+bmdSF9gKw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":556091},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"},"./package.json":"./package.json"},"gitHead":"24be579e2fc8a9204d84139fd139159c58b92eb1","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts test/pluginServer.test.ts test/pluginWorkerHost.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","@grpc/grpc-js":"^1.14.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.0_1786590535471_0.38257900885815044","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@aivin-labs/sdk","version":"1.1.1","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.1.1","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin-server":"bin/server.mjs"},"dist":{"shasum":"56277a2cd0afdf0d553cfd11e829b5bb5457776e","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.1.1.tgz","fileCount":77,"integrity":"sha512-fctynGEw8BhTtociLu0udX7aCTTojbEVRWF1kW6B+oJSb+JBzG/Zpz0LrLcQUq/zJCHrtEPO+W+2WNXl6Ex2UA==","signatures":[{"sig":"MEUCIH9MkeGCaKFimHnHWRHnVtqQ3njoSNDDe8D33lbk/fjGAiEA4fw9b1OY3AGH4+pnM4M6vdCz8Ef1u8dwZMgz1X15tGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":556091},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"},"./package.json":"./package.json"},"gitHead":"c8c817cfbf78023b9c317a742ff102caec1dc720","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/pluginTypes.test.ts test/grpcInvoker.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts test/pluginServer.test.ts test/pluginWorkerHost.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","@grpc/grpc-js":"^1.14.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.1_1786591298455_0.9677465828625873","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@aivin-labs/sdk","version":"1.1.2","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","_id":"@aivin-labs/sdk@1.1.2","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"bin":{"aivin-server":"bin/server.mjs"},"dist":{"shasum":"dac812a6ebc6cdfd668a041d8087fd4d448ffa39","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.1.2.tgz","fileCount":81,"integrity":"sha512-ASD7E3Qzik+WCTm9fSrDRjqeU7ewmWlRnzuNHmh/g4gNrMpoUxd5q4kkKLaoJj6PTJQA24sjzIFzKjkHIdZc1g==","signatures":[{"sig":"MEYCIQCw1i7DFGkXXM2/KGLX2oR4zEn7hxxhGll+HHEmov94PwIhAM1oDNaYX77X8aKQePtz+jwu+gYh63Uy1tWX+Av0G6/u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":622239},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"},"./package.json":"./package.json"},"gitHead":"7768c252c405780c23b9f210a49498a9a86f1343","scripts":{"dev":"tsc --watch","lint":"eslint .","test":"node --import tsx --test test/pluginTypes.test.ts test/grpcInvoker.test.ts test/grpcInvokerStream.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts test/pluginServer.test.ts test/pluginWorkerHost.test.ts test/standalone.test.ts","build":"tsc && npm run copy:proto","clean":"rimraf dist","format":"prettier --write .","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"repository":{"url":"git+https://github.com/aivin-labs/AIVIN-SDK.git","type":"git"},"_npmVersion":"11.6.2","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","@grpc/grpc-js":"^1.14.3","@grpc/proto-loader":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","eslint":"^10.8.0","rimraf":"^6.1.3","globals":"^17.7.0","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^26.1.1","typescript-eslint":"^8.65.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.2_1787146463905_0.09590010740389499","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@aivin-labs/sdk","version":"1.1.5","description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","type":"commonjs","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./types/*":{"types":"./dist/types/*.d.ts","default":"./dist/types/*.js"},"./package.json":"./package.json"},"bin":{"aivin-server":"bin/server.mjs"},"scripts":{"build":"tsc && npm run copy:proto","copy:proto":"node -e \"require('fs').mkdirSync('dist/proto',{recursive:true});require('fs').copyFileSync('src/proto/sdk_transport.proto','dist/proto/sdk_transport.proto')\"","dev":"tsc --watch","clean":"rimraf dist","lint":"eslint .","format":"prettier --write .","test":"node --import tsx --test test/pluginTypes.test.ts test/grpcInvoker.test.ts test/grpcInvokerStream.test.ts test/sdkClient.test.ts test/trace.test.ts test/testUtils.test.ts test/pluginServer.test.ts test/pluginWorkerHost.test.ts test/standalone.test.ts","check:contract":"node scripts/check-contract.mjs","prepublishOnly":"npm run clean && npm run build"},"keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"author":{"name":"Aivin Team"},"license":"MIT","dependencies":{"@grpc/grpc-js":"^1.14.3","@grpc/proto-loader":"^0.8.1","dotenv":"^17.4.2","zod":"^4.4.3"},"devDependencies":{"@eslint/js":"^10.0.1","@types/node":"^26.1.1","eslint":"^10.8.0","eslint-config-prettier":"^10.1.8","globals":"^17.7.0","prettier":"^3.9.6","rimraf":"^6.1.3","tsx":"^4.23.1","typescript":"^5.9.3","typescript-eslint":"^8.65.0"},"publishConfig":{"access":"public"},"engines":{"node":">=22.0.0"},"repository":{"type":"git","url":"git+https://github.com/aivin-labs/AIVIN-SDK.git"},"bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","gitHead":"c50aa6272a7eb37913014eff658c07b3b614dee4","_id":"@aivin-labs/sdk@1.1.5","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-6R+/wSPLhmVD42SYdNVj1gDLsbtirH5fqKnSmWEIyF7aLMszo3aEd5BtaCV2uy4PrEVaHE7lYCyAMWX6C0EyYA==","shasum":"264ac902b92e5b2b791fea77452153e5ba7b5e0e","tarball":"https://registry.npmjs.org/@aivin-labs/sdk/-/sdk-1.1.5.tgz","fileCount":81,"unpackedSize":636093,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCjYlEKuAvXqtE4+U7URupvWlQjm976/pRf0sMDgGEI9AIhAIaLNa3QRyQsC+7Z1mFI3ZB9usEo3EB48UXK1TO17h3N"}]},"_npmUser":{"name":"aivinvn","email":"ai@aivin.vn"},"directories":{},"maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.1.5_1787377529513_0.1031441841478431"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-27T07:10:44.655Z","modified":"2026-08-22T05:45:29.845Z","1.0.0":"2026-07-27T07:10:44.996Z","1.0.1":"2026-07-29T07:09:16.067Z","1.0.2":"2026-08-10T00:16:57.858Z","1.0.3":"2026-08-10T11:08:29.588Z","1.0.4":"2026-08-11T15:11:54.857Z","1.0.5":"2026-08-12T09:42:18.195Z","1.1.0":"2026-08-13T03:08:55.655Z","1.1.1":"2026-08-13T03:21:38.622Z","1.1.2":"2026-08-19T13:34:24.061Z","1.1.5":"2026-08-22T05:45:29.656Z"},"bugs":{"url":"https://github.com/aivin-labs/AIVIN-SDK/issues"},"author":{"name":"Aivin Team"},"license":"MIT","homepage":"https://github.com/aivin-labs/AIVIN-SDK#readme","keywords":["aivin","plugin","sdk","grpc","agentic","vector-search","ai","automation"],"repository":{"type":"git","url":"git+https://github.com/aivin-labs/AIVIN-SDK.git"},"description":"Aivin Plugin SDK - gRPC client/server for building plugins that run inside the Aivin platform (agentic engine, vector search, workspace, tasks, and more)","maintainers":[{"name":"aivinvn","email":"ai@aivin.vn"}],"readme":"# 🚀 Aivin Plugin SDK\n\n[![npm version](https://badge.fury.io/js/%40aivin-labs%2Fsdk.svg)](https://badge.fury.io/js/%40aivin-labs%2Fsdk)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Node](https://img.shields.io/badge/node-%3E%3D22-brightgreen.svg)](https://nodejs.org)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)\n\n## About Aivin\n\n[Aivin](https://aivin.cloud) is an **AI Workforce Platform**: it gives a business a team of virtual\n**AI Staff** that actually run its processes, not just answer questions about them. Humans and AI\nwork side by side in one environment built for both — high-performance, parallel, secure, and\nreliable — so AI Staff can stay on a job for the long haul instead of losing context after one\nexchange.\n\nThat workforce doesn't stay static. It adapts and keeps learning as it works, building a deeper\nunderstanding of the organization over time — less a chatbot bolted onto the business, more a\nsecond brain growing alongside it. And it doesn't work in isolation: Aivin connects broadly and\ndeeply into the tools a business already runs on.\n\nPlugins are that connection. Every plugin you ship becomes a new, real-world skill any AI Staff\nagent in the workspace can discover and call on its own — the platform is architected to scale to\n**millions of them**. Whenever an agent needs to do something beyond reasoning alone — query a\ndatabase, call a CRM, run a browser task, generate a report — it calls out to a plugin, and\n**this SDK is how you build one**.\n\n**Write one, use auto, zero config.** The Aivin Plugin SDK is the official toolkit for building\nplugins that run as their own Docker container inside the platform, with full access to the\nagentic engine, LLM/embeddings, vector search, tasks, persistent storage, realtime events, and\neverything else the platform offers — through one clean, fully-typed SDK surface.\n\nYou write `src/main.ts`. The SDK, CLI, and platform handle the container, the transport, the auth,\nand the infrastructure.\n\n```typescript\nimport { ai } from '@aivin-labs/sdk';\nimport { PluginStatus } from '@aivin-labs/sdk';\nimport type { PluginInput, PluginContext, PluginResponse } from '@aivin-labs/sdk';\n\nexport async function main(\n  mission: string,\n  input: PluginInput,\n  ctx: PluginContext,\n): Promise<PluginResponse> {\n  const summary = await ai.prompt(`Summarize: ${input.text}`);\n  return { status: PluginStatus.SUCCESS, data: summary };\n}\n```\n\n## Plugin vs. standalone: which should you use?\n\nThe snippet above is a **plugin** — the recommended path, and what the rest of this README walks\nthrough. But the same `@aivin-labs/sdk` package works two ways:\n\n- **Aivin Plugin (recommended default).** Your code runs as a container the platform builds,\n  deploys, and manages for you — `aivin create` → `aivin deploy`, no server to provision, no infra\n  to operate, and every plugin becomes automatically discoverable/callable by any AI Staff agent in\n  the workspace. Pick this whenever you're building something new, or whenever you want Aivin's\n  DevOps handled for you instead of running it yourself.\n- **Standalone, inside an application you already run.** Already have your own backend/script/CI\n  job and just want to call Aivin's infrastructure — AI, vector search, storage, tasks, and more —\n  directly from it, without deploying anything through Aivin at all? Use `connectStandalone()`\n  instead of `main()` — see\n  [docs/SDK.md#standalone-use-third-party-applications](docs/SDK.md#standalone-use-third-party-applications).\n  You trade away the zero-ops container hosting and AI Staff auto-discovery the plugin path gives\n  you for free, but there's nothing to deploy on Aivin's side either — the right fit when your app\n  already has its own home and just needs Aivin's backend capabilities.\n\n## Table of Contents\n\n- [Plugin vs. standalone: which should you use?](#plugin-vs-standalone-which-should-you-use)\n- [Why the Aivin SDK](#why-the-aivin-sdk)\n- [Requirements](#requirements)\n- [Getting Started](#getting-started)\n- [Anatomy of a plugin](#anatomy-of-a-plugin)\n- [Calling the SDK](#calling-the-sdk)\n- [What the SDK exposes](#what-the-sdk-exposes)\n- [manifest.json](#manifestjson)\n- [How AI Staff discovers your plugin](#how-ai-staff-discovers-your-plugin)\n- [CLI reference](#cli-reference)\n- [Environment variables](#environment-variables)\n- [How it works](#how-it-works)\n- [Security model](#security-model)\n- [Turn anything into a plugin](#turn-anything-into-a-plugin)\n- [Documentation](#documentation)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Why the Aivin SDK\n\nBecause building a plugin should feel like writing one function — and here, that's really all it\nis. Everything else is handled for you:\n\n- **Four commands and you're live.** `aivin init` → write your code → `aivin start` to try it →\n  `aivin deploy` to ship it. No Dockerfile, no CI pipeline, no server to rent — the platform\n  builds and runs everything for you.\n- **Your plugin gets discovered on its own.** No routes to register, no tool schemas to wire up.\n  Just describe what your plugin does in `manifest.json`, and AI Staff figures out when to use\n  it — see [How AI Staff discovers your plugin](#how-ai-staff-discovers-your-plugin).\n- **Bring whatever you already have.** Start from scratch, convert an existing project with\n  `aivin plugin convert`, or skip code entirely and point `aivin mcp` at an MCP server — a whole\n  server or just one tool — to deploy it as one or more plugins with no manifest written by hand\n  (REST, n8n, Zapier, Make, Coze, and Dify hookups work through the platform dashboard too).\n  Either way, it becomes a skill every AI Staff agent can call.\n- **One function is the whole contract.** Export `main(mission, input, ctx)` and you're done —\n  the SDK takes care of the rest.\n- **Your editor already knows everything.** Full TypeScript types for the entire SDK mean\n  autocomplete shows you what's possible before you've read a single doc.\n- **No secrets to babysit.** Need storage? `redis`, `mongo`, and `store` just work — no\n  connection strings to configure, rotate, or accidentally commit.\n- **Try it at home first.** `aivin start` spins up your plugin locally with a `curl`-able\n  endpoint, so you can poke at it end-to-end before it ever touches the platform.\n- **Or let AI write it for you.** Describe what you want in plain language —\n  `aivin plugin make \"<description>\"` — and get working code back.\n\n## Requirements\n\n| | |\n| --- | --- |\n| **Node.js** | ≥ 22.0.0 (native TypeScript execution support; stable from Node 22.6, default from Node 24) |\n| **Package manager** | npm (or any Node package manager) |\n| **Docker** | Not required locally — the platform builds and runs your container remotely on `aivin deploy` |\n| **Account** | An Aivin account, for `aivin login` / `aivin deploy` / `aivin test` |\n| **CLI** | [`@aivin-labs/cli`](https://www.npmjs.com/package/@aivin-labs/cli) (`npm install -g @aivin-labs/cli`) — the `aivin` command used throughout this doc. This package (`@aivin-labs/sdk`) is the runtime library your plugin code imports; it no longer ships a CLI itself. |\n\n## Getting Started\n\nFour steps, four commands each — from an empty folder to a plugin every AI Staff agent in your\nworkspace can already discover and call.\n\n### 1. Initialize\n\n```bash\nnpm install -g @aivin-labs/cli\n\naivin init my-plugin\ncd my-plugin && npm install\n```\n\n`aivin init` asks what the plugin should do, then scaffolds the project **and** generates real\nworking code from that description in one step — `src/service.ts` (the business logic) + a thin,\nstatic `src/main.ts` wrapper, instead of one file mixing both concerns.\n\n### 2. Write (or regenerate)\n\nEdit `src/service.ts` yourself (full walkthrough: [Anatomy of a plugin](#anatomy-of-a-plugin)), or\nregenerate it from a new description:\n\n```bash\naivin plugin make \"Summarize a support ticket and tag its urgency\"\n```\n\nPrefer a blank scaffold with no AI step at all? `aivin create my-plugin` does just the scaffolding\n(one `src/main.ts` you write by hand) - `aivin init` is the guided, AI-assisted alternative.\nConverting a project you already have, instead of starting from a description:\n\n```bash\naivin plugin convert\n```\n\n### 3. Run it locally\n\n```bash\nnpm test              # unit tests - no server, no network (see docs/SDK.md#testing)\naivin start           # real gRPC server + a curl-friendly HTTP test shim on :4001\naivin start --debug   # same, plus logs every sdk.* call live as it happens\n\ncurl -X POST http://localhost:4001/invoke -H 'content-type: application/json' \\\n  -d '{\"input\":{\"text\":\"Aivin plugins are easy to write.\"}}'\n```\n\n(`npm start` also works and boots the same server — it's what a deployed container runs too — but\nonly `aivin start`, from `@aivin-labs/cli`, understands flags like `--debug`.)\n\n### 4. Deploy\n\n```bash\naivin login    # save your API key (once per machine)\naivin test      # verify on a non-production instance first\naivin deploy    # ships to your org\n```\n\nNo Dockerfile, no CI pipeline, no server to provision — the CLI packages `src/main.ts` +\n`manifest.json` and the platform builds and runs the container.\n\n## Anatomy of a plugin\n\n`aivin create`/`aivin init` scaffold everything you need:\n\n```\nmy-plugin/\n├── manifest.json      # shared fields + plugins[] — one entry per function: name,\n│                        #   description, input/output shape, triggers\n├── src/\n│   ├── main.ts         # the entry point — main(mission, input, ctx). Fixed filename: the\n│   │                    #   runtime always loads exactly this file, never rename it.\n│   └── service.ts       # (aivin init only) your actual business logic, kept separate from\n│                        #   main.ts's protocol wrapping - main.ts just calls it and packages\n│                        #   the result into a PluginResponse.\n├── package.json\n├── tsconfig.json\n├── AGENTS.md            # primer for coding agents (Claude Code, Cursor, ...) working in this dir\n├── .env                # local-only overrides, e.g. LOCAL_TEST_PORT (never committed)\n└── .gitignore\n```\n\n`aivin create` writes one `src/main.ts` you edit directly; `aivin init` additionally splits your\nbusiness logic into `src/service.ts`, keeping `main.ts` a thin, unchanging wrapper. Either way,\n`main.ts` exports exactly one `main` function:\n\n```typescript\nimport { ai, store } from '@aivin-labs/sdk';\nimport { PluginStatus, PluginErrorCode } from '@aivin-labs/sdk';\nimport type { PluginInput, PluginContext, PluginResponse } from '@aivin-labs/sdk';\n\nexport async function main(\n  mission: string,          // human-readable reason this run was triggered (for logging)\n  input: PluginInput,       // fields declared in manifest.json's \"input\"\n  ctx: PluginContext,       // user, workspace, session, cert (if connection_id set)\n): Promise<PluginResponse> {\n  if (!input.text) {\n    return { status: PluginStatus.FAIL, error_code: PluginErrorCode.INVALID_INPUT };\n  }\n\n  const summary = await ai.prompt(`Summarize: ${input.text}`);\n  await store.set('summaries', crypto.randomUUID(), { summary, created_at: Date.now() });\n\n  return { status: PluginStatus.SUCCESS, data: summary, message: 'Processed successfully' };\n}\n```\n\nNeed more than one entry point? Export as many named functions as you like from the same\n`src/main.ts` and append one `plugins: []` entry per function in `manifest.json`, each naming its\nexport via `func` — see [manifest.json](#manifestjson).\n\nMore real, complete examples (RAG search, task automation, persistent storage, agent delegation,\nhuman-in-the-loop review): [docs/EXAMPLES.md](docs/EXAMPLES.md).\n\n## Calling the SDK\n\nImport just the namespace(s) you need — that's the whole story:\n\n```typescript\nimport { ai, mongo } from '@aivin-labs/sdk';\n\nawait ai.prompt('Hello');\nawait mongo.model('notes').find({});\n```\n\nEvery import resolves to the same per-invocation client (same tenant scoping, same capability\ntoken), so there's nothing to construct, configure, or pass around.\n\n> **Legacy: `ctx.sdk`.** Older plugins reach the same client through `main()`'s 3rd argument\n> (`ctx.sdk.ai.prompt(...)`). It still works and isn't going away, but it's **not recommended**\n> for new code — the SDK is designed so your logic doesn't have to depend on `ctx`. Its one\n> remaining niche is code that runs outside a `main()` invocation, where the imports' async-context\n> scoping can't reach.\n\nFull details, including the generic `call('namespace.method', params)` escape hatch:\n[docs/SDK.md](docs/SDK.md#calling-the-sdk).\n\n## What the SDK exposes\n\nEvery namespace below is importable on its own — `import { ai, store } from '@aivin-labs/sdk'`\n(see [Calling the SDK](#calling-the-sdk)).\n\n| Namespace | Purpose | Details |\n| --- | --- | --- |\n| `ai` | Prompt the LLM, generate embeddings, rerank documents | [docs/sdk/ai.md](docs/sdk/ai.md) |\n| `knowledge` | Search the workspace's long-term knowledge base (RAG) | [docs/sdk/knowledge.md](docs/sdk/knowledge.md) |\n| `vector` | Raw vector search and indexing over the workspace's document store | [docs/sdk/vector.md](docs/sdk/vector.md) |\n| `store` | Plugin-private persistent storage, default choice — relational key-value with schema, graph edges, hybrid search, aggregation, atomic transactions | [docs/sdk/store.md](docs/sdk/store.md) |\n| `redis` | Plugin-private ephemeral cache (counters, dedup locks, short-lived state) | [docs/sdk/redis.md](docs/sdk/redis.md) |\n| `mongo` | Plugin-private document collections, for teams porting existing Mongo-shaped logic | [docs/sdk/mongo.md](docs/sdk/mongo.md) |\n| `table` | User-facing tabular data (tables/rows a human browses/edits in the platform's UI) — a different job from `store`/`mongo`/`redis`, not a variant of them. See [Persistent storage](docs/SDK.md#persistent-storage--store-table-mongo-redis) for the full decision guide. | [docs/sdk/table.md](docs/sdk/table.md) |\n| `datasource` | Manage training data sources feeding the workspace's knowledge | [docs/sdk/datasource.md](docs/sdk/datasource.md) |\n| `task` | Create, update, list, and delete tasks | [docs/sdk/task.md](docs/sdk/task.md) |\n| `project` | Read-only project lookup | [docs/sdk/project.md](docs/sdk/project.md) |\n| `workspace` | Workspace details, members, permissions, per-workspace plugin config | [docs/sdk/workspace.md](docs/sdk/workspace.md) |\n| `agent` | Look up/delegate to an AI Staff agent, reply/push text into chat, run a flow or force a specific processing mode directly, with optional realtime progress events | [docs/sdk/agent.md](docs/sdk/agent.md) |\n| `message` | Save, list, search, and update chat messages | [docs/sdk/message.md](docs/sdk/message.md) |\n| `session` | Chat/automation session management | [docs/sdk/session.md](docs/sdk/session.md) |\n| `realtime` | Publish a live event to the workspace or a specific user | [docs/sdk/realtime.md](docs/sdk/realtime.md) |\n| `queue` | Schedule this same plugin to run again later (self-continuation) | [docs/sdk/queue.md](docs/sdk/queue.md) |\n| `notification` | Push in-app notifications and send transactional email | [docs/sdk/notification.md](docs/sdk/notification.md) |\n| `resource` | Upload or remove blob storage files | [docs/sdk/resource.md](docs/sdk/resource.md) |\n| `file` | Create, read, list, and search workspace documents | [docs/sdk/file.md](docs/sdk/file.md) |\n| `setting` | Read tenant display/merchant settings | [docs/sdk/setting.md](docs/sdk/setting.md) |\n| `usage` | Check billing balance and usage | [docs/sdk/usage.md](docs/sdk/usage.md) |\n| `automation` | Manage cron-style automation jobs | [docs/sdk/automation.md](docs/sdk/automation.md) |\n| `browser` | Trigger a full, multi-step AI Browser mission | [docs/sdk/browser.md](docs/sdk/browser.md) |\n| `causality` | Deep causal reasoning over accumulated context | [docs/sdk/causality.md](docs/sdk/causality.md) |\n| `attachment` | Search, upload, deep-research, evaluate, and extract raw content from attached documents | [docs/sdk/attachment.md](docs/sdk/attachment.md) |\n| `code` | Execute AI-generated/cached business logic with sandboxed args | [docs/sdk/code.md](docs/sdk/code.md) |\n| `plugin` | Call another plugin by id (`trigger`), or discover one (`info`/`infoBatch`/`search`/`fit`/`status`) | [docs/sdk/plugin.md](docs/sdk/plugin.md) |\n\nA few top-level functions round out the surface, imported the same way: `ask(...)`/`hil(...)` for\nhuman-in-the-loop input, `a2a(...)` for agent delegation, `plugin.trigger(pluginId, mission,\nparams?, opts?)`/`plugin.info(pluginId)`/`plugin.search(query, opts?)`/`plugin.fit(query, opts?)`\nfor calling and discovering other plugins, `user(id)`/`getCachedUser(id)` for a user's public\nprofile, `log(...)`/`wait(...)`, and `config()` for this plugin's saved workspace config.\n\nEvery method is scoped to this plugin and the invoking tenant on the host side — your container\nnever receives a raw database credential. Full method-by-method reference with parameter shapes:\n[docs/SDK.md](docs/SDK.md).\n\n## `manifest.json`\n\n`manifest.json` is **one JSON object**: fields shared by the whole project (`version`, `author`,\n`connection_id`, ...) once at the top level, plus a `plugins` array with one entry per function\nyour plugin exposes. This is the default shape — it's what `aivin create`/`aivin init` scaffold,\nand what a fresh single-function plugin looks like:\n\n```json\n{\n  \"version\": \"1.0.0\",\n  \"plugins\": [\n    {\n      \"id\": \"auto-generated-hex-id\",\n      \"name\": \"text-summarizer\",\n      \"description\": \"Summarize text using AI\",\n      \"func\": \"main\",\n      \"input\": { \"text\": \"string - text to summarize\" },\n      \"output\": { \"data\": \"string - the summary\" }\n    }\n  ]\n}\n```\n\nEach entry's `func` names the export of the shared `src/main.ts` it calls (`\"main\"` for the\nscaffold's single entry), and each entry is deployed/discovered as its own independent plugin\n`id` — so growing from one function to several is just exporting more named functions and\nappending entries, nothing to restructure. `aivin deploy`/`aivin test` copy the shared top-level\nfields onto every entry automatically before sending:\n\n```json\n{\n  \"version\": \"1.0.0\",\n  \"author\": \"Your Name\",\n  \"email\": \"you@example.com\",\n  \"license\": \"MIT\",\n  \"plugins\": [\n    {\n      \"id\": \"auto-generated-hex-id\",\n      \"name\": \"summarize-ticket\",\n      \"description\": \"Summarize a support ticket\",\n      \"input\": { \"text\": \"string - ticket content\" },\n      \"output\": { \"data\": \"string - the summary\" },\n      \"func\": \"summarizeTicket\"\n    },\n    {\n      \"id\": \"auto-generated-hex-id\",\n      \"name\": \"tag-urgency\",\n      \"description\": \"Tag a support ticket's urgency\",\n      \"input\": { \"text\": \"string - ticket content\" },\n      \"output\": { \"data\": \"string - urgency level\" },\n      \"func\": \"tagUrgency\"\n    }\n  ]\n}\n```\n\nA legacy flat shape — the entry's fields directly at the top level, no `plugins` array, entry\npoint resolved from the `main` export — is still accepted everywhere, as are codeless\n`proxy_config` manifests (which keep the flat shape, having no `func` to name).\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `name` | `string` | Required. Unique identifier, lowercase-hyphen (`\"task-manager\"`). |\n| `description` | `string` | Required. Short summary — one of the signals the planner reads to pick this plugin. |\n| `selection_rules` | `string[]` | **The strongest discovery signal** — see [How AI Staff discovers your plugin](#how-ai-staff-discovers-your-plugin). |\n| `input` | `object` | Required. Structure of the handler's 2nd argument — actually parsed and validated, not just descriptive text. Supports nested objects/arrays. Read by the planner's auto-mapping to fit its own output onto your fields. |\n| `output` | `string \\| object` | The shape of `PluginResponse.data` callers should expect. Read by the planner for auditing/replanning and for mapping this plugin's result into a later stage's input. |\n| `func` | `string` | Name of the export in `src/main.ts` this `plugins[]` entry calls — `\"main\"` in the scaffold. Required on every `plugins[]` entry. |\n| `instructions` | `string` | Extra planner guidance beyond `description` — edge cases, when *not* to use it. |\n| `capabilities` | `string[]` | Free-text tags for discovery/ranking against other plugins. |\n| `category` / `scope` | `string` / `string[]` | Single primary domain for display; broader domain tags as a secondary ranking signal. |\n| `trigger_type` | `TriggerType[]` | Restrict invocation channels (`manual`/`schedule`/`event`/`webhook`/`api`/`chat`). Omit = all. |\n| `initable` | `string[]` | Fields that must be configured once per workspace before the plugin can run (e.g. an API key). |\n| `depend_on` | `string \\| PluginDependency \\| (...)[]` | Other plugin(s) this one depends on — the dependency is scheduled into an earlier execution stage, so it always runs (and its result is available) before this plugin does. A bare string is required; an object (`{ plugin, optional, condition, fallback_field }`) is conditional. |\n| `mapping_reasoning` | `boolean \\| string[]` | How the planner maps its output onto `input`'s fields: via LLM reasoning, direct key mapping, or a mix. |\n| `connection_id` | `string` | Namespace for a shared connection — plugins sharing this id share one set of credentials. Create or find one with `aivin connector register` / `aivin connector search`. |\n| `timeout_ms` | `number` | Execution timeout (the host also enforces its own hard cap). |\n| `circuit_breaker` | `object` | Per-plugin override of the default failure threshold/cooldown. |\n| `expose` | `string[]` | Field paths from this plugin exposed externally. |\n| `stacks` | `string[]` | Dedicated service containers, only relevant outside shared-infrastructure deployments. |\n| `requires_human` | `boolean` | Task fundamentally can't be automated — the planner marks it infeasible instead of substituting an automated plugin. |\n| `request_hil` / `hard_confirm` | `boolean` | Human-in-the-loop / hard \"action gate\" safety flags for sensitive or irreversible actions. |\n| `version` | `string` | Semantic version — `aivin deploy`/`aivin test` auto-increment the patch on success. |\n| `author` | `string` | Your name. |\n| `email` | `string` | Your contact email. |\n| `license` | `string` | License name (e.g. `MIT`, `Apache-2.0`). |\n| `repository_url` | `string` | Link to the plugin's source repo. |\n| `compute_factor` | `number` | Relative resource weight vs. a baseline plugin (default `1`). |\n| `side_effect` | `boolean` | Set `false` only for pure-read plugins (find/list/get/search). |\n| `proxy_config` | `object` | Turns this into a proxy for an external system instead of running code — see [Turn anything into a plugin](#turn-anything-into-a-plugin). |\n\nFull reference, including the `input`/`output` type-annotation syntax and every trigger type:\n[docs/MANIFEST.md](docs/MANIFEST.md).\n\n## How AI Staff discovers your plugin\n\nYou never wire up routing, intents, or a tool schema by hand. Every AI Staff agent's planner reads\nyour `manifest.json` and decides on its own, at run time, whether your plugin is the right tool for\nthe job — in roughly this order of weight:\n\n- **`selection_rules`** — the strongest signal. Explicit, concrete triggering conditions, shown to\n  the planner as `Rules: ...` right next to your `description` when it's picking between candidate\n  plugins:\n  ```json\n  \"selection_rules\": [\n    \"Requests for high-fidelity 'deep research' across multiple sources\",\n    \"Standard web search results are insufficient or overly superficial\"\n  ]\n  ```\n  Write the concrete conditions that should trigger this plugin, not a restatement of what it does\n  — that's what `description` is for.\n- **`description`** — the first thing the planner reads to decide when to reach for your plugin.\n  Short and specific beats generic.\n- **`capabilities`** — free-text tags used for discovery and ranking against every other plugin in\n  the workspace.\n- **`instructions`** — standing guidance for the AI on how to use this plugin, read at several points\n  beyond initial selection: disambiguating between candidate plugins when it's unsure which one\n  fits, mapping its own output onto your `input` schema, and auditing/replanning a mission that\n  didn't go as expected. Edge cases and when *not* to use it belong here too.\n- **`category`** — a single primary domain, for classification and display.\n- **`requires_human`** — set `true` if the task fundamentally can't be automated; the planner then\n  marks it infeasible instead of silently substituting an automated plugin.\n\nWrite these once in `manifest.json`, deploy, and any agent in the workspace — not just the one you\nhad in mind while building it — can find and call your plugin from then on.\n\n## CLI reference\n\n`aivin` ships from the separate [`@aivin-labs/cli`](https://www.npmjs.com/package/@aivin-labs/cli)\npackage (`npm install -g @aivin-labs/cli`) — this repo (`@aivin-labs/sdk`) is the runtime library\nonly. It's built on [Commander](https://github.com/tj/commander.js) — `aivin --help` and\n`aivin <command> --help` are always available. Full reference with every flag and environment\nvariable lives in that package's own `docs/CLI.md`.\n\n| Command | Description |\n| --- | --- |\n| `aivin init [name]` | Guided setup: asks what the plugin should do, then scaffolds the project **and** generates real code from that description — `src/service.ts` (logic) + `src/main.ts` (thin wrapper). The simplest way to start. |\n| `aivin create [name]` | Scaffold a new plugin with no AI step — one `src/main.ts` you write by hand (interactive, or `--json`/`--stdin` for scripted/AI use). |\n| `aivin plugin make \"<description>\"` | (Re)generate business logic from a natural-language description — targets `src/service.ts` if `aivin init` created one, else `src/main.ts`. |\n| `aivin plugin convert` | Already have a project? Turn it into a plugin — AI-generate `src/main.ts` from the code you already have, in the current directory. |\n| `aivin plugin search \"<query>\"` | Search the platform's plugin ecosystem for something to reuse before writing new logic. |\n| `aivin plugin trigger \"<mission>\" '<input>'` | Invoke an already-deployed plugin for real and print the result — like the platform's Playground. `-a \"<prompt>\"` lets the platform auto-map free text onto the input schema instead. |\n| `aivin plugin logs [pluginId]` | Tail an already-deployed plugin's own console output live — defaults to the current directory's `manifest.json` id. |\n| `aivin validate` | Validate `manifest.json` in the current directory (or `--json <config>`/`--stdin` for scripted/CI use). |\n| `aivin start` | Run the plugin locally: real gRPC server + an HTTP test shim on `:4001`. |\n| `aivin test` | Deploy to a non-production test instance, then smoke-test it with generated input and save a report to `.test/`. Blocked in production. |\n| `aivin deploy` | Deploy to your org. |\n| `aivin mcp create <name>` | Scaffold a manifest-only plugin that proxies to an external MCP server tool/resource/prompt — no code needed. |\n| `aivin connector register` | Register a reusable connector (OAuth app / credential namespace) for a `manifest.json` `connection_id` — `aivin connector search`/`list` to find one that already exists instead. |\n| `aivin login` | Authenticate and save an API key to `~/.aivin/credentials` (once per machine, shared by every project). |\n\n`aivin` is also how you drive your Aivin workspace directly, not just build plugins —\n`aivin do`/`task`/`agent`/`project`/`workspace`/`browser`/`key` run agents, manage tasks/projects,\nand automate a real browser from the terminal. Out of scope for a plugin-building doc; see\n`aivin --help` or `@aivin-labs/cli`'s\n[CLI.md](https://github.com/aivin-labs/cli/blob/main/docs/CLI.md) for the full surface.\n\n## Environment variables\n\n`aivin login` saves your key once to `~/.aivin/credentials`, shared by every plugin project on the\nmachine — there's no per-project credential to manage.\n\n| Variable | Purpose | Default |\n| --- | --- | --- |\n| `SDK_ENDPOINT` | Backend gRPC endpoint for the SDK's outbound calls | `sdk.aivin.cloud:443` |\n| `AIVIN_APIKEY` | API key for a **standalone third-party app** (not a plugin container) calling the SDK directly via `connectStandalone()` — see [docs/SDK.md#standalone-use-third-party-applications](docs/SDK.md#standalone-use-third-party-applications) | none — falls back to `~/.aivin/credentials` (`aivin login`) |\n| `AIVIN_BASE_URL` | Aivin API base URL (only for a self-hosted/staging instance) | `https://api.aivin.cloud` |\n| `AIVIN_WEB_URL` | Platform web app URL, used by `aivin login`'s browser flow | `https://brain.aivin.cloud` |\n| `LOCAL_TEST_PORT` | Port for the local HTTP test shim (`POST /invoke`) | `4001` |\n\nThat's it — everything else is zero-config. Full list: [`@aivin-labs/cli`'s CLI.md#environment-variables](https://github.com/aivin-labs/cli/blob/main/docs/CLI.md#environment-variables).\n\n## How it works\n\n- Your plugin runs in its **own Docker container**, managed entirely by the Aivin host — you\n  never touch Docker yourself, `aivin deploy` handles it.\n- The host and your plugin talk over **gRPC**, one symmetric `Invoke` RPC in each direction: the\n  host calls your container to run `main()`, and the SDK calls back out to the host for\n  everything else (LLM, vector search, storage, tasks, ...). Adding a new backend capability never\n  requires a proto change — just a new `namespace` string on the host side.\n- Every `Invoke` call carries a shared-secret bearer token, plus a short-lived, per-invocation\n  **capability token** the host mints for each trigger — so the host always resolves your real\n  tenant/workspace identity server-side, never from anything your process claims about itself.\n- `src/main.ts` is loaded via Node's native TypeScript support, which is why `manifest.json`'s\n  `trigger_type` and similar unions are plain `const` objects instead of TS `enum`s — only\n  *erasable* TypeScript syntax is supported at runtime.\n\nWant the full picture of how your plugin communicates with the platform — the two-direction\n`Invoke` diagram and the life of an invocation from trigger to response — plus internals (proto\nshape, directory layout, auth flow, local testing without a host)?\n[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md). You don't need to read it to build a plugin.\n\n## Security model\n\n- **No raw credentials.** `store`/`redis`/`mongo` are host-mediated and tenant-scoped; your\n  container never receives a database connection string.\n- **Identity can't be spoofed.** The per-invocation capability token means your own code can never\n  claim to be a different tenant, even though it shares a process with the SDK client.\n- **Response size is capped.** Whatever `main()` returns is capped at **1MB** once\n  JSON-serialized; page/paginate large result sets instead of returning everything at once.\n\n## Turn anything into a plugin\n\nYou don't have to start from an empty `src/main.ts`, and you don't have to write any code at all if\nyou'd rather not.\n\n**Already have a project?** Point `aivin plugin convert` at it and it becomes a plugin — no manual\nwrapper code to write:\n\n```bash\ncd your-existing-project\naivin plugin convert\n```\n\nIt reads your project as-is, infers a `manifest.json` from `package.json` if you don't have one yet,\nand generates a `src/main.ts` that adapts your project's real logic into `main(mission, input, ctx)`\n— preserving what it already does, not stubbing it out. Add a hint if you want to point it at\nsomething specific: `aivin plugin convert \"focus on the exportInvoice function\"`. Review what it\ngenerates before you deploy, same as any AI-written code.\n\n**Just wrapping an external service?** Skip code entirely — the manifest's `proxy_config` turns an\nexisting external system into something every AI Staff agent can call directly, with no container\nto build and no `src/main.ts` at all. This SDK authors the `mcp` variant for you.\n\nAlready have a whole [MCP](https://modelcontextprotocol.io) server, not just one tool? Point\n`aivin mcp` at it and every tool/resource/prompt it exposes becomes its own deployed plugin in one\npass — a GitHub/GitLab repo, an npm/Smithery package, or a live server URL all work:\n\n```bash\naivin mcp https://github.com/example-org/example-mcp-server\n```\n\nIt scans the server, lets you pick which tools to keep (all selected by default), generates and\ndeploys one manifest per tool, and hands back ready-to-run `aivin plugin trigger`/`aivin plugin logs`\ncommands for each — no manifest written by hand. Know exactly the one tool/command you want instead?\n`aivin mcp create` skips the scan:\n\n```bash\naivin mcp create fs-tools --command npx \\\n  --args \"-y @modelcontextprotocol/server-filesystem /data\" \\\n  --tool-name read_file --description \"Read files via MCP\"\n```\n\n`aivin deploy`/`aivin test` detect the resulting `proxy_config` automatically and send the manifest\nalone — no files, no container build. The full `proxy_config` schema also recognizes REST, n8n,\nZapier, Make, Coze, Dify, and workflow proxies, configured through the platform dashboard — same\nidea, for turning virtually any existing system into an agent-callable plugin without writing code.\nFull reference, including the `sse` transport for remote MCP servers:\n[docs/MANIFEST.md](docs/MANIFEST.md#mcp-proxy-plugins).\n\n## Documentation\n\n- 🧰 **[SDK Reference](docs/SDK.md)** — every namespace: AI, vector/knowledge, tasks, storage, realtime, and more (including [standalone use](docs/SDK.md#standalone-use-third-party-applications) for a third-party app calling the SDK directly, no plugin)\n- 📋 **[Manifest Reference](docs/MANIFEST.md)** — every `manifest.json` field, including MCP proxy plugins\n- 🪪 **[Plugin Context](docs/CONTEXT.md)** — every field of `ctx`, the runtime identity your handler receives\n- 📖 **[Plugin Development Guide](docs/PLUGIN_DEVELOPMENT_GUIDE.md)** — writing/testing a handler, best practices\n- 🏗️ **[Architecture](docs/ARCHITECTURE.md)** — how the gRPC transport and container model work\n- 📚 **[Examples](docs/EXAMPLES.md)** — real, complete plugins across common use cases\n- 📊 **[Data Structures](docs/DATA_STRUCTURES.md)** — `User`, `Workspace`, `Task`, `PluginManifest`, and friends\n- 📝 **[Changelog](docs/CHANGELOG.md)** — release history\n- 🤝 **[Contributing](docs/CONTRIBUTING.md)**\n\nFor the CLI (`aivin create`/`init`/`start`/`deploy`/...), see\n**[`@aivin-labs/cli`'s docs](https://github.com/aivin-labs/cli/blob/main/docs/GETTING_STARTED.md)**\n— this package (`@aivin-labs/sdk`) is runtime-only and doesn't ship it.\n\nFor a quick, AI-agent-focused cheat sheet (the two files every plugin needs, in one page), see\n[AI-Plugin-Guide.md](docs/AI-Plugin-Guide.md).\n\n## Contributing\n\nBug reports, feature requests, and pull requests are welcome — see\n[docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) for how to get involved.\n\n## License\n\nMIT © [Aivin Team](https://aivin.cloud)\n","readmeFilename":"README.md"}