theprogrammablemind 8.0.0-beta.8 → 8.0.0-beta.81

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/client.js CHANGED
@@ -1,5 +1,7 @@
1
1
  const { Semantics, Semantic } = require('./src/semantics')
2
2
  const { Generators, Generator } = require('./src/generators')
3
+ const { Config } = require('./src/config')
4
+ const { loadInstance, ErrorReason, listable, setupArgs, gs, processContext, getObjects, setupProcessB, processContextsB } = require('./src/configHelpers')
3
5
  const DigraphInternal = require('./src/digraph_internal')
4
6
  const Digraph = require('./src/digraph')
5
7
  const { project } = require('./src/project')
@@ -10,36 +12,10 @@ const _ = require('lodash')
10
12
  const stringify = require('json-stable-stringify')
11
13
  const Lines = require('./lines')
12
14
  const flattens = require('./src/flatten')
13
- const { appendNoDups, InitCalls, updateQueries, safeNoDups, stableId } = require('./src/helpers')
15
+ const { appendNoDups, InitCalls, updateQueries, safeNoDups, stableId, where } = require('./src/helpers')
14
16
  const runtime = require('./runtime')
15
17
  const sortJson = runtime.sortJson
16
18
 
17
- function where (goUp = 2) {
18
- const e = new Error()
19
- const regexForm1 = /\((.*):(\d+):(\d+)\)$/
20
- const regexForm2 = /at (.*):(\d+):(\d+)$/
21
- const lines = e.stack.split('\n')
22
- let line
23
- let match
24
- for (line of lines.slice(1)) {
25
- // if (!(line.includes('config.js:') || line.includes('client.js:') || line.includes('<anonymous>'))) {
26
- if (!(line.includes('config.js:') || line.includes('client.js:'))) {
27
- match = regexForm1.exec(line) || regexForm2.exec(line)
28
- if (!match) {
29
- continue
30
- }
31
- break
32
- }
33
- }
34
- // const line = e.stack.split("\n")[goUp];
35
- // const match = regexForm1.exec(line) || regexForm2.exec(line)
36
- if (match) {
37
- return `${match[1]}:${match[2]}`
38
- } else {
39
- return 'running in browser'
40
- }
41
- }
42
-
43
19
  const getConfig_getObjectsCheck = (config, testConfig) => {
44
20
  let testConfigName = config.name
45
21
  if (testConfig.testModuleName) {
@@ -108,164 +84,6 @@ const vimdiff = (actualJSON, expectedJSON, title) => {
108
84
  }
109
85
  }
110
86
 
111
- const listable = (hierarchy) => (c, type) => {
112
- if (!c) {
113
- return false
114
- }
115
- if (hierarchy.isA(c.marker, type)) {
116
- return true
117
- }
118
- if (c.marker === 'list') {
119
- for (const t of c.types) {
120
- if (hierarchy.isA(t, type)) {
121
- return true
122
- }
123
- }
124
- }
125
- return false
126
- }
127
-
128
- const isA = (hierarchy) => (child, parent) => {
129
- if (!child || !parent) {
130
- return false
131
- }
132
- if (child.marker) {
133
- child = child.marker
134
- }
135
- if (parent.marker) {
136
- parent = parent.marker
137
- }
138
- return hierarchy.isA(child, parent)
139
- }
140
-
141
- const asList = (context) => {
142
- if (context.marker === 'list') {
143
- return context
144
- }
145
- return {
146
- marker: 'list',
147
- types: [context.marker],
148
- value: [context]
149
- }
150
- }
151
-
152
- class ErrorReason extends Error {
153
- constructor (context) {
154
- super(JSON.stringify(context))
155
- this.reason = context
156
- }
157
- }
158
-
159
- const setupArgs = (args, config, logs, hierarchy, uuidForScoping) => {
160
-
161
- // callId
162
- args.calls = new InitCalls(args.isInstance ? `${args.isInstance}#${config.name}` : config.name)
163
- if (global.theprogrammablemind && global.theprogrammablemind.loadForTesting) {
164
- args.calls = new InitCalls(Object.keys(global.theprogrammablemind.loadForTesting)[0])
165
- }
166
- args.km = (name) => config.getConfig(name)
167
- args.api = (name) => config.getConfig(name).api
168
- args.error = (context) => {
169
- throw new ErrorReason(context)
170
- }
171
- args.kms = config.getConfigs()
172
- args.config = config
173
- args.hierarchy = hierarchy
174
- args.isA = isA(hierarchy)
175
- args.listable = listable(hierarchy)
176
- args.asList = asList
177
- args.retry = () => { throw new RetryError() }
178
- args.fragments = (query) => config.fragment(query)
179
- args.breakOnSemantics = false
180
- args.theDebugger = {
181
- breakOnSemantics: (value) => args.breakOnSemantics = value
182
- }
183
- if (!logs) {
184
- }
185
- args.log = (message) => logs.push(message)
186
-
187
- args.addAssumedScoped = (args, assumed) => {
188
- const addAssumed = (args, ...moreAssumed) => {
189
- return { ...args, assumed: Object.assign({}, assumed, (args.assumed || {}), ...moreAssumed) }
190
- }
191
-
192
- args.s = (c) => config.getSemantics(logs).apply(args, c)
193
- args.g = (c, a = {}) => {
194
- return config.getGenerators(logs).apply(addAssumed(args, a), c, a)
195
- }
196
- args.gp = (c, a = {}) => {
197
- return config.getGenerators(logs).apply(addAssumed(args, a, { paraphrase: true, isResponse: false, response: false }), c, { paraphrase: true, isResponse: false, response: false })
198
- }
199
- args.gr = (c, a = {}) => {
200
- return config.getGenerators(logs).apply(addAssumed(args, a, { paraphrase: false, isResponse: true }), { ...c, paraphrase: false, isResponse: true })
201
- }
202
- args.e = (c) => {
203
- return config.getEvaluator(args.s, args.calls, logs, c)
204
- }
205
- args.gs = gs(args.g)
206
- args.gsp = gs(args.gp)
207
- args.gsr = gs(args.gr)
208
- }
209
- // for semantics
210
- args.addAssumedScoped(args, {})
211
-
212
- const getAPI = (uuid) => {
213
- if (config && config.getAPI) {
214
- return config.getAPI(uuid)
215
- }
216
- }
217
- const getAPIs = (uuid) => {
218
- if (config && config.getAPIs) {
219
- return config.getAPIs(uuid)
220
- }
221
- }
222
- args.getUUIDScoped = (uuid) => {
223
- return {
224
- api: getAPI(uuid),
225
- apis: getAPIs(uuid)
226
- }
227
- }
228
- config.getAddedArgs(args)
229
-
230
- Object.assign(args, args.getUUIDScoped(uuidForScoping || config.uuid))
231
- /*
232
- if (uuidForScoping) {
233
- Object.assign(args, args.getUUIDScoped(uuidForScoping))
234
- }
235
- */
236
- // sets args for all the API. that make a copy so the args must be fully setup by here except for scoped
237
- config.setArgs(args)
238
- }
239
-
240
- const gs = (g) => (contexts, separator, lastSeparator) => {
241
- if (!Array.isArray(contexts)) {
242
- debugger
243
- throw new Error('Expected a list')
244
- }
245
-
246
- let s = ''
247
- if (!separator) {
248
- separator = ' '
249
- }
250
- if (!lastSeparator) {
251
- lastSeparator = separator
252
- }
253
- let nextSeparator = ''
254
- for (let i = 0; i < contexts.length; ++i) {
255
- const context = contexts[i]
256
- const value = g(context)
257
- if (i > 0) {
258
- if (i === contexts.length - 1) {
259
- nextSeparator = lastSeparator
260
- } else {
261
- nextSeparator = separator
262
- }
263
- }
264
- s += nextSeparator + value
265
- }
266
- return s
267
- }
268
-
269
87
  const matching = (actual, expected) => {
270
88
  if (!deepEqual(stringify(sortJson(actual, { depth: 25 })), stringify(sortJson(expected, { depth: 25 })))) {
271
89
  return false
@@ -290,56 +108,18 @@ const analyzeMetaData = (right, wrong) => {
290
108
  return []
291
109
  }
292
110
 
293
- const processContexts = (contexts, params) => {
111
+ const processContexts = async (contexts, params) => {
294
112
  const contextsPrime = []
295
113
  const generated = []
296
114
  const logs = []
297
115
  for (const context of contexts) {
298
- const result = processContext(context, Object.assign({}, params, { logs }))
116
+ const result = await processContext(context, Object.assign({}, params, { logs }))
299
117
  contextsPrime.push(result.context)
300
118
  generated.push(result.generated)
301
119
  }
302
120
  return { contexts: contextsPrime, generated, logs }
303
121
  }
304
122
 
305
- const getObjects = (objects) => {
306
- return (uuid) => {
307
- if (objects && objects.namespaced) {
308
- return objects.namespaced[uuid]
309
- }
310
- return objects
311
- }
312
- }
313
-
314
- const processContext = (context, { objects = {}, config, logs = [] }) => {
315
- const generators = config.getGenerators(logs)
316
- const semantics = config.getSemantics(logs)
317
-
318
- // map to hash
319
- config = config || {}
320
- if (config.config) {
321
- config = config
322
- }
323
-
324
- const response = {} // NA but passed in
325
- // generators = new Generators(generators.map((g) => new Generator(normalizeGenerator(g))))
326
- // semantics = new Semantics(semantics.map((g) => new Semantic(normalizeSemantic(g))))
327
- const hierarchy = new DigraphInternal((config.config || {}).hierarchy || [])
328
-
329
- const args = { objects, response, getObjects: getObjects(objects) }
330
- setupArgs(args, config, logs, hierarchy)
331
-
332
- context = semantics.apply(args, context)
333
- const generated = generators.apply(args, context)
334
- const assumed = { paraphrase: true, response: false, isResponse: false }
335
- const paraphrases = generators.apply({ ...args, assumed }, context, { paraphrase: true, response: false, isResponse: false })
336
- let responses = []
337
- if (context.isResponse) {
338
- responses = generated
339
- }
340
- return { context, generated, paraphrases, responses }
341
- }
342
-
343
123
  const convertToStable = (objects) => {
344
124
  if (true) {
345
125
  return objects
@@ -431,139 +211,6 @@ const overlaps = (r1, context) => {
431
211
  return false
432
212
  }
433
213
 
434
- const setupContexts = (rawContexts) => {
435
- let first = true
436
- const contexts = []
437
- contexts.push({ marker: 'controlStart', controlRemove: true })
438
- for (const context of rawContexts) {
439
- if (first) {
440
- first = false
441
- } else {
442
- contexts.push({ marker: 'controlBetween', controlRemove: true })
443
- }
444
- contexts.push(context)
445
- }
446
- contexts.push({ marker: 'controlEnd', controlRemove: true })
447
- return contexts
448
- }
449
-
450
- const processContextsB = ({ config, hierarchy, semantics, generators, json, isTest, rebuildingTemplate, isInstance, instance, query, data, retries, url, commandLineArgs }) => {
451
- // TODO fix this name to contextsPrime
452
- const contextsPrime = []
453
- const generatedPrime = []
454
- const paraphrasesPrime = []
455
- const paraphrasesParenthesizedPrime = []
456
- const generatedParenthesizedPrime = []
457
- const responsesPrime = []
458
- const contexts = setupContexts(json.contexts)
459
-
460
- const objects = config.get('objects')
461
- const args = { objects, isResponse: true, response: json, isTest, isInstance, getObjects: getObjects(objects), instance }
462
- if (!json.logs) {
463
- json.logs = []
464
- }
465
- setupArgs(args, config, json.logs, hierarchy)
466
- const toDo = [...contexts]
467
- args.insert = (context) => toDo.unshift(context)
468
- let overlap, lastRange
469
- config.debugLoops = commandLineArgs && commandLineArgs.debugLoops
470
- while (toDo.length > 0) {
471
- const context = toDo.shift()
472
- args.calls.next()
473
- let contextPrime = context
474
- context.topLevel = true
475
- try {
476
- if (json.has_errors) {
477
- throw new Error('There are errors in the logs. Run with the -d flag and grep for Error')
478
- }
479
- const generateParenthesized = isTest || (commandLineArgs && commandLineArgs.save)
480
- if (!config.get('skipSemantics')) {
481
- const semantics = config.getSemantics(json.logs)
482
- try {
483
- contextPrime = semantics.apply(args, context)
484
- } catch (e) {
485
- if (e.message == 'Maximum call stack size exceeded') {
486
- const mostCalled = semantics.getMostCalled()
487
- e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
488
- }
489
- // contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
490
- if (isInstance) {
491
- console.log('error', e.error)
492
- }
493
- contextPrime = semantics.apply(args, {
494
- marker: 'error',
495
- context,
496
- text: e ? e.toString() : 'not available',
497
- reason: e.reason,
498
- error: e.stack || e.error
499
- })
500
- if (rebuildingTemplate) {
501
- throw e
502
- }
503
- }
504
- }
505
- if (contextPrime.controlRemove) {
506
- continue
507
- }
508
- let assumed = { isResponse: true }
509
- const generated = contextPrime.isResponse ? config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
510
- let generatedParenthesized = []
511
- if (generateParenthesized) {
512
- config.parenthesized = true
513
- generatedParenthesized = contextPrime.isResponse ? config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
514
- config.parenthesized = false
515
- }
516
- // assumed = { paraphrase: true, response: false };
517
- assumed = { paraphrase: true, isResponse: false, response: false }
518
- if (generateParenthesized) {
519
- config.parenthesized = false
520
- }
521
- const paraphrases = config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
522
- let paraphrasesParenthesized = []
523
- if (generateParenthesized) {
524
- config.parenthesized = true
525
- paraphrasesParenthesized = config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
526
- config.parenthesized = false
527
- }
528
- contextsPrime.push(contextPrime)
529
- generatedPrime.push(generated)
530
- paraphrasesPrime.push(paraphrases)
531
- if (generateParenthesized) {
532
- paraphrasesParenthesizedPrime.push(paraphrasesParenthesized)
533
- generatedParenthesizedPrime.push(generatedParenthesized)
534
- }
535
- if (contextPrime.isResponse) {
536
- responsesPrime.push(generated)
537
- } else {
538
- responsesPrime.push('')
539
- }
540
-
541
- // add results to processed list
542
- config.config.objects.processed = config.config.objects.processed || []
543
- config.config.objects.processed = config.config.objects.processed.slice(0, 5)
544
- config.config.objects.processed.unshift({ context: contextPrime, paraphrases: paraphrases, paraphrasesParenthesized, generatedParenthesized, responses: responsesPrime })
545
- } catch (e) {
546
- if (Array.isArray(e)) {
547
- e = {
548
- errors: e
549
- }
550
- }
551
- e.context = contextPrime
552
- if (e.logs) {
553
- e.logs = e.logs.concat(json.logs)
554
- } else {
555
- e.logs = json.logs
556
- }
557
- e.metadata = json.metadata
558
- if (json.trace) {
559
- e.trace = json.trace
560
- }
561
- throw e
562
- }
563
- }
564
- return { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime }
565
- }
566
-
567
214
  const doWithRetries = async (n, url, queryParams, data) => {
568
215
  if (!queryParams) {
569
216
  queryParams = ''
@@ -598,93 +245,6 @@ const doWithRetries = async (n, url, queryParams, data) => {
598
245
  }
599
246
  }
600
247
 
601
- const setupProcessB = ({ config, initializer, allowDelta = false } = {}) => {
602
- const key = config._key
603
-
604
- const data = Object.assign({ key, version: '3' }, { uuid: config._uuid })
605
- if (allowDelta && config.allowDelta && config.hasDelta()) {
606
- // console.log('config', config)
607
- data.delta = config.delta()
608
- } else {
609
- config.toData(data)
610
- // Object.assign(data, config.config)
611
- }
612
-
613
- // config.toServer(data)
614
-
615
- if (data.namespaces) {
616
- for (const uuid of Object.keys(data.namespaces)) {
617
- const km = config.configs.find((km) => km.uuid === uuid)
618
- data.namespaces[uuid].name = km.name
619
- }
620
- }
621
-
622
- // const generators = new Generators((data.generators || []).map((g) => new Generator(normalizeGenerator(g))))
623
- delete data.generators
624
- // const semantics = new Semantics((data.semantics || []).map((g) => new Semantic(normalizeSemantic(g))))
625
- delete data.semantics
626
- const hierarchy = new DigraphInternal((config.config || {}).hierarchy || [])
627
-
628
- return {
629
- data,
630
- // generators,
631
- // semantics,
632
- hierarchy
633
- }
634
- }
635
-
636
- // instance template loadTemplate
637
- const loadInstance = (config, instance) => {
638
- const transitoryMode = global.transitoryMode
639
- global.transitoryMode = false
640
-
641
- if (instance && (instance.associations || instance.learned_contextual_priorities)) {
642
- if (!config.config.retrain) {
643
- if (instance.associations) {
644
- config.addAssociations(instance.associations)
645
- }
646
- if (instance.learned_contextual_priorities && instance.learned_contextual_priorities.length > 0) {
647
- config.addPriorities(instance.learned_contextual_priorities)
648
- }
649
- }
650
- }
651
-
652
- const { /* data, generators, semantics, */ hierarchy } = setupProcessB({ config })
653
- // for (const results of (instance.resultss || [])) {
654
- for (const i in (instance.resultss || [])) {
655
- const results = instance.resultss[i]
656
- if (results.extraConfig) {
657
- // config.addInternal(results, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false)
658
- const uuid = config.nameToUUID(instance.name)
659
- // used to do a CLONE
660
- config.addInternal(instance.template.configs[i], { uuid, addFirst: true, handleCalculatedProps: true })
661
- } else if (results.apply) {
662
- const objects = config.get('objects')
663
- const args = { objects, getObjects: getObjects(objects) }
664
- if (instance.configs) {
665
- args.isInstance = `instance${i}`
666
- args.instance = instance.configs[i]
667
- }
668
-
669
- const uuid = config.nameToUUID(instance.name)
670
- setupArgs(args, config, config.logs, hierarchy, uuid)
671
- results.apply(args)
672
- } else {
673
- if (results.skipSemantics) {
674
- config.config.skipSemantics = results.skipSemantics
675
- }
676
- const args = { config, hierarchy, json: results, commandLineArgs: {} }
677
- args.isInstance = `instance${i}`
678
- args.instance = ''
679
- processContextsB(args)
680
- if (results.skipSemantics) {
681
- config.config.skipSemantics = null
682
- }
683
- }
684
- }
685
- global.transitoryMode = transitoryMode
686
- }
687
-
688
248
  const throwErrorHandler = (error) => {
689
249
  throw error
690
250
  }
@@ -701,7 +261,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
701
261
  // ensure same start state
702
262
  try {
703
263
  if (writeTests) {
704
- config.rebuild()
264
+ await config.rebuild()
705
265
  const objects = getObjects(config.config.objects)(config.uuid)
706
266
  }
707
267
  } catch (error) {
@@ -737,12 +297,14 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
737
297
  associations: []
738
298
  }
739
299
 
300
+ let startCounter = 0
740
301
  while (true) {
741
302
  if (queries.length === 0) {
742
303
  break
743
304
  }
744
305
 
745
306
  data.utterance = queries[0]
307
+ data.start_counter = startCounter
746
308
  let json = await doWithRetries(retries, url, queryParams, data)
747
309
  let resetData = false
748
310
  if (json.code == 'NOT_IN_CACHE') {
@@ -764,6 +326,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
764
326
  }
765
327
  }
766
328
  json.contexts = json.results
329
+ startCounter= json.end_counter + 1
767
330
  delete json.results
768
331
  if (json.status !== 200) {
769
332
  throw json
@@ -773,7 +336,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
773
336
  start = runtime.performance.performance.now()
774
337
  }
775
338
  const { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime } =
776
- processContextsB({ isTest, rebuildingTemplate, config, hierarchy, json, commandLineArgs /*, generators, semantics */ })
339
+ await processContextsB({ isTest, rebuildingTemplate, config, hierarchy, json, commandLineArgs /*, generators, semantics */ })
777
340
  if (isTest) {
778
341
  end = runtime.performance.performance.now()
779
342
  clientSideTime = end - start
@@ -801,6 +364,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
801
364
  response.generatedParenthesized = response.generatedParenthesized.concat(generatedParenthesizedPrime)
802
365
  response.responses = response.responses.concat(responsesPrime)
803
366
  queries = queries.slice(1)
367
+
804
368
  }
805
369
  }
806
370
 
@@ -828,7 +392,6 @@ const getConfigForTest = (config, testConfig) => {
828
392
  }
829
393
  const configForTest = {}
830
394
  for (const key of Object.keys(includes)) {
831
- // configForTest[key] = config.config[key]
832
395
  if (key === 'words') {
833
396
  const words = config.config.words
834
397
  configForTest.words = {
@@ -838,7 +401,14 @@ const getConfigForTest = (config, testConfig) => {
838
401
  }
839
402
 
840
403
  const literals = config.config.words.literals
404
+ let includesWord = (word) => true
405
+ if (Array.isArray(includes.words)) {
406
+ includesWord = (word) => includes.words.includes(word)
407
+ }
841
408
  for (const key in literals) {
409
+ if (!includesWord(key)) {
410
+ continue
411
+ }
842
412
  const defs = []
843
413
  for (const def of literals[key]) {
844
414
  // TODO handle thie uuids the right way
@@ -847,15 +417,23 @@ const getConfigForTest = (config, testConfig) => {
847
417
  configForTest.words.literals[key] = defs
848
418
  }
849
419
 
850
- const patterns = config.config.words.patterns
420
+ const patterns = config.config.words.patterns || []
851
421
  configForTest.words.patterns = patterns.map((pattern) => Object.assign({}, pattern, { uuid: undefined }))
852
422
 
853
- const hierarchy = config.config.words.hierarchy
423
+ const hierarchy = config.config.words.hierarchy || []
854
424
  configForTest.words.hierarchy = hierarchy.map((hierarchy) => Object.assign({}, hierarchy, { uuid: undefined }))
855
425
  } else if (key === 'operators') {
856
- configForTest.operators = config.config.operators.map((operator) => Object.assign({}, operator, { uuid: undefined }))
426
+ let include = (operator) => true
427
+ if (Array.isArray(includes.operators)) {
428
+ include = (operator) => includes.operators.includes(operator.pattern)
429
+ }
430
+ configForTest.operators = config.config.operators.filter( include ).map((operator) => Object.assign({}, operator, { uuid: undefined }))
857
431
  } else if (key === 'bridges') {
858
- configForTest.bridges = config.config.bridges.map((bridge) => Object.assign({}, bridge, { uuid: undefined }))
432
+ let include = (operator) => true
433
+ if (Array.isArray(includes.bridges)) {
434
+ include = (bridge) => includes.bridges.includes(bridge.id)
435
+ }
436
+ configForTest.bridges = config.config.bridges.filter(include).map((bridge) => Object.assign({}, bridge, { uuid: undefined }))
859
437
  } else {
860
438
  configForTest[key] = config.config[key]
861
439
  }
@@ -865,8 +443,12 @@ const getConfigForTest = (config, testConfig) => {
865
443
 
866
444
  const runTest = async (config, expected, { args, verbose, testConfig, debug }) => {
867
445
  const test = expected.query
446
+ if (args.query && args.query != test) {
447
+ // no run this
448
+ return
449
+ }
868
450
  // initialize in between test so state is not preserved since the test was adding without state
869
- config.rebuild()
451
+ await config.rebuild()
870
452
  const errorHandler = (error) => {
871
453
  if (error.metadata) {
872
454
  const priorities = analyzeMetaData(expected.metadata, error.metadata)
@@ -1012,7 +594,7 @@ const runTests = async (config, testFile, juicyBits) => {
1012
594
  }
1013
595
 
1014
596
  const saveTest = async (testFile, config, test, expected, testConfig, saveDeveloper) => {
1015
- config.rebuild()
597
+ await config.rebuild()
1016
598
  const objects = getObjects(config.config.objects)(config.uuid)
1017
599
  console.log(test)
1018
600
  const result = await _process(config, test, { isTest: true })
@@ -1033,11 +615,11 @@ const saveTestsHelper = async (testFile, config, tests, todo, testConfig, saveDe
1033
615
  return
1034
616
  }
1035
617
  const test = todo.pop()
1036
- config.rebuild()
618
+ await config.rebuild()
1037
619
  const result = await saveTest(testFile, config, test, tests[test], testConfig, saveDeveloper)
1038
620
  // initialize in between test so state is not preserved since the test was adding without state
1039
621
  // config.initialize({force: true})
1040
- config.rebuild()
622
+ await config.rebuild()
1041
623
  return saveTestsHelper(testFile, config, tests, todo, testConfig, saveDeveloper)
1042
624
  }
1043
625
 
@@ -1324,6 +906,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1324
906
  associations: [],
1325
907
  learned_contextual_priorities: []
1326
908
  }
909
+ config.fragmentsBeingBuilt = []
1327
910
  const looper = async (configs) => {
1328
911
  if (configs.length === 0) {
1329
912
  finish()
@@ -1331,14 +914,15 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1331
914
  }
1332
915
  const { property, hierarchy, query: queryOrExtraConfig, previousResults, initializer, skipSemantics } = configs.shift()
1333
916
  // queries are strings or { query: "blah", development: true/false }
1334
- if (typeof queryOrExtraConfig === 'string' || queryOrExtraConfig.query) {
917
+ if (typeof queryOrExtraConfig === 'string' || queryOrExtraConfig.query || queryOrExtraConfig.isFragment) {
1335
918
  let query = queryOrExtraConfig
919
+ let isFragment = queryOrExtraConfig.isFragment
1336
920
  if (typeof queryOrExtraConfig === 'string') {
1337
921
  query = { query }
1338
922
  }
1339
- config.config.skipSemantics = skipSemantics
923
+ config.config.skipSemantics = skipSemantics && !isFragment
1340
924
  const transitoryMode = global.transitoryMode
1341
- if (property == 'fragments') {
925
+ if (isFragment || property == 'fragments') {
1342
926
  global.transitoryMode = true
1343
927
  }
1344
928
  if (hierarchy) {
@@ -1356,7 +940,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1356
940
  if (previousResults && previousResults.query == query.query) {
1357
941
  results = previousResults
1358
942
  prMessage = ' Using previous results. use -rtf for a hard rebuild of everything on the server side.'
1359
- loadInstance(config, { resultss: [results] })
943
+ await loadInstance(config, { resultss: [results] })
1360
944
  } else {
1361
945
  results = await _process(config, query.query, { initializer, rebuildingTemplate: true })
1362
946
  }
@@ -1370,15 +954,19 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1370
954
  } else if (results.paraphrases[0] != query.query) {
1371
955
  console.log(`query "${query.query}". The paraphrase is different from the query "${results.paraphrases[0]}".${prMessage}`)
1372
956
  } else {
1373
- console.log(`query "${query.query}".${prMessage}`)
957
+ console.log(`query ${isFragment ? 'fragment' : ''}"${query.query}".${prMessage}`)
1374
958
  }
1375
959
  global.transitoryMode = transitoryMode
1376
960
  config.config.skipSemantics = null
1377
961
  results.query = query.query
962
+ results.isFragment = isFragment
1378
963
  results.skipSemantics = skipSemantics
1379
964
  results.development = query.development
1380
965
  results.key = { query: query.query, hierarchy }
1381
966
  accumulators[property].push(results)
967
+ if (isFragment) {
968
+ config.fragmentsBeingBuilt.push({ query: query.query, contexts: results.contexts })
969
+ }
1382
970
  accumulators.associations = accumulators.associations.concat(results.associations)
1383
971
  accumulators.learned_contextual_priorities = accumulators.learned_contextual_priorities.concat(results.learned_contextual_priorities)
1384
972
  await looper(configs)
@@ -1392,7 +980,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1392
980
  const initFunction = queryOrExtraConfig
1393
981
  const objects = config.get('objects')
1394
982
  const args = { objects, getObjects: getObjects(objects) }
1395
- setupArgs(args, config, config.logs, hierarchy)
983
+ setupArgs(args, config, config.logs, config.hierarchy)
1396
984
  initFunction(args)
1397
985
  accumulators[property].push({ apply: queryOrExtraConfig })
1398
986
  await looper(configs)
@@ -1417,6 +1005,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1417
1005
  }
1418
1006
 
1419
1007
  const finish = () => {
1008
+ config.fragmentsBeingBuilt = []
1420
1009
  const instanceName = `${target}.instance.json`
1421
1010
  console.log(`Writing instance file ${instanceName}`)
1422
1011
  const stabilizeAssociations = (associations) => {
@@ -1505,11 +1094,16 @@ const checkTest = (testConfig) => {
1505
1094
  }
1506
1095
 
1507
1096
  const knowledgeModuleImpl = async ({
1097
+ includes,
1098
+ config : configStruct,
1099
+ api,
1100
+ initializer,
1101
+ terminator,
1102
+ multiApiInitializer,
1103
+
1508
1104
  module: moduleFromJSFile,
1509
1105
  description,
1510
1106
  section,
1511
- // config, createConfig,
1512
- createConfig,
1513
1107
  newWay,
1514
1108
  demo,
1515
1109
  test,
@@ -1517,7 +1111,6 @@ const knowledgeModuleImpl = async ({
1517
1111
  errorHandler = defaultErrorHandler,
1518
1112
  process: processResults = defaultProcess,
1519
1113
  stopAtFirstFailure = true,
1520
- acceptsAdditionalConfig = false,
1521
1114
  ...rest
1522
1115
  } = {}) => {
1523
1116
  const unknownArgs = Object.keys(rest)
@@ -1530,10 +1123,29 @@ const knowledgeModuleImpl = async ({
1530
1123
  if (!moduleFromJSFile) {
1531
1124
  throw new Error("'module' is a required parameter. The value should be either 'module' or a lambda that will be called when the file is acting as a module.")
1532
1125
  }
1533
- // if (!config && !createConfig) {
1534
- if (!createConfig) {
1126
+
1127
+ if (!configStruct) {
1535
1128
  throw new Error("'config' or 'createConfig' is a required parameter. The value should the config that defines the knowledge module.")
1536
1129
  }
1130
+
1131
+ const createConfig = async () => {
1132
+ const config = new Config(configStruct, moduleFromJSFile, _process)
1133
+ config.setTerminator(terminator)
1134
+ config.stop_auto_rebuild()
1135
+ await config.add(...(includes || []))
1136
+ if (api) {
1137
+ config.setApi(api)
1138
+ }
1139
+ if (multiApiInitializer) {
1140
+ await config.setMultiApi(multiApiInitializer)
1141
+ }
1142
+ if (initializer) {
1143
+ config.initializer(initializer)
1144
+ }
1145
+ await config.restart_auto_rebuild()
1146
+ return config
1147
+ }
1148
+
1537
1149
  if (!description) {
1538
1150
  throw new Error("'description' is a required parameter. The value should the description of the knowledge module.")
1539
1151
  }
@@ -1566,548 +1178,562 @@ const knowledgeModuleImpl = async ({
1566
1178
  }
1567
1179
 
1568
1180
  if (isProcess) {
1569
- const parser = new runtime.ArgumentParser({
1570
- description: 'Entodicton knowledge module'
1571
- })
1572
-
1573
- const helpDebugWord = 'In order to get a debug break when a specific word is created set the DEBUG_WORD environment variable to the JSON of the association to break on. For example DEBUG_WORD=\'"the"\''
1574
- const helpDebugAssociation = 'In order to get a debug break when a specific association is created set the DEBUG_ASSOCIATION environment variable to the JSON of the association to break on. For example DEBUG_ASSOCIATION=\'[["the", 0], ["mammal", 1]]\''
1575
- const helpDebugHierarchy = 'In order to get a debug break when a specific hierarchy is created set the DEBUG_HIERARCHY environment variable to the JSON of the child-parent pair to break on. For example DEBUG_HIERARCHY=\'[["cat", 1], ["mammel", 1]]\''
1576
- const helpDebugPriority = 'In order to get a debug break when a specific set of priorities is created set set DEBUG_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_PRIORITY=\'[["verb", 0], ["article", 0]]\''
1577
- const helpDebugContextualPriority = 'In order to get a debug break when a specific set of contextual priorities is created set set DEBUG_CONTEXTUAL_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_CONTEXTUAL_PRIORITY=\'{ context: [["verb", 0], ["article", 0], select: 1}\''
1578
- const helpDebugBridge = 'In order to get a debug break when a specific bridge is created set the DEBUG_BRIDGE environment variable to id to break on. For example DEBUG_BRIDGE=\'car\''
1579
- const helpDebugOperator = 'In order to get a debug break when a specific hierarcy is created set the DEBUG_OPERATOR environment variable to debug any config loaded. For example DEBUG_OPERATOR=\'([operator] ([arg]))\''
1580
-
1581
- parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
1582
- parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
1583
- parser.add_argument('-tv', '--testVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. Create tests by running with the --query or --loop with the --save flag' })
1584
- // parser.add_argument('-ttr', '--testToRun', { help: 'Only the specified test will be run' })
1585
- parser.add_argument('-tva', '--testAllVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. All the tests will be run instead of stopping at first failure. Create tests by running with the --query or --loop with the --save flag' })
1586
- parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
1587
- parser.add_argument('-n', '--count', { help: 'Number of times to run the tests. Default is one. Use this to check for flakey test. If possible the system will print out a message with the word "hint" suggesting how to fix the problem' })
1588
- // parser.add_argument('-b', '--build', { help: 'Specify the template file name of the form <kmName>. There should be a file called <baseKmName>.<kmName>.template.json with the queries to run. For example { queries: [...] }. The template file will be run and generate an instantiation called <baseKmName>.<kmName>.instance.json and a file called <kmName>.js that will load the template file (this is file generated only if not already existing) and a test file called <KmName>.tests.json. This can then be loaded into an instance of the current knowledge module to setup initial conditions.' })
1589
- parser.add_argument('-rt', '--rebuildTemplate', { action: 'store_true', help: 'Force a template rebuild. Using optimization where if the query/config has not changed it will use the previous value. One there is a change all subsequence query/configs will be run.' })
1590
- parser.add_argument('-rtf', '--rebuildTemplateFull', { action: 'store_true', help: 'Force a template rebuild. Skip the optimization' })
1591
- parser.add_argument('-l', '--loop', { action: 'store_true', help: 'Run a loop so that multiply queries may be run' })
1592
- parser.add_argument('-i', '--info', { action: 'store_true', help: 'Print meta-data for the module' })
1593
- parser.add_argument('-v', '--vimdiff', { action: 'store_true', help: 'For failures run vimdiff' })
1594
- parser.add_argument('-g', '--greg', { action: 'store_true', help: 'Set the server to be localhost so I can debug stuff' })
1595
- parser.add_argument('-cl', '--checkForLoop', { nargs: '?', help: 'Check for loops in the priorities, Optional argument is list of operator keys to consider. For example [["banana", 0], ["food", 1]]' })
1596
- parser.add_argument('-r', '--reset', { action: 'store_true', help: 'Get the server to bypass the cache and rebuild everything' })
1597
- parser.add_argument('-q', '--query', { help: 'Run the specified query' })
1598
- parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
1599
- parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
1600
- parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
1601
- parser.add_argument('--parenthesized', { action: 'store_true', help: 'Show the generated phrases with parenthesis.' })
1602
- parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
1603
- parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
1604
- parser.add_argument('-p', '--print', { help: 'Print the specified elements c === config, w === words, b === bridges, o === operators d === objects (d for data), h === hierarchy, g === generators, s === semantics, l === load t=tests ordering p === priorities a == associations j == JSON sent to server. for example --print wb' })
1605
- parser.add_argument('-s', '--save', { action: 'store_true', help: 'When running with the --query flag this will save the current run to the test file. When running without the --query flag all tests will be run and resaved.' })
1606
- parser.add_argument('-sd', '--saveDeveloper', { action: 'store_true', help: 'Same as -s but the query will not show up in the info command.' })
1607
- parser.add_argument('-dl', '--debugLoops', { action: 'store_true', help: 'When running with the --debugLoops flag the logs calls to semantics and generators will be immediately written to the console ' })
1608
- parser.add_argument('-d', '--debug', { action: 'store_true', help: 'When running with the --debug flag this set the debug flag in the config' })
1609
- parser.add_argument('-da', '--debugAssociation', { action: 'store_true', help: helpDebugAssociation })
1610
- parser.add_argument('-dw', '--debugWord', { action: 'store_true', help: helpDebugWord })
1611
- parser.add_argument('-dh', '--debugHierarchy', { action: 'store_true', help: helpDebugHierarchy })
1612
- parser.add_argument('-dp', '--debugPriority', { action: 'store_true', help: helpDebugPriority })
1613
- parser.add_argument('-dcp', '--debugContextualPriority', { action: 'store_true', help: helpDebugContextualPriority })
1614
- parser.add_argument('-db', '--debugBridge', { action: 'store_true', help: helpDebugBridge })
1615
- parser.add_argument('-do', '--debugOperator', { action: 'store_true', help: helpDebugOperator })
1616
- parser.add_argument('-ep', '--explainPriorities', { action: 'store_true', help: 'The server will return all priorities including the generated one along with an explanation of there they came from' })
1617
- parser.add_argument('-dic', '--debugIncludeConvolutions', { nargs: '?', help: 'When running with the --debugIncludeConvolutions flag the logs will include convolutions which are somewhat annoyingly verbose. Default is false' })
1618
-
1619
- const args = parser.parse_args()
1620
- args.count = args.count || 1
1621
-
1622
- if (args.rebuildTemplateFull) {
1623
- args.rebuildTemplate = true
1624
- }
1181
+ let config
1182
+ try {
1183
+ const parser = new runtime.ArgumentParser({
1184
+ description: 'Entodicton knowledge module'
1185
+ })
1625
1186
 
1626
- // dont debug the load of the KM's if rebuild template is on since we want to debug the template rebuild not the load
1627
- if (args.rebuildTemplate) {
1628
- global.pauseDebugging = true
1629
- }
1187
+ const helpDebugWord = 'In order to get a debug break when a specific word is created set the DEBUG_WORD environment variable to the JSON of the association to break on. For example DEBUG_WORD=\'"the"\''
1188
+ const helpDebugAssociation = 'In order to get a debug break when a specific association is created set the DEBUG_ASSOCIATION environment variable to the JSON of the association to break on. For example DEBUG_ASSOCIATION=\'[["the", 0], ["mammal", 1]]\''
1189
+ const helpDebugHierarchy = 'In order to get a debug break when a specific hierarchy is created set the DEBUG_HIERARCHY environment variable to the JSON of the child-parent pair to break on. For example DEBUG_HIERARCHY=\'[["cat", 1], ["mammel", 1]]\''
1190
+ const helpDebugPriority = 'In order to get a debug break when a specific set of priorities is created set set DEBUG_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_PRIORITY=\'[["verb", 0], ["article", 0]]\''
1191
+ const helpDebugContextualPriority = 'In order to get a debug break when a specific set of contextual priorities is created set set DEBUG_CONTEXTUAL_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_CONTEXTUAL_PRIORITY=\'{ context: [["verb", 0], ["article", 0], select: 1}\''
1192
+ const helpDebugBridge = 'In order to get a debug break when a specific bridge is created set the DEBUG_BRIDGE environment variable to id to break on. For example DEBUG_BRIDGE=\'car\''
1193
+ const helpDebugOperator = 'In order to get a debug break when a specific hierarcy is created set the DEBUG_OPERATOR environment variable to debug any config loaded. For example DEBUG_OPERATOR=\'([operator] ([arg]))\''
1194
+
1195
+ parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
1196
+ parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
1197
+ parser.add_argument('-tv', '--testVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. Create tests by running with the --query or --loop with the --save flag' })
1198
+ // parser.add_argument('-ttr', '--testToRun', { help: 'Only the specified test will be run' })
1199
+ parser.add_argument('-tva', '--testAllVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. All the tests will be run instead of stopping at first failure. Create tests by running with the --query or --loop with the --save flag. if -q is specified the tests will be run for just the specified query.' })
1200
+ parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
1201
+ parser.add_argument('-n', '--count', { help: 'Number of times to run the tests. Default is one. Use this to check for flakey test. If possible the system will print out a message with the word "hint" suggesting how to fix the problem' })
1202
+ // parser.add_argument('-b', '--build', { help: 'Specify the template file name of the form <kmName>. There should be a file called <baseKmName>.<kmName>.template.json with the queries to run. For example { queries: [...] }. The template file will be run and generate an instantiation called <baseKmName>.<kmName>.instance.json and a file called <kmName>.js that will load the template file (this is file generated only if not already existing) and a test file called <KmName>.tests.json. This can then be loaded into an instance of the current knowledge module to setup initial conditions.' })
1203
+ parser.add_argument('-rt', '--rebuildTemplate', { action: 'store_true', help: 'Force a template rebuild. Using optimization where if the query/config has not changed it will use the previous value. One there is a change all subsequence query/configs will be run.' })
1204
+ parser.add_argument('-rtf', '--rebuildTemplateFull', { action: 'store_true', help: 'Force a template rebuild. Skip the optimization' })
1205
+ parser.add_argument('-l', '--loop', { action: 'store_true', help: 'Run a loop so that multiply queries may be run' })
1206
+ parser.add_argument('-i', '--info', { action: 'store_true', help: 'Print meta-data for the module' })
1207
+ parser.add_argument('-v', '--vimdiff', { action: 'store_true', help: 'For failures run vimdiff' })
1208
+ parser.add_argument('-g', '--greg', { action: 'store_true', help: 'Set the server to be localhost so I can debug stuff' })
1209
+ parser.add_argument('-cl', '--checkForLoop', { nargs: '?', help: 'Check for loops in the priorities, Optional argument is list of operator keys to consider. For example [["banana", 0], ["food", 1]]' })
1210
+ parser.add_argument('-r', '--reset', { action: 'store_true', help: 'Get the server to bypass the cache and rebuild everything' })
1211
+ parser.add_argument('-q', '--query', { help: 'Run the specified query' })
1212
+ parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
1213
+ parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
1214
+ parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
1215
+ parser.add_argument('--parenthesized', { action: 'store_true', help: 'Show the generated phrases with parenthesis.' })
1216
+ parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
1217
+ parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
1218
+ parser.add_argument('-p', '--print', { help: 'Print the specified elements c === config, w === words, b === bridges, o === operators d === objects (d for data), h === hierarchy, g === generators, s === semantics, l === load t=tests ordering p === priorities a == associations j == JSON sent to server. for example --print wb' })
1219
+ parser.add_argument('-s', '--save', { action: 'store_true', help: 'When running with the --query flag this will save the current run to the test file. When running without the --query flag all tests will be run and resaved.' })
1220
+ parser.add_argument('-sd', '--saveDeveloper', { action: 'store_true', help: 'Same as -s but the query will not show up in the info command.' })
1221
+ parser.add_argument('-dl', '--debugLoops', { action: 'store_true', help: 'When running with the --debugLoops flag the logs calls to semantics and generators will be immediately written to the console ' })
1222
+ parser.add_argument('-d', '--debug', { action: 'store_true', help: 'When running with the --debug flag this set the debug flag in the config' })
1223
+ parser.add_argument('-da', '--debugAssociation', { action: 'store_true', help: helpDebugAssociation })
1224
+ parser.add_argument('-dw', '--debugWord', { action: 'store_true', help: helpDebugWord })
1225
+ parser.add_argument('-dh', '--debugHierarchy', { action: 'store_true', help: helpDebugHierarchy })
1226
+ parser.add_argument('-dp', '--debugPriority', { action: 'store_true', help: helpDebugPriority })
1227
+ parser.add_argument('-dcp', '--debugContextualPriority', { action: 'store_true', help: helpDebugContextualPriority })
1228
+ parser.add_argument('-db', '--debugBridge', { action: 'store_true', help: helpDebugBridge })
1229
+ parser.add_argument('-do', '--debugOperator', { action: 'store_true', help: helpDebugOperator })
1230
+ parser.add_argument('-ep', '--explainPriorities', { action: 'store_true', help: 'The server will return all priorities including the generated one along with an explanation of there they came from' })
1231
+ parser.add_argument('-dic', '--debugIncludeConvolutions', { nargs: '?', help: 'When running with the --debugIncludeConvolutions flag the logs will include convolutions which are somewhat annoyingly verbose. Default is false' })
1232
+
1233
+ const args = parser.parse_args()
1234
+ args.count = args.count || 1
1235
+
1236
+ if (args.rebuildTemplateFull) {
1237
+ args.rebuildTemplate = true
1238
+ }
1239
+
1240
+ config = await createConfig()
1241
+
1242
+ // dont debug the load of the KM's if rebuild template is on since we want to debug the template rebuild not the load
1243
+ if (args.rebuildTemplate) {
1244
+ global.pauseDebugging = true
1245
+ }
1630
1246
 
1631
- const config = createConfig()
1632
- setupConfig(config)
1633
- processResults = processResults({ config, errorHandler })
1247
+ setupConfig(config)
1248
+ processResults = processResults({ config, errorHandler })
1634
1249
 
1635
- if (args.rebuildTemplate) {
1636
- global.pauseDebugging = false
1637
- }
1250
+ if (args.rebuildTemplate) {
1251
+ global.pauseDebugging = false
1252
+ }
1638
1253
 
1639
- // setup();
1254
+ // setup();
1640
1255
 
1641
- if (args.parenthesized) {
1642
- config.parenthesized = true
1643
- }
1644
- if (args.checkForLoop) {
1645
- try {
1646
- args.checkForLoop = JSON.parse(args.checkForLoop)
1647
- const isKey = (what) => {
1648
- if (!Array.isArray(what)) {
1649
- return false
1650
- }
1651
- if (what.length !== 2) {
1652
- return false
1653
- }
1654
- if (!typeof what[0] == 'string') {
1655
- return false
1256
+ if (args.parenthesized) {
1257
+ config.parenthesized = true
1258
+ }
1259
+ if (args.checkForLoop) {
1260
+ try {
1261
+ args.checkForLoop = JSON.parse(args.checkForLoop)
1262
+ const isKey = (what) => {
1263
+ if (!Array.isArray(what)) {
1264
+ return false
1265
+ }
1266
+ if (what.length !== 2) {
1267
+ return false
1268
+ }
1269
+ if (!typeof what[0] == 'string') {
1270
+ return false
1271
+ }
1272
+ if (!typeof what[1] == 'number') {
1273
+ return false
1274
+ }
1275
+ return true
1656
1276
  }
1657
- if (!typeof what[1] == 'number') {
1658
- return false
1277
+ if (!Array.isArray(args.checkForLoop) || args.checkForLoop.some((value) => !isKey(value))) {
1278
+ throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
1659
1279
  }
1660
- return true
1661
- }
1662
- if (!Array.isArray(args.checkForLoop) || args.checkForLoop.some((value) => !isKey(value))) {
1280
+ } catch (e) {
1663
1281
  throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
1664
1282
  }
1665
- } catch (e) {
1666
- throw new Error(`Error parsing JSON of the checkForLoop argument. ${e}`)
1283
+ } else {
1284
+ if (process.argv.includes('--checkForLoop') || process.argv.includes('-cl')) {
1285
+ args.checkForLoop = true
1286
+ }
1667
1287
  }
1668
- } else {
1669
- if (process.argv.includes('--checkForLoop') || process.argv.includes('-cl')) {
1670
- args.checkForLoop = true
1288
+ if (args.debugAssociation) {
1289
+ console.log(helpDebugAssociation)
1290
+ runtime.process.exit(-1)
1291
+ }
1292
+ if (args.debugWord) {
1293
+ console.log(helpDebugWord)
1294
+ runtime.process.exit(-1)
1295
+ }
1296
+ if (args.debugHierarchy) {
1297
+ console.log(helpDebugHierarchy)
1298
+ runtime.process.exit(-1)
1299
+ }
1300
+ if (args.debugPriority) {
1301
+ console.log(helpDebugPriority)
1302
+ runtime.process.exit(-1)
1303
+ }
1304
+ if (args.debugBridge) {
1305
+ console.log(helpDebugBridge)
1306
+ runtime.process.exit(-1)
1307
+ }
1308
+ if (args.debugOperator) {
1309
+ console.log(helpDebugOperator)
1310
+ runtime.process.exit(-1)
1671
1311
  }
1672
- }
1673
- if (args.debugAssociation) {
1674
- console.log(helpDebugAssociation)
1675
- runtime.process.exit(-1)
1676
- }
1677
- if (args.debugWord) {
1678
- console.log(helpDebugWord)
1679
- runtime.process.exit(-1)
1680
- }
1681
- if (args.debugHierarchy) {
1682
- console.log(helpDebugHierarchy)
1683
- runtime.process.exit(-1)
1684
- }
1685
- if (args.debugPriority) {
1686
- console.log(helpDebugPriority)
1687
- runtime.process.exit(-1)
1688
- }
1689
- if (args.debugBridge) {
1690
- console.log(helpDebugBridge)
1691
- runtime.process.exit(-1)
1692
- }
1693
- if (args.debugOperator) {
1694
- console.log(helpDebugOperator)
1695
- runtime.process.exit(-1)
1696
- }
1697
1312
 
1698
- if (args.clean) {
1699
- const tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
1700
- for (const test of tests) {
1701
- delete test.associations
1313
+ if (args.clean) {
1314
+ const tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
1315
+ for (const test of tests) {
1316
+ delete test.associations
1317
+ }
1318
+ writeTestFile(testConfig.name, tests)
1319
+ console.log(`Cleaned ${testConfig.name}`)
1320
+ return
1702
1321
  }
1703
- writeTestFile(testConfig.name, tests)
1704
- console.log(`Cleaned ${testConfig.name}`)
1705
- return
1706
- }
1707
1322
 
1708
- if (args.deleteTest) {
1709
- let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
1710
- tests = tests.filter((test) => test.query !== args.deleteTest)
1711
- writeTestFile(testConfig.name, tests)
1712
- console.log(`Remove the test for "${args.deleteTest}"`)
1713
- return
1714
- }
1323
+ if (args.deleteTest) {
1324
+ let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
1325
+ tests = tests.filter((test) => test.query !== args.deleteTest)
1326
+ writeTestFile(testConfig.name, tests)
1327
+ console.log(`Remove the test for "${args.deleteTest}"`)
1328
+ return
1329
+ }
1715
1330
 
1716
- const options = { rebuild: false }
1717
- if (args.rebuildTemplate) {
1718
- options.rebuild = true
1719
- }
1720
- if (args.greg) {
1721
- config.server('http://localhost:3000', '6804954f-e56d-471f-bbb8-08e3c54d9321')
1722
- }
1723
- if (args.server) {
1724
- config.server(args.server)
1725
- }
1331
+ const options = { rebuild: false }
1332
+ if (args.rebuildTemplate) {
1333
+ options.rebuild = true
1334
+ }
1335
+ if (args.greg) {
1336
+ config.server('http://localhost:3000', '6804954f-e56d-471f-bbb8-08e3c54d9321')
1337
+ }
1338
+ if (args.server) {
1339
+ config.server(args.server)
1340
+ }
1726
1341
 
1727
- if (args.queryParams) {
1728
- config.setQueryParams(args.queryParams)
1729
- }
1342
+ if (args.queryParams) {
1343
+ config.setQueryParams(args.queryParams)
1344
+ }
1730
1345
 
1731
- if (args.debug) {
1732
- config.config.debug = true
1733
- }
1346
+ if (args.debug) {
1347
+ config.config.debug = true
1348
+ }
1734
1349
 
1735
- if (args.reset) {
1736
- config.config.skip_cache = true
1737
- }
1350
+ if (args.reset) {
1351
+ config.config.skip_cache = true
1352
+ }
1738
1353
 
1739
- if (args.explainPriorities) {
1740
- config.config.explain_priorities = true
1741
- }
1354
+ if (args.explainPriorities) {
1355
+ config.config.explain_priorities = true
1356
+ }
1742
1357
 
1743
- config.config.debugIncludeConvolutions = args.debugIncludeConvolutions || process.argv.includes('--debugIncludeConvolutions') || process.argv.includes('-dic')
1358
+ config.config.debugIncludeConvolutions = args.debugIncludeConvolutions || process.argv.includes('--debugIncludeConvolutions') || process.argv.includes('-dic')
1744
1359
 
1745
- let configPrinted = false
1746
- const printConfig = () => {
1747
- if (configPrinted) {
1748
- return
1749
- }
1750
- configPrinted = true
1751
- if (args.print) {
1752
- if (args.print.includes('t')) {
1753
- console.log('Test queries')
1754
- let counter = 0
1755
- for (const test of config.tests) {
1756
- console.log(`${counter} - ${test.query}`)
1757
- counter += 1
1758
- }
1759
- }
1760
- if (args.print.includes('c')) {
1761
- const { data } = setupProcessB({ config })
1762
- console.log('Config as sent to server')
1763
- console.log(JSON.stringify(data, null, 2))
1360
+ let configPrinted = false
1361
+ const printConfig = () => {
1362
+ if (configPrinted) {
1363
+ return
1764
1364
  }
1365
+ configPrinted = true
1366
+ if (args.print) {
1367
+ if (args.print.includes('t')) {
1368
+ console.log('Test queries')
1369
+ let counter = 0
1370
+ for (const test of config.tests) {
1371
+ console.log(`${counter} - ${test.query}`)
1372
+ counter += 1
1373
+ }
1374
+ }
1375
+ if (args.print.includes('c')) {
1376
+ const { data } = setupProcessB({ config })
1377
+ console.log('Config as sent to server')
1378
+ console.log(JSON.stringify(data, null, 2))
1379
+ }
1765
1380
 
1766
- if (args.print.includes('l')) {
1767
- console.log('Module load ordering')
1768
- for (const km of config.configs) {
1769
- console.log(` ${km.name}`)
1381
+ if (args.print.includes('l')) {
1382
+ console.log('Module load ordering')
1383
+ for (const km of config.configs) {
1384
+ console.log(` ${km.name}`)
1385
+ }
1770
1386
  }
1771
- }
1772
- if (args.print.includes('w')) {
1773
- // { literals: Object, patterns: Array(2), hierarchy: Array(97) }
1774
- console.log('literals')
1775
- for (const word in config.config.words.literals) {
1776
- console.log(' ' + word.concat(' ', ...config.config.words.literals[word].map((def) => JSON.stringify(def))))
1387
+ if (args.print.includes('w')) {
1388
+ // { literals: Object, patterns: Array(2), hierarchy: Array(97) }
1389
+ console.log('literals')
1390
+ for (const word in config.config.words.literals) {
1391
+ console.log(' ' + word.concat(...config.config.words.literals[word].map((def, i) => ((i > 0) ? ' '.repeat(4+word.length) : ' ') + JSON.stringify(def) + '\n')))
1392
+ }
1393
+ console.log('patterns')
1394
+ for (const pattern of config.config.words.patterns) {
1395
+ console.log(' ' + JSON.stringify(pattern))
1396
+ }
1777
1397
  }
1778
- console.log('patterns')
1779
- for (const pattern of config.config.words.patterns) {
1780
- console.log(' ' + JSON.stringify(pattern))
1398
+ if (args.print.includes('b')) {
1399
+ for (const bridge of config.config.bridges) {
1400
+ console.log(JSON.stringify(bridge))
1401
+ }
1781
1402
  }
1782
- }
1783
- if (args.print.includes('b')) {
1784
- for (const bridge of config.config.bridges) {
1785
- console.log(JSON.stringify(bridge))
1403
+ if (args.print.includes('o')) {
1404
+ for (const operator of config.config.operators) {
1405
+ console.log(JSON.stringify(operator))
1406
+ }
1786
1407
  }
1787
- }
1788
- if (args.print.includes('o')) {
1789
- for (const operator of config.config.operators) {
1790
- console.log(JSON.stringify(operator))
1408
+ if (args.print.includes('j')) {
1409
+ const { data } = setupProcessB({ config })
1410
+ console.log(JSON.stringify(data, null, 2))
1791
1411
  }
1792
- }
1793
- if (args.print.includes('j')) {
1794
- const { data } = setupProcessB({ config })
1795
- console.log(JSON.stringify(data, null, 2))
1796
- }
1797
- if (args.print.includes('a')) {
1798
- console.log('associations ================')
1799
- const properties = ['negative', 'positive']
1800
- for (const property of properties) {
1801
- console.log(` ${property} ===============`)
1802
- for (const association of config.config.associations[property]) {
1803
- console.log(` ${JSON.stringify(association)}`)
1412
+ if (args.print.includes('a')) {
1413
+ console.log('associations ================')
1414
+ const properties = ['negative', 'positive']
1415
+ for (const property of properties) {
1416
+ console.log(` ${property} ===============`)
1417
+ for (const association of config.config.associations[property]) {
1418
+ console.log(` ${JSON.stringify(association)}`)
1419
+ }
1804
1420
  }
1805
1421
  }
1806
- }
1807
- if (args.print.includes('d')) {
1808
- console.log(JSON.stringify(config.config.objects, null, 2))
1809
- }
1810
- if (args.print.includes('p')) {
1811
- for (const priority of config.config.priorities) {
1812
- console.log(JSON.stringify(priority))
1422
+ if (args.print.includes('d')) {
1423
+ console.log(JSON.stringify(config.config.objects, null, 2))
1813
1424
  }
1814
- }
1815
- if (args.print.includes('h')) {
1816
- for (const edge of config.config.hierarchy) {
1817
- console.log(JSON.stringify(edge))
1425
+ if (args.print.includes('p')) {
1426
+ for (const priority of config.config.priorities) {
1427
+ console.log(JSON.stringify(priority))
1428
+ }
1818
1429
  }
1819
- }
1820
- if (args.print.includes('g')) {
1821
- const easyToRead = _.cloneDeep(config.config.generators)
1822
- for (const semantic of easyToRead) {
1823
- semantic.match = semantic.match.toString()
1824
- semantic.apply = semantic.apply.toString()
1825
- if (semantic.applyWrapped) {
1826
- semantic.applyWrapped = semantic.applyWrapped.toString()
1430
+ if (args.print.includes('h')) {
1431
+ for (const edge of config.config.hierarchy) {
1432
+ console.log(JSON.stringify(edge))
1827
1433
  }
1828
1434
  }
1829
- console.dir(easyToRead)
1830
- }
1831
- if (args.print.includes('s')) {
1832
- const easyToRead = _.cloneDeep(config.config.semantics)
1833
- for (const semantic of easyToRead) {
1834
- semantic.match = semantic.match.toString()
1835
- semantic.apply = semantic.apply.toString()
1435
+ if (args.print.includes('g')) {
1436
+ const easyToRead = _.cloneDeep(config.config.generators)
1437
+ for (const semantic of easyToRead) {
1438
+ semantic.match = semantic.match.toString()
1439
+ semantic.apply = semantic.apply.toString()
1440
+ if (semantic.applyWrapped) {
1441
+ semantic.applyWrapped = semantic.applyWrapped.toString()
1442
+ }
1443
+ }
1444
+ console.dir(easyToRead)
1445
+ }
1446
+ if (args.print.includes('s')) {
1447
+ const easyToRead = _.cloneDeep(config.config.semantics)
1448
+ for (const semantic of easyToRead) {
1449
+ semantic.match = semantic.match.toString()
1450
+ semantic.apply = semantic.apply.toString()
1451
+ }
1452
+ console.dir(easyToRead)
1836
1453
  }
1837
- console.dir(easyToRead)
1838
1454
  }
1839
1455
  }
1840
- }
1841
1456
 
1842
- checkTemplate(template)
1457
+ checkTemplate(template)
1843
1458
 
1844
- if (template) {
1845
- let needsRebuild
1846
- if (args.rebuildTemplate && !args.rebuildTemplateFull) {
1847
- // get the startOfChanges for the partial rebuild
1848
- needsRebuild = config.needsRebuild(template.template, template.instance, { ...options, rebuild: false })
1849
- } else {
1850
- // do a check or full rebuild
1851
- needsRebuild = config.needsRebuild(template.template, template.instance, options)
1852
- }
1459
+ if (template) {
1460
+ let needsRebuild
1461
+ if (args.rebuildTemplate && !args.rebuildTemplateFull) {
1462
+ // get the startOfChanges for the partial rebuild
1463
+ needsRebuild = config.needsRebuild(template.template, template.instance, { ...options, rebuild: false })
1464
+ } else {
1465
+ // do a check or full rebuild
1466
+ needsRebuild = config.needsRebuild(template.template, template.instance, options)
1467
+ }
1853
1468
 
1854
- if (needsRebuild.needsRebuild) {
1855
- if (needsRebuild.previousResultss) {
1856
- console.log('Rebuild using the optimization to use previous results until a change is hit. For a full rebuild use -rtf')
1469
+ if (needsRebuild.needsRebuild) {
1470
+ if (needsRebuild.previousResultss) {
1471
+ console.log('Rebuild using the optimization to use previous results until a change is hit. For a full rebuild use -rtf')
1472
+ }
1473
+ console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
1474
+ options.rebuild = true
1475
+ config.config.rebuild = true
1476
+ }
1477
+ try {
1478
+ await config.load(rebuildTemplate, template.template, template.instance, { rebuild: needsRebuild.needsRebuild || options.rebuild, previousResultss: needsRebuild.previousResultss, startOfChanges: needsRebuild.startOfChanges })
1479
+ } catch (e) {
1480
+ console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
1481
+ runtime.process.exit(-1)
1482
+ }
1483
+ if (!args.query) {
1484
+ printConfig()
1485
+ }
1486
+ if (needsRebuild.needsRebuild) {
1487
+ return
1857
1488
  }
1858
- console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
1859
- options.rebuild = true
1860
- config.config.rebuild = true
1861
1489
  }
1862
- try {
1863
- config.load(template.template, template.instance, { rebuild: needsRebuild.needsRebuild || options.rebuild, previousResultss: needsRebuild.previousResultss, startOfChanges: needsRebuild.startOfChanges })
1864
- } catch (e) {
1865
- console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
1866
- runtime.process.exit(-1)
1490
+
1491
+ if (args.retrain) {
1492
+ config.config.retrain = true
1867
1493
  }
1868
- if (!args.query) {
1869
- printConfig()
1494
+
1495
+ if (args.saveDeveloper) {
1496
+ args.save = true
1870
1497
  }
1871
- if (needsRebuild.needsRebuild) {
1872
- return
1498
+ if (args.test || args.testVerbose || args.testAllVerbose || args.save) {
1499
+ global.transitoryMode = true
1873
1500
  }
1874
- }
1875
-
1876
- if (args.retrain) {
1877
- config.config.retrain = true
1878
- }
1879
-
1880
- if (args.test || args.testVerbose || args.testAllVerbose || args.save) {
1881
- global.transitoryMode = true
1882
- }
1883
- if (!args.query && !args.test && !args.info && (args.save || args.saveDeveloper)) {
1884
- global.transitoryMode = true
1885
- saveTests(config, test, testConfig, args.saveDeveloper)
1886
- // } else if (args.build) {
1887
- } else if (args.info) {
1888
- showInfo(description, section, config)
1889
- } else if (args.test || args.testVerbose || args.testAllVerbose) {
1890
- // TODO make test always a string
1891
- if (typeof test === 'string') {
1892
- const l = (n, hasError) => {
1893
- if (n === 0) {
1894
- if (hasError) {
1895
- runtime.process.exit(-1)
1501
+ if (!args.query && !args.test && !args.info && (args.save || args.saveDeveloper)) {
1502
+ global.transitoryMode = true
1503
+ await saveTests(config, test, testConfig, args.saveDeveloper)
1504
+ // } else if (args.build) {
1505
+ } else if (args.info) {
1506
+ showInfo(description, section, config)
1507
+ } else if (args.test || args.testVerbose || args.testAllVerbose) {
1508
+ // TODO make test always a string
1509
+ if (typeof test === 'string') {
1510
+ const l = async (n, hasError) => {
1511
+ if (n === 0) {
1512
+ if (hasError) {
1513
+ runtime.process.exit(-1)
1514
+ }
1515
+ return
1896
1516
  }
1897
- return
1898
- }
1899
- let useTestConfig = testConfig
1900
- if (args.testModuleName) {
1901
- useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
1902
- useTestConfig.testModuleName = args.testModuleName
1903
- test = useTestConfig.name
1904
- }
1905
- runTests(config, test, { args, debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
1906
- let newError = false
1907
- if (results.length > 0) {
1908
- let headerShown = false
1909
-
1910
- let hasError = false
1911
- for (const result of results) {
1912
- if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1913
- result.hasError = true
1914
- }
1915
- if (!args.testNoParenthesized) {
1916
- if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
1517
+ let useTestConfig = testConfig
1518
+ if (args.testModuleName) {
1519
+ useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
1520
+ useTestConfig.testModuleName = args.testModuleName
1521
+ test = useTestConfig.name
1522
+ }
1523
+ await runTests(config, test, { args, debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
1524
+ let newError = false
1525
+ if (results.length > 0) {
1526
+ let headerShown = false
1527
+
1528
+ let hasError = false
1529
+ for (const result of results) {
1530
+ if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1917
1531
  result.hasError = true
1918
1532
  }
1919
- if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
1533
+ if (!args.testNoParenthesized) {
1534
+ if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
1535
+ result.hasError = true
1536
+ }
1537
+ if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
1538
+ result.hasError = true
1539
+ }
1540
+ }
1541
+ if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
1920
1542
  result.hasError = true
1921
1543
  }
1544
+ if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
1545
+ result.hasError = true
1546
+ }
1547
+ if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
1548
+ result.hasError = true
1549
+ }
1550
+ if (result.hasError) {
1551
+ hasError = true
1552
+ }
1922
1553
  }
1923
- if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
1924
- result.hasError = true
1925
- }
1926
- if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
1927
- result.hasError = true
1928
- }
1929
- if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
1930
- result.hasError = true
1931
- }
1932
- if (result.hasError) {
1933
- hasError = true
1934
- }
1935
- }
1936
1554
 
1937
- if (hasError) {
1938
- console.log('**************************** ERRORS ************************')
1939
- for (const result of results) {
1940
- console.log('Utterance: ', result.utterance)
1941
- const show = (label, expected, actual) => {
1942
- if (JSON.stringify(expected) !== JSON.stringify(actual)) {
1555
+ if (hasError) {
1556
+ console.log('**************************** ERRORS ************************')
1557
+ for (const result of results) {
1558
+ console.log('Utterance: ', result.utterance)
1559
+ const show = (label, expected, actual) => {
1560
+ if (JSON.stringify(expected) !== JSON.stringify(actual)) {
1561
+ if (!headerShown) {
1562
+ console.log(' Failure')
1563
+ }
1564
+ console.log(` expected ${label}`, expected)
1565
+ console.log(` actual ${label} `, actual)
1566
+ newError = true
1567
+ headerShown = true
1568
+ if (args.vimdiff) {
1569
+ vimdiff(actual, expected, `"${result.utterance}" - ${label}`)
1570
+ }
1571
+ result.hasError = true
1572
+ }
1573
+ }
1574
+ show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
1575
+ if (!args.testNoParenthesized) {
1576
+ show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
1577
+ }
1578
+ show('responses', result.expected.responses, result.actual.responses)
1579
+ if (!args.testNoParenthesized) {
1580
+ show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
1581
+ }
1582
+ /*
1583
+ if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1943
1584
  if (!headerShown) {
1944
1585
  console.log(' Failure')
1945
1586
  }
1946
- console.log(` expected ${label}`, expected)
1947
- console.log(` actual ${label} `, actual)
1587
+ console.log(' expected paraphrases', result.expected.paraphrases)
1588
+ console.log(' actual paraphrases ', result.actual.paraphrases)
1948
1589
  newError = true
1949
1590
  headerShown = true
1950
- if (args.vimdiff) {
1951
- vimdiff(actual, expected, `"${result.utterance}" - ${label}`)
1952
- }
1953
- result.hasError = true
1954
- }
1955
- }
1956
- show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
1957
- if (!args.testNoParenthesized) {
1958
- show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
1959
- }
1960
- show('responses', result.expected.responses, result.actual.responses)
1961
- if (!args.testNoParenthesized) {
1962
- show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
1963
- }
1964
- /*
1965
- if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1966
- if (!headerShown) {
1967
- console.log(' Failure')
1968
1591
  }
1969
- console.log(' expected paraphrases', result.expected.paraphrases)
1970
- console.log(' actual paraphrases ', result.actual.paraphrases)
1971
- newError = true
1972
- headerShown = true
1973
- }
1974
- if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
1975
- if (!headerShown) {
1976
- console.log(' Failure')
1592
+ if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
1593
+ if (!headerShown) {
1594
+ console.log(' Failure')
1595
+ }
1596
+ console.log(' expected responses ', result.expected.responses)
1597
+ console.log(' actual responses ', result.actual.responses)
1598
+ newError = true
1599
+ headerShown = true
1977
1600
  }
1978
- console.log(' expected responses ', result.expected.responses)
1979
- console.log(' actual responses ', result.actual.responses)
1980
- newError = true
1981
- headerShown = true
1982
- }
1983
- */
1984
- if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
1985
- if (!headerShown) {
1986
- console.log(' Failure')
1601
+ */
1602
+ if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
1603
+ if (!headerShown) {
1604
+ console.log(' Failure')
1605
+ }
1606
+ const widths = [4, 18, 72]
1607
+ const lines = new Lines(widths)
1608
+ lines.setElement(1, 1, 'expected checked objects')
1609
+ lines.setElement(2, 2, JSON.stringify(result.expected.checked, null, 2))
1610
+ lines.log()
1611
+ lines.setElement(1, 1, 'actual checked objects')
1612
+ lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
1613
+ lines.log()
1614
+ if (args.vimdiff) {
1615
+ show('checked properties for objects', result.expected.checked, result.actual.checked)
1616
+ }
1617
+ newError = true
1618
+ headerShown = true
1987
1619
  }
1988
- const widths = [4, 18, 72]
1989
- const lines = new Lines(widths)
1990
- lines.setElement(1, 1, 'expected checked objects')
1991
- lines.setElement(2, 2, JSON.stringify(result.expected.checked, null, 2))
1992
- lines.log()
1993
- lines.setElement(1, 1, 'actual checked objects')
1994
- lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
1995
- lines.log()
1996
- if (args.vimdiff) {
1997
- vimdiff(result.actual.checked, result.expected.checked)
1620
+ if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
1621
+ if (!headerShown) {
1622
+ console.log(' Failure')
1623
+ }
1624
+ const widths = [4, 18, 72]
1625
+ const lines = new Lines(widths)
1626
+ lines.setElement(1, 1, 'expected checked contexts', true)
1627
+ lines.setElement(2, 2, JSON.stringify(result.expected.checkedContexts, null, 2))
1628
+ lines.log()
1629
+ lines.setElement(1, 1, 'actual checked contexts', true)
1630
+ lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
1631
+ lines.log()
1632
+ if (args.vimdiff) {
1633
+ show('checked properties for context', result.expected.checkedContexts, result.actual.checkedContexts)
1634
+ }
1635
+ newError = true
1636
+ headerShown = true
1998
1637
  }
1999
- newError = true
2000
- headerShown = true
2001
1638
  }
2002
- if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
2003
- if (!headerShown) {
2004
- console.log(' Failure')
1639
+ } else {
1640
+ if (results.length > 0 && args.vimdiff) {
1641
+ for (const result of results) {
1642
+ vimdiff(result.actual, result.expected)
2005
1643
  }
2006
- const widths = [4, 18, 72]
2007
- const lines = new Lines(widths)
2008
- lines.setElement(1, 1, 'expected checked contexts', true)
2009
- lines.setElement(2, 2, JSON.stringify(result.expected.checkedContexts, null, 2))
2010
- lines.log()
2011
- lines.setElement(1, 1, 'actual checked contexts', true)
2012
- lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
2013
- lines.log()
2014
- if (args.vimdiff) {
2015
- vimdiff(result.actual.checkedContexts, result.expected.checkedContexts)
2016
- }
2017
- newError = true
2018
- headerShown = true
2019
1644
  }
2020
1645
  }
2021
- } else {
2022
- if (results.length > 0 && args.vimdiff) {
2023
- for (const result of results) {
2024
- vimdiff(result.actual, result.expected)
1646
+ if (hasError) {
1647
+ if (!headerShown) {
1648
+ if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
1649
+ console.log('There are failures due to things other than paraphrases, responses and checked properties being different. They are not shown because you ran -tv or -tva which only shows difference in paraphrase and results. Usually what I do is -s and do a diff to make sure there are no other problems. If the paraphrases or results were different they would have shown here.')
1650
+ }
2025
1651
  }
2026
- }
2027
- }
2028
- if (hasError) {
2029
- if (!headerShown) {
2030
1652
  if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
2031
- console.log('There are failures due to things other than paraphrases, responses and checked properties being different. They are not shown because you ran -tv or -tva which only shows difference in paraphrase and results. Usually what I do is -s and do a diff to make sure there are no other problems. If the paraphrases or results were different they would have shown here.')
2032
- }
2033
- }
2034
- if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
2035
- console.log('use -v arg to write files expected.json and actual.json in the current directory for detailed comparison. Or do -s and then git diff the changes.')
2036
- // console.log(JSON.stringify(contexts))
2037
- let errorCount = 0
2038
- for (const result of results) {
2039
- if (result.hasError) {
2040
- errorCount += 1
1653
+ console.log('use -v arg to write files expected.json and actual.json in the current directory for detailed comparison. Or do -s and then git diff the changes.')
1654
+ // console.log(JSON.stringify(contexts))
1655
+ let errorCount = 0
1656
+ for (const result of results) {
1657
+ if (result.hasError) {
1658
+ console.log(`FAILED ${result.utterance}`)
1659
+ errorCount += 1
1660
+ }
2041
1661
  }
1662
+ console.log(`**************************** THERE WERE ${errorCount} TEST FAILURES ************************`)
2042
1663
  }
2043
- console.log(`**************************** THERE WERE ${errorCount} TEST FAILURES ************************`)
2044
1664
  }
2045
1665
  }
2046
- }
2047
- // const contexts = { failures: results }
2048
- l(n - 1, hasError || newError)
2049
- }).catch((error) => {
2050
- console.error(error)
2051
- runtime.process.exit(-1)
2052
- errorHandler(error)
1666
+ // const contexts = { failures: results }
1667
+ l(n - 1, hasError || newError)
1668
+ }).catch((error) => {
1669
+ console.error(error)
1670
+ runtime.process.exit(-1)
1671
+ errorHandler(error)
1672
+ })
1673
+ }
1674
+ await l(args.count, false)
1675
+ } else {
1676
+ test()
1677
+ }
1678
+ } else if (args.loop) {
1679
+ const readline = runtime.readline.createInterface({ input: runtime.process.stdin, output: runtime.process.stdout })
1680
+ const f = () => readline.question('Enter query? (newline to quit) ', query => {
1681
+ query = query.trim()
1682
+ if (query.length === 0) {
1683
+ return readline.close()
1684
+ }
1685
+ const promise = _process(config, query, { testsFN: test }).then((results) => {
1686
+ console.log(results.responses.join(' '))
2053
1687
  })
1688
+ if (!('then' in promise)) {
1689
+ throw new Error('Return a promise from process in the definition of knowledgeModule')
1690
+ }
1691
+ promise
1692
+ .then(() => {
1693
+ f()
1694
+ })
1695
+ .catch((e) => {
1696
+ if (e.errno == 'ECONNREFUSED') {
1697
+ console.log(e)
1698
+ readline.close()
1699
+ } else {
1700
+ console.log(e)
1701
+ f()
1702
+ }
1703
+ })
1704
+ })
1705
+ f()
1706
+ } else if (args.query) {
1707
+ let useTestConfig = testConfig
1708
+ if (args.testModuleName) {
1709
+ config.testConfig.testModuleName = args.testModuleName
1710
+ config.testConfig.checks = config.getConfigs()[args.testModuleName].getTestConfig().checks
1711
+ // useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
1712
+ // useTestConfig.testModuleName = args.testModuleName
2054
1713
  }
2055
- l(args.count, false)
2056
- } else {
2057
- test()
2058
- }
2059
- } else if (args.loop) {
2060
- const readline = runtime.readline.createInterface({ input: runtime.process.stdin, output: runtime.process.stdout })
2061
- const f = () => readline.question('Enter query? (newline to quit) ', query => {
2062
- query = query.trim()
2063
- if (query.length === 0) {
2064
- return readline.close()
1714
+ const objects = getObjects(config.config.objects)(config.uuid)
1715
+ // for the compare
1716
+ if (args.objectDiff) {
1717
+ global.beforeObjects = _.cloneDeep(objects)
2065
1718
  }
2066
- const promise = _process(config, query, { testsFN: test }).then((results) => {
2067
- console.log(results.responses.join(' '))
2068
- })
2069
- if (!('then' in promise)) {
2070
- throw new Error('Return a promise from process in the definition of knowledgeModule')
1719
+ try {
1720
+ await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
1721
+ } catch (error) {
1722
+ console.log('Error', error)
2071
1723
  }
2072
- promise
2073
- .then(() => {
2074
- f()
2075
- })
2076
- .catch((e) => {
2077
- if (e.errno == 'ECONNREFUSED') {
2078
- console.log(e)
2079
- readline.close()
2080
- } else {
2081
- console.log(e)
2082
- f()
2083
- }
2084
- })
2085
- })
2086
- f()
2087
- } else if (args.query) {
2088
- let useTestConfig = testConfig
2089
- if (args.testModuleName) {
2090
- config.testConfig.testModuleName = args.testModuleName
2091
- config.testConfig.checks = config.getConfigs()[args.testModuleName].getTestConfig().checks
2092
- // useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
2093
- // useTestConfig.testModuleName = args.testModuleName
2094
1724
  }
2095
- const objects = getObjects(config.config.objects)(config.uuid)
2096
- // for the compare
2097
- if (args.objectDiff) {
2098
- global.beforeObjects = _.cloneDeep(objects)
2099
- }
2100
- try {
2101
- await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
2102
- } catch (error) {
2103
- console.log('Error', error)
1725
+ printConfig()
1726
+ } finally {
1727
+ if (config) {
1728
+ config.terminate()
2104
1729
  }
2105
1730
  }
2106
- printConfig()
2107
1731
  } else {
2108
- const initConfig = (config) => {
1732
+ const initConfig = async (config) => {
2109
1733
  if (template) {
2110
1734
  if (config.needsRebuild(template.template, template.instance, { isModule: !isProcess }).needsRebuild) {
1735
+ debugger
1736
+ config.needsRebuild(template.template, template.instance, { isModule: !isProcess })
2111
1737
  const error = `This module "${config.name}" cannot be used because the instance file needs rebuilding. Run on the command line with no arguments or the -rt argument to rebuild.`
2112
1738
  throw new Error(error)
2113
1739
  }
@@ -2140,24 +1766,21 @@ const knowledgeModuleImpl = async ({
2140
1766
 
2141
1767
  if (template) {
2142
1768
  try {
2143
- config.load(template.template, template.instance)
1769
+ await config.load(rebuildTemplate, template.template, template.instance)
2144
1770
  } catch (e) {
2145
1771
  errorHandler(e)
2146
1772
  }
2147
1773
  }
2148
1774
  }
2149
1775
 
2150
- createConfigExport = (additionalConfig) => {
2151
- if (createConfig.cached) {
1776
+ // no cache 21 minutes + rebuild fails "node tester_rebuild -m colors"
1777
+ // cache okay
1778
+ createConfigExport = async () => {
1779
+ if (false && createConfig.cached) {
2152
1780
  return createConfig.cached
2153
1781
  }
2154
- const config = createConfig(acceptsAdditionalConfig ? additionalConfig : null)
2155
- if (!acceptsAdditionalConfig && additionalConfig) {
2156
- config.stop_auto_rebuild()
2157
- additionalConfig(config)
2158
- config.restart_auto_rebuild()
2159
- }
2160
- initConfig(config)
1782
+ const config = await createConfig()
1783
+ await initConfig(config)
2161
1784
  // config.rebuild({ isModule: true })
2162
1785
  createConfig.cached = config
2163
1786
  return createConfig.cached
@@ -2186,11 +1809,6 @@ const ensureTestFile = (module, name, type) => {
2186
1809
  }
2187
1810
  }
2188
1811
 
2189
- function w (func) {
2190
- func.where = where(3)
2191
- return func
2192
- }
2193
-
2194
1812
  const knowledgeModule = async (...args) => {
2195
1813
  await knowledgeModuleImpl(...args).catch((e) => {
2196
1814
  console.error(e)
@@ -2201,9 +1819,6 @@ const knowledgeModule = async (...args) => {
2201
1819
  module.exports = {
2202
1820
  process: _process,
2203
1821
  stableId,
2204
- where,
2205
- w,
2206
- // submitBug,
2207
1822
  ensureTestFile,
2208
1823
  rebuildTemplate,
2209
1824
  processContext,
@@ -2220,5 +1835,6 @@ module.exports = {
2220
1835
  loadInstance,
2221
1836
  gs,
2222
1837
  flattens,
2223
- writeTest
1838
+ writeTest,
1839
+ getConfigForTest,
2224
1840
  }