stealth 2.0.0.beta5 → 2.0.0.beta6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitbook.yaml +1 -0
- data/.github/dependabot.yml +11 -0
- data/.github/workflows/ci.yml +50 -0
- data/CHANGELOG.md +1 -0
- data/Gemfile.lock +36 -35
- data/MAINTENANCE.md +28 -0
- data/SECURITY.md +13 -0
- data/VERSION +1 -1
- data/docs/.gitbook/assets/2880px-Turnstile_state_machine_colored.svg.png +0 -0
- data/docs/.gitbook/assets/Torniqueterevolution.jpg +0 -0
- data/docs/.gitbook/assets/logo.svg +28 -0
- data/docs/.gitbook/assets/ruby.png +0 -0
- data/docs/README.md +35 -0
- data/docs/SUMMARY.md +99 -0
- data/docs/basics.md +77 -0
- data/docs/building-components/message-services.md +7 -0
- data/docs/building-components/nlp.md +7 -0
- data/docs/config/services.yml.md +2 -0
- data/docs/config/settings.md +2 -0
- data/docs/controllers/available-data.md +77 -0
- data/docs/controllers/catch-alls.md +135 -0
- data/docs/controllers/controller-overview.md +130 -0
- data/docs/controllers/dev-jumps.md +47 -0
- data/docs/controllers/get_match/README.md +2 -0
- data/docs/controllers/get_match/alpha-ordinals.md +2 -0
- data/docs/controllers/get_match/entity-match.md +2 -0
- data/docs/controllers/get_match/exact-match.md +2 -0
- data/docs/controllers/handle_message/README.md +54 -0
- data/docs/controllers/handle_message/alpha-ordinal-matcher.md +40 -0
- data/docs/controllers/handle_message/homophone-detection.md +36 -0
- data/docs/controllers/handle_message/nil-matcher.md +44 -0
- data/docs/controllers/handle_message/nlp-matcher.md +51 -0
- data/docs/controllers/handle_message/regex-matcher.md +41 -0
- data/docs/controllers/handle_message/string-mather.md +23 -0
- data/docs/controllers/interrupt-detection.md +2 -0
- data/docs/controllers/platform-errors.md +2 -0
- data/docs/controllers/route.md +70 -0
- data/docs/controllers/sessions/README.md +2 -0
- data/docs/controllers/sessions/do_nothing.md +17 -0
- data/docs/controllers/sessions/intro.md +37 -0
- data/docs/controllers/sessions/step_back.md +88 -0
- data/docs/controllers/sessions/step_to.md +47 -0
- data/docs/controllers/sessions/step_to_at.md +43 -0
- data/docs/controllers/sessions/step_to_in.md +43 -0
- data/docs/controllers/sessions/update_session_to.md +47 -0
- data/docs/controllers/unrecognized-messages.md +2 -0
- data/docs/deployment/heroku.md +2 -0
- data/docs/deployment/overview.md +2 -0
- data/docs/dev-environment/README.md +2 -0
- data/docs/dev-environment/booting-up.md +33 -0
- data/docs/dev-environment/environment-variables.md +54 -0
- data/docs/dev-environment/hot-code-reloading.md +52 -0
- data/docs/dev-environment/logs.md +74 -0
- data/docs/dev-environment/procfile.md +22 -0
- data/docs/dev-environment/tunnels.md +18 -0
- data/docs/flows/flowmap.md +40 -0
- data/docs/flows/overview.md +43 -0
- data/docs/flows/state-naming.md +53 -0
- data/docs/flows/state-options.md +70 -0
- data/docs/getting-started.md +19 -0
- data/docs/glossary.md +21 -0
- data/docs/models/activerecord.md +2 -0
- data/docs/models/mongoid.md +2 -0
- data/docs/models/overview.md +2 -0
- data/docs/nlp-nlu/microsoft-luis.md +2 -0
- data/docs/nlp-nlu/openai.md +2 -0
- data/docs/nlp-nlu/overview.md +2 -0
- data/docs/platforms/alexa-skills.md +2 -0
- data/docs/platforms/facebook-messenger.md +2 -0
- data/docs/platforms/overview.md +2 -0
- data/docs/platforms/sms-whatsapp.md +2 -0
- data/docs/platforms/voice.md +2 -0
- data/docs/replies/delays.md +2 -0
- data/docs/replies/erb.md +2 -0
- data/docs/replies/inline-replies.md +2 -0
- data/docs/replies/reply-overview.md +2 -0
- data/docs/replies/variants.md +2 -0
- data/docs/replies/yaml-replies.md +2 -0
- data/docs/testing/integration-testing.md +2 -0
- data/docs/testing/untitled.md +2 -0
- data/lib/stealth/server.rb +10 -1
- data/stealth.gemspec +1 -1
- metadata +81 -5
- data/.circleci/config.yml +0 -226
@@ -0,0 +1,18 @@
|
|
1
|
+
# Tunnels
|
2
|
+
|
3
|
+
When developing locally, message platforms require access to the Stealth server running on your machine in order to transmit user messages. 
|
4
|
+
|
5
|
+
Here are some options you can use:
|
6
|
+
|
7
|
+
### ngrok
|
8
|
+
|
9
|
+
1. Download [ngrok](https://ngrok.com/download)
|
10
|
+
2. Start your Stealth server as detailed in [Booting Up](booting-up.md#boot-your-bot).
|
11
|
+
3. Open up an ngrok tunnel to your Stealth server and port (default 5000) like this: `ngrok http 5000`. ngrok will output a unique ngrok local tunnel URL to your machine.
|
12
|
+
|
13
|
+
When you provide your local ngrok URL to a messaging service, you will have to add `/incoming/<service>`. For example:
|
14
|
+
|
15
|
+
* `https://abc1234.ngrok.io/incoming/facebook`
|
16
|
+
* `https://abc1234.ngrok.io/incoming/twilio`
|
17
|
+
|
18
|
+
More details on service specific settings can be found on the GitHub page for each service gem.
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# FlowMap
|
2
|
+
|
3
|
+
The `FlowMap` is the file that contains your flow and state declarations. It's stored in `config/flow_map.rb` and will be generated by Stealth when you instantiate your bot.
|
4
|
+
|
5
|
+
Here is a `FlowMap` similar to the one that is generated for a new bot:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
class FlowMap
|
9
|
+
|
10
|
+
include Stealth::Flow
|
11
|
+
|
12
|
+
flow :hello do
|
13
|
+
state :say_hello
|
14
|
+
state :get_hello_response, fails_to: :say_hello
|
15
|
+
end
|
16
|
+
|
17
|
+
flow :goodbye do
|
18
|
+
state :say_goodbye
|
19
|
+
end
|
20
|
+
|
21
|
+
flow :interrupt do
|
22
|
+
state :say_interrupted
|
23
|
+
end
|
24
|
+
|
25
|
+
flow :unrecognized_message do
|
26
|
+
state :handle_unrecognized_message
|
27
|
+
end
|
28
|
+
|
29
|
+
flow :catch_all do
|
30
|
+
state :level1
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
In this example, we've declared five flows: `hello`, `goodbye`, `interrupt`, `unrecognized_message`, and `catch_all`. These are the default flows that are generated for you when you create a new bot.
|
37
|
+
|
38
|
+
Each flow consists of an arbitrary number of states. All of the above flows only have a single state, but the `hello` flow has two. As you build out your bot and add functionality, you'll need to keep the `FlowMap` updated. If you attempt to transition to a flow or state that hasn't yet been declared in the `FlowMap`, you'll encounter a Stealth`::Errors::InvalidStateTransition` exception.
|
39
|
+
|
40
|
+
States also support additional options like the `fails_to` option for the `get_hello_response` state. We'll cover these state options in the [State Option docs](state-options.md) section.
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Flows & States
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
Flows and states are the primary building blocks for Stealth bots. Your bot's users can only be in a single flow and state at any given moment. The relationship between flows and states is one of parent and child, respectively. So a flow can _have many_ states and a state always _belongs to_ a single flow.
|
6
|
+
|
7
|
+
The concept is modeled after [finite-state machines](https://en.m.wikipedia.org/wiki/Finite-state\_machine), though you don't need to familiarize yourself with all of that knowledge. The outline we provide in these docs will be sufficient.
|
8
|
+
|
9
|
+
Finite-state machines, or more simply state machines, are used throughout engineering to model states within a given machine. Imagine a coin-operated, turnstile you might find in a subway or airport. You insert a coin and the mechanism unlocks to allow you to rotate the arms and pass through.
|
10
|
+
|
11
|
+
![Figure 1: A simple, coin-operated turnstile](../../.gitbook/assets/torniqueterevolution.jpg)
|
12
|
+
|
13
|
+
The operation of this turnstile can (and probably is) modeled as a state machine. Here is an example of what that model looks like:
|
14
|
+
|
15
|
+
![Figure 2: Finite-state machine model for the simple, coin-operated turnstile.](../../.gitbook/assets/2880px-turnstile\_state\_machine\_colored.svg.png)
|
16
|
+
|
17
|
+
In Figure 2, the "starting" state is _Locked_ and if someone attempts to _Push_ the turnstile arms while it is in the _Locked_ state it will indefinitely remain in the _Locked_ state. That's what the self-referencing _Push_ action in Figure 2 is showing. Similarly, in Stealth, states can transition a user to a new state or it can keep a user in the same state either indefinitely or until some specific action is taken.
|
18
|
+
|
19
|
+
When a user inserts a _Coin_, the state machine in Figure 2 transitions the machine to the _Unlocked_ state. If a user inserts more coins while in this state, the machine just remains in the _Unlocked_ state. When the turnstile arms are _Pushed_, then the machine transitions back to the _Locked_ state.
|
20
|
+
|
21
|
+
This turnstile example highlights the mental model of flows and states in Stealth quite well. Specifically, states can transition your users to other states or they can keep your user in the same state. In the section about [Sessions](../controllers/sessions/), we'll cover all the ways these transitions can happen.
|
22
|
+
|
23
|
+
## Flows
|
24
|
+
|
25
|
+
A **flow** is the term used to describe a complete interaction between a user and the bot. Flows are comprised of `states`, like a finite state machine. In Figure 2 above, the entire finite-state machine is the flow.
|
26
|
+
|
27
|
+
For example, if a user is using your bot to receive an insurance quote, the flow might be named `quote`. 
|
28
|
+
|
29
|
+
{% hint style="warning" %}
|
30
|
+
Stealth requires that flows be named in the singular form, like Ruby on Rails.
|
31
|
+
{% endhint %}
|
32
|
+
|
33
|
+
A flow consists of the following components:
|
34
|
+
|
35
|
+
1. A controller file, named in the plural form. For example, a `quote` flow would have a corresponding `QuotesController`. One controller maps to one flow.
|
36
|
+
2. Replies. Each flow will have a directory in the `replies` directory in plural form. Again using the `quote` flow example, the directory would named `quotes`.
|
37
|
+
3. An entry in the `FlowMap`. The `FlowMap` file is where each flow and it's respective states are defined. We'll cover the FlowMap file in [FlowMap docs](flowmap.md) section.
|
38
|
+
|
39
|
+
## States
|
40
|
+
|
41
|
+
A **state** is the logical division of flows. Just like in finite-state machines, users can transition between states. In Stealth, users can even transition between states from different flows. There are no naming conventions enforced by Stealth for states, but in [State Naming section](state-naming.md) we'll cover some best practices.
|
42
|
+
|
43
|
+
As mentioned in the above, a user can at most be in a single flow and state at any given moment.
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# State Naming
|
2
|
+
|
3
|
+
While Stealth doesn't enforce any naming requirements for your states, we do recommend following the naming conventions outlined below. It provides continuity across your team and across bots.
|
4
|
+
|
5
|
+
Most of your states will fall into the `say`, `get`, and `ask` buckets. On the rare occasion that it does not, feel free to select a name that best describes the state.
|
6
|
+
|
7
|
+
## Say, Ask, Get
|
8
|
+
|
9
|
+
#### Say
|
10
|
+
|
11
|
+
_Say_ actions are for _saying_ something to the user.
|
12
|
+
|
13
|
+
For example:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
def say_hello
|
17
|
+
send_replies
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
Typically we'd send the user to a new state, but sometimes it's as simple as just saying something like in the case of the end of a flow or conversation.
|
22
|
+
|
23
|
+
#### Ask
|
24
|
+
|
25
|
+
_Ask_ actions are for _asking_ something from the user.
|
26
|
+
|
27
|
+
For example:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
def ask_weather
|
31
|
+
send_replies
|
32
|
+
update_session_to state: 'get_weather_response'
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
In the above example, we've asked a question via `send_replies` and we've updated the session to a new state. This is the state that will be receiving the response. We'll cover state transitions in detail in the [Sessions Overview](../controllers/sessions/intro.md) section.
|
37
|
+
|
38
|
+
#### Get
|
39
|
+
|
40
|
+
_Get_ actions are for _getting_ and parsing a message from the user.
|
41
|
+
|
42
|
+
For example:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
def get_weather_response
|
46
|
+
handle_message(
|
47
|
+
'Sunny' => proc { step_to state: 'say_wear_sunglasses' },
|
48
|
+
'Raining' => proc { step_to state: 'say_dont_forget_umbrella' }
|
49
|
+
)
|
50
|
+
end
|
51
|
+
```
|
52
|
+
|
53
|
+
In the example above, we're handling two responses by the user. When they say "Sunny" or "Raining". Don't worry too much about the format of `handle_message`. We cover its usage in the [handle\_message docs](../controllers/handle\_message/) section.
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# State Options
|
2
|
+
|
3
|
+
In your `FlowMap`, each state may also specify certain options. Some options expose built-in Stealth functionality, while others are completely custom and can be referenced by your code.
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
class FlowMap
|
7
|
+
|
8
|
+
include Stealth::Flow
|
9
|
+
|
10
|
+
flow :hello do
|
11
|
+
state :say_hello
|
12
|
+
state :get_hello_response, fails_to: :say_hello
|
13
|
+
state :say_hola, redirects_to: :say_hello
|
14
|
+
end
|
15
|
+
|
16
|
+
flow :goodbye do
|
17
|
+
state :say_goodbye, re_engage: false
|
18
|
+
end
|
19
|
+
|
20
|
+
flow :interrupt do
|
21
|
+
state :say_interrupted
|
22
|
+
end
|
23
|
+
|
24
|
+
flow :unrecognized_message do
|
25
|
+
state :handle_unrecognized_message
|
26
|
+
end
|
27
|
+
|
28
|
+
flow :catch_all do
|
29
|
+
state :level1
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
We see three states have options defined: `get_hello_response`, `say_hola`, and `say_goodbye`.
|
36
|
+
|
37
|
+
#### fails\_to
|
38
|
+
|
39
|
+
The `fails_to` option is one of the built-in Stealth state options. By default, it's used in the `CatchAllsController` to specify where a user should be sent in the event of an error. We cover this more in the [CatchAll docs](../controllers/catch-alls.md), but in the `get_hello_response` state above, if Stealth encounters an error the `fails_to` option declares the user to be sent to the `say_hello` state of the same flow.
|
40
|
+
|
41
|
+
The `fails_to` value can also be a string if you wish to specify a different flow. So for example:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
state :get_hello_response, fails_to: 'goodbye->say_goodbye'
|
45
|
+
```
|
46
|
+
|
47
|
+
If Stealth encounters an error in this state, it will be sent to the `say_goodbye` state of the `goodbye` flow.
|
48
|
+
|
49
|
+
#### redirects\_to
|
50
|
+
|
51
|
+
The `redirects_to` option is useful when you're performing a rename of a state and the bot has already been deployed to production. Your production users may have existing sessions attached to the state you are renaming. If you were to perform a state rename without attaching a `redirects_to` to the old state name, the user will receive an error the next time they message your bot.
|
52
|
+
|
53
|
+
{% hint style="info" %}
|
54
|
+
For the `redirects_to`values, you can use state names as well as the "flow->state\_name" convention like in `fails_to`.
|
55
|
+
{% endhint %}
|
56
|
+
|
57
|
+
#### Custom Options
|
58
|
+
|
59
|
+
In addition to the built-in Stealth state options, you are able to define your own. This is helpful for cases where you want to define metadata for a set of states but don't want to define that logic within the controllers.
|
60
|
+
|
61
|
+
In the example `FlowMap` above, we've defined a `re_engage` option on the `say_goodbye` state. If we pretend our bot re-engages leads after a period of time, this option would be useful for allowing us to declare states for which we do not want re-engagements to be sent. In this case, the user has reached the end of the bot and so we don't want to send them any re-engagements.
|
62
|
+
|
63
|
+
You can access these custom state options via the `opts` attribute for the state specification.
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
state_spec = FlowMap.flow_spec[:goodbye].states[:say_goodbye]
|
67
|
+
state_spec.opts.present? && state_spec.opts[:re_engage]
|
68
|
+
```
|
69
|
+
|
70
|
+
Here `state_spec.opts[:re_engage]` contains the value `true`. The hash key will correspond to what you named your option in the `FlowMap`.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Getting Started
|
2
|
+
|
3
|
+
Stealth is designed to run on Ruby (MRI) 2.5+
|
4
|
+
|
5
|
+
While we don't require any C-based Ruby gems, we haven't yet certified Stealth on other VMs (such as JRuby). However, we do intend to provide official support for JRuby and TruffleRuby soon.
|
6
|
+
|
7
|
+
### Installation
|
8
|
+
|
9
|
+
You can install Stealth via RubyGems:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem install stealth
|
13
|
+
```
|
14
|
+
|
15
|
+
Next, create your new bot:
|
16
|
+
|
17
|
+
```
|
18
|
+
stealth new <bot_name>
|
19
|
+
```
|
data/docs/glossary.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
description: >-
|
3
|
+
Some common terms you may read throughout this doc or as you interact with the
|
4
|
+
Stealth community.
|
5
|
+
---
|
6
|
+
|
7
|
+
# Glossary
|
8
|
+
|
9
|
+
* **message** - An _incoming_ message from a user. A _message_ and a _reply_ are counterparts.
|
10
|
+
* **reply** - An _outgoing_ message from your bot. A _message_ and a _reply_ are counterparts.
|
11
|
+
* **service message** - This is the long version of _message_. You will likely only see this referenced when developing your own Stealth components.
|
12
|
+
* **`current_message`** - This is object that contains the service message. It's available within all controller actions. More info can be found in the [controller docs](controllers/controller-overview.md).
|
13
|
+
* **component** - Components are the individual building blocks of Stealth. Stealth itself is the core framework that handles webhooks, replies, etc. Components allow Stealth to connect to messaging platforms, NLP providers, and more. Each component is offered as a separate Ruby gem.
|
14
|
+
* **message platform** - Message platforms are the platforms where your bot interacts with its users. E.g., Facebook Messenger, SMS, Whatsapp, Slack, etc.
|
15
|
+
* **NLP** - natural language processing. This is the AI subfield that encompasses taking unstructured text (like messages from users) and extracting structured concepts. NLP in Stealth is achieved through components.
|
16
|
+
* **NLU** - A subclass of NLP. More aptly describes the type of NLP you'll want to perform with Stealth, but NLP is the more commonly used term.
|
17
|
+
* **session** - Sessions allow your Stealth bot to recognize subsequent messages from users. It keeps track of where in the conversation each of your users currently reside.
|
18
|
+
* **MVC** - A software design pattern. It's not critical to understand this to get going, but if you're interested you can learn more [here](https://www.google.com/url?sa=t\&rct=j\&q=\&esrc=s\&source=web\&cd=\&cad=rja\&uact=8\&ved=2ahUKEwiGt\_XpzPHtAhXNVc0KHWjiDG8QFjAAegQIBRAC\&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FModel%25E2%2580%2593view%25E2%2580%2593controller\&usg=AOvVaw1wpuCUJRz1WxG51eRibnYX).
|
19
|
+
* **intent** - **** Intents are one of the main things NLP components extract from a message. They are a type of classification. We talk about them in more detail in the `handle_message` [docs](controllers/handle\_message/nlp-matcher.md).
|
20
|
+
* **entity** - Entities are individual tokens within a message that an NLP component will extract. So for example, a number or some other trained entity specific to your bot (like car models and makes). More info about these can be found in the `get_match` [docs](controllers/get\_match/entity-match.md).
|
21
|
+
* **regex** - A regular expression. These are a programming concept used in string matching. In Stealth, these are most often used in `handle_message` and there are [docs](controllers/handle\_message/regex-matcher.md) for their usage.
|
data/docs/replies/erb.md
ADDED
data/lib/stealth/server.rb
CHANGED
@@ -35,7 +35,12 @@ module Stealth
|
|
35
35
|
# JSON params need to be parsed and added to the params
|
36
36
|
if request.env['CONTENT_TYPE']&.match(/application\/json/i)
|
37
37
|
json_params = MultiJson.load(request.body.read)
|
38
|
-
|
38
|
+
|
39
|
+
if bandwidth?
|
40
|
+
params.merge!(json_params.first)
|
41
|
+
else
|
42
|
+
params.merge!(json_params)
|
43
|
+
end
|
39
44
|
end
|
40
45
|
|
41
46
|
dispatcher = Stealth::Dispatcher.new(
|
@@ -60,5 +65,9 @@ module Stealth
|
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
68
|
+
def bandwidth?
|
69
|
+
params[:service] == "bandwidth"
|
70
|
+
end
|
71
|
+
|
63
72
|
end
|
64
73
|
end
|
data/stealth.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
s.add_development_dependency 'rspec', '~> 3.9'
|
23
23
|
s.add_development_dependency 'rspec_junit_formatter', '~> 0.3'
|
24
|
-
s.add_development_dependency 'rack-test', '~>
|
24
|
+
s.add_development_dependency 'rack-test', '~> 2.0'
|
25
25
|
s.add_development_dependency 'mock_redis', '~> 0.22'
|
26
26
|
|
27
27
|
s.files = `git ls-files`.split("\n")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stealth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.beta6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mauricio Gomes
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-
|
12
|
+
date: 2022-09-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -135,14 +135,14 @@ dependencies:
|
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
138
|
+
version: '2.0'
|
139
139
|
type: :development
|
140
140
|
prerelease: false
|
141
141
|
version_requirements: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
145
|
+
version: '2.0'
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: mock_redis
|
148
148
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,15 +164,91 @@ executables:
|
|
164
164
|
extensions: []
|
165
165
|
extra_rdoc_files: []
|
166
166
|
files:
|
167
|
-
- ".
|
167
|
+
- ".gitbook.yaml"
|
168
|
+
- ".github/dependabot.yml"
|
169
|
+
- ".github/workflows/ci.yml"
|
168
170
|
- ".gitignore"
|
169
171
|
- CHANGELOG.md
|
170
172
|
- Gemfile
|
171
173
|
- Gemfile.lock
|
172
174
|
- LICENSE
|
175
|
+
- MAINTENANCE.md
|
173
176
|
- README.md
|
177
|
+
- SECURITY.md
|
174
178
|
- VERSION
|
175
179
|
- bin/stealth
|
180
|
+
- docs/.gitbook/assets/2880px-Turnstile_state_machine_colored.svg.png
|
181
|
+
- docs/.gitbook/assets/Torniqueterevolution.jpg
|
182
|
+
- docs/.gitbook/assets/logo.svg
|
183
|
+
- docs/.gitbook/assets/ruby.png
|
184
|
+
- docs/README.md
|
185
|
+
- docs/SUMMARY.md
|
186
|
+
- docs/basics.md
|
187
|
+
- docs/building-components/message-services.md
|
188
|
+
- docs/building-components/nlp.md
|
189
|
+
- docs/config/services.yml.md
|
190
|
+
- docs/config/settings.md
|
191
|
+
- docs/controllers/available-data.md
|
192
|
+
- docs/controllers/catch-alls.md
|
193
|
+
- docs/controllers/controller-overview.md
|
194
|
+
- docs/controllers/dev-jumps.md
|
195
|
+
- docs/controllers/get_match/README.md
|
196
|
+
- docs/controllers/get_match/alpha-ordinals.md
|
197
|
+
- docs/controllers/get_match/entity-match.md
|
198
|
+
- docs/controllers/get_match/exact-match.md
|
199
|
+
- docs/controllers/handle_message/README.md
|
200
|
+
- docs/controllers/handle_message/alpha-ordinal-matcher.md
|
201
|
+
- docs/controllers/handle_message/homophone-detection.md
|
202
|
+
- docs/controllers/handle_message/nil-matcher.md
|
203
|
+
- docs/controllers/handle_message/nlp-matcher.md
|
204
|
+
- docs/controllers/handle_message/regex-matcher.md
|
205
|
+
- docs/controllers/handle_message/string-mather.md
|
206
|
+
- docs/controllers/interrupt-detection.md
|
207
|
+
- docs/controllers/platform-errors.md
|
208
|
+
- docs/controllers/route.md
|
209
|
+
- docs/controllers/sessions/README.md
|
210
|
+
- docs/controllers/sessions/do_nothing.md
|
211
|
+
- docs/controllers/sessions/intro.md
|
212
|
+
- docs/controllers/sessions/step_back.md
|
213
|
+
- docs/controllers/sessions/step_to.md
|
214
|
+
- docs/controllers/sessions/step_to_at.md
|
215
|
+
- docs/controllers/sessions/step_to_in.md
|
216
|
+
- docs/controllers/sessions/update_session_to.md
|
217
|
+
- docs/controllers/unrecognized-messages.md
|
218
|
+
- docs/deployment/heroku.md
|
219
|
+
- docs/deployment/overview.md
|
220
|
+
- docs/dev-environment/README.md
|
221
|
+
- docs/dev-environment/booting-up.md
|
222
|
+
- docs/dev-environment/environment-variables.md
|
223
|
+
- docs/dev-environment/hot-code-reloading.md
|
224
|
+
- docs/dev-environment/logs.md
|
225
|
+
- docs/dev-environment/procfile.md
|
226
|
+
- docs/dev-environment/tunnels.md
|
227
|
+
- docs/flows/flowmap.md
|
228
|
+
- docs/flows/overview.md
|
229
|
+
- docs/flows/state-naming.md
|
230
|
+
- docs/flows/state-options.md
|
231
|
+
- docs/getting-started.md
|
232
|
+
- docs/glossary.md
|
233
|
+
- docs/models/activerecord.md
|
234
|
+
- docs/models/mongoid.md
|
235
|
+
- docs/models/overview.md
|
236
|
+
- docs/nlp-nlu/microsoft-luis.md
|
237
|
+
- docs/nlp-nlu/openai.md
|
238
|
+
- docs/nlp-nlu/overview.md
|
239
|
+
- docs/platforms/alexa-skills.md
|
240
|
+
- docs/platforms/facebook-messenger.md
|
241
|
+
- docs/platforms/overview.md
|
242
|
+
- docs/platforms/sms-whatsapp.md
|
243
|
+
- docs/platforms/voice.md
|
244
|
+
- docs/replies/delays.md
|
245
|
+
- docs/replies/erb.md
|
246
|
+
- docs/replies/inline-replies.md
|
247
|
+
- docs/replies/reply-overview.md
|
248
|
+
- docs/replies/variants.md
|
249
|
+
- docs/replies/yaml-replies.md
|
250
|
+
- docs/testing/integration-testing.md
|
251
|
+
- docs/testing/untitled.md
|
176
252
|
- lib/stealth.rb
|
177
253
|
- lib/stealth/base.rb
|
178
254
|
- lib/stealth/cli.rb
|