botium-core 1.15.10 → 1.15.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/botium-cjs.js +91 -51
  2. package/dist/botium-cjs.js.map +1 -1
  3. package/dist/botium-es.js +91 -50
  4. package/dist/botium-es.js.map +1 -1
  5. package/package.json +35 -40
  6. package/src/BotDriver.js +1 -1
  7. package/src/Events.js +1 -3
  8. package/src/containers/GridContainer.js +0 -4
  9. package/src/mocks/BotiumMockScripting.js +3 -0
  10. package/src/scripting/Convo.js +10 -0
  11. package/src/utils/boolean.js +39 -0
  12. package/test/compiler/compilercsv.spec.js +34 -0
  13. package/test/compiler/compilermarkdown.spec.js +11 -0
  14. package/test/compiler/compilertxt.spec.js +21 -0
  15. package/test/compiler/compilerxlsx.spec.js +27 -0
  16. package/test/compiler/precompilerjson.spec.js +1 -0
  17. package/test/compiler/precompilermarkdownrasa.spec.js +1 -0
  18. package/test/connectors/pluginconnectorcontainer.spec.js +1 -0
  19. package/test/connectors/simplerest.spec.js +3 -1
  20. package/test/convo/failure.spec.js +1 -0
  21. package/test/convo/fillAndApplyScriptingMemory.spec.js +56 -0
  22. package/test/convo/partialconvo.spec.js +3 -0
  23. package/test/convo/retry.spec.js +9 -0
  24. package/test/convo/retryasserter.spec.js +9 -0
  25. package/test/convo/transcript.spec.js +33 -0
  26. package/test/convo/tree.spec.js +5 -0
  27. package/test/driver/capabilities.spec.js +16 -0
  28. package/test/helpers/capabilitiesutils.spec.js +8 -0
  29. package/test/helpers/transcriptutils.spec.js +1 -0
  30. package/test/hooks/customhooks.spec.js +3 -0
  31. package/test/logichooks/hookfromsrc.spec.js +3 -0
  32. package/test/logichooks/textfromhook.spec.js +1 -0
  33. package/test/plugins/plugins.spec.js +3 -0
  34. package/test/scripting/asserters/buttonsAsserter.spec.js +15 -0
  35. package/test/scripting/asserters/cardsAsserter.spec.js +12 -0
  36. package/test/scripting/asserters/convoStepParameters.spec.js +11 -0
  37. package/test/scripting/asserters/entitiesAsserter.spec.js +1 -0
  38. package/test/scripting/asserters/entityValuesAsserter.spec.js +7 -0
  39. package/test/scripting/asserters/formsAsserter.spec.js +10 -0
  40. package/test/scripting/asserters/intentAsserter.spec.js +4 -0
  41. package/test/scripting/asserters/intentUniqueAsserter.spec.js +2 -0
  42. package/test/scripting/asserters/jsonpathAsserter.spec.js +25 -0
  43. package/test/scripting/asserters/mediaAsserter.spec.js +20 -0
  44. package/test/scripting/asserters/responseLengthAsserter.spec.js +4 -0
  45. package/test/scripting/asserters/textAsserter.spec.js +1 -0
  46. package/test/scripting/asserters/textContainsAllAsserter.spec.js +1 -0
  47. package/test/scripting/asserters/textContainsAnyAsserter.spec.js +1 -0
  48. package/test/scripting/asserters/textEqualsAsserter.spec.js +1 -0
  49. package/test/scripting/asserters/textRegexpAllAsserter.spec.js +1 -0
  50. package/test/scripting/asserters/textRegexpAnyAsserter.spec.js +1 -0
  51. package/test/scripting/asserters/textWildcardAllAsserter.spec.js +1 -0
  52. package/test/scripting/asserters/textWildcardAnyAsserter.spec.js +1 -0
  53. package/test/scripting/asserters/textWildcardExactAllAsserter.spec.js +1 -0
  54. package/test/scripting/asserters/textWildcardExactAnyAsserter.spec.js +1 -0
  55. package/test/scripting/asserters/werAsserter.spec.js +6 -0
  56. package/test/scripting/logichooks/convos/scripting_memory_resolved_args.convo.txt +11 -0
  57. package/test/scripting/logichooks/customConditionalStepLogicHook.spec.js +2 -0
  58. package/test/scripting/logichooks/localvsglobal.spec.js +1 -0
  59. package/test/scripting/logichooks/pauseLogic.spec.js +4 -0
  60. package/test/scripting/logichooks/setClearScriptingMemory.spec.js +17 -0
  61. package/test/scripting/logichooks/updateCustom.spec.js +2 -0
  62. package/test/scripting/matching/matchingmode.spec.js +48 -0
  63. package/test/scripting/scriptingModificator.spec.js +1 -0
  64. package/test/scripting/scriptingmemory/fillScriptingMemoryFromFile.spec.js +4 -0
  65. package/test/scripting/scriptingmemory/regexp.spec.js +1 -0
  66. package/test/scripting/scriptingmemory/useScriptingMemoryForAssertion.spec.js +3 -0
  67. package/test/scripting/txt/decompile.spec.js +20 -0
  68. package/test/scripting/userinputs/buttonInputConvos.spec.js +1 -0
  69. package/test/scripting/userinputs/defaultUserInputs.spec.js +13 -0
  70. package/test/scripting/userinputs/mediaInputConvos.spec.js +10 -0
  71. package/test/scripting/utteranceexpansion/associateByIndex.spec.js +2 -0
  72. package/test/security/allowUnsafe.spec.js +5 -0
  73. package/test/utils.spec.js +2 -0
  74. package/samples/postman/Botium Agent Sample.postman_collection.json +0 -834
  75. package/samples/postman/README.md +0 -5
  76. package/samples/postman/botiumFluent.js +0 -37
  77. package/src/grid/agent/AgentWorker.js +0 -204
  78. package/src/grid/agent/agent.js +0 -96
  79. package/src/grid/agent/agentworkerpool.js +0 -58
  80. package/src/grid/agent/routes.js +0 -353
  81. package/src/grid/agent/swagger.json +0 -327
  82. package/src/grid/agent/swaggerDef.json +0 -8
  83. package/src/grid/agent/views/index.html +0 -39
  84. package/test/grid/agent/client.js +0 -65
@@ -1,5 +0,0 @@
1
- # Botium Grid Sample
2
-
3
- Before running one of these samples, please start the Botium Agent
4
- * either with botium-cli
5
- * or with botium-core - "npm run agent" in source directory
@@ -1,37 +0,0 @@
1
- const BotDriver = require('../../index').BotDriver
2
- const Capabilities = require('../../index').Capabilities
3
-
4
- function assert (expected, actual) {
5
- if (!actual || actual.indexOf(expected) < 0) {
6
- console.log(`ERROR: Expected <${expected}>, got <${actual}>`)
7
- } else {
8
- console.log(`SUCCESS: Got Expected <${expected}>`)
9
- }
10
- }
11
-
12
- const driver = new BotDriver()
13
- .setCapability(Capabilities.BOTIUMGRIDURL, 'http://127.0.0.1:46100')
14
- .setCapability(Capabilities.PROJECTNAME, 'IBM Watson Conversation Sample')
15
- .setCapability(Capabilities.CONTAINERMODE, 'watsonconversation')
16
- .setCapability(Capabilities.WATSONCONVERSATION_USER, '0274cb6f-3680-4cf7-bd6b-71c7f447542d')
17
- .setCapability(Capabilities.WATSONCONVERSATION_PASSWORD, 'ZWDE5xo02sby')
18
- .setCapability(Capabilities.WATSONCONVERSATION_WORKSPACE_ID, '97513bc0-c581-4bec-ac9f-ea6a8ec308a9')
19
- .setCapability(Capabilities.WATSONCONVERSATION_COPY_WORKSPACE, false)
20
-
21
- driver.BuildFluent()
22
- .Start()
23
- .UserSaysText('start')
24
- .WaitBotSaysText((text) => assert('Hi. It looks like a nice drive today. What would you like me to do?', text))
25
- .UserSaysText('turn on the lights please')
26
- .WaitBotSaysText((text) => assert('I\'ll turn on the lights for you.', text))
27
- .UserSaysText('play some jazz music')
28
- .WaitBotSaysText((text) => assert('Great choice! Playing some jazz for you.', text))
29
- .Stop()
30
- .Clean()
31
- .Exec()
32
- .then(() => {
33
- console.log('READY')
34
- })
35
- .catch((err) => {
36
- console.log('ERROR: ', err)
37
- })
@@ -1,204 +0,0 @@
1
- const util = require('util')
2
- const async = require('async')
3
- const debug = require('debug')('botium-core-AgentWorker')
4
-
5
- const BotDriver = require('../../BotDriver')
6
- const Capabilities = require('../../Capabilities')
7
- const Events = require('../../Events')
8
- const Commands = require('../../Commands')
9
- const ScriptingConstants = require('../../scripting/Constants')
10
-
11
- module.exports = class AgentWorker {
12
- constructor (args = { socket: null, slot: null }) {
13
- this.driver = null
14
- this.container = null
15
- this.args = args
16
- this.socket = args.socket
17
- if (this.socket) {
18
- this.socket.on(Commands.BUILD_CONTAINER, this.Build.bind(this))
19
- this.socket.on(Commands.START_CONTAINER, this.Start.bind(this))
20
- this.socket.on(Commands.SENDTOBOT, this.UserSays.bind(this))
21
- this.socket.on(Commands.STOP_CONTAINER, this.Stop.bind(this))
22
- this.socket.on(Commands.CLEAN_CONTAINER, this.Clean.bind(this))
23
- this.socket.on('disconnect', this.Clean.bind(this))
24
- this.socket.on('error', this.Clean.bind(this))
25
- }
26
- }
27
-
28
- Build (caps = {}, sources = {}, env = {}) {
29
- debug(`Build ${JSON.stringify(caps)}, ${JSON.stringify(sources)}, ${JSON.stringify(env)}`)
30
-
31
- return new Promise((resolve, reject) => {
32
- if (this.driver || this.container) {
33
- if (this.socket) {
34
- this.socket.emit(Events.CONTAINER_BUILD_ERROR, 'build already called')
35
- }
36
- return reject(new Error('build already called'))
37
- }
38
- delete caps[Capabilities.BOTIUMGRIDURL]
39
- caps[Capabilities.BOTIUMGRIDSLOT] = this.args.slot
40
-
41
- this.driver = new BotDriver(caps, sources, env)
42
- if (this.socket) {
43
- this.driver.on(Events.CONTAINER_BUILDING, () => this.socket.emit(Events.CONTAINER_BUILDING))
44
- this.driver.on(Events.CONTAINER_BUILT, () => this.socket.emit(Events.CONTAINER_BUILT))
45
- this.driver.on(Events.CONTAINER_BUILD_ERROR, (err) => this.socket.emit(Events.CONTAINER_BUILD_ERROR, err.message ? err.message : err))
46
- this.driver.on(Events.CONTAINER_STARTING, () => this.socket.emit(Events.CONTAINER_STARTING))
47
- this.driver.on(Events.CONTAINER_STARTED, () => this.socket.emit(Events.CONTAINER_STARTED))
48
- this.driver.on(Events.CONTAINER_START_ERROR, (c, err) => this.socket.emit(Events.CONTAINER_START_ERROR, err.message ? err.message : err))
49
- this.driver.on(Events.CONTAINER_STOPPING, () => this.socket.emit(Events.CONTAINER_STOPPING))
50
- this.driver.on(Events.CONTAINER_STOPPED, () => this.socket.emit(Events.CONTAINER_STOPPED))
51
- this.driver.on(Events.CONTAINER_STOP_ERROR, (c, err) => this.socket.emit(Events.CONTAINER_STOP_ERROR, err.message ? err.message : err))
52
- this.driver.on(Events.CONTAINER_CLEANING, () => this.socket.emit(Events.CONTAINER_CLEANING))
53
- this.driver.on(Events.CONTAINER_CLEANED, () => this.socket.emit(Events.CONTAINER_CLEANED))
54
- this.driver.on(Events.CONTAINER_CLEAN_ERROR, (c, err) => this.socket.emit(Events.CONTAINER_CLEAN_ERROR, err.message ? err.message : err))
55
- this.driver.on(Events.BOT_CONNECTED, () => this.socket.emit(Events.BOT_CONNECTED))
56
- this.driver.on(Events.MESSAGE_SENTTOBOT, () => this.socket.emit(Events.MESSAGE_SENTTOBOT))
57
- this.driver.on(Events.MESSAGE_SENDTOBOT_ERROR, (c, err) => this.socket.emit(Events.MESSAGE_SENDTOBOT_ERROR, err.message ? err.message : err))
58
- this.driver.on(Events.MESSAGE_RECEIVEDFROMBOT, (c, msg) => this.socket.emit(Events.MESSAGE_RECEIVEDFROMBOT, msg))
59
- }
60
-
61
- this.driver.Build()
62
- .then((container) => {
63
- debug('Build succeded')
64
- this.container = container
65
- resolve()
66
- })
67
- .catch((err) => {
68
- this.driver = null
69
- this.container = null
70
- debug(`Build failed ${util.inspect(err)}`)
71
- reject(err)
72
- })
73
- })
74
- }
75
-
76
- Start () {
77
- debug('Start')
78
-
79
- return new Promise((resolve, reject) => {
80
- if (!this.container) {
81
- if (this.socket) {
82
- this.socket.emit(Events.CONTAINER_START_ERROR, 'container not built')
83
- }
84
- return reject(new Error('container not built'))
85
- }
86
- this.container.Start()
87
- .then(() => {
88
- debug('Start succeded')
89
- resolve()
90
- })
91
- .catch((err) => {
92
- debug(`Start failed ${util.inspect(err)}`)
93
- reject(err)
94
- })
95
- })
96
- }
97
-
98
- RunScript (script) {
99
- debug('RunScript')
100
-
101
- return new Promise((resolve, reject) => {
102
- if (!this.container) {
103
- if (this.socket) {
104
- this.socket.emit(Events.CONTAINER_START_ERROR, 'container not built')
105
- }
106
- return reject(new Error('container not built'))
107
- }
108
- const compiler = this.driver.BuildCompiler()
109
- compiler.Compile(script, ScriptingConstants.SCRIPTING_FORMAT_TXT, ScriptingConstants.SCRIPTING_TYPE_CONVO)
110
- async.eachSeries(compiler.convos, (convo, convoDone) => {
111
- convo.Run(this.container).then(() => convoDone()).catch(convoDone)
112
- },
113
- (err) => {
114
- if (err) return reject(err)
115
- else resolve()
116
- })
117
- })
118
- }
119
-
120
- UserSays (msg) {
121
- debug(`UserSays ${util.inspect(msg)}`)
122
-
123
- return new Promise((resolve, reject) => {
124
- if (!this.container) {
125
- if (this.socket) {
126
- this.socket.emit(Events.MESSAGE_SENDTOBOT_ERROR, 'container not built')
127
- }
128
- return reject(new Error('container not built'))
129
- }
130
- this.container.UserSays(msg)
131
- .then(() => {
132
- debug('UserSays succeded')
133
- resolve()
134
- })
135
- .catch((err) => {
136
- debug(`UserSays failed ${util.inspect(err)}`)
137
- reject(err)
138
- })
139
- })
140
- }
141
-
142
- WaitBotSays (channel, timeoutMillis) {
143
- debug(`BotSays ${channel} ${timeoutMillis}`)
144
-
145
- return new Promise((resolve, reject) => {
146
- if (!this.container) {
147
- return reject(new Error('container not built'))
148
- }
149
- this.container.WaitBotSays(channel, timeoutMillis)
150
- .then((botMsg) => {
151
- debug('WaitBotSays succeded')
152
- resolve(botMsg)
153
- })
154
- .catch((err) => {
155
- debug(`WaitBotSays failed ${util.inspect(err)}`)
156
- reject(err)
157
- })
158
- })
159
- }
160
-
161
- Stop () {
162
- debug('Stop')
163
-
164
- return new Promise((resolve, reject) => {
165
- if (!this.container) {
166
- if (this.socket) {
167
- this.socket.emit(Events.CONTAINER_STOP_ERROR, 'container not built')
168
- }
169
- return reject(new Error('container not built'))
170
- }
171
- this.container.Stop()
172
- .then(() => {
173
- debug('Stop succeded')
174
- resolve()
175
- })
176
- .catch((err) => {
177
- debug(`Stop failed ${util.inspect(err)}`)
178
- reject(err)
179
- })
180
- })
181
- }
182
-
183
- Clean () {
184
- debug('Clean')
185
-
186
- if (!this.container) return Promise.resolve()
187
-
188
- return new Promise((resolve, reject) => {
189
- this.container.Clean()
190
- .then(() => {
191
- this.container = null
192
- this.driver = null
193
- debug('Clean success')
194
- resolve()
195
- })
196
- .catch((err) => {
197
- this.container = null
198
- this.driver = null
199
- debug(`Clean failed ${util.inspect(err)}`)
200
- reject(err)
201
- })
202
- })
203
- }
204
- }
@@ -1,96 +0,0 @@
1
- const util = require('util')
2
- const express = require('express')
3
- const bodyParser = require('body-parser')
4
- const http = require('http')
5
- const ioSocket = require('socket.io')
6
- const ioAuth = require('socketio-auth')
7
- const swaggerUi = require('swagger-ui-express')
8
- const debug = require('debug')('botium-core-agent')
9
-
10
- const Events = require('../../Events')
11
- const workerpool = require('./agentworkerpool')
12
-
13
- const port = process.env.PORT || 46100
14
- const apiToken = process.env.BOTIUM_API_TOKEN || ''
15
- if (!apiToken) {
16
- console.log('WARNING: BOTIUM_API_TOKEN not set, all clients will be accepted')
17
- } else {
18
- console.log('Add BOTIUM_API_TOKEN header to all HTTP requests, or BOTIUM_API_TOKEN URL parameter')
19
- }
20
-
21
- const app = express()
22
- const server = http.Server(app)
23
- const io = ioSocket(server)
24
-
25
- app.use(bodyParser.json())
26
- app.use(bodyParser.text())
27
- app.use(bodyParser.urlencoded({ extended: false }))
28
- app.use('/api/*', (req, res, next) => {
29
- const clientApiToken = req.headers.BOTIUM_API_TOKEN || req.headers.botium_api_token || req.query.BOTIUM_API_TOKEN || req.query.botium_api_token || req.body.BOTIUM_API_TOKEN || req.body.botium_api_token
30
-
31
- if (!apiToken || apiToken === clientApiToken) {
32
- next()
33
- } else {
34
- debug('agent client not authenticated, wrong api token or api token not given')
35
- const err = new Error('apiToken invalid')
36
- err.code = 401
37
- next(err)
38
- }
39
- })
40
- app.use('/', require('./routes'))
41
- app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(require('./swagger.json')))
42
- app.use((err, req, res, next) => {
43
- debug(`request failed: ${err}`)
44
-
45
- if (err.message) res.statusMessage = err.message
46
-
47
- res.status(err.code || 500)
48
- .json({
49
- status: 'error',
50
- message: err.message ? err.message : err
51
- })
52
- })
53
-
54
- app.get('/swagger.json', (req, res) => {
55
- res.json(require('./swagger.json'))
56
- })
57
-
58
- ioAuth(io, {
59
- authenticate: (socket, data, callback) => {
60
- debug(`agent client authenticate ${socket.id} - ${JSON.stringify(data)} ...`)
61
- const clientApiToken = data.apiToken
62
-
63
- if (!apiToken || apiToken === clientApiToken) {
64
- debug(`agent client authenticated ${socket.id}`)
65
- return callback(null, true)
66
- } else {
67
- debug(`agent client not authenticated ${socket.id}`)
68
- return callback(new Error('apiToken invalid'))
69
- }
70
- }
71
- })
72
-
73
- io.on('connection', (socket) => {
74
- workerpool.allocate({ socket })
75
- .then((worker) => {
76
- debug(`agent client connected ${socket.id}, worker slot ${worker.args.slot}`)
77
- socket.on('disconnect', () => {
78
- debug(`agent client disconnected ${socket.id}`)
79
- workerpool.free(worker)
80
- })
81
- socket.on('error', (err) => {
82
- debug(`agent client error ${socket.id}: ${util.inspect(err)}`)
83
- workerpool.free(worker)
84
- })
85
- })
86
- .catch(() => {
87
- socket.emit(Events.TOOMUCHWORKERS_ERROR, 'Maximum worker count exceeded')
88
- socket.disconnect(true)
89
- })
90
- })
91
-
92
- server.listen(port, () => {
93
- console.log('Swagger UI available at /api-docs')
94
- console.log('Swagger definition available at /swagger.json')
95
- console.log(`listening on *:${port}`)
96
- })
@@ -1,58 +0,0 @@
1
- const path = require('path')
2
-
3
- const AgentWorker = require('./AgentWorker')
4
-
5
- const agentWorkers = new Array(process.env.BOTIUM_WORKER_COUNT ? parseInt(process.env.BOTIUM_WORKER_COUNT) : 10)
6
-
7
- const getStatus = () => {
8
- return {
9
- software: 'Botium Agent',
10
- version: require(path.resolve(__dirname, '..', '..', '..', 'package.json')).version,
11
- maxWorkers: agentWorkers.length,
12
- currentWorkers: agentWorkers.filter((wp) => wp).length
13
- }
14
- }
15
-
16
- const allocate = (workerArgs = {}) => {
17
- return new Promise((resolve, reject) => {
18
- const slot = agentWorkers.findIndex((wp) => !wp)
19
-
20
- if (slot < 0) {
21
- reject(new Error('no worker slot available'))
22
- } else {
23
- const worker = new AgentWorker({ ...workerArgs, slot })
24
- agentWorkers[slot] = worker
25
- resolve(worker)
26
- }
27
- })
28
- }
29
-
30
- const get = (slot) => {
31
- if (agentWorkers[slot]) {
32
- return Promise.resolve(agentWorkers[slot])
33
- } else {
34
- return Promise.reject(new Error(`worker slot ${slot} not available`))
35
- }
36
- }
37
-
38
- const free = (worker) => {
39
- return new Promise((resolve, reject) => {
40
- worker.Clean()
41
- .then(() => {
42
- const slot = agentWorkers.findIndex((wp) => wp === worker)
43
-
44
- if (slot >= 0) {
45
- agentWorkers[slot] = null
46
- }
47
- resolve()
48
- })
49
- .catch(reject)
50
- })
51
- }
52
-
53
- module.exports = {
54
- getStatus,
55
- allocate,
56
- get,
57
- free
58
- }