{"_id":"speedybot-mini","_rev":"29-5eb3f49971ed1a5bacfa3f45ec720a1b","name":"speedybot-mini","dist-tags":{"latest":"2.0.6","beta":"2.7.0-beta2"},"versions":{"0.0.2":{"name":"speedybot-mini","version":"0.0.2","description":"Speedy & easy way to deploy a serverless bot","main":"./dist/src/index.js","types":"./dist/src/index.d.ts","scripts":{"test":"npm run build && node_modules/.bin/tape dist/test/*.test.js","patch":"npx np patch","prepublish":"npm run build","dev":"nodemon","start":"ts-node src/launcher","build:global":"tsc","build":"./node_modules/typescript/bin/tsc","setup":"npm i && npm run build","server":"cd test/server && ts-node index.ts","register:webhook":"npx speedyhelper webhook register"},"keywords":["serverless","bot","scaffold","demo","speedybot"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","dependencies":{"axios":"^0.23.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot-mini.git"},"devDependencies":{"@types/axios":"^0.14.0","@types/node":"^13.13.52","@types/tape":"^4.13.2","body-parser":"^1.19.0","express":"^4.17.1","nodemon":"^2.0.4","tape":"^5.3.1","ts-node":"^8.10.1","typescript":"^3.8.3"},"gitHead":"14ac3ba0775ed43a1112f58068144ce2d386679e","bugs":{"url":"https://github.com/valgaze/speedybot-mini/issues"},"homepage":"https://github.com/valgaze/speedybot-mini#readme","_id":"speedybot-mini@0.0.2","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","dist":{"integrity":"sha512-ExaHsyd6OBoj9ZyTFI+oYixEBbMf0IHFAu61sed4tcjKCeXTA84qOqKEcI3nEmdZsvZSJ0pEHlKUohjyHTTtgg==","shasum":"8791ef91adf36da1e6151a964492bbf4eec9c095","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-0.0.2.tgz","fileCount":40,"unpackedSize":115701,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh27sECRA9TVsSAnZWagAAPf4QAJToe3TwggwaDTEzjy5p\nPTcN5M2X8WATD24/JISUOO5Uly/ZuKDY5k7GOipuzo2A/bdII6v9qyH1valA\nvmMp0p+mkp4URAY1dX3feKx3wXS6uJXJZ4hjk2lkSlgcX4QMrNLs+pVA+mOt\nFUEUv4sTzh/P1LY0bIhoEDt0QdUdHMJz5d0S7RU/ckH36kJFxW1Nyb9ejmcb\n0JQF0v02IWvar5JAwURwcXaw5iqCHfC0xhcFJcQxIMDvRJP4WcGNuJf3oNEN\njiPHZYzObXtcsbeyJIeknoyxmWMAIL93R7M+Q6iAuYUqzaKNEGCT9khFZWil\nXnTxnwvMB0jc2Pa/BUE1wezHVW8QKWtD7djXhaLj8Y2PikBlzbZ6E2SLrHNo\njO0JAbbN/TesRNPCBlbS4vJvjN5doJ/iER9ddfHM78O++RTjnyhpFnu/Ou/N\nFlk2ldjSsxaXCBGDAO42hgSNe+ZDajI5Vhm15scRh8rF2vDbNksu/P1eBvWw\ncKoZYjlUyxjnFAi4mYQgst4VzWjhZhYMkHoBa1VTTTuGjBCUZXWf4GV2vmkx\nXtphWfXiPcAL4yM53TR1DY8Xc9QiEg6uJ7IGGrRJQHA4H6s4LMCGjDdhvz4X\nOiU2LEt0MNsitgPDdX3r28MVC2SXjNnN6Dv68exh/w6oPreQcgpNAKu/5fKq\nz3G3\r\n=tPp/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF24G/tQ6tfmyUWTnw5Co7Yhwd7kgo9UGUsuRRs1AcYMAiB9fkUAt3m4wy5qCjXO2YgeG7mO9cFLjwGi21QgBa4cng=="}]},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_0.0.2_1634912328492_0.4732249642647586"},"_hasShrinkwrap":false},"0.0.3":{"name":"speedybot-mini","version":"0.0.3","description":"Speedy & easy way to deploy a serverless bot","main":"./dist/src/index.js","types":"./dist/src/index.d.ts","scripts":{"test":"npm run build && node_modules/.bin/tape dist/test/*.test.js","patch":"npx np patch","prepublish":"npm run build","dev":"nodemon","start":"ts-node src/launcher","build:global":"tsc","build":"./node_modules/typescript/bin/tsc","setup":"npm i && npm run build","server":"cd test/server && ts-node index.ts","register:webhook":"npx speedyhelper webhook register"},"keywords":["serverless","bot","scaffold","demo","speedybot"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","dependencies":{"axios":"^0.23.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot-mini.git"},"devDependencies":{"@types/axios":"^0.14.0","@types/node":"^13.13.52","@types/tape":"^4.13.2","body-parser":"^1.19.0","express":"^4.17.1","nodemon":"^2.0.4","tape":"^5.3.1","ts-node":"^8.10.1","typescript":"^3.8.3"},"readme":"```\ntl:dr; The speedy & easy way to launch a bot...serverlessly\n```\n\n[![sb](https://i.imgur.com/VQoXfHn.gif)](https://share.descript.com/view/ds3UA1kUb9z)\n\n---\n\n## Video instructions\n\n```\n// todo\n```\n\n## What is this\n\nSpeedybot-mini is a deliberately **limited subset** of bot functionality that is intened to be deployed in serverless environments. Unlike the main **[speedybot](https://npmjs.com/package/speedybot)** library, this library does not instrument on top of the **[webex-node-bot-framework](https://github.com/WebexSamples/webex-node-bot-framework)** and does not have parity with all its features.\n\nAt the time of writing there are 4 supported methods on a handler (say, sendCard, get, post), see **[here](./docs/serverless)** for examples\n\n\n```js\n{\n\tkeyword: ['hello', 'hey', 'yo', 'watsup', 'hola'],\n\thandler(bot, trigger) {\n\t\tconst reply = `Heya how's it going ${trigger.person.displayName}?`\n\t\tbot.say(reply)\n\t},\n\thelpText: `**hello** A handler that greets the user`\n}\n```\n\nYou can define a special *<@submit>* handler which will be triggered anytime your users send you data via **[adpative cards](https://developer.webex.com/docs/api/guides/cards)**\n\n```js\n{\n    keyword: '<@submit>',\n    handler(bot:SubmitBotInst, trigger:AATrigger) {\n        // Ex. From here data could be transmitted to another service or a 3rd-party integrationn\n        bot.say(`Submission received! You sent us ${JSON.stringify(trigger.attachmentAction.inputs)}`)\n    },\n    helpText: `A special handler that fires anytime a user submits data (you can only trigger this handler by tapping Submit in a card)`\n}\n```\n\n\nNot included in this release in a serverless environment:\n\n```\n- spawn/despawn events\n- handle file uploads\n- various details related to membership\n- All the other bot methods\n```\n\n\n## CLI Instructions\n\n|         **Command**         |**Description**                                                                                     |\n| :-------------------------: | :-------------------------------------------------------------------------------------------------- |\n| `npx speedyhelper setup`  \t\t\t    | scaffold a starter speedybot project (requires git) |\n| `npx speedyhelper setup -t aaa-bbb-ccc-ddd` \t\t\t\t| scaffold a speedybot project using the value after setup as the token|\n| `npx speedyhelper help` \t\t\t\t   | show basic CLI help info |\n| `npx speedyhelper web -q`                | Kick off a web-based chat interface (use -q flag to interactively add token + roomId)  |\n| `npx speedyhelper sendmsg`               | Send a message to a room using bot access token  |\n| `npx speedyhelper tunnel -p 8000`        | Start an nGrok tunnel, defaults to port 8000|\n\n\n<details><summary>(Global install using npm/yarn)</summary>\n\nRather than using **[npx](https://docs.npmjs.com/cli/v7/commands/npx)**, you can perform a global install which install speedyhelper to your path\n\n```sh\nnpm i -g speedyhelper\n\nyarn global add speedyhelper\n```\n\nMake sure all worked well by opening a new terminal and entering:\n\n```sh\nspeedyhelper help\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"ed4221c0d94c5e2acca4177b9340d5df91573fc4","bugs":{"url":"https://github.com/valgaze/speedybot-mini/issues"},"homepage":"https://github.com/valgaze/speedybot-mini#readme","_id":"speedybot-mini@0.0.3","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","dist":{"integrity":"sha512-KcZ05AAtVNdQFWpdR8FDV/bP+IPfQ8clnxtJvFfiJpnac7WBFQFtYbJQbuJ7adyxOwBl8KSkkfkF+bBjDOebkw==","shasum":"3903dbfc180164e3289a2b2684e602d5cc0b4ef2","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-0.0.3.tgz","fileCount":49,"unpackedSize":134376,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA+ZEt2DfXpnwpoN62X6S+STX9FaQ+fwz1/Sr2izIJcJAiEAySEsOYU39LZNEea17xmiLpzNhz4Fqp2lZWPuVlEHBaM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJifr69ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpSZw//aSBJz7BW2tAXMshGFpLVcO+uLPHexhzUx5biDof7AbNAp/fS\r\noqbEa4xLErIEfmV9VBn42esZVj+AegNhKRwlNuNbYHyA7ET+cTGEkSqPn0/u\r\nT0RaL9MtQ3NZ7lHbgF+xOwQP70DEy3gKu0da/JLKenZI2e+rq8qSv23m5KsE\r\npv5Tl3+t5pDoBEQqNTn8IIR0Mtg79X1b74fNAiXt70+WeEICdexi09D8n8LR\r\nOPDAIWxlUp0miIHAfv7FobukjCwI041PLkyJ2uAbOMhkWcaE1E1JKDlcdfWu\r\nj8mZ7dK9Xmzx3814wD3elWYnuFx3aWaEiz++SR+cyCdCF0eoDD+rYi8btboa\r\nwnZ4T6DI5gPwJkKvNVzDN74rt8WUpwFIMLvp33UeppHh1esyOWhsqCeTPkf6\r\n/hS4lS54N8D8JazsVv7Rz2IhsDLHnIyovKk0Q/U0MdCEbS48k+8cdDG/rcmJ\r\nanvRKN4WYgsQXLuj0ZgWEyEgDTwIx5URQWIrcPGTYXjcnjEIqgxenVEDN0RM\r\nnzdUb2HhPLlMh7M3vTaRVz8vjqFCrXgAdjyj1GkJcXFYs1eaChjpczRTVt1H\r\nLSsK5PikmDmht96MLAvpuoTvRnCNY7usE+cnLqYj+HlrqB0fz9G7RMtOk2K3\r\nLHN1bo8XNYYSuJ+ZJE0R1QFGELBlFZrrKZY=\r\n=GnV4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_0.0.3_1652473533145_0.039145089760132645"},"_hasShrinkwrap":false},"2.0.0-beta.0":{"name":"speedybot-mini","version":"2.0.0-beta.0","main":"dist/index.js","types":"dist/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm run docs && tsc","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"readme":"## todo\n\nShow a demo with 7 bots at once lol\nBig achilles is lambda, but lambda is fucked up anyway\n\nMake speedybot-mini with lots of branches?\n\n- v8\n- deno\n- Bun\n- express\n- webhook\n- starter\n\nHandlers cannot call other handlers\n\n- Extract into a function for shared/testable code\n\nthis has x\nx\ni want x\n\n- get it to compile to dist\n- link to a test project with a websocket thingy\n- [x] send text, have handlers for every & hi execute correctly\n- [x] Get dang text to show up on msg.text (attach it to RootTrigger sub-type w/ MessageDetails)\n- [x] Also implement chips in a non-dopey way\n      -- be able to write a test\n- lol we gotta trim for \"group\" room situations so they don't get botname << or fuck actually not lol bc of contains\n\n```\nAnything back'tick'd thats not code needs edit\n```\n\n## Speedybot-mini\n\n```\nBuilding on Speedybot and lessons from \"serverless\" (and containerless) Speedybot-hub\n\nSpeedybot-mini is designed to run in serverless (or even better) containerless enviromments\n```\n\n## Node Version\n\n```\nThis library relies on the native **[fetch implementation in Node 18](https://nodejs.org/en/blog/announcements/v18-release-announce/)** which is still an experimental feature\n\nSpeedybot-mini is focuses on serverless/containerless environnment\n\nIf you need an example of a normal server to do lame chat\n\n- speedybot-receive-webhook\n\nNode18 is coming to Lambda just not yet, https://github.com/aws/aws-lambda-base-images/issues/47#issuecomment-1272990313\n```\n\nAWS Lambda h\n","readmeFilename":"README.md","gitHead":"70f99b635743201edccbaa09471ebb62bccf6308","description":"Show a demo with 7 bots at once lol Big achilles is lambda, but lambda is fucked up anyway","_id":"speedybot-mini@2.0.0-beta.0","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-9jV0o3NJR9lQ7Ec1EPM7KGzkDuau7GKBmsTZfVC77dk1qOnKOaLb/j7K+CX6487jXhKXNdg85lCM37wkAkNk9Q==","shasum":"95787fb2fcacb6544067f1e74f0db0c5ebd402e9","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.0.tgz","fileCount":31,"unpackedSize":253663,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3ImMh7ERBBAR94xDfQlQ8NsieRB1C8mTfxS6p/UUN5wIgMlV2RQJcx8nbeSLaXYIuRluzaH4DDjEX4aTYtYq7avc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTtrmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqOCQ/9FgWi4dVMHUbW8pf7cerg6jyr+vwHJHa24ny2ef9G43etPV3s\r\n5MUAVktPFSbTq0aG3g5MQURS5vvB5gA0JwS3axJwE4o/D5kW1UwaySlBZO3j\r\n5xSuGFUdZZ0WXJvmcGo9Pfp64RvmGIetFf+YR5StKTeHIAe/JDC4LaY/uROK\r\nzcUgn+stLW6AUKaURIpP1zpCMvA3DagpRQhsBiOcB1pkfda/u4yo4tBFF0X/\r\n4U2teuGXgmxwdDqR/+TRCmzNO0PX0zrmpG0z8EY7arZM5O2O3RKne3Pmm+6+\r\nMQ6tIR5sfFgafbfZrSHZEGh9sWWQ+jvUvE4LmQXp1pLR6rgmbpssLKQdaSBD\r\nSWIEBkHTiIM/R9K9cIynoMXBzzWnMnOq50GHsWbfHw5Lo8DJ7Yp6lhMmDp4k\r\n5TtnvMyz2bgZPfKwhJXyd/4YclyF0sCZOBeHWQYkt1yLj7gNatwW+7hlovZA\r\nEInqJIBeyrpzWlNpSo3RN06AsxUTy3zyyAQKON/9jq56DLBb3ZA2DWDQwTDE\r\nDz6CvA0ohHTTIZnoWGBIqjsw7pOWwsujka9znlcJ9Zbaa6Q2tNnlsI3/+3s4\r\nhjMYRl5Rz+PJQo0neSFBQQbf6T5jYm+6wmduW+Y/5SOkde9cxDu4lOL8WvD6\r\n/vUMb+k9bl4ZIue0U3BQVg+IfMqSYS6zF5Q=\r\n=rYgy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.0_1666112230063_0.7305943801124724"},"_hasShrinkwrap":false},"2.0.0-beta.1":{"name":"speedybot-mini","version":"2.0.0-beta.1","main":"dist/src/index.js","types":"dist/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm run docs && tsc","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"readme":"## todo\n\nShow a demo with 7 bots at once lol\nBig achilles is lambda, but lambda is fucked up anyway\n\nMake speedybot-mini with lots of branches?\n\n- v8\n- deno\n- Bun\n- express\n- webhook\n- starter\n\nHandlers cannot call other handlers\n\n- Extract into a function for shared/testable code\n\nthis has x\nx\ni want x\n\n- get it to compile to dist\n- link to a test project with a websocket thingy\n- [x] send text, have handlers for every & hi execute correctly\n- [x] Get dang text to show up on msg.text (attach it to RootTrigger sub-type w/ MessageDetails)\n- [x] Also implement chips in a non-dopey way\n      -- be able to write a test\n- lol we gotta trim for \"group\" room situations so they don't get botname << or fuck actually not lol bc of contains\n\n```\nAnything back'tick'd thats not code needs edit\n```\n\n## Speedybot-mini\n\n```\nBuilding on Speedybot and lessons from \"serverless\" (and containerless) Speedybot-hub\n\nSpeedybot-mini is designed to run in serverless (or even better) containerless enviromments\n```\n\n## Node Version\n\n```\nThis library relies on the native **[fetch implementation in Node 18](https://nodejs.org/en/blog/announcements/v18-release-announce/)** which is still an experimental feature\n\nSpeedybot-mini is focuses on serverless/containerless environnment\n\nIf you need an example of a normal server to do lame chat\n\n- speedybot-receive-webhook\n\nNode18 is coming to Lambda just not yet, https://github.com/aws/aws-lambda-base-images/issues/47#issuecomment-1272990313\n```\n\nAWS Lambda h\n","readmeFilename":"README.md","gitHead":"a2cd4a0b6a187bb46e7dec95b74565335c8f7b66","description":"Show a demo with 7 bots at once lol Big achilles is lambda, but lambda is fucked up anyway","_id":"speedybot-mini@2.0.0-beta.1","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pEbdU+K/foWLegNt0uCnek5sic10sg5hKOt6oxgimXwDL42pjr4Yy+oQ4t3LWogzSdWC0K6/gScSNhkZve0c9Q==","shasum":"24d74871aacd8a270562a61df41705604f9fb6ef","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.1.tgz","fileCount":31,"unpackedSize":253667,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+QFE6pO61DPBoK5xiHu3YcMDOKSgfiX9AIIUSXV+nlwIhAJylnyUKZWnBzEdwqkSTCZtS7C6u1JQXJ30yDeW7Od8x"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTtvEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoiBw/+Oz0w1GLKcIEdX+TO/DtmgInRH8yhzhHPk/EA9QnjlSKx3KhH\r\n2j8evGDN/S7JHYElS4EkVVRjRHgkI0zB20ENYncaz+2IaamI+Qgpn7waNWkg\r\ng2l1soagYs46wd8m3ygESnolQP+BgLJWEH8Y+NyNphSm7XvbYDbUtECZRBcB\r\n+XL8eatysDxD4eV/oKth4r0Yx+9NVM0YAy5bfbyd1hG8yN7Luq1zh8AwXTVJ\r\nX/KvVm5AXnYy9zgnPeeH82VmVB/apu3zh7oYyxTGJYKkXWWRqqPm1eMjGdjs\r\nL09NgaVUuNAapSK/Iy8sGux2aZiRTonS39EyYQsNttkaItfY/YUTEmWgCb0X\r\n1Bs2Dyg3l21tC3Q/Ye9NoQSSGyG0lzEPCo0Ogfx1/RsWXzN51OOowSIucG77\r\nucwblNaNuFoBcxGnnfEOr66t7J4YT2amAqfTtP9qis+aCIa9krMQDiA7lU8T\r\ntjWFrGGs5Yh/oSQ6L9qU/lWBX/p5SPZaId3qEiTefhAefW+ps7POpSk3vzTg\r\n1h/7SKaTTG6thexsLNG1/O3kGFOAMeC6orIRsu9zw+Zr5qsCm19KcM3twt2j\r\njb9Q7y1S3UaIapGAePzY55Cf+Ua2zijtrgIn3zEHh+n8tBuStr7NoQa1ryKg\r\nUWApdQRKviNLDvYi4yfjHsTHDv40v8+KNdQ=\r\n=2ZZ5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.1_1666112452187_0.13578804131957267"},"_hasShrinkwrap":false},"2.0.0-beta.2":{"name":"speedybot-mini","version":"2.0.0-beta.2","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm run docs && tsc","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"readme":"## todo\n\nShow a demo with 7 bots at once lol\nBig achilles is lambda, but lambda is fucked up anyway\n\nMake speedybot-mini with lots of branches?\n\n- v8\n- deno\n- Bun\n- express\n- webhook\n- starter\n\nHandlers cannot call other handlers\n\n- Extract into a function for shared/testable code\n\nthis has x\nx\ni want x\n\n- get it to compile to dist\n- link to a test project with a websocket thingy\n- [x] send text, have handlers for every & hi execute correctly\n- [x] Get dang text to show up on msg.text (attach it to RootTrigger sub-type w/ MessageDetails)\n- [x] Also implement chips in a non-dopey way\n      -- be able to write a test\n- lol we gotta trim for \"group\" room situations so they don't get botname << or fuck actually not lol bc of contains\n\n```\nAnything back'tick'd thats not code needs edit\n```\n\n## Speedybot-mini\n\n```\nBuilding on Speedybot and lessons from \"serverless\" (and containerless) Speedybot-hub\n\nSpeedybot-mini is designed to run in serverless (or even better) containerless enviromments\n```\n\n## Node Version\n\n```\nThis library relies on the native **[fetch implementation in Node 18](https://nodejs.org/en/blog/announcements/v18-release-announce/)** which is still an experimental feature\n\nSpeedybot-mini is focuses on serverless/containerless environnment\n\nIf you need an example of a normal server to do lame chat\n\n- speedybot-receive-webhook\n\nNode18 is coming to Lambda just not yet, https://github.com/aws/aws-lambda-base-images/issues/47#issuecomment-1272990313\n```\n\nAWS Lambda h\n","readmeFilename":"README.md","gitHead":"8c7eae266bd296ed4c3ac4c631ad8be9de2679d2","description":"Show a demo with 7 bots at once lol Big achilles is lambda, but lambda is fucked up anyway","_id":"speedybot-mini@2.0.0-beta.2","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Coh25fMAHMXSh3T62w8y8X6jkYWdrL9W3XDjZCACjER1iwuqt0CCzt2DfnpaRCXdbGvZbxrpEmQ4KLiFJvXHTg==","shasum":"f7f7a21bde445f1f8444c15f542296bd66bddd71","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.2.tgz","fileCount":31,"unpackedSize":253671,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGXNR4u22ef4b7NwWID/UopMjc0/RH7tGP/tbrIudWqwIhAMHHB/Vr/Q7OeyMrgiRKGyQTsDn2izaA9TQkd2k7I8kP"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTtzfACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoTlw//UVmi/6xlAQpKV7IPntxiIq8OI6WE2Y/gM0MwP5v3p8r/fcsM\r\nkNzcrcjIBXNRNvBb6NDxwtbjnorLe2I0XxLq27bNWno4WX0qJGbyJJdIFI8P\r\nRk/usuJmlT5fGIkKzUDERvYa81nJN/xXbE1baLqaJmK9ZlQuSLFKb5o+tAc+\r\nE1bftJWz/MxH3yW1/2anlnsqYJ8uQ3IesKeDxHkvVOTBeLy0M9uEc4KLWULc\r\nC4Q4rldsjtYiyd7ZacRS4BHo8sKU8nwKy6NKDvX39hv0Ka5KB64AmXYv1hHD\r\naIOmzQXacHy3xTbc6jG8MqQNlUIqPf7OVwG/BbquHIR4byXaN4k4UfTbozm0\r\nxnMGDSQOSzJKHBuBjLq8AOQrzyXH1W1g2W15Ehf0aXfCusk/v5yF9A3TxFph\r\nB+Kv7knkbyjZcmzH4yxWEKIzN4LywkSbMgFJqhyXjz23QoAUKWQfjTMXjHXs\r\n1kNgCNoyFkfsrdoPbBhxnD0mLJudd9tnNDwljriVIr0WpRM03x5q6xx7FVBO\r\nwa5MxvrPm0dmGBjvwYdUVx3oG7eieikM46prhCRYkHJJeMOrS59iIhBD9yxO\r\nSPzxM+o7tgcjUQxZc9r9V8vxSfMqk5ZDot8rzBGzjhI125YqPbCvqqj6ZK6r\r\nve7ICMPE+vPa+zH73tqqppFKKy3RDzhfIIo=\r\n=+rzY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.2_1666112734796_0.8159321656851082"},"_hasShrinkwrap":false},"2.0.0-beta.3":{"name":"speedybot-mini","version":"2.0.0-beta.3","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm run docs && tsc","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"readme":"## todo\n\nShow a demo with 7 bots at once lol\nBig achilles is lambda, but lambda is fucked up anyway\n\nMake speedybot-mini with lots of branches?\n\n- v8\n- deno\n- Bun\n- express\n- webhook\n- starter\n\nHandlers cannot call other handlers\n\n- Extract into a function for shared/testable code\n\nthis has x\nx\ni want x\n\n- get it to compile to dist\n- link to a test project with a websocket thingy\n- [x] send text, have handlers for every & hi execute correctly\n- [x] Get dang text to show up on msg.text (attach it to RootTrigger sub-type w/ MessageDetails)\n- [x] Also implement chips in a non-dopey way\n      -- be able to write a test\n- lol we gotta trim for \"group\" room situations so they don't get botname << or fuck actually not lol bc of contains\n\n```\nAnything back'tick'd thats not code needs edit\n```\n\n## Speedybot-mini\n\n```\nBuilding on Speedybot and lessons from \"serverless\" (and containerless) Speedybot-hub\n\nSpeedybot-mini is designed to run in serverless (or even better) containerless enviromments\n```\n\n## Node Version\n\n```\nThis library relies on the native **[fetch implementation in Node 18](https://nodejs.org/en/blog/announcements/v18-release-announce/)** which is still an experimental feature\n\nSpeedybot-mini is focuses on serverless/containerless environnment\n\nIf you need an example of a normal server to do lame chat\n\n- speedybot-receive-webhook\n\nNode18 is coming to Lambda just not yet, https://github.com/aws/aws-lambda-base-images/issues/47#issuecomment-1272990313\n```\n\nAWS Lambda h\n","readmeFilename":"README.md","gitHead":"3fb261ea31a7150ab80042f6bf28ce0eb9e584e2","description":"Show a demo with 7 bots at once lol Big achilles is lambda, but lambda is fucked up anyway","_id":"speedybot-mini@2.0.0-beta.3","_nodeVersion":"18.10.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ScKqJQCu+9K9xlTtST3+WNC8ohQ7wIAUzKaEEc1t9k+1twT8H1ffCq5BQ0brWju5Sgmhm6f5IGvNtfJRVYD6yQ==","shasum":"6fc7e8bf2ba654fe945331871d04f2e6749ea1df","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.3.tgz","fileCount":31,"unpackedSize":253717,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB/iYlVkWn/ZewJ+WX1dtvbfaZVPw1NqLlNE3qWo+T2PAiEA8YAjjkJ6nOWkUm2Ob9kVETkXAsMRZR2HSRJ3ZVkSykE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTuOMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp1jw/9FtrqWSbPZuBmE4PU/ok9VuZTgwoboyk3wzxclNHgUlqSbhKY\r\nrtkISHaD18VyMaGVjPjOlUcjyYu9FfNYmI/T3/BCWoFpKw2w3cXObAbkwvPd\r\norBEKPExS66UfQ0YGruJintb2tTLwHYxtrTnwCtS1EQIOyEbvzLw0MEKgGTT\r\ndw4P86ELpQCUm0YbneW2HC3+bzwFqUun1bix8Vv10+EnhYVKameX2y0U8LR0\r\njk7bQ701d/p8aj7OGgpVDcCcKkLMmdJ7b/+MgYukjkHkO8WwHEa8MBzTCEEh\r\nd5K8qdYDOMwL33D31FJ2+PaRE8Fp+j3jeRN8+reuaxia5+T4b8kgXKo4BFGE\r\ndXWu3epDJXJXotGH0bPMj0CbCW0YBHYlZHkUUnyoY22+YFemdQ3A9B2GGox7\r\nROjvSc1DlD+Gunv9qy+3+qSrdec87t7Y7lfDd5crDkiO2enUwilkygirIQaL\r\n7NdDg22uho56p8DwYannqRZU0E+kDxWhdfAv3Dr8bHsru6mm/O0ELqq5nEFh\r\nhr2j7C/A125kOTpUauYAp5eEkF2XXiVCRBM8frCvcvL2fR6ZQobEmqsauZOQ\r\nhho2BET2Ubwh+nyi1UwsjpkhXqJG9FpHIMOvR7DsSZlA+pxWhSUTi0tPMfRJ\r\nDzDCan5Fapq0vsRh42FguDQFA8qVJJtMIEg=\r\n=NMhg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.3_1666114443968_0.38684779261244695"},"_hasShrinkwrap":false},"2.0.0-beta.4":{"name":"speedybot-mini","version":"2.0.0-beta.4","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm run docs && tsc","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"readme":"## todo\n\nShow a demo with 7 bots at once lol\nBig achilles is lambda, but lambda is fucked up anyway\n\nMake speedybot-mini with lots of branches?\n\n- v8\n- deno\n- Bun\n- express\n- webhook\n- starter\n\nHandlers cannot call other handlers\n\n- Extract into a function for shared/testable code\n\nthis has x\nx\ni want x\n\n- get it to compile to dist\n- link to a test project with a websocket thingy\n- [x] send text, have handlers for every & hi execute correctly\n- [x] Get dang text to show up on msg.text (attach it to RootTrigger sub-type w/ MessageDetails)\n- [x] Also implement chips in a non-dopey way\n      -- be able to write a test\n- lol we gotta trim for \"group\" room situations so they don't get botname << or fuck actually not lol bc of contains\n\n```\nAnything back'tick'd thats not code needs edit\n```\n\n## Speedybot-mini\n\n```\nBuilding on Speedybot and lessons from \"serverless\" (and containerless) Speedybot-hub\n\nSpeedybot-mini is designed to run in serverless (or even better) containerless enviromments\n```\n\n## Node Version\n\n```\nThis library relies on the native **[fetch implementation in Node 18](https://nodejs.org/en/blog/announcements/v18-release-announce/)** which is still an experimental feature\n\nSpeedybot-mini is focuses on serverless/containerless environnment\n\nIf you need an example of a normal server to do lame chat\n\n- speedybot-receive-webhook\n\nNode18 is coming to Lambda just not yet, https://github.com/aws/aws-lambda-base-images/issues/47#issuecomment-1272990313\n```\n\nAWS Lambda h\n","readmeFilename":"README.md","gitHead":"a6c7934fb3f89ed014c4560fa4ba38418b04684f","description":"Show a demo with 7 bots at once lol Big achilles is lambda, but lambda is fucked up anyway","_id":"speedybot-mini@2.0.0-beta.4","_nodeVersion":"18.10.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-4bLdH2yKMfBxMbVBeu0+BMj3QG/W8q8ZVjC8GQ4mdLaE8ONoD2ZDv8DukNosH+slBdXMCNSOSzqePAeQmS2+jQ==","shasum":"c76c4ea018e5953a0f54e81ad1045f66abe4aecf","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.4.tgz","fileCount":31,"unpackedSize":254322,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKwDl4nrCFL/jzWpoPm9iUdIZJ8mG0l7bgfzOxg2Y4OgIgBEh7w8qsUw9QCpLxVxPA2ajvmo5fUeoa8eAYfDDZsV8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTuQbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpqIw//UUfkTIAAaChJNZP8kdzWqohwiW5uXjRik8EbqeLI3ggvhn2e\r\nexIldS93jBozbrNyGPLYCVcySj0kBUHoI+lsguO7GSFGdVDrDSJGLtgWPGAd\r\nQ5ZNwVdbW7t5bvC/GMyX+r4s3DJGbi9qiUXo8XZXXA4KRBsJ6AKpWQwV7nDU\r\nGd7n0jXBb5Z6nr71X+XqSFGBBM6YvM6xggFmsyecsK2P0rXortHd94k828Rk\r\nZ0NUk79hdanh4fiRhptaNRR2Ek0MMbeI+btDTH1Dqs1XWJTdPSFvUSqD+eyh\r\nSf4H9/x6Rzjl1HKI8sLjTHfu6QbzrswhFTVQ4VI+TS1jcdnaGZtWlltwAEsT\r\nNxEBT9D+il2mE2mtRU6Oo1xFcV5gLkWApa67OoMTye0g4XwVHAlDHNoSg4aX\r\nHcXqoXrjRplLpRG3Tpf4q6/qHtWgyosPYcrWs4s4n4a26K0bxybUwY3JMlMv\r\nA8YL56ks2B1vTFrHPyekkLw5PH39vacMdGLuBsr+Mst8GWKClUJ8XO/HqXwD\r\n/uVUW6hGdgLDh7hCXJ3DyMONenjN7L0azaIjzCB6E5htIoKVs4AuZ42QrCpu\r\nmCR1u9BlxOgZGKkQPz+eqFrguy556Pqbdv+t49iaLOZ01IRJczkt+johgVHc\r\nLRfxmyrrWALNdxM91IWE+3ATLsbmT3ShXgI=\r\n=dWow\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.4_1666114586903_0.04933624184382657"},"_hasShrinkwrap":false},"2.0.0-beta.6":{"name":"speedybot-mini","version":"2.0.0-beta.6","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm run docs && tsc","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n\ntl:dr; serverless chat that actually works\n```\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](./docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](./docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"40e3483c20d3a92f1c9de25dff1fe05aa24920ce","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini","_id":"speedybot-mini@2.0.0-beta.6","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-68Jjxal0Dme4J7LEJwYgLCe3oDEXn+StFDXPRtKlYNn92xJBrq+KjlpD5vFJGCGE8aOKVYlqmXOu56prIGUzfg==","shasum":"445fa7126310669f4726aa26910062b51a54bead","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.6.tgz","fileCount":31,"unpackedSize":259113,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWeYzAhaJoQ5KcNp2OQ03IriHsFxM/9LKNCcmgZiICnAIhALAX3Nqp2YyDD1Qbtsx+CWRJWbGqU8sx2JND/LpBRblD"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjT+kmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGqA//aFJobRF79RGe0pGmTtlPmBAyTyUxXxsfC8Sh8VUum4Tyvn2J\r\ncEr5Kj71kZuRHm3L6HyIE93Ryou3NMrRFGFJHeLEPxixlNX0cSVW/vK8wVX1\r\nrKVxaQziGyh9r8basAytqm3Z6/vakAVI4SlqIbsUaZEsKVVgr/+XPsBr8zqC\r\ny5kqoPrzwcypco8OVuWH61j9mYSXwxgGD8WSffqBg/LLrqa62tDxHlQhTRtU\r\ngJijZN+HqeRG3e4Vi/CM2yuSQrD4p5vUQJ9v1+ln3mwwI63Lum47fVeC5axM\r\nfN8zQAPIqI+8FFl9BsA2ijZrSBZvSGRX6h5ho/QnLyYIf2tZUVAz41EoU19P\r\nflHVESsaCLadpQrNPN7YsKFb2C9ojbu2oKIaoLkLo1sje8qzQ7bAejGNPGeV\r\nUT2/byN/q0mJksrUNhMkp2SdHORz0o1sC1v/HkAI0NXhjiEyYBVeRFAFK3AS\r\n8AWRdaBB8CobGLvHmT+jF1bCvj7HfT6pjBXbtF4Y56rPwieNRqZ3xx5YEJoH\r\nXJoeyqDZP6IpmVd01orTEa6wpbpCejZMakjk35qPWWzhfcR7+8fChh2O31t3\r\ncwRQ8ukv6AmULe3OgiFsq3bL88xD+pfvyjQGAI0pUNj49HXdnDDa3Q8Doyg1\r\nTqeHqObUda2fJTqGl6qEksZE+a3AoPw9+CE=\r\n=ZqqG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.6_1666181414767_0.024088127919302815"},"_hasShrinkwrap":false},"2.0.0":{"name":"speedybot-mini","version":"2.0.0","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"gitHead":"c9611f3a008aeba2d9d27a9ab4ba15b5ce8185bf","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","_id":"speedybot-mini@2.0.0","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-OUJAzWfJhz7IPgBRLViTWCJaO7wB059S027ptAjHD+KvMMkpLKHbt6+ptcwjxkafN0KCBWFCV+wWpWruzw6cGA==","shasum":"0af5f5242440267e5137edfaf9600975a6ee84c8","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0.tgz","fileCount":31,"unpackedSize":259231,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpgFub5Ksj+PO6Rk8dKD+P037xAPHcmVM5T1FLHJkJywIhAKSq4devhnMY1YjXh1Cihxd9zLAhLQZBlawZauSmi0RV"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjT/tRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqa8A//ZNCptz/8s9+PIE2HYIt+5PgfG6wxUtg2oLpHXp5njzQQlHIt\r\nqEiobWKCnZjmTXA0pwP2O9r9j7imT2z4+oLdwE5Cwu/GmDhKuvKEBpPslDuJ\r\nAz+b6TCW6424AdghHlViTsHyD9+SYvJ0g7fy0Z8SZNoIf85jGcVGl9R1LWYK\r\nSqJuEge5xFmxS4MWSQU7yC9DEz9W/74HT+kYgQJeV92YjLySzOzy/LVhSk4t\r\n8AkHw9SQxVyKIG9UC5etZ+369roP7fWMAeyjEEoj/C8TNEkWWVMjRbXDRsEx\r\n0AKxa/Z1bFsAomwhkLuWIUlV1MIrYtNUgtn84P0Lskxl1MwMozMWWR1KOEue\r\n3jUVzhdMlF3sQXjv3FWKrUIJuz0Vl/KP+mpoEw3QR70RjDVJ0vmsD3QfqtVB\r\nbZX26gnHUOe2OSTFHNiegmz7hkWowC5FKpXIvO4L8Hl7ilvYdne6Pbi5CcZY\r\nyeRrJENYAqm+R/pDJtI/6KgxcRXFT0UTGuhTky1cr7doilnI8+4M8IEQSwXa\r\n/QNLQzfA1xuSoClOBoZK3pnmRC4rIquGF4J0+4B3sQFRmbzDB4/1AigBs2Yo\r\n3SvQrF6XFqpICUFCdPJKLyJWozZ1GhPlNPTelPyXLqOuryfzhOakKpG12r8q\r\nHLA1tCDi7Ydw+sx/hD2GRTtgofq7/iEVnlE=\r\n=th/O\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0_1666186065455_0.054148891653474474"},"_hasShrinkwrap":false},"2.0.0-beta.7":{"name":"speedybot-mini","version":"2.0.0-beta.7","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . && git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"4429d9dcc76dd3ac7d7065bc1cf48cd841b9b86a","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","_id":"speedybot-mini@2.0.0-beta.7","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-EWf1nRTuKtjRVhptuwomOQngrsuc0AgP1SXMT4EIG0BrAn/YwtgIYsZ5s37x4/2pddPhavDX1cXy3UkxJmPNfw==","shasum":"74079f0e009b85c80c28d6fa6dd7cb53ba93add5","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.7.tgz","fileCount":31,"unpackedSize":259238,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxX2Wxspsoh2Y2KN4SFJRhl0cp6FNLahXMpw5yNEBHngIgSzZ9Q6D6ybWV9+DvTjb0exjsp3QttiotQlxQgaR/D00="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjU2W9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+SA//aEZAasOIcKYZzZiYbabsruRWO9W70Xdtir6W/AYeinKnd1t6\r\n8Rl/7ps7fhLMieeAs8m8M6akdhCXwLRW/mwo1gtar2Y/ISMXbMqo8KWNF2bs\r\nDKphCuM1CyVIk+cmNCOeS6/VBpvgoQRAhsYDokC4XWnMQVeyD/Fk7YwDkIsl\r\nwmxGx+LFvm61v1JIqxU489jix3CXIIpp3JY3ExNJzhA1DJhtdtYGEVxeWQqw\r\nfkGT/oI+e3oGYHMypdM0VneEy7977a4vM9KSAkoz27vRhP+gHIhnuzP1k5L1\r\nubwn27S436/AKLBKous9X9k8sesKqGWasvV2Q6NjomYw0UH3kbdhxGQS/ey+\r\nonmbKnc9qp2QMPuJlz7oA37dFvVNmDUglbYnfMJyohDdNAxdTsXQHhsoK+oi\r\n2zGqGcvAXkR1V7BI4yi2oCvh6bwIhXCRAWywENn8QrQopJ7xJTrNMG+mLtUE\r\nYJJnWd54jE7a4yq7rXULUznpN/nmrJcNE+2y+jXEStMNcjaEZnK9hUzTOvZW\r\n545Ww/3xs/5mvij8bLR3ZtVNti9jpUegHreJnrle2BvtoFnsX5LwfRHZgU2t\r\nijuOSTKnRbhc31WPOa44rEQO13zbBheXeRosIYhVJv83JRG64VO+qRo7d1yh\r\nmmZSW5ob6P5pqX5zk2L5HpPYylHFM5Yy+hQ=\r\n=kOWn\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.7_1666409917422_0.871219469903469"},"_hasShrinkwrap":false},"2.0.0-beta.9":{"name":"speedybot-mini","version":"2.0.0-beta.9","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","@types/node-fetch":"^2.6.2","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","dependencies":{"node-fetch":"^3.2.10"},"readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"7a24b17f060d1e3cce24e55d95df728634e8fdd6","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.9","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-7RrXSuSWiviN5NJfwrPo2r5mR/xxNv+PTVZWBSS5+WlzQ9L5RdIiAGOlHPCRnUggSrfO/OQAbID8Zy51uYQ0oQ==","shasum":"c5f2e86c006c4c193fd15f6d27b2762e9846712b","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.9.tgz","fileCount":32,"unpackedSize":260658,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVdompTF5RRCFtfPgMCDqRVowPuS7/wCau/wx5ZNvq5gIhAKwN398EHhabhpFXK5ZzEvcH4F2s7uRgWjCiI+Z6+kZp"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVu23ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrkkA/9E7LACAV8BiHlKTTA3+9dDwQYySl5Fi65tkIz8n0/ENw8VMYa\r\nWtmgAJfbGosw4HYwC/k44dk4KC5D9ES93/dDHd/JR+dLlFkCYQNHGJ3GRKXr\r\nd4HR4ml0Ujiv9BGpAUU1+oBkpXGMXj/uIl119FtF66Yj1zwPvgUhBIT1U9jZ\r\nVuWQSWwbe1fUT7IaAL71dBd0HwvUhNacXFV3ZGn+Or9GPcglpyKu19VZ+syu\r\nTYgzEo/Jg1tfc+vzhgDN3DQSZ4q6Vm8oSstbxQ3Hs+Bcp42uV+rKxppBrQeU\r\nC/BzI28BuW6TmCqI4IBb4pb1EeBki3bKV6eqjnVbJ+JZOxo4v5+rIiqjqW0w\r\nYw5mkjSDUbRyNSWQfhEZUY+44uaISVou4who9+lAlbD81iaankS4ixDxyaQ3\r\nYqU/2fJuaAp/zRS5tPM0brbitPHVRLv1VnIrJM0T+Ug3VvFpQpahATFZ8WBB\r\nKFC/7GT6KNpe4llyVUkC89yB6OSmgAOxKniLPWX4RnxrBA5e17OArxlNYE9r\r\n8XOWcCnEjliJrZkjmwAioy2oAzBiPjtX3drRCDEHZQ8W+qnsYQnovA6LQvH6\r\nSu3kb1UJJjW2H2ZEWfNMa+PeWWmVclwXkRlHQWWAs7IhKPgxyqTOfU2YjP/n\r\nQiE/QfdNLzCElIyXJZ5O3FoY2dK6sMY7u8E=\r\n=Dn/H\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.9_1666641334821_0.17056767048635657"},"_hasShrinkwrap":false},"2.0.0-beta.10":{"name":"speedybot-mini","version":"2.0.0-beta.10","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","@types/node-fetch":"^2.6.2","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","dependencies":{"isomorphic-fetch":"^3.0.0"},"readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"e288184ff4072f8af41cc962075b9be37e3497fb","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.10","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-IZfOQgZrt3GRBh5TdIPh0iNtUZMjJXgL1eePhOXvBjLgt9pL98quohmBnxpvhqwxe73MSO7VyouObuzb3qnyRg==","shasum":"86d128d818cadeed17dfe9ea6c4f9f4cf0136ea6","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.10.tgz","fileCount":32,"unpackedSize":260664,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAPSGztkRRV54+NyVUP+Pai2Iu6nrmb84Qag78tx7zz7AiB2RSgFY7ocep4gUGMjzruFABoGaDGerJi9R37VyRXrwg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVvHCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoOPQ/9FkmGNL3Pkbyw89EInkeDrzF0Nt00VgFx0aNVeWhUH8CEmkBE\r\nnHZv6PItwh37oJIZ4OU5VyTHBiJExM/mOXJdfzuRoeUbPUKBGfDCD0FlU1wW\r\ndpP319gpYFzOYLqOt6COcVxxYDuvx5fHt2CtopiFge/UsLA1YENNXBA+4KIz\r\n/AaXUSaE+KtNxIB6A2aQ09iMnWse2er2mwG0VqheKJLtjLDmgBevWE8Ezpx3\r\nLI98Ih0/ZfZCYzav4wXhsw7Yg0GhNx+6jY63o4H+tIDP8BXCSQG1t3Y3NYlC\r\nv1QqtqBUTb2asN2DC/theb8iKDvvxkh0iIVEo0Db4R3UK3cVmewI3BHvpdit\r\n+qN4SGAk296nr67tGIfe8CU7YMymOjc9Bdw0HKSZ/YZYhhokfccYZW4xkmiy\r\nv33wI0atcVN62g4GQzYBu5HQ7WZqP5N9WDlBnE+PxYMkSq3MolQ/qPE+mBen\r\nfC3oFRFAYGDs41SB4+gtrlLzZZGzqKXn2mI9RbczfzZnzX+OqFxoopEECZZK\r\nKNjOWV6OMjn5DIfs7Pjjm0jorCZuAtwtt4z4bK5jEfF7z6Qdeayp4u7Ah8ZY\r\n1lBqPCXqQ7Hazy5eEpRhEjLX3mL/TUgUVFI6Zssysl5qmlrUnoGSzAMvJByu\r\nvIGzbLZKl1ZwRu7E+kxfPKwhXhPm4I4oljc=\r\n=/dj0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.10_1666642370274_0.7639781058445654"},"_hasShrinkwrap":false},"2.0.0-beta.11":{"name":"speedybot-mini","version":"2.0.0-beta.11","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","@types/node-fetch":"^2.6.2","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","dependencies":{"cross-fetch":"^3.1.5"},"readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"b13a03c9dcdabecf2f840a2c6f3a75ed1ec35f9c","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.11","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-2cEYTvnK+y0eJHCJ/jbTvCAtbK2ftxvO0zTBbj7p5qr1Bh79Xchtuv6kZNzSQrNeVpCPXn6AlvMdEeApEI5v8Q==","shasum":"557b347fd049604c14dccc130786d53bc943a596","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.11.tgz","fileCount":32,"unpackedSize":260659,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2YNWKdxlsBwMqmr6rCatWj4ySj0te3fNwECnsjsk0sQIgcEpFYBITnPDKZqgh0bfd/R5q/z3JpfOeXyf7gY84CNk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVxa7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpalg//d8AlCbzReBoOp8AhmmHMUJo9WNp2Hs3AgaJquENEVMgtFdua\r\nzKk1pZK+nW9koJXEF7VoI9XHpcrjYuuk8hSVZmy4UpTJL1M8pmVZfBrzPJrF\r\nU2IQdq1JI+G3JtPebJzuGFpYF3S+uIJ70B+rXf+s2A9nadCLAdsTM+bz2lkx\r\nO/x1PLNr7y9LehornsjkhvZE430oD7C//sX+PjthfKf9OxVKWF+Rwywd/yNp\r\nmmVdCzRHLyjjH2DN9fMl/tpWH4m5beeG+GT3Grq1+1UAzjQ8fEm4nrbVDc2w\r\n+Q37IYt3MnNVFO9tCY+VdDaruWRdXJLZ1AQd9DN9C9QDY8KbOVK6bnn1Pjn0\r\nVitSiaIYGCzKntPl2tANlVkJfBg6OJWdOlbdnW1tknKs8Vex1e4IJf4Idyh5\r\nSVam50RjFeI13Fm8sEMAaXpbnLNPDY6wEpmjrF4uRu14pOHn1va9GVBLviki\r\nNwD1L7dy/HDgJembOnnaVzvVVb2umfsizi3csbhM7uEE/fiTirMXidK0bbIx\r\nL/DMtYguGhgSH3WU0xqUmdnV5AkEwqdsZ/oHLzjpHR81CSqXBrper7Y6h3BP\r\n2+9RQq5oSoB6nZQUNSxLxwUFXhZg0o9/7U+ZDIn2iDLLxGNzVd8hSntktMw2\r\nlF6+RCqWAdtgfaVcJv8QRwT3+N4enFDfWNA=\r\n=lJYK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.11_1666651835376_0.6644438915004105"},"_hasShrinkwrap":false},"2.0.0-beta.12":{"name":"speedybot-mini","version":"2.0.0-beta.12","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","@types/node-fetch":"^2.6.2","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","dependencies":{"cross-fetch":"^3.1.5","isomorphic-fetch":"^3.0.0"},"readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"f88b1ffce35cdf6c36140c3b25678ee6f67c8140","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.12","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-dWiTOYHsY3bh0M2laMegABbldkE/f1Gmc524q7Xg8R1XL8pAFOFiKCSASmniAmdGtNL49ioqoK/VCEVu/4IVzw==","shasum":"9732adf81bb57e86134f08daf72158d5b44bd9ee","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.12.tgz","fileCount":32,"unpackedSize":260693,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHaYqS4ZFm/vJ4SnFr3gycxQ9NWQz8Z8UYzpjX5jLYSJAiBoiOZjBdpOhrzCdFxZtgYybQ1ZsaDbRNG/Y08iN1dB1g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjV/rrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrxzQ/6AtEsxNAUdBdT5JUDBumDI4Ppm5vqXd0L5yFNK2ARjXZQuLQ2\r\nILx6KY70Ac28qMwzi9T/i5FvgVvdyBGShtu7efUZCJ+iW5VmFBe+qCTULuZD\r\nD+yjLS/4n1LP74HVpYHKmc67xmbxvxHEQYSHD+PtWzebBIP73JW7Y6Py1h3n\r\ntbAh4pgFwu8tFe+VN8Mtup+j933DyumXGdgL74M4yG0lBX0Wr03Y4K9wvA5i\r\nM2K+a4DO4SZp7YH/8wylRkYe7a6aqBlGwHIiD5nOlg5kvM7nWqZoirsZE8Rl\r\neLKLhLVGyR4leEWyv1jFXZnJZL+UqLvGtdMPmCZSL2TVRR1NH29a7YxORm5B\r\n0YkXAK8dgmxUgOYP9GkrhCgmc03ir9cejV7BoliH04VVsjG4DCxHV9GkmhMj\r\n6SatXu/oLvbH7TNTuhfJ06IW0yOy0vkBHjTFRxJjQ7O2uTI6AXjz05KJuKhw\r\nqV9pAgL20RIy0Jh3SBJIYvFKSgFU8MWF25aNO72CtCgs3KlMTjGZBm9o0usD\r\nelscvN08RtwnU3IAgZL9p1ltBkAIz4Zep8m/WZEIbQyhDjniqQj2jR22tDAY\r\nj3ySmP9bUdZJFnFE3uPO2A4TOU9Rju630+pgtgcRbm28JGSCjnnxV0wG8Tg4\r\nzzlcByKsjL4bOACvrQnuwiC8iGVjZV7Z6SU=\r\n=tC6c\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.12_1666710250810_0.7260618256973681"},"_hasShrinkwrap":false},"2.0.0-beta.13":{"name":"speedybot-mini","version":"2.0.0-beta.13","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","@types/node-fetch":"^2.6.2","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","dependencies":{"cross-fetch":"^3.1.5","isomorphic-fetch":"^3.0.0","node-fetch":"^3.2.10"},"readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"2cf0551a882a04913e587b14cd59810f744df7eb","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.13","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-Gq3fQvINSRHgPSlObS9EwZOuY9gjkKMzyYGoWiATVf47yOMvrQxzEW8kkUmOKtoT16lD9XBecpJBciN09Qr6aA==","shasum":"85d79a63da23b4b80a4c188885d0c16bcf28aaa8","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.13.tgz","fileCount":32,"unpackedSize":260722,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGN5OwzfwL7M4kFahROCsTwQCPq2S+26Hrb7KC9fWyDHAiEAgK9DnLysZlHPbGOjAPBkb1DZhp3V+KAO9L/VqvosFyw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjV/uqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpbhQ//ZdB8/0LNzNRdX1Qth/sERhj95fxKSXftVrXaGOfre3ycRznC\r\nBsNmFyzMe2nL/bXazxW+pXImZVYRWJqloXd8PotvFdGi+dK0KbBHbfXtjFFv\r\nFVatvtNj9mxvZwhXgBD3Q4B9JL2qW/6aIjtTbdAzY7/OVGNZmg2aew9pQEkw\r\n6n+rsv6TtsCt2lCEGlqALLsFgoyKYCwH4/WoD179Ut+MBt4Oi3I74SzbW1mj\r\nbWRxTG56R6SFS9yD9Q1p7UQmz0wyKTwz/GRzRlxvabvUqj8TEoOzSDIK4yFR\r\naQRwpR2Wyzyn9oz6G+UEPsR0R9jdwv4hSMEEulddh8jqNZ9wWwDLufVIy7gF\r\nYq+i8CKueTSfXFRO12nnXCtfSDy9hgbakShgIduW0HafwKuAC11ykUMxfvd+\r\nRK71TeJuhfeDWJe5sFihpNFEZzuUki/UL0GR+i4QYLFzn7Clb6nDmqyoeBP0\r\nGwFDXWbk1dnHTPckGyUmF6/9vUoM8tHgP1Aj0PdrrGMlwdwMierq2L1tApT0\r\nJvea9F777AQaAyvvL/0bWJZPDpsG4Sdpg+mAo8ZovTZMe+9hFeKjbn35M/Q3\r\n/q7ctBh7DtL8cAZTnDK8AeHgdk0JfV84XIGTgTnFwI+LhNoq6fDaNXSJgb0/\r\nQe6PjJNvHujdes+1BM8G7yJu47yGpZbvexk=\r\n=KT6A\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.13_1666710442763_0.8334363707917631"},"_hasShrinkwrap":false},"2.0.0-beta.15":{"name":"speedybot-mini","version":"2.0.0-beta.15","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"ef6464aa4150a5b78cae8884d4eccf09d7d02a47","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.15","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-G7mypCRk7VKyFJAAKz82T5p+EdA49CmXVJ+DxFRexYSyCGygCzIwDwGVaLVM7E9lIeJLHm2eFJXy7OgDWcv1sg==","shasum":"f71512ad520c7e55d32724a76e84e66a16fecd89","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.15.tgz","fileCount":32,"unpackedSize":260571,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFIHmjCWGm7yvEivac7fX+CzV15doNUH6VMqTB3F+jclAiEA2cvG+eZYBufd/aeNgu3A0y72nPMoswIT8zI+vyaVJhs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjWLEEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCsQ//SJS65xM8rrTMEKUk/LNeYcRXYaGI6gYLCarYB4M0Py1YbqV4\r\nBNlFn/ShgouFzS0VNVnKP3tHmCA73C2WuhGIc/XXqVB2LsoUCEsauIPn0YcX\r\nSZuprwnGkgSCqwfZ4JSpVp07FImS/O1sjcSm4YFC5tkRP9rGLtiBpzSsRp9z\r\nmhRu/rcVUAyJeKojEOH7EZ5e1Px/qaEgt94PuEXZ2zD2WuchzqemGgE5eA6R\r\nC++9s8Sc+c11wu/lq3/wU22oe0kaTcD5NCo8Oa2h8GvNtHEzfj+kW1hkj/xk\r\nDQI76GzbOlpMO+Rgaw5jvnDprSTk0VXgG+yu5pzYGi0lycuQud/O8pdBdWsV\r\n6DI97FD0y7AWnk9QmEVRmVJ5tDBi3oaIuzBoVZJDO8wyQ7sj/WsStTeOdNxA\r\neHYVWsz+ki9Uu+DYp7CDBwfaBtQk+REgI1H8/zIQop2PnJ4qXvP59lHMI0kY\r\nP8qtY6RizdM77RJQR/UIP84l4mdibYLmI2jl4mhce0AQBTzJCZHYKmJhd1m7\r\nnd2N+ovX65Tg0yhHjDJvOConAtY+S7OEW1TRit5t0u0slqiE8yJik/qGNqNR\r\ne0YAyaif2jwl0Gcy0xBS/QY6Oykzd0duFnAFbSQ1JSH/p18MFu4huzmy9HiW\r\nRYqe/jrSm8LpzQsfCItdKFsLN1awyGQL+EA=\r\n=P1Wz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.15_1666756868184_0.3627872632566398"},"_hasShrinkwrap":false},"2.0.0-beta.16":{"name":"speedybot-mini","version":"2.0.0-beta.16","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm run build && npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","gitHead":"d0f98651ba7e8538e0252df9a4e9706dae9c64cf","readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.16","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-kFD3nF5ylBTIkCvlE6CUc1wESh3zUK3z3sTf/GxA6yem7Z+s6bBWe+VZBr8U2zOVsbN5gM3GQY/J7OwPCz5Hag==","shasum":"5bcc9c2cf9bec7180946e6f8a436dae6c9a5e2b2","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.16.tgz","fileCount":32,"unpackedSize":261198,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnKpUIbI3Lndp77k9jnauADo9t7TLjVJwyGzpf98lLxAIgXFlrj2hFJdsOllfBOJK3lNnBlX2j9cwpwk6ZMOXB0jM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjWLQTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmokKhAAgZ0iXKjsMg1VALwJJd1uLtwfyo1g3UqWSqh8qdv+6wXNdzBn\r\nq+etBZSgVKuWnCZty/HTGiyjAigYHUpWSC7QAkKFtPeaZyx8Bcwmi0CC3JIi\r\nYVx7dbhTFcUrKe4wRXyKt6MbHKjyXVJl8ESy2pUaUga1oGQ7mtNrD1mpy4rs\r\nZw6tFvglOwbtpNl2V4X4BuvoS4lT3HlVDZPHMctAHRiH67cBLHcmfFQNuC2I\r\nIIK6zcgpKskv57nVBCkkNZWLCa9dX3j3gA36lPngLTm6bZZ0AQByzmE4g7UH\r\nZva0MBGMJFiAPYRkthqOEf2+/oCLKiMQkV2aghM56HUhPkPED56uy5VeE4NM\r\ndm14v19pp7ljTIgO0BM6ql+JMrWmQH23uziVMZy6MAqNccPAjwWwCWv5fZD8\r\n4Uu7BaYahRIEhbg6w1Hv/qWQ82J9GH5RiemgFvLFqzTKVlwPZqUt7WgjG5V7\r\nfYTthezlqwEKVS2Lx29N5Lpl7y+Ibv2PFRLBLANUdotj3qAAaShBltqEQ2fw\r\nGgX0LIUfEotnhugOcrvTgNqcFf7LWlJ00eipzNzPR0YZEAARna1RZPCcxU2R\r\n0EBW6sflSRcsrxrvx4lOtDESrIW2gU0kbersrYE0jewn2fdxYcYq2R5wSUUC\r\njtwRVkUuhAf9cVvjp9ntVXr4FeHLp+8aDxU=\r\n=zb71\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.16_1666757650913_0.15743167175112016"},"_hasShrinkwrap":false},"2.0.1":{"name":"speedybot-mini","version":"2.0.1","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm run build && npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","gitHead":"58596910b169b3a89eabdbf5d6acf9801b7edbe7","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.1","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-WM6EXS2bsH8wnYBW7onatWQ41ylUbPeOQQQ6U2kBInrw/INEgOBl1AmgPpFMwXrX3KQX116qNYQ+NMTo3jzBJQ==","shasum":"5228f026764047aca9bdcb7da64fadf9c258e6c6","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.1.tgz","fileCount":32,"unpackedSize":261190,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHJR//bebOCtKZQCvb/R+6lEjq4pDAatrJkHq8vC5LWPAiEAsOHHqGJmiFurGg7j1Fk7spRvBxwtGCF8X1GhQyzOZIU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjXUJOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp2Ng/+OypRp5sdmCpmQa9JQNtVUhhzJiG8LbcHFYOqroHfOL9jtNzg\r\nrOwL3buccHx1o1r5eC1cJV/JGeaddssIRtkZmqHVMcYElWSvBap5wHBZYJ5C\r\nksoUuG1Ab7vRYU32M+bHJiMjqWksa51d0PLhBZFnYWtc2MySCH0LR8kcFDnS\r\nN3yWouGEvLU7MOdm2CNSGsN6Ym/HW/7M8NbEYFrjyJLwS/4q/FoQb73QtnpG\r\nCIYuGAvlJyyrljuQG1oE8jxJ/3klNBa/YP14fNHZfeIIt/xWX0losgYHGUWw\r\nEmvu18M9W8pbPeNkZY0xt7t5jJ9I/nlbkm1EYp1LnmHPBWN+6DYE7t1zJl50\r\nxUP5JXkiZ4OxVGn/7G9A/gKa3i2DUjeuoF+cPVjaS3hCMe0uO73ZUohxHBFZ\r\nX18p5RXuU+yZGovrLUjW5eoB1/v2fevYbno5uUx0X+ZIkG8G5LvzYCbo/v5i\r\neul6C0uqmYGuhg8KzdTkAExVvBrg99GFYqyaaosUPjWobbBq4ZlTOGGH5H8o\r\nxDWFO3ZtNcdh0GY8llnOOS7y80vhSKuJPHg/az3nx231vH3xlaAoD1dS/nlF\r\n+c2PLNelhDgyzNmtM0K1fIexAHv16fSWItaGys25HUj09wdC1btwfVeoviah\r\n+JmUmeu0MH5JFW7l1GM6YP8wWhmWxs3xctg=\r\n=hwv9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.1_1667056206653_0.9731325732581739"},"_hasShrinkwrap":false},"2.0.1-beta.16":{"name":"speedybot-mini","version":"2.0.1-beta.16","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm run build && npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","readme":"# 🏖 `speedybot-mini` super-fast \"no-ops\" conversation design infrastructure\n\n```\n╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗\n╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║\n╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini\n```\n\n**serverless chat that actually works**\n\n📚 [API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)\n\nSpeedybot-mini is a portable chat engine that you can run almost anywhere\n\n## Quickstarts\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- **[Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**\n\n- **[Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**\n\n- **[Deploy to Traditional Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)**\n\n## Speedybot-mini\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Locale & i18n support\n- Optimized for **[V8 Isolates](https://developers.cloudflare.com/workers/learning/how-workers-works/)** for milisecond response times (🥶 no more cold start problems 🥶)\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end. In the future there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)**\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](./settings/config.ts)**\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch,\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs like file-upload, but for images\nCultureBot.onCamera(async ($bot, msg, fileData) => {\n  $bot.send(`{oncamera} '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n});\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}`);\n});\n```\n\n```ts\nimport Culturebot from \"./config.ts\";\n\n// use .processIncoming to handle incoming requests\nexport default {\n  async fetch(request: Request): Promise<Response> {\n    const json = await request.json();\n\n    // Do whatever checks/validation, processIncoming presumes it has good input\n    const isEnvelope = CultureBot.isEnvelope(json);\n    if (isEnvelope && request.method === \"POST\") {\n      await CultureBot.processIncoming(json as ENVELOPES);\n    }\n    return new Response(finale());\n  },\n};\n```\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/blob/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bpt\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n","readmeFilename":"README.md","gitHead":"35574c0bcde0d675f7912fce73e5183a40cbcf79","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.1-beta.16","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-TpxCjt+Lf25RU3oGhoy5nrg9AIxv6n8tRtWjBPPm83YYMdz36dWsDMZniUdwoHrq9Oy2jQXHWocA7GhcF62B1A==","shasum":"891f158689e70d00c847d67d47ccd1726de49509","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.1-beta.16.tgz","fileCount":32,"unpackedSize":261950,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEkDcB189L3zWpUBcU/jHZlR4kr2yKloigSxhUh4E2eCAiBQi1JkJFthdvnM5kchTqG5hh/1QL0BOGkyJozVPVVYzQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYksnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr23w//S9RLjujzg70vuihK7zBZzLkvFQwc5b2TfE2GmbfiG622dq59\r\n58cXzn/ZnWLvkY6KYs9CLrQtT7p27npupVIsx92wiXWaaf1A9ouxbYwQbrfT\r\nqGbWQRmVNdFB6evLle/PLgVA2MejmJ035nGLCKRwgbnr+WH3xrI4+nGUSuPL\r\nYmKend0ltiphxsqkeGnybqovguTRSHaU5jeFfqRAa7CGp0rkqn9b3VFtbhPo\r\n0O9nyE7oNj5ms+bTgAIMAo2uZT9D7Qvz/Pl3FGB4Fg1RWVVsebmm9gUsEQ3Z\r\nVMc/3Ocdje/NAozurasqJLkfaLQiMUxdc3Kc/07GOnSR4EmIMNCgcRRJbHlc\r\nKItrY0+QnHv8uBYZfkc37j73x0ro5D3ja/kwng/lBOaKgmASg8xeOdO1Pt6E\r\neTpE+pfo/Z1IH/JMB8/w2jPFOcw6fq0zq6i2IuLRobv0VjDGU5+uBmfSJfEs\r\nk1xhRHcOOi89eImCK0mfoNJctBKpo2XBQkLZKP7SAdBd6zsBNBRGm8MufMTT\r\n1ca6xUBeRaHxkAhmAR0p44EsxW1pJPHU5ErbfmMDtgarDkpCWuaEj0zJRQ3Z\r\netOOzS04qxJQeItw3VZ8Z7u66gsGaF7oEJYJX/I5PllruHb63GEhiJnX/7Ji\r\n4fj973F1ENeFqZYO7N1pPpbZlgyKGgy5Axg=\r\n=NZlZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.1-beta.16_1667386151561_0.037214195799621264"},"_hasShrinkwrap":false},"2.0.2":{"name":"speedybot-mini","version":"2.0.2","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm run build && npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","gitHead":"17088aac32c8d0771fddce0430b24ba2eb918a50","description":"``` ╔═╗ ╔═╗ ╔═╗ ╔═╗ ╔╦╗ ╦ ╦ ╔╗  ╔═╗ ╔╦╗ ╚═╗ ╠═╝ ║╣  ║╣   ║║ ╚╦╝ ╠╩╗ ║ ║  ║ ╚═╝ ╩   ╚═╝ ╚═╝ ═╩╝  ╩  ╚═╝ ╚═╝  ╩ mini ```","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.2","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-yl4GyJm0ZmMGTjq0mNaEDuegpAVPvr7G9Bl13wdf2P/13FC0wEshVfCNmqBYdNp9B4Y96Td9VvX2ZY5PUtrrqw==","shasum":"04b717f938c65f864652a0e28d458336e672f532","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.2.tgz","fileCount":32,"unpackedSize":262021,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCTNwWW3Uxdacj+q1HvFIeJOWzHVfEIEhgaUlCKivGm3QIhAO0C5Rv2+SgccX6aR0+szfyzd7wEo6WqjQDVY+ATesnN"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYk5gACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpTPg/9Fo18Z41eqLXZ8VRMeR+KAU3vAmxMEPMOK0w5imFG8vdEvOsj\r\njIOJESDk4JCgHOcVVYFvzT4gHwXjBNEic0bKwT8v5K9T5+s+vAczo2kiXfl9\r\nL5HbaK4WKt/genMDNgO//yh9osII8LHrZ/VBC6qasGm5Yu4hMwqGKVPHorcH\r\n2uopgMTAKy/q5bPtZBlHT0m1xltu7du1WozjIdBSB4Mddg5HMIh+UT5MM6Re\r\nJi5rOlgRtE8NcjNLyqrDOgMoJfDLWFskFqt2DPZn5v+wWpNPLcZlzic7UzLj\r\nfrgX0M5ln0OQnnq6Q+bPeU3m3ZbAEmQPDzYVjvyJYlfq23oI4tO7zlbXPbeq\r\nFypXiHbUhYm9866vWnWthTI/MsoCw4OMKfE+JAKQi+rGnCKXYNURQGgOyd2o\r\nX7dm8joCkVmLH3weeFjRoqb9Hbd2NEABl4aDI9N4RS9VrPwJckxJqWrWDBH0\r\nDfL1ooVXSR+yuDHvA5vSsCqIzIjZT5J4cs1IzyazAJicgeUF/HO9UCSRFygu\r\nMMkG/ZRKBGV5vWwiSx5VzFX/6OYQTyWZFIvAYtsFj/ifXt5qSiTGlVeo1UyX\r\n2hYZD+9wio0Bf0yZbmhT09a8wct+8ja7iE8TLJjHbhK/BlR49gMwgfHDgbDL\r\nfsoIrBdJPzKiH9jQ2TY+s25rkhZsPLbEfH8=\r\n=VCfM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.2_1667386976047_0.5389825812432456"},"_hasShrinkwrap":false},"2.0.3":{"name":"speedybot-mini","version":"2.0.3","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm run build && npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","gitHead":"6f69d97b379ff30dcd2b4f2ea639aee964b86bbe","description":"![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true)","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.3","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-eyfREYz6VPCh2tZbF4ti4F+qPqQ7u9N6z0Yj41nsiVln5aP/mXDRUBDqPApCZzi3skA2tzXC7bMwYGti8RLnOA==","shasum":"c96579c800ecfa6d76c92000395f1c63d902d6bb","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.3.tgz","fileCount":32,"unpackedSize":302057,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCL+16DHdWtxIXbH0wb5kFKSvM+J6mpXWAgTp8LtKPweQIgaI3SEr7DXvoeQotcUGHUjVY7OJfAbjPUVkyijvHlePU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcFnTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoUiQ//RNVAAUUUDskl1KjgPXlNFp/vCFKNqEK2WYBzJCCm4DCEZVOc\r\nERgkjIhoHqykQV65mJgWIvrxlskJb8UkWKwRHnuS6O4pLyf4W433CKOFKsD0\r\nm19ogjN81ILFZKWjypH8D+gA8R/2i3ndNxr4I++3//5Sn7wirxqosvsVAg81\r\nza6gdkCZhxcSHXLlg96+gwKlAkH/z1lXzJX/JickFcQ0I7i2I6iR4bvqdGCg\r\n2cX1Y1IFF6xBl87SIc+kZGQw5VlBPh8OdYSXtfQ+ft1C5OkUhEDajySiAY5i\r\nFbP8elKHld8nDNSsAL+NpbHvjNz8i4grKUV1bjJUQ6OXk8QnPBgErO9wSRK1\r\nrGotu6PGQ5b6x9uF9kcwIqIDZRDzsFRB2WoL4EEf8Ah9hr5B9FxXDBfdK/To\r\nwORWixMvhtndogKS/Z+yOAL02cwVyEgDbOW6hgKYwd/GmQbDDw37vKPcCdNf\r\nfSiGuzROAyxLZwp2Ct29zvjCmhoRsKWrE8iYtxsBLRNDdgZEEMxGXfa3w/FW\r\n7n8JQXZa7sFpxXM91IowSM0+q3OY6orIvH1sVLETAE8sZSVw3WTrM5F5se54\r\nwexZLSvbk1xIDCkTJSRJg+Z65j2Xu1iOk4L1OlNzcfkyoY/WOMt+TzaCFDij\r\nZI0XNunIADSoG+PREw3VqnWJFB544Xmz73k=\r\n=DVPm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.3_1668307410858_0.17827496653705888"},"_hasShrinkwrap":false},"2.0.4":{"name":"speedybot-mini","version":"2.0.4","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","publish:beta":"npm run build && npm publish --tag beta","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","test":"jest","dev":"tsnd --respawn --watch src/lib, src/lib/index"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","gitHead":"b910d334245ac8b47e28440cf2695f1c4693d05e","description":"![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true)","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.4","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-RyFhPWRm5Ht5IPN7z+4PhKPz+dBZj3Ft3eSqI25BwV7CnUoMtXxbbnthkp+dbsWNVVIz7M2q9uG/4DnaTeb3XQ==","shasum":"a16334dc58b12f4235472e6d0ff2e02a3866412e","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.4.tgz","fileCount":32,"unpackedSize":302109,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHKJ5KEnkK92a4YTOlhFo2OmfrKHbW0fS3RIo69sy4jgIhAMdOMZVxSH8QJR+cSqMrdWzuuqnB+2OYRl4cnr6fBk/R"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcFpPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrh6A//f2iYnqDI5nRGr/apjOBi8yV+sNppDWj0vJo9U8YaTKdRtDPg\r\nE8XvKpxq3LyuyISuLkr821iKOpLHREDMW9bbctJZzQCruD0/OqCHU5D6i8rs\r\nWrrWU02cA5E+9ayKKFERJ7n5c9CRaWEQRRF3ElRjT+XGPM5hqFEAHUQvSZnE\r\nbFWKKW36KOdjCF3va7UxE0sImSG+kDdNIS3r09ZOmkjGBAFriTuFxLuS2gQx\r\n6jQEG9WMe1OY+zyInZCSzXvgk5C0Ti51am6yaj9pjXTQMTPNwcxH1+GMZlQK\r\nj34tqZbo04w543fl0F55ZiNPa/Onq+TJi+8n2i5U/OTj9CCSJUn3lGXUu3lL\r\nnnbB5BR0lO8V7evIqizxiEY9q3DvWvDMf/J0D7YKC239wPNHUpApVZBGpWc8\r\nRrcF6JMajE4YJYafHaXOJWEdziOgixZ1VOIe2bT8V9I3iPUQvqrkcXKLYWwv\r\nvOqw9oHb1chgnI/zcmuWdTlKnH+paHSy3qvE8h1fqBO73TtvGD4elDXejyy0\r\nfols4mGhp0Jcx1TofZXU5HUJOZWQ+hU4iBdOVrXf3GAW6bJxZkxYFm/jgclC\r\nhIXtGk524IkEDttT5d4W3ceMzcY4XepXRPC2iDDnGVLqMXftn8DH4cwj25nI\r\nFAPf4ydsWMYTxQkBW6tPjeHUBZN3udMb/LA=\r\n=EDEO\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.4_1668307535253_0.9113567252505959"},"_hasShrinkwrap":false},"2.0.5":{"name":"speedybot-mini","version":"2.0.5","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","dev:active":"npm link && npm run build:lite","dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","dev":"tsnd --respawn --watch src/lib, src/lib/index","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","publish:beta":"npm run build && npm publish --tag beta","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","test":"jest"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","gitHead":"752c81781a7bce53134bed73114f26904ed7c2f5","description":"![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true)","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.5","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-4izuAz/J82Mdp4DlNE5Nkcy538sKSHB2hi+qmXiIZl0ASwE5MFg7HFVRyA7vVFxLlwfSF+1bbrRFp0mPe8y/yA==","shasum":"d4f04fe0fef592697f55f174034b890189e59d44","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.5.tgz","fileCount":32,"unpackedSize":302283,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEZsSjLkliKUckQ5CT1vfLItEne2d4DuWKwVTjNYluvfAiBuPaQTUQ13cmYr9StG/Fv797CbBTUPDebyUPPVRJ7T7A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcQ1OACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqBTw/7BMGEieoWPvSShsxm6I3PJcDeLUXpD/5xdmgG7dKoyzdaObx0\r\nRdbAKxdee0nmRLAn5cfq3aVoKrA7avRazfJi7I5ZC3ujFGV8SbYaFObEU7P0\r\nLuVlqPPwDOflrcJxd5iU+yIaLUDJ47/ARMNZAYOpsJySVpI11XQtl1Z3eDDv\r\n8QCRvjtXlzlMSG5zaDYJsXSVIxSn+YLTQs06IwLJ+YJppEjRM3Ap+SPolzTR\r\nfDls2Ph60pZSe3BfDtadJA40Jq1jc4BRBTPs4hXu0gx5KtRdyglUvX0MMWgS\r\njD4ZcnwpYgX4ULx8g1KoVYQL0AIppn3QRgY71Yj/XZz3mXWCJWVp7BuArN9v\r\ns047XezN/Vj/rFTmAPoodfRki5U440FqhCayoR5zAcPZC44cuqDYHCAhkX99\r\noGSM/7TrK2tI3Rkad9fuPPbMX4xuWwuN2Pa8EDaQ0GYAACA2L1zqLfZYIQa3\r\n+lJ48DExDm2J6v0CIpuEKO5opRT+0lZfMNvuF7EjB4okREQ21kNQBh29oO2h\r\nSYJ53/P5SXOpLfo7TIWFqZ8WB1Fs0OkLoICI8/bFnFaBh20uqcTo8Ox9kdb2\r\n9TLaJtDelNWnhLik2e+twZwKcq6ZP83qkOV0pEqkOBTU5mXGN6omjAurUwsc\r\nEwEtGG8DB6cbYr5uyuCD+Hpb8PjoPorzLuI=\r\n=gcGG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.5_1668353358270_0.9962980844525886"},"_hasShrinkwrap":false},"2.0.0-beta.8":{"name":"speedybot-mini","version":"2.0.0-beta.8","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","dev:active":"npm link && npm run build:lite","dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","dev":"tsnd --respawn --watch src/lib, src/lib/index","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","publish:beta":"npm run build && npm publish --tag beta","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","test":"jest","stamp:beta":"npm version 2.0.0-beta.08"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","readme":"![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true)\n\n## Speedybot-mini\n\nSpeedybot is a tool to take you from zero to a user-valuable bot as quickly as possible w/ a buttery-smooth developer experience. In short, Speedybot lets you focus on the stuff that actually matters-- content and powerful integrations.\n\nIf you're in a hurry, see the **[quickstarts](#quickstarts)** to get up and running fast on a variety of infrastructure (websockets, server, serverless, container-less, etc).\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Lots of handy utilities for things like **[alerts, cards, files, and more](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/BotInst.md#methods)**\n- Locale & i18n support\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end (though Speedybot has several trick to make writing those easier). In the future, there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)** and Speedybot can help make that transition as smooth as possible\n\n## Quickstarts\n\nYou can get up and running FAST with Speedybot. Speedybot can run on a variety of architectures and environments\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- 📚 **[API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)**\n\n| Platform                                                                                                                          | Needs server? | Needs webhooks? |\n| --------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------- |\n| **[🔌 Deploy with websockets](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/websockets)**                        | ❌            | ❌              |\n| **[💻 Deploy to Simple Express Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)** | ✅            | ✅              |\n| **[λ Deploy to AWS Lamda](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/aws-lambda)**                            | ❌            | ✅              |\n| **[🔥 Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**                                  | ❌            | ✅              |\n| **[🦖 Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**                                      | ❌            | ✅              |\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](https://github.com/valgaze/speedybot-mini/blob/deploy/settings/config.ts)**\n\n## How to make a bot\n\n## Keywords\n\nSpeedybot is made up of \"handlers\" that trigger based on special conditions-- depending on your needs you'll probably need only one or two in your project\n\n| Keyword                                                                                                       | Description                                                                                                                                             |\n| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **[.contains](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#contains)** | This will match if a trigger phrase is the 1st or only word in a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#fuzzy)**       | This will match if a trigger phrase exists _anywhere_ inside a message sent from the user                                                               |\n| **[.exact](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#exact)**       | This will match if a trigger phrase is exactly (case-sensitve) a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#regex)**       | This will match if a message sent from a user passes the regex                                                                                          |\n| **[.every](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#every)**       | This will match on every message from a user                                                                                                            |\n| **[.nlu](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#nlu)**           | This will match on every message from a user except if the trigger phrase is used by hard-coded handler, designed for use with natural language systems |\n| **[.onSubmit](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onSubmit)** | This will trigger when data is sent from an **[](https://developer.webex.com/docs/api/guides/cards)**                                                   |\n| **[.onFile](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onFile)**     | This will trigger every time a file is sent to the agent and will provide file meta data                                                                |\n| **[.onCamera](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onCamera)** | This will trigger every time an image file sent to the agent                                                                                            |\n| **[.noMatch](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#noMatch)**   | This will trigger if there are no registered handlers for the user's text                                                                               |\n\n<details>\n<summary>Note on Precedence</summary>\n\nRule: the 1st registered handler will match in the event of a conflict\n\nEx. Below since it was set first, fuzzy will take precedence over `contains`\n\n```ts\nimport { Speedybot, Config } from \"speedybot-mini\";\n\nconst botConfig: Config = {\n  token: \"__REPLACE__ME__\",\n};\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\nCultureBot.fuzzy(\"hi\", ($bot, msg) => {\n  $bot.send(\"Fuzzy launched\");\n});\n\nCultureBot.contains(\"hi\", ($bot, msg) => {\n  $bot.send(\"Contains launched\");\n});\n```\n\n</details>\n\nSee the main **[sample for all you can do](./settings/config.ts)**, but here's how you could make a simple agent\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n\n// Match handlers based on user input\nCultureBot.contains([\"hi\", \"yo\", \"hola\"], async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n  $bot.send(\n    $bot\n      .card({\n        title: `Hi ${msg.author.displayName}!`,\n        subTitle: `Glad to have you here, you said ${msg.text}`,\n        chips: [\"ping\", \"pong\"],\n      })\n      .setInput(`What's on your mind?`)\n  );\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch, etc\n\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}'`);\n});\n```\n\nThere's much more, see this **[sample for all you can do](./settings/config.ts)**\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n\n## Credits/Attribution\n\n- Cookie image courtesy of Daniel Lopez: https://unsplash.com/photos/aT7CE57EZL8 & https://unsplash.com/@soydanielwolf\n","readmeFilename":"README.md","gitHead":"960d1cd061d850fd322adad28ee09d3888a30a64","description":"![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true)","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.0-beta.8","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ma813U4fXbofqwo/i03/9mwQf79+4cXm3o7uBjeMrfH0yl2gh28acHf0g/FSsHA0OpKm+Hb9SoaSWuBjizmP/Q==","shasum":"6999e9aefa303d81f2443f17571245c4ac8456e0","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.0-beta.8.tgz","fileCount":36,"unpackedSize":307135,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGv3soQSJqpxcRwFKltzLlFWU7ZTAl8sA0BeMV3iKGhMAiEAhFgqvgkiolsMfJlgU0uqVgA4zqZhbHq1N3Jdx5lJTDA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjszy6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr6mw/+ITUT2u6eXJqlqnDNJPg6WamyTnqwuPXphblCh+yG+vEj7ojg\r\nK/R8xzcjXABXman0gNRcNIZ48h4kjcLgK8dvrWIbLeWW+fKFkJcApyo72Edi\r\nF06J27gheGY6Cm8/9OwLeroPBvmrl2gpNvhbsEL1dLlwnCztlfBDxNzp6yPK\r\nJ/BaZ55jkZckVix+yrbppwiwr4Ia4UAPndDDqGnI8VfJJnL9t6VCr/V/sQYH\r\n6d5ugU6oOxTy8DHWgVcwn4c3WWBOrVXV1rypa1RF6/1i4Qs04OGQz65BzxZU\r\npUDRZCiZDSOtDSN5HSut0RwZs0uVg1gTPBNjEtEqH5+TxKUIms67hdakP4y0\r\nDSxtuee2ieq66VziBAkrUEBa7aQQTAiAaCTtcReHaEG3LauL3X1+wWgEDOYr\r\nFDRkqoXhPNcP4edGpABvFDQlmCz2CkaaU/lUAtTvwvRbAXa1S3PH3Ge+24qD\r\nwc0o3djEm2Lw+X1lzsy2vmYK+3JW9+4aVA27FPJKG6NkcomSol6OVlBHEGrF\r\niFZEcxh2uvsSABQ08w9OLPHLOkzKGhtqeZo1yF96tNtYMlHHLjNgpeiXcU2G\r\nzL4PawlRtdRYij8u/rYbjTB+wRwQ6iQfnHeJP0uB/HyiiWYZsA7f/V9Ky5pd\r\nTEwikvjHal6u/eugzUT456wn7SBPO0dgJOc=\r\n=zVkA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.0-beta.8_1672690874348_0.04263782428235352"},"_hasShrinkwrap":false},"2.0.6-beta.1":{"name":"speedybot-mini","version":"2.0.6-beta.1","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","dev:active":"npm link && npm run build:lite","dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","dev":"tsnd --respawn --watch src/lib, src/lib/index","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","publish:beta":"npm run build && npm publish --tag beta","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","test":"jest","stamp:beta":"npm version 2.0.0-beta.08"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","readme":"![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true)\n\n## Speedybot-mini\n\nSpeedybot is a tool to take you from zero to a user-valuable bot as quickly as possible w/ a buttery-smooth developer experience. In short, Speedybot lets you focus on the stuff that actually matters-- content and powerful integrations.\n\nIf you're in a hurry, see the **[quickstarts](#quickstarts)** to get up and running fast on a variety of infrastructure (websockets, server, serverless, container-less, etc).\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Lots of handy utilities for things like **[alerts, cards, files, and more](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/BotInst.md#methods)**\n- Locale & i18n support\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end (though Speedybot has several trick to make writing those easier). In the future, there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)** and Speedybot can help make that transition as smooth as possible\n\n## Quickstarts\n\nYou can get up and running FAST with Speedybot. Speedybot can run on a variety of architectures and environments\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- 📚 **[API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)**\n\n| Platform                                                                                                                          | Needs server? | Needs webhooks? |\n| --------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------- |\n| **[🔌 Deploy with websockets](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/websockets)**                        | ❌            | ❌              |\n| **[💻 Deploy to Simple Express Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)** | ✅            | ✅              |\n| **[λ Deploy to AWS Lamda](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/aws-lambda)**                            | ❌            | ✅              |\n| **[🔥 Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**                                  | ❌            | ✅              |\n| **[🦖 Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**                                      | ❌            | ✅              |\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](https://github.com/valgaze/speedybot-mini/blob/deploy/settings/config.ts)**\n\n## How to make a bot\n\n## Keywords\n\nSpeedybot is made up of \"handlers\" that trigger based on special conditions-- depending on your needs you'll probably need only one or two in your project\n\n| Keyword                                                                                                       | Description                                                                                                                                             |\n| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **[.contains](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#contains)** | This will match if a trigger phrase is the 1st or only word in a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#fuzzy)**       | This will match if a trigger phrase exists _anywhere_ inside a message sent from the user                                                               |\n| **[.exact](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#exact)**       | This will match if a trigger phrase is exactly (case-sensitve) a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#regex)**       | This will match if a message sent from a user passes the regex                                                                                          |\n| **[.every](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#every)**       | This will match on every message from a user                                                                                                            |\n| **[.nlu](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#nlu)**           | This will match on every message from a user except if the trigger phrase is used by hard-coded handler, designed for use with natural language systems |\n| **[.onSubmit](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onSubmit)** | This will trigger when data is sent from an **[](https://developer.webex.com/docs/api/guides/cards)**                                                   |\n| **[.onFile](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onFile)**     | This will trigger every time a file is sent to the agent and will provide file meta data                                                                |\n| **[.onCamera](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onCamera)** | This will trigger every time an image file sent to the agent                                                                                            |\n| **[.noMatch](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#noMatch)**   | This will trigger if there are no registered handlers for the user's text                                                                               |\n\n<details>\n<summary>Note on Precedence</summary>\n\nRule: the 1st registered handler will match in the event of a conflict\n\nEx. Below since it was set first, fuzzy will take precedence over `contains`\n\n```ts\nimport { Speedybot, Config } from \"speedybot-mini\";\n\nconst botConfig: Config = {\n  token: \"__REPLACE__ME__\",\n};\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\nCultureBot.fuzzy(\"hi\", ($bot, msg) => {\n  $bot.send(\"Fuzzy launched\");\n});\n\nCultureBot.contains(\"hi\", ($bot, msg) => {\n  $bot.send(\"Contains launched\");\n});\n```\n\n</details>\n\nSee the main **[sample for all you can do](./settings/config.ts)**, but here's how you could make a simple agent\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n\n// Match handlers based on user input\nCultureBot.contains([\"hi\", \"yo\", \"hola\"], async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n  $bot.send(\n    $bot\n      .card({\n        title: `Hi ${msg.author.displayName}!`,\n        subTitle: `Glad to have you here, you said ${msg.text}`,\n        chips: [\"ping\", \"pong\"],\n      })\n      .setInput(`What's on your mind?`)\n  );\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch, etc\n\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}'`);\n});\n```\n\nThere's much more, see this **[sample for all you can do](./settings/config.ts)**\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n\n## Credits/Attribution\n\n- Cookie image courtesy of Daniel Lopez: https://unsplash.com/photos/aT7CE57EZL8 & https://unsplash.com/@soydanielwolf\n","readmeFilename":"README.md","gitHead":"f2a399c993020f85b7cd0824dd392d171a6280de","description":"![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true)","bugs":{"url":"https://github.com/valgaze/speedybot/issues"},"homepage":"https://github.com/valgaze/speedybot#readme","_id":"speedybot-mini@2.0.6-beta.1","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-upX2e9enIbTJ7QNLpu46xZZGqLOh75RMCMudwIbw7E1kKK3Lp0CCA5lN5mEeQ4ZIadn2LO3ChrVx6i9Ql4uRgw==","shasum":"db1a5b053bfa53dbb48c92daa24ccbc657c2375b","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.6-beta.1.tgz","fileCount":36,"unpackedSize":307417,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVmqv8BaO6w/aT+VS266CqufOERNFjDen2Sizn5nXAEwIhAPgTBz0anrMVP1lc2qeJM7lTuQxSEKf+HRf/fB6lUf4A"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjsz/NACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq93hAAiAnnw/lJUqZKj1tvDAoVKdJGnSeKVsOvHGInsExLIUdfc1RP\r\nXok1KlAYqgHVA6c1UW1ITYoVoatlJJyroRnVxZgOVRDzjMpBsp9dw4n0IAPT\r\ng57TC6B8C1ZjVe6OKV0msA46h0rlpPdi2lZWi3n7Sy+YNFyuNd/f/IsaEkyJ\r\n5/7YQOFMlPfZA2E1wWyoN/Gx6PcMG/2rDu6qsY21BZJjv6ePlIx3NtEqAdr9\r\nAr74laaxLKJOYYLNhnP9FLuak5E+wqB+75I9hnBF7f+QWIA0366iiVE3ZE87\r\n3YryPcJER1lqI6pIvbU+/fbQ0j7IO++cC6PDD0xAWk46gCXBMmQdHjrIgj5n\r\nGBVf0mWo0HdUTbrKp1l0wwGAKJKCj7a5h322ps2q7JrilDHBDtvnm5WcYo5+\r\nFVS2BQc9ji+Tu33QXsz0KXLil2MX54fUu0aog5DmHi9gcCyv0V7c1LShHkyb\r\nZUCsEsOH4/f95EYeh/mFmNKhiQsaCgDpc2U0cF/y+aRhT1JotJBKnKwtq5C/\r\nQeqjKZq+cwWcNQq8Vt1n3DyLj2ULUUSnkDuGCPwVWPQtpLRNXRIFO4JeadfK\r\n5G7uOgiS3v+E9VC/CIU9t7Q5swtotMHstnRiu+HEev+eVgarTCN1CAavEUQp\r\nZPHxviPd/DCBpjJ/G9CviU6x+lxTqIqPHHA=\r\n=HdmS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.6-beta.1_1672691661579_0.9813448947245837"},"_hasShrinkwrap":false},"2.0.6":{"name":"speedybot-mini","version":"2.0.6","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","dev:active":"npm link && npm run build:lite","dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","dev":"tsnd --respawn --watch src/lib, src/lib/index","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","publish:beta":"npm run build && npm publish --tag beta","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","test":"jest"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot-mini.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","gitHead":"8973f15bf9bb5a5f99029ee60c9474b27016f0ce","description":"<p align=\"center\">   <a href=\"https://www.npmjs.com/package/speedybot-mini\">     <picture>       <source media=\"(prefers-color-scheme: dark)\"  srcset=\"https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true\">       <source media","bugs":{"url":"https://github.com/valgaze/speedybot-mini/issues"},"homepage":"https://github.com/valgaze/speedybot-mini#readme","_id":"speedybot-mini@2.0.6","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-DAaTD49mDAf56VOGlIC7eYuGvG4M0c0bJxPk6e1vWlS3MECU6X/JuF8tPpw4p4HDJ/Nt2mnkAsjX3yO8q0mM0w==","shasum":"1940d89a1ecc8e1ef2bcac9e6e007a95767e1d8c","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.0.6.tgz","fileCount":36,"unpackedSize":319791,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDED2yAB7vcZ8NFsBTTe9Mu10vkYuSsHMW75h4DZTnMJAiAEcXqJ9OsBkq2nneJEzGam0EO53bQRhVdywPa6DV5z/A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkDk2+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqHsg//aveYE6AArmNs0r7cfYDgKrCt2uD0q3qagOSe30v7v43owjhm\r\ndrBLG3vcilbvmg2zGqywlZYeh0BmPf7W/+z82hcFyEiQ4Mh7B3OijZEH0SlX\r\nt1Tfsh3ztbheP6Ho9sIpRpYLDK/XrumzUTkHCaaFMX7ByggmmNvK8yTBU1+v\r\nVt1G9cvLfPJso8YbwMrGjIiueePSlv/c+PTqtzK/yVFdgmZ1VEa853h/Wzt8\r\ntTBVOMpE8libehkhPOje4DGm5K89YT7NsX+qeTzyaKeLBVfBm2swxtq5Ynbf\r\nvt2J+3B1CTQel6PI60l/RI/fSpO6GKOrobML6ku1DEEcAG3JzYLiyM/oihS9\r\ntou8E373sFiJkTPE6T3zD1zQ0+yE7FFyhLBFI/Uf+Lpv7a5c5M7hU2Y1+rZi\r\ntLPRoJ+fFY0HDNMWtmW/keLXhteNiM1jrZV/q2VCbxU+RTyxHqO3OahhSN82\r\napbA9WhWxcbE2iwYoy6UPNRRDvwsC3K+8AFu2c+C3ihLlNkMinXVB9kVA7cq\r\n9+vR7YhyhZnKBNn5cCmgEq5gBJsIKqjOM15B3++GErrD8dTB2H3rq/29n17s\r\n3XslsxbeU8SuUqNSb2BmI9ZHjLTpyinGKhgZJjYUCo5r5KsqPblyI7P+jvJh\r\n4fHKRaOU0F4uufYcoCHKeEPcc0MrZCEO2H8=\r\n=oWyr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.0.6_1678659006273_0.464361046938766"},"_hasShrinkwrap":false},"2.7.0-beta.0":{"name":"speedybot-mini","version":"2.7.0-beta.0","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","dev:active":"npm link && npm run build:lite","dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","dev":"tsnd --respawn --watch src/lib, src/lib/index","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","publish:beta":"npm run build && npm publish --tag beta","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","test":"jest"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot-mini.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","readme":"<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/speedybot-mini\">\n    <img alt=\"speedybot-mini\" src=\"https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true\">\n  </a>\n</p>\n\n<p align=\"center\">\n  <b><a href=\"https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes\">📚 API Docs</a> |\n  <a href=\"#quickstarts\">🚀 Quickstarts</a></b> |\n  <a href=\"https://github.com/valgaze/speedybot-mini/discussions\">💬 Get Help</a></b>\n</p>\n\n[![npm version](https://badge.fury.io/js/speedybot-mini.svg)](https://www.npmjs.com/package/speedybot-mini)\n\n## Speedybot-mini\n\nSpeedybot is a tool to take you from zero to a user-valuable bot as quickly as possible w/ a buttery-smooth developer experience. In short, Speedybot lets you focus on the stuff that actually matters-- content and powerful integrations.\n\nIf you're in a hurry, see the **[quickstarts](#quickstarts)** to get up and running fast on a variety of infrastructure (websockets, server, serverless, container-less, etc).\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Lots of handy utilities for things like **[alerts, cards, files, and more](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/BotInst.md#methods)**\n- Locale & i18n support\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end (though Speedybot has several trick to make writing those easier). In the future, there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)** and Speedybot can help make that transition as smooth as possible\n\n## Quickstarts\n\nYou can get up and running FAST with Speedybot. Speedybot can run on a variety of architectures and environments\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- 📚 **[API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)**\n\n| Platform                                                                                                                          | Needs server? | Needs webhooks? |\n| --------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------- |\n| **[🔌 Deploy with websockets](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/websockets)**                        | ❌            | ❌              |\n| **[💻 Deploy to Simple Express Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)** | ✅            | ✅              |\n| **[λ Deploy to AWS Lamda](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/aws-lambda)**                            | ❌            | ✅              |\n| **[🔥 Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**                                  | ❌            | ✅              |\n| **[🦖 Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**                                      | ❌            | ✅              |\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](https://github.com/valgaze/speedybot-mini/blob/deploy/settings/config.ts)**\n\n## How to make a bot\n\n## Keywords\n\nSpeedybot is made up of \"handlers\" that trigger based on special conditions-- depending on your needs you'll probably need only one or two in your project\n\n| Keyword                                                                                                       | Description                                                                                                                                             |\n| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **[.contains](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#contains)** | This will match if a trigger phrase is the 1st or only word in a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#fuzzy)**       | This will match if a trigger phrase exists _anywhere_ inside a message sent from the user                                                               |\n| **[.exact](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#exact)**       | This will match if a trigger phrase is exactly (case-sensitve) a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#regex)**       | This will match if a message sent from a user passes the regex                                                                                          |\n| **[.every](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#every)**       | This will match on every message from a user                                                                                                            |\n| **[.nlu](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#nlu)**           | This will match on every message from a user except if the trigger phrase is used by hard-coded handler, designed for use with natural language systems |\n| **[.onSubmit](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onSubmit)** | This will trigger when data is sent from an **[](https://developer.webex.com/docs/api/guides/cards)**                                                   |\n| **[.onFile](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onFile)**     | This will trigger every time a file is sent to the agent and will provide file meta data                                                                |\n| **[.onCamera](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onCamera)** | This will trigger every time an image file sent to the agent                                                                                            |\n| **[.noMatch](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#noMatch)**   | This will trigger if there are no registered handlers for the user's text                                                                               |\n\n<details>\n<summary>Note on Precedence</summary>\n\nRule: the 1st registered handler will match in the event of a conflict\n\nEx. Below since it was set first, fuzzy will take precedence over `contains`\n\n```ts\nimport { Speedybot, Config } from \"speedybot-mini\";\n\nconst botConfig: Config = {\n  token: \"__REPLACE__ME__\",\n};\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\nCultureBot.fuzzy(\"hi\", ($bot, msg) => {\n  $bot.send(\"Fuzzy launched\");\n});\n\nCultureBot.contains(\"hi\", ($bot, msg) => {\n  $bot.send(\"Contains launched\");\n});\n```\n\n</details>\n\nSee the main **[sample for all you can do](./settings/config.ts)**, but here's how you could make a simple agent\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n\n// Match handlers based on user input\nCultureBot.contains([\"hi\", \"yo\", \"hola\"], async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n  $bot.send(\n    $bot\n      .card({\n        title: `Hi ${msg.author.displayName}!`,\n        subTitle: `Glad to have you here, you said ${msg.text}`,\n        chips: [\"ping\", \"pong\"],\n      })\n      .setInput(`What's on your mind?`)\n  );\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch, etc\n\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}'`);\n});\n```\n\nThere's much more, see this **[sample for all you can do](./settings/config.ts)**\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n\n## Credits/Attribution\n\n- Cookie image courtesy of Daniel Lopez: https://unsplash.com/photos/aT7CE57EZL8 & https://unsplash.com/@soydanielwolf\n","readmeFilename":"README.md","gitHead":"849c461124ad5f6790eec907d8b1757ee4ca1770","description":"<p align=\"center\">   <a href=\"https://www.npmjs.com/package/speedybot-mini\">     <img alt=\"speedybot-mini\" src=\"https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true\">   </a> </p>","bugs":{"url":"https://github.com/valgaze/speedybot-mini/issues"},"homepage":"https://github.com/valgaze/speedybot-mini#readme","_id":"speedybot-mini@2.7.0-beta.0","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-xg7G+SG2mYJTDz/bqCfj+tGrXE0St6WGKYO7FuUWLprbrLwCWRf+SMzlU4AYfs8vxRFWpI9F6eT1jplvwJKXMg==","shasum":"12946d9f6cb8fa1cd83d7c9ded769871af988511","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.7.0-beta.0.tgz","fileCount":36,"unpackedSize":320411,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+IYDQkIUX8SlLkm8/7553V+3vTHAriz4wIKmz1V4WzAIgAiT8AOOWzqn27OABMpDno9aUXRHJSF42MF3By8qSPFA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkNeD8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpOGA//bmjKw/msvn3DVigLan0XBaDfuIYXbKgLrmmnYNgn91X9zCnu\r\nBHCuryJFKabjkyA4K8FfnUFWdhjcoVR+xSapmWl+ggw3SsUrqV7wVNxmTPGp\r\n92ghE2eQesyAqXtfRjf87hS1/NrsGbkRJMFBOugeZlqA9aUfufGb2ith4rzu\r\nqANL42VY2MrSYBUJialZ7jmMyFb+oYvrhjwg++e9fxxE2hKG3FErM1XUovEJ\r\n+KwOpH/G1B2nh9+hjI7d7okOFvMe4CHq/ovWd71Qjsxdv5VhL2ecVpmZNWml\r\nIbMNms7BLMfkdjJB2+c4oFdD/RWR368VFFavKSBSrFaiv1yvM++349hMsTz4\r\nXv1L3ik/w/kovksNevvIu8PxU7C/MtHOKHXw+YbBNnhrUX/2WRcqsPRMYe8S\r\nbcsiJqSDqzgahU/zqtnlIf2siyn/9gudH8EjRJNJygbCoi6LauJScZhxHtAz\r\nAUdCxnJ0OWAfR4Awp/s4LnzpYBMhmxoFf3ZHLtCjAzJWzOgCQ28mjJ4grmTM\r\nALwfqQXhXJbmalPwZHDKC3YOUSaQ7isDKHFe7MD7tovKRrK6b/ltXAnbsZ2a\r\nVkZ9FpuikHemuLR5K13SDxD6QGDdCPa8SLOtzIGxEwM2+bRm81LO1QrtbenO\r\n7nsUF2Efz8Ode5v5vkTWB2mX5vUxZHsGPQU=\r\n=Mjad\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.7.0-beta.0_1681252604211_0.515498672245742"},"_hasShrinkwrap":false},"2.7.0-beta2":{"name":"speedybot-mini","version":"2.7.0-beta2","main":"dist/src/index.js","types":"dist/src/index.d.ts","devDependencies":{"@types/jest":"^29.1.2","@types/node":"^18.8.4","jest":"^29.2.0","ts-jest":"^29.0.3","ts-node-dev":"^2.0.0","tsx":"^3.10.1","typedoc":"0.22.18","typedoc-plugin-markdown":"3.12.1","typedoc-theme-hierarchy":"1.2.1","typescript":"^4.7.2"},"scripts":{"stamp":"npm run version ${npm_package_version}-beta","build":"npm test && tsc && npm run docs && npm run dist:example","build:lite":"tsc && npm link && npm run dev","dev:active":"npm link && npm run build:lite","dist:example":"tee examples/websockets/settings/config.ts examples/express-incoming-webhook/settings/config.ts examples/worker/settings/config.ts examples/aws-lambda/services/functions/config.ts < settings/config.ts >/dev/null","dev":"tsnd --respawn --watch src/lib, src/lib/index","docs":"rm -rf api-docs 2>/dev/null && npx --yes typedoc --media docs/assets --plugin typedoc-plugin-markdown --out api-docs src/docs.ts","publish:beta":"npm run build && npm publish --tag beta","save":"git add . &2.0.0-beta.& git commit -m \"checkpt\" && git push draft deploy","test":"jest"},"engines":{"node":">=18.11.0"},"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot-mini.git"},"keywords":["bot","scaffold","continerless","speedybot","serverless"],"author":{"name":"valgaze@gmail.com"},"license":"MIT","readme":"<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/speedybot-mini\">\n    <img alt=\"speedybot-mini\" src=\"https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true\">\n  </a>\n</p>\n\n<p align=\"center\">\n  <b><a href=\"https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes\">📚 API Docs</a> |\n  <a href=\"#quickstarts\">🚀 Quickstarts</a></b> |\n  <a href=\"https://github.com/valgaze/speedybot-mini/discussions\">💬 Get Help</a></b>\n</p>\n\n[![npm version](https://badge.fury.io/js/speedybot-mini.svg)](https://www.npmjs.com/package/speedybot-mini)\n\n## Speedybot-mini\n\nSpeedybot is a tool to take you from zero to a user-valuable bot as quickly as possible w/ a buttery-smooth developer experience. In short, Speedybot lets you focus on the stuff that actually matters-- content and powerful integrations.\n\nIf you're in a hurry, see the **[quickstarts](#quickstarts)** to get up and running fast on a variety of infrastructure (websockets, server, serverless, container-less, etc).\n\n- 🌟 Zero External Dependencies 🌟\n- Adds support **[tappable suggestion \"chips\"](#chips)**\n- Includes **[SpeedyCard card builder](#speedycard)** (create rich **[Adaptive Cards](https://developer.webex.com/docs/api/guides/cards)** without wrangling JSON)\n- Lots of handy utilities for things like **[alerts, cards, files, and more](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/BotInst.md#methods)**\n- Locale & i18n support\n- Runs on virtually any infrastructure-- servers, V8 isolates, containers, container-less, edge, etc\n\nThe era of manually writing \"handlers\" or matching text with RegEx's is coming to an end (though Speedybot has several trick to make writing those easier). In the future, there will be far fewer \"keyword\" handlers and instead deeper integration with 3rd-party conversation services like **[Voiceflow](https://www.voiceflow.com/)**, **[Amazon Lex](https://aws.amazon.com/lex/)**, **[DialogFlow](https://cloud.google.com/dialogflow/docs)** and Speedybot can help make that transition as smooth as possible\n\n## Quickstarts\n\nYou can get up and running FAST with Speedybot. Speedybot can run on a variety of architectures and environments\n\n- **[speedybot garage 🔧🤖, manage webhooks/secrets/admin](https://codepen.io/valgaze/pen/MWVjEZV)**\n\n- 📚 **[API Docs](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/modules.md#classes)**\n\n| Platform                                                                                                                          | Needs server? | Needs webhooks? |\n| --------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------- |\n| **[🔌 Deploy with websockets](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/websockets)**                        | ❌            | ❌              |\n| **[💻 Deploy to Simple Express Server](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/express-incoming-webhook)** | ✅            | ✅              |\n| **[λ Deploy to AWS Lamda](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/aws-lambda)**                            | ❌            | ✅              |\n| **[🔥 Deploy to Worker](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/worker)**                                  | ❌            | ✅              |\n| **[🦖 Deploy to Deno](https://github.com/valgaze/speedybot-mini/tree/deploy/examples/deno)**                                      | ❌            | ✅              |\n\n## Syntax\n\n```sh\nnpm install speedybot-mini\n```\n\n**[See starter bot](https://github.com/valgaze/speedybot-mini/blob/deploy/settings/config.ts)**\n\n## How to make a bot\n\n## Keywords\n\nSpeedybot is made up of \"handlers\" that trigger based on special conditions-- depending on your needs you'll probably need only one or two in your project\n\n| Keyword                                                                                                       | Description                                                                                                                                             |\n| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **[.contains](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#contains)** | This will match if a trigger phrase is the 1st or only word in a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#fuzzy)**       | This will match if a trigger phrase exists _anywhere_ inside a message sent from the user                                                               |\n| **[.exact](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#exact)**       | This will match if a trigger phrase is exactly (case-sensitve) a message sent from a user                                                               |\n| **[.fuzzy](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#regex)**       | This will match if a message sent from a user passes the regex                                                                                          |\n| **[.every](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#every)**       | This will match on every message from a user                                                                                                            |\n| **[.nlu](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#nlu)**           | This will match on every message from a user except if the trigger phrase is used by hard-coded handler, designed for use with natural language systems |\n| **[.onSubmit](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onSubmit)** | This will trigger when data is sent from an **[](https://developer.webex.com/docs/api/guides/cards)**                                                   |\n| **[.onFile](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onFile)**     | This will trigger every time a file is sent to the agent and will provide file meta data                                                                |\n| **[.onCamera](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#onCamera)** | This will trigger every time an image file sent to the agent                                                                                            |\n| **[.noMatch](https://github.com/valgaze/speedybot-mini/blob/deploy/api-docs/classes/Speedybot.md#noMatch)**   | This will trigger if there are no registered handlers for the user's text                                                                               |\n\n<details>\n<summary>Note on Precedence</summary>\n\nRule: the 1st registered handler will match in the event of a conflict\n\nEx. Below since it was set first, fuzzy will take precedence over `contains`\n\n```ts\nimport { Speedybot, Config } from \"speedybot-mini\";\n\nconst botConfig: Config = {\n  token: \"__REPLACE__ME__\",\n};\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\nCultureBot.fuzzy(\"hi\", ($bot, msg) => {\n  $bot.send(\"Fuzzy launched\");\n});\n\nCultureBot.contains(\"hi\", ($bot, msg) => {\n  $bot.send(\"Contains launched\");\n});\n```\n\n</details>\n\nSee the main **[sample for all you can do](./settings/config.ts)**, but here's how you could make a simple agent\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n\n// Match handlers based on user input\nCultureBot.contains([\"hi\", \"yo\", \"hola\"], async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n  $bot.send(\n    $bot\n      .card({\n        title: `Hi ${msg.author.displayName}!`,\n        subTitle: `Glad to have you here, you said ${msg.text}`,\n        chips: [\"ping\", \"pong\"],\n      })\n      .setInput(`What's on your mind?`)\n  );\n});\n\n// Can also do Regex's\nCultureBot.regex(new RegExp(\"x\"), ($bot, msg) => {\n  $bot.send(`Regex matched on this text:  ${msg.text}`);\n});\n\n// Special keywords: .onSubmit, .onFile, .onCamera, .every, .noMatch, etc\n\n// Handle AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// Runs on file upload, can pass bytes to 3rd-party service\nCultureBot.onFile(async ($bot, msg, fileData) => {\n  $bot.send(`You uploaded '${fileData.fileName}'`);\n  $bot.send(`snip: ${fileData.markdownSnippet}`);\n  $bot.send(fileData.data);\n}).config({ matchText: true });\n\n// Runs on EVERY input, kinda like middleware\n// This is where you would interact with an NLU service like DialogFlow, Amazon Lex, Voiceflow, etc\nCultureBot.every(async ($bot, msg) => {\n  const { text } = msg;\n  $bot.log(`.every handler ran with this text: '${text}'`);\n}).config({\n  skipList: [\"$clear\"],\n});\n\n// If no matched handlers\nCultureBot.noMatch(($bot, msg) => {\n  $bot.say(`Bummer, there was no matching handler for '${msg.text}'`);\n});\n```\n\nThere's much more, see this **[sample for all you can do](./settings/config.ts)**\n\n## SpeedyCard\n\nex. Tell the bot \"sendcard\" to get a card, type into the card & tap submit, catch submission using _<@submit>_ and echo back to user.\n\n- Getting started with AdaptiveCards (https://developer.webex.com/docs/api/guides/cards) can be a bit cumbersome and error-prone\n\n- SpeedyCard is a limited subset of AdaptiveCards with basic features with a focus on user interaction & simplicity (title, text, input box, menu-select, no \"collapsable\" sections, etc)\n\n- Inspired a bit by SwiftUI: https://developer.apple.com/xcode/swiftui/\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_sendcard.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\n// send a card\n\nCultureBot.contains(\"sendcard\", async ($bot, msg) => {\n  const cardPayload = $bot\n    .card()\n    .setTitle(\"System is 👍\")\n    .setSubtitle(\"If you see this card, everything is working\")\n    .setImage(\"https://i.imgur.com/SW78JRd.jpg\")\n    .setInput(`What's on your mind?`)\n    .setTable([[`Bot's Time`, new Date().toTimeString()]])\n    .setData({ mySpecialData: { a: 1, b: 2 } })\n    .setUrl(\n      \"https://www.youtube.com/watch?v=3GwjfUFyY6M\",\n      \"Take a moment to celebrate\"\n    );\n});\n```\n\n</details>\n\n## Chips\n\nex. Tell the bot \"chips\" to get a card with tappable \"chips\"\n\n![sb](https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/demo_chips.gif)\n\n<details>\n<summary>(Tap to see code)</summary>\n\n```ts\nimport { Speedybot } from \"speedybot-mini\";\n\n// In a production environment use a secrets manager to pass in token\n// Get a token: https://developer.webex.com/my-apps/new/bot\nconst botConfig = { token: \"__REPLACE__ME__\" };\n\n// 1) Initialize your bot w/ config\nconst CultureBot = new Speedybot(botConfig);\n\n// 2) Export your bot\nexport default CultureBot;\n\n// 3) Do whatever you want!\n// Match handlers based on user input like\nCultureBot.contains(\"hi\", async ($bot, msg) => {\n  $bot.send(`You said '${msg.text}', ${msg.author.displayName}!`);\n});\n\n// Handle/capture AdpativeCard submissions (non-chip submission)\nCultureBot.onSubmit(($bot, msg) => {\n  $bot.send(`You submitted ${JSON.stringify(msg.data.inputs)}`);\n});\n\nCultureBot.contains([\"ping\", \"pong\"], ($bot, msg) => {\n  const { text } = msg;\n  if (text === \"ping\") {\n    $bot.send(\"pong\");\n  } else if (text === \"pong\") {\n    $bot.send(\"ping\");\n  }\n});\n\n// send a card with tappable chips\n\nCultureBot.contains(\"chips\", async ($bot, msg) => {\n  $bot.send(\n    $bot\n      .card()\n      .setChips([\n        \"hey\",\n        \"ping\",\n        { label: \"say the phrase pong\", keyword: \"pong\" },\n      ])\n  );\n});\n```\n\n</details>\n\n## Credits/Attribution\n\n- Cookie image courtesy of Daniel Lopez: https://unsplash.com/photos/aT7CE57EZL8 & https://unsplash.com/@soydanielwolf\n","readmeFilename":"README.md","gitHead":"894d83d47e979a94a6531eed3ea13cc0b9f5401a","description":"<p align=\"center\">   <a href=\"https://www.npmjs.com/package/speedybot-mini\">     <img alt=\"speedybot-mini\" src=\"https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true\">   </a> </p>","bugs":{"url":"https://github.com/valgaze/speedybot-mini/issues"},"homepage":"https://github.com/valgaze/speedybot-mini#readme","_id":"speedybot-mini@2.7.0-beta2","_nodeVersion":"18.11.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-E4Vftpb90YTDhh1paI/MNYZ5G0jG2QU3oWVfaL3QX+qB1JlAu1J8Wu1qwBhGFFsR7ZEAaBhaE51l8Qqn4vBHzw==","shasum":"9587ba2d84afc2f26a5fd20849f790bca8af6022","tarball":"https://registry.npmjs.org/speedybot-mini/-/speedybot-mini-2.7.0-beta2.tgz","fileCount":36,"unpackedSize":320533,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC1arGoGBKB7Vi23LFwbRpO54P7gFYZ4vxPZkg98SM13AiAHOGFHSOhqF2wsidFMBP5RdHnaWM8GjS/CZ19bKeWTyw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkNeX9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoM2xAAiYZBhjX4+wpHfbNG/Ch84QKLrZSQZQz7/IH//GaQCG91PkgL\r\na/CuOHDlqabIc6fN84ZmYh/vy7ub7BY4tPDYZSnZqlMMhYseXRGWvN7ArnXV\r\n3U5ADIzNUPlF8FLgkKm5NKPYkiIKW4CuWdo1nAG84/jrGxihuBEIg6WfnVT2\r\nCL32kgCkmsh9EEXhCqi2bRpUoNapBfSoh/WtlIRfsbNWwx3CzVXNmtmk04G1\r\n3qQyFn58vhhZWCqoT7j8d8tg4MDeO5zwJ5CnKsZhkc0cQYSyuFMZeQ0bbGeq\r\nB9XHN/VYfacgUDHB1DwwAUaDoAgWUeP8wf/MO+U6z9A4NlHz/ttx3/bYFQRd\r\n9Au7yxSXgjvFfp3eK81lSEiA1D9LbsPesuK2SPm9asei79ykW7vsHpBUv+sX\r\ndWSIhCMDQOEF+QawVzHbAJKlqRoCCpZKefGaZxV80J9gK1bLsdCPHj1cjxAM\r\nPIFcXzhG4MfayeiCnpFamHFhsNHwheblRbcYkWnHPYQZiHYlyklY9tOQHN2B\r\nd4kieU7aOPVslRcVZELBfvhHcjnpEIRE4q0TgJYTYvfAWGkn1eUstA5lIVVO\r\n5PLxEFub27ZmrKBcd14nIIuBMG90sp5TKcKAgyIWObiF2x/4zICDO5x3UuqL\r\nxKStbdXvX/7ueYbtB+w+3+D/nDTZ+9LzwhE=\r\n=i4QR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"valgaze","email":"valgaze@gmail.com"},"directories":{},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/speedybot-mini_2.7.0-beta2_1681253885617_0.6132075412958033"},"_hasShrinkwrap":false}},"time":{"created":"2021-10-22T14:18:48.492Z","0.0.2":"2021-10-22T14:18:48.650Z","modified":"2023-04-11T22:58:05.936Z","0.0.3":"2022-05-13T20:25:33.335Z","2.0.0-beta.0":"2022-10-18T16:57:10.266Z","2.0.0-beta.1":"2022-10-18T17:00:52.457Z","2.0.0-beta.2":"2022-10-18T17:05:35.106Z","2.0.0-beta.3":"2022-10-18T17:34:04.168Z","2.0.0-beta.4":"2022-10-18T17:36:27.191Z","2.0.0-beta.6":"2022-10-19T12:10:14.953Z","2.0.0":"2022-10-19T13:27:45.719Z","2.0.0-beta.7":"2022-10-22T03:38:37.624Z","2.0.0-beta.9":"2022-10-24T19:55:35.024Z","2.0.0-beta.10":"2022-10-24T20:12:50.484Z","2.0.0-beta.11":"2022-10-24T22:50:35.578Z","2.0.0-beta.12":"2022-10-25T15:04:11.085Z","2.0.0-beta.13":"2022-10-25T15:07:22.920Z","2.0.0-beta.15":"2022-10-26T04:01:08.365Z","2.0.0-beta.16":"2022-10-26T04:14:11.150Z","2.0.1":"2022-10-29T15:10:06.857Z","2.0.1-beta.16":"2022-11-02T10:49:11.735Z","2.0.2":"2022-11-02T11:02:56.312Z","2.0.3":"2022-11-13T02:43:31.041Z","2.0.4":"2022-11-13T02:45:35.441Z","2.0.5":"2022-11-13T15:29:18.445Z","2.0.0-beta.8":"2023-01-02T20:21:14.549Z","2.0.6-beta.1":"2023-01-02T20:34:21.727Z","2.0.6":"2023-03-12T22:10:06.496Z","2.7.0-beta.0":"2023-04-11T22:36:44.459Z","2.7.0-beta2":"2023-04-11T22:58:05.811Z"},"maintainers":[{"name":"valgaze","email":"valgaze@gmail.com"}],"description":"<p align=\"center\">   <a href=\"https://www.npmjs.com/package/speedybot-mini\">     <picture>       <source media=\"(prefers-color-scheme: dark)\"  srcset=\"https://github.com/valgaze/speedybot-mini/raw/deploy/docs/assets/logo.png?raw=true\">       <source media","readme":"","readmeFilename":"","homepage":"https://github.com/valgaze/speedybot-mini#readme","keywords":["bot","scaffold","continerless","speedybot","serverless"],"repository":{"type":"git","url":"git+https://github.com/valgaze/speedybot-mini.git"},"author":{"name":"valgaze@gmail.com"},"bugs":{"url":"https://github.com/valgaze/speedybot-mini/issues"},"license":"MIT"}