Showing preview only (2,523K chars total). Download the full file or copy to clipboard to get everything.
Repository: howdyai/botkit
Branch: main
Commit: b8f0e3e7fd92
Files: 250
Total size: 2.4 MB
Directory structure:
gitextract_32xvuma6/
├── .editorconfig
├── .eslintignore
├── .eslintrc.json
├── .github/
│ ├── issue_template.md
│ └── stale.yml
├── .gitignore
├── .npmignore
├── .travis.yml
├── ATTRIBUTIONS.md
├── CONTRIBUTING.md
├── LICENSE.md
├── build/
│ ├── botkit-ci.yml
│ ├── botkit-daily.yml
│ └── scripts/
│ └── rebasePackageLock.js
├── changelog.md
├── lerna.json
├── package.json
├── packages/
│ ├── botbuilder-adapter-facebook/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── package.json
│ │ ├── readme.md
│ │ ├── src/
│ │ │ ├── botworker.ts
│ │ │ ├── facebook_adapter.ts
│ │ │ ├── facebook_api.ts
│ │ │ ├── facebook_event_middleware.ts
│ │ │ └── index.ts
│ │ ├── tests/
│ │ │ ├── FacebookAdapter.tests.js
│ │ │ ├── FacebookEventMiddleware.tests.js
│ │ │ └── shared.js
│ │ └── tsconfig.json
│ ├── botbuilder-adapter-hangouts/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── package.json
│ │ ├── readme.md
│ │ ├── src/
│ │ │ ├── botworker.ts
│ │ │ ├── hangouts_adapter.ts
│ │ │ └── index.ts
│ │ ├── tests/
│ │ │ └── HangoutsAdapter.tests.js
│ │ └── tsconfig.json
│ ├── botbuilder-adapter-slack/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── examples/
│ │ │ ├── index.js
│ │ │ └── multiteam.js
│ │ ├── package.json
│ │ ├── readme.md
│ │ ├── src/
│ │ │ ├── botworker.ts
│ │ │ ├── index.ts
│ │ │ ├── messagetype_middleware.ts
│ │ │ ├── slack_adapter.ts
│ │ │ ├── slack_dialog.ts
│ │ │ └── slackevent_middleware.ts
│ │ ├── tests/
│ │ │ └── SlackAdapter.tests.js
│ │ └── tsconfig.json
│ ├── botbuilder-adapter-twilio-sms/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── package.json
│ │ ├── readme.md
│ │ ├── src/
│ │ │ ├── botworker.ts
│ │ │ ├── index.ts
│ │ │ └── twilio_adapter.ts
│ │ ├── tests/
│ │ │ └── TwilioAdapter.tests.js
│ │ └── tsconfig.json
│ ├── botbuilder-adapter-web/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── client/
│ │ │ ├── client.js
│ │ │ ├── css/
│ │ │ │ ├── embed.css
│ │ │ │ └── styles.css
│ │ │ ├── embed.js
│ │ │ ├── index.html
│ │ │ ├── readme.md
│ │ │ └── sass/
│ │ │ ├── _botkit.scss
│ │ │ ├── _chat.scss
│ │ │ ├── _home.scss
│ │ │ ├── embed.scss
│ │ │ └── styles.scss
│ │ ├── package.json
│ │ ├── readme.md
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── web_adapter.ts
│ │ ├── tests/
│ │ │ └── WebAdapter.tests.js
│ │ └── tsconfig.json
│ ├── botbuilder-adapter-webex/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── package.json
│ │ ├── readme.md
│ │ ├── src/
│ │ │ ├── botworker.ts
│ │ │ ├── index.ts
│ │ │ └── webex_adapter.ts
│ │ ├── tests/
│ │ │ └── WebexAdapter.tests.js
│ │ └── tsconfig.json
│ ├── botkit/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── adapter.ts
│ │ │ ├── botworker.ts
│ │ │ ├── conversation.ts
│ │ │ ├── conversationState.ts
│ │ │ ├── core.ts
│ │ │ ├── dialogWrapper.ts
│ │ │ ├── index.ts
│ │ │ ├── teamsHelpers.ts
│ │ │ └── testClient.ts
│ │ ├── tests/
│ │ │ ├── Core.tests.js
│ │ │ ├── CustomAdapter.tests.js
│ │ │ ├── Dialog.tests.js
│ │ │ └── State.tests.js
│ │ └── tsconfig.json
│ ├── botkit-plugin-cms/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── package.json
│ │ ├── readme.md
│ │ ├── src/
│ │ │ ├── cms.ts
│ │ │ └── index.ts
│ │ └── tsconfig.json
│ ├── docs/
│ │ ├── .gitignore
│ │ ├── advanced.md
│ │ ├── build/
│ │ │ ├── adapter.hbs
│ │ │ ├── build.sh
│ │ │ ├── parse.js
│ │ │ ├── plugin.hbs
│ │ │ ├── template.hbs
│ │ │ ├── toc-platforms.hbs
│ │ │ └── toc.hbs
│ │ ├── conversations.md
│ │ ├── core.md
│ │ ├── index.json
│ │ ├── index.md
│ │ ├── package.json
│ │ ├── platforms/
│ │ │ ├── facebook.md
│ │ │ ├── hangouts.md
│ │ │ ├── index.md
│ │ │ ├── slack.md
│ │ │ ├── twilio-sms.md
│ │ │ ├── web.md
│ │ │ └── webex.md
│ │ ├── plugins/
│ │ │ ├── cms.md
│ │ │ └── index.md
│ │ ├── provisioning/
│ │ │ ├── cisco-spark.md
│ │ │ ├── facebook_messenger.md
│ │ │ ├── index.md
│ │ │ ├── slack-events-api.md
│ │ │ ├── teams.md
│ │ │ └── twilio-sms.md
│ │ ├── readme.md
│ │ └── reference/
│ │ ├── cms.md
│ │ ├── core.md
│ │ ├── facebook.md
│ │ ├── hangouts.md
│ │ ├── index.md
│ │ ├── slack.md
│ │ ├── twilio-sms.md
│ │ ├── web.md
│ │ └── webex.md
│ ├── generator-botkit/
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.md
│ │ ├── generators/
│ │ │ ├── app/
│ │ │ │ ├── index.js
│ │ │ │ └── templates/
│ │ │ │ ├── bot.js
│ │ │ │ ├── features/
│ │ │ │ │ ├── sample_echo.js
│ │ │ │ │ └── sample_hears.js
│ │ │ │ ├── gitignore
│ │ │ │ ├── package.json
│ │ │ │ └── readme.md
│ │ │ ├── botframework/
│ │ │ │ ├── index.js
│ │ │ │ └── templates/
│ │ │ │ └── features/
│ │ │ │ └── botframework_features.js
│ │ │ ├── facebook/
│ │ │ │ ├── index.js
│ │ │ │ └── templates/
│ │ │ │ └── features/
│ │ │ │ └── facebook_features.js
│ │ │ ├── hangouts/
│ │ │ │ ├── index.js
│ │ │ │ └── templates/
│ │ │ │ └── features/
│ │ │ │ └── hangouts_features.js
│ │ │ ├── slack/
│ │ │ │ ├── index.js
│ │ │ │ └── templates/
│ │ │ │ └── features/
│ │ │ │ ├── routes_oauth.js
│ │ │ │ └── slack_features.js
│ │ │ ├── twilio-sms/
│ │ │ │ ├── index.js
│ │ │ │ └── templates/
│ │ │ │ └── features/
│ │ │ │ └── twilio_features.js
│ │ │ ├── web/
│ │ │ │ ├── index.js
│ │ │ │ └── templates/
│ │ │ │ ├── features/
│ │ │ │ │ ├── chat.js
│ │ │ │ │ ├── typing.js
│ │ │ │ │ └── websocket_features.js
│ │ │ │ ├── public/
│ │ │ │ │ ├── client.js
│ │ │ │ │ ├── css/
│ │ │ │ │ │ ├── embed.css
│ │ │ │ │ │ └── styles.css
│ │ │ │ │ └── index.html
│ │ │ │ └── sass/
│ │ │ │ ├── _botkit.scss
│ │ │ │ ├── _chat.scss
│ │ │ │ ├── _home.scss
│ │ │ │ ├── embed.scss
│ │ │ │ └── styles.scss
│ │ │ └── webex/
│ │ │ ├── index.js
│ │ │ └── templates/
│ │ │ └── features/
│ │ │ └── webex_features.js
│ │ ├── package.json
│ │ └── readme.md
│ └── testbot/
│ ├── .gitignore
│ ├── bot.js
│ ├── botframework.js
│ ├── custom_express.js
│ ├── features/
│ │ ├── bot_inspector_mode.js
│ │ ├── botframework_features.js
│ │ ├── convo.js
│ │ ├── convo_test.js
│ │ ├── dynamic_attachments.js
│ │ ├── facebook_features.js
│ │ ├── flip_table.js
│ │ ├── get_reference.js
│ │ ├── hangouts_features.js
│ │ ├── hear_patterns.js
│ │ ├── interruptions.js
│ │ ├── looping_dialog.js
│ │ ├── luis_recognizer.js
│ │ ├── middlewares.js
│ │ ├── random_text_middleware.js
│ │ ├── sample_onboarding.js
│ │ ├── shutdown.js
│ │ ├── slack_features.js
│ │ ├── slack_modals.js
│ │ ├── teams_features.js
│ │ ├── test_convo.js
│ │ ├── twilio_features.js
│ │ ├── typescript.ts
│ │ ├── waterfall_dialog.js
│ │ ├── webex_features.js
│ │ ├── websocket_features.js
│ │ └── z_fallback.js
│ ├── multiadapter.js
│ ├── package.json
│ ├── plugins/
│ │ └── verbose/
│ │ ├── index.js
│ │ ├── public/
│ │ │ └── test.txt
│ │ └── views/
│ │ ├── layout.hbs
│ │ └── template.hbs
│ ├── public/
│ │ ├── client.js
│ │ ├── css/
│ │ │ ├── embed.css
│ │ │ └── styles.css
│ │ └── index.html
│ └── testbot.bot
├── readme.md
└── todo.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
[*.json]
indent_size = 2
================================================
FILE: .eslintignore
================================================
packages/testbot
================================================
FILE: .eslintrc.json
================================================
{
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": ["plugin:@typescript-eslint/recommended"],
"parserOptions": {
"ecmaVersion": 9,
"sourceType": "module",
"ecmaFeatures": {
"impliedStrict": true
}
},
"rules": {
"semi": ["error", "always"],
"no-return-await": 0,
"space-before-function-paren": ["error", {
"named": "never",
"anonymous": "never",
"asyncArrow": "always"
}],
"quotes": ["error", "single", {"allowTemplateLiterals": true}],
"template-curly-spacing": ["error", "always"],
"@typescript-eslint/camelcase": 0,
"@typescript-eslint/indent": ["error", 4],
"@typescript-eslint/interface-name-prefix": 0,
"@typescript-eslint/no-explicit-any": 0,
"@typescript-eslint/no-object-literal-type-assertion": ["error", {
"allowAsParameter": true
}],
"@typescript-eslint/no-use-before-define": ["error", { "functions": false, "classes": true }]
}
}
================================================
FILE: .github/issue_template.md
================================================
** DO NOT ERASE THESE INSTRUCTIONS WITHOUT READING THEM FIRST **
Please read this entire template before posting any issue to get faster response.
Open an issue on this repository with your topic or question, providing as much detail as possible. The more we know, the better we can help.
Before posting, search the repository to see if there's already an issue opened to avoid duplicates.
### Are you sure this is an issue with the Botkit core module?
For all other questions, requests or help, please feel free to join the discussion slack : https://community.botkit.ai
### What are you trying to achieve or the steps to reproduce?
Describe your issue here, include as much detail as necessary to reproduce the issue or implement a missing functionality.
````
// Wrap code in markdown source tags
````
### What was the result you received?
### What did you expect?
### Screenshots and animated GIFs
### Context:
- Botkit version:
- Messaging Platform:
- Node version:
- Os:
- Any other relevant information:
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- bug
- next_release
- platform request
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
================================================
FILE: .gitignore
================================================
node_modules/
start.sh
start_button.sh
db/
examples/db_slackbutton_bot/
examples/db_slackbutton_incomingwebhook/
examples/db_slackbutton_slashcommand/
examples/db_team_bot/
.DS_Store
*/.DS_Store
.idea
.vscode
.env
coverage
# simple_storage files
/channels/
/teams/
/users/
# temp test files
tests/**/temp/
================================================
FILE: .npmignore
================================================
docs/provisioning/IMG
================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
- lts/*
script:
- lerna bootstrap --hoist
- lerna run build
- lerna run test
================================================
FILE: ATTRIBUTIONS.md
================================================
# bser
Copyright 2015-present Facebook, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
# fb-watchman
Copyright 2014-present Facebook, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
# weak-map
Copyright (c) 2011 Google Inc., Kris Kowal
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
# browser-process-hrtime
Copyright 2014 kumavis
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# remove-trailing-separator
Copyright (c) 2017 Tomas Sardyha <darsain@gmail.com>
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# xmpp
Copyright (c) 2017, xmpp.js
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# Babel-jest
Copyright (c) 2014-present, Facebook, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# babel code frame
Copyright (c) 2014-2018 Sebastian McKenzie and other contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# compare-versions
Copyright (c) 2015-2017 Ole Michelsen
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# babel/highlight
Copyright (c) 2014-2018 Sebastian McKenzie and other contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# invert-kv
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# Jest
Copyright (c) 2014-present, Facebook, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# json-stable-stringify
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# just-extend
Copyright (c) 2016 angus croll
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# key-tree-store
Copyright (c) Henrik Joreteg <henrik@andyet.net>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# node-xmpp-core
Copyright (c) 2016 node-xmpp
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# node-xmpp-tls-connect
Copyright (c) 2016 node-xmpp
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# safe-regex
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# sane
sane:
Copyright (c) amasad
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-----
watch:
Copyright (c) Mikeal Rogers <mikeal.rogers@gmail.com>
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
# should-equal
Copyright (c) 2014 Denis Bardadym <bardadymchik@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
# should-format
Copyright (c) 2014 Denis Bardadym <bardadymchik@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# should-sinon
Copyright (c) 2015 Denis Bardadym <bardadymchik@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# should-type
Copyright (c) 2014 Denis Bardadym <bardadymchik@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# slash
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# to-double-quotes
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# w3c-hr-time
Copyright (c) 2017 Tiancheng "Timothy" Gu and other contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# wordwrap
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# json-schema
The "New" BSD License:
**********************
Copyright (c) 2005-2018, The JS Foundation
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the JS Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# browser-request
Copyright (c) 2014 Jason Smith Work <jhs@iriscouch.com>, Jason Smith <jason.h.smith@gmail.com>, maxogden <max@maxogden.com>
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
# scmp
Copyright (c) 2014, Sean Lavine
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the scmp project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# spdx-exceptions
spdx-exceptions.json (c) 2010-2015 Linux Foundation and its Contributors.
spdx-exceptions.json is licensed under a Creative Commons Attribution 3.0 Unported License (CC BY 3.0) License.
You should have received a copy of the license along with this work. If not, see https://creativecommons.org/licenses/by/3.0/legalcode.
# xmpp.js
Copyright (c) 2017, xmpp.js
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# ampersand-version
Copyright (c) 2014 &yet, LLC and AmpersandJS contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# array-next
Copyright (c) Henrik Joreteg
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# babel
Copyright (c) 2014-2018 Sebastian McKenzie and other contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# botbuilder
Copyright (c) 2016 Microsoft
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# botkit-studio-sdk
Copyright (c) howdyai
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# ciscospark
Copyright (c) 2016-2018 Cisco and/or its affiliates. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# concat-map
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# deep-equal
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# deprecate
Copyright (c) Brian M. Carlson
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# envify
Copyright (c) Hugh Kennedy <hughskennedy@gmail.com> (http://hughskennedy.com/)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# es6-promisify
Copyright (c) 2014 Mike Hall / Digital Design Labs
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# exit-hook
"Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
# fast-json-stable-stringify
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# i
Copyright (c) Pavan Kumar Sunkara
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# inquirer
Copyright (c) 2012 Simon Boudrias
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# is-typedarray
Copyright (c) Hugh Kennedy <hughskennedy@gmail.com> (http://hughsk.io/)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# jsdoctypeparser
"Copyright (c) 2018 Kuniwak
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
# minimist
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# node-xmpp-client
Copyright (c) 2016 node-xmpp
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# openurl
Copyright (c) Axel Rauschmayer <axe@rauschma.de>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# pop-iterate
Copyright (c) Kris Kowal <kris@cixar.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# qbox
Copyright (c) Arunoda Susiripala <arunoda.susiripala@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# readline2
Copyright (c) 2014 Simon Boudrias
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# regenerator-runtime
Copyright (c) 2014-present, Facebook, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# resolve
Copyright (c) James Halliday
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# rootpath
Copyright (c) Fabrizio Moscon <mosconfabrizio@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: CONTRIBUTING.md
================================================
# Instructions for Contributing Code
This project welcomes contributions and suggestions. Most contributions require you to agree to a
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
the rights to use your contribution. For details, visit https://cla.microsoft.com.
When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
provided by the bot. You will only need to do this once across all repos using our CLA.
When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
provided by the bot. You will only need to do this once across all repos using our CLA.
## Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
## Submitting Issues
* You can create an issue [here](https://github.com/howdyai/botkit/issues/new),
but before doing that please read the notes below and include as many details as
possible with your report. If you can, please include:
* The version of Botkit you are using
* The operating system you are using
* If applicable, what you were doing when the issue arose and what you
expected to happen
* Other things that will help resolve your issue:
* Screenshots and animated GIFs
* Error output that appears in your terminal, dev tools or as an alert
* Perform a [cursory search](https://github.com/howdyai/botkit/issues?utf8=✓&q=is%3Aissue+)
to see if a similar issue has already been submitted
## Submitting Pull Requests
* Pull requests should contain a concise topic and detailed accompanying text that clearly identifies both the purpose and justification for acceptance of any changes.
* Create, or link to an existing issue identifying the need driving your PR request. The issue can contain more details of the need for the PR as well as host debate as to which course of action the PR will take that will most serve the common good.
* Include screenshots and animated GIFs in your pull request whenever possible.
* Run `npm test` before submitting and fix any issues.
* Add tests to cover any new functionality. Add and/or update tests for any updates to the code.
* Write documentation in [Markdown](https://daringfireball.net/projects/markdown).
* Please follow, [JSDoc](http://usejsdoc.org/) for proper documentation.
* Use short, present tense commit messages. See [Commit Message Styleguide](#git-commit-messages).
## Styleguides
### General Code
* End files with a newline.
* Place requires in the following order:
* Built in Node Modules (such as `path`)
* Local Modules (using relative paths)
* Avoid platform-dependent code:
* Use `path.join()` to concatenate filenames.
* Using a plain `return` when returning explicitly at the end of a function.
* Not `return null`, `return undefined`, `null`, or `undefined`
### Git Commit Messages
* Use the present tense ("Add feature" not "Added feature")
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
* Limit the first line to 72 characters or less
* Reference issues and pull requests liberally
================================================
FILE: LICENSE.md
================================================
Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: build/botkit-ci.yml
================================================
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
# "name" here defines the build number format. Build number is accessed via $(Build.BuildNumber)
name: $(Build.BuildId)
pool:
vmImage: windows-latest
trigger: none # ci trigger is set in ADO
pr: none # pr trigger is set in ADO
variables:
runCodesignValidationInjection: false
steps:
- task: NodeTool@0
inputs:
versionSpec: '14.x'
checkLatest: true
displayName: 'Install Node.js 14.x'
- task: Bash@3
inputs:
targetType: 'inline'
script: |
rm -r packages/testbot
rm -r packages/docs
echo "rebase main package-lock"
cat package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > new-package-lock.json
echo "moving file..."
mv new-package-lock.json package-lock.json
echo "rebase facebook adapter"
cat packages/botbuilder-adapter-facebook/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-facebook/new-package-lock.json
echo "moving file..."
mv packages/botbuilder-adapter-facebook/new-package-lock.json packages/botbuilder-adapter-facebook/package-lock.json
echo "rebase hangouts adapter"
cat packages/botbuilder-adapter-hangouts/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-hangouts/new-package-lock.json
mv packages/botbuilder-adapter-hangouts/new-package-lock.json packages/botbuilder-adapter-hangouts/package-lock.json
echo "rebase slack adapter..."
cat packages/botbuilder-adapter-slack/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-slack/new-package-lock.json
mv packages/botbuilder-adapter-slack/new-package-lock.json packages/botbuilder-adapter-slack/package-lock.json
echo "rebase twilio adapter..."
cat packages/botbuilder-adapter-twilio-sms/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-twilio-sms/new-package-lock.json
mv packages/botbuilder-adapter-twilio-sms/new-package-lock.json packages/botbuilder-adapter-twilio-sms/package-lock.json
echo "rebase web adapter..."
cat packages/botbuilder-adapter-web/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-web/new-package-lock.json
mv packages/botbuilder-adapter-web/new-package-lock.json packages/botbuilder-adapter-web/package-lock.json
echo "rebase webex adapter..."
cat packages/botbuilder-adapter-webex/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-webex/new-package-lock.json
mv packages/botbuilder-adapter-webex/new-package-lock.json packages/botbuilder-adapter-webex/package-lock.json
echo "rebase cms plugin..."
cat packages/botkit-plugin-cms/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botkit-plugin-cms/new-package-lock.json
mv packages/botkit-plugin-cms/new-package-lock.json packages/botkit-plugin-cms/package-lock.json
echo "rebase botkit..."
cat packages/botkit/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botkit/new-package-lock.json
mv packages/botkit/new-package-lock.json packages/botkit/package-lock.json
echo "rebase generator..."
cat packages/generator-botkit/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/generator-botkit/new-package-lock.json
mv packages/generator-botkit/new-package-lock.json packages/generator-botkit/package-lock.json
displayName: 'Set up for FuseNPM feed'
- task: Bash@3
inputs:
targetType: 'inline'
script: |
npm install --ignore-scripts
lerna bootstrap --hoist
lerna run build
lerna run pack
displayName: 'Build packages'
- task: ComponentGovernanceComponentDetection@0
displayName: 'Component Detection'
inputs:
scanType: 'Register'
verbosity: 'Verbose'
alertWarningLevel: 'High'
failOnAlert: false
- task: CredScan@3
- powershell: |
Get-ChildItem .. -ErrorAction Continue -Recurse -Force | Where {$_.FullName -notlike "*node_modules*"}
displayName: 'Dir workspace except node_modules'
continueOnError: true
condition: succeededOrFailed()
================================================
FILE: build/botkit-daily.yml
================================================
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
# "name" here defines the build number format. Build number is accessed via $(Build.BuildNumber)
name: $(Build.BuildId)
pool:
vmImage: windows-latest
trigger: none # ci trigger is set in ADO
pr: none # pr trigger is set in ADO
variables:
Packaging.EnableSBOMSigning: true
runCodesignValidationInjection: false
# PackageVersion: 4.16.0-dev.{DateStamp}.$(Build.BuildId) Define this in Azure to be settable at queue time.
steps:
- task: NodeTool@0
inputs:
versionSpec: '14.x'
checkLatest: true
displayName: 'Install Node.js 14.x'
- powershell: |
# Replace {DateStamp} with the actual value in var PackageVersionFormat
$dateStamp = (Get-Date -format "yyyyMMdd");
"Raw PackageVersion = $(PackageVersion)";
$v = "$(PackageVersion)".Replace("{DateStamp}",$dateStamp);
Write-Host "##vso[task.setvariable variable=PackageVersion;]$v";
"Resolved PackageVersion = $v";
displayName: 'Resolve variable PackageVersion'
- powershell: |
Get-ChildItem -Recurse -Path 'packages\botkit\package.json' | % {
$_.FullName;
$content = Get-Content -Raw $_.FullName | ConvertFrom-Json;
$content.version = "$(PackageVersion)";
$content | ConvertTo-Json | Set-Content $_.FullName;
'-------------'; get-content $_.FullName; '==================='
}
displayName: 'Set botkit package version'
- task: colinsalmcorner.colinsalmcorner-buildtasks.tag-build-task.tagBuildOrRelease@0
displayName: tag build with version number
inputs:
tags: |
version=$(PackageVersion)
continueOnError: true
- task: Bash@3
inputs:
targetType: 'inline'
script: |
rm -r packages/testbot
rm -r packages/docs
echo "rebase main package-lock"
cat package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > new-package-lock.json
echo "moving file..."
mv new-package-lock.json package-lock.json
echo "rebase facebook adapter"
cat packages/botbuilder-adapter-facebook/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-facebook/new-package-lock.json
echo "moving file..."
mv packages/botbuilder-adapter-facebook/new-package-lock.json packages/botbuilder-adapter-facebook/package-lock.json
echo "rebase hangouts adapter"
cat packages/botbuilder-adapter-hangouts/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-hangouts/new-package-lock.json
mv packages/botbuilder-adapter-hangouts/new-package-lock.json packages/botbuilder-adapter-hangouts/package-lock.json
echo "rebase slack adapter..."
cat packages/botbuilder-adapter-slack/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-slack/new-package-lock.json
mv packages/botbuilder-adapter-slack/new-package-lock.json packages/botbuilder-adapter-slack/package-lock.json
echo "rebase twilio adapter..."
cat packages/botbuilder-adapter-twilio-sms/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-twilio-sms/new-package-lock.json
mv packages/botbuilder-adapter-twilio-sms/new-package-lock.json packages/botbuilder-adapter-twilio-sms/package-lock.json
echo "rebase web adapter..."
cat packages/botbuilder-adapter-web/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-web/new-package-lock.json
mv packages/botbuilder-adapter-web/new-package-lock.json packages/botbuilder-adapter-web/package-lock.json
echo "rebase webex adapter..."
cat packages/botbuilder-adapter-webex/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botbuilder-adapter-webex/new-package-lock.json
mv packages/botbuilder-adapter-webex/new-package-lock.json packages/botbuilder-adapter-webex/package-lock.json
echo "rebase cms plugin..."
cat packages/botkit-plugin-cms/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botkit-plugin-cms/new-package-lock.json
mv packages/botkit-plugin-cms/new-package-lock.json packages/botkit-plugin-cms/package-lock.json
echo "rebase botkit..."
cat packages/botkit/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/botkit/new-package-lock.json
mv packages/botkit/new-package-lock.json packages/botkit/package-lock.json
echo "rebase generator..."
cat packages/generator-botkit/package-lock.json | node build/scripts/rebasePackageLock.js https://fuselabs.pkgs.visualstudio.com/_packaging/FuseNPM/npm/registry/ > packages/generator-botkit/new-package-lock.json
mv packages/generator-botkit/new-package-lock.json packages/generator-botkit/package-lock.json
displayName: 'Set up for FuseNPM feed'
- task: Bash@3
inputs:
targetType: 'inline'
script: |
npm install --ignore-scripts
lerna bootstrap --hoist
lerna run build
lerna run pack
displayName: 'Build packages'
- task: CopyFiles@2
displayName: copy .tgz files to staging area
inputs:
SourceFolder: packages
Contents: '*/*.tgz'
TargetFolder: '$(Build.ArtifactStagingDirectory)/drop'
flattenFolders: true
- task: ComponentGovernanceComponentDetection@0
displayName: 'Component Detection'
inputs:
scanType: 'Register'
verbosity: 'Verbose'
alertWarningLevel: 'High'
failOnAlert: false
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
displayName: 'Generate Software Bill of Materials (SBOM)'
inputs:
BuildDropPath: '$(Build.ArtifactStagingDirectory)/drop'
PackageName: 'Botkit'
PackageVersion: $(PackageVersion)
- task: PublishBuildArtifacts@1
displayName: 'Push .tgz files to Artifacts drop'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)\drop'
ArtifactName: drop
- powershell: |
Get-ChildItem .. -ErrorAction Continue -Recurse -Force | Where {$_.FullName -notlike "*node_modules*"}
displayName: 'Dir workspace except node_modules'
continueOnError: true
condition: succeededOrFailed()
================================================
FILE: build/scripts/rebasePackageLock.js
================================================
#!/bin/node
'use strict';
// Usage:
// cat package-lock.json | node rebasePackageLock.mjs https://your-project.pkgs.visualstudio.com/_packaging/your-feed/npm/registry/ > new-package-lock.json
async function readAllStdin() {
return new Promise((resolve, reject) => {
const bufferList = [];
let numBytes = 0;
process.stdin.on('close', () => {
resolve(Buffer.concat(bufferList, numBytes));
});
process.stdin.on('data', buffer => {
bufferList.push(buffer);
numBytes += buffer.length;
});
process.stdin.on('error', reject);
});
}
function rebaseV1Inline(name, dependency, baseURL) {
const { resolved: actual, version } = dependency;
const singleName = name.split('/').reverse()[0];
const { href: expected } = new URL(`${name}/-/${singleName}-${version}.tgz`, 'https://registry.npmjs.org/');
const { href: rebased } = new URL(`${name}/-/${singleName}-${version}.tgz`, baseURL);
if (expected !== actual) {
throw new Error(`v1: Expecting "resolved" field to be "${expected}", actual is "${actual}".`);
}
dependency.resolved = rebased;
rebaseV1InlineAll(dependency, baseURL);
}
function rebaseV1InlineAll({ dependencies }, baseURL) {
for (const [name, dependency] of Object.entries(dependencies || {})) {
rebaseV1Inline(name, dependency, baseURL);
}
}
function rebaseV2Inline(path, dependency, baseURL) {
const { resolved: actual, version } = dependency;
const name = path.split('node_modules/').reverse()[0];
const singleName = name.split('/').reverse()[0];
const { href: expected } = new URL(`${name}/-/${singleName}-${version}.tgz`, 'https://registry.npmjs.org/');
const { href: rebased } = new URL(`${name}/-/${singleName}-${version}.tgz`, baseURL);
if (expected !== actual) {
throw new Error(`v2: Expecting "resolved" field to be "${expected}", actual is "${actual}".`);
}
dependency.resolved = rebased;
}
function rebaseV2InlineAll(packages, baseURL) {
for (const [path, dependency] of Object.entries(packages || {})) {
// "path" is falsy if it is iterating the current package.
path && rebaseV2Inline(path, dependency, baseURL);
}
}
async function main() {
const baseURL = process.argv[2];
if (!baseURL) {
throw new Error('New registry base URL must be passed as first argument.');
}
const packageLockJSON = JSON.parse(await readAllStdin());
// v1
rebaseV1InlineAll(packageLockJSON, baseURL);
// v2
rebaseV2InlineAll(packageLockJSON.packages, baseURL);
const json = JSON.stringify(packageLockJSON, null, 2);
if (~json.indexOf('://registry.npmjs.org')) {
throw new Error('After rebase, "://registry.npmjs.org" should not be detected in the output.');
}
console.log(json);
}
main();
================================================
FILE: changelog.md
================================================
# Change Log
[View the official Botkit roadmap](https://github.com/howdyai/botkit/projects/9) for upcoming changes and features.
[Want to contribute? Read our guide!](https://github.com/howdyai/botkit/blob/master/CONTRIBUTING.md)
# 4.15.0
* Update dependencies to Bot Framework 4.15
* Update various dev dependencies and external libraries
* CHANGE: Correct `from` field to be user rather than bot with Slack button clicks. Thanks to [@mdrichardson](https://github.com/mdrichardson) for the [pull request](https://github.com/howdyai/botkit/pull/2089).
# 4.10.0
* Update dependencies to [Bot Framework 4.10.1](https://github.com/microsoft/botbuilder-js/releases/tag/4.10)
* Update some dev dependencies like lerna, eslint, etc.
* NEW: Additional support for Microsoft Teams! [Read all about it](packages/docs/core.md#ms-teams-extensions) or [see these new methods in action](packages/testbot/features/teams_features.js)
* Bot workers spawned from the default adapter now feature `bot.teams` which is an instance to the [TeamsInfo helper class](https://docs.microsoft.com/en-us/javascript/api/botbuilder/teamsinfo?view=botbuilder-ts-latest).
* Botkit now includes an optional middleware [TeamsInvokeMiddleware](packages/docs/reference/core.md#TeamsInvokeMiddleware) for handling "invoke" responses from Teams including task modules.
* Botkit now includes [bot.replyWithTaskInfo()](packages/docs/reference/core.md#replyWithTaskInfo) which can be used to respond to task module events. [Read more about Task Modules](https://docs.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/what-are-task-modules)
* FIX: Adjust mechanism for handling templates in channelData to avoid data loss. Thanks [@ashitikov](https://github.com/ashitikov) for the [pull request](https://github.com/howdyai/botkit/pull/1979)
* FIX: Botkit will now spawn the appropriate botworker if a custom adapter is passed in. Thanks to [@etiennellipse](https://github.com/etiennellipse) for [reporting this issue](https://github.com/howdyai/botkit/issues/1984)!
# 4.9.0
* Update dependencies to [Bot Framework 4.9](https://github.com/microsoft/botbuilder-js/releases/tag/4.9.0)
* Update some dev dependencies like lerna, mocha and nyc
* FIX: Allow size limits to be adjusted on the Express json and urlencoded parsers. Fixes [#1941](https://github.com/howdyai/botkit/issues/1941)
* FIX: Allow bots to be spawned with null config. Thanks to [@NxP4Code](https://github.com/NxP4Code) for [this pull request](https://github.com/howdyai/botkit/pull/1955)
* FIX: Fix dynamic text field type definition. Thanks to [@etienneellipse](https://github.com/etiennellipse) for [this pull request](https://github.com/howdyai/botkit/pull/1960)
# 4.8.1
* FIX: Fixing a bug introduced in 4.8 pertaining to spawning proactive bots for Slack. [#1937](https://github.com/howdyai/botkit/issues/1937)
# 4.8
In addition to fixing a bunch of bugs and adding some new features, this version brings Botkit up to date with Bot Framework's latest release - [Change log here](https://github.com/microsoft/botbuilder-js/releases).
There are lots of interesting things happening in the Bot Framework world including a new [GUI for dialog management called Bot Framework Composer](https://github.com/microsoft/botframework-composer), a new templating system called [Language Generation](https://github.com/microsoft/BotBuilder-Samples/tree/master/experimental/language-generation), and more. Check out the [main hub repo for more information.](https://github.com/microsoft/botframework-sdk#readme)
### NEW
* NEW: At long last, the convo.ask callbacks can receive the full incoming message payload in addition to the text content.
This allows developers to use payload values inside quick replies, button clicks and other rich operations. Many thanks to [@naikus](https://github.com/naikus) for the effort and patience it took to get this in! [PR #1801](https://github.com/howdyai/botkit/pull/1801)
* NEW: Multi-adapter support improved. Botkit will now spawn the appropriate type of Botworker when used in a multi-adapter scenario. [See this example for a demonstration of using multiple adapters in a single bot app](./packages/testbot/multiadapter.js). [Issue #1920](https://github.com/howdyai/botkit/issues/1920)
* NEW: Add support for Slack's v2 oauth. [More details here](./packages/botbuilder-adapter-slack/CHANGELOG.md#109). Thanks to [@sfny](https://github.com/sfny) for [PR #1928](https://github.com/howdyai/botkit/pull/1928)
* NEW: Values in `channelData` will now be processed as Mustache templates inside BotkitConversations. [Thanks @me-cedric](https://github.com/me-cedric) for [pr #1925](https://github.com/howdyai/botkit/pull/1925)
* NEW: New Dialog related features for determining if a bot is already in a conversation, including [bot.hasActiveDialog()](packages/docs/reference/core.md#hasActiveDialog),
[bot.getActiveDialog()](packages/docs/reference/core.md#getActiveDialog), and
[bot.isDialogActive()](packages/docs/reference/core.md#isDialogActive)
### FIXED
* FIX: Facebook Adapter will not attempt to set up web routes if webserver is not configured. [#1916](https://github.com/howdyai/botkit/issues/1916)
* FIX: Exclude `activity.conversation.properties` field when generating state storage key. [#1849](https://github.com/howdyai/botkit/issues/1849)
* FIX: Allow startConversationWithUser to work with Bot Framework Emulator. [#1834](https://github.com/howdyai/botkit/issues/1834)
* FIX: Using `beginDialog` inside an `ask()` caused weird behaviors. Fixes for [#1878](https://github.com/howdyai/botkit/issues/1878) and [#1932](https://github.com/howdyai/botkit/issues/1932)
* FIX: Webex - remove empty `files` key [#1906](https://github.com/howdyai/botkit/pull/1906)
* FIX: Slack - authed_users added to message [#1911](https://github.com/howdyai/botkit/issues/1911)
* Update: all dependencies to latest, including bot framework 4.7->4.8 and mustache 3.0 -> 4.0
# 4.6.1
Version 4.6.1 includes some security and bugfix updates along with bumping many dependencies to the latest versions.
We recommend updating both Botkit core and your platform adapter to the latest version.
* Update Bot Framework dependencies to 4.7.1. Resolved [#1882](https://github.com/howdyai/botkit/issues/1882) and [#1894](https://github.com/howdyai/botkit/issues/1894).
* Remove `hbs` depencency from Botkit. Not used! Thanks @naktibaldi [#1855](https://github.com/howdyai/botkit/pull/1855)
* Botkit feature modules can now be written in ES6 syntax. Thanks @cooperka!! [#1854](https://github.com/howdyai/botkit/pull/1854)
* Allow `attachmentLayout` field in Botkit Conversations -- thanks @innorag [#1865](https://github.com/howdyai/botkit/pull/1865)
* Update dependencies and some minor eslint syntax fixes across all the adapters and sub-packages.
* Fixes in [botbuilder-adapter-slack](packages/botbuilder-adapter-slack/CHANGELOG.md#108)
* Fixes in [botbuilder-adapter-web](packages/botbuilder-adapter-web/CHANGELOG.md#106)
# 4.6
Version 4.6 includes security and bugfix updates to many dependencies, as well as fixes to some issues in Botkit core.
We recommend updating both Botkit core and your platform adapter to the latest version.
**New Features**
* Add a new `BotkitTestClient` class that makes it possible to write unit tests for dialogs. See [EXAMPLE UNIT TESTS HERE](https://github.com/howdyai/botkit/blob/master/packages/botkit/tests/Dialog.tests.js) -- [HUGE HUGE thanks to @qwertyuu for leading the effort on this!](https://github.com/howdyai/botkit/pull/1815)
* Support .ts (or parameterized) file extensions for loadModules [Thanks to @mutmatt for the PR](https://github.com/howdyai/botkit/pull/1777)
* The `text` field in a BotkitConversations can now be a function, which can be used to generated internationalized strings. [Thanks to @cooperka for the PR](https://github.com/howdyai/botkit/pull/1747)
* Add `convo.stop()` to allow conversation to be ended inside a handler.
* Update yeoman generator to make all environment variables UPPERCASE
**Fixes**
* Fix usePlugin parameter type declaration [thanks to @etiennellipse](https://github.com/howdyai/botkit/pull/1836)
* Fix ask/addQuestion type signatures [thanks to @etiennellipse](https://github.com/howdyai/botkit/pull/1818)
* Fix to how messages are constructed inside BotkitConversations. [thanks to @adantoscano](https://github.com/howdyai/botkit/pull/1746)
* Fail with better error when thread not found [Thanks to @cooperka](https://github.com/howdyai/botkit/pull/1758)
* correct mustache rendering from causing mutation of initial dialog script [Thanks to @InnoraG](https://github.com/howdyai/botkit/pull/1761)
* Fix: allow BotkitPlugins to have additional fields [Thanks to @roeintense](https://github.com/howdyai/botkit/issues/1804)
* Fix: resolve issues where calling cancelAllDialogs() would crash [thanks to @etiennellipse](https://github.com/howdyai/botkit/issues/1808)
* Fix: resolve issue where calling cancelAllDialogs() could cause repeat [thanks to @chahat-arora](https://github.com/howdyai/botkit/issues/1830)
* Fix: resolve issue where calling convo.repeat() would cause errors [thanks to akshaykonjier](https://github.com/howdyai/botkit/issues/1673) and [also to @etiennellipse](https://github.com/howdyai/botkit/issues/1811)
This update includes the following packages:
* Botkit v4.6.0
* generator-botkit v4.6.0
* [botbuilder-adapter-web v1.0.5](packages/botbuilder-adapter-web/CHANGELOG.md#105)
* [botbuilder-adapter-slack v1.0.6](packages/botbuilder-adapter-slack/CHANGELOG.md#106)
* [botbuilder-adapter-webex v1.0.4](packages/botbuilder-adapter-webex/CHANGELOG.md#104)
* [botbuilder-adapter-facebook v1.0.6](packages/botbuilder-adapter-facebook/CHANGELOG.md#106)
* [botbuilder-adapter-hangouts v1.0.4](packages/botbuilder-adapter-hangouts/CHANGELOG.md#103)
* [botbuilder-adapter-twilio-sms v1.0.4](packages/botbuilder-adapter-twilio-sms/CHANGELOG.md#104)
* [botkit-plugin-cms v1.0.3](packages/botkit-plugin-cms/CHANGELOG.md#103)
# 0.7.5
A maintenance release to the legacy branch was released as 0.7.5.
* Update out of date dependencies to address security issues
* Add support for Slack's new modals
# 4.5
We're skipping a few version numbers here to keep in sync with the rest of [Microsoft Bot Framework](https://github.com/microsoft/botframework).
Welcome to Botkit 4.5! This release contains a host of improvements and bug fixes affecting Botkit's conversation system, as well the behavior
of some of the platform adapters. We recommend that all developers currently using Botkit v4 upgrade to 4.5.
Specific Changes:
* NEW: It is now possible to create dynamic quick replies, and attachments within a BotkitConversation. [See full docs](https://botkit.ai/docs/v4/conversations.html#dynamic-quick-replies-and-attachments).
* NEW: Previously, there was no way to bind middleware to the internally created Express webserver. It is now possible to do so using the `webserver_middlewares` parameter. [Full docs](https://botkit.ai/docs/v4/reference/slack.html#interface-slackadapteroptions)
* NEW: Quick replies and suggestedActions are now procssed as mustache templates. Thanks to [@InnoraG](https://github.com/innorag) for [the pull request](https://github.com/howdyai/botkit/pull/1731).
* NEW: Slack block actions and other button clicks now are message type events and get included in dialogs. Thanks to [@apemberton](https://github.com/apemberton) for the [pull request](https://github.com/howdyai/botkit/pull/1712).
* NEW: The key name passed in to convo.ask and convo.addQuestion can now be set to null in order to discard the answer. Thanks to [@adantoscano](https://github.com/adantoscano) for [the pull request](https://github.com/howdyai/botkit/pull/1716)
* FIX: Botkit will no longer improperly prune platform specific fields like quick replies and attachments specified inside BotkitConversations. [Fix for #1664](https://github.com/howdyai/botkit/issues/1664), [#1679](https://github.com/howdyai/botkit/issues/1679), and [#1699](https://github.com/howdyai/botkit/issues/1699).
* FIX: The text field in BotkitConversations was expected to always be an array, causing some confusion. It is now possible to pass in a string OR an array. Passing an array will cause Botkit to choose a random entry in the array for the message text.
* FIX: Several updates have been made to the middleware pipeline so that it better matches expected behavior. The receive and send middlewares will now fire for every incoming message - previously, there were cases where these would not fire. Thanks to [@adantoscano](https://github.com/adantoscano) for [this pull request](https://github.com/howdyai/botkit/pull/1717) and also [this one](https://github.com/howdyai/botkit/pull/1720).
* FIX: The method for passing in a URI for communicating with Botkit CMS has been made more reliable, thanks to [@adantoscano](https://github.com/adantoscano). [See #1675](https://github.com/howdyai/botkit/pull/1675) and [#1677](https://github.com/howdyai/botkit/pull/1677).
* FIX: Webex adapter has been updated to better support file uploads. Thanks to [@Teamop](https://github.com/Teamop) for [the pull request](https://github.com/howdyai/botkit/pull/1667)
* FIX: Improve mapping of Bot Framework "Activity" fields. Thanks to [@Naktibalda](https://github.com/Naktibalda) for [the pull request](https://github.com/howdyai/botkit/pull/1707).
* FIX: Expand typedefs for Slack dialogs. Thanks to [@roger-king](https://github.com/roger-king) for [the pull request](https://github.com/howdyai/botkit/pull/1653)
* UPDATE: Update to v4.5.2 of all Bot Framework packages
* UPDATE: `ws` websocket module updated to v7.1.1
This update includes the following packages:
* Botkit v4.5.0
* generator-botkit v4.5.0
* [botbuilder-adapter-web v1.0.4](packages/botbuilder-adapter-web/CHANGELOG.md#104)
* [botbuilder-adapter-slack v1.0.4](packages/botbuilder-adapter-slack/CHANGELOG.md#104)
* [botbuilder-adapter-webex v1.0.2](packages/botbuilder-adapter-webex/CHANGELOG.md#102)
* [botbuilder-adapter-facebook v1.0.4](packages/botbuilder-adapter-facebook/CHANGELOG.md#104)
* [botbuilder-adapter-hangouts v1.0.3](packages/botbuilder-adapter-hangouts/CHANGELOG.md#103)
* [botbuilder-adapter-twilio-sms v1.0.2](packages/botbuilder-adapter-twilio-sms/CHANGELOG.md#102)
* [botkit-plugin-cms v1.0.2](packages/botkit-plugin-cms/CHANGELOG.md#102)
----
# 4.0.2
* Added `disable_console` option to controller. When set to true, Botkit will not emit normal console output.
* Fix Typerscript signature of controller.spawn() - Thanks to [@naktibalda](https://github.com/Naktibalda) for [the fix](https://github.com/howdyai/botkit/pull/1648)
* Fix for allowing typing messages in dialogs - [Details](https://github.com/howdyai/botkit/issues/1646)
* Remove useless try/catch blocks - - Thanks to [@naktibalda](https://github.com/Naktibalda) for [the fix](https://github.com/howdyai/botkit/pull/1654)
* Fix an issue where the convo.before hook would not fire as expected when looping a thread.
Coinciding with 4.0.2, the adapters and plugin have also been updated with bug fixes and minor updates:
* [botbuilder-adapter-web v1.0.3](packages/botbuilder-adapter-web/CHANGELOG.md#103)
* [botbuilder-adapter-slack v1.0.3](packages/botbuilder-adapter-slack/CHANGELOG.md#103)
* [botbuilder-adapter-webex v1.0.1](packages/botbuilder-adapter-webex/CHANGELOG.md#101)
* [botbuilder-adapter-facebook v1.0.3](packages/botbuilder-adapter-facebook/CHANGELOG.md#103)
* [botbuilder-adapter-hangouts v1.0.2](packages/botbuilder-adapter-hangouts/CHANGELOG.md#102)
* [botbuilder-adapter-twilio-sms v1.0.1](packages/botbuilder-adapter-twilio-sms/CHANGELOG.md#101)
* [botkit-plugin-cms v1.0.1](packages/botkit-plugin-cms/CHANGELOG.md#101)
# Sub-package release notes
* [botbuilder-adapter-web v1.0.2](packages/botbuilder-adapter-web/CHANGELOG.md#102)
* [botbuilder-adapter-slack v1.0.2](packages/botbuilder-adapter-slack/CHANGELOG.md#102)
# 4.0.1
This is the first major release of the new version of Botkit!
* The same `hears()`, `says()` and `ask()` syntax you know and love, but now with modern Javascript conventions like async/await.
* New capabilities like [interruptions](https://botkit.ai/docs/v4/core.html#interruptions) and [composable dialogs](https://botkit.ai/docs/v4/conversations.html#composing-dialogs).
* All new platform adapters for Web chat, Slack, Webex, Facebook, Google Hangouts and Twilio SMS.
* Built-in support for [Microsoft Bot Framework](https://dev.botframework.com) features like:
* Support for the [Bot Framework Emulator](http://aka.ms/botframework-emulator)
* Support for [Dialogs](https://npmjs.com/package/botbuilder-dialogs)
* Support for [Azure Bot Service](https://azure.microsoft.com/en-us/services/bot-service/)
* Long awaited fixes and improvements like:
* Multi-page support for Facebook
* Conversation state persistence between across app nodes / app restarts
* Full Typescript support
The [all new docs for Botkit 4 can be found here](https://botkit.ai/docs/v4).
All of the [Glitch starter kits have been updated with the latest version](https://glitch.com/botkit).
The best way to get started with 4.0 is to boot up a brand new bot using the [Yeoman generator](https://npmjs.com/package/generator-botkit), and connect it to the [Bot Framework Emulator](http://aka.ms/botframework-emulator).
You'll be chatting with your new bot in minutes!
```javascript
npm install -g yo botkit
yo botkit
```
# 0.7.4
* only require simple_storage when used: [#1566](https://github.com/howdyai/botkit/pull/1566)
* Slack: [Extend support of blocks](https://github.com/howdyai/botkit/pull/1597) - Thanks to [@ihorrusinko](https://github.com/ihorrusinko)
* Slack: [Add new block_actions events](https://github.com/howdyai/botkit/pull/1596) - Thanks to [@makstaks](https://github.com/makstaks)
* [Updated docs for using blocks with Slack](https://botkit.ai/docs/readme-slack.html#interactive-messages) - Thanks to [@makstaks](https://github.com/makstaks)
# 0.7.3
* Slack: Messages can now contain a `blocks` field to support Slack's new [Block Kit feature](https://api.slack.com/reference/messaging/blocks). Thanks to [@ihorrusinko for this update](https://github.com/howdyai/botkit/pull/1594).
* Slack: [set useQuerystring to true in Slack API](https://github.com/howdyai/botkit/pull/1547)
* Slack: [Change 500 webserver status to 404 when team not found](https://github.com/howdyai/botkit/pull/1548)
* Google Hangouts: [allow to consume auth data from env var instead of file](https://github.com/howdyai/botkit/pull/1543)
* Pull requests will now trigger Travis builds
# 0.7.2
Update dependency on `request` to latest to fix security warnings in dependency tree.
# 0.7.1
Update dependency on `botbuilder` to `3.16` to fix security warnings in dependency tree.
# 0.7.0
This release is the first major step towards [deprecating Botkit Studio](https://github.com/howdyai/botkit/issues/1534),
and introducing a more general system for scripted dialogs and content from [Botkit CMS](https://github.com/howdyai/botkit-cms).
We urge all Botkit users to update to the most recent version of Botkit. This may require an update to your project's package.json file.
* Remove all functionality pertaining to Botkit Studio statistics and analytics APIs. All stats related services provided by Botkit Studio will cease operation on Dec 15.
* Remove `stats_optout` flag from configuration.
* Remove Botkit Studio options from command line interface.
* Calls to Botkit Studio and/or Botkit CMS will no longer include the user's id
New features and changes:
* Support for Facebook Personas API. [Full docs here](https://botkit.ai/docs/readme-facebook.html#personas-api) -- [Thanks to @ouadie-lahdioui](https://github.com/howdyai/botkit/pull/1497)!
* Many Facebook APIs [have been promisified](https://github.com/howdyai/botkit/pull/1520) by @htaidirt
* Improved technique used to verify incoming webhooks from Slack [use hmac compare instead of direct compare](https://github.com/howdyai/botkit/pull/1539) - Thanks, @danhofer!
# 0.6.21
* Add support for Slack's chat.getPermalink
# 0.6.20
* Fix bug introduced in 0.6.19 that caused events to improperly fire twice.
* Emit a warning if Slack webhook validation is not enabled.
* To prepare for upcoming changes to Botkit Studio and Botkit stats collection:
* Prevent bots without Botkit Studio credentials from sending stat events
* Emit a message about stats data collection at startup
# 0.6.19
No new features, but updates throughout the dependency tree for security and stability purposes.
* Updated dependency versions to latest available
* Rewrote Botkit command line tool to remove dependency on abandoned library. Upgrade to the latest: `npm install -g botkit`
* Switched from using jscs to eslint for linting purposes.
# 0.6.18
* Fix syntax error in Web connector. Oops! Thanks for reporting this issue @iworkforthem!
* Add support for Google Hangouts "card_clicked" event. [Thanks to @ouadie-lahdioui](https://github.com/howdyai/botkit/pull/1487)
# 0.6.17
In addition to minor fixes, dependency version updates, and documentation updates, this version includes:
* Google Hangouts support is here! Thanks to [@ouadie-lahdioui's hard work](https://github.com/howdyai/botkit/pull/1414), your bot can now operate in [Hangouts Chat](https://gsuite.google.com/products/chat/).
Get started with the [Botkit Starter Kit for Google Hangouts](https://github.com/howdyai/botkit-starter-googlehangouts).
[Botkit docs for Google Hangouts connector](https://botkit.ai/docs/readme-google-hangouts.html)
* CiscoSpark bots are now officially WebexBots. Everything is backwards compatible thanks to the hard work of [@ObjectIsAdvantag](https://github.com/howdyai/botkit/pull/1349), but you should move to using `Botkit.webexbot()` instead of `Botkit.sparkbot()` ASAP.
[Botkit docs for Cisco Webex Teams](https://botkit.ai/docs/readme-webex.html)
[Read more about these changes](https://botkit.ai/docs/readme-webex.html#webex-rebrand).
* Tests have been reorganized and updated thanks to [@fastbean-au](https://github.com/howdyai/botkit/pull/1468).
* Errors that occur in the middleware pipeline will now cause `pipeline_error` event to be emitted. In addition, errors at specific stages of the pipeline will also emit their own events: `ingest_error`, `normalize_error`, `categorize_error` and `receive_error`. This should make it easier to debug problems in middleware. Thanks to [@Nop0x](https://github.com/howdyai/botkit/pull/1425). [Docs](https://botkit.ai/docs/core.html#middleware-error-events)
Handle a pipeline error:
```javascript
controller.on('pipeline_error', function(err, bot, message, stage_name) {
// ... handle it!
});
```
Handle a specific stage error:
```javascript
controller.on('ingest_error', function(err, bot, message) {
// ... handle it!
});
```
# 0.6.16
* Fixed issue in Cisco adapter introduced in 0.6.15
# 0.6.15
* [The documentation has moved to a dedicated docs site!](https://botkit.ai/docs) The transition begun 3 versions ago is now complete. [Any future changes to documentation should be submitted to this repo](https://github.com/howdyai/botkit-docs).
Some minor tweaks:
* Update to the way Webex Teams bots identify themselves [PR #1397](https://github.com/howdyai/botkit/pull/1397) Thank you to @jpjpjp
* Externalize the utterances object [#1085](https://github.com/howdyai/botkit/pull/1085) thanks to @hannanabdul55
* For Botkit web adapter, add `typingDelayFactor` config option, as well as `controller.setTypingDelayFactor()` to change how fast the bot types. Values between 0-1 will speed up the bot's typing, values above 1 will slow it down. - [Docs](https://botkit.ai/docs/readme-web.html#controllersettypingdelayfactordelayfactor) - [PR #1387](https://github.com/howdyai/botkit/pull/1387) Thanks to @schmitzl
Several updates to the TypeScript definitions:
* Add `collectResponse` to CoreBot's public types [#1358](https://github.com/howdyai/botkit/pull/1358) thanks to @pducks32
* Add missing methods to d.ts [#1359](https://github.com/howdyai/botkit/pull/1359) thanks to @ypresto
* Updating typings for interactive messages [#1318](https://github.com/howdyai/botkit/pull/1318) thanks to @jaalger
Thanks to frequent contributor @ouadie-lahdioui for the updates to Facebook Messenger:
* Add FB scheduled broadcast - [Docs](https://botkit.ai/docs/readme-facebook.html#cancel-a-scheduled-broadcast) - [#1354](https://github.com/howdyai/botkit/pull/1354)
* Add FB payment settings API - [Docs](https://botkit.ai/docs/readme-facebook.html#controllerapimessenger_profilepayment_settings) - [#1369](https://github.com/howdyai/botkit/pull/1369)
* Add FB Thread owner API - [Docs](https://botkit.ai/docs/readme-facebook.html#get-thread-owner) - [#1353](https://github.com/howdyai/botkit/pull/1353)
Support for Slack's new security feature:
* Request Signing with Slack Signing Secret - [Docs](https://botkit.ai/docs/readme-slack.html#securing-outgoing-webhooks-and-slash-commands) - [#1406](https://github.com/howdyai/botkit/pull/1406) thanks to @shishirsharma
# 0.6.14
* Fix for require_delivery option in Facebook bots. [PR #1312](https://github.com/howdyai/botkit/pull/1312)
* Errors encountered during Slack RTM connection process will now be reported to the callback function [PR #1335](https://github.com/howdyai/botkit/pull/1335)
* Updated methodology used to validate email addresses when restricting access to Cisco Spark bots
* Updated dependencies to latest stable versions
# 0.6.13
* Fix bugs and refactor handling of message actions, particularly as they relate to Botkit Studio scripts
* Adjust mechanism used to construct facebook quick reply payload in order to support future formats. [PR #1301](https://github.com/howdyai/botkit/pull/1301)
* Promisify Facebook Messenger profile API. [PR #1300](https://github.com/howdyai/botkit/pull/1300)
* Lower the log priority from 'log' to 'debug' for several messages in Botkit Core and Botkit Slack.
# 0.6.12
* [Botkit has a brand new docs site!](https://botkit.ai/docs) We have begun transitioning the documentation out of this repo into a [dedicated documentation repo](https://github.com/howdyai/botkit-docs).
* Remove dependency on Python introduced in 0.6.10. Thanks to @qiongfangzhang for the attention on that!
* Fix for Facebook Messenger send broadcast function. [PR #1280](https://github.com/howdyai/botkit/pull/1280) Thanks @OmranAbazid
* Extend Facebook's user profile object with locale. [PR #1265](https://github.com/howdyai/botkit/pull/1265) Thanks @julianusti
* Added 'picture' to Facebook User Profile endpoint. [PR #1264](https://github.com/howdyai/botkit/pull/1264) Thanks @se
* Add FB request thread control [PR #1257](https://github.com/howdyai/botkit/pull/1257) Thanks as always to @ouadie-lahdioui
* Remove requirement that Cisco Spark endpoint be SSL. [PR #1284](https://github.com/howdyai/botkit/pull/1284) thanks @akalsey and your beard.
* Add support for Slack's `users.lookupByEmail` API. [PR #1285](https://github.com/howdyai/botkit/pull/1285)
Thanks to @piglovesyou
* Fix to the way variables are copied between conversations while using Botkit Studio scripts
# 0.6.11
* For Botkit Studio users, added `controller.studio.getById()` for loading scripts
by their unique ID rather than by name or trigger. [Docs here](docs/readme-studio.md#controllerstudiogetbyid)
# 0.6.10
* Add support for Cisco Jabber. Thanks to @qiongfangzhang and @panx981389 and their team at Cisco for the contribution!
[Documentation for the Cisco Jabber adapter can be found here](docs/readme-ciscojabber.md)
* Updated `ciscospark` dependency to latest version and fixed some bugs in the example bot
* Update Twilio dependency to latest, along with small updates to adapter. Thanks @nishant-chaturvedi! [PR #1140](https://github.com/howdyai/botkit/pull/1140)
# 0.6.9
* Add 2 new middleware endpoints that occur during conversations - `conversationStart(bot, convo, next)` and `conversationEnd(bot, convo, next)`. [Some new documentation](docs/readme.md#conversation-events-and-middleware-endpoints)
* Conversations powered by Botkit Studio will now include `convo.context.script_name` and `convo.context.script_id` which point back to the script loaded from the Botkit Studio API
* When using Botkit Studio's execute script action, the resulting conversation object will have 2 additional context fields: `convo.context.transition_from` and `convo.context.transition_from_id` which will point to the script from which the user transitioned
* When using Botkit Studio's execute script action, the original conversation from which the user is transitioning will have 2 additional context fields: `convo.context.transition_to` and `convo.context.transition_to_id` which will point to the script to which the user transitioned
* Fix for Botkit Studio scripts which used "end and mark successful" action from a condition. Previously this would end, but not mark successful.
Merged Pull Requests:
* Make sure Facebook API errors are passed to callback if specified [PR #1225](https://github.com/howdyai/botkit/pull/1225)
* Refresh Microsoft Teams token when it has expired. [PR #1230](https://github.com/howdyai/botkit/pull/1230)
* Update TypeScript definition for Web bots [PR #1231](https://github.com/howdyai/botkit/pull/1231)
* Update TypeScript definition for bot.replyAndUpdate [PR #1232](https://github.com/howdyai/botkit/pull/1232)
* Fix for Microsoft teams button builder function [PR #1233](https://github.com/howdyai/botkit/pull/1233)
# 0.6.8
BIG UPDATE:
[Botkit now works on the web!](docs/readme-web.md) The new web connector supports websocket and webhook connections for sending and receiving messages. The brand new [Botkit Anywhere starter kit](https://github.com/howdyai/botkit-starter-web) includes a [customizable web chat client](https://github.com/howdyai/botkit-starter-web/blob/master/docs/botkit_web_client.md), and a [built-in chat server](https://github.com/howdyai/botkit-starter-web/blob/master/docs/botkit_chat_server.md). Of course, this works with the existing stack of Botkit tools and plugins!
New for Botkit Studio:
Developers using Botkit Studio to create and manage script content can now utilize a new message action in their conditional statements, or at the end of any thread.
It is now possible to direct your bot to seamlessly transition to a different Botkit Studio script. This allows for new patterns like interconnected menus, loops and branching conversations.
New core features:
Developers can now exclude specific types of events from being included in conversations using `controller.excludeFromConversations(event_name)`.
This has been applied to the Facebook connector, which will now exclude certain events automatically. [Docs](docs/readme.md#excluding-events-from-conversations)
The tick interval used for driving conversations can now be adjusted using `controller.setTickDelay(ms)`. [Docs](docs/readme.md#changing-the-speed-of-botkits-internal-tick)
Merged pull requests:
Our community of Botkit Core developers is more than 150 people strong! Thank you to all of the contributors who spent their precious time improving Botkit for everyone. There are more than a dozen pull requests included in this release!!
Core:
* Upgraded the `ws` dependency to latest - [Thanks @naktibalda](https://github.com/howdyai/botkit/pull/1154)
* Add delete method to in-memory store - [Thanks @naktibalda](https://github.com/howdyai/botkit/pull/1164)
* memory store: don't log warning after each save - [Thanks @naktibalda](https://github.com/howdyai/botkit/pull/1197)
Facebook:
This release contains a ton of updates to the Facebook connector, many of which were contributed by @ouadie-lahdioui!
* pass error object to the callbacks for failed send Api calls - [Thanks @nishant-chaturvedi](https://github.com/howdyai/botkit/pull/1147)
* Secures FB Graph API Requests with optional app secret [Docs](docs/readme-facebook.md#app-secret-proof) - [Thanks @ouadie-lahdioui](https://github.com/howdyai/botkit/pull/1170)
* Add Facebook Handover Protocol [Docs](docs/readme-facebook.md#handover-protocol) - [Thanks @ouadie-lahdioui](https://github.com/howdyai/botkit/pull/978)
* Include messaging_type property in all Botkit message sends [Docs](docs/readme-facebook.md#messaging-type)- [Thanks @ouadie-lahdioui](https://github.com/howdyai/botkit/pull/1171)
* Add FB Broadcast Messages API [Docs](https://github.com/howdyai/botkit/blob/068/docs/readme-facebook.md#broadcast-messages-api) - [Thanks @ouadie-lahdioui](https://github.com/howdyai/botkit/pull/1180)
* Add Facebook insights API [Docs](https://github.com/howdyai/botkit/blob/068/docs/readme-facebook.md#messaging-insights-api) - [Thanks @ouadie-lahdioui](https://github.com/howdyai/botkit/pull/1183)
* Include user's email in profile if returned from facebook API - [Thanks @iniq](https://github.com/howdyai/botkit/pull/1193)
* Properly trigger security session events from facebook workplace - [Thanks @ariel-learningpool](https://github.com/howdyai/botkit/pull/1110)
* fix bug when using Facebook Checkbox Plugin - [Thanks @shmuelgutman](https://github.com/howdyai/botkit/pull/1101)
Botkit will now exclude `message_delivered`, `message_echo` and `message_read` events from inclusion in conversations using the new `excludeFromConversations()` function. [Docs](docs/readme.md#excluding-events-from-conversations)
Slack:
These fixes for the Slack connector add more ways to protect your bot from potentially malicious incoming webhook events. Use them!!
* Add optional Slack token verification to config - [Thanks @shishisharma](https://github.com/howdyai/botkit/pull/981)
* Apply verification middleware only on the webhook endpoint - [Thanks @nishant-chaturvedi](https://github.com/howdyai/botkit/pull/1203)
# 0.6.7
Add `controller.studio.getScripts()` to load all a list of available scripts from Botkit Studio [Docs](docs/readme-studio.md#controllerstudiogetscripts)
Add handling (and error messages) for 401 response codes from Botkit Studio APIs that indicate a bad access token
## 0.6.6
Important fixes to Facebook and Cisco Spark connectors: A breaking change was introduced in 0.6.5 which has now been fixed.
Remove `crypto` dependency, now use built-in crypto library.
Update `botkit-studio-sdk` dependency to latest version.
## 0.6.5
Introducing the Botkit command line tool!
Run: `npm install -g botkit`
Then, you'll be able to set up a new Botkit project (based on one of our excellent starter kits!) by typing:
`botkit new --name "my bot"`
New helper functions:
Botkit bots for Slack, Cisco Spark, Microsoft Teams and Facebook now have support for additional helper functions:
`bot.getMessageUser(message)` returns a Promise that will receive a normalized user profile object for the user who sent the message.
`bot.getInstanceInfo()` returns a Promise that will receive a normalized instance object, with `identity` and `team` fields.
## 0.6.4
Fix for Cisco Spark: improved methodology for detecting and handling @mentions
Fix for Slack: allow multiple validation errors to be passed in to `bot.dialogError()`. Thanks @cfs! [PR #1080](https://github.com/howdyai/botkit/pull/1080)
Fix for Slack: fix for `bot.whisper()` Thanks to @jonchurch and @fletchrichman!
New: Botkit Studio scripts may now contain custom fields in message objects. This is in support of an upcoming feature in Botkit Studio which will allow developers to add define these custom fields in the Studio IDE.
## 0.6.3
New: Support for [Slack Dialogs](https://api.slack.com/dialogs), including:
* `bot.createDialog()` function [Docs](docs/readme-slack.md#dialogs)
* `bot.replyWithDialog()` function [Docs](docs/readme-slack.md#botreplywithdialog)
* `bot.api.dialog.open()` function
* `dialog_submission` event [Docs](docs/readme-slack.md#receive-dialog-submissions)
* `bot.dialogOk()` function [Docs](docs/readme-slack.md#botdialogok)
* `bot.dialogError()` function [Docs](docs/readme-slack.md#botdialogerror)
Fix: Cisco Spark bots will once again receive `direct_message` and `direct_mention` events. (Fix for [#1059](https://github.com/howdyai/botkit/issues/1059))
## 0.6.2
Fix bug in Facebook connector: call `startTicking()` as part of object instantiation. This was missing in 0.6 and 0.6.1
Move call to `startTicking()` in TwilioIPM connector to make it consistent with other connectors.
Fix: Catch 202 response code that does not have a JSON response body. This status sometimes comes back from the MS Teams API when a message has been queued for delivery.
## 0.6.1
Fix bugs in Botframework and ConsoleBot connectors that caused messages not to send. Resolves #1033.
Fix typo in Twilio connector that caused attached media to fail. Thanks @jpowers! [PR #1023](https://github.com/howdyai/botkit/pull/1023)
Fix missing `bodyParser` module in Facebook connector. Resolves #1041.
New: Add support for the new `conversations` APIs for Slack. [Read about this new API here](https://api.slack.com/docs/conversations-api).
New: Add `usergroups` APIs for Slack. Thanks to @digitalspecialists for this! [PR #1001](https://github.com/howdyai/botkit/pull/1001)
Change: Facebook `message_echo` webhooks will now emit `message_echo` events instead of `message_received` events to distinguish them from messages sent by users.
## 0.6.0
This version features some BIG CHANGES!
**New platform support:**
[Microsoft Teams](docs/readme-teams.md) is now officially supported with its own connector, including new features in [Botkit Studio](https://studio.botkit.ai) like authoring of Teams-specific attachments, an app package builder and configuration manager, and [a new starter kit](https://github.com/howdyai/botkit-starter-teams).
[Read the full docs for Botkit for Microsoft Teams](docs/readme-teams.md)
**Major changes to message handling code:**
[Introducing the Botkit Message Pipeline](docs/readme-pipeline.md), a formalized process for Botkit's handling of incoming and outgoing messages. All of the platform connectors have been refactored to use this new series of middleware functions, and are now implemented in a uniform way.
Developers who make use of Botkit's middleware system should [take time to read this update](docs/readme-pipeline.md). Most current middleware functions will continue to work as expected, but mild changes may be desirable to update these functions to use Botkit's latest features.
In addition, developers who use third party middleware plugins should carefully retest their applications after upgrading to version 0.6, as these plugins may need to be updated for full compatibility.
**Upgrade Guide:**
This version of Botkit deprecates the `receive_via_postback` and `interactive_replies` options
that caused button clicks to be treated as typed messages. These and other small changes to the way Botkit emits events may require minor updates to some Botkit apps.
[Upgrading from Botkit 0.5 or lower? Read this guide!](docs/howto/upgrade_05to06.md)
## 0.5.8
Slack: Support for sending ephemeral messages with `bot.whisper()` and `bot.sendEphemeral()`. In addition, any message with `message.ephemeral` set to true will be sent with `bot.sendEphemeral()` automatically. [Read documentation here.](docs/readme-slack.md#ephemeral-messages) Thanks to [@jonchurch](https://github.com/howdyai/botkit/pull/958)
Slack: Add support for `bot.api.files.sharedPublicURL()` method. Thanks to [@GitTristan](https://github.com/howdyai/botkit/pull/912)
Facebook: Support for using [message tags](https://developers.facebook.com/docs/messenger-platform/message-tags). [Read documentation here.](docs/readme-facebook.md#message-tags) Thanks to [@ouadie-lahdioui](https://github.com/howdyai/botkit/pull/960)
Facebook: Support for using Facebook's new built-in NLP tools. [Read documentation here.](docs/readme-facebook.md#built-in-nlp) Thanks to [@ouadie-lahdioui](https://github.com/howdyai/botkit/pull/943) for this one too!!
Twilio SMS: Add support for sending MMS messages (file attachments) via Twilio. [Read documentation here.](docs/readme-twiliosms.md#sending-media-attachments-mms) Thanks to [@krismuniz](https://github.com/howdyai/botkit/pull/951)!
Cisco Spark: Emit a console warning when a bot receives messages from outside the allowed domain list. Thanks to [@MathRobin](https://github.com/howdyai/botkit/pull/918)!
New: Typescript declarations! Thanks to [@uny and @naktibalda](https://github.com/howdyai/botkit/pull/953) for their work on this.
## 0.5.7
Lock in ciscospark dependency at version 1.8.0 until further notice due to breaking changes in more recent versions.
## 0.5.6
Fix for Botkit Studio-powered bots: Facebook attachments can now be added without buttons
Fix for Cisco Spark: Bot mentions will now reliably be pruned from message, regardless of what client originated the message
Fix for Cisco Spark: startPrivateConversationWithPersonID has been fixed.
## 0.5.5
*Introducing Botkit for SMS!* Botkit bots can now send and receive messages using Twilio's Programmable SMS API!
Huge thanks to @krismuniz who spearheaded this effort! [Read all about Twilio SMS here](docs/readme-twiliosms.md)
*New unit tests* have been added, thanks to the ongoing efforts of @colestrode, @amplicity and others.
This release includes coverage of the Botkit core library and the Slack API library.
This is an [ongoing effort](https://github.com/howdyai/botkit/projects/3), and we encourage interested developers to get involved!
Add missing error callback to catch Slack condition where incoming messages do not match a team in the database.
[PR #887](https://github.com/howdyai/botkit/pull/887) thanks to @alecl!
Add support for Facebook attachment upload api [PR #899](https://github.com/howdyai/botkit/pull/899) thanks @ouadie-lahdioui!
Read docs about this feature [here](docs/readme-facebook.md#attachment-upload-api)
Fixed issue with Slack message menus. [PR #769](https://github.com/howdyai/botkit/pull/769)
Fixed confusing parameter in JSON storage system. `delete()` methods now expect object id as first parameter. [PR #854](https://github.com/howdyai/botkit/pull/854) thanks to @mehamasum!
All example bot scripts have been moved into the [examples/](examples/) folder. Thanks @colestrode!
Fixes an instance where Botkit was not automatically responding to incoming webhooks from Cisco with a 200 status. [PR #843](https://github.com/howdyai/botkit/pull/843)
Updated dependencies to latest: twilio, ciscospark, https-proxy-agent, promise
## 0.5.4
Fix for [#806](https://github.com/howdyai/botkit/issues/806) - new version of websocket didn't play nice with Slack's message servers
Support for Slack's new [rtm.connect method](https://api.slack.com/methods/rtm.connect).
Use rtm.connect instead of rtm.start when connecting an RTM bot to Slack. This should performance during connections.
## 0.5.3
Add a new [readme file](readme.md) and moved other documentation into `docs/` folder.
Update all dependencies to their most recent versions
Change behavior of conversation timeouts. [New behavior is documented here.](docs/readme.md#handling-conversation-timeouts)
Support for Facebook Messenger's new "Home URL" setting [PR #793](https://github.com/howdyai/botkit/pull/793)
[New features documented here.](https://github.com/howdyai/botkit/blob/master/docs/readme-facebook.md#controllerapimessenger_profilehome_url)
Support for including parameters in Facebook codes. [PR #790](https://github.com/howdyai/botkit/pull/790)
[Docs here.](https://github.com/howdyai/botkit/blob/master/docs/readme-facebook.md#messenger-code-api)
Support for Facebook's new "target audience" APIs [PR #798](https://github.com/howdyai/botkit/pull/798)
Support for additional Slack user APIs, including 'user.profile.set' and 'user.profile.get'. [PR #780](https://github.com/howdyai/botkit/pull/780)
Add support for `createPrivateConversation()` in Slack bots [PR #586](https://github.com/howdyai/botkit/pull/586)
*beforeThread Hooks:*
These new hooks allow developers to execute custom functionality as a conversation transitions from one thread to another.
This enables asynchronous operations like database and API calls to be made mid-conversation, and can be used to add additional
template variables (using `convo.setVar()`), or change the direction of the conversation (using `convo.gotoThread()`).
Add `convo.beforeThread()`, a plugin hook that fires before a conversation thread begins. [Docs](docs/readme.md#convobeforethread)
Add `controller.studio.beforeThread()`, a plugin hook that fires before a Botkit Studio-powered conversation thread begins. [Docs](docs/readme-studio.md#controllerstudiobeforethread)
## 0.5.2
*Changes for Slack:*
Add support for Slack's new `chat.unfurl` method for use with [App Unfurls](https://api.slack.com/docs/message-link-unfurling)
Add additional Slack's team API methods [PR #677](https://github.com/howdyai/botkit/pull/677)
Botkit will now store the value of the state parameter used in the oauth flow in the team's record [PR #657](https://github.com/howdyai/botkit/pull/657)
Fixes slash commands when using internal webserver [PR #699](https://github.com/howdyai/botkit/pull/699)
Add error logging for say and spawn.run [PR #691](https://github.com/howdyai/botkit/pull/691)
*Changes for Facebook Messenger:*
Updates to Facebook's Messenger Profile APIs (previously thread settings APIs) [PR #690](https://github.com/howdyai/botkit/pull/690)
Add ability to retrieve Messenger Code image [PR #689](https://github.com/howdyai/botkit/pull/689)
Add support for Facebook's domain whitelisting API [PR #573](https://github.com/howdyai/botkit/pull/573)
Add tests for handleWebhookPayload in Facebook bot flow [PR #678](https://github.com/howdyai/botkit/pull/678)
Add Facebook account linking support [PR #578](https://github.com/howdyai/botkit/pull/578)
Add ability to customize api url for Facebook [PR #576](https://github.com/howdyai/botkit/pull/567)
*Changes to Botkit Core:*
Add "done" and "exit" as a utterances for "quit" [PR #498](https://github.com/howdyai/botkit/pull/498)
*Thanks*
Thanks to @jhsu @davidwneary @mbensch @alecl @ouadie-lahdioui @agamrafaeli @katsgeorgeek @jfairley
## 0.5.1
Fixes for Cisco Spark:
Allow port number to be included in public_address
Fix to issue when using retrieveFile()
Fixes for Slack:
Add support for `channel.replies` API
Fixes for Facebook:
Add support for [Facebook account linking](https://github.com/howdyai/botkit/pull/645)
## 0.5.0
Add support for bots on [Cisco Spark](http://developer.ciscospark.com)! For information about getting started, and to learn about new Botkit features that are specific to this platform, [check out our new Cisco Spark readme. ](readme-ciscospark.md)
Botkit will now send a user agent header on all requests to the Slack API
When building for Slack, developers may now override the root URL of the API by specifying `api_root` in the configuration in order to use mocked testing endpoints or use the Slack API through a proxy.
## 0.4.10
Add support for [Slack Enterprise Grid](https://slack.com/enterprise), for more information [read](https://blog.howdy.ai/beam-us-up-botkit-in-the-enterprise-e6133e0cbdf3#.o3md9lw29)
Add Support for Slack's new thread system, including:
[bot.replyInThread()](readme-slack.md#botreplyinthread) to create a threaded reply
[bot.startConversationInThread()](readme-slack.md#botstartconversationinthread) to create and immediately start a conversation in a thread
[bot.createConversationInThread()](readme-slack.md#botcreateconversationinthread) to create a conversation in a thread
Add new `heard` middleware endpoint, which fires _after_ a pattern has been matched, but before the handler function is called. This allows developers to enrich messages with NLP tools or other plugins, but do so only when the original message matches specific criteria.
Add new `capture` middleware endpoint, which fires _after_ a user responds to a `convo.ask` question but _before_ the related handler function is called. This allows developers to change the value that is captured, or capture additional values such as entities returned by an NLP plugin.
## 0.4.9
`controller.version()` will now report the currently installed version of Botkit.
Change to how quick replies are rendered via Botkit Studio's API
## 0.4.7
Add support for Facebook Messenger "location" quick replies [PR #568](https://github.com/howdyai/botkit/pull/568)
Add support for Slack's new users.setPresence API [PR #562](https://github.com/howdyai/botkit/pull/562)
Add support for Slack's new reminders API [PR #580](https://github.com/howdyai/botkit/pull/580)
## 0.4.6
Change to controller.studio.runTrigger: Will now resolve promise regardless of whether a trigger was matched
## 0.4.5
Bug fix: Fix detection of Slackbot interactive callbacks
## 0.4.4
Changes:
Add referral field to `facebook_postback` events, if set [PR #552](https://github.com/howdyai/botkit/pull/553)
Refactor handling of incoming webhooks from Slack and Facebook in order to make it easier for developers to create custom endpoints and/or integrate Botkit into existing Express applications.
Add `controller.handleWebhookPayload()` to process a raw webhook payload and ingest it into Botkit
Make stale connection detection configurable [PR #505](https://github.com/howdyai/botkit/pull/505)
DDOS Vulnerability Fix - Secure Facebook Webhook [PR #555](https://github.com/howdyai/botkit/pull/555)
Bug fixes:
Fix an issue where a custom redirect_uri would be rejected by Slack's oauth verification
Fix bot_channel_join and bot_group_join with Slack Events API [PR #514](https://github.com/howdyai/botkit/pull/514)
Fix path to static content directory [PR #546](https://github.com/howdyai/botkit/pull/546)
`retry` and `send_via_rtm` options are now properly associated with the controller object.
Fix some issues pertaining to typing indicators and the slack RTM [PR #533](https://github.com/howdyai/botkit/pull/533)
## 0.4.3
Adds [convo.transitionTo()](readme.md#convotransitionto), a new feature for creating smoother transitions between conversation threads
Adds support for new Facebook Messenger [thread settings APIs](readme-facebook.md#thread-settings-api)
which enable developers to set and manage the 'getting started' screen and persistent menus.
Adds support for Facebook Messenger attachment in [Botkit Studio](https://studio.botkit.ai)
Adds a check to ensure messages are properly received by Facebook and Slack before proceeding to next message in a conversation.
Adds optional `require_delivery` option for Facebook and Slack bots which tells Botkit to wait to receive a delivery confirmation from the platform before sending further messages. [Slack info](readme-slack.md#require-delivery-confirmation-for-rtm-messages) [Facebook info](readme-facebook.md#require-delivery-confirmation)
Change: Receiving `facebook_postback` events as normal "spoken" messages now requires the `{receive_via_postback:true}` option be set on the controller. [Read more](readme-facebook.md#receive-postback-button-clicks-as-typed-messages)
## 0.4.2
Support for Slack's [Events API](https://api.slack.com/events-api) is here, thanks to the Botkit contributor community. [Read documentation here](https://github.com/howdyai/botkit/blob/master/readme-slack.md#events-api)
Bug fix:
Fixes an issue with setting the default IP address for the Express server introduced in 0.4.1
## 0.4.1
This release contains many small fixes and updates to keep up with the ever changing platforms!
BIG CHANGES:
Slack bots will now send messages via the Web API instead of the RTM. This behavior can be changed by passing `send_via_rtm: true` to `controller.spawn()`
Adds [ConsoleBot](lib/ConsoleBot.js) for creating bots that work on the command line
Adds a new [Middleware Readme](readme-middlewares.md) for documenting the existing middleware modules
Adds an example for using quick replies in the [Facebook Example Bot](examples/facebook_bot.js)
Adds additional fields to Facebook messages to specify if they are `facebook_postback`s or normal messages.
Adds optional `hostname` field to constructor functions to bind Express to a specific IP.
Fixes for Slack's files.upload API
Merge in numerous pull requests from the community:
[PR #461](https://github.com/howdyai/botkit/pull/461)
[PR #465](https://github.com/howdyai/botkit/pull/465)
[PR #466](https://github.com/howdyai/botkit/pull/466)
[PR #469](https://github.com/howdyai/botkit/pull/469)
[PR #472](https://github.com/howdyai/botkit/pull/472)
[PR #474](https://github.com/howdyai/botkit/pull/474)
[PR #434](https://github.com/howdyai/botkit/pull/434)
[PR #435](https://github.com/howdyai/botkit/pull/435)
[PR #440](https://github.com/howdyai/botkit/pull/440)
[PR #441](https://github.com/howdyai/botkit/pull/441)
[PR #443](https://github.com/howdyai/botkit/pull/443)
[PR #446](https://github.com/howdyai/botkit/pull/446)
[PR #448](https://github.com/howdyai/botkit/pull/448)
## 0.4
Add support for Botkit Studio APIs. [More Info](readme-studio.md)
Substantially expanded the documentation regarding Botkit's [conversation thread system](readme.md#conversation-threads).
Add support for Microsoft Bot Framework. The [Microsoft Bot Framework](https://botframework.com) makes it easy to create a single bot that can run across a variety of messaging channels including [Skype](https://skype.com), [Group.me](https://groupme.com), [Facebook Messenger](https://messenger.com), [Slack](https://slack.com),
[Telegram](https://telegram.org/), [Kik](https://www.kik.com/), [SMS](https://www.twilio.com/), and [email](https://microsoft.office.com). [More Info](readme-botframework.md)
Updates to Facebook Messenger connector to support features like message echoes, read receipts, and quick replies.
Merged numerous pull requests from the community:
[PR #358](https://github.com/howdyai/botkit/pull/358)
[PR #361](https://github.com/howdyai/botkit/pull/361)
[PR #353](https://github.com/howdyai/botkit/pull/353)
[PR #363](https://github.com/howdyai/botkit/pull/363)
[PR #320](https://github.com/howdyai/botkit/pull/320)
[PR #319](https://github.com/howdyai/botkit/pull/319)
[PR #317](https://github.com/howdyai/botkit/pull/317)
[PR #299](https://github.com/howdyai/botkit/pull/299)
[PR #298](https://github.com/howdyai/botkit/pull/298)
[PR #293](https://github.com/howdyai/botkit/pull/293)
[PR #256](https://github.com/howdyai/botkit/pull/256)
[PR #403](https://github.com/howdyai/botkit/pull/403)
[PR #392](https://github.com/howdyai/botkit/pull/392)
In order to learn about and better serve our user community, Botkit now sends anonymous usage stats to stats.botkit.ai. To learn about opting out of stats collection, [read here](readme.md#opt-out-of-stats).
## 0.2.2
Add support for Slack Interactive Messages.
Add example of Slack button application that provides a bot that uses interactive messages.
New functionality in Slack bot: Botkit will track spawned Slack bots and route incoming webhooks to pre-existing RTM bots. This enables RTM bots to reply to interactive messages and slash commands.
## 0.2.1
Improves Slack RTM reconnects thanks to @selfcontained [PR #274](https://github.com/howdyai/botkit/pull/274)
## 0.2
Adds support for Twilio IP Messaging bots
Add example bot: twilio_ipm_bot.js
## 0.1.2
*Slack changes:*
Adds authentication of incoming Slack webhooks if token specified. [More info](readme_slack.md#securing-outgoing-webhooks-and-slash-commands) [Thanks to [@sgud](https://github.com/howdyai/botkit/pull/167)]
Improves support for direct_mentions of bots in Slack (Merged [PR #189](https://github.com/howdyai/botkit/pull/189))
Make the oauth identity available to the user of the OAuth endpoint via `req.identity` (Merged [PR #174](https://github.com/howdyai/botkit/pull/174))
Fix issue where single team apps had a hard time receiving slash command events without funky workaround. (closes [Issue #108](https://github.com/howdyai/botkit/issues/108))
Add [team_slashcommand.js](/examples/slack/team_slashcommand.js) and [team_outgoingwebhook.js](/examples/slack/team_outgoingwebhook.js) to the examples folder.
*Facebook changes:*
The `attachment` field may now be used by Facebook bots within a conversation for both convo.say and convo.ask. In addition, postback messages can now be received as the answer to a convo.ask in addition to triggering their own facebook_postback event. [Thanks to [@crummy](https://github.com/howdyai/botkit/pull/220) and [@tkornblit](https://github.com/howdyai/botkit/pull/208)]
Include attachments field in incoming Facebook messages (Merged [PR #231](https://github.com/howdyai/botkit/pull/231))
Adds built-in support for opening a localtunnel.me tunnel to expose Facebook webhook endpoint while developing locally. (Merged [PR #234](https://github.com/howdyai/botkit/pull/234))
## 0.1.1
Fix issue with over-zealous try/catch in Slack_web_api.js
## 0.1.0
Adds support for Facebook Messenger bots.
Rename example bot: bot.js became slack_bot.js
Add example bot: facebook_bot.js
## 0.0.15
Changes conversation.ask to use the same pattern matching function as
is used in `hears()`
Adds `controller.changeEars()` Developers can now globally change the
way Botkit matches patterns.
## 0.0.14
Add new middleware hooks. Developers can now change affect a message
as it is received or sent, and can also change the way Botkit matches
patterns in the `hears()` handler.
## 0.0.~
Next time I promise to start a change log at v0.0.0
================================================
FILE: lerna.json
================================================
{
"packages": [
"packages/*"
],
"version": "independent"
}
================================================
FILE: package.json
================================================
{
"name": "botkit-packages",
"private": true,
"scripts": {
"postinstall": "lerna bootstrap --hoist",
"build": "lerna run build",
"test": "lerna run build ; lerna run test",
"build-docs": "lerna run build-docs",
"eslint": "./node_modules/.bin/eslint ./packages/*/src/*.ts ./packages/*/src/**/*.ts",
"eslint-fix": "./node_modules/.bin/eslint ./packages/*/src/*.ts ./packages/*/src/**/*.ts --fix",
"lerna:pack": "lerna run pack"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.16.0",
"@typescript-eslint/parser": "^5.16.0",
"eslint": "^8.11.0",
"eslint-config-standard": "^16.0.3",
"lerna": "^4.0.0",
"mocha": "^9.1.3",
"nyc": "^15.1.0",
"typescript": "^3.7.5"
}
}
================================================
FILE: packages/botbuilder-adapter-facebook/.eslintrc.js
================================================
module.exports = {
"extends": "standard",
"rules": {
"semi": [2, "always"],
"indent": [2, 4],
"no-return-await": 0,
"camelcase": 0,
"no-unused-vars": 0,
"@typescript-eslint/indent": 0,
"@typescript-eslint/ban-ts-ignore": 1,
"@typescript-eslint/no-object-literal-type-assertion": 0,
"@typescript-eslint/explicit-member-accessibility": 1,
"space-before-function-paren": [2, {
"named": "never",
"anonymous": "never",
"asyncArrow": "always"
}],
"template-curly-spacing": [2, "always"]
}
};
================================================
FILE: packages/botbuilder-adapter-facebook/.gitignore
================================================
node_modules/
.env
lib/
.nyc_output/
================================================
FILE: packages/botbuilder-adapter-facebook/CHANGELOG.md
================================================
# botbuilder-adapter-facebook changelog
# 1.0.11
* Update dependencies to Botkit 4.10, Bot Framework 4.10
# 1.0.10
* Update dependencies to Botkit 4.9, Bot Framework 4.9
# 1.0.7
* Fix for Facebook typing indicators. To send a typing indicator, use `await bot.say({sender_action: 'typing_on'});`
# 1.0.6
* Query parameters for GET apis can now be passed in using an object parameter (like POST): [Thanks to @adantoscano](https://github.com/howdyai/botkit/pull/1768)
* Update dependencies (Bot Framework to 4.6, Botkit to 4.6)
# 1.0.5
* Properly export the facebook_api class so it can be used directly. Thanks to [@luckyluo](https://github.com/howdyai/botkit/pull/1766)!
# 1.0.4
* Update dependencies (Bot Framework to 4.5.2, Botkit to 4.5)
* Fix for over-pruning of quick replies and attachments in dialogs
# 1.0.3
* Add `enable_incomplete` option to allow adapter to start without a complete config.
# 1.0.2
This was the first public release
================================================
FILE: packages/botbuilder-adapter-facebook/LICENSE.md
================================================
Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: packages/botbuilder-adapter-facebook/package.json
================================================
{
"name": "botbuilder-adapter-facebook",
"version": "1.0.12",
"description": "Connect Botkit or BotBuilder to Facebook Messenger",
"main": "lib/index.js",
"typings": "./lib/index.d.ts",
"files": [
"/lib",
"/src"
],
"scripts": {
"build": "tsc",
"test": "tsc ; nyc mocha tests/*.tests.js",
"eslint": "./node_modules/.bin/eslint --fix src/*",
"pack": "npm pack"
},
"author": "Microsoft Corp.",
"license": "MIT",
"keywords": [
"facebook",
"facebook messenger",
"botkit",
"botbuilder",
"botframework",
"bots",
"chatbots",
"azure"
],
"homepage": "https://github.com/howdyai/botkit/blob/master/packages/botbuilder-adapter-facebook#readme",
"bugs": {
"url": "https://github.com/howdyai/botkit/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/howdyai/botkit.git"
},
"dependencies": {
"botbuilder": "^4.15.0",
"botkit": "^4.15.0",
"debug": "^4.1.0"
},
"devDependencies": {
"eslint": "^8.3.0",
"eslint-config-standard": "^16.0.3",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.1",
"eslint-plugin-standard": "^4.0.1"
}
}
================================================
FILE: packages/botbuilder-adapter-facebook/readme.md
================================================
# botbuilder-adapter-facebook
Connect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmjs.com/package/botbuilder) to Facebook Messenger.
This package contains an adapter that communicates directly with the Facebook Messenger API,
and translates messages to and from a standard format used by your bot. This package can be used alongside your favorite bot development framework to build bots that work with Facebook Messenger.
## Install Package
Add this package to your project using npm:
```bash
npm install --save botbuilder-adapter-facebook
```
Import the adapter class into your code:
```javascript
const { FacebookAdapter } = require('botbuilder-adapter-facebook');
```
## Get Started
If you are starting a brand new project, [follow these instructions to create a customized application template.](../docs/index.md)
## Use FacebookAdapter in your App
FacebookAdapter provides a translation layer for Botkit and BotBuilder so that bot developers can connect to Facebook Messenger and have access to Facebook's API.
### Botkit Basics
When used in concert with Botkit, developers need only pass the configured adapter to the Botkit constructor, as seen below. Botkit will automatically create and configure the webhook endpoints and other options necessary for communicating with Facebook.
Developers can then bind to Botkit's event emitting system using `controller.on` and `controller.hears` to filter and handle incoming events from the messaging platform. [Learn more about Botkit's core feature →](../docs/index.md).
[A full description of the FacebookAdapter options and example code can be found in the class reference docs.](../docs/reference/facebook.md#create-a-new-facebookadapter)
```javascript
const adapter = new FacebookAdapter({
verify_token: process.env.FACEBOOK_VERIFY_TOKEN,
app_secret: process.env.FACEBOOK_APP_SECRET,
access_token: process.env.FACEBOOK_ACCESS_TOKEN
});
adapter.use(new FacebookEventTypeMiddleware());
const controller = new Botkit({
adapter,
// ...other options
});
controller.on('message', async(bot, message) => {
await bot.reply(message, 'I heard a message!');
});
```
### BotBuilder Basics
Alternately, developers may choose to use `FacebookAdapter` with BotBuilder. With BotBuilder, the adapter is used more directly with a webserver, and all incoming events are handled as [Activities](https://docs.microsoft.com/en-us/javascript/api/botframework-schema/activity?view=botbuilder-ts-latest).
```javascript
const { FacebookAdapter } = require('botbuilder-adapter-facebook');
const restify = require('restify');
const adapter = new FacebookAdapter({
verify_token: process.env.FACEBOOK_VERIFY_TOKEN,
app_secret: process.env.FACEBOOK_APP_SECRET,
access_token: process.env.FACEBOOK_ACCESS_TOKEN
});
const server = restify.createServer();
server.use(restify.plugins.bodyParser());
server.use(restify.plugins.queryParser());
server.get('/api/messages', (req, res) => {
if (req.query['hub.mode'] === 'subscribe') {
if (req.query['hub.verify_token'] === process.env.FACEBOOK_VERIFY_TOKEN) {
const val = req.query['hub.challenge'];
res.sendRaw(200, val);
} else {
console.log('failed to verify endpoint');
res.send('OK');
}
}
});
server.post('/api/messages', (req, res) => {
adapter.processActivity(req, res, async(context) => {
await context.sendActivity('I heard a message!');
});
});
server.listen(process.env.port || process.env.PORT || 3000, () => {
console.log(`\n${ server.name } listening to ${ server.url }`);
});
```
### Multi-page Support
In the examples above, the `FacebookAdapter` constructor received a single `access_token` parameters. This binds the adapter and all API calls it makes to a single Facebook page.
To use `FacebookAdapter` with multiple Facebook pages, the constructor must receive a function as a paramter named `getAccessTokenForPage` that is responsible for returning a token value when provided a Facebook page ID. The application must implement its own mechanism for securely storing and retrieving the token.
```javascript
const adapter = new FacebookAdapter({
verify_token: process.env.FACEBOOK_VERIFY_TOKEN,
app_secret: process.env.FACEBOOK_APP_SECRET,
getAccessTokenForPage: async(pageId) => {
// do something to fetch the page access token for pageId.
return token;
}
});
```
## Class Reference
* [FacebookAdapter](../docs/reference/facebook.md#facebookadapter)
* [BotWorker Extensions](../docs/reference/facebook.md#facebookbotworker)
* [Facebook API Client](../docs/reference/facebook.md#facebookapi)
## Event List
[Botkit event types are controlled by the FacebookEventMiddleware](../docs/reference/facebook.md#facebookeventtypemiddleware).
Without this middleware applied, Botkit bots will receive `message` events when a user types a message or clicks a postback_button, and an `event` event for all other types of event received from Facebook.
Most Botkit developers who plan to use features above and beyond Facebook's send API should enable this middleware.
## Calling Facebook APIs
This package also includes [a minimal Facebook API client](../docs/reference/facebook.md#facebookapi) for developers who want to use one of the many available API endpoints.
In Botkit handlers, the `bot` worker object passed into all handlers will contain a `bot.api` field that contains the client, preconfigured and ready to use.
To use with a BotBuilder application, the adapter provides the [getAPI() method](../docs/reference/facebook.md#getapi).
```javascript
controller.on('message', async(bot, message) {
// call the facebook API to get the bot's page identity
let identity = await bot.api.callAPI('/me', 'GET', {});
await bot.reply(message,`My name is ${ identity.name }`);
});
```
## Botkit Extensions
In Botkit handlers, the `bot` worker for Facebook contains [all of the base methods](../docs/reference/core.md#BotWorker) as well as the following platform-specific extensions:
### Use attachments, quick replies and other rich message features
Botkit will automatically construct your outgoing messages according to Facebook's specifications. To use attachments, quick replies or other features, add them to the message object used to create the reply:
```javascript
await bot.reply(message, {
text: 'Choose a button',
quick_replies: [
{
"content_type":"text",
"title":"Foo",
"payload":"true"
},
{
"content_type":"text",
"title":"Bar",
"payload":"false"
}
]
});
```
### [Spawn a worker for a specific page](../docs/reference/facebook.md#create-a-new-facebookbotworker)
For a bot that works with multiple pages, it is possible to spawn bot workers bound to a specific page by passing the page ID as the primary parameter to `controller.spawn()`:
```javascript
let bot = await controller.spawn(FACEBOOK_PAGE_ID);
```
### [bot.startConversationWithUser()](../docs/reference/facebook.md#startconversationwithuser)
Use this method to initiate a conversation with a user. After calling this method, any further actions carried out by the bot worker will happen with the specified user.
This can be used to create or resume conversations with users that are not in direct response to an incoming message, like those sent on a schedule or in response to external events.
## Community & Support
Join our thriving community of Botkit developers and bot enthusiasts at large.
Over 10,000 members strong, [our open Slack group](https://community.botkit.ai) is
_the place_ for people interested in the art and science of making bots.
Come to ask questions, share your progress, and commune with your peers!
You can also find help from members of the Botkit team [in our dedicated Cisco Spark room](https://eurl.io/#SyNZuomKx)!
## About Botkit
Botkit is a part of the [Microsoft Bot Framework](https://dev.botframework.com).
Want to contribute? [Read the contributor guide](https://github.com/howdyai/botkit/blob/master/CONTRIBUTING.md)
Botkit is released under the [MIT Open Source license](https://github.com/howdyai/botkit/blob/master/LICENSE.md)
================================================
FILE: packages/botbuilder-adapter-facebook/src/botworker.ts
================================================
/**
* @module botbuilder-adapter-facebook
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
import { Botkit, BotWorker } from 'botkit';
import { FacebookAPI } from './facebook_api';
/**
* This is a specialized version of [Botkit's core BotWorker class](core.md#BotWorker) that includes additional methods for interacting with Facebook.
* It includes all functionality from the base class, as well as the extension methods below.
*
* When using the FacebookAdapter with Botkit, all `bot` objects passed to handler functions will include these extensions.
*/
export class FacebookBotWorker extends BotWorker {
/**
* A copy of the FacebookAPI client giving access to `let res = await bot.api.callAPI(path, method, parameters);`
*/
public api: FacebookAPI;
/**
* Reserved for use internally by Botkit's `controller.spawn()`, this class is used to create a BotWorker instance that can send messages, replies, and make other API calls.
*
* When used with the FacebookAdapter's multi-tenancy mode, it is possible to spawn a bot instance by passing in the Facebook page ID representing the appropriate bot identity.
* Use this in concert with [startConversationWithUser()](#startConversationWithUser) and [changeContext()](core.md#changecontext) to start conversations
* or send proactive alerts to users on a schedule or in response to external events.
*
* ```javascript
* let bot = await controller.spawn(FACEBOOK_PAGE_ID);
* ```
* @param botkit The Botkit controller object responsible for spawning this bot worker.
* @param config Normally, a DialogContext object. Can also be the ID of a Facebook page managed by this app.
*/
public constructor(botkit: Botkit, config: any) {
// allow a page id to be passed in
if (typeof config === 'string') {
const page_id = config;
config = {
// an activity is required to spawn the bot via the api
activity: {
channelId: 'facebook',
recipient: {
id: page_id
}
}
};
}
super(botkit, config);
}
// TODO: Typing indicators
/**
* Change the operating context of the worker to begin a conversation with a specific user.
* After calling this method, any calls to `bot.say()` or `bot.beginDialog()` will occur in this new context.
*
* This method can be used to send users scheduled messages or messages triggered by external events.
* ```javascript
* let bot = await controller.spawn(FACEBOOK_PAGE_ID);
* await bot.startConversationWithUser(FACEBOOK_USER_PSID);
* await bot.say('Howdy human!');
* ```
*
* @param userId the PSID of a user the bot has previously interacted with
*/
public async startConversationWithUser(userId): Promise<void> {
await this.changeContext({
channelId: 'facebook',
// @ts-ignore
conversation: { id: userId },
bot: this.getConfig('activity').recipient,
// @ts-ignore
user: { id: userId }
});
}
}
================================================
FILE: packages/botbuilder-adapter-facebook/src/facebook_adapter.ts
================================================
/**
* @module botbuilder-adapter-facebook
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
import { Activity, ActivityTypes, BotAdapter, TurnContext, ConversationReference, ResourceResponse } from 'botbuilder';
import * as Debug from 'debug';
import { FacebookBotWorker } from './botworker';
import { FacebookAPI } from './facebook_api';
import * as crypto from 'crypto';
const debug = Debug('botkit:facebook');
/**
* Connect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmjs.com/package/botbuilder) to Facebook Messenger.
*/
export class FacebookAdapter extends BotAdapter {
/**
* Name used by Botkit plugin loader
* @ignore
*/
public name = 'Facebook Adapter';
/**
* Object containing one or more Botkit middlewares to bind automatically.
* @ignore
*/
public middlewares;
/**
* A customized BotWorker object that exposes additional utility methods.
* @ignore
*/
public botkit_worker = FacebookBotWorker;
private options: FacebookAdapterOptions;
/**
* Create an adapter to handle incoming messages from Facebook and translate them into a standard format for processing by your bot.
*
* The Facebook Adapter can be used in 2 modes:
* * bound to a single Facebook page
* * multi-tenancy mode able to serve multiple pages
*
* To create an app bound to a single Facebook page, include that page's `access_token` in the options.
*
* To create an app that can be bound to multiple pages, include `getAccessTokenForPage` - a function in the form `async (pageId) => page_access_token`
*
* To use with Botkit:
* ```javascript
* const adapter = new FacebookAdapter({
* verify_token: process.env.FACEBOOK_VERIFY_TOKEN,
* app_secret: process.env.FACEBOOK_APP_SECRET,
* access_token: process.env.FACEBOOK_ACCESS_TOKEN
* });
* const controller = new Botkit({
* adapter: adapter,
* // other options
* });
* ```
*
* To use with BotBuilder:
* ```javascript
* const adapter = new FacebookAdapter({
* verify_token: process.env.FACEBOOK_VERIFY_TOKEN,
* app_secret: process.env.FACEBOOK_APP_SECRET,
* access_token: process.env.FACEBOOK_ACCESS_TOKEN
* });
* const server = restify.createServer();
* server.use(restify.plugins.bodyParser());
* server.post('/api/messages', (req, res) => {
* adapter.processActivity(req, res, async(context) => {
* // do your bot logic here!
* });
* });
* ```
*
* In multi-tenancy mode:
* ```javascript
* const adapter = new FacebookAdapter({
* verify_token: process.env.FACEBOOK_VERIFY_TOKEN,
* app_secret: process.env.FACEBOOK_APP_SECRET,
* getAccessTokenForPage: async(pageId) => {
* // do something to fetch the page access token for pageId.
* return token;
* })
* });
*```
*
* @param options Configuration options
*/
public constructor(options: FacebookAdapterOptions) {
super();
this.options = {
api_host: 'graph.facebook.com',
api_version: 'v3.2',
...options
};
if (!this.options.access_token && !this.options.getAccessTokenForPage) {
const err = 'Adapter must receive either an access_token or a getAccessTokenForPage function.';
if (!this.options.enable_incomplete) {
throw new Error(err);
} else {
console.error(err);
}
}
if (!this.options.app_secret) {
const err = 'Provide an app_secret in order to validate incoming webhooks and better secure api requests';
if (!this.options.enable_incomplete) {
throw new Error(err);
} else {
console.error(err);
}
}
if (this.options.enable_incomplete) {
const warning = [
'',
'****************************************************************************************',
'* WARNING: Your adapter may be running with an incomplete/unsafe configuration. *',
'* - Ensure all required configuration options are present *',
'* - Disable the "enable_incomplete" option! *',
'****************************************************************************************',
''
];
console.warn(warning.join('\n'));
}
this.middlewares = {
spawn: [
async (bot, next): Promise<void> => {
bot.api = await this.getAPI(bot.getConfig('activity'));
next();
}
]
};
}
/**
* Botkit-only: Initialization function called automatically when used with Botkit.
* * Amends the webhook_uri with an additional behavior for responding to Facebook's webhook verification request.
* @param botkit
*/
public async init(botkit): Promise<any> {
debug('Add GET webhook endpoint for verification at: ', botkit.getConfig('webhook_uri'));
if (botkit.webserver) {
botkit.webserver.get(botkit.getConfig('webhook_uri'), (req, res) => {
if (req.query['hub.mode'] === 'subscribe') {
if (req.query['hub.verify_token'] === this.options.verify_token) {
res.send(req.query['hub.challenge']);
} else {
res.send('OK');
}
}
});
}
}
/**
* Get a Facebook API client with the correct credentials based on the page identified in the incoming activity.
* This is used by many internal functions to get access to the Facebook API, and is exposed as `bot.api` on any BotWorker instances passed into Botkit handler functions.
*
* ```javascript
* let api = adapter.getAPI(activity);
* let res = api.callAPI('/me/messages', 'POST', message);
* ```
* @param activity An incoming message activity
*/
public async getAPI(activity: Partial<Activity>): Promise<FacebookAPI> {
if (this.options.access_token) {
return new FacebookAPI(this.options.access_token, this.options.app_secret, this.options.api_host, this.options.api_version);
} else {
if (activity.recipient.id) {
let pageid = activity.recipient.id;
// if this is an echo, the page id is actually in the from field
if (activity.channelData && activity.channelData.message && activity.channelData.message.is_echo === true) {
pageid = activity.from.id;
}
const token = await this.options.getAccessTokenForPage(pageid);
if (!token) {
throw new Error('Missing credentials for page.');
}
return new FacebookAPI(token, this.options.app_secret, this.options.api_host, this.options.api_version);
} else {
// No API can be created, this is
debug('Unable to create API based on activity: ', activity);
}
}
}
/**
* Converts an Activity object to a Facebook messenger outbound message ready for the API.
* @param activity
*/
private activityToFacebook(activity: any): any {
const message = {
recipient: {
id: activity.conversation.id
},
message: {
text: activity.text,
sticker_id: undefined,
attachment: undefined,
quick_replies: undefined
},
messaging_type: 'RESPONSE',
tag: undefined,
notification_type: undefined,
persona_id: undefined,
sender_action: undefined
};
// map these fields to their appropriate place
if (activity.channelData) {
if (activity.channelData.messaging_type) {
message.messaging_type = activity.channelData.messaging_type;
}
if (activity.channelData.tag) {
message.tag = activity.channelData.tag;
}
if (activity.channelData.sticker_id) {
message.message.sticker_id = activity.channelData.sticker_id;
}
if (activity.channelData.attachment) {
message.message.attachment = activity.channelData.attachment;
}
if (activity.channelData.persona_id) {
message.persona_id = activity.channelData.persona_id;
}
if (activity.channelData.notification_type) {
message.notification_type = activity.channelData.notification_type;
}
if (activity.channelData.sender_action) {
message.sender_action = activity.channelData.sender_action;
// from docs: https://developers.facebook.com/docs/messenger-platform/reference/send-api/
// Cannot be sent with message. Must be sent as a separate request.
// When using sender_action, recipient should be the only other property set in the request.
delete (message.message);
}
// make sure the quick reply has a type
if (activity.channelData.quick_replies) {
message.message.quick_replies = activity.channelData.quick_replies.map(function(item) {
const quick_reply = { ...item };
if (!item.content_type) quick_reply.content_type = 'text';
return quick_reply;
});
}
}
debug('OUT TO FACEBOOK > ', message);
return message;
}
/**
* Standard BotBuilder adapter method to send a message from the bot to the messaging API.
* [BotBuilder reference docs](https://docs.microsoft.com/en-us/javascript/api/botbuilder-core/botadapter?view=botbuilder-ts-latest#sendactivities).
* @param context A TurnContext representing the current incoming message and environment.
* @param activities An array of outgoing activities to be sent back to the messaging API.
*/
public async sendActivities(context: TurnContext, activities: Partial<Activity>[]): Promise<ResourceResponse[]> {
const responses = [];
for (let a = 0; a < activities.length; a++) {
const activity = activities[a];
if (activity.type === ActivityTypes.Message) {
const message = this.activityToFacebook(activity);
try {
const api = await this.getAPI(context.activity);
const res = await api.callAPI('/me/messages', 'POST', message);
if (res) {
responses.push({ id: res.message_id });
}
debug('RESPONSE FROM FACEBOOK > ', res);
} catch (err) {
console.error('Error sending activity to Facebook:', err);
}
} else {
// If there are ever any non-message type events that need to be sent, do it here.
debug('Unknown message type encountered in sendActivities: ', activity.type);
}
}
return responses;
}
/**
* Facebook adapter does not support updateActivity.
* @ignore
*/
// eslint-disable-next-line
public async updateActivity(context: TurnContext, activity: Partial<Activity>): Promise<void> {
debug('Facebook adapter does not support updateActivity.');
}
/**
* Facebook adapter does not support updateActivity.
* @ignore
*/
// eslint-disable-next-line
public async deleteActivity(context: TurnContext, reference: Partial<ConversationReference>): Promise<void> {
debug('Facebook adapter does not support deleteActivity.');
}
/**
* Standard BotBuilder adapter method for continuing an existing conversation based on a conversation reference.
* [BotBuilder reference docs](https://docs.microsoft.com/en-us/javascript/api/botbuilder-core/botadapter?view=botbuilder-ts-latest#continueconversation)
* @param reference A conversation reference to be applied to future messages.
* @param logic A bot logic function that will perform continuing action in the form `async(context) => { ... }`
*/
public async continueConversation(reference: Partial<ConversationReference>, logic: (context: TurnContext) => Promise<void>): Promise<void> {
const request = TurnContext.applyConversationReference(
{ type: 'event', name: 'continueConversation' },
reference,
true
);
const context = new TurnContext(this, request);
return this.runMiddleware(context, logic);
}
/**
* Accept an incoming webhook request and convert it into a TurnContext which can be processed by the bot's logic.
* @param req A request object from Restify or Express
* @param res A response object from Restify or Express
* @param logic A bot logic function in the form `async(context) => { ... }`
*/
public async processActivity(req, res, logic: (context: TurnContext) => Promise<void>): Promise<void> {
debug('IN FROM FACEBOOK >', req.body);
if (await this.verifySignature(req, res) === true) {
const event = req.body;
if (event.entry) {
for (let e = 0; e < event.entry.length; e++) {
let payload = null;
const entry = event.entry[e];
// handle normal incoming stuff
if (entry.changes) {
payload = entry.changes;
} else if (entry.messaging) {
payload = entry.messaging;
}
for (let m = 0; m < payload.length; m++) {
await this.processSingleMessage(payload[m], logic);
}
// handle standby messages (this bot is not the active receiver)
if (entry.standby) {
payload = entry.standby;
for (let m = 0; m < payload.length; m++) {
const message = payload[m];
// indiciate that this message was received in standby mode rather than normal mode.
message.standby = true;
await this.processSingleMessage(message, logic);
}
}
}
res.status(200);
res.end();
}
}
}
/**
* Handles each individual message inside a webhook payload (webhook may deliver more than one message at a time)
* @param message
* @param logic
*/
private async processSingleMessage(message: any, logic: any): Promise<void> {
// in case of Checkbox Plug-in sender.id is not present, instead we should look at optin.user_ref
if (!message.sender && message.optin && message.optin.user_ref) {
message.sender = { id: message.optin.user_ref };
}
const activity: Activity = {
channelId: 'facebook',
timestamp: new Date(),
// @ts-ignore ignore missing optional fields
conversation: {
id: message.sender.id
},
from: {
id: message.sender.id,
name: message.sender.id
},
recipient: {
id: message.recipient.id,
name: message.recipient.id
},
channelData: message,
type: ActivityTypes.Event,
text: null
};
if (message.message) {
activity.type = ActivityTypes.Message;
activity.text = message.message.text;
if (activity.channelData.message.is_echo) {
activity.type = ActivityTypes.Event;
}
// copy fields like attachments, sticker, quick_reply, nlp, etc.
for (const key in message.message) {
activity.channelData[key] = message.message[key];
}
} else if (message.postback) {
activity.type = ActivityTypes.Message;
activity.text = message.postback.payload;
}
const context = new TurnContext(this, activity as Activity);
await this.runMiddleware(context, logic);
}
/*
* Verifies the SHA1 signature of the raw request payload before bodyParser parses it
* Will abort parsing if signature is invalid, and pass a generic error to response
*/
private async verifySignature(req, res): Promise<boolean> {
const expected = req.headers['x-hub-signature'];
const hmac = crypto.createHmac('sha1', this.options.app_secret);
hmac.update(req.rawBody, 'utf8');
const calculated = 'sha1=' + hmac.digest('hex');
if (expected !== calculated) {
res.status(401);
debug('Token verification failed, Ignoring message');
throw new Error('Invalid signature on incoming request');
} else {
return true;
}
}
}
/**
* This interface defines the options that can be passed into the FacebookAdapter constructor function.
*/
export interface FacebookAdapterOptions {
/**
* Alternate root url used to contruct calls to Facebook's API. Defaults to 'graph.facebook.com' but can be changed (for mocking, proxy, etc).
*/
api_host?: string;
/**
* Alternate API version used to construct calls to Facebook's API. Defaults to v3.2
*/
api_version?: string;
/**
* The "verify token" used to initially create and verify the Webhooks subscription settings on Facebook's developer portal.
*/
verify_token: string;
/**
* The "app secret" from the "basic settings" page from your app's configuration in the Facebook developer portal
*/
app_secret: string;
/**
* When bound to a single page, use `access_token` to specify the "page access token" provided in the Facebook developer portal's "Access Tokens" widget of the "Messenger Settings" page.
*/
access_token?: string;
/**
* When bound to multiple teams, provide a function that, given a page id, will return the page access token for that page.
*/
getAccessTokenForPage?: (pageId: string) => Promise<string>;
/**
* Allow the adapter to startup without a complete configuration.
* This is risky as it may result in a non-functioning or insecure adapter.
* This should only be used when getting started.
*/
enable_incomplete?: boolean;
}
================================================
FILE: packages/botbuilder-adapter-facebook/src/facebook_api.ts
================================================
/**
* @module botbuilder-adapter-facebook
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
import * as request from 'request';
import * as crypto from 'crypto';
/**
* A simple API client for the Facebook API. Automatically signs requests with the access token and app secret proof.
* It can be used to call any API provided by Facebook.
*
*/
export class FacebookAPI {
private token: string;
private secret: string;
private api_host: string;
private api_version: string;
/**
* Create a FacebookAPI client.
* ```
* let api = new FacebookAPI(TOKEN, SECRET);
* await api.callAPI('/some/api','POST', {some_options});
* ```
* @param token a page access token
* @param secret an app secret
* @param api_host optional root hostname for constructing api calls, defaults to graph.facebook.com
* @param api_version optional api version used when constructing api calls, defaults to v3.2
*/
public constructor(token: string, secret: string, api_host = 'graph.facebook.com', api_version = 'v3.2') {
if (!token) {
throw new Error('Token is required!');
}
this.token = token;
this.secret = secret;
this.api_host = api_host;
this.api_version = api_version;
}
/**
* Call one of the Facebook APIs
* @param path Path to the API endpoint, for example `/me/messages`
* @param method HTTP method, for example POST, GET, DELETE or PUT.
* @param payload An object to be sent as parameters to the API call.
*/
public async callAPI(path: string, method = 'POST', payload: any = {}): Promise<any> {
const proof = this.getAppSecretProof(this.token, this.secret);
let queryString = '?';
let body = {};
if (method.toUpperCase() === 'GET') {
for (const key in payload) {
queryString = queryString + `${ encodeURIComponent(key) }=${ encodeURIComponent(payload[key]) }&`;
}
} else {
body = payload;
}
return new Promise((resolve, reject) => {
request({
method: method.toUpperCase(),
json: true,
body,
uri: `https://${ this.api_host }/${ this.api_version }${ path }${ queryString }access_token=${ this.token }&appsecret_proof=${ proof }`
}, (err, res, body) => {
if (err) {
reject(err);
} else if (body.error) {
reject(body.error.message);
} else {
resolve(body);
}
});
});
}
/**
* Generate the app secret proof used to increase security on calls to the graph API
* @param access_token a page access token
* @param app_secret an app secret
*/
private getAppSecretProof(access_token, app_secret): string {
const hmac = crypto.createHmac('sha256', app_secret || '');
return hmac.update(access_token).digest('hex');
}
}
================================================
FILE: packages/botbuilder-adapter-facebook/src/facebook_event_middleware.ts
================================================
/**
* @module botbuilder-adapter-facebook
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
import { MiddlewareSet, ActivityTypes } from 'botbuilder';
/**
* This adapter middleware, when used in conjunction with FacebookAdapter and Botkit, will result in Botkit emitting events with
* names based on their event type.
*
* ```javascript
* const adapter = new FacebookAdapter(MY_OPTIONS);
* adapter.use(new FacebookEventTypeMiddleware());
* const controller = new Botkit({
* adapter: adapter,
* });
*
* // define a handler for one of the new events
* controller.on('facebook_option', async(bot, message) => {
* // ...
* });
* ```
*
* When used, events emitted may include:
* * facebook_postback
* * facebook_referral
* * facebook_optin
* * message_delivered
* * message_read
* * facebook_account_linking
* * message_echo
* * facebook_app_roles
* * standby
* * facebook_receive_thread_control
* * facebook_request_thread_control
*
*/
export class FacebookEventTypeMiddleware extends MiddlewareSet {
/**
* Implements the middleware's onTurn function. Called automatically.
* @ignore
* @param context
* @param next
*/
public async onTurn(context, next): Promise<void> {
if (context.activity && context.activity.channelData) {
let type = null;
if (context.activity.channelData.postback) {
type = 'facebook_postback';
} else if (context.activity.channelData.referral) {
type = 'facebook_referral';
} else if (context.activity.channelData.optin) {
type = 'facebook_optin';
} else if (context.activity.channelData.delivery) {
type = 'message_delivered';
} else if (context.activity.channelData.read) {
type = 'message_read';
} else if (context.activity.channelData.account_linking) {
type = 'facebook_account_linking';
} else if (context.activity.channelData.message && context.activity.channelData.message.is_echo) {
type = 'message_echo';
context.activity.type = ActivityTypes.Event;
} else if (context.activity.channelData.app_roles) {
type = 'facebook_app_roles';
} else if (context.activity.channelData.standby) {
type = 'standby';
} else if (context.activity.channelData.pass_thread_control) {
type = 'facebook_receive_thread_control';
} else if (context.activity.channelData.take_thread_control) {
type = 'facebook_lose_thread_control';
} else if (context.activity.channelData.request_thread_control) {
type = 'facebook_request_thread_control';
}
context.activity.channelData.botkitEventType = type;
}
await next();
}
}
================================================
FILE: packages/botbuilder-adapter-facebook/src/index.ts
================================================
/**
* @module botbuilder-adapter-facebook
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
export * from './botworker';
export * from './facebook_adapter';
export * from './facebook_api';
export * from './facebook_event_middleware';
================================================
FILE: packages/botbuilder-adapter-facebook/tests/FacebookAdapter.tests.js
================================================
const assert = require('assert');
const { FacebookAdapter } = require('../');
const { FakeAPI, Res, Req, fakeVerifySignature } = require('./shared');
describe('FacebookAdapter', function() {
let adapter;
beforeEach(function () {
adapter = new FacebookAdapter({
getAccessTokenForPage: async (page) => {
if (page === 2) { return 'xyz'; } else throw new Error('no token for ' + page);
},
app_secret: '123',
verify_token: '123',
});
})
it('should not construct without required parameters', function () {
assert.throws(function () { let adapter = new FacebookAdapter({}) }, 'Foo');
});
it('should create a FacebookAdapter object', function () {
assert((adapter instanceof FacebookAdapter), 'Adapter is wrong type');
});
it('should process an incoming request into an activity...', function (done) {
adapter.verifySignature = fakeVerifySignature;
let res = new Res();
adapter.processActivity(new Req({
entry: [
{
messaging: [
{
sender: { id: 1 },
recipient: { id: 2 },
message: {
text: 'Hello!',
sticker_id: 1,
}
}
]
}
]
}), res, async (context) => {
assert(context.activity.type === 'message', 'activity is not a message');
assert(context.activity.text === 'Hello!', 'activity is missing text');
assert(context.activity.from.id === 1,'from id is wrong');
assert(context.activity.recipient.id === 2,'from id is wrong');
assert(context.activity.channelData.sticker_id === 1, 'platform field is not in channelData');
done();
});
});
it ('should process an postback incoming request into an activity...', function(done) {
adapter.verifySignature = fakeVerifySignature;
let res = new Res();
adapter.processActivity(new Req({
entry: [
{
messaging: [
{
sender: { id: 1 },
recipient: { id: 2 },
postback: {
payload: 'Hello!'
}
}
]
}
]
}), res, async(context) => {
assert(context.activity.type === 'message', 'activity is not a message');
assert(context.activity.text === 'Hello!', 'activity is missing text');
done();
});
});
it ('should process a message echo incoming request into an event...', function(done) {
adapter.verifySignature = fakeVerifySignature;
let res = new Res();
adapter.processActivity(new Req({
entry: [
{
messaging: [
{
sender: { id: 1 },
recipient: { id: 2 },
message: {
is_echo: true,
text: 'Hello!'
}
}
]
}
]
}), res, async(context) => {
assert(context.activity.type === 'event', 'activity is not a event');
done();
});
});
it ('should process a non-message incoming request into an event...', function(done) {
adapter.verifySignature = fakeVerifySignature;
let res = new Res();
adapter.processActivity(new Req({
entry: [
{
messaging: [
{
sender: { id: 1 },
recipient: { id: 2 },
read: {
mid: 1,
}
}
]
}
]
}), res, async(context) => {
assert(context.activity.type === 'event', 'activity is not a event');
done();
});
});
it ('should process spawn using the right token.', function(done) {
adapter.verifySignature = fakeVerifySignature;
let res = new Res();
adapter.processActivity(new Req({
entry: [
{
messaging: [
{
sender: { id: 1 },
recipient: { id: 2 },
message: {
text: 'hi',
}
}
]
}
]
}), res, async(context) => {
let api = await adapter.getAPI(context.activity);
assert(api, 'api was returned based on activity');
done();
});
});
it ('outbound message to facebook is properly formed.', function(done) {
adapter.verifySignature = fakeVerifySignature;
adapter.getAPI = async (token) => {
return new FakeAPI(function(endpoint, method, params) {
assert(params.recipient.id === 1,'outbound message has wrong recipient');
assert(params.message.text === 'hello','outbound message has wrong text');
assert(params.message.sticker_id,'sticker id is missing');
assert(params.message.quick_replies.length === 3,'quick replies are missing');
done();
});
};
let res = new Res();
adapter.processActivity(new Req({
entry: [
{
messaging: [
{
sender: { id: 1 },
recipient: { id: 2 },
message: {
text: 'hi',
}
}
]
}
]
}), res, async(context) => {
let reply = await context.sendActivity({
text: 'hello',
channelData: {
sticker_id: 5,
quick_replies: [
{
title: 'foo',
payload: 'foo',
},
{
title: 'bar',
payload: 'bar',
},
{
title: 'baz',
payload: 'baz',
},
]
}
});
});
});
// TODO: test continueConversation resulting in properly formatted messages
});
================================================
FILE: packages/botbuilder-adapter-facebook/tests/FacebookEventMiddleware.tests.js
================================================
const assert = require('assert');
const { FacebookAdapter, FacebookEventTypeMiddleware } = require('../');
const { Res, Req, fakeVerifySignature } = require('./shared');
describe('FacebookEventTypeMiddleware', function() {
it ('should process a non-message incoming request into an event...', function(done) {
const adapter = new FacebookAdapter({
access_token: '123',
app_secret: '123',
verify_token: '123',
});
adapter.use(new FacebookEventTypeMiddleware());
adapter.verifySignature = fakeVerifySignature;
let res = new Res();
adapter.processActivity(new Req({
entry: [
{
messaging: [
{
sender: { id: 1 },
recipient: { id: 2 },
read: {
mid: 1,
}
}
]
}
]
}), res, async(context) => {
assert(context.activity.type === 'event', 'activity is not a event');
assert(context.activity.channelData.botkitEventType === 'message_read', 'botkitEventType not set properly');
done();
});
});
});
================================================
FILE: packages/botbuilder-adapter-facebook/tests/shared.js
================================================
module.exports.FakeAPI = class FakeAPI {
constructor(cb) {
this.cb = cb;
}
callAPI(endpoint, method, params) {
this.cb(endpoint, method, params);
}
}
module.exports.Req = class Req {
constructor(body) {
this.body = body;
}
}
module.exports.Res = class Res {
send(val) {
this._sent = val;
// console.log('SEND', val);
return this;
}
status(status) {
this._status = status;
// console.log('STATUS', status);
return this;
}
json(json) {
this._json = json;
// console.log('JSON', json);
return this;
}
end(val) {
// console.log('END', val);
return this;
}
}
module.exports.fakeVerifySignature = fakeVerifySignature = async (req, res) => {
return true;
}
================================================
FILE: packages/botbuilder-adapter-facebook/tsconfig.json
================================================
{
"compilerOptions": {
"target": "ES2015",
"module": "commonjs",
"declaration": true,
"sourceMap": true,
"outDir": "./lib",
"rootDir": "./src",
"types" : ["node"],
"lib": [
"es5",
"es2015",
"es2016.array.include",
"esnext.asynciterable",
"dom"
]
},
"include": [
"src/**/*"
]
}
================================================
FILE: packages/botbuilder-adapter-hangouts/.eslintrc.js
================================================
module.exports = {
"extends": "standard",
"rules": {
"semi": [2, "always"],
"indent": [2, 4],
"no-return-await": 0,
"camelcase": 0,
"no-unused-vars": 0,
"@typescript-eslint/indent": 0,
"@typescript-eslint/ban-ts-ignore": 1,
"@typescript-eslint/no-object-literal-type-assertion": 0,
"@typescript-eslint/explicit-member-accessibility": 1,
"space-before-function-paren": [2, {
"named": "never",
"anonymous": "never",
"asyncArrow": "always"
}],
"template-curly-spacing": [2, "always"]
}
};
================================================
FILE: packages/botbuilder-adapter-hangouts/.gitignore
================================================
node_modules/
.env
lib/
.nyc_output/
================================================
FILE: packages/botbuilder-adapter-hangouts/CHANGELOG.md
================================================
# botbuilder-adapter-hangouts changelog
# 1.0.8
* Update dependencies to Botkit 4.10, Bot Framework 4.10
# 1.0.7
* Update dependencies to Botkit 4.9, Bot Framework 4.9
# 1.0.4
* Update dependencies (Bot Framework to 4.6, Botkit to 4.6)
# 1.0.3
* Update dependencies (Bot Framework to 4.5.2, Botkit to 4.5)
# 1.0.2
* Add `enable_incomplete` option to allow adapter to start without a complete config.
# 1.0.1
First public release
================================================
FILE: packages/botbuilder-adapter-hangouts/LICENSE.md
================================================
Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation th
gitextract_32xvuma6/ ├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .github/ │ ├── issue_template.md │ └── stale.yml ├── .gitignore ├── .npmignore ├── .travis.yml ├── ATTRIBUTIONS.md ├── CONTRIBUTING.md ├── LICENSE.md ├── build/ │ ├── botkit-ci.yml │ ├── botkit-daily.yml │ └── scripts/ │ └── rebasePackageLock.js ├── changelog.md ├── lerna.json ├── package.json ├── packages/ │ ├── botbuilder-adapter-facebook/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── botworker.ts │ │ │ ├── facebook_adapter.ts │ │ │ ├── facebook_api.ts │ │ │ ├── facebook_event_middleware.ts │ │ │ └── index.ts │ │ ├── tests/ │ │ │ ├── FacebookAdapter.tests.js │ │ │ ├── FacebookEventMiddleware.tests.js │ │ │ └── shared.js │ │ └── tsconfig.json │ ├── botbuilder-adapter-hangouts/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── botworker.ts │ │ │ ├── hangouts_adapter.ts │ │ │ └── index.ts │ │ ├── tests/ │ │ │ └── HangoutsAdapter.tests.js │ │ └── tsconfig.json │ ├── botbuilder-adapter-slack/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── examples/ │ │ │ ├── index.js │ │ │ └── multiteam.js │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── botworker.ts │ │ │ ├── index.ts │ │ │ ├── messagetype_middleware.ts │ │ │ ├── slack_adapter.ts │ │ │ ├── slack_dialog.ts │ │ │ └── slackevent_middleware.ts │ │ ├── tests/ │ │ │ └── SlackAdapter.tests.js │ │ └── tsconfig.json │ ├── botbuilder-adapter-twilio-sms/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── botworker.ts │ │ │ ├── index.ts │ │ │ └── twilio_adapter.ts │ │ ├── tests/ │ │ │ └── TwilioAdapter.tests.js │ │ └── tsconfig.json │ ├── botbuilder-adapter-web/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── client/ │ │ │ ├── client.js │ │ │ ├── css/ │ │ │ │ ├── embed.css │ │ │ │ └── styles.css │ │ │ ├── embed.js │ │ │ ├── index.html │ │ │ ├── readme.md │ │ │ └── sass/ │ │ │ ├── _botkit.scss │ │ │ ├── _chat.scss │ │ │ ├── _home.scss │ │ │ ├── embed.scss │ │ │ └── styles.scss │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── web_adapter.ts │ │ ├── tests/ │ │ │ └── WebAdapter.tests.js │ │ └── tsconfig.json │ ├── botbuilder-adapter-webex/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── botworker.ts │ │ │ ├── index.ts │ │ │ └── webex_adapter.ts │ │ ├── tests/ │ │ │ └── WebexAdapter.tests.js │ │ └── tsconfig.json │ ├── botkit/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── adapter.ts │ │ │ ├── botworker.ts │ │ │ ├── conversation.ts │ │ │ ├── conversationState.ts │ │ │ ├── core.ts │ │ │ ├── dialogWrapper.ts │ │ │ ├── index.ts │ │ │ ├── teamsHelpers.ts │ │ │ └── testClient.ts │ │ ├── tests/ │ │ │ ├── Core.tests.js │ │ │ ├── CustomAdapter.tests.js │ │ │ ├── Dialog.tests.js │ │ │ └── State.tests.js │ │ └── tsconfig.json │ ├── botkit-plugin-cms/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── package.json │ │ ├── readme.md │ │ ├── src/ │ │ │ ├── cms.ts │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── docs/ │ │ ├── .gitignore │ │ ├── advanced.md │ │ ├── build/ │ │ │ ├── adapter.hbs │ │ │ ├── build.sh │ │ │ ├── parse.js │ │ │ ├── plugin.hbs │ │ │ ├── template.hbs │ │ │ ├── toc-platforms.hbs │ │ │ └── toc.hbs │ │ ├── conversations.md │ │ ├── core.md │ │ ├── index.json │ │ ├── index.md │ │ ├── package.json │ │ ├── platforms/ │ │ │ ├── facebook.md │ │ │ ├── hangouts.md │ │ │ ├── index.md │ │ │ ├── slack.md │ │ │ ├── twilio-sms.md │ │ │ ├── web.md │ │ │ └── webex.md │ │ ├── plugins/ │ │ │ ├── cms.md │ │ │ └── index.md │ │ ├── provisioning/ │ │ │ ├── cisco-spark.md │ │ │ ├── facebook_messenger.md │ │ │ ├── index.md │ │ │ ├── slack-events-api.md │ │ │ ├── teams.md │ │ │ └── twilio-sms.md │ │ ├── readme.md │ │ └── reference/ │ │ ├── cms.md │ │ ├── core.md │ │ ├── facebook.md │ │ ├── hangouts.md │ │ ├── index.md │ │ ├── slack.md │ │ ├── twilio-sms.md │ │ ├── web.md │ │ └── webex.md │ ├── generator-botkit/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── generators/ │ │ │ ├── app/ │ │ │ │ ├── index.js │ │ │ │ └── templates/ │ │ │ │ ├── bot.js │ │ │ │ ├── features/ │ │ │ │ │ ├── sample_echo.js │ │ │ │ │ └── sample_hears.js │ │ │ │ ├── gitignore │ │ │ │ ├── package.json │ │ │ │ └── readme.md │ │ │ ├── botframework/ │ │ │ │ ├── index.js │ │ │ │ └── templates/ │ │ │ │ └── features/ │ │ │ │ └── botframework_features.js │ │ │ ├── facebook/ │ │ │ │ ├── index.js │ │ │ │ └── templates/ │ │ │ │ └── features/ │ │ │ │ └── facebook_features.js │ │ │ ├── hangouts/ │ │ │ │ ├── index.js │ │ │ │ └── templates/ │ │ │ │ └── features/ │ │ │ │ └── hangouts_features.js │ │ │ ├── slack/ │ │ │ │ ├── index.js │ │ │ │ └── templates/ │ │ │ │ └── features/ │ │ │ │ ├── routes_oauth.js │ │ │ │ └── slack_features.js │ │ │ ├── twilio-sms/ │ │ │ │ ├── index.js │ │ │ │ └── templates/ │ │ │ │ └── features/ │ │ │ │ └── twilio_features.js │ │ │ ├── web/ │ │ │ │ ├── index.js │ │ │ │ └── templates/ │ │ │ │ ├── features/ │ │ │ │ │ ├── chat.js │ │ │ │ │ ├── typing.js │ │ │ │ │ └── websocket_features.js │ │ │ │ ├── public/ │ │ │ │ │ ├── client.js │ │ │ │ │ ├── css/ │ │ │ │ │ │ ├── embed.css │ │ │ │ │ │ └── styles.css │ │ │ │ │ └── index.html │ │ │ │ └── sass/ │ │ │ │ ├── _botkit.scss │ │ │ │ ├── _chat.scss │ │ │ │ ├── _home.scss │ │ │ │ ├── embed.scss │ │ │ │ └── styles.scss │ │ │ └── webex/ │ │ │ ├── index.js │ │ │ └── templates/ │ │ │ └── features/ │ │ │ └── webex_features.js │ │ ├── package.json │ │ └── readme.md │ └── testbot/ │ ├── .gitignore │ ├── bot.js │ ├── botframework.js │ ├── custom_express.js │ ├── features/ │ │ ├── bot_inspector_mode.js │ │ ├── botframework_features.js │ │ ├── convo.js │ │ ├── convo_test.js │ │ ├── dynamic_attachments.js │ │ ├── facebook_features.js │ │ ├── flip_table.js │ │ ├── get_reference.js │ │ ├── hangouts_features.js │ │ ├── hear_patterns.js │ │ ├── interruptions.js │ │ ├── looping_dialog.js │ │ ├── luis_recognizer.js │ │ ├── middlewares.js │ │ ├── random_text_middleware.js │ │ ├── sample_onboarding.js │ │ ├── shutdown.js │ │ ├── slack_features.js │ │ ├── slack_modals.js │ │ ├── teams_features.js │ │ ├── test_convo.js │ │ ├── twilio_features.js │ │ ├── typescript.ts │ │ ├── waterfall_dialog.js │ │ ├── webex_features.js │ │ ├── websocket_features.js │ │ └── z_fallback.js │ ├── multiadapter.js │ ├── package.json │ ├── plugins/ │ │ └── verbose/ │ │ ├── index.js │ │ ├── public/ │ │ │ └── test.txt │ │ └── views/ │ │ ├── layout.hbs │ │ └── template.hbs │ ├── public/ │ │ ├── client.js │ │ ├── css/ │ │ │ ├── embed.css │ │ │ └── styles.css │ │ └── index.html │ └── testbot.bot ├── readme.md └── todo.md
SYMBOL INDEX (329 symbols across 45 files)
FILE: build/scripts/rebasePackageLock.js
function readAllStdin (line 8) | async function readAllStdin() {
function rebaseV1Inline (line 26) | function rebaseV1Inline(name, dependency, baseURL) {
function rebaseV1InlineAll (line 42) | function rebaseV1InlineAll({ dependencies }, baseURL) {
function rebaseV2Inline (line 48) | function rebaseV2Inline(path, dependency, baseURL) {
function rebaseV2InlineAll (line 64) | function rebaseV2InlineAll(packages, baseURL) {
function main (line 71) | async function main() {
FILE: packages/botbuilder-adapter-facebook/src/botworker.ts
class FacebookBotWorker (line 18) | class FacebookBotWorker extends BotWorker {
method constructor (line 37) | public constructor(botkit: Botkit, config: any) {
method startConversationWithUser (line 70) | public async startConversationWithUser(userId): Promise<void> {
FILE: packages/botbuilder-adapter-facebook/src/facebook_adapter.ts
class FacebookAdapter (line 19) | class FacebookAdapter extends BotAdapter {
method constructor (line 94) | public constructor(options: FacebookAdapterOptions) {
method init (line 149) | public async init(botkit): Promise<any> {
method getAPI (line 174) | public async getAPI(activity: Partial<Activity>): Promise<FacebookAPI> {
method activityToFacebook (line 200) | private activityToFacebook(activity: any): any {
method sendActivities (line 274) | public async sendActivities(context: TurnContext, activities: Partial<...
method updateActivity (line 304) | public async updateActivity(context: TurnContext, activity: Partial<Ac...
method deleteActivity (line 313) | public async deleteActivity(context: TurnContext, reference: Partial<C...
method continueConversation (line 323) | public async continueConversation(reference: Partial<ConversationRefer...
method processActivity (line 340) | public async processActivity(req, res, logic: (context: TurnContext) =...
method processSingleMessage (line 384) | private async processSingleMessage(message: any, logic: any): Promise<...
method verifySignature (line 435) | private async verifySignature(req, res): Promise<boolean> {
type FacebookAdapterOptions (line 453) | interface FacebookAdapterOptions {
FILE: packages/botbuilder-adapter-facebook/src/facebook_api.ts
class FacebookAPI (line 17) | class FacebookAPI {
method constructor (line 34) | public constructor(token: string, secret: string, api_host = 'graph.fa...
method callAPI (line 50) | public async callAPI(path: string, method = 'POST', payload: any = {})...
method getAppSecretProof (line 87) | private getAppSecretProof(access_token, app_secret): string {
FILE: packages/botbuilder-adapter-facebook/src/facebook_event_middleware.ts
class FacebookEventTypeMiddleware (line 42) | class FacebookEventTypeMiddleware extends MiddlewareSet {
method onTurn (line 49) | public async onTurn(context, next): Promise<void> {
FILE: packages/botbuilder-adapter-facebook/tests/shared.js
method constructor (line 3) | constructor(cb) {
method callAPI (line 6) | callAPI(endpoint, method, params) {
method constructor (line 11) | constructor(body) {
method send (line 17) | send(val) {
method status (line 22) | status(status) {
method json (line 27) | json(json) {
method end (line 32) | end(val) {
FILE: packages/botbuilder-adapter-hangouts/src/botworker.ts
class HangoutsBotWorker (line 17) | class HangoutsBotWorker extends BotWorker {
method updateMessage (line 39) | public async updateMessage(update: Partial<BotkitMessage>): Promise<an...
method deleteMessage (line 65) | public async deleteMessage(update: Partial<BotkitMessage>): Promise<an...
method replyWithNew (line 90) | public async replyWithNew(src: any, resp: Partial<BotkitMessage>): Pro...
method replyWithUpdate (line 121) | public async replyWithUpdate(src: any, resp: Partial<BotkitMessage>): ...
method replyInThread (line 147) | public async replyInThread(src, resp): Promise<any> {
method startConversationInThread (line 178) | public async startConversationInThread(spaceName: string, userId: stri...
FILE: packages/botbuilder-adapter-hangouts/src/hangouts_adapter.ts
class HangoutsAdapter (line 21) | class HangoutsAdapter extends BotAdapter {
method constructor (line 85) | public constructor(options: HangoutsAdapterOptions) {
method activityToHangouts (line 155) | private activityToHangouts(activity: Activity): any {
method sendActivities (line 185) | public async sendActivities(context: TurnContext, activities: Partial<...
method updateActivity (line 212) | public async updateActivity(context: TurnContext, activity: Partial<Ac...
method deleteActivity (line 243) | public async deleteActivity(context: TurnContext, reference: Partial<C...
method continueConversation (line 267) | public async continueConversation(reference: Partial<ConversationRefer...
method processActivity (line 284) | public async processActivity(req, res, logic: (context: TurnContext) =...
type HangoutsAdapterOptions (line 360) | interface HangoutsAdapterOptions {
FILE: packages/botbuilder-adapter-slack/examples/index.js
constant ENV_FILE (line 15) | const ENV_FILE = path.join(__dirname, '.env');
constant BOT_FILE (line 28) | const BOT_FILE = path.join(__dirname, (process.env.botFilePath || ''));
constant DEV_ENVIRONMENT (line 41) | const DEV_ENVIRONMENT = 'development';
constant BOT_CONFIGURATION (line 45) | const BOT_CONFIGURATION = (process.env.NODE_ENV || DEV_ENVIRONMENT);
function respondDelayed (line 188) | async function respondDelayed(context) {
FILE: packages/botbuilder-adapter-slack/examples/multiteam.js
constant ENV_FILE (line 15) | const ENV_FILE = path.join(__dirname, '.env');
constant BOT_FILE (line 28) | const BOT_FILE = path.join(__dirname, (process.env.botFilePath || ''));
constant DEV_ENVIRONMENT (line 41) | const DEV_ENVIRONMENT = 'development';
constant BOT_CONFIGURATION (line 45) | const BOT_CONFIGURATION = (process.env.NODE_ENV || DEV_ENVIRONMENT);
function getTokenForTeam (line 93) | async function getTokenForTeam(teamId) {
function respondDelayed (line 218) | async function respondDelayed(context) {
FILE: packages/botbuilder-adapter-slack/src/botworker.ts
class SlackBotWorker (line 19) | class SlackBotWorker extends BotWorker {
method constructor (line 47) | public constructor(botkit: Botkit, config: any) {
method startPrivateConversation (line 101) | public async startPrivateConversation(userId: string): Promise<any> {
method startConversationInChannel (line 143) | public async startConversationInChannel(channelId: string, userId: str...
method startConversationInThread (line 176) | public async startConversationInThread(channelId: string, userId: stri...
method replyInThread (line 194) | public async replyInThread(src: any, resp: any): Promise<any> {
method replyEphemeral (line 207) | public async replyEphemeral(src: any, resp: any): Promise<any> {
method replyPublic (line 227) | public async replyPublic(src: any, resp: any): Promise<any> {
method replyPrivate (line 240) | public async replyPrivate(src: any, resp: any): Promise<any> {
method replyInteractive (line 254) | public async replyInteractive(src: any, resp: any): Promise<any> {
method dialogError (line 296) | public dialogError(errors: {name: string; error: string} | { name: str...
method replyWithDialog (line 313) | public async replyWithDialog(src, dialog_obj: Dialog): Promise<any> {
method updateMessage (line 338) | public async updateMessage(update: Partial<BotkitMessage>): Promise<an...
method deleteMessage (line 358) | public async deleteMessage(update: Partial<BotkitMessage>): Promise<an...
FILE: packages/botbuilder-adapter-slack/src/messagetype_middleware.ts
class SlackMessageTypeMiddleware (line 33) | class SlackMessageTypeMiddleware extends MiddlewareSet {
method onTurn (line 39) | public async onTurn(context: TurnContext, next: () => Promise<any>): P...
FILE: packages/botbuilder-adapter-slack/src/slack_adapter.ts
class SlackAdapter (line 19) | class SlackAdapter extends BotAdapter {
method constructor (line 97) | public constructor(options: SlackAdapterOptions) {
method getAPI (line 193) | public async getAPI(activity: Partial<Activity>): Promise<WebClient> {
method getBotUserByTeam (line 219) | public async getBotUserByTeam(activity: Partial<Activity>): Promise<st...
method getInstallLink (line 250) | public getInstallLink(): string {
method validateOauthCode (line 291) | public async validateOauthCode(code: string): Promise<any> {
method activityToSlack (line 317) | public activityToSlack(activity: Partial<Activity>): any {
method sendActivities (line 361) | public async sendActivities(context: TurnContext, activities: Partial<...
method updateActivity (line 406) | public async updateActivity(context: TurnContext, activity: Partial<Ac...
method deleteActivity (line 429) | public async deleteActivity(context: TurnContext, reference: Partial<C...
method continueConversation (line 452) | public async continueConversation(reference: Partial<ConversationRefer...
method verifySignature (line 469) | private async verifySignature(req, res): Promise<boolean> {
method processActivity (line 513) | public async processActivity(req, res, logic: (context: TurnContext) =...
type SlackAdapterOptions (line 728) | interface SlackAdapterOptions {
type ChatPostMessageResult (line 783) | interface ChatPostMessageResult extends WebAPICallResult {
type AuthTestResult (line 793) | interface AuthTestResult extends WebAPICallResult {
FILE: packages/botbuilder-adapter-slack/src/slack_dialog.ts
class SlackDialog (line 20) | class SlackDialog {
method constructor (line 30) | public constructor(title?: string, callback_id?: string, submit_label?...
method state (line 45) | public state(v): SlackDialog {
method notifyOnCancel (line 54) | public notifyOnCancel(set: boolean): SlackDialog {
method title (line 63) | public title(v: string): SlackDialog {
method callback_id (line 72) | public callback_id(v: string): SlackDialog {
method submit_label (line 81) | public submit_label(v: string): SlackDialog {
method addText (line 94) | public addText(label: string | any, name: string, value: string, optio...
method addEmail (line 120) | public addEmail(label: string, name: string, value: string, options?: ...
method addNumber (line 131) | public addNumber(label: string, name: string, value: string, options?:...
method addTel (line 142) | public addTel(label: string, name: string, value: string, options?: an...
method addUrl (line 153) | public addUrl(label: string, name: string, value: string, options?: an...
method addTextarea (line 165) | public addTextarea(label: string, name: string, value: string, options...
method addSelect (line 192) | public addSelect(label: string, name: string, value: string | number |...
method asString (line 213) | public asString(): string {
method asObject (line 220) | public asObject(): any {
FILE: packages/botbuilder-adapter-slack/src/slackevent_middleware.ts
class SlackEventMiddleware (line 30) | class SlackEventMiddleware extends MiddlewareSet {
method onTurn (line 36) | public async onTurn(context: TurnContext, next: () => Promise<any>): P...
FILE: packages/botbuilder-adapter-twilio-sms/src/botworker.ts
class TwilioBotWorker (line 18) | class TwilioBotWorker extends BotWorker {
method startConversationWithUser (line 35) | public async startConversationWithUser(userId: string): Promise<any> {
FILE: packages/botbuilder-adapter-twilio-sms/src/twilio_adapter.ts
class TwilioAdapter (line 18) | class TwilioAdapter extends BotAdapter {
method constructor (line 77) | public constructor(options: TwilioAdapterOptions) {
method activityToTwilio (line 147) | private activityToTwilio(activity: Partial<Activity>): any {
method sendActivities (line 168) | public async sendActivities(context: TurnContext, activities: Partial<...
method updateActivity (line 190) | public async updateActivity(context: TurnContext, activity: Partial<Ac...
method deleteActivity (line 199) | public async deleteActivity(context: TurnContext, reference: Partial<C...
method continueConversation (line 209) | public async continueConversation(reference: Partial<ConversationRefer...
method processActivity (line 226) | public async processActivity(req, res, logic: (context: TurnContext) =...
method verifySignature (line 275) | private async verifySignature(req, res): Promise<any> {
type TwilioAdapterOptions (line 309) | interface TwilioAdapterOptions {
FILE: packages/botbuilder-adapter-web/client/client.js
function s4 (line 333) | function s4() {
FILE: packages/botbuilder-adapter-web/src/web_adapter.ts
class WebAdapter (line 22) | class WebAdapter extends BotAdapter {
method constructor (line 64) | public constructor(socketServerOptions?: {[key: string]: any}) {
method init (line 74) | public init(botkit): void {
method createSocketServer (line 88) | public createSocketServer(server, socketOptions: any = {}, logic): void {
method activityToMessage (line 170) | private activityToMessage(activity: Partial<Activity>): any {
method sendActivities (line 193) | public async sendActivities(context: TurnContext, activities: Partial<...
method updateActivity (line 233) | public async updateActivity(context: TurnContext, activity: Partial<Ac...
method deleteActivity (line 242) | public async deleteActivity(context: TurnContext, reference: Partial<C...
method continueConversation (line 252) | public async continueConversation(reference: Partial<ConversationRefer...
method processActivity (line 269) | public async processActivity(req, res, logic: (context: TurnContext) =...
method isConnected (line 318) | public isConnected(user: string): boolean {
method getConnection (line 327) | public getConnection(user: string): WebSocket {
FILE: packages/botbuilder-adapter-webex/src/botworker.ts
class WebexBotWorker (line 18) | class WebexBotWorker extends BotWorker {
method startPrivateConversation (line 31) | public async startPrivateConversation(userId: string): Promise<any> {
method startConversationInRoom (line 75) | public async startConversationInRoom(roomId: string, userId: string): ...
method startConversationInThread (line 120) | public async startConversationInThread(roomId: string, userId: string,...
method replyInThread (line 138) | public async replyInThread(src: any, resp: any): Promise<any> {
method deleteMessage (line 157) | public async deleteMessage(update: Partial<BotkitMessage>): Promise<an...
FILE: packages/botbuilder-adapter-webex/src/webex_adapter.ts
type WebexAdapterOptions (line 17) | interface WebexAdapterOptions {
class WebexAdapter (line 45) | class WebexAdapter extends BotAdapter {
method constructor (line 110) | public constructor(config: WebexAdapterOptions) {
method getIdentity (line 193) | public async getIdentity(): Promise<any> {
method identity (line 212) | public get identity(): any {
method init (line 221) | public init(botkit): void {
method resetWebhookSubscriptions (line 241) | public async resetWebhookSubscriptions(): Promise<any> {
method registerWebhookSubscription (line 256) | public registerWebhookSubscription(webhook_path): void {
method registerAdaptiveCardWebhookSubscription (line 309) | public registerAdaptiveCardWebhookSubscription(webhook_path): void {
method sendActivities (line 364) | public async sendActivities(context: TurnContext, activities: Partial<...
method updateActivity (line 422) | public async updateActivity(context: TurnContext, activity: Partial<Ac...
method deleteActivity (line 432) | public async deleteActivity(context: TurnContext, reference: Partial<C...
method continueConversation (line 450) | public async continueConversation(reference: Partial<ConversationRefer...
method processActivity (line 467) | public async processActivity(req, res, logic: (context: TurnContext) =...
FILE: packages/botkit-plugin-cms/src/cms.ts
class BotkitCMSHelper (line 32) | class BotkitCMSHelper {
method constructor (line 41) | public constructor(config: CMSOptions) {
method init (line 68) | public init(botkit): void {
method apiRequest (line 84) | private async apiRequest(uri: string, params: {[key: string]: any} = {...
method getScripts (line 129) | private async getScripts(): Promise<any[]> {
method evaluateTrigger (line 133) | private async evaluateTrigger(text: string): Promise<any> {
method loadAllScripts (line 143) | public async loadAllScripts(botkit: Botkit): Promise<void> {
method mapFields (line 162) | private mapFields(line): void {
method testTrigger (line 241) | public async testTrigger(bot: BotWorker, message: Partial<BotkitMessag...
method before (line 267) | public before(script_name: string, thread_name: string, handler: (conv...
method onChange (line 292) | public onChange(script_name: string, variable_name: string, handler: (...
method after (line 316) | public after(script_name: string, handler: (results: any, bot: BotWork...
type CMSOptions (line 326) | interface CMSOptions {
FILE: packages/botkit/src/adapter.ts
constant ARCHITECTURE (line 16) | const ARCHITECTURE: any = os.arch();
constant TYPE (line 17) | const TYPE: any = os.type();
constant RELEASE (line 18) | const RELEASE: any = os.release();
constant NODE_VERSION (line 19) | const NODE_VERSION: any = process.version;
constant USER_AGENT (line 20) | const USER_AGENT: string = `Microsoft-BotFramework/3.1 Botkit/${ pjson.v...
class BotkitBotFrameworkAdapter (line 29) | class BotkitBotFrameworkAdapter extends BotFrameworkAdapter {
method createConnectorClient (line 38) | public createConnectorClient(serviceUrl: string): ConnectorClient {
method createTokenApiClient (line 49) | protected createTokenApiClient(serviceUrl: string): TokenApiClient {
method getChannels (line 60) | public async getChannels(context: TurnContext): Promise<ChannelInfo[]> {
FILE: packages/botkit/src/botworker.ts
class BotWorker (line 16) | class BotWorker {
method constructor (line 25) | public constructor(controller: Botkit, config) {
method controller (line 35) | public get controller(): Botkit {
method getConfig (line 50) | public getConfig(key?: string): any {
method say (line 99) | public async say(message: Partial<BotkitMessage> | string): Promise<an...
method reply (line 130) | public async reply(src: Partial<BotkitMessage>, resp: Partial<BotkitMe...
method beginDialog (line 153) | public async beginDialog(id: string, options?: any): Promise<void> {
method cancelAllDialogs (line 172) | public async cancelAllDialogs(): Promise<DialogTurnResult> {
method getActiveDialog (line 182) | public getActiveDialog(): Dialog | undefined {
method hasActiveDialog (line 190) | public hasActiveDialog(): boolean {
method isDialogActive (line 199) | public isDialogActive(id: string): boolean {
method replaceDialog (line 218) | public async replaceDialog(id: string, options?: any): Promise<void> {
method changeContext (line 250) | public async changeContext(reference: Partial<ConversationReference>):...
method startConversationWithUser (line 274) | public async startConversationWithUser(reference: any): Promise<void> {
method ensureMessageFormat (line 332) | public ensureMessageFormat(message: Partial<BotkitMessage> | string): ...
method httpStatus (line 415) | public httpStatus(status: number): void {
method httpBody (line 432) | public httpBody(body: any): void {
FILE: packages/botkit/src/conversation.ts
type BotkitConvoHandler (line 21) | interface BotkitConvoHandler {
type BotkitConvoTrigger (line 28) | interface BotkitConvoTrigger {
type BotkitMessageTemplate (line 38) | interface BotkitMessageTemplate {
type BotkitConversationStep (line 57) | interface BotkitConversationStep {
class BotkitConversation (line 115) | class BotkitConversation<O extends object = {}> extends Dialog<O> {
method constructor (line 132) | public constructor(dialogId: string, controller: Botkit) {
method say (line 167) | public say(message: Partial<BotkitMessageTemplate> | string): BotkitCo...
method addAction (line 197) | public addAction(action: string, thread_name = 'default'): BotkitConve...
method addChildDialog (line 226) | public addChildDialog(dialog_id: string, key_name?: string, thread_nam...
method addGotoDialog (line 253) | public addGotoDialog(dialog_id: string, thread_name = 'default'): Botk...
method addMessage (line 282) | public addMessage(message: Partial<BotkitMessageTemplate> | string, th...
method ask (line 344) | public ask(message: Partial<BotkitMessageTemplate> | string, handlers:...
method addQuestion (line 358) | public addQuestion(message: Partial<BotkitMessageTemplate> | string, h...
method before (line 419) | public before(thread_name: string, handler: (convo: BotkitDialogWrappe...
method runBefore (line 433) | private async runBefore(thread_name: string, dc: DialogContext, step: ...
method after (line 471) | public after(handler: (results: any, bot: BotWorker) => void): void {
method runAfter (line 480) | private async runAfter(context: DialogContext, results: any): Promise<...
method onChange (line 506) | public onChange(variable: string, handler: (response, convo, bot) => P...
method runOnChange (line 521) | private async runOnChange(variable: string, value: any, dc: DialogCont...
method beginDialog (line 544) | public async beginDialog(dc: DialogContext, options: any): Promise<any> {
method continueDialog (line 559) | public async continueDialog(dc: DialogContext): Promise<any> {
method resumeDialog (line 576) | public async resumeDialog(dc, reason, result): Promise<any> {
method onStep (line 592) | private async onStep(dc, step): Promise<any> {
method runStep (line 718) | private async runStep(dc: DialogContext, index: number, thread_name: s...
method end (line 766) | public async end(dc: DialogContext): Promise<DialogTurnStatus> {
method makeOutgoing (line 788) | private async makeOutgoing(dc: DialogContext, line: any, vars: any): P...
method parseTemplatesRecursive (line 920) | private parseTemplatesRecursive(attachments: any, vars: any): any {
method gotoThreadAction (line 950) | private async gotoThreadAction(thread: string, dc: DialogContext, step...
method handleAction (line 963) | private async handleAction(path, dc, step): Promise<any> {
FILE: packages/botkit/src/conversationState.ts
class BotkitConversationState (line 17) | class BotkitConversationState extends ConversationState {
method getStorageKey (line 18) | public getStorageKey(context: TurnContext): string | undefined {
FILE: packages/botkit/src/core.ts
type BotkitConfiguration (line 26) | interface BotkitConfiguration {
type BotkitMessage (line 94) | interface BotkitMessage {
type BotkitHandler (line 155) | interface BotkitHandler {
type BotkitTrigger (line 162) | interface BotkitTrigger {
type BotkitPlugin (line 174) | interface BotkitPlugin {
class Botkit (line 188) | class Botkit {
method constructor (line 330) | public constructor(config: BotkitConfiguration) {
method shutdown (line 454) | public async shutdown(): Promise<void> {
method getConfig (line 478) | public getConfig(key?: string): any {
method usePlugin (line 490) | public usePlugin(plugin_or_function: ((botkit: Botkit) => BotkitPlugin...
method registerPlugin (line 511) | private registerPlugin(name: string, endpoints: BotkitPlugin): void {
method addPluginExtension (line 563) | public addPluginExtension(name: string, extension: any): void {
method plugins (line 573) | public get plugins(): {[key: string]: any} {
method publicFolder (line 588) | public publicFolder(alias, path): void {
method getLocalView (line 602) | public getLocalView(path_to_view): string {
method addDep (line 624) | public addDep(name: string): void {
method completeDep (line 635) | public completeDep(name: string): boolean {
method signalBootComplete (line 654) | private signalBootComplete(): void {
method ready (line 677) | public ready(handler: () => any): void {
method configureWebhookEndpoint (line 689) | private configureWebhookEndpoint(): void {
method handleTurn (line 712) | public async handleTurn(turnContext: TurnContext): Promise<any> {
method saveState (line 784) | public async saveState(bot: BotWorker): Promise<void> {
method processTriggersAndEvents (line 794) | private async processTriggersAndEvents(bot: BotWorker, message: Botkit...
method listenForTriggers (line 819) | private async listenForTriggers(bot: BotWorker, message: BotkitMessage...
method listenForInterrupts (line 843) | private async listenForInterrupts(bot: BotWorker, message: BotkitMessa...
method testTrigger (line 867) | private async testTrigger(trigger: BotkitTrigger, message: BotkitMessa...
method hears (line 913) | public hears(patterns: (string | RegExp | { (message: BotkitMessage): ...
method interrupts (line 968) | public interrupts(patterns: (string | RegExp | { (message: BotkitMessa...
method on (line 1020) | public on(events: string | string[], handler: BotkitHandler): void {
method trigger (line 1052) | public async trigger(event: string, bot?: BotWorker, message?: BotkitM...
method spawn (line 1076) | public async spawn(config?: any, custom_adapter?: BotAdapter): Promise...
method loadModule (line 1122) | public loadModule(p: string): void {
method loadModules (line 1151) | public loadModules(p: string, exts: string[] = ['.js']): void {
method addDialog (line 1179) | public addDialog(dialog: Dialog): void {
method afterDialog (line 1206) | public afterDialog(dialog: Dialog | string, handler: BotkitHandler): v...
FILE: packages/botkit/src/dialogWrapper.ts
class BotkitDialogWrapper (line 17) | class BotkitDialogWrapper {
method constructor (line 27) | public constructor(dc: DialogContext, step: BotkitConversationStep) {
method gotoThread (line 37) | public async gotoThread(thread: string): Promise<void> {
method repeat (line 45) | public async repeat(): Promise<void> {
method stop (line 53) | public async stop(): Promise<void> {
method setVar (line 65) | public setVar(key, val): void {
FILE: packages/botkit/src/teamsHelpers.ts
class TeamsBotWorker (line 18) | class TeamsBotWorker extends BotWorker {
method replyWithTaskInfo (line 31) | public async replyWithTaskInfo(message: BotkitMessage, taskInfo: any):...
class TeamsInvokeMiddleware (line 73) | class TeamsInvokeMiddleware extends MiddlewareSet {
method onTurn (line 79) | public async onTurn(context: TurnContext, next: () => Promise<any>): P...
FILE: packages/botkit/src/testClient.ts
class BotkitTestClient (line 23) | class BotkitTestClient {
method constructor (line 49) | public constructor(channelOrAdapter: string | TestAdapter, bot: Botkit...
method sendActivity (line 96) | public async sendActivity(activity: Partial<Activity> | string): Promi...
method getNextReply (line 105) | public getNextReply(): Partial<Activity> {
method getDefaultCallback (line 109) | private getDefaultCallback(targetDialogs: Dialog[], initialDialogOptio...
method addUserMiddlewares (line 121) | private addUserMiddlewares(middlewares: Middleware[]): void {
FILE: packages/botkit/tests/CustomAdapter.tests.js
class FakeBotWorker (line 5) | class FakeBotWorker extends BotWorker {
method constructor (line 6) | constructor(controller, config) {
method getUser (line 10) | getUser() {
class FakeAdapter (line 18) | class FakeAdapter extends TestAdapter {
class CustomTestClient (line 24) | class CustomTestClient extends BotkitTestClient {
method constructor (line 25) | constructor(channelId, bot, dialogToTest) {
function createDialog (line 31) | function createDialog(controller) {
FILE: packages/docs/build/parse.js
function buildTOC (line 23) | function buildTOC(dest) {
function buildAdapters (line 30) | function buildAdapters(dest) {
function buildPlugins (line 37) | function buildPlugins(dest) {
function buildIndex (line 44) | function buildIndex(dest) {
function generateAdapter (line 55) | function generateAdapter(src, params, dest) {
function generatePlugin (line 79) | function generatePlugin(src, params, dest) {
function generateReference (line 102) | function generateReference(src, dest) {
function sortByName (line 163) | function sortByName(a,b) {
function botkitAtTop (line 169) | function botkitAtTop(a,b) {
function workerAtTop (line 180) | function workerAtTop(a,b) {
function adapterAtTop (line 191) | function adapterAtTop(a,b) {
FILE: packages/generator-botkit/generators/app/index.js
method prompting (line 24) | async prompting() {
method composing (line 49) | async composing() {
method writing (line 67) | writing() {
method install (line 100) | install() {
FILE: packages/generator-botkit/generators/app/templates/bot.js
function getTokenForTeam (line 203) | async function getTokenForTeam(teamId) {
function getBotUserByTeam (line 215) | async function getBotUserByTeam(teamId) {
FILE: packages/generator-botkit/generators/botframework/index.js
method prompting (line 4) | async prompting() {
method writing (line 20) | writing() {
method install (line 38) | install() {
FILE: packages/generator-botkit/generators/facebook/index.js
method prompting (line 11) | async prompting() {
method writing (line 37) | writing() {
method install (line 55) | install() {
FILE: packages/generator-botkit/generators/hangouts/index.js
method prompting (line 12) | async prompting() {
method writing (line 29) | writing() {
method install (line 48) | install() {
FILE: packages/generator-botkit/generators/slack/index.js
method prompting (line 11) | async prompting() {
method writing (line 59) | writing() {
method install (line 77) | install() {
FILE: packages/generator-botkit/generators/slack/templates/features/routes_oauth.js
function getTokenForTeam (line 51) | async function getTokenForTeam(teamId) {
function getBotUserByTeam (line 63) | async function getBotUserByTeam(teamId) {
FILE: packages/generator-botkit/generators/twilio-sms/index.js
method prompting (line 10) | async prompting() {
method writing (line 32) | writing() {
method install (line 50) | install() {
FILE: packages/generator-botkit/generators/web/index.js
method prompting (line 12) | async prompting() {
method writing (line 19) | writing() {
method install (line 46) | install() {
FILE: packages/generator-botkit/generators/web/templates/public/client.js
function s4 (line 331) | function s4() {
FILE: packages/generator-botkit/generators/webex/index.js
method prompting (line 10) | async prompting() {
method writing (line 27) | writing() {
method install (line 44) | install() {
FILE: packages/testbot/features/waterfall_dialog.js
constant DIALOG_ID (line 5) | const DIALOG_ID = 'waterfall_sample';
constant PROMPT_ID (line 6) | const PROMPT_ID = 'waterfall_prompt';
FILE: packages/testbot/public/client.js
function s4 (line 323) | function s4() {
Condensed preview — 250 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,636K chars).
[
{
"path": ".editorconfig",
"chars": 141,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\n\n[*.j"
},
{
"path": ".eslintignore",
"chars": 17,
"preview": "packages/testbot\n"
},
{
"path": ".eslintrc.json",
"chars": 1104,
"preview": "{\n \"parser\": \"@typescript-eslint/parser\",\n \"plugins\": [\"@typescript-eslint\"],\n \"extends\": [\"plugin:@typescript-"
},
{
"path": ".github/issue_template.md",
"chars": 1025,
"preview": "\n** DO NOT ERASE THESE INSTRUCTIONS WITHOUT READING THEM FIRST **\n\nPlease read this entire template before posting any i"
},
{
"path": ".github/stale.yml",
"chars": 704,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a "
},
{
"path": ".gitignore",
"chars": 308,
"preview": "node_modules/\nstart.sh\nstart_button.sh\ndb/\nexamples/db_slackbutton_bot/\nexamples/db_slackbutton_incomingwebhook/\nexample"
},
{
"path": ".npmignore",
"chars": 22,
"preview": "docs/provisioning/IMG\n"
},
{
"path": ".travis.yml",
"chars": 103,
"preview": "language: node_js\nnode_js:\n- lts/*\nscript:\n- lerna bootstrap --hoist\n- lerna run build\n- lerna run test"
},
{
"path": "ATTRIBUTIONS.md",
"chars": 60980,
"preview": "# bser\n\nCopyright 2015-present Facebook, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may n"
},
{
"path": "CONTRIBUTING.md",
"chars": 3559,
"preview": "# Instructions for Contributing Code\n\nThis project welcomes contributions and suggestions. Most contributions require y"
},
{
"path": "LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "build/botkit-ci.yml",
"chars": 5180,
"preview": "# Node.js\n# Build a general Node.js project with npm.\n# Add steps that analyze code, save build artifacts, deploy, and m"
},
{
"path": "build/botkit-daily.yml",
"chars": 7013,
"preview": "# Node.js\n# Build a general Node.js project with npm.\n# Add steps that analyze code, save build artifacts, deploy, and m"
},
{
"path": "build/scripts/rebasePackageLock.js",
"chars": 2750,
"preview": "#!/bin/node\n\n'use strict';\n\n// Usage:\n// cat package-lock.json | node rebasePackageLock.mjs https://your-project.pkgs."
},
{
"path": "changelog.md",
"chars": 57819,
"preview": "# Change Log\n\n[View the official Botkit roadmap](https://github.com/howdyai/botkit/projects/9) for upcoming changes and "
},
{
"path": "lerna.json",
"chars": 69,
"preview": "{\n \"packages\": [\n \"packages/*\"\n ],\n \"version\": \"independent\"\n}\n"
},
{
"path": "package.json",
"chars": 752,
"preview": "{\n \"name\": \"botkit-packages\",\n \"private\": true,\n \"scripts\": {\n \"postinstall\": \"lerna bootstrap --hoist\",\n \"buil"
},
{
"path": "packages/botbuilder-adapter-facebook/.eslintrc.js",
"chars": 629,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botbuilder-adapter-facebook/.gitignore",
"chars": 37,
"preview": "node_modules/\n.env\nlib/\n.nyc_output/\n"
},
{
"path": "packages/botbuilder-adapter-facebook/CHANGELOG.md",
"chars": 960,
"preview": "# botbuilder-adapter-facebook changelog\n\n# 1.0.11\n\n* Update dependencies to Botkit 4.10, Bot Framework 4.10\n\n# 1.0.10\n\n*"
},
{
"path": "packages/botbuilder-adapter-facebook/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botbuilder-adapter-facebook/package.json",
"chars": 1230,
"preview": "{\n \"name\": \"botbuilder-adapter-facebook\",\n \"version\": \"1.0.12\",\n \"description\": \"Connect Botkit or BotBuilder to Face"
},
{
"path": "packages/botbuilder-adapter-facebook/readme.md",
"chars": 8339,
"preview": "# botbuilder-adapter-facebook\nConnect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmjs.c"
},
{
"path": "packages/botbuilder-adapter-facebook/src/botworker.ts",
"chars": 3277,
"preview": "/**\n * @module botbuilder-adapter-facebook\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-facebook/src/facebook_adapter.ts",
"chars": 19287,
"preview": "/**\n * @module botbuilder-adapter-facebook\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-facebook/src/facebook_api.ts",
"chars": 3120,
"preview": "/**\n * @module botbuilder-adapter-facebook\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-facebook/src/facebook_event_middleware.ts",
"chars": 2970,
"preview": "/**\n * @module botbuilder-adapter-facebook\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-facebook/src/index.ts",
"chars": 294,
"preview": "/**\n * @module botbuilder-adapter-facebook\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-facebook/tests/FacebookAdapter.tests.js",
"chars": 7138,
"preview": "const assert = require('assert');\nconst { FacebookAdapter } = require('../');\nconst { FakeAPI, Res, Req, fakeVerifySigna"
},
{
"path": "packages/botbuilder-adapter-facebook/tests/FacebookEventMiddleware.tests.js",
"chars": 1322,
"preview": "const assert = require('assert');\nconst { FacebookAdapter, FacebookEventTypeMiddleware } = require('../');\nconst { Res, "
},
{
"path": "packages/botbuilder-adapter-facebook/tests/shared.js",
"chars": 825,
"preview": "\nmodule.exports.FakeAPI = class FakeAPI {\n constructor(cb) {\n this.cb = cb;\n }\n callAPI(endpoint, method"
},
{
"path": "packages/botbuilder-adapter-facebook/tsconfig.json",
"chars": 354,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/botbuilder-adapter-hangouts/.eslintrc.js",
"chars": 629,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botbuilder-adapter-hangouts/.gitignore",
"chars": 37,
"preview": "node_modules/\n.env\nlib/\n.nyc_output/\n"
},
{
"path": "packages/botbuilder-adapter-hangouts/CHANGELOG.md",
"chars": 442,
"preview": "# botbuilder-adapter-hangouts changelog\n\n\n# 1.0.8\n\n* Update dependencies to Botkit 4.10, Bot Framework 4.10\n\n# 1.0.7\n\n* "
},
{
"path": "packages/botbuilder-adapter-hangouts/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botbuilder-adapter-hangouts/package.json",
"chars": 1254,
"preview": "{\n \"name\": \"botbuilder-adapter-hangouts\",\n \"version\": \"1.0.9\",\n \"description\": \"Connect Botkit or BotBuilder to Googl"
},
{
"path": "packages/botbuilder-adapter-hangouts/readme.md",
"chars": 6797,
"preview": "# botbuilder-adapter-hangouts\n\nConnect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmjs."
},
{
"path": "packages/botbuilder-adapter-hangouts/src/botworker.ts",
"chars": 7580,
"preview": "/**\n * @module botbuilder-adapter-hangouts\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-hangouts/src/hangouts_adapter.ts",
"chars": 16252,
"preview": "/**\n * @module botbuilder-adapter-hangouts\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-hangouts/src/index.ts",
"chars": 188,
"preview": "/**\n * @module botbuilder-adapter-hangouts\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licen"
},
{
"path": "packages/botbuilder-adapter-hangouts/tests/HangoutsAdapter.tests.js",
"chars": 601,
"preview": "const assert = require('assert');\nconst { HangoutsAdapter } = require('../');\n\ndescribe('HangoutsAdapter', function() {\n"
},
{
"path": "packages/botbuilder-adapter-hangouts/tsconfig.json",
"chars": 354,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/botbuilder-adapter-slack/.eslintrc.js",
"chars": 629,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botbuilder-adapter-slack/.gitignore",
"chars": 37,
"preview": "node_modules/\n.env\nlib/\n.nyc_output/\n"
},
{
"path": "packages/botbuilder-adapter-slack/CHANGELOG.md",
"chars": 3647,
"preview": "# botbuilder-adapter-slack changelog\n\n\n# 1.0.13\n\n* Update dependencies to Botkit 4.10, Bot Framework 4.10\n* Update @slac"
},
{
"path": "packages/botbuilder-adapter-slack/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botbuilder-adapter-slack/examples/index.js",
"chars": 9078,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst restify = require"
},
{
"path": "packages/botbuilder-adapter-slack/examples/multiteam.js",
"chars": 9834,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst restify = require"
},
{
"path": "packages/botbuilder-adapter-slack/package.json",
"chars": 1216,
"preview": "{\n \"name\": \"botbuilder-adapter-slack\",\n \"version\": \"1.0.14\",\n \"description\": \"Connect Botkit or BotBuilder to Slack\","
},
{
"path": "packages/botbuilder-adapter-slack/readme.md",
"chars": 17129,
"preview": "# botbuilder-adapter-slack\n\nConnect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmjs.com"
},
{
"path": "packages/botbuilder-adapter-slack/src/botworker.ts",
"chars": 14358,
"preview": "/**\n * @module botbuilder-adapter-slack\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-slack/src/index.ts",
"chars": 326,
"preview": "/**\n * @module botbuilder-adapter-slack\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-slack/src/messagetype_middleware.ts",
"chars": 4297,
"preview": "/**\n * @module botbuilder-adapter-slack\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-slack/src/slack_adapter.ts",
"chars": 34546,
"preview": "/**\n * @module botbuilder-adapter-slack\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-slack/src/slack_dialog.ts",
"chars": 5978,
"preview": "/**\n * @module botbuilder-adapter-slack\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-slack/src/slackevent_middleware.ts",
"chars": 1918,
"preview": "/**\n * @module botbuilder-adapter-slack\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-slack/tests/SlackAdapter.tests.js",
"chars": 825,
"preview": "const assert = require('assert');\nconst { SlackAdapter } = require('../');\n\ndescribe('SlackAdapter', function() {\n\n l"
},
{
"path": "packages/botbuilder-adapter-slack/tsconfig.json",
"chars": 354,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/.eslintrc.js",
"chars": 582,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botbuilder-adapter-twilio-sms/.gitignore",
"chars": 37,
"preview": "node_modules/\n.env\nlib/\n.nyc_output/\n"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/CHANGELOG.md",
"chars": 440,
"preview": "# botbuilder-adapter-twilio changelog\n\n# 1.0.7\n\n* Update dependencies to Botkit 4.10, Bot Framework 4.10\n\n# 1.0.6\n\n* Upd"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/package.json",
"chars": 1282,
"preview": "{\n \"name\": \"botbuilder-adapter-twilio-sms\",\n \"version\": \"1.0.8\",\n \"description\": \"Connect Botkit or BotBuilder to Twi"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/readme.md",
"chars": 5182,
"preview": "# botbuilder-adapter-twilio-sms\n\nConnect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmj"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/src/botworker.ts",
"chars": 1581,
"preview": "/**\n * @module botbuilder-adapter-twilio-sms\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Lic"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/src/index.ts",
"chars": 217,
"preview": "/**\n * @module botbuilder-adapter-twilio-sms\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Lic"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/src/twilio_adapter.ts",
"chars": 12212,
"preview": "/**\n * @module botbuilder-adapter-twilio-sms\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Lic"
},
{
"path": "packages/botbuilder-adapter-twilio-sms/tests/TwilioAdapter.tests.js",
"chars": 652,
"preview": "const assert = require('assert');\nconst { TwilioAdapter } = require('../');\n\ndescribe('TwilioAdapter', function() {\n\n "
},
{
"path": "packages/botbuilder-adapter-twilio-sms/tsconfig.json",
"chars": 354,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/botbuilder-adapter-web/.eslintrc.js",
"chars": 629,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botbuilder-adapter-web/.gitignore",
"chars": 37,
"preview": "node_modules/\n.env\nlib/\n.nyc_output/\n"
},
{
"path": "packages/botbuilder-adapter-web/CHANGELOG.md",
"chars": 1316,
"preview": "# botbuilder-adapter-web changelog\n\n# 1.0.9\n\n* Update dependencies to Botkit 4.10, Bot Framework 4.10\n\n* Fix to websocke"
},
{
"path": "packages/botbuilder-adapter-web/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botbuilder-adapter-web/client/client.js",
"chars": 15177,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nvar converter ="
},
{
"path": "packages/botbuilder-adapter-web/client/css/embed.css",
"chars": 407,
"preview": "#embedded_messenger {\n position: fixed;\n z-index: 1000;\n bottom: -400px;\n right: 2rem;\n height: 434px;\n transition"
},
{
"path": "packages/botbuilder-adapter-web/client/css/styles.css",
"chars": 6022,
"preview": "/* shared botkit ui styles */\n* {\n box-sizing: border-box;\n}\n\nbody,\nhtml {\n margin: 0;\n padding: 0;\n font-size: 18px"
},
{
"path": "packages/botbuilder-adapter-web/client/embed.js",
"chars": 3118,
"preview": "var Botkit = {\n\n setCookie: function(cname, cvalue, exdays) {\n var d = new Date();\n d.setTime(d.getTime() +"
},
{
"path": "packages/botbuilder-adapter-web/client/index.html",
"chars": 2856,
"preview": "<html>\n <head>\n <title>Botkit Anywhere</title>\n <script src=\"https://cdn.polyfill.io/v3/polyfill.min.js"
},
{
"path": "packages/botbuilder-adapter-web/client/readme.md",
"chars": 9992,
"preview": "## Botkit's Customizable web-based chat client\n\nBotkit includes an easy to customize chat client that can be used as a f"
},
{
"path": "packages/botbuilder-adapter-web/client/sass/_botkit.scss",
"chars": 2097,
"preview": "$botkit_purple: #a795ef;\n@mixin clearfix {\n &:after {\n content: \"\";\n display: table;\n clear: bot"
},
{
"path": "packages/botbuilder-adapter-web/client/sass/_chat.scss",
"chars": 4240,
"preview": "$action_color: orange;\n$background: #FFFFFF;\n$bot_message_background: #F0F0F0;\n$bot_message_text: #333;\n$human_message_b"
},
{
"path": "packages/botbuilder-adapter-web/client/sass/_home.scss",
"chars": 363,
"preview": "#home {\n @include clearfix;\n position: relative;\n max-width: 650px;\n margin: auto;\n}\n\n#homepage_bot {\n wi"
},
{
"path": "packages/botbuilder-adapter-web/client/sass/embed.scss",
"chars": 371,
"preview": "$height: 400px;\n\n#embedded_messenger {\n\n position: fixed;\n z-index: 1000;\n\n bottom: -$height;\n right: 2rem;\n\n heigh"
},
{
"path": "packages/botbuilder-adapter-web/client/sass/styles.scss",
"chars": 137,
"preview": "/* shared botkit ui styles */\n@import \"_botkit\";\n\n/* chat client */\n@import \"_chat\";\n\n/* special styles for homepage */\n"
},
{
"path": "packages/botbuilder-adapter-web/package.json",
"chars": 1258,
"preview": "{\n \"name\": \"botbuilder-adapter-web\",\n \"version\": \"1.0.10\",\n \"description\": \"Connect Botkit or BotBuilder to the Web\","
},
{
"path": "packages/botbuilder-adapter-web/readme.md",
"chars": 4282,
"preview": "# botbuilder-adapter-web\nConnect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmjs.com/pa"
},
{
"path": "packages/botbuilder-adapter-web/src/index.ts",
"chars": 178,
"preview": "/**\n * @module botbuilder-adapter-web\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed u"
},
{
"path": "packages/botbuilder-adapter-web/src/web_adapter.ts",
"chars": 12745,
"preview": "/**\n * @module botbuilder-adapter-web\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed u"
},
{
"path": "packages/botbuilder-adapter-web/tests/WebAdapter.tests.js",
"chars": 538,
"preview": "const assert = require('assert');\nconst { WebAdapter } = require('../');\n\ndescribe('WebAdapter', function() {\n\n let a"
},
{
"path": "packages/botbuilder-adapter-web/tsconfig.json",
"chars": 354,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/botbuilder-adapter-webex/.eslintrc.js",
"chars": 629,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botbuilder-adapter-webex/.gitignore",
"chars": 36,
"preview": ".nyc_output/\nnode_modules/\n.env\nlib/"
},
{
"path": "packages/botbuilder-adapter-webex/CHANGELOG.md",
"chars": 2209,
"preview": "# botbuilder-adapter-webex changelog\n\n# 1.0.9\n\n* Test for presence of channelData before accessing it. Thanks [@viveksyn"
},
{
"path": "packages/botbuilder-adapter-webex/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botbuilder-adapter-webex/package.json",
"chars": 1238,
"preview": "{\n \"name\": \"botbuilder-adapter-webex\",\n \"version\": \"1.0.10\",\n \"description\": \"Connect Botkit or BotBuilder to Webex T"
},
{
"path": "packages/botbuilder-adapter-webex/readme.md",
"chars": 5751,
"preview": "# botbuilder-adapter-webex\nConnect [Botkit](https://www.npmjs.com/package/botkit) or [BotBuilder](https://www.npmjs.com/"
},
{
"path": "packages/botbuilder-adapter-webex/src/botworker.ts",
"chars": 6275,
"preview": "/**\n * @module botbuilder-adapter-webex\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-webex/src/index.ts",
"chars": 211,
"preview": "/**\n * @module botbuilder-adapter-webex\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-webex/src/webex_adapter.ts",
"chars": 24627,
"preview": "/**\n * @module botbuilder-adapter-webex\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed"
},
{
"path": "packages/botbuilder-adapter-webex/tests/WebexAdapter.tests.js",
"chars": 649,
"preview": "const assert = require('assert');\nconst { WebexAdapter } = require('../');\n\ndescribe('WebexAdapter', function() {\n\n l"
},
{
"path": "packages/botbuilder-adapter-webex/tsconfig.json",
"chars": 354,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/botkit/.eslintrc.js",
"chars": 582,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botkit/.gitignore",
"chars": 30,
"preview": "node_modules/\nlib/\n.nyc_output"
},
{
"path": "packages/botkit/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botkit/README.md",
"chars": 6348,
"preview": "# Botkit - Building Blocks for Building Bots\n\n[](https://www.npmjs.com/pa"
},
{
"path": "packages/botkit/package.json",
"chars": 1425,
"preview": "{\n \"name\": \"botkit\",\n \"version\": \"4.15.0\",\n \"description\": \"Building Blocks for Building Bots\",\n \"main\": \"lib/index."
},
{
"path": "packages/botkit/src/adapter.ts",
"chars": 3159,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/botworker.ts",
"chars": 17772,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/conversation.ts",
"chars": 42485,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/conversationState.ts",
"chars": 2146,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/core.ts",
"chars": 46135,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/dialogWrapper.ts",
"chars": 2111,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/index.ts",
"chars": 311,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/teamsHelpers.ts",
"chars": 4071,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/src/testClient.ts",
"chars": 5564,
"preview": "/**\n * @module botkit\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT Lic"
},
{
"path": "packages/botkit/tests/Core.tests.js",
"chars": 1356,
"preview": "const assert = require('assert');\nconst { Botkit, TeamsBotWorker } = require('../');\nconst { TwilioAdapter, TwilioBotWor"
},
{
"path": "packages/botkit/tests/CustomAdapter.tests.js",
"chars": 2097,
"preview": "const { Botkit, BotkitConversation, BotkitTestClient, BotWorker } = require('..');\nconst { TestAdapter, AutoSaveStateMid"
},
{
"path": "packages/botkit/tests/Dialog.tests.js",
"chars": 25388,
"preview": "const assert = require('assert');\nconst { ActivityTypes } = require('botbuilder');\nconst { Botkit, BotkitTestClient, Bot"
},
{
"path": "packages/botkit/tests/State.tests.js",
"chars": 1782,
"preview": "const assert = require('assert');\nconst { BotkitConversationState } = require('../lib/conversationState');\nconst { Memor"
},
{
"path": "packages/botkit/tsconfig.json",
"chars": 355,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/botkit-plugin-cms/.eslintrc.js",
"chars": 629,
"preview": "module.exports = {\n \"extends\": \"standard\",\n \"rules\": {\n \"semi\": [2, \"always\"],\n \"indent\": [2, 4],\n "
},
{
"path": "packages/botkit-plugin-cms/.gitignore",
"chars": 18,
"preview": "node_modules/\nlib/"
},
{
"path": "packages/botkit-plugin-cms/CHANGELOG.md",
"chars": 450,
"preview": "# botkit-plugin-cms\n\n# botkit-plugin-cms changelog\n\n# 1.0.3\n\n* Emit a better error when an invalid token has been provid"
},
{
"path": "packages/botkit-plugin-cms/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/botkit-plugin-cms/package.json",
"chars": 1072,
"preview": "{\n \"name\": \"botkit-plugin-cms\",\n \"version\": \"1.0.4\",\n \"description\": \"Extend Botkit with access to botkit-cms\",\n \"ma"
},
{
"path": "packages/botkit-plugin-cms/readme.md",
"chars": 3874,
"preview": "# botkit-plugin-cms\n\nUse and extend dialogs authored remotely using [Botkit CMS](https://github.com/howdyai/botkit-cms#r"
},
{
"path": "packages/botkit-plugin-cms/src/cms.ts",
"chars": 12468,
"preview": "/**\n * @module botkit-plugin-cms\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under "
},
{
"path": "packages/botkit-plugin-cms/src/index.ts",
"chars": 165,
"preview": "/**\n * @module botkit-plugin-cms\n */\n/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under "
},
{
"path": "packages/botkit-plugin-cms/tsconfig.json",
"chars": 354,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2015\",\n \"module\": \"commonjs\",\n \"declaration\": true,\n \"sourceMap\": tru"
},
{
"path": "packages/docs/.gitignore",
"chars": 13,
"preview": "build/*.json\n"
},
{
"path": "packages/docs/advanced.md",
"chars": 11311,
"preview": "# Advanced topics\n\n## What causes the error: `UnhandledPromiseRejectionWarning: TypeError: Cannot perform 'get' on a pro"
},
{
"path": "packages/docs/build/adapter.hbs",
"chars": 90,
"preview": "[← Botkit Documentation](../core.md) [← Platform Index](index.md) \n\n{{{body}}}\n"
},
{
"path": "packages/docs/build/build.sh",
"chars": 1985,
"preview": "#!/bin/sh\n# generate main docs\n./node_modules/.bin/typedoc --excludePrivate --ignoreCompilerErrors --module amd --hideG"
},
{
"path": "packages/docs/build/parse.js",
"chars": 7500,
"preview": "const fs = require('fs');\nconst Handlebars = require('handlebars');\nlet markup = fs.readFileSync(__dirname + '/template."
},
{
"path": "packages/docs/build/plugin.hbs",
"chars": 87,
"preview": "[← Botkit Documentation](../core.md) [← Plugin Index](index.md) \n\n{{{body}}}"
},
{
"path": "packages/docs/build/template.hbs",
"chars": 4073,
"preview": "# {{name}} Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis is a class r"
},
{
"path": "packages/docs/build/toc-platforms.hbs",
"chars": 243,
"preview": "# {{title}}\n\n[← Botkit Core Docs](../core.md)\n\n{{#each index}}\n* [{{name}}](../{{path}})\n {{#each classes}}\n "
},
{
"path": "packages/docs/build/toc.hbs",
"chars": 181,
"preview": "# {{title}}\n\n[← Botkit Core Docs](../core.md)\n\n{{#each index}}\n* [{{name}}](../{{path}})\n {{#each classes}}\n "
},
{
"path": "packages/docs/conversations.md",
"chars": 19445,
"preview": "# Botkit Conversations\n\nBotkit's core SDK ships with a Botkit-friendly dialog class called [BotkitConversation](referenc"
},
{
"path": "packages/docs/core.md",
"chars": 33584,
"preview": "# Botkit Core \n\nTable of Contents\n\n* [The Botkit Controller](#the-botkit-controller)\n* [Botkit Basics](#botkit-basics)\n*"
},
{
"path": "packages/docs/index.json",
"chars": 1345475,
"preview": "{\n \"reference\": [\n {\n \"name\": \"Botkit Core\",\n \"packageName\": \"botkit\",\n \"path\": \"reference/core.md\",\n"
},
{
"path": "packages/docs/index.md",
"chars": 4989,
"preview": "# Botkit: Building Blocks for Building Bots\n\n<a href=\"https://www.npmjs.com/package/botkit\" title=\"View most recent vers"
},
{
"path": "packages/docs/package.json",
"chars": 412,
"preview": "{\n \"name\": \"botkit-docs\",\n \"version\": \"1.0.0\",\n \"description\": \"Documentation for Botkit 4.x\",\n \"scripts\": {\n \"bu"
},
{
"path": "packages/docs/platforms/facebook.md",
"chars": 8359,
"preview": "[← Botkit Documentation](../core.md) [← Platform Index](index.md) \n\n# botbuilder-adapter-facebook\nConnect [Bo"
},
{
"path": "packages/docs/platforms/hangouts.md",
"chars": 6817,
"preview": "[← Botkit Documentation](../core.md) [← Platform Index](index.md) \n\n# botbuilder-adapter-hangouts\n\nConnect [B"
},
{
"path": "packages/docs/platforms/index.md",
"chars": 379,
"preview": "# Platform Adapters\n\n[← Botkit Core Docs](../core.md)\n\n* [Websocket and Webhooks](../platforms/web.md)\n* [Webex Tea"
},
{
"path": "packages/docs/platforms/slack.md",
"chars": 17079,
"preview": "[← Botkit Documentation](../core.md) [← Platform Index](index.md) \n\n# botbuilder-adapter-slack\n\nConnect [Botk"
},
{
"path": "packages/docs/platforms/twilio-sms.md",
"chars": 5227,
"preview": "[← Botkit Documentation](../core.md) [← Platform Index](index.md) \n\n# botbuilder-adapter-twilio-sms\n\nConnect "
},
{
"path": "packages/docs/platforms/web.md",
"chars": 4327,
"preview": "[← Botkit Documentation](../core.md) [← Platform Index](index.md) \n\n# botbuilder-adapter-web\nConnect [Botkit]"
},
{
"path": "packages/docs/platforms/webex.md",
"chars": 5786,
"preview": "[← Botkit Documentation](../core.md) [← Platform Index](index.md) \n\n# botbuilder-adapter-webex\nConnect [Botki"
},
{
"path": "packages/docs/plugins/cms.md",
"chars": 3901,
"preview": "[← Botkit Documentation](../core.md) [← Plugin Index](index.md) \n\n# botkit-plugin-cms\n\nUse and extend dialogs"
},
{
"path": "packages/docs/plugins/index.md",
"chars": 98,
"preview": "# Botkit Plugins\n\n[← Botkit Core Docs](../core.md)\n\n* [Botkit CMS Plugin](../plugins/cms.md)\n"
},
{
"path": "packages/docs/provisioning/cisco-spark.md",
"chars": 2033,
"preview": "# Configure Botkit and Cisco Webex Teams\n\nSetting up a bot for Cisco Webex Teams is one of the easiest experiences for b"
},
{
"path": "packages/docs/provisioning/facebook_messenger.md",
"chars": 2558,
"preview": "# Configure Botkit and Facebook Messenger\n\n*Note: This also applies for [Facebook Workplace](https://www.facebook.com/wo"
},
{
"path": "packages/docs/provisioning/index.md",
"chars": 661,
"preview": "# Provisioning Botkit\nAs Botkit adds more platforms, it becomes increasingly difficult to keep track of all the methods "
},
{
"path": "packages/docs/provisioning/slack-events-api.md",
"chars": 4187,
"preview": "# Configure Botkit and the Slack Events API\n\nBuilding a bot with Botkit and the Slack Events API gives you access to all"
},
{
"path": "packages/docs/provisioning/teams.md",
"chars": 3845,
"preview": "# Configure Botkit and Microsoft Teams\nBuilding a bot with Botkit and the Microsoft Teams API gives you access to all of"
},
{
"path": "packages/docs/provisioning/twilio-sms.md",
"chars": 1954,
"preview": "# Configure Botkit and Twilio SMS\n\nSetting up a bot for Twilio SMS is one of the easiest experiences for bot developers!"
},
{
"path": "packages/docs/readme.md",
"chars": 567,
"preview": "# Botkit 4.x Docs\n\nThis repo contains the source material for the official Botkit 4.x docs.\n\n* [Get Started](index.md)\n*"
},
{
"path": "packages/docs/reference/cms.md",
"chars": 4991,
"preview": "# Botkit CMS Plugin Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis is "
},
{
"path": "packages/docs/reference/core.md",
"chars": 49173,
"preview": "# Botkit Core Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis is a clas"
},
{
"path": "packages/docs/reference/facebook.md",
"chars": 12312,
"preview": "# Botkit for Facebook Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis i"
},
{
"path": "packages/docs/reference/hangouts.md",
"chars": 12091,
"preview": "# Botkit for Hangouts Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis i"
},
{
"path": "packages/docs/reference/index.md",
"chars": 2052,
"preview": "# Class Index\n\n[← Botkit Core Docs](../core.md)\n\n* [Botkit Core](../reference/core.md)\n * [Botkit](../reference/"
},
{
"path": "packages/docs/reference/slack.md",
"chars": 27871,
"preview": "# Botkit for Slack Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis is a"
},
{
"path": "packages/docs/reference/twilio-sms.md",
"chars": 6440,
"preview": "# Botkit for Twilio SMS Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis"
},
{
"path": "packages/docs/reference/web.md",
"chars": 5804,
"preview": "# Botkit for the Web Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThis is"
},
{
"path": "packages/docs/reference/webex.md",
"chars": 12692,
"preview": "# Botkit for Webex Teams Class Reference\n\n[← Botkit Documentation](../core.md) [← Class Index](index.md) \n\nThi"
},
{
"path": "packages/generator-botkit/CHANGELOG.md",
"chars": 318,
"preview": "# 4.10.0\n\n* Update to Botkit 4.10\n\n# 4.6.3\n\nFix issue introduced in 4.6.2 that removed required .env file templates\n\n# 4"
},
{
"path": "packages/generator-botkit/LICENSE.md",
"chars": 1081,
"preview": "Copyright XOXCO, Inc, http://xoxco.com, http://howdy.ai\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "packages/generator-botkit/generators/app/index.js",
"chars": 3109,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nvar Generator ="
},
{
"path": "packages/generator-botkit/generators/app/templates/bot.js",
"chars": 6791,
"preview": "// __ __ ___ ___\n// |__) / \\ | |__/ | | \n// |__) \\__/ | | \\ | | \n\n// This is the main file for the "
},
{
"path": "packages/generator-botkit/generators/app/templates/features/sample_echo.js",
"chars": 440,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nmodule.exports "
},
{
"path": "packages/generator-botkit/generators/app/templates/features/sample_hears.js",
"chars": 961,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports ="
},
{
"path": "packages/generator-botkit/generators/app/templates/gitignore",
"chars": 18,
"preview": ".env\nnode_modules/"
},
{
"path": "packages/generator-botkit/generators/app/templates/package.json",
"chars": 393,
"preview": "{\n \"name\": \"botkit-<%= safe_name %>\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"bot.js\",\n \"scrip"
},
{
"path": "packages/generator-botkit/generators/app/templates/readme.md",
"chars": 620,
"preview": "# Botkit Starter Kit\n\nThis is a Botkit starter kit for <%= platform %>, created with the [Yeoman generator](https://gith"
},
{
"path": "packages/generator-botkit/generators/botframework/index.js",
"chars": 855,
"preview": "var Generator = require('yeoman-generator');\n\nmodule.exports = class extends Generator {\n async prompting() {\n\n "
},
{
"path": "packages/generator-botkit/generators/botframework/templates/features/botframework_features.js",
"chars": 243,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nmodule.exports "
},
{
"path": "packages/generator-botkit/generators/facebook/index.js",
"chars": 1411,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\n var Generator "
},
{
"path": "packages/generator-botkit/generators/facebook/templates/features/facebook_features.js",
"chars": 540,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nmodule.exports "
},
{
"path": "packages/generator-botkit/generators/hangouts/index.js",
"chars": 1124,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\n var Generator "
},
{
"path": "packages/generator-botkit/generators/hangouts/templates/features/hangouts_features.js",
"chars": 5969,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nmodule.exports "
},
{
"path": "packages/generator-botkit/generators/slack/index.js",
"chars": 2207,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nvar Generator = "
},
{
"path": "packages/generator-botkit/generators/slack/templates/features/routes_oauth.js",
"chars": 2113,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n/**\n * This modu"
},
{
"path": "packages/generator-botkit/generators/slack/templates/features/slack_features.js",
"chars": 7818,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst { SlackDia"
},
{
"path": "packages/generator-botkit/generators/twilio-sms/index.js",
"chars": 1301,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nvar Generator = "
},
{
"path": "packages/generator-botkit/generators/twilio-sms/templates/features/twilio_features.js",
"chars": 558,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst Twilio = r"
},
{
"path": "packages/generator-botkit/generators/web/index.js",
"chars": 1263,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\n var Generator "
},
{
"path": "packages/generator-botkit/generators/web/templates/features/chat.js",
"chars": 487,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst express = "
},
{
"path": "packages/generator-botkit/generators/web/templates/features/typing.js",
"chars": 1476,
"preview": "/**\n * This module demonstrates the use of the typing indicator in a conversation, and when using bot.reply\n * Tell your"
},
{
"path": "packages/generator-botkit/generators/web/templates/features/websocket_features.js",
"chars": 764,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports ="
},
{
"path": "packages/generator-botkit/generators/web/templates/public/client.js",
"chars": 15055,
"preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nvar converter = "
},
{
"path": "packages/generator-botkit/generators/web/templates/public/css/embed.css",
"chars": 407,
"preview": "#embedded_messenger {\n position: fixed;\n z-index: 1000;\n bottom: -400px;\n right: 2rem;\n height: 434px;\n transition"
},
{
"path": "packages/generator-botkit/generators/web/templates/public/css/styles.css",
"chars": 6022,
"preview": "/* shared botkit ui styles */\n* {\n box-sizing: border-box;\n}\n\nbody,\nhtml {\n margin: 0;\n padding: 0;\n font-size: 18px"
},
{
"path": "packages/generator-botkit/generators/web/templates/public/index.html",
"chars": 2780,
"preview": "<html>\n <head>\n <title>Botkit Anywhere</title>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/han"
},
{
"path": "packages/generator-botkit/generators/web/templates/sass/_botkit.scss",
"chars": 2097,
"preview": "$botkit_purple: #a795ef;\n@mixin clearfix {\n &:after {\n content: \"\";\n display: table;\n clear: bot"
},
{
"path": "packages/generator-botkit/generators/web/templates/sass/_chat.scss",
"chars": 4240,
"preview": "$action_color: orange;\n$background: #FFFFFF;\n$bot_message_background: #F0F0F0;\n$bot_message_text: #333;\n$human_message_b"
},
{
"path": "packages/generator-botkit/generators/web/templates/sass/_home.scss",
"chars": 363,
"preview": "#home {\n @include clearfix;\n position: relative;\n max-width: 650px;\n margin: auto;\n}\n\n#homepage_bot {\n wi"
}
]
// ... and 50 more files (download for full content)
About this extraction
This page contains the full source code of the howdyai/botkit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 250 files (2.4 MB), approximately 632.3k tokens, and a symbol index with 329 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.