theprogrammablemind_4wp 7.10.0 → 7.10.1

Sign up to get free protection for your applications and to get access to all the features.
package/client.js CHANGED
@@ -32,7 +32,7 @@ const pickObjects = (testConfig, objects) => {
32
32
 
33
33
  // move ask to the KM's since verbatim is called
34
34
  const getAsk = (config) => (uuid) => (asks) => {
35
- for (let ask of asks) {
35
+ for (const ask of asks) {
36
36
  let oneShot = true // default
37
37
  if (ask.oneShot === false) {
38
38
  oneShot = false
@@ -45,41 +45,41 @@ const getAsk = (config) => (uuid) => (asks) => {
45
45
  })
46
46
  }
47
47
  let oneShot = true
48
- for (let ask of asks) {
48
+ for (const ask of asks) {
49
49
  if (ask.oneShot === false) {
50
50
  oneShot = false
51
51
  }
52
52
  }
53
53
  config.addSemantic({
54
- uuid,
55
- oneShot,
56
- match: ({context}) => context.marker == 'controlEnd' || context.marker == 'controlBetween',
57
- apply: (args) => {
58
- for (let ask of asks) {
59
- let matchq = ask.matchq
60
- let applyq = ask.applyq
61
- if (!matchq) {
62
- let wasAsked = false
63
- matchq = () => !wasAsked,
64
- applyq = (args) => {
65
- wasAsked = true
66
- applyq(args)
67
- }
54
+ uuid,
55
+ oneShot,
56
+ match: ({ context }) => context.marker == 'controlEnd' || context.marker == 'controlBetween',
57
+ apply: (args) => {
58
+ for (const ask of asks) {
59
+ let matchq = ask.matchq
60
+ let applyq = ask.applyq
61
+ if (!matchq) {
62
+ let wasAsked = false
63
+ matchq = () => !wasAsked,
64
+ applyq = (args) => {
65
+ wasAsked = true
66
+ applyq(args)
68
67
  }
69
- if (matchq(args)) {
70
- // args.context.motivationKeep = true
71
- args.verbatim(applyq(args))
72
- /*
68
+ }
69
+ if (matchq(args)) {
70
+ // args.context.motivationKeep = true
71
+ args.verbatim(applyq(args))
72
+ /*
73
73
  args.context.verbatim = applyq(args)
74
74
  args.context.isResponse = true;
75
75
  delete args.context.controlRemove;
76
76
  */
77
- args.context.controlKeepMotivation = true;
78
- break
79
- }
77
+ args.context.controlKeepMotivation = true
78
+ break
80
79
  }
81
- args.context.cascade = true
82
80
  }
81
+ args.context.cascade = true
82
+ }
83
83
  })
84
84
  }
85
85
 
@@ -100,7 +100,7 @@ const vimdiff = (actualJSON, expectedJSON) => {
100
100
  const editor = runtime.process.env.EDITOR || 'vimdiff'
101
101
  // const child = runtime.child_process.spawn(editor, [`${path}/expected.json`, `${path}/actual.json`], { stdio: 'inherit' })
102
102
  console.log(`${editor} ${path}/expected.json ${path}/actual.json`)
103
- runtime.child_process.execSync(`${editor} ${path}/expected.json ${path}/actual.json`, {stdio: 'inherit'})
103
+ runtime.child_process.execSync(`${editor} ${path}/expected.json ${path}/actual.json`, { stdio: 'inherit' })
104
104
  }
105
105
  }
106
106
 
@@ -140,10 +140,10 @@ const asList = (context) => {
140
140
  }
141
141
 
142
142
  class ErrorReason extends Error {
143
- constructor(context) {
144
- super(JSON.stringify(context))
145
- this.reason = context
146
- }
143
+ constructor (context) {
144
+ super(JSON.stringify(context))
145
+ this.reason = context
146
+ }
147
147
  }
148
148
 
149
149
  const setupArgs = (args, config, logs, hierarchy, uuidForScoping) => {
@@ -178,7 +178,7 @@ const setupArgs = (args, config, logs, hierarchy, uuidForScoping) => {
178
178
  }
179
179
  }
180
180
  args.getUUIDScoped = (uuid) => {
181
- return {
181
+ return {
182
182
  ask: scopedAsk(uuid),
183
183
  api: getAPI(uuid),
184
184
  apis: getAPIs(uuid)
@@ -204,10 +204,10 @@ const setupArgs = (args, config, logs, hierarchy, uuidForScoping) => {
204
204
  return config.getGenerators(logs).apply(addAssumed(args, a), c, a)
205
205
  }
206
206
  args.gp = (c, a = {}) => {
207
- return config.getGenerators(logs).apply(addAssumed(args, a, {paraphrase: true, isResponse: false, response: false}), c, {paraphrase: true, isResponse: false, response: false})
207
+ return config.getGenerators(logs).apply(addAssumed(args, a, { paraphrase: true, isResponse: false, response: false }), c, { paraphrase: true, isResponse: false, response: false })
208
208
  }
209
209
  args.gr = (c, a = {}) => {
210
- return config.getGenerators(logs).apply(addAssumed(args, a, {paraphrase: false, isResponse: true}), { ...c, paraphrase: false, isResponse: true })
210
+ return config.getGenerators(logs).apply(addAssumed(args, a, { paraphrase: false, isResponse: true }), { ...c, paraphrase: false, isResponse: true })
211
211
  }
212
212
  args.e = (c) => {
213
213
  return config.getEvaluator(args.s, args.calls, logs, c)
@@ -224,7 +224,7 @@ const setupArgs = (args, config, logs, hierarchy, uuidForScoping) => {
224
224
  const gs = (g) => (contexts, separator, lastSeparator) => {
225
225
  if (!Array.isArray(contexts)) {
226
226
  debugger
227
- throw new Error("Expected a list")
227
+ throw new Error('Expected a list')
228
228
  }
229
229
 
230
230
  let s = ''
@@ -288,10 +288,10 @@ const processContexts = (contexts, params) => {
288
288
 
289
289
  const getObjects = (objects) => {
290
290
  return (uuid) => {
291
- if (objects && objects.namespaced) {
292
- return objects.namespaced[uuid]
293
- }
294
- return objects
291
+ if (objects && objects.namespaced) {
292
+ return objects.namespaced[uuid]
293
+ }
294
+ return objects
295
295
  }
296
296
  }
297
297
 
@@ -316,7 +316,7 @@ const processContext = (context, { objects = {}, config, logs = [] }) => {
316
316
  context = semantics.apply(args, context)
317
317
  const generated = generators.apply(args, context)
318
318
  const assumed = { paraphrase: true, response: false, isResponse: false }
319
- const paraphrases = generators.apply({...args, assumed}, context, { paraphrase: true, response: false, isResponse: false })
319
+ const paraphrases = generators.apply({ ...args, assumed }, context, { paraphrase: true, response: false, isResponse: false })
320
320
  let responses = []
321
321
  if (context.isResponse) {
322
322
  responses = generated
@@ -341,7 +341,7 @@ const convertToStable = (objects) => {
341
341
 
342
342
  const writeTestFile = (fn, tests) => {
343
343
  const stabilize = (tests) => {
344
- for (let test of tests) {
344
+ for (const test of tests) {
345
345
  for (opChoice of test.metadata.opChoices) {
346
346
  opChoice.ops.sort()
347
347
  }
@@ -357,30 +357,31 @@ const writeTest = (fn, query, objects, generated, paraphrases, responses, contex
357
357
  if (runtime.fs.existsSync(fn)) {
358
358
  tests = JSON.parse(runtime.fs.readFileSync(fn))
359
359
  }
360
- for (let association of associations) {
360
+ for (const association of associations) {
361
361
  association.sort()
362
362
  }
363
363
  associations.sort()
364
364
  // tests[query] = sortJson({ paraphrases, responses, contexts, objects: convertToStable(objects), associations, metadata, config, developerTest: saveDeveloper }, { depth: 25 })
365
- results = sortJson({
366
- query,
367
- paraphrases,
368
- responses,
369
- contexts,
370
- objects: convertToStable(objects),
371
- associations,
372
- metadata,
373
- config,
374
- developerTest: saveDeveloper,
375
- paraphrasesParenthesized,
376
- generatedParenthesized }, { depth: 25 })
377
- let wasSet = false;
378
- tests.forEach( (test, index) => {
365
+ const results = sortJson({
366
+ query,
367
+ paraphrases,
368
+ responses,
369
+ contexts,
370
+ objects: convertToStable(objects),
371
+ associations,
372
+ metadata,
373
+ config,
374
+ developerTest: saveDeveloper,
375
+ paraphrasesParenthesized,
376
+ generatedParenthesized
377
+ }, { depth: 25 })
378
+ let wasSet = false
379
+ tests.forEach((test, index) => {
379
380
  if (test.query == query) {
380
381
  tests[index] = results
381
382
  wasSet = true
382
383
  }
383
- });
384
+ })
384
385
  if (!wasSet) {
385
386
  tests.push(results)
386
387
  }
@@ -389,7 +390,7 @@ const writeTest = (fn, query, objects, generated, paraphrases, responses, contex
389
390
  }
390
391
 
391
392
  const combineRange = (r1, r2) => {
392
- let start = r2.start;
393
+ let start = r2.start
393
394
  if (r1.start < r2.start) {
394
395
  start = r1.start
395
396
  }
@@ -402,14 +403,14 @@ const combineRange = (r1, r2) => {
402
403
 
403
404
  const overlaps = (r1, context) => {
404
405
  if (!context.range) {
405
- return true;
406
+ return true
406
407
  }
407
408
  const r2 = context.range
408
409
  if (r1.start <= r2.end && r1.start >= r2.start) {
409
- return true;
410
+ return true
410
411
  }
411
412
  if (r1.end <= r2.end && r1.end >= r2.start) {
412
- return true;
413
+ return true
413
414
  }
414
415
  return false
415
416
  }
@@ -448,7 +449,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
448
449
  setupArgs(args, config, json.logs, hierarchy)
449
450
  const toDo = [...contexts]
450
451
  args.insert = (context) => toDo.unshift(context)
451
- let overlap, lastRange;
452
+ let overlap, lastRange
452
453
  config.debugLoops = commandLineArgs && commandLineArgs.debugLoops
453
454
  while (toDo.length > 0) {
454
455
  const context = toDo.shift()
@@ -464,7 +465,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
464
465
  const semantics = config.getSemantics(json.logs)
465
466
  try {
466
467
  contextPrime = semantics.apply(args, context)
467
- } catch( e ) {
468
+ } catch (e) {
468
469
  if (e.message == 'Maximum call stack size exceeded') {
469
470
  const mostCalled = semantics.getMostCalled()
470
471
  e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
@@ -473,36 +474,36 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
473
474
  if (isInstance) {
474
475
  console.log('error', e.error)
475
476
  }
476
- contextPrime = semantics.apply(args, {
477
- marker: 'error',
478
- context,
479
- text: e ? e.toString() : 'not available',
480
- reason: e.reason,
481
- error: e.stack || e.error
482
- })
477
+ contextPrime = semantics.apply(args, {
478
+ marker: 'error',
479
+ context,
480
+ text: e ? e.toString() : 'not available',
481
+ reason: e.reason,
482
+ error: e.stack || e.error
483
+ })
483
484
  }
484
485
  }
485
486
  if (contextPrime.controlRemove) {
486
487
  continue
487
488
  }
488
- let assumed = { isResponse: true };
489
- const generated = contextPrime.isResponse ? config.getGenerators(json.logs).apply({...args, assumed}, contextPrime, assumed) : ''
489
+ let assumed = { isResponse: true }
490
+ const generated = contextPrime.isResponse ? config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
490
491
  let generatedParenthesized = []
491
492
  if (generateParenthesized) {
492
493
  config.parenthesized = true
493
- generatedParenthesized = contextPrime.isResponse ? config.getGenerators(json.logs).apply({...args, assumed}, contextPrime, assumed) : ''
494
+ generatedParenthesized = contextPrime.isResponse ? config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
494
495
  config.parenthesized = false
495
496
  }
496
497
  // assumed = { paraphrase: true, response: false };
497
- assumed = { paraphrase: true, isResponse: false, response: false };
498
+ assumed = { paraphrase: true, isResponse: false, response: false }
498
499
  if (generateParenthesized) {
499
500
  config.parenthesized = false
500
501
  }
501
- const paraphrases = config.getGenerators(json.logs).apply({...args, assumed}, contextPrime, assumed)
502
+ const paraphrases = config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
502
503
  let paraphrasesParenthesized = []
503
504
  if (generateParenthesized) {
504
505
  config.parenthesized = true
505
- paraphrasesParenthesized = config.getGenerators(json.logs).apply({...args, assumed}, contextPrime, assumed)
506
+ paraphrasesParenthesized = config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
506
507
  config.parenthesized = false
507
508
  }
508
509
  contextsPrime.push(contextPrime)
@@ -578,7 +579,7 @@ const doWithRetries = async (n, url, queryParams, data) => {
578
579
  }
579
580
  }
580
581
 
581
- const setupProcessB = ({ config, initializer, allowDelta=false } = {}) => {
582
+ const setupProcessB = ({ config, initializer, allowDelta = false } = {}) => {
582
583
  const key = config._key
583
584
 
584
585
  const data = Object.assign({ key, version: '3' }, { uuid: config._uuid })
@@ -591,8 +592,8 @@ const setupProcessB = ({ config, initializer, allowDelta=false } = {}) => {
591
592
  }
592
593
 
593
594
  // config.toServer(data)
594
-
595
- if (data.namespaces) {
595
+
596
+ if (data.namespaces) {
596
597
  for (const uuid of Object.keys(data.namespaces)) {
597
598
  const km = config.configs.find((km) => km.uuid === uuid)
598
599
  data.namespaces[uuid].name = km.name
@@ -637,7 +638,7 @@ const loadInstance = (config, instance) => {
637
638
  // config.addInternal(results, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false)
638
639
  // config.addInternal(config.template.queries[i], { handleCalculatedProps: true } )
639
640
  const uuid = config.nameToUUID(instance.name)
640
- config.addInternal(instance.template.queries[i], { uuid, addFirst: true, handleCalculatedProps: true } )
641
+ config.addInternal(_.cloneDeep(instance.template.queries[i]), { uuid, addFirst: true, handleCalculatedProps: true })
641
642
  } else if (results.apply) {
642
643
  const objects = config.get('objects')
643
644
  const args = { objects, getObjects: getObjects(objects) }
@@ -667,7 +668,11 @@ const loadInstance = (config, instance) => {
667
668
  global.transitoryMode = transitoryMode
668
669
  }
669
670
 
670
- const _process = async (config, query, { initializer, commandLineArgs, credentials, writeTests, isTest, saveDeveloper, rebuildingTemplate, testConfig, testsFN, errorHandler = defaultErrorHandler } = {}) => {
671
+ const throwErrorHandler = (error) => {
672
+ throw error
673
+ }
674
+
675
+ const _process = async (config, query, { initializer, commandLineArgs, credentials, writeTests, isTest, saveDeveloper, rebuildingTemplate, testConfig, testsFN, errorHandler = throwErrorHandler } = {}) => {
671
676
  if (credentials) {
672
677
  config.server(credentials.server, credentials.key)
673
678
  }
@@ -682,7 +687,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
682
687
  config.rebuild()
683
688
  const objects = getObjects(config.config.objects)(config.uuid)
684
689
  }
685
- } catch(error) {
690
+ } catch (error) {
686
691
  throw error
687
692
  }
688
693
 
@@ -712,12 +717,12 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
712
717
  paraphrasesParenthesized: [],
713
718
  generatedParenthesized: [],
714
719
  responses: [],
715
- associations: [],
720
+ associations: []
716
721
  }
717
722
 
718
723
  while (true) {
719
724
  if (queries.length === 0) {
720
- break;
725
+ break
721
726
  }
722
727
 
723
728
  data.utterance = queries[0]
@@ -783,18 +788,18 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
783
788
 
784
789
  if (writeTests) {
785
790
  const actual_config = getConfigForTest(config, testConfig)
786
- const saveObjects = {...config.config.objects}
791
+ const saveObjects = { ...config.config.objects }
787
792
  saveObjects.nameToUUID = {}
788
- for (let km of config.configs) {
793
+ for (const km of config.configs) {
789
794
  saveObjects.nameToUUID[km.name] = km.uuid
790
795
  }
791
796
  writeTest(testsFN, query, saveObjects, response.generated, response.paraphrases, response.responses, response.contexts, response.associations, response.metadata, actual_config, saveDeveloper, response.paraphrasesParenthesized, response.generatedParenthesized)
792
797
  }
793
798
 
794
799
  return response
795
- } catch(error) {
796
- error.query = query
797
- errorHandler(error)
800
+ } catch (error) {
801
+ error.query = query
802
+ errorHandler(error)
798
803
  }
799
804
  }
800
805
 
@@ -849,110 +854,110 @@ const runTest = async (config, expected, { args, verbose, testConfig, debug }) =
849
854
  objects = getObjects(config.config.objects)(config.getConfigs()[testConfig.testModuleName].uuid)
850
855
  testConfigName = testConfig.testModuleName
851
856
  }
852
- try {
853
- const result = await _process(config, test, { errorHandler, isTest: true })
854
- result.query = test
855
- if (debug) {
856
- defaultInnerProcess(config, errorHandler, result)
857
- }
858
- if (verbose) {
859
- const widths = [100, 60]
860
- const lines = new Lines(widths)
861
- lines.setElement(0, 0, test)
862
- lines.setElement(0, 1, `time on server: ${result.times.toFixed(2)} client: ${(result.clientSideTimes/1000).toFixed(2)}`)
863
- lines.log()
864
- }
865
- const expected_objects = sortJson(convertToStable(expected.objects), { depth: 25 })
866
- delete expected_objects.nameToUUID
867
- const actual_objects = sortJson(convertToStable(config.config.objects), { depth: 25 })
868
- const failed_paraphrases = !matching(result.paraphrases, expected.paraphrases)
869
- let failed_paraphrasesParenthesized = !matching(result.paraphrasesParenthesized, expected.paraphrasesParenthesized)
870
- let failed_generatedParenthesized = !matching(result.generatedParenthesized, expected.generatedParenthesized)
871
- // TODO fix the naming conventions: camelcase + use actual instead of result
872
- const failed_responses = !matching(result.responses, expected.responses)
873
- const failed_contexts = !matching(result.contexts, expected.contexts)
874
- const failed_objects = !matching(actual_objects, expected_objects)
875
-
876
- if (args.testNoParenthesized) {
877
- failed_paraphrasesParenthesized = false
878
- failed_generatedParenthesized = false
879
- }
880
-
881
- const pickedResultContexts = result.contexts.map(pickContext(testConfig))
882
- const pickedExpectedContexts = expected.contexts.map(pickContext(testConfig))
883
- const failedCheckedContexts = !matching(pickedResultContexts, pickedExpectedContexts)
884
-
885
- const expectedGetObjects = (name) => {
886
- if (!name) {
887
- name = config.name
888
- }
889
- return expected.objects.namespaced[expected.objects.nameToUUID[name]] || {}
890
- }
891
- const expected_checked = sortJson(pickObjects(testConfig, expectedGetObjects(testConfigName)), { depth: 25 })
892
- const actualGetObjects = (name) => {
893
- if (!name) {
894
- name = config.name
895
- }
896
- const km = config.configs.find( (km) => km.name == name )
897
- return config.config.objects.namespaced[km.uuid] || {}
898
- }
899
- const actual_checked = sortJson(pickObjects(testConfig, actualGetObjects(testConfigName)), { depth: 25 })
900
- const failed_checked = !matching(actual_objects, expected_objects)
901
-
902
- const failed_checks = !matching(actual_objects, expected_objects)
903
- const failed_checked_objects = !matching(actual_checked, expected_checked)
904
- const actual_config = sortJson(convertToStable(getConfigForTest(config, testConfig)), { depth: 25 })
905
- const expected_config = sortJson(convertToStable(expected.config), { depth: 25 })
906
- const failed_config = !matching(actual_config, expected_config)
907
- let failed = failed_checked_objects || failed_paraphrases || failed_paraphrasesParenthesized || failed_generatedParenthesized || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked || failedCheckedContexts
908
-
909
- if (expected.metadata && result.metadata && failed) {
910
- const priorities = analyzeMetaData(expected.metadata, result.metadata)
911
- if (priorities.length > 0) {
912
- const log = `Hint, if the results are flakey try adding the specified priorities ${JSON.stringify(priorities)}`
913
- result.logs.push(log)
914
- }
915
- }
916
- if (failed) {
917
- return {
918
- utterance: test,
919
- expected: {
920
- responses: expected.responses,
921
- paraphrases: expected.paraphrases,
922
- paraphrasesParenthesized: expected.paraphrasesParenthesized,
923
- generatedParenthesized: expected.generatedParenthesized,
924
- results: expected.contexts,
925
- checked: expected_checked,
926
- checkedContexts: pickedExpectedContexts,
927
- objects: expected_objects,
928
- config: expected.config
929
- },
930
- actual: {
931
- responses: result.responses,
932
- paraphrases: result.paraphrases,
933
- paraphrasesParenthesized: result.paraphrasesParenthesized,
934
- generatedParenthesized: result.generatedParenthesized,
935
- results: result.contexts,
936
- checked: actual_checked,
937
- checkedContexts: pickedResultContexts,
938
- objects: actual_objects,
939
- config: actual_config
940
- }
857
+ try {
858
+ const result = await _process(config, test, { errorHandler, isTest: true })
859
+ result.query = test
860
+ if (debug) {
861
+ defaultInnerProcess(config, errorHandler, result)
862
+ }
863
+ if (verbose) {
864
+ const widths = [100, 60]
865
+ const lines = new Lines(widths)
866
+ lines.setElement(0, 0, test)
867
+ lines.setElement(0, 1, `time on server: ${result.times.toFixed(2)} client: ${(result.clientSideTimes / 1000).toFixed(2)}`)
868
+ lines.log()
869
+ }
870
+ const expected_objects = sortJson(convertToStable(expected.objects), { depth: 25 })
871
+ delete expected_objects.nameToUUID
872
+ const actual_objects = sortJson(convertToStable(config.config.objects), { depth: 25 })
873
+ const failed_paraphrases = !matching(result.paraphrases, expected.paraphrases)
874
+ let failed_paraphrasesParenthesized = !matching(result.paraphrasesParenthesized, expected.paraphrasesParenthesized)
875
+ let failed_generatedParenthesized = !matching(result.generatedParenthesized, expected.generatedParenthesized)
876
+ // TODO fix the naming conventions: camelcase + use actual instead of result
877
+ const failed_responses = !matching(result.responses, expected.responses)
878
+ const failed_contexts = !matching(result.contexts, expected.contexts)
879
+ const failed_objects = !matching(actual_objects, expected_objects)
880
+
881
+ if (args.testNoParenthesized) {
882
+ failed_paraphrasesParenthesized = false
883
+ failed_generatedParenthesized = false
884
+ }
885
+
886
+ const pickedResultContexts = result.contexts.map(pickContext(testConfig))
887
+ const pickedExpectedContexts = expected.contexts.map(pickContext(testConfig))
888
+ const failedCheckedContexts = !matching(pickedResultContexts, pickedExpectedContexts)
889
+
890
+ const expectedGetObjects = (name) => {
891
+ if (!name) {
892
+ name = config.name
893
+ }
894
+ return expected.objects.namespaced[expected.objects.nameToUUID[name]] || {}
895
+ }
896
+ const expected_checked = sortJson(pickObjects(testConfig, expectedGetObjects(testConfigName)), { depth: 25 })
897
+ const actualGetObjects = (name) => {
898
+ if (!name) {
899
+ name = config.name
900
+ }
901
+ const km = config.configs.find((km) => km.name == name)
902
+ return config.config.objects.namespaced[km.uuid] || {}
903
+ }
904
+ const actual_checked = sortJson(pickObjects(testConfig, actualGetObjects(testConfigName)), { depth: 25 })
905
+ const failed_checked = !matching(actual_objects, expected_objects)
906
+
907
+ const failed_checks = !matching(actual_objects, expected_objects)
908
+ const failed_checked_objects = !matching(actual_checked, expected_checked)
909
+ const actual_config = sortJson(convertToStable(getConfigForTest(config, testConfig)), { depth: 25 })
910
+ const expected_config = sortJson(convertToStable(expected.config), { depth: 25 })
911
+ const failed_config = !matching(actual_config, expected_config)
912
+ const failed = failed_checked_objects || failed_paraphrases || failed_paraphrasesParenthesized || failed_generatedParenthesized || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked || failedCheckedContexts
913
+
914
+ if (expected.metadata && result.metadata && failed) {
915
+ const priorities = analyzeMetaData(expected.metadata, result.metadata)
916
+ if (priorities.length > 0) {
917
+ const log = `Hint, if the results are flakey try adding the specified priorities ${JSON.stringify(priorities)}`
918
+ result.logs.push(log)
919
+ }
920
+ }
921
+ if (failed) {
922
+ return {
923
+ utterance: test,
924
+ expected: {
925
+ responses: expected.responses,
926
+ paraphrases: expected.paraphrases,
927
+ paraphrasesParenthesized: expected.paraphrasesParenthesized,
928
+ generatedParenthesized: expected.generatedParenthesized,
929
+ results: expected.contexts,
930
+ checked: expected_checked,
931
+ checkedContexts: pickedExpectedContexts,
932
+ objects: expected_objects,
933
+ config: expected.config
934
+ },
935
+ actual: {
936
+ responses: result.responses,
937
+ paraphrases: result.paraphrases,
938
+ paraphrasesParenthesized: result.paraphrasesParenthesized,
939
+ generatedParenthesized: result.generatedParenthesized,
940
+ results: result.contexts,
941
+ checked: actual_checked,
942
+ checkedContexts: pickedResultContexts,
943
+ objects: actual_objects,
944
+ config: actual_config
941
945
  }
942
946
  }
943
- } catch(error) {
944
- if (verbose) {
945
- console.log(test)
946
- }
947
- if (error.metadata) {
948
- const priorities = analyzeMetaData(expected.metadata, error.metadata)
949
- if (priorities.length > 0) {
950
- const log = `Hint, if the results are flakey try adding the specified priorities ${JSON.stringify(priorities)}`
951
- error.logs.push(log)
952
- }
947
+ }
948
+ } catch (error) {
949
+ if (verbose) {
950
+ console.log(test)
951
+ }
952
+ if (error.metadata) {
953
+ const priorities = analyzeMetaData(expected.metadata, error.metadata)
954
+ if (priorities.length > 0) {
955
+ const log = `Hint, if the results are flakey try adding the specified priorities ${JSON.stringify(priorities)}`
956
+ error.logs.push(log)
953
957
  }
954
- throw error
955
958
  }
959
+ throw error
960
+ }
956
961
  }
957
962
 
958
963
  const runTestsHelper = async (config, tests, failed, juicyBits) => {
@@ -990,9 +995,9 @@ const saveTest = async (testFile, config, test, expected, testConfig, saveDevelo
990
995
  const actualConfig = getConfigForTest(config, testConfig)
991
996
  const args = {
992
997
  }
993
- const saveObjects = {...config.config.objects}
998
+ const saveObjects = { ...config.config.objects }
994
999
  saveObjects.nameToUUID = {}
995
- for (let km of config.configs) {
1000
+ for (const km of config.configs) {
996
1001
  saveObjects.nameToUUID[km.name] = km.uuid
997
1002
  }
998
1003
  writeTest(testFile, test, saveObjects, result.generated, result.paraphrases, result.responses, result.contexts, result.associations, result.metadata, actualConfig, saveDeveloper, result.paraphrasesParenthesized, result.generatedParenthesized)
@@ -1014,7 +1019,7 @@ const saveTestsHelper = async (testFile, config, tests, todo, testConfig, saveDe
1014
1019
  const saveTests = (config, testFile, testConfig) => {
1015
1020
  const tests = JSON.parse(runtime.fs.readFileSync(testFile))
1016
1021
  console.log(testFile)
1017
- return saveTestsHelper(testFile, config, tests, tests.map( (test) => test.query ), testConfig)
1022
+ return saveTestsHelper(testFile, config, tests, tests.map((test) => test.query), testConfig)
1018
1023
  }
1019
1024
 
1020
1025
  /*
@@ -1025,31 +1030,7 @@ const showExamples = (testFile) => {
1025
1030
  */
1026
1031
 
1027
1032
  const showInfo = (description, section, config) => {
1028
- const name = config.name
1029
- const includes = config.configs.slice(1).map((km) => km.config.name)
1030
- const visibleExamples = []
1031
- for (const test of config.tests) {
1032
- if (!test.developerTest) {
1033
- visibleExamples.push(test.query)
1034
- }
1035
- }
1036
- const templateQueries = []
1037
- if (config.instances && config.instances.length > 0) {
1038
- for (let query of config.instances.slice(-1)[0].queries) {
1039
- if (typeof query == 'string') {
1040
- templateQueries.push(query)
1041
- }
1042
- }
1043
- }
1044
- const info = { name, description, examples: visibleExamples, template: templateQueries, section, includes, demo: config.demo }
1045
- /*
1046
- if (config.instances.length > 0) {
1047
- info.template = {
1048
- base: config.instances[0].base
1049
- }
1050
- }
1051
- */
1052
- console.log(JSON.stringify(info, null, 2))
1033
+ console.log(JSON.stringify(config.getInfo(), null, 2))
1053
1034
  }
1054
1035
 
1055
1036
  const submitBugToAPI = async (subscription_id, subscription_password, config) => {
@@ -1165,7 +1146,7 @@ const defaultErrorHandler = async (error) => {
1165
1146
  doErrorExit = true
1166
1147
  }
1167
1148
 
1168
- if (typeof runtime.process.exit == 'function' && doErrorExit) {
1149
+ if (typeof runtime.process.exit === 'function' && doErrorExit) {
1169
1150
  runtime.process.exit(-1)
1170
1151
  }
1171
1152
 
@@ -1184,7 +1165,7 @@ const defaultInnerProcess = (config, errorHandler, responses) => {
1184
1165
  for (const lcp of responses.learned_contextual_priorities) {
1185
1166
  console.log(` ${JSON.stringify(lcp)},\n`)
1186
1167
  }
1187
- console.log("\n")
1168
+ console.log('\n')
1188
1169
  }
1189
1170
  if (responses.logs) {
1190
1171
  console.log('Logs')
@@ -1200,8 +1181,8 @@ const defaultInnerProcess = (config, errorHandler, responses) => {
1200
1181
 
1201
1182
  const pickEm = () => {
1202
1183
  const picked = {}
1203
- const namespaced = config.get('objects')['namespaced']
1204
- for (let prop of getConfig_getObjectCheck(config.testConfig)) {
1184
+ const namespaced = config.get('objects').namespaced
1185
+ for (const prop of getConfig_getObjectCheck(config.testConfig)) {
1205
1186
  if (prop.km) {
1206
1187
  /*
1207
1188
  const objects = namespaced[prop.km]]
@@ -1223,7 +1204,7 @@ const defaultInnerProcess = (config, errorHandler, responses) => {
1223
1204
  }
1224
1205
 
1225
1206
  if (responses.explain_priorities) {
1226
- console.log("Explain Priorities")
1207
+ console.log('Explain Priorities')
1227
1208
  for ([inputs, output, reason] of responses.explain_priorities) {
1228
1209
  console.log(` inputs: ${JSON.stringify(inputs)} output: ${JSON.stringify(output)} reason: ${reason}`)
1229
1210
  }
@@ -1236,7 +1217,7 @@ const defaultInnerProcess = (config, errorHandler, responses) => {
1236
1217
  }
1237
1218
 
1238
1219
  const pickedResultContexts = responses.contexts.map(pickContext(config.testConfig))
1239
- if (pickedResultContexts.some( (context) => Object.keys(context).length > 0 )) {
1220
+ if (pickedResultContexts.some((context) => Object.keys(context).length > 0)) {
1240
1221
  console.log('--- Contexts showing only the checked values ---')
1241
1222
  console.log(JSON.stringify(pickedResultContexts, null, 2))
1242
1223
  }
@@ -1275,7 +1256,7 @@ const defaultProcess = ({ config, errorHandler }) => async (promise) => {
1275
1256
  try {
1276
1257
  const responses = await promise
1277
1258
  defaultInnerProcess(config, errorHandler, responses)
1278
- } catch(error) {
1259
+ } catch (error) {
1279
1260
  error.config = config
1280
1261
  defaultErrorHandler(error)
1281
1262
  }
@@ -1288,7 +1269,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1288
1269
  fragments: [],
1289
1270
  semantics: [],
1290
1271
  associations: [],
1291
- learned_contextual_priorities: [],
1272
+ learned_contextual_priorities: []
1292
1273
  }
1293
1274
  const looper = async (queries) => {
1294
1275
  if (queries.length === 0) {
@@ -1298,7 +1279,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1298
1279
  const { property, hierarchy, query: queryOrExtraConfig, previousResults, initializer, skipSemantics } = queries.shift()
1299
1280
  // queries are strings or { query: "blah", development: true/false }
1300
1281
  if (typeof queryOrExtraConfig === 'string' || queryOrExtraConfig.query) {
1301
- let query = queryOrExtraConfig;
1282
+ let query = queryOrExtraConfig
1302
1283
  if (typeof queryOrExtraConfig === 'string') {
1303
1284
  query = { query }
1304
1285
  }
@@ -1308,7 +1289,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1308
1289
  global.transitoryMode = true
1309
1290
  }
1310
1291
  if (hierarchy) {
1311
- for (let edge of hierarchy) {
1292
+ for (const edge of hierarchy) {
1312
1293
  if (Array.isArray(edge)) {
1313
1294
  config.addHierarchy(edge[0], edge[1])
1314
1295
  } else {
@@ -1324,7 +1305,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1324
1305
  prMessage = ' Using previous results. use -rtf for a hard rebuild of everything on the server side.'
1325
1306
  loadInstance(config, { resultss: [results] })
1326
1307
  } else {
1327
- results = await _process(config, query.query, {initializer, rebuildingTemplate: true})
1308
+ results = await _process(config, query.query, { initializer, rebuildingTemplate: true })
1328
1309
  }
1329
1310
  if (config.config.debug) {
1330
1311
  // TODO pass in the error handler like the other ones
@@ -1348,12 +1329,12 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1348
1329
  accumulators.associations = accumulators.associations.concat(results.associations)
1349
1330
  accumulators.learned_contextual_priorities = accumulators.learned_contextual_priorities.concat(results.learned_contextual_priorities)
1350
1331
  await looper(queries)
1351
- } catch(e) {
1352
- const error = { errors: [e], query: query.query };
1332
+ } catch (e) {
1333
+ const error = { errors: [e], query: query.query }
1353
1334
  config.config.skipSemantics = null
1354
1335
  errorHandler(error)
1355
1336
  }
1356
- } else if (typeof queryOrExtraConfig == 'function') {
1337
+ } else if (typeof queryOrExtraConfig === 'function') {
1357
1338
  console.log('calling initialize function')
1358
1339
  const initFunction = queryOrExtraConfig
1359
1340
  const objects = config.get('objects')
@@ -1371,8 +1352,8 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1371
1352
  await looper([])
1372
1353
  } else {
1373
1354
  try {
1374
- config.addInternal(_.cloneDeep(extraConfig), { handleCalculatedProps: true } )
1375
- } catch ( e ) {
1355
+ config.addInternal(_.cloneDeep(extraConfig), { handleCalculatedProps: true })
1356
+ } catch (e) {
1376
1357
  const where = extraConfig.where ? ` ${extraConfig.where}` : ''
1377
1358
  throw new Error(`Error processing extra config${where}: ${e.stack}}`)
1378
1359
  }
@@ -1386,11 +1367,11 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1386
1367
  const instanceName = `${target}.instance.json`
1387
1368
  console.log(`Writing instance file ${instanceName}`)
1388
1369
  const stabilizeAssociations = (associations) => {
1389
- for (let association of associations) {
1370
+ for (const association of associations) {
1390
1371
  association.sort()
1391
1372
  }
1392
1373
  associations.sort()
1393
- };
1374
+ }
1394
1375
  const stabilizeOutput = (template) => {
1395
1376
  stabilizeAssociations(template.associations)
1396
1377
  const stabilize = (results) => {
@@ -1415,7 +1396,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1415
1396
  stabilize(template.resultss)
1416
1397
  stabilize(template.fragments)
1417
1398
  return template
1418
- };
1399
+ }
1419
1400
  stabilizeOutput(accumulators)
1420
1401
  runtime.fs.writeFileSync(instanceName, JSON.stringify(Object.assign({ queries: template.queries.map(updateQueries) }, accumulators), 0, 2))
1421
1402
 
@@ -1428,7 +1409,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1428
1409
  }
1429
1410
 
1430
1411
  const toProperties = (queryStringOrProperties) => {
1431
- if (typeof queryStringOrProperties == 'string') {
1412
+ if (typeof queryStringOrProperties === 'string') {
1432
1413
  return { query: queryStringOrProperties }
1433
1414
  } else {
1434
1415
  return queryStringOrProperties
@@ -1436,12 +1417,12 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1436
1417
  }
1437
1418
  let todo = []
1438
1419
  todo = todo.concat((template.initializers || []).map((query) => { return { initializer: true, property: 'resultss', query, skipSemantics: false || query.skipSemantics } }))
1439
- todo = todo.concat((template.queries || []).map((query, index) => {
1420
+ todo = todo.concat((template.queries || []).map((query, index) => {
1440
1421
  let pr
1441
1422
  if (index < startOfChanges) {
1442
- pr = previousResultss[index]
1423
+ pr = previousResultss[index]
1443
1424
  }
1444
- return { property: 'resultss', query, previousResults: pr, skipSemantics: false || query.skipSemantics}
1425
+ return { property: 'resultss', query, previousResults: pr, skipSemantics: false || query.skipSemantics }
1445
1426
  }))
1446
1427
  todo = todo.concat((template.fragments || []).map((query) => { return Object.assign({}, toProperties(query), { property: 'fragments', skipSemantics: false }) }))
1447
1428
  todo = todo.concat((template.semantics || []).map((definition) => { return { property: 'semantics', query: `${definition.from}\n${definition.to}`, skipSemantics: true } }))
@@ -1485,6 +1466,18 @@ const knowledgeModuleImpl = async ({
1485
1466
  stopAtFirstFailure = true,
1486
1467
  ...rest
1487
1468
  } = {}) => {
1469
+ /*
1470
+ if (description == 'fastfood related concepts') {
1471
+ debugger
1472
+ global.old = template.template.queries[91].bridges[0]
1473
+ }
1474
+ let old
1475
+ if (template && template.template && template.template.queries) {
1476
+ old = template.template.queries
1477
+ template.template.queries = _.cloneDeep(template.template.queries)
1478
+ template.wasCopied = true
1479
+ }
1480
+ */
1488
1481
 
1489
1482
  const unknownArgs = Object.keys(rest)
1490
1483
  if (unknownArgs.length > 0) {
@@ -1516,10 +1509,10 @@ const knowledgeModuleImpl = async ({
1516
1509
  }
1517
1510
 
1518
1511
  config.description = description
1519
- if (typeof test === 'object') {
1520
- if (test.contents) {
1521
- config.tests = test.contents
1522
- test = test.name
1512
+ if (typeof testConfig === 'object') {
1513
+ if (testConfig.contents) {
1514
+ config.tests = testConfig.contents
1515
+ test = testConfig.name
1523
1516
  }
1524
1517
  } else {
1525
1518
  if (runtime.fs && runtime.fs.existsSync(test)) {
@@ -1531,7 +1524,6 @@ const knowledgeModuleImpl = async ({
1531
1524
  config.setTestConfig(testConfig)
1532
1525
  }
1533
1526
 
1534
-
1535
1527
  if (isProcess) {
1536
1528
  const config = createConfig()
1537
1529
  setupConfig(config)
@@ -1548,7 +1540,6 @@ const knowledgeModuleImpl = async ({
1548
1540
  const helpDebugBridge = 'In order to get a debug break when a specific bridge is created set the DEBUG_BRIDGE environment variable to id/level to break on. For example DEBUG_BRIDGE=\'id#level\''
1549
1541
  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]))\''
1550
1542
 
1551
-
1552
1543
  parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
1553
1544
  parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
1554
1545
  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' })
@@ -1563,7 +1554,7 @@ const knowledgeModuleImpl = async ({
1563
1554
  parser.add_argument('-i', '--info', { action: 'store_true', help: 'Print meta-data for the module' })
1564
1555
  parser.add_argument('-v', '--vimdiff', { action: 'store_true', help: 'For failures run vimdiff' })
1565
1556
  parser.add_argument('-g', '--greg', { action: 'store_true', help: 'Set the server to be localhost so I can debug stuff' })
1566
- 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]]' })
1557
+ 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]]' })
1567
1558
  parser.add_argument('-r', '--reset', { action: 'store_true', help: 'Get the server to bypass the cache and rebuild everything' })
1568
1559
  parser.add_argument('-q', '--query', { help: 'Run the specified query' })
1569
1560
  parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
@@ -1575,7 +1566,7 @@ const knowledgeModuleImpl = async ({
1575
1566
  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' })
1576
1567
  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.' })
1577
1568
  parser.add_argument('-sd', '--saveDeveloper', { action: 'store_true', help: 'Same as -s but the query will not show up in the info command.' })
1578
- 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 '})
1569
+ 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 ' })
1579
1570
  parser.add_argument('-d', '--debug', { action: 'store_true', help: 'When running with the --debug flag this set the debug flag in the config' })
1580
1571
  parser.add_argument('-da', '--debugAssociation', { action: 'store_true', help: helpDebugAssociation })
1581
1572
  parser.add_argument('-dh', '--debugHierarchy', { action: 'store_true', help: helpDebugHierarchy })
@@ -1583,8 +1574,8 @@ const knowledgeModuleImpl = async ({
1583
1574
  parser.add_argument('-dcp', '--debugContextualPriority', { action: 'store_true', help: helpDebugContextualPriority })
1584
1575
  parser.add_argument('-db', '--debugBridge', { action: 'store_true', help: helpDebugBridge })
1585
1576
  parser.add_argument('-do', '--debugOperator', { action: 'store_true', help: helpDebugOperator })
1586
- 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"})
1587
- 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' })
1577
+ 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' })
1578
+ 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' })
1588
1579
 
1589
1580
  const args = parser.parse_args()
1590
1581
  args.count = args.count || 1
@@ -1615,9 +1606,9 @@ const knowledgeModuleImpl = async ({
1615
1606
  return true
1616
1607
  }
1617
1608
  if (!Array.isArray(args.checkForLoop) || args.checkForLoop.some((value) => !isKey(value))) {
1618
- throw new Error(`Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"`)
1609
+ throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
1619
1610
  }
1620
- } catch( e ) {
1611
+ } catch (e) {
1621
1612
  throw new Error(`Error parsing JSON of the checkForLoop argument. ${e}`)
1622
1613
  }
1623
1614
  } else {
@@ -1648,7 +1639,7 @@ const knowledgeModuleImpl = async ({
1648
1639
 
1649
1640
  if (args.clean) {
1650
1641
  const tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
1651
- for (let test of tests) {
1642
+ for (const test of tests) {
1652
1643
  delete test.associations
1653
1644
  }
1654
1645
  writeTestFile(testConfig.name, tests)
@@ -1658,7 +1649,7 @@ const knowledgeModuleImpl = async ({
1658
1649
 
1659
1650
  if (args.deleteTest) {
1660
1651
  let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
1661
- tests = tests.filter( (test) => test.query !== args.deleteTest );
1652
+ tests = tests.filter((test) => test.query !== args.deleteTest)
1662
1653
  writeTestFile(testConfig.name, tests)
1663
1654
  console.log(`Remove the test for "${args.deleteTest}"`)
1664
1655
  return
@@ -1691,7 +1682,7 @@ const knowledgeModuleImpl = async ({
1691
1682
  config.config.explain_priorities = true
1692
1683
  }
1693
1684
 
1694
- config.config.debugIncludeConvolutions = args.debugIncludeConvolutions || process.argv.includes('--debugIncludeConvolutions') || process.argv.includes('-dic')
1685
+ config.config.debugIncludeConvolutions = args.debugIncludeConvolutions || process.argv.includes('--debugIncludeConvolutions') || process.argv.includes('-dic')
1695
1686
 
1696
1687
  let configPrinted = false
1697
1688
  const printConfig = () => {
@@ -1701,7 +1692,7 @@ const knowledgeModuleImpl = async ({
1701
1692
  configPrinted = true
1702
1693
  if (args.print) {
1703
1694
  if (args.print.includes('t')) {
1704
- console.log("Test queries")
1695
+ console.log('Test queries')
1705
1696
  let counter = 0
1706
1697
  for (const test of config.tests) {
1707
1698
  console.log(`${counter} - ${test.query}`)
@@ -1710,8 +1701,8 @@ const knowledgeModuleImpl = async ({
1710
1701
  }
1711
1702
  if (args.print.includes('c')) {
1712
1703
  const { data } = setupProcessB({ config })
1713
- console.log("Config as sent to server")
1714
- console.log(JSON.stringify(data, null, 2));
1704
+ console.log('Config as sent to server')
1705
+ console.log(JSON.stringify(data, null, 2))
1715
1706
  }
1716
1707
 
1717
1708
  if (args.print.includes('l')) {
@@ -1736,15 +1727,15 @@ const knowledgeModuleImpl = async ({
1736
1727
  }
1737
1728
  }
1738
1729
  if (args.print.includes('j')) {
1739
- const { data } = setupProcessB( { config } )
1730
+ const { data } = setupProcessB({ config })
1740
1731
  console.log(JSON.stringify(data, null, 2))
1741
1732
  }
1742
1733
  if (args.print.includes('a')) {
1743
1734
  console.log('associations ================')
1744
1735
  const properties = ['negative', 'positive']
1745
- for (let property of properties) {
1736
+ for (const property of properties) {
1746
1737
  console.log(` ${property} ===============`)
1747
- for (let association of config.config.associations[property]) {
1738
+ for (const association of config.config.associations[property]) {
1748
1739
  console.log(` ${JSON.stringify(association)}`)
1749
1740
  }
1750
1741
  }
@@ -1753,12 +1744,12 @@ const knowledgeModuleImpl = async ({
1753
1744
  console.log(JSON.stringify(config.config.objects, null, 2))
1754
1745
  }
1755
1746
  if (args.print.includes('p')) {
1756
- for (let priority of config.config.priorities) {
1747
+ for (const priority of config.config.priorities) {
1757
1748
  console.log(JSON.stringify(priority))
1758
1749
  }
1759
1750
  }
1760
1751
  if (args.print.includes('h')) {
1761
- for (let edge of config.config.hierarchy) {
1752
+ for (const edge of config.config.hierarchy) {
1762
1753
  console.log(JSON.stringify(edge))
1763
1754
  }
1764
1755
  }
@@ -1798,7 +1789,7 @@ const knowledgeModuleImpl = async ({
1798
1789
 
1799
1790
  if (needsRebuild.needsRebuild) {
1800
1791
  if (needsRebuild.previousResultss) {
1801
- console.log("Rebuild using the optimization to use previous results until a change is hit. For a full rebuild use -rtf")
1792
+ console.log('Rebuild using the optimization to use previous results until a change is hit. For a full rebuild use -rtf')
1802
1793
  }
1803
1794
  console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
1804
1795
  options.rebuild = true
@@ -1806,7 +1797,7 @@ const knowledgeModuleImpl = async ({
1806
1797
  }
1807
1798
  try {
1808
1799
  config.load(template.template, template.instance, { rebuild: needsRebuild.needsRebuild || options.rebuild, previousResultss: needsRebuild.previousResultss, startOfChanges: needsRebuild.startOfChanges })
1809
- } catch( e ) {
1800
+ } catch (e) {
1810
1801
  console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
1811
1802
  runtime.process.exit(-1)
1812
1803
  }
@@ -1858,12 +1849,12 @@ const knowledgeModuleImpl = async ({
1858
1849
  hasError = true
1859
1850
  }
1860
1851
  if (!args.testNoParenthesized) {
1861
- if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
1862
- hasError = true
1863
- }
1864
- if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
1865
- hasError = true
1866
- }
1852
+ if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
1853
+ hasError = true
1854
+ }
1855
+ if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
1856
+ hasError = true
1857
+ }
1867
1858
  }
1868
1859
  if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
1869
1860
  hasError = true
@@ -2009,13 +2000,13 @@ const knowledgeModuleImpl = async ({
2009
2000
  .then(() => {
2010
2001
  f()
2011
2002
  })
2012
- .catch( (e) => {
2003
+ .catch((e) => {
2013
2004
  if (e.errno == 'ECONNREFUSED') {
2014
2005
  console.log(e)
2015
2006
  readline.close()
2016
2007
  } else {
2017
2008
  console.log(e)
2018
- f()
2009
+ f()
2019
2010
  }
2020
2011
  })
2021
2012
  })
@@ -2028,13 +2019,19 @@ const knowledgeModuleImpl = async ({
2028
2019
  }
2029
2020
  try {
2030
2021
  await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
2031
- } catch( error ) {
2032
- console.log('Error', error);
2022
+ } catch (error) {
2023
+ console.log('Error', error)
2033
2024
  }
2034
2025
  }
2035
2026
  printConfig()
2036
2027
  } else {
2037
2028
  const initConfig = (config) => {
2029
+ if (template) {
2030
+ if (config.needsRebuild(template.template, template.instance, { isModule: !isProcess }).needsRebuild) {
2031
+ 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.`
2032
+ throw new Error(error)
2033
+ }
2034
+ }
2038
2035
  setupConfig(config)
2039
2036
 
2040
2037
  let loadForTesting = false
@@ -2045,14 +2042,14 @@ const knowledgeModuleImpl = async ({
2045
2042
  }
2046
2043
  // remove test only stuff
2047
2044
  if (!isProcess && !loadForTesting) {
2048
- config.config.operators = config.config.operators.filter( (operator) => {
2045
+ config.config.operators = config.config.operators.filter((operator) => {
2049
2046
  if (operator.development) {
2050
2047
  return false
2051
2048
  } else {
2052
2049
  return true
2053
2050
  }
2054
2051
  })
2055
- config.config.bridges = config.config.bridges.filter( (bridge) => {
2052
+ config.config.bridges = config.config.bridges.filter((bridge) => {
2056
2053
  if (bridge.development) {
2057
2054
  return false
2058
2055
  } else {
@@ -2062,13 +2059,9 @@ const knowledgeModuleImpl = async ({
2062
2059
  }
2063
2060
 
2064
2061
  if (template) {
2065
- if (config.needsRebuild(template.template, template.instance, { isModule: !isProcess }).needsRebuild) {
2066
- 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.`
2067
- throw new Error(error)
2068
- }
2069
2062
  try {
2070
2063
  config.load(template.template, template.instance)
2071
- } catch( e ) {
2064
+ } catch (e) {
2072
2065
  errorHandler(e)
2073
2066
  }
2074
2067
  }
@@ -2104,19 +2097,19 @@ const ensureTestFile = (module, name, type) => {
2104
2097
  }
2105
2098
  }
2106
2099
 
2107
- function where(goUp = 2) {
2108
- const e = new Error();
2100
+ function where (goUp = 2) {
2101
+ const e = new Error()
2109
2102
  const regexForm1 = /\((.*):(\d+):(\d+)\)$/
2110
2103
  const regexForm2 = /at (.*):(\d+):(\d+)$/
2111
- const lines = e.stack.split("\n")
2104
+ const lines = e.stack.split('\n')
2112
2105
  let line
2113
2106
  for (line of lines.slice(1)) {
2114
- if (!(line.includes("config.js:") || line.includes("client.js:"))) {
2115
- break;
2107
+ if (!(line.includes('config.js:') || line.includes('client.js:'))) {
2108
+ break
2116
2109
  }
2117
2110
  }
2118
2111
  // const line = e.stack.split("\n")[goUp];
2119
- const match = regexForm1.exec(line) || regexForm2.exec(line);
2112
+ const match = regexForm1.exec(line) || regexForm2.exec(line)
2120
2113
  if (match) {
2121
2114
  return `${match[1]}:${match[2]}`
2122
2115
  } else {
@@ -2124,7 +2117,7 @@ function where(goUp = 2) {
2124
2117
  }
2125
2118
  }
2126
2119
 
2127
- function w(func) {
2120
+ function w (func) {
2128
2121
  func.where = where(3)
2129
2122
  return func
2130
2123
  }
@@ -2156,4 +2149,3 @@ module.exports = {
2156
2149
  flattens,
2157
2150
  writeTest
2158
2151
  }
2159
-