@indra.ai/deva 1.1.39 → 1.1.40
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.
- package/examples/hello-world.js +10 -9
- package/index.js +480 -418
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -16,10 +16,10 @@ class Deva {
|
|
|
16
16
|
this._security = false; // inherited Security features.
|
|
17
17
|
this._support = false; // inherited Support features.
|
|
18
18
|
this._services = false; // inherited Service features.
|
|
19
|
-
this._assistant = false; // inherited Assistant features.
|
|
20
19
|
this._business = false; // inherited Business features.
|
|
21
20
|
this._development = false; // inherited Business features.
|
|
22
21
|
this._legal = false; // inherited Legal features.
|
|
22
|
+
this._story = false; // inherited Assistant features.
|
|
23
23
|
this.events = opts.events || new EventEmitter({}); // Event Bus
|
|
24
24
|
this.lib = opts.lib || {}; // used for loading library functions
|
|
25
25
|
this.devas = opts.devas || {}; // Devas which are loaded
|
|
@@ -30,8 +30,9 @@ class Deva {
|
|
|
30
30
|
this.methods = opts.methods || {}; // local Methods
|
|
31
31
|
this.maxListeners = opts.maxListenners || 0; // set the local maxListeners
|
|
32
32
|
|
|
33
|
+
// prevent overwriting existing functions and variables with same name
|
|
33
34
|
for (var opt in opts) {
|
|
34
|
-
if (!this[opt]) this[opt] = opts[opt];
|
|
35
|
+
if (!this[opt] || !this[`_${opt}`]) this[opt] = opts[opt];
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
this.cmdChr = '/'; // the trigger for local commands
|
|
@@ -48,39 +49,35 @@ class Deva {
|
|
|
48
49
|
|
|
49
50
|
this._state = 'offline'; // current state of agent.
|
|
50
51
|
this._states = {
|
|
51
|
-
ask:
|
|
52
|
-
question:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
load: 'load',
|
|
64
|
-
unload: 'unload',
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
invalid: 'invalid',
|
|
71
|
-
done: 'done',
|
|
72
|
-
error: 'error',
|
|
52
|
+
ask: `asked another Deva`,
|
|
53
|
+
question: `was asked a question`,
|
|
54
|
+
answer: `offered an answer`,
|
|
55
|
+
|
|
56
|
+
offline: `is Offline`,
|
|
57
|
+
online: `is Online`,
|
|
58
|
+
|
|
59
|
+
init: `Initialize`,
|
|
60
|
+
start: `start your journey`,
|
|
61
|
+
enter: `enter deva.world`,
|
|
62
|
+
stop: `stop what you are doing`,
|
|
63
|
+
exit: 'exit deva.world',
|
|
64
|
+
load: 'load Deva',
|
|
65
|
+
unload: 'unload Deva',
|
|
66
|
+
|
|
67
|
+
invalid: 'State Invalid',
|
|
68
|
+
done: 'State Done',
|
|
69
|
+
error: 'State Error',
|
|
73
70
|
}; // states object
|
|
74
71
|
|
|
75
72
|
this._zone = false; // current state of agent.
|
|
76
73
|
this._zones = {
|
|
77
|
-
deva: '
|
|
74
|
+
deva: 'Deva Zone',
|
|
78
75
|
config: 'Configuration Zone',
|
|
79
|
-
features: '
|
|
76
|
+
features: 'Feature Zone',
|
|
80
77
|
idle: 'Idle Zone',
|
|
81
78
|
train: 'Training Zone',
|
|
82
79
|
work: 'Working Zone',
|
|
83
|
-
invalid: 'Invalid
|
|
80
|
+
invalid: 'Invalid Invalid',
|
|
84
81
|
done: 'Done Zone',
|
|
85
82
|
error: 'Error Zone',
|
|
86
83
|
}; // states object
|
|
@@ -90,122 +87,125 @@ class Deva {
|
|
|
90
87
|
wait: 'wait',
|
|
91
88
|
question: 'question',
|
|
92
89
|
question_ask: 'question:ask',
|
|
93
|
-
question_ask_answer: '
|
|
90
|
+
question_ask_answer: 'returned with an answer',
|
|
94
91
|
question_cmd: 'question:cmd',
|
|
95
92
|
question_method: 'question:method',
|
|
96
|
-
question_talk: '
|
|
93
|
+
question_talk: 'question:talk',
|
|
97
94
|
question_hash: 'question:hash',
|
|
98
95
|
question_answer: 'question:answer',
|
|
99
|
-
question_done: '
|
|
96
|
+
question_done: 'question:done',
|
|
100
97
|
answer: 'answer',
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
98
|
+
answer_hash: 'hashing the answer',
|
|
99
|
+
answer_talk: 'sharing the answer',
|
|
100
|
+
ask: 'asking',
|
|
101
|
+
ask_answer: 'answering',
|
|
102
|
+
security: 'security',
|
|
103
|
+
Security: 'Security Feature',
|
|
104
|
+
support: 'support',
|
|
105
|
+
Support: 'Support Feature',
|
|
106
|
+
systems: 'systems',
|
|
107
|
+
Systems: 'Systems Feature',
|
|
108
|
+
services: 'services',
|
|
109
|
+
Services: 'Services Feature',
|
|
110
|
+
solutions: 'solutions',
|
|
111
|
+
Solutions: 'Solutions Feature',
|
|
112
|
+
development: 'development',
|
|
113
|
+
Development: 'Development Feature',
|
|
114
|
+
business: 'business',
|
|
115
|
+
Business: 'Business Feature',
|
|
116
|
+
legal: 'legal',
|
|
117
|
+
Legal: 'Legal Feature',
|
|
118
|
+
assistant: 'assistant',
|
|
119
|
+
Assistant: 'Assistant Feature',
|
|
120
|
+
story: 'story',
|
|
121
|
+
Story: 'Story Feature',
|
|
122
|
+
mind: 'mind',
|
|
123
|
+
Mind: 'Mind Feature',
|
|
124
|
+
client_data: 'Client Data',
|
|
125
|
+
invalid: 'Actin Invalid',
|
|
126
|
+
error: 'Action Error',
|
|
127
|
+
done: 'Action Done',
|
|
130
128
|
}
|
|
131
129
|
|
|
132
130
|
this._feature = false;
|
|
133
131
|
this._features = {
|
|
134
132
|
security: 'security',
|
|
135
|
-
Security: '
|
|
133
|
+
Security: 'Security Feature',
|
|
136
134
|
support: 'support',
|
|
137
|
-
Support: '
|
|
135
|
+
Support: 'Support Feature',
|
|
138
136
|
services: 'services',
|
|
139
|
-
Services: '
|
|
137
|
+
Services: 'Servicees Feature',
|
|
140
138
|
solutions: 'solutions',
|
|
141
|
-
Solutions: '
|
|
139
|
+
Solutions: 'Solutions Feature',
|
|
142
140
|
systems: 'systems',
|
|
143
|
-
Systems: '
|
|
141
|
+
Systems: 'Systems Feature',
|
|
144
142
|
development: 'development',
|
|
145
|
-
Development: '
|
|
143
|
+
Development: 'Development Feature',
|
|
146
144
|
business: 'business',
|
|
147
|
-
Business: '
|
|
145
|
+
Business: 'Business Feature',
|
|
148
146
|
legal:'legal',
|
|
149
|
-
Legal:'
|
|
147
|
+
Legal:'Legal Feature',
|
|
150
148
|
assistant: 'assistant',
|
|
151
|
-
Assistant: '
|
|
149
|
+
Assistant: 'Assistant Feature',
|
|
152
150
|
story: 'story',
|
|
153
|
-
Story: '
|
|
151
|
+
Story: 'Story Feature',
|
|
154
152
|
mind: 'mind',
|
|
155
|
-
Mind: '
|
|
156
|
-
error: '
|
|
157
|
-
done: '
|
|
153
|
+
Mind: 'Mind Feature',
|
|
154
|
+
error: 'Feature Error',
|
|
155
|
+
done: 'Feature Done',
|
|
158
156
|
};
|
|
159
157
|
|
|
160
158
|
this._messages = {
|
|
161
159
|
states: {
|
|
162
160
|
offline: `${this._agent.profile.name} ${this._states.offline}`,
|
|
163
161
|
online: `${this._agent.profile.name} ${this._states.online}`,
|
|
164
|
-
ask:
|
|
165
|
-
question:
|
|
162
|
+
ask: `😎 ${this._agent.profile.name} ${this._states.ask}`,
|
|
163
|
+
question: `🎙️ ${this._agent.profile.name} ${this._states.question}`,
|
|
164
|
+
answer: `🎟️ ${this._agent.profile.name} ${this._states.answer}`,
|
|
166
165
|
offline: `${this._agent.profile.name} ${this._states.offline}`,
|
|
167
166
|
online: `${this._agent.profile.name} ${this._states.online}`,
|
|
168
|
-
init:
|
|
169
|
-
start:
|
|
170
|
-
enter:
|
|
171
|
-
stop:
|
|
172
|
-
exit:
|
|
173
|
-
load:
|
|
174
|
-
unload:
|
|
167
|
+
init: `🚀 ${this._agent.profile.name} ${this._states.init}`,
|
|
168
|
+
start: `🎬 ${this._agent.profile.name} ${this._states.start}`,
|
|
169
|
+
enter: `📲 ${this._agent.profile.name} ${this._states.enter}`,
|
|
170
|
+
stop: `✋ ${this._agent.profile.name} ${this._states.stop}`,
|
|
171
|
+
exit: `🚪 ${this._agent.profile.name} ${this._states.exit}`,
|
|
172
|
+
load: `📫 ${this._agent.profile.name} ${this._states.load}`,
|
|
173
|
+
unload: `📭 ${this._agent.profile.name} ${this._states.unload}`,
|
|
175
174
|
uid: `${this._agent.profile.name} ${this._states.uid}`,
|
|
176
175
|
hash: `${this._agent.profile.name} ${this._states.hash}`,
|
|
177
176
|
cipher: `${this._agent.profile.name} ${this._states.cipher}`,
|
|
178
177
|
decipher: `${this._agent.profile.name} ${this._states.decipher}`,
|
|
179
|
-
invalid:
|
|
180
|
-
done:
|
|
181
|
-
error:
|
|
178
|
+
invalid: `⚠️ ${this._agent.profile.name} ${this._states.invalid}`,
|
|
179
|
+
done: `✅ ${this._agent.profile.name} ${this._states.done}`,
|
|
180
|
+
error: `❌ ${this._states.error}`,
|
|
182
181
|
},
|
|
183
182
|
zones: {
|
|
184
|
-
deva:
|
|
185
|
-
config:
|
|
186
|
-
features:
|
|
187
|
-
idle:
|
|
188
|
-
train:
|
|
189
|
-
work:
|
|
190
|
-
invalid:
|
|
191
|
-
done:
|
|
192
|
-
error:
|
|
183
|
+
deva: `🎉 ${this._agent.profile.name} entered the ${this._zones.deva}`,
|
|
184
|
+
config: `💪 ${this._agent.profile.name} is in the ${this._zones.config}`,
|
|
185
|
+
features: `🍿 ${this._agent.profile.name} entered the ${this._zones.features}`,
|
|
186
|
+
idle: `🥱 ${this._agent.profile.name} is stuck in the ${this._zones.idle}`,
|
|
187
|
+
train: `👨🎓 ${this._agent.profile.name} is learning in the ${this._zones.train}`,
|
|
188
|
+
work: `😓 ${this._agent.profile.name} is handling things in the ${this._zones.work}`,
|
|
189
|
+
invalid: `⚠️ ${this._agent.profile.name} fell into the ${this._zones.invalid}`,
|
|
190
|
+
done: `✅ ${this._agent.profile.name} and here we are in the ${this._zones.done}`,
|
|
191
|
+
error: `❌ ${this._agent.profile.name} fell into the ${this._zones.error}`,
|
|
193
192
|
},
|
|
194
193
|
actions: {
|
|
195
|
-
wait:
|
|
196
|
-
question:
|
|
197
|
-
question_ask:
|
|
198
|
-
question_ask_answer:
|
|
199
|
-
question_cmd:
|
|
200
|
-
question_method:
|
|
201
|
-
question_talk:
|
|
202
|
-
question_hash:
|
|
203
|
-
question_answer:
|
|
204
|
-
question_done:
|
|
205
|
-
answer:
|
|
206
|
-
answer_talk:
|
|
207
|
-
ask:
|
|
208
|
-
ask_answer:
|
|
194
|
+
wait: `😵💫 ${this._agent.profile.name} ${this._actions.wait}`,
|
|
195
|
+
question: `👀 ${this._agent.profile.name} ${this._actions.question}`,
|
|
196
|
+
question_ask: `👥 ${this._agent.profile.name} ${this._actions.question_ask}`,
|
|
197
|
+
question_ask_answer: `📣 ${this._agent.profile.name} ${this._actions.question_ask_answer}`,
|
|
198
|
+
question_cmd: `🎮 ${this._agent.profile.name} issued a command`,
|
|
199
|
+
question_method: `🏄♂️ ${this._agent.profile.name} ${this._actions.question_method}`,
|
|
200
|
+
question_talk: `📢 ${this._agent.profile.name} ${this._actions.question_talk}`,
|
|
201
|
+
question_hash: `#️⃣ ${this._agent.profile.name} is hashing a question`,
|
|
202
|
+
question_answer: `🎙️ ${this._agent.profile.name} ${this._actions.question_answer}`,
|
|
203
|
+
question_done: `👍 ${this._agent.profile.name} ${this._actions.question_done}`,
|
|
204
|
+
answer: `🎟️ ${this._agent.profile.name} shared the ${this._actions.answer}`,
|
|
205
|
+
answer_talk: `🎟️ ${this._agent.profile.name} is talking the ansnwer for anyone listening `,
|
|
206
|
+
ask: `👥 ${this._agent.profile.name} is asking`,
|
|
207
|
+
ask_answer: `🎟️ ${this._agent.profile.name} is answering the ask`,
|
|
208
|
+
|
|
209
209
|
security: `${this._actions.security} is responding`,
|
|
210
210
|
Security: `${this._actions.Security} is ready`,
|
|
211
211
|
support: `${this._actions.support} is responding`,
|
|
@@ -228,37 +228,37 @@ class Deva {
|
|
|
228
228
|
Story: `${this._actions.Story} is ready`,
|
|
229
229
|
mind: `${this._actions.Mind} is responding`,
|
|
230
230
|
Mind: `${this._actions.Mind} is ready`,
|
|
231
|
-
client_data:
|
|
231
|
+
client_data: `📂 ${this._agent.profile.name} setting Client Data`,
|
|
232
232
|
invalid: `${this._actions.invalid}`,
|
|
233
|
-
done:
|
|
233
|
+
done: `✅ ${this._actions.done}`,
|
|
234
234
|
error: `${this._action.error}`,
|
|
235
235
|
},
|
|
236
236
|
features: {
|
|
237
237
|
security: `${this._features.security} is protecting`,
|
|
238
|
-
Security: `${this._features.Security}
|
|
238
|
+
Security: `${this._features.Security} loading...`,
|
|
239
239
|
support: `${this._features.support} is caring`,
|
|
240
|
-
Support: `${this._features.Support}
|
|
240
|
+
Support: `${this._features.Support} loading...`,
|
|
241
241
|
services: `${this._features.services} is servicing`,
|
|
242
|
-
Services: `${this._features.Services}
|
|
242
|
+
Services: `${this._features.Services} loading...`,
|
|
243
243
|
solutions: `${this._features.solutions} is solving`,
|
|
244
|
-
Solutions: `${this._features.Solutions}
|
|
244
|
+
Solutions: `${this._features.Solutions} loading...`,
|
|
245
245
|
systems: `${this._features.systems} is mantaining`,
|
|
246
|
-
Systems: `${this._features.Systems}
|
|
246
|
+
Systems: `${this._features.Systems} loading...`,
|
|
247
247
|
development: `${this._features.development} is developing`,
|
|
248
|
-
Development: `${this._features.Development}
|
|
248
|
+
Development: `${this._features.Development} loading...`,
|
|
249
249
|
business: `${this._features.business} is successful`,
|
|
250
|
-
Business: `${this._features.Business}
|
|
250
|
+
Business: `${this._features.Business} loading...`,
|
|
251
251
|
legal: `${this._features.legal} is upholding the law`,
|
|
252
|
-
Legal: `${this._features.Legal}
|
|
252
|
+
Legal: `${this._features.Legal} loading...`,
|
|
253
253
|
assistant: `${this._features.assistant} is assisting`,
|
|
254
|
-
Assistant: `${this._features.Assistant}
|
|
254
|
+
Assistant: `${this._features.Assistant} loading...`,
|
|
255
255
|
story: `${this._features.story} is creating`,
|
|
256
|
-
Story: `${this._features.Story}
|
|
256
|
+
Story: `${this._features.Story} loading...`,
|
|
257
257
|
mind: `${this._features.story} is thinking and pondering`,
|
|
258
|
-
Mind: `${this._features.Mind}
|
|
259
|
-
invalid: this._features.invalid
|
|
260
|
-
done: this._features.done
|
|
261
|
-
error: this._features.error
|
|
258
|
+
Mind: `${this._features.Mind} loading...`,
|
|
259
|
+
invalid: `⚠️ ${this._features.invalid}`,
|
|
260
|
+
done: `✅ ${this._features.done}`,
|
|
261
|
+
error: `❌ ${this._features.error}`,
|
|
262
262
|
},
|
|
263
263
|
}; // messages object
|
|
264
264
|
}
|
|
@@ -290,11 +290,12 @@ class Deva {
|
|
|
290
290
|
***************/
|
|
291
291
|
Security() {
|
|
292
292
|
this.feature('Security');
|
|
293
|
+
const _cl = this.client();
|
|
293
294
|
try {
|
|
294
|
-
if (
|
|
295
|
+
if (!_cl.features.security) return this.Support();
|
|
295
296
|
else {
|
|
296
297
|
this.action('Security');
|
|
297
|
-
const {id, profile, features} =
|
|
298
|
+
const {id, profile, features} = _cl; // make a copy the clinet data.
|
|
298
299
|
const {security} = features; // make a copy the clinet data.
|
|
299
300
|
this._security = { // set this_security with data
|
|
300
301
|
id: this.uid(true), // uuid of the security feature
|
|
@@ -325,11 +326,12 @@ class Deva {
|
|
|
325
326
|
***************/
|
|
326
327
|
Support() {
|
|
327
328
|
this.feature('Support'); // set state to support setting
|
|
329
|
+
const _cl = this.client();
|
|
328
330
|
try {
|
|
329
|
-
if (!
|
|
331
|
+
if (!_cl.features.support) return this.Services()
|
|
330
332
|
else {
|
|
331
333
|
this.action('Support');
|
|
332
|
-
const {id, features, profile} =
|
|
334
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
333
335
|
const {support} = features; // set support from features const
|
|
334
336
|
this._support = { // set this_support with data
|
|
335
337
|
id: this.uid(true), // uuid of the support feature
|
|
@@ -358,11 +360,12 @@ class Deva {
|
|
|
358
360
|
***************/
|
|
359
361
|
Services() {
|
|
360
362
|
this.feature('Services'); // set state to security setting
|
|
363
|
+
const _cl = this.client();
|
|
361
364
|
try {
|
|
362
|
-
if (!
|
|
365
|
+
if (!_cl.features.services) return this.Systems();
|
|
363
366
|
else {
|
|
364
367
|
this.action('Services')
|
|
365
|
-
const {id, features, profile} =
|
|
368
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
366
369
|
const {services} = features; // set services from features const
|
|
367
370
|
this._services = { // set this_services with data
|
|
368
371
|
id: this.uid(true), // uuid of the services feature
|
|
@@ -391,11 +394,12 @@ class Deva {
|
|
|
391
394
|
***************/
|
|
392
395
|
Systems() {
|
|
393
396
|
this.feature('Systems'); // set state to systems setting
|
|
397
|
+
const _cl = this.client();
|
|
394
398
|
try {
|
|
395
|
-
if (!
|
|
399
|
+
if (!_cl.features.systems) return this.Solutions();
|
|
396
400
|
else {
|
|
397
401
|
this.action('Systems');
|
|
398
|
-
const {id, features, profile} =
|
|
402
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
399
403
|
const {systems} = features; // set systems from features const
|
|
400
404
|
this._systems = { // set this_systems with data
|
|
401
405
|
id: this.uid(true), // uuid of the systems feature
|
|
@@ -425,11 +429,12 @@ class Deva {
|
|
|
425
429
|
***************/
|
|
426
430
|
Solutions() {
|
|
427
431
|
this.feature('Solutions'); // set state to solutions setting
|
|
432
|
+
const _cl = this.client();
|
|
428
433
|
try {
|
|
429
|
-
if (!
|
|
434
|
+
if (!_cl.features.solutions) return this.Development();
|
|
430
435
|
else {
|
|
431
436
|
this.action('Solutions');
|
|
432
|
-
const {id, features, profile} =
|
|
437
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
433
438
|
const {solutions} = features; // set solutions from features const
|
|
434
439
|
this._solutions = { // set this_solutions with data
|
|
435
440
|
id: this.uid(true), // uuid of the solutions feature
|
|
@@ -458,11 +463,12 @@ class Deva {
|
|
|
458
463
|
***************/
|
|
459
464
|
Development() {
|
|
460
465
|
this.feature('Development'); // set state to development setting
|
|
466
|
+
const _cl = this.client();
|
|
461
467
|
try {
|
|
462
|
-
if (!
|
|
468
|
+
if (!_cl.features.development) return this.Business();
|
|
463
469
|
else {
|
|
464
470
|
this.action('Development');
|
|
465
|
-
const {id, features, profile} =
|
|
471
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
466
472
|
const {development} = features; // set development from features const
|
|
467
473
|
this._development = { // set this_development with data
|
|
468
474
|
id: this.uid(true), // uuid of the development feature
|
|
@@ -491,11 +497,12 @@ class Deva {
|
|
|
491
497
|
***************/
|
|
492
498
|
Business(client=false) {
|
|
493
499
|
this.feature('Business'); // set state to business setting
|
|
500
|
+
const _cl = this.client();
|
|
494
501
|
try {
|
|
495
|
-
if (!
|
|
502
|
+
if (!_cl.features.business) return this.Legal();
|
|
496
503
|
else {
|
|
497
504
|
this.action('Business');
|
|
498
|
-
const {id, features, profile} =
|
|
505
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
499
506
|
const {business} = features; // set business from features const
|
|
500
507
|
this._business = { // set this_business with data
|
|
501
508
|
id: this.uid(true), // uuid of the business feature
|
|
@@ -524,11 +531,12 @@ class Deva {
|
|
|
524
531
|
***************/
|
|
525
532
|
Legal() {
|
|
526
533
|
this.feature('Legal'); // set state to legal setting
|
|
534
|
+
const _cl = this.client();
|
|
527
535
|
try {
|
|
528
|
-
if (!
|
|
536
|
+
if (!_cl.features.legal) this.Assistant();
|
|
529
537
|
else {
|
|
530
538
|
this.action('Legal');
|
|
531
|
-
const {id, features, profile} =
|
|
539
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
532
540
|
const {legal} = features; // set legal from features const
|
|
533
541
|
this._legal = { // set this_legal with data
|
|
534
542
|
id: this.uid(true), // uuid of the legal feature
|
|
@@ -542,6 +550,8 @@ class Deva {
|
|
|
542
550
|
return this.Assistant();
|
|
543
551
|
}
|
|
544
552
|
} catch (e) {
|
|
553
|
+
this.action('error');
|
|
554
|
+
this.feature('error');
|
|
545
555
|
return this.error(e) // run error handling if an error is caught
|
|
546
556
|
}
|
|
547
557
|
}
|
|
@@ -555,11 +565,12 @@ class Deva {
|
|
|
555
565
|
***************/
|
|
556
566
|
Assistant(client=false) {
|
|
557
567
|
this.feature('Assistant'); // set state to assistant setting
|
|
568
|
+
const _cl = this.client();
|
|
558
569
|
try {
|
|
559
|
-
if (!
|
|
570
|
+
if (!_cl.features.assistant) return this.Done();
|
|
560
571
|
else {
|
|
561
572
|
this.action('Assistant');
|
|
562
|
-
const {id, features, profile} =
|
|
573
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
563
574
|
const {assistant} = features; // set assistant from features const
|
|
564
575
|
this._assistant = { // set this_assistant with data
|
|
565
576
|
id: this.uid(true), // uuid of the assistant feature
|
|
@@ -573,6 +584,8 @@ class Deva {
|
|
|
573
584
|
return this.Story();
|
|
574
585
|
}
|
|
575
586
|
} catch (e) {
|
|
587
|
+
this.action('error');
|
|
588
|
+
this.feature('error');
|
|
576
589
|
return this.error(e) // run error handling if an error is caught
|
|
577
590
|
}
|
|
578
591
|
}
|
|
@@ -586,6 +599,7 @@ class Deva {
|
|
|
586
599
|
***************/
|
|
587
600
|
Story(client=false) {
|
|
588
601
|
this.feature('Story'); // set state to story setting
|
|
602
|
+
const _cl = this.client();
|
|
589
603
|
try {
|
|
590
604
|
if (!this._client.features.story) return this.Mind();
|
|
591
605
|
else {
|
|
@@ -619,11 +633,12 @@ class Deva {
|
|
|
619
633
|
***************/
|
|
620
634
|
Mind(client=false) {
|
|
621
635
|
this.feature('Mind'); // set state to story setting
|
|
636
|
+
const _cl = this.client();
|
|
622
637
|
try {
|
|
623
|
-
if (!
|
|
638
|
+
if (!_cl.features.mind) return this.Done();
|
|
624
639
|
else {
|
|
625
640
|
this.action('Mind');
|
|
626
|
-
const {id, features, profile} =
|
|
641
|
+
const {id, features, profile} = _cl; // set the local consts from client copy
|
|
627
642
|
const {mind} = features; // set mind from features const
|
|
628
643
|
this._mind = { // set this_mind with data
|
|
629
644
|
id: this.uid(true), // uuid of the mind feature
|
|
@@ -652,6 +667,7 @@ class Deva {
|
|
|
652
667
|
return new Promise((resolve, reject) => {
|
|
653
668
|
try {
|
|
654
669
|
delete this._client.features; // delete the features key when done.
|
|
670
|
+
this.action('done'); // set state to assistant setting
|
|
655
671
|
this.feature('done'); // set state to assistant setting
|
|
656
672
|
return resolve();
|
|
657
673
|
} catch (e) {
|
|
@@ -769,8 +785,8 @@ class Deva {
|
|
|
769
785
|
***************/
|
|
770
786
|
_methodNotFound(packet) {
|
|
771
787
|
packet.a = {
|
|
772
|
-
agent: this.
|
|
773
|
-
client: this.
|
|
788
|
+
agent: this.agent() || false,
|
|
789
|
+
client: this.client() || false,
|
|
774
790
|
text: `${this._messages.method_not_found}`,
|
|
775
791
|
meta: {
|
|
776
792
|
key: this._agent.key,
|
|
@@ -778,7 +794,7 @@ class Deva {
|
|
|
778
794
|
},
|
|
779
795
|
created: Date.now(),
|
|
780
796
|
};
|
|
781
|
-
this.state('method_not_found'
|
|
797
|
+
this.state('method_not_found');
|
|
782
798
|
return packet;
|
|
783
799
|
}
|
|
784
800
|
|
|
@@ -843,127 +859,6 @@ class Deva {
|
|
|
843
859
|
return this.events.removeListener(evt, callback);
|
|
844
860
|
}
|
|
845
861
|
|
|
846
|
-
/**************
|
|
847
|
-
func: ask
|
|
848
|
-
params: packet
|
|
849
|
-
describe:
|
|
850
|
-
The ask function gives each agent the ability to ask question to other agents
|
|
851
|
-
in the system. When a question is asked the Agent with the question if it
|
|
852
|
-
detect an ask event it will trigger. Then if an Agent with the matching ask
|
|
853
|
-
event is listening they will respond. The question function uses this to
|
|
854
|
-
create integrated communication between itself and other Deva in it's library.
|
|
855
|
-
|
|
856
|
-
It can also be used in a custom manner to broadcast ask events inside other coe aswell.
|
|
857
|
-
|
|
858
|
-
When the talk has an answer it will respond with a talk event that has the packet id
|
|
859
|
-
so the event is specific to the talk.
|
|
860
|
-
***************/
|
|
861
|
-
ask(packet) {
|
|
862
|
-
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
863
|
-
this.action('question', packet);
|
|
864
|
-
|
|
865
|
-
packet.a = {
|
|
866
|
-
agent: this._agent || false,
|
|
867
|
-
client: this._client || false,
|
|
868
|
-
meta: {
|
|
869
|
-
key: this._agent.key,
|
|
870
|
-
method: packet.q.meta.method,
|
|
871
|
-
params: packet.q.meta.params,
|
|
872
|
-
},
|
|
873
|
-
text: false,
|
|
874
|
-
html: false,
|
|
875
|
-
data: false,
|
|
876
|
-
created: Date.now(),
|
|
877
|
-
};
|
|
878
|
-
|
|
879
|
-
try {
|
|
880
|
-
if (this.methods[packet.q.meta.method] !== 'function') {
|
|
881
|
-
return setImmediate(() => {
|
|
882
|
-
this.action('ask_invalid')
|
|
883
|
-
packet.a.text = `INVALID METHOD (${packet.q.meta.method})`;
|
|
884
|
-
this.talk(`${this._agent.key}:ask:${packet.id}`, packet);
|
|
885
|
-
});
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
// The method is parsed and depending on what method is asked for it returns
|
|
889
|
-
// the response based on the passed through packet.
|
|
890
|
-
this.methods[packet.q.meta.method](packet).then(result => {
|
|
891
|
-
if (typeof result === 'object') {
|
|
892
|
-
packet.a.text = result.text || false;
|
|
893
|
-
packet.a.html = result.html || false;
|
|
894
|
-
packet.a.data = result.data || false;
|
|
895
|
-
}
|
|
896
|
-
else {
|
|
897
|
-
packet.a.text = result;
|
|
898
|
-
}
|
|
899
|
-
this.action('ask_answer', packet);
|
|
900
|
-
this.talk(`${this._agent.key}:ask:${packet.id}`, packet);
|
|
901
|
-
}).catch(err => {
|
|
902
|
-
this.action('error', err);
|
|
903
|
-
this.talk(`${this._agent.key}:ask:${packet.id}`, {error:err.toString()});
|
|
904
|
-
return this.error(err, packet);
|
|
905
|
-
})
|
|
906
|
-
}
|
|
907
|
-
catch (e) {
|
|
908
|
-
this.action('error', err);
|
|
909
|
-
this.talk(`${this._agent.key}:ask:${packet.id}`, {error:e.toString()});
|
|
910
|
-
return this.error(e, packet)
|
|
911
|
-
}
|
|
912
|
-
// now when we ask the meta params[0] should be the method
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
answer(packet, resolve, reject) {
|
|
916
|
-
this.action('answer', packet); // set the question answer state
|
|
917
|
-
// check if method exists and is of type function
|
|
918
|
-
const {method,params} = packet.q.meta;
|
|
919
|
-
const isMethod = this.methods[method] && typeof this.methods[method] == 'function';
|
|
920
|
-
if (!isMethod) {
|
|
921
|
-
this.action('invalid')
|
|
922
|
-
return resolve(this._methodNotFound(packet)); // resolve method not found if check if check fails
|
|
923
|
-
}
|
|
924
|
-
// Call the local method to process the question based the extracted parameters
|
|
925
|
-
return this.methods[method](packet).then(result => {
|
|
926
|
-
// check the result for the text, html, and data object.
|
|
927
|
-
// this is for when answers are returned from nested Devas.
|
|
928
|
-
const text = typeof result === 'object' ? result.text : result;
|
|
929
|
-
const html = typeof result === 'object' ? result.html : result;
|
|
930
|
-
// if the data passed is NOT an object it will FALSE
|
|
931
|
-
const data = typeof result === 'object' ? result.data : false;
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
packet.a = { // setup the packet.a container
|
|
935
|
-
agent: this._agent || false, // set the agent who answered the question
|
|
936
|
-
client: this._client || false, // set the client asking the question
|
|
937
|
-
meta: { // setup the answer meta container
|
|
938
|
-
key: this._agent.key, // set the agent key inot the meta
|
|
939
|
-
method, // set the method into the meta
|
|
940
|
-
params, // set the params into the meta
|
|
941
|
-
},
|
|
942
|
-
text, // set answer text
|
|
943
|
-
html,
|
|
944
|
-
data,
|
|
945
|
-
created: Date.now(),
|
|
946
|
-
};
|
|
947
|
-
|
|
948
|
-
// create a hash for the answer and insert into answer meta.
|
|
949
|
-
this.action('hash_answer');
|
|
950
|
-
packet.a.meta.hash = this.hash(JSON.stringify(packet.a));
|
|
951
|
-
// create a hash for entire packet and insert into packet
|
|
952
|
-
// hash the entire packet.
|
|
953
|
-
this.action('hash_packet');
|
|
954
|
-
packet.hash = this.hash(JSON.stringify(packet));
|
|
955
|
-
|
|
956
|
-
this.action('answer_talk');
|
|
957
|
-
this.talk(`${this._agent.key}:answer`, packet); // set the question answer state
|
|
958
|
-
|
|
959
|
-
this.action('done');
|
|
960
|
-
return resolve(packet); // resolve the packet to the caller.
|
|
961
|
-
}).catch(err => { // catch any errors in the method
|
|
962
|
-
this.action('error', err);
|
|
963
|
-
return this.error(err, packet, reject); // return this.error with err, packet, reject
|
|
964
|
-
});
|
|
965
|
-
}
|
|
966
|
-
|
|
967
862
|
/**************
|
|
968
863
|
func: question
|
|
969
864
|
example: this.question('#*agent.key *method* *text*')
|
|
@@ -978,6 +873,7 @@ class Deva {
|
|
|
978
873
|
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
979
874
|
const id = this.uid(); // generate a unique id for transport.
|
|
980
875
|
const t_split = TEXT.split(' '); // split the text on spaces to get words.
|
|
876
|
+
this.state('question');
|
|
981
877
|
this.action('question', id);
|
|
982
878
|
|
|
983
879
|
// check to see if the string is an #ask string to talk to the other Deva.
|
|
@@ -991,8 +887,8 @@ class Deva {
|
|
|
991
887
|
const data = DATA; // set the DATA to data
|
|
992
888
|
const packet = { // create the base q/a packet
|
|
993
889
|
id, // set the id into packet
|
|
994
|
-
q:
|
|
995
|
-
a:
|
|
890
|
+
q: false, // create empty q object in packet
|
|
891
|
+
a: false, // create empty a object in packet
|
|
996
892
|
created: Date.now(), // timestamp the packet
|
|
997
893
|
};
|
|
998
894
|
|
|
@@ -1009,6 +905,7 @@ class Deva {
|
|
|
1009
905
|
let _action = 'question_method'
|
|
1010
906
|
try { // try to answer the question
|
|
1011
907
|
if (isAsk) { // determine if hte question isAsk
|
|
908
|
+
_action = 'question_ask';
|
|
1012
909
|
key = t_split[0].substring(1); // if:isAsksplit the agent key and remove first command character
|
|
1013
910
|
//if:isAsk use text split index 1 as the parameter block
|
|
1014
911
|
params = t_split[1] ? t_split[1].split(':') : false;
|
|
@@ -1023,12 +920,12 @@ class Deva {
|
|
|
1023
920
|
text = t_split.slice(1).join(' ').trim(); // if:isCmd rejoin the string on the space after removing first index
|
|
1024
921
|
}
|
|
1025
922
|
else {
|
|
1026
|
-
this.action('question_method');
|
|
1027
923
|
}
|
|
1028
924
|
|
|
1029
925
|
packet.q = { // build packet.q container
|
|
1030
|
-
|
|
1031
|
-
|
|
926
|
+
id: this.uid(),
|
|
927
|
+
agent: this.agent() || false, // set the agent
|
|
928
|
+
client: this.client() || false, // set the client
|
|
1032
929
|
meta: { // build the meta container
|
|
1033
930
|
key, // set the key variable
|
|
1034
931
|
orig, // set orig text to track chances
|
|
@@ -1044,18 +941,20 @@ class Deva {
|
|
|
1044
941
|
this.action('question_hash'); // set the has question state
|
|
1045
942
|
packet.q.meta.hash = this.hash(JSON.stringify(packet.q));
|
|
1046
943
|
|
|
944
|
+
this.action(_action);
|
|
945
|
+
this.talk('devacore:question', this.copy(packet)); // global question event make sure to copy data.
|
|
1047
946
|
|
|
1048
947
|
if (isAsk) { // isAsk check if the question isAsk and talk
|
|
1049
|
-
this.
|
|
1050
|
-
this.talk(`${key}:ask`, packet); // if:isAsk talk the event to theother Deva
|
|
948
|
+
this.state('ask');
|
|
1051
949
|
// if: isAsk wait for the once event which is key'd to the packet ID for specified responses
|
|
950
|
+
this.talk(`${key}:ask`, this.copy(packet));
|
|
1052
951
|
this.once(`${key}:ask:${packet.id}`, answer => {
|
|
1053
952
|
this.action('question_ask_answer');
|
|
1054
953
|
return resolve(answer); // if:isAsk resolve the answer from the call
|
|
1055
954
|
});
|
|
1056
955
|
}
|
|
1057
956
|
else { // else: answer tue question locally
|
|
1058
|
-
this.action(
|
|
957
|
+
this.action('ask_answer');
|
|
1059
958
|
return this.answer(packet, resolve, reject);
|
|
1060
959
|
}
|
|
1061
960
|
}
|
|
@@ -1066,6 +965,146 @@ class Deva {
|
|
|
1066
965
|
});
|
|
1067
966
|
}
|
|
1068
967
|
|
|
968
|
+
/**************
|
|
969
|
+
func: answer
|
|
970
|
+
params:
|
|
971
|
+
- packet
|
|
972
|
+
- resolve
|
|
973
|
+
- reject
|
|
974
|
+
describe:
|
|
975
|
+
The answer function is called from the question fuction to return an answer
|
|
976
|
+
from the agent from the pre-determined method.
|
|
977
|
+
***************/
|
|
978
|
+
answer(packet, resolve, reject) {
|
|
979
|
+
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
980
|
+
|
|
981
|
+
this.state('answer');
|
|
982
|
+
// check if method exists and is of type function
|
|
983
|
+
const {method,params} = packet.q.meta;
|
|
984
|
+
const isMethod = this.methods[method] && typeof this.methods[method] == 'function';
|
|
985
|
+
if (!isMethod) {
|
|
986
|
+
this.action('invalid')
|
|
987
|
+
return resolve(this._methodNotFound(packet)); // resolve method not found if check if check fails
|
|
988
|
+
}
|
|
989
|
+
// Call the local method to process the question based the extracted parameters
|
|
990
|
+
return this.methods[method](packet).then(result => {
|
|
991
|
+
this.action('answer');
|
|
992
|
+
// check the result for the text, html, and data object.
|
|
993
|
+
// this is for when answers are returned from nested Devas.
|
|
994
|
+
const text = typeof result === 'object' ? result.text : result;
|
|
995
|
+
const html = typeof result === 'object' ? result.html : result;
|
|
996
|
+
// if the data passed is NOT an object it will FALSE
|
|
997
|
+
const data = typeof result === 'object' ? result.data : false;
|
|
998
|
+
|
|
999
|
+
const agent = this.agent() || false;
|
|
1000
|
+
const client = this.client() || false;
|
|
1001
|
+
packet.a = { // setup the packet.a container
|
|
1002
|
+
id: this.uid(),
|
|
1003
|
+
agent, // set the agent who answered the question
|
|
1004
|
+
client, // set the client asking the question
|
|
1005
|
+
meta: { // setup the answer meta container
|
|
1006
|
+
key: agent.key, // set the agent key inot the meta
|
|
1007
|
+
method, // set the method into the meta
|
|
1008
|
+
params, // set the params into the meta
|
|
1009
|
+
},
|
|
1010
|
+
text, // set answer text
|
|
1011
|
+
html, // set the answer html
|
|
1012
|
+
data, // set the answer data
|
|
1013
|
+
created: Date.now(),
|
|
1014
|
+
};
|
|
1015
|
+
|
|
1016
|
+
// create a hash for the answer and insert into answer meta.
|
|
1017
|
+
this.action('answer_hash');
|
|
1018
|
+
packet.a.meta.hash = this.hash(JSON.stringify(packet.a));
|
|
1019
|
+
|
|
1020
|
+
this.action('packet_hash');
|
|
1021
|
+
packet.hash = this.hash(JSON.stringify(packet)); // hash the entire packet.
|
|
1022
|
+
|
|
1023
|
+
|
|
1024
|
+
this.action('answer_talk');
|
|
1025
|
+
this.talk('devacore:answer', this.copy(packet)); // talk the answer with a copy of the data
|
|
1026
|
+
|
|
1027
|
+
return resolve(packet); // resolve the packet to the caller.
|
|
1028
|
+
}).catch(err => { // catch any errors in the method
|
|
1029
|
+
this.action('error');
|
|
1030
|
+
return this.error(err, packet, reject); // return this.error with err, packet, reject
|
|
1031
|
+
});
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
/**************
|
|
1035
|
+
func: ask
|
|
1036
|
+
params: packet
|
|
1037
|
+
describe:
|
|
1038
|
+
The ask function gives each agent the ability to ask question to other agents
|
|
1039
|
+
in the system. When a question is asked the Agent with the question if it
|
|
1040
|
+
detect an ask event it will trigger. Then if an Agent with the matching ask
|
|
1041
|
+
event is listening they will respond. The question function uses this to
|
|
1042
|
+
create integrated communication between itself and other Deva in it's library.
|
|
1043
|
+
|
|
1044
|
+
It can also be used in a custom manner to broadcast ask events inside other coe aswell.
|
|
1045
|
+
|
|
1046
|
+
When the talk has an answer it will respond with a talk event that has the packet id
|
|
1047
|
+
so the event is specific to the talk.
|
|
1048
|
+
***************/
|
|
1049
|
+
ask(packet) {
|
|
1050
|
+
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1051
|
+
this.state('ask');
|
|
1052
|
+
this.action('ask');
|
|
1053
|
+
|
|
1054
|
+
const agent = this.agent() || false;
|
|
1055
|
+
const client = this.client() || false;
|
|
1056
|
+
// build the answer packet from this model
|
|
1057
|
+
packet.a = {
|
|
1058
|
+
agent,
|
|
1059
|
+
client,
|
|
1060
|
+
meta: {
|
|
1061
|
+
key: agent.key,
|
|
1062
|
+
method: packet.q.meta.method,
|
|
1063
|
+
params: packet.q.meta.params,
|
|
1064
|
+
},
|
|
1065
|
+
text: false,
|
|
1066
|
+
html: false,
|
|
1067
|
+
data: false,
|
|
1068
|
+
created: Date.now(),
|
|
1069
|
+
};
|
|
1070
|
+
|
|
1071
|
+
try {
|
|
1072
|
+
if (typeof this.methods[packet.q.meta.method] !== 'function') {
|
|
1073
|
+
return setImmediate(() => {
|
|
1074
|
+
this.action('invalid')
|
|
1075
|
+
packet.a.text = `INVALID METHOD (${packet.q.meta.method})`;
|
|
1076
|
+
this.talk(`${this._agent.key}:ask:${packet.id}`, packet);
|
|
1077
|
+
});
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
// The method is parsed and depending on what method is asked for it returns
|
|
1081
|
+
// the response based on the passed through packet.
|
|
1082
|
+
this.methods[packet.q.meta.method](packet).then(result => {
|
|
1083
|
+
if (typeof result === 'object') {
|
|
1084
|
+
packet.a.text = result.text || false;
|
|
1085
|
+
packet.a.html = result.html || false;
|
|
1086
|
+
packet.a.data = result.data || false;
|
|
1087
|
+
}
|
|
1088
|
+
else {
|
|
1089
|
+
packet.a.text = result;
|
|
1090
|
+
}
|
|
1091
|
+
this.action('ask_answer');
|
|
1092
|
+
this.talk(`${this._agent.key}:ask:${packet.id}`, this.copy(packet));
|
|
1093
|
+
}).catch(err => {
|
|
1094
|
+
this.action('error');
|
|
1095
|
+
this.talk(`${this._agent.key}:ask:${packet.id}`, {error:err.toString()});
|
|
1096
|
+
return this.error(err, packet);
|
|
1097
|
+
})
|
|
1098
|
+
}
|
|
1099
|
+
catch (e) {
|
|
1100
|
+
this.action('error');
|
|
1101
|
+
this.talk(`${this._agent.key}:ask:${packet.id}`, {error:e.toString()});
|
|
1102
|
+
return this.error(e, packet)
|
|
1103
|
+
}
|
|
1104
|
+
// now when we ask the meta params[0] should be the method
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
|
|
1069
1108
|
/**************
|
|
1070
1109
|
func: init
|
|
1071
1110
|
params: client - the client data to use that is provided by the clients.
|
|
@@ -1083,14 +1122,15 @@ class Deva {
|
|
|
1083
1122
|
***************/
|
|
1084
1123
|
init(client) {
|
|
1085
1124
|
const _data = {
|
|
1086
|
-
id: this.uid(),
|
|
1087
|
-
key: '
|
|
1125
|
+
id: this.uid(true),
|
|
1126
|
+
key: 'return',
|
|
1088
1127
|
value: 'init',
|
|
1089
1128
|
agent: this._agent,
|
|
1090
1129
|
client: this.copy(client),
|
|
1091
1130
|
text: this._messages.states.start,
|
|
1092
1131
|
created: Date.now(),
|
|
1093
1132
|
}
|
|
1133
|
+
_data.hash = this.hash(JSON.stringify(_data));
|
|
1094
1134
|
|
|
1095
1135
|
// set client
|
|
1096
1136
|
this._active = Date.now();
|
|
@@ -1110,8 +1150,6 @@ class Deva {
|
|
|
1110
1150
|
return this.Security();
|
|
1111
1151
|
}).then(() => {
|
|
1112
1152
|
this.zone('deva');
|
|
1113
|
-
|
|
1114
|
-
_data.hash = this.hash(JSON.stringify(_data));
|
|
1115
1153
|
const hasOnInit = this.onInit && typeof this.onInit === 'function';
|
|
1116
1154
|
return hasOnInit ? this.onInit(_data) : this.start(_data)
|
|
1117
1155
|
}).catch(err => {
|
|
@@ -1120,34 +1158,6 @@ class Deva {
|
|
|
1120
1158
|
});
|
|
1121
1159
|
}
|
|
1122
1160
|
|
|
1123
|
-
/**************
|
|
1124
|
-
func: error
|
|
1125
|
-
params:
|
|
1126
|
-
- err: The error to process
|
|
1127
|
-
- data: Any additional data associated with the error
|
|
1128
|
-
- reject: An associated promise reject if the caller requires.
|
|
1129
|
-
describe:
|
|
1130
|
-
The erro function rpovides the consistent error manage of the system.
|
|
1131
|
-
usage: this.error(err, data, reject);
|
|
1132
|
-
***************/
|
|
1133
|
-
error(err,data=false,reject=false) {
|
|
1134
|
-
// check fo rthe custom onError function in the agent.
|
|
1135
|
-
console.log('\n::BEGIN:ERROR\n');
|
|
1136
|
-
console.log(err);
|
|
1137
|
-
console.log('\n::END:ERROR\n');
|
|
1138
|
-
if (data) {
|
|
1139
|
-
console.log('::::::');
|
|
1140
|
-
console.log('\n::BEGIN:DATA\n');
|
|
1141
|
-
console.log(JSON.stringify(data, null, 2));
|
|
1142
|
-
console.log('\n::END:DATA\n');
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
if (this.onError && typeof this.onError === 'function') return this.onError(err, data, reject);
|
|
1146
|
-
else {
|
|
1147
|
-
return reject ? reject(err) : err;
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
|
|
1151
1161
|
/**************
|
|
1152
1162
|
func: start
|
|
1153
1163
|
params:
|
|
@@ -1161,18 +1171,59 @@ class Deva {
|
|
|
1161
1171
|
start(data=false) {
|
|
1162
1172
|
this.state('start');
|
|
1163
1173
|
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1174
|
+
data.value = 'start';
|
|
1175
|
+
delete data.hash;
|
|
1176
|
+
data.hash = this.hash(JSON.stringify(data));
|
|
1177
|
+
|
|
1178
|
+
if (this.info) {
|
|
1179
|
+
const _info = JSON.stringify(this.info, null, 2).replace(/\{/g, '::BEGIN:INFO')
|
|
1180
|
+
.replace(/\"|\,/g, '').replace(/\}/g, '::END:INFO').trim()
|
|
1181
|
+
this.prompt(_info);
|
|
1172
1182
|
}
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1183
|
+
const hasOnStart = this.onStart && typeof this.onStart === 'function' ? true : false;
|
|
1184
|
+
return hasOnStart ? this.onStart(data) : this.enter(data)
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
/**************
|
|
1188
|
+
func: enter
|
|
1189
|
+
params:
|
|
1190
|
+
- msg: hte message from the caller incase need to use in calls
|
|
1191
|
+
describe:
|
|
1192
|
+
The ener function will check the actie status of the Deva and set it to
|
|
1193
|
+
offline or enter.
|
|
1194
|
+
|
|
1195
|
+
If the Deva is offline it will return the offline message.
|
|
1196
|
+
usage: this.enter('msg')
|
|
1197
|
+
***************/
|
|
1198
|
+
enter(data=false) {
|
|
1199
|
+
this.state('enter');
|
|
1200
|
+
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1201
|
+
data.value = 'enter';
|
|
1202
|
+
delete data.hash;
|
|
1203
|
+
data.hash = this.hash(JSON.stringify(data));
|
|
1204
|
+
const hasOnEnter = this.onEnter && typeof this.onEnter === 'function' ? true : false;
|
|
1205
|
+
return hasOnEnter ? this.onEnter(_data) : this.done(data)
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
/**************
|
|
1209
|
+
func: done
|
|
1210
|
+
params:
|
|
1211
|
+
- msg: hte message from the caller incase need to use in calls
|
|
1212
|
+
describe:
|
|
1213
|
+
When the done function is triggered the system will also set the state
|
|
1214
|
+
of hte Deva to done.
|
|
1215
|
+
|
|
1216
|
+
If the deva is offline it will return the offline message.
|
|
1217
|
+
usage: this.done('msg')
|
|
1218
|
+
***************/
|
|
1219
|
+
done(data=false) {
|
|
1220
|
+
this.state('done');
|
|
1221
|
+
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1222
|
+
data.value = 'done';
|
|
1223
|
+
delete data.hash;
|
|
1224
|
+
data.hash = this.hash(JSON.stringify(data));
|
|
1225
|
+
const hasOnDone = this.onDone && typeof this.onDone === 'function' ? true : false;
|
|
1226
|
+
return hasOnDone ? this.onDone(data) : Promise.resolve(data);
|
|
1176
1227
|
}
|
|
1177
1228
|
|
|
1178
1229
|
/**************
|
|
@@ -1188,15 +1239,15 @@ class Deva {
|
|
|
1188
1239
|
usage:
|
|
1189
1240
|
this.stop('msg')
|
|
1190
1241
|
***************/
|
|
1191
|
-
stop(
|
|
1242
|
+
stop() {
|
|
1192
1243
|
this.state('stop');
|
|
1193
1244
|
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1194
1245
|
const _data = {
|
|
1195
|
-
id: this.uid(),
|
|
1196
|
-
key: '
|
|
1246
|
+
id: this.uid(true),
|
|
1247
|
+
key: 'return',
|
|
1197
1248
|
value: 'stop',
|
|
1198
|
-
agent: this.
|
|
1199
|
-
client:
|
|
1249
|
+
agent: this.agent(),
|
|
1250
|
+
client: this.client(),
|
|
1200
1251
|
text: this._messages.states.stop,
|
|
1201
1252
|
created: Date.now(),
|
|
1202
1253
|
}
|
|
@@ -1205,33 +1256,6 @@ class Deva {
|
|
|
1205
1256
|
return hasOnStop ? this.onStop(_data) : this.exit(_data)
|
|
1206
1257
|
}
|
|
1207
1258
|
|
|
1208
|
-
/**************
|
|
1209
|
-
func: enter
|
|
1210
|
-
params:
|
|
1211
|
-
- msg: hte message from the caller incase need to use in calls
|
|
1212
|
-
describe:
|
|
1213
|
-
The ener function will check the actie status of the Deva and set it to
|
|
1214
|
-
offline or enter.
|
|
1215
|
-
|
|
1216
|
-
If the Deva is offline it will return the offline message.
|
|
1217
|
-
usage: this.enter('msg')
|
|
1218
|
-
***************/
|
|
1219
|
-
enter(data=false) {
|
|
1220
|
-
this.state('enter');
|
|
1221
|
-
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1222
|
-
const _data = {
|
|
1223
|
-
id: this.uid(),
|
|
1224
|
-
type: 'enter',
|
|
1225
|
-
value: 'enter',
|
|
1226
|
-
agent: this._agent,
|
|
1227
|
-
client: data.client || this._client,
|
|
1228
|
-
text: this._messages.states.enter,
|
|
1229
|
-
created: Date.now(),
|
|
1230
|
-
}
|
|
1231
|
-
_data.hash = this.hash(JSON.stringify(_data));
|
|
1232
|
-
const hasOnEnter = this.onEnter && typeof this.onEnter === 'function';
|
|
1233
|
-
return hasOnEnter ? this.onEnter(_data) : this.done(_data)
|
|
1234
|
-
}
|
|
1235
1259
|
|
|
1236
1260
|
/**************
|
|
1237
1261
|
func: exit
|
|
@@ -1249,50 +1273,27 @@ class Deva {
|
|
|
1249
1273
|
***************/
|
|
1250
1274
|
exit(data=false) {
|
|
1251
1275
|
this.state('exit');
|
|
1252
|
-
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1253
1276
|
this._active = false;
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
value: 'exit',
|
|
1258
|
-
agent: this._agent,
|
|
1259
|
-
client: this._client || this._client,
|
|
1260
|
-
text: this._messages.states.exit,
|
|
1261
|
-
created: Date.now(),
|
|
1262
|
-
}
|
|
1263
|
-
_data.hash = this.hash(JSON.stringify(_data));
|
|
1264
|
-
const hasOnExit = this.onExit && typeof this.onExit === 'function';
|
|
1265
|
-
return hasOnExit ? this.onExit(_data) : Promise.resolve(_data)
|
|
1266
|
-
}
|
|
1277
|
+
data.value = 'exit';
|
|
1278
|
+
delete data.hash;
|
|
1279
|
+
data.hash = this.hash(JSON.stringify(data));
|
|
1267
1280
|
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1281
|
+
// clear memory
|
|
1282
|
+
this._active = false;
|
|
1283
|
+
this._client = false;
|
|
1284
|
+
this._security = false;
|
|
1285
|
+
this._support = false;
|
|
1286
|
+
this._services = false;
|
|
1287
|
+
this._business = false;
|
|
1288
|
+
this._development = false;
|
|
1289
|
+
this._legal = false;
|
|
1290
|
+
this._story = false;
|
|
1275
1291
|
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
***************/
|
|
1279
|
-
done(data=false) {
|
|
1280
|
-
this.state('done');
|
|
1281
|
-
if (!this._active) return Promise.resolve(this._messages.states.offline);
|
|
1282
|
-
const _data = {
|
|
1283
|
-
id: this.uid(),
|
|
1284
|
-
key: 'done',
|
|
1285
|
-
value: 'done',
|
|
1286
|
-
agent: this._agent,
|
|
1287
|
-
client: data.client || this._client,
|
|
1288
|
-
text: this._messages.states.exit,
|
|
1289
|
-
created: Date.now(),
|
|
1290
|
-
}
|
|
1291
|
-
_data.hash = this.hash(JSON.stringify(_data));
|
|
1292
|
-
const hasOnDone = this.onDone && typeof this.onDone === 'function';
|
|
1293
|
-
return hasOnDone ? this.onDone(_data) : Promise.resolve(_data)
|
|
1292
|
+
const hasOnExit = this.onExit && typeof this.onExit === 'function';
|
|
1293
|
+
return hasOnExit ? this.onExit(data) : Promise.resolve(data)
|
|
1294
1294
|
}
|
|
1295
1295
|
|
|
1296
|
+
|
|
1296
1297
|
////////////////////////////
|
|
1297
1298
|
|
|
1298
1299
|
/**************
|
|
@@ -1301,22 +1302,22 @@ class Deva {
|
|
|
1301
1302
|
- st: The state flag to set for the Deva that matches to this._states
|
|
1302
1303
|
describe
|
|
1303
1304
|
***************/
|
|
1304
|
-
state(state
|
|
1305
|
+
state(state) {
|
|
1305
1306
|
try {
|
|
1306
1307
|
if (!this._states[state]) return;
|
|
1307
1308
|
this._state = state;
|
|
1308
1309
|
const text = this._messages.states[state];
|
|
1309
1310
|
const _data = {
|
|
1310
|
-
id: this.uid(),
|
|
1311
|
+
id: this.uid(true),
|
|
1311
1312
|
key: 'state',
|
|
1312
1313
|
value: state,
|
|
1313
|
-
agent: this.
|
|
1314
|
+
agent: this.agent(),
|
|
1315
|
+
client: this.client(),
|
|
1314
1316
|
text,
|
|
1315
|
-
data,
|
|
1316
1317
|
created: Date.now(),
|
|
1317
1318
|
};
|
|
1318
1319
|
_data.hash = this.hash(JSON.stringify(_data));
|
|
1319
|
-
this.talk('state', _data);
|
|
1320
|
+
this.talk('devacore:state', this.copy(_data));
|
|
1320
1321
|
} catch (e) {
|
|
1321
1322
|
return this.error(e);
|
|
1322
1323
|
}
|
|
@@ -1334,7 +1335,7 @@ class Deva {
|
|
|
1334
1335
|
this._zone = zone;
|
|
1335
1336
|
const text = this._messages.zones[zone];
|
|
1336
1337
|
const _data = {
|
|
1337
|
-
id: this.uid(),
|
|
1338
|
+
id: this.uid(true),
|
|
1338
1339
|
key: 'zone',
|
|
1339
1340
|
value: zone,
|
|
1340
1341
|
agent: this._agent,
|
|
@@ -1355,22 +1356,22 @@ class Deva {
|
|
|
1355
1356
|
- st: The state flag to set for the Deva that matches to this._states
|
|
1356
1357
|
describe
|
|
1357
1358
|
***************/
|
|
1358
|
-
action(action
|
|
1359
|
+
action(action) {
|
|
1359
1360
|
try {
|
|
1360
1361
|
if (!this._actions[action]) return;
|
|
1361
1362
|
this._action = action;
|
|
1362
1363
|
const text = this._messages.actions[action];
|
|
1363
1364
|
const _data = {
|
|
1364
|
-
id: this.uid(),
|
|
1365
|
+
id: this.uid(true),
|
|
1365
1366
|
key: 'action',
|
|
1366
1367
|
value: action,
|
|
1367
|
-
agent: this.
|
|
1368
|
+
agent: this.agent(),
|
|
1369
|
+
client: this.client(),
|
|
1368
1370
|
text,
|
|
1369
|
-
data,
|
|
1370
1371
|
created: Date.now(),
|
|
1371
1372
|
};
|
|
1372
1373
|
_data.hash = this.hash(JSON.stringify(_data));
|
|
1373
|
-
this.talk('action', _data);
|
|
1374
|
+
this.talk('devacore:action', this.copy(_data));
|
|
1374
1375
|
} catch (e) {
|
|
1375
1376
|
return this.error(e)
|
|
1376
1377
|
}
|
|
@@ -1388,7 +1389,7 @@ class Deva {
|
|
|
1388
1389
|
this._feature = feature;
|
|
1389
1390
|
const text = this._messages.features[feature] ;
|
|
1390
1391
|
const _data = {
|
|
1391
|
-
id: this.uid(),
|
|
1392
|
+
id: this.uid(true),
|
|
1392
1393
|
key: 'feature',
|
|
1393
1394
|
value: feature,
|
|
1394
1395
|
agent: this._agent,
|
|
@@ -1417,7 +1418,10 @@ class Deva {
|
|
|
1417
1418
|
client() {
|
|
1418
1419
|
this.state('client_data'); // set the client state
|
|
1419
1420
|
if (!this._active) return this._messages.states.offline; // check the active status
|
|
1420
|
-
|
|
1421
|
+
const client_copy = this.copy(this._client);
|
|
1422
|
+
// delete client_copy.parse;
|
|
1423
|
+
// delete client_copy.translate;
|
|
1424
|
+
return client_copy; // return the client feature
|
|
1421
1425
|
}
|
|
1422
1426
|
|
|
1423
1427
|
/**************
|
|
@@ -1431,7 +1435,10 @@ class Deva {
|
|
|
1431
1435
|
agent() {
|
|
1432
1436
|
this.state('agent_data');
|
|
1433
1437
|
if (!this._active) return this._messages.states.offline;
|
|
1434
|
-
|
|
1438
|
+
const agent_copy = this.copy(this._agent);
|
|
1439
|
+
delete agent_copy.parse;
|
|
1440
|
+
delete agent_copy.translate;
|
|
1441
|
+
return agent_copy;
|
|
1435
1442
|
}
|
|
1436
1443
|
|
|
1437
1444
|
// FEATURE FUNCTIONS
|
|
@@ -1638,7 +1645,7 @@ class Deva {
|
|
|
1638
1645
|
try {
|
|
1639
1646
|
this.state('uload');
|
|
1640
1647
|
delete this.devas[key];
|
|
1641
|
-
this.talk(`
|
|
1648
|
+
this.talk(`unload`, {
|
|
1642
1649
|
key,
|
|
1643
1650
|
created: Date.now(),
|
|
1644
1651
|
});
|
|
@@ -1735,14 +1742,7 @@ class Deva {
|
|
|
1735
1742
|
const decipher = createDecipheriv( algorithm, key_in_bytes, iv);
|
|
1736
1743
|
const decrypted = decipher.update(encrypted);
|
|
1737
1744
|
const final = Buffer.concat([decrypted, decipher.final()]);
|
|
1738
|
-
this.state('decipher'
|
|
1739
|
-
id: this.uid(true),
|
|
1740
|
-
iv: opt.iv,
|
|
1741
|
-
key: opt.key,
|
|
1742
|
-
agent_id: this._agent.id,
|
|
1743
|
-
client_id: this._client.id,
|
|
1744
|
-
created: Date.now()
|
|
1745
|
-
});
|
|
1745
|
+
this.state('decipher');
|
|
1746
1746
|
return final.toString();
|
|
1747
1747
|
}
|
|
1748
1748
|
|
|
@@ -1778,13 +1778,15 @@ class Deva {
|
|
|
1778
1778
|
usage: this.prompt('text')
|
|
1779
1779
|
***************/
|
|
1780
1780
|
prompt(text) {
|
|
1781
|
-
// console.log('PROMPT', text);
|
|
1782
1781
|
// Talk a global prompt event for the client
|
|
1783
|
-
return this.talk('prompt', {
|
|
1782
|
+
return this.talk('devacore:prompt', {
|
|
1784
1783
|
id: this.uid(),
|
|
1784
|
+
key: 'return',
|
|
1785
|
+
value: 'prompt',
|
|
1786
|
+
agent: this.agent(),
|
|
1787
|
+
client: this.client(),
|
|
1785
1788
|
text,
|
|
1786
|
-
|
|
1787
|
-
created: Date.Now(),
|
|
1789
|
+
created: Date.now(),
|
|
1788
1790
|
});
|
|
1789
1791
|
}
|
|
1790
1792
|
|
|
@@ -1802,12 +1804,31 @@ class Deva {
|
|
|
1802
1804
|
let v, key;
|
|
1803
1805
|
const output = Array.isArray(obj) ? [] : {};
|
|
1804
1806
|
for (key in obj) {
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
+
v = obj[key];
|
|
1808
|
+
output[key] = (typeof v === "object") ? this.copy(v) : v;
|
|
1807
1809
|
}
|
|
1808
1810
|
return output;
|
|
1809
1811
|
}
|
|
1810
1812
|
|
|
1813
|
+
/**************
|
|
1814
|
+
func: getToday
|
|
1815
|
+
params:
|
|
1816
|
+
- d: The date string to get the day of..
|
|
1817
|
+
describe:
|
|
1818
|
+
a date can be passed in or generated to produce a date string for the day
|
|
1819
|
+
where time is 0. This feature is useful for logging for getting a date
|
|
1820
|
+
with no time value for the current day.
|
|
1821
|
+
***************/
|
|
1822
|
+
getToday(d) {
|
|
1823
|
+
d = d ? d : Date.now();
|
|
1824
|
+
const today = new Date(d);
|
|
1825
|
+
today.setHours(0);
|
|
1826
|
+
today.setMinutes(0);
|
|
1827
|
+
today.setSeconds(0);
|
|
1828
|
+
today.setMilliseconds(0);
|
|
1829
|
+
return today.getTime();
|
|
1830
|
+
}
|
|
1831
|
+
|
|
1811
1832
|
/**************
|
|
1812
1833
|
func: formatDate
|
|
1813
1834
|
params:
|
|
@@ -1877,5 +1898,46 @@ class Deva {
|
|
|
1877
1898
|
return parseFloat(n).toFixed(dec) + '%';
|
|
1878
1899
|
}
|
|
1879
1900
|
|
|
1901
|
+
/**************
|
|
1902
|
+
func: error
|
|
1903
|
+
params:
|
|
1904
|
+
- err: The error to process
|
|
1905
|
+
- data: Any additional data associated with the error
|
|
1906
|
+
- reject: An associated promise reject if the caller requires.
|
|
1907
|
+
describe:
|
|
1908
|
+
The erro function rpovides the consistent error manage of the system.
|
|
1909
|
+
usage: this.error(err, data, reject);
|
|
1910
|
+
***************/
|
|
1911
|
+
error(err,data=false,reject=false) {
|
|
1912
|
+
this.state('error');
|
|
1913
|
+
// check fo rthe custom onError function in the agent.
|
|
1914
|
+
console.log('\n::BEGIN:ERROR\n');
|
|
1915
|
+
console.log(err);
|
|
1916
|
+
console.log('\n::END:ERROR\n');
|
|
1917
|
+
if (data) {
|
|
1918
|
+
console.log('::::::');
|
|
1919
|
+
console.log('\n::BEGIN:DATA\n');
|
|
1920
|
+
console.log(JSON.stringify(data, null, 2));
|
|
1921
|
+
console.log('\n::END:DATA\n');
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1924
|
+
this.talk('devacore:error', {
|
|
1925
|
+
id: this.uid(true),
|
|
1926
|
+
key: 'return',
|
|
1927
|
+
value: 'error',
|
|
1928
|
+
agent: this.agent(),
|
|
1929
|
+
client: this.client(),
|
|
1930
|
+
text: err.toString(),
|
|
1931
|
+
data,
|
|
1932
|
+
created: Date.now(),
|
|
1933
|
+
});
|
|
1934
|
+
|
|
1935
|
+
const hasOnError = this.onError && typeof this.onError === 'function' ? true : false;
|
|
1936
|
+
if (hasOnError) return this.onError(err, data, reject);
|
|
1937
|
+
else {
|
|
1938
|
+
return reject ? reject(err) : err;
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1941
|
+
|
|
1880
1942
|
}
|
|
1881
1943
|
module.exports = Deva;
|