theprogrammablemind_4wp 7.5.8-beta.2 → 7.5.8-beta.4

Sign up to get free protection for your applications and to get access to all the features.
package/client.js CHANGED
@@ -288,7 +288,7 @@ const writeTestFile = (fn, tests) => {
288
288
  runtime.fs.writeFileSync(fn, stringify(tests, { space: 2 }), { encoding: 'utf8', flag: 'w+' })
289
289
  }
290
290
 
291
- const writeTest = (fn, query, objects, generated, paraphrases, responses, contexts, associations, metadata, config, saveDeveloper) => {
291
+ const writeTest = (fn, query, objects, generated, paraphrases, responses, contexts, associations, metadata, config, saveDeveloper, paraphrasesParenthesized, generatedParenthesized) => {
292
292
  let tests = []
293
293
  if (runtime.fs.existsSync(fn)) {
294
294
  tests = JSON.parse(runtime.fs.readFileSync(fn))
@@ -298,7 +298,19 @@ const writeTest = (fn, query, objects, generated, paraphrases, responses, contex
298
298
  }
299
299
  associations.sort()
300
300
  // tests[query] = sortJson({ paraphrases, responses, contexts, objects: convertToStable(objects), associations, metadata, config, developerTest: saveDeveloper }, { depth: 25 })
301
- results = sortJson({ query, paraphrases, responses, contexts, objects: convertToStable(objects), associations, metadata, config, developerTest: saveDeveloper }, { depth: 25 })
301
+ debugger
302
+ results = sortJson({
303
+ query,
304
+ paraphrases,
305
+ responses,
306
+ contexts,
307
+ objects: convertToStable(objects),
308
+ associations,
309
+ metadata,
310
+ config,
311
+ developerTest: saveDeveloper,
312
+ paraphrasesParenthesized,
313
+ generatedParenthesized }, { depth: 25 })
302
314
  let wasSet = false;
303
315
  tests.forEach( (test, index) => {
304
316
  if (test.query == query) {
@@ -360,6 +372,8 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
360
372
  const contextsPrime = []
361
373
  const generatedPrime = []
362
374
  const paraphrasesPrime = []
375
+ const paraphrasesParenthesizedPrime = []
376
+ const generatedParenthesizedPrime = []
363
377
  const responsesPrime = []
364
378
  const contexts = setupContexts(json.contexts)
365
379
 
@@ -423,7 +437,13 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
423
437
  continue
424
438
  }
425
439
  let assumed = { isResponse: true };
426
- const generated = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
440
+ const generated = contextPrime.isResponse ? config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0] : ''
441
+ let generatedParenthesized = []
442
+ if (isTest) {
443
+ config.parenthesized = true
444
+ generatedParenthesized = contextPrime.isResponse ? config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0] : ''
445
+ config.parenthesized = false
446
+ }
427
447
  // assumed = { paraphrase: true, response: false };
428
448
  assumed = { paraphrase: true };
429
449
  args.g = (c) => config.getGenerators(json.logs).apply(args, c, assumed)
@@ -432,7 +452,16 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
432
452
  args.gs = gs(args.g)
433
453
  args.gsp = gs(args.gsp)
434
454
  args.gsr = gs(args.gr)
455
+ if (isTest) {
456
+ config.parenthesized = false
457
+ }
435
458
  const paraphrases = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
459
+ let paraphrasesParenthesized = []
460
+ if (isTest) {
461
+ config.parenthesized = true
462
+ paraphrasesParenthesized = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
463
+ config.parenthesized = false
464
+ }
436
465
  args.g = (c) => config.getGenerators(json.logs).apply(args, c)
437
466
  args.gp = (c) => config.getGenerators(json.logs).apply(args, {...c, paraphrase: true, isResponse: false, response: false })
438
467
  args.gr = (c) => config.getGenerators(json.logs).apply(args, {...c, paraphrase: false })
@@ -442,6 +471,10 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
442
471
  contextsPrime.push(contextPrime)
443
472
  generatedPrime.push(generated)
444
473
  paraphrasesPrime.push(paraphrases)
474
+ if (isTest) {
475
+ paraphrasesParenthesizedPrime.push(paraphrasesParenthesized)
476
+ generatedParenthesizedPrime.push(generatedParenthesized)
477
+ }
445
478
  if (contextPrime.isResponse) {
446
479
  responsesPrime.push(generated)
447
480
  } else {
@@ -451,7 +484,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
451
484
  // add results to processed list
452
485
  config.config.objects.processed = config.config.objects.processed || []
453
486
  config.config.objects.processed = config.config.objects.processed.slice(0, 5)
454
- config.config.objects.processed.unshift({ context: contextPrime, paraphrases: paraphrases, responses: responsesPrime })
487
+ config.config.objects.processed.unshift({ context: contextPrime, paraphrases: paraphrases, paraphrasesParenthesized, generatedParenthesized, responses: responsesPrime })
455
488
  } catch (e) {
456
489
  if (Array.isArray(e)) {
457
490
  e = {
@@ -471,7 +504,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
471
504
  throw e
472
505
  }
473
506
  }
474
- return { contextsPrime, generatedPrime, paraphrasesPrime, responsesPrime }
507
+ return { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime }
475
508
  }
476
509
 
477
510
  const doWithRetries = async (n, url, queryParams, data) => {
@@ -493,17 +526,17 @@ const doWithRetries = async (n, url, queryParams, data) => {
493
526
  }
494
527
  if (result.status === 504) {
495
528
  if (n === 0) {
496
- throw `Error ${result.status} - ${result.statusText}`
529
+ throw new Error(`Error ${result.status} - ${result.statusText}`)
497
530
  } else {
498
531
  continue
499
532
  }
500
533
  }
501
534
  if (result.status >= 500 && result.status < 600) {
502
- throw `Error ${result.status} - ${result.statusText}.`
535
+ throw new Error(`Error ${result.status} - ${result.statusText}.`)
503
536
  } if (result.status >= 404) {
504
- throw `Error ${result.status} - ${result.statusText} - Trying it connect to ${url}`
537
+ throw new Error(`Error ${result.status} - ${result.statusText} - Trying it connect to ${url}`)
505
538
  } else {
506
- throw `Error ${result.status} - ${result.statusText}`
539
+ throw new Error(`Error ${result.status} - ${result.statusText}`)
507
540
  }
508
541
  }
509
542
  }
@@ -598,6 +631,8 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
598
631
  contexts: [],
599
632
  generated: [],
600
633
  paraphrases: [],
634
+ paraphrasesParenthesized: [],
635
+ generatedParenthesized: [],
601
636
  responses: [],
602
637
  associations: [],
603
638
  }
@@ -633,7 +668,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
633
668
  if (json.status !== 200) {
634
669
  throw json
635
670
  } else {
636
- const { contextsPrime, generatedPrime, paraphrasesPrime, responsesPrime } =
671
+ const { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime } =
637
672
  processContextsB({ isTest, config, hierarchy, json, commandLineArgs /*, generators, semantics */ })
638
673
  response.associations = json.associations
639
674
  response.hierarchy = json.hierarchy
@@ -650,6 +685,8 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
650
685
  response.contexts = response.contexts.concat(contextsPrime)
651
686
  response.generated = response.generated.concat(generatedPrime)
652
687
  response.paraphrases = response.paraphrases.concat(paraphrasesPrime)
688
+ response.paraphrasesParenthesized = response.paraphrasesParenthesized.concat(paraphrasesParenthesizedPrime)
689
+ response.generatedParenthesized = response.generatedParenthesized.concat(generatedParenthesizedPrime)
653
690
  response.responses = response.responses.concat(responsesPrime)
654
691
  queries = queries.slice(1)
655
692
  }
@@ -657,7 +694,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
657
694
 
658
695
  if (writeTests) {
659
696
  const actual_config = getConfigForTest(config, testConfig)
660
- writeTest(testsFN, query, config.config.objects, response.generated, response.paraphrases, response.responses, response.contexts, response.associations, response.metadata, actual_config, saveDeveloper)
697
+ writeTest(testsFN, query, config.config.objects, response.generated, response.paraphrases, response.responses, response.contexts, response.associations, response.metadata, actual_config, saveDeveloper, response.paraphrasesParenthesized, response.generatedParenthesized)
661
698
  }
662
699
 
663
700
  return response
@@ -738,8 +775,11 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
738
775
  lines.log()
739
776
  }
740
777
  const expected_objects = sortJson(convertToStable(expected.objects), { depth: 25 })
778
+ delete expected_objects.nameToUUID
741
779
  const actual_objects = sortJson(convertToStable(config.config.objects), { depth: 25 })
742
780
  const failed_paraphrases = !matching(result.paraphrases, expected.paraphrases)
781
+ const failed_paraphrasesParenthesized = !matching(result.paraphrasesParenthesized, expected.paraphrasesParenthesized)
782
+ const failed_generatedParenthesized = !matching(result.generatedParenthesized, expected.generatedParenthesized)
743
783
  const failed_responses = !matching(result.responses, expected.responses)
744
784
  const failed_contexts = !matching(result.contexts, expected.contexts)
745
785
  const failed_objects = !matching(actual_objects, expected_objects)
@@ -784,7 +824,7 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
784
824
  const actual_config = sortJson(convertToStable(getConfigForTest(config, testConfig)), { depth: 25 })
785
825
  const expected_config = sortJson(convertToStable(expected.config), { depth: 25 })
786
826
  const failed_config = !matching(actual_config, expected_config)
787
- let failed = failed_paraphrases || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked
827
+ let failed = failed_paraphrases || failed_paraphrasesParenthesized || failed_generatedParenthesized || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked
788
828
  if (!failed) {
789
829
  if (config.afterTest) {
790
830
  failed = config.afterTest({ query: test, expected, actual: result, config })
@@ -792,8 +832,26 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
792
832
  return {
793
833
  utterance: test,
794
834
  errorFromAfterTest: failed,
795
- expected: { responses: expected.responses, paraphrases: expected.paraphrases, results: expected.contexts, checked: expected_checked, objects: expected_objects, config: expected.config },
796
- actual: { responses: result.responses, paraphrases: result.paraphrases, results: result.contexts, checked: actual_checked, objects: actual_objects, config: actual_config }
835
+ expected: {
836
+ responses: expected.responses,
837
+ paraphrases: expected.paraphrases,
838
+ paraphrasesParenthesized: expected.paraphrasesParenthesized,
839
+ generatedParenthesized: expected.generatedParenthesized,
840
+ results: expected.contexts,
841
+ checked: expected_checked,
842
+ objects: expected_objects,
843
+ config: expected.config
844
+ },
845
+ actual: {
846
+ responses: result.responses,
847
+ paraphrases: result.paraphrases,
848
+ paraphrasesParenthesized: result.paraphrasesParenthesized,
849
+ generatedParenthesized: result.generatedParenthesized,
850
+ results: result.contexts,
851
+ checked: actual_checked,
852
+ objects: actual_objects,
853
+ config: actual_config
854
+ }
797
855
  }
798
856
  }
799
857
  }
@@ -809,8 +867,26 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
809
867
  if (failed) {
810
868
  return {
811
869
  utterance: test,
812
- expected: { responses: expected.responses, paraphrases: expected.paraphrases, results: expected.contexts, checked: expected_checked, objects: expected_objects, config: expected.config },
813
- actual: { responses: result.responses, paraphrases: result.paraphrases, results: result.contexts, checked: actual_checked, objects: actual_objects, config: actual_config }
870
+ expected: {
871
+ responses: expected.responses,
872
+ paraphrases: expected.paraphrases,
873
+ paraphrasesParenthesized: expected.paraphrasesParenthesized,
874
+ generatedParenthesized: expected.generatedParenthesized,
875
+ results: expected.contexts,
876
+ checked: expected_checked,
877
+ objects: expected_objects,
878
+ config: expected.config
879
+ },
880
+ actual: {
881
+ responses: result.responses,
882
+ paraphrases: result.paraphrases,
883
+ paraphrasesParenthesized: result.paraphrasesParenthesized,
884
+ generatedParenthesized: result.generatedParenthesized,
885
+ results: result.contexts,
886
+ checked: actual_checked,
887
+ objects: actual_objects,
888
+ config: actual_config
889
+ }
814
890
  }
815
891
  }
816
892
  } catch(error) {
@@ -872,7 +948,7 @@ const saveTest = async (testFile, config, test, expected, testConfig, saveDevelo
872
948
  for (let km of config.configs) {
873
949
  saveObjects.nameToUUID[km.name] = km.uuid
874
950
  }
875
- writeTest(testFile, test, saveObjects, result.generated, result.paraphrases, result.responses, result.contexts, result.associations, result.metadata, actualConfig, saveDeveloper)
951
+ writeTest(testFile, test, saveObjects, result.generated, result.paraphrases, result.responses, result.contexts, result.associations, result.metadata, actualConfig, saveDeveloper, result.paraphrasesParenthesized, result.generatedParenthesized)
876
952
  }
877
953
 
878
954
  const saveTestsHelper = async (testFile, config, tests, todo, testConfig, saveDeveloper) => {
@@ -1174,7 +1250,9 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
1174
1250
  defaultInnerProcess(config, defaultErrorHandler, results)
1175
1251
  }
1176
1252
  if (results.contexts.length > 1) {
1177
- console.log(`query ${query.query}. There is ${results.contexts.length} contexts in the results. Make sure its producing the results that you expect.`)
1253
+ console.log(`query "${query.query}". There is ${results.contexts.length} contexts in the results. Make sure its producing the results that you expect.`)
1254
+ } else if (results.paraphrases[0] != query.query) {
1255
+ console.log(`query "${query.query}". The paraphrase is different from the query "${results.paraphrases[0]}".`)
1178
1256
  } else {
1179
1257
  console.log(`query ${query.query}`)
1180
1258
  }
@@ -1283,19 +1361,19 @@ const knowledgeModule = async ({
1283
1361
  const testConfig = test
1284
1362
 
1285
1363
  if (!moduleFromJSFile) {
1286
- throw "'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."
1364
+ 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.")
1287
1365
  }
1288
1366
  if (!config) {
1289
- throw "'config' is a required parameter. The value should the config that defines the knowledge module."
1367
+ throw new Error("'config' is a required parameter. The value should the config that defines the knowledge module.")
1290
1368
  }
1291
1369
  if (!config.name) {
1292
- throw "config must have 'name' set to the knowledge module name."
1370
+ throw new Error("config must have 'name' set to the knowledge module name.")
1293
1371
  }
1294
1372
  if (!description) {
1295
- throw "'description' is a required parameter. The value should the description of the knowledge module."
1373
+ throw new Error("'description' is a required parameter. The value should the description of the knowledge module.")
1296
1374
  }
1297
1375
  if (!test) {
1298
- throw "'test' is a required parameter. The value should the path to the file used to store the tests of the knowledge module and the contents of the file in the form { name: <filePath>, contexts: <json> }."
1376
+ throw new Error("'test' is a required parameter. The value should the path to the file used to store the tests of the knowledge module and the contents of the file in the form { name: <filePath>, contexts: <json> }.")
1299
1377
  }
1300
1378
 
1301
1379
  const isProcess = require.main === moduleFromJSFile
@@ -1353,7 +1431,7 @@ const knowledgeModule = async ({
1353
1431
  if (!isProcess) {
1354
1432
  if (template) {
1355
1433
  if (config.needsRebuild(template.template, template.instance)) {
1356
- throw `This module "${config.name}" cannot be used because the instance file needs rebuilding. Run on the command line with no arguements or the -rt argument to rebuild.`
1434
+ throw new Error(`This module "${config.name}" cannot be used because the instance file needs rebuilding. Run on the command line with no arguements or the -rt argument to rebuild.`)
1357
1435
  }
1358
1436
  try {
1359
1437
  config.load(template.template, template.instance)
@@ -1392,6 +1470,7 @@ const knowledgeModule = async ({
1392
1470
  parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
1393
1471
  parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
1394
1472
  parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
1473
+ parser.add_argument('--parenthesized', { action: 'store_true', help: 'Show the generated phrases with parenthesis.' })
1395
1474
  parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
1396
1475
  parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
1397
1476
  parser.add_argument('-daa', '--dontAddAssociations', { action: 'store_true', help: 'Do not add associations from the tests.' })
@@ -1410,6 +1489,10 @@ const knowledgeModule = async ({
1410
1489
  const args = parser.parse_args()
1411
1490
  args.count = args.count || 1
1412
1491
 
1492
+ if (args.parenthesized) {
1493
+ config.parenthesized = true
1494
+ }
1495
+
1413
1496
  if (args.debugAssociation) {
1414
1497
  console.log(helpDebugAssociation)
1415
1498
  runtime.process.exit(-1)
@@ -1629,6 +1712,12 @@ const knowledgeModule = async ({
1629
1712
  if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1630
1713
  hasError = true
1631
1714
  }
1715
+ if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
1716
+ hasError = true
1717
+ }
1718
+ if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
1719
+ hasError = true
1720
+ }
1632
1721
  if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
1633
1722
  hasError = true
1634
1723
  }
@@ -1641,6 +1730,22 @@ const knowledgeModule = async ({
1641
1730
  console.log('**************************** ERRORS ************************')
1642
1731
  for (const result of results) {
1643
1732
  console.log('Utterance: ', result.utterance)
1733
+ const show = (label, expected, actual) => {
1734
+ if (JSON.stringify(expected) !== JSON.stringify(actual)) {
1735
+ if (!headerShown) {
1736
+ console.log(' Failure')
1737
+ }
1738
+ console.log(` expected ${label}`, expected)
1739
+ console.log(` actual ${label} `, actual)
1740
+ newError = true
1741
+ headerShown = true
1742
+ }
1743
+ }
1744
+ show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
1745
+ show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
1746
+ show('responses', result.expected.responses, result.actual.responses)
1747
+ show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
1748
+ /*
1644
1749
  if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1645
1750
  if (!headerShown) {
1646
1751
  console.log(' Failure')
@@ -1659,6 +1764,7 @@ const knowledgeModule = async ({
1659
1764
  newError = true
1660
1765
  headerShown = true
1661
1766
  }
1767
+ */
1662
1768
  if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
1663
1769
  if (!headerShown) {
1664
1770
  console.log(' Failure')
@@ -1720,7 +1826,7 @@ const knowledgeModule = async ({
1720
1826
  console.log(results.responses.join(' '))
1721
1827
  })
1722
1828
  if (!('then' in promise)) {
1723
- throw 'Return a promise from process in the definition of knowledgeModule'
1829
+ throw new Error('Return a promise from process in the definition of knowledgeModule')
1724
1830
  }
1725
1831
  promise
1726
1832
  .then(() => {
package/lines.js CHANGED
@@ -13,7 +13,7 @@ class Lines {
13
13
  setElement (row, column, value) {
14
14
  const values = value.toString().split('\n')
15
15
  if (column >= this.widths.length) {
16
- throw "Column out of range."
16
+ throw new Error("Column out of range.")
17
17
  }
18
18
  const width = this.widths[column]
19
19
  let index = 0
package/package.json CHANGED
@@ -63,6 +63,6 @@
63
63
  "json-stable-stringify": "^1.0.1",
64
64
  "node-fetch": "^2.6.1"
65
65
  },
66
- "version": "7.5.8-beta.2",
66
+ "version": "7.5.8-beta.4",
67
67
  "license": "ISC"
68
68
  }
package/src/config.js CHANGED
@@ -54,6 +54,14 @@ const handleBridgeProps = (config, bridge) => {
54
54
  config.addPriorities([after, [bridge.id, bridge.level]])
55
55
  }
56
56
  }
57
+ if (bridge.after) {
58
+ for (let before of bridge.after) {
59
+ if (typeof before == 'string') {
60
+ before = [before, 0]
61
+ }
62
+ config.addPriorities([[bridge.id, bridge.level], before])
63
+ }
64
+ }
57
65
  if (bridge.words) {
58
66
  for (let def of bridge.words) {
59
67
  if (typeof def == 'string') {
@@ -80,15 +88,30 @@ const handleBridgeProps = (config, bridge) => {
80
88
  bridge.generatorr = bridge.generatorpr
81
89
  }
82
90
  if (bridge.generatorp) {
91
+ const match = bridge.generatorp.match || (() => true)
92
+ const apply = typeof bridge.generatorp == 'function' ? bridge.generatorp : bridge.generatorp.apply || bridge.generatorp
93
+ const level = bridge.generatorp.level >= 0 ? bridge.generatorp.level : bridge.level + 1
83
94
  config.config.generators.unshift({
84
95
  where: bridge.generatorp.where || bridge.where || client.where(4),
85
- // match: ({context}) => bridge.id == context.marker && context.paraphrase,
86
- match: ({context}) => bridge.id == context.marker && context.level == bridge.level + 1 && context.paraphrase,
87
- apply: (args) => bridge.generatorp(args),
88
- applyWrapped: bridge.generatorp,
96
+ match: (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && match(args),
97
+ apply: (args) => apply(args),
98
+ applyWrapped: apply,
89
99
  property: 'generatorp',
90
100
  })
91
101
  }
102
+ if (bridge.generatorr) {
103
+ const match = bridge.generatorr.match || (() => true)
104
+ const apply = typeof bridge.generatorr == 'function' ? bridge.generatorr : bridge.generatorr.apply || bridge.generatorr
105
+ const level = bridge.generatorr.level >= 0 ? bridge.generatorr.level : bridge.level + 1
106
+ config.config.generators.unshift({
107
+ where: bridge.generatorr.where || bridge.where || client.where(4),
108
+ match: (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && match(args),
109
+ apply: (args) => apply(args),
110
+ applyWrapped: apply,
111
+ property: 'generatorr',
112
+ })
113
+ }
114
+ /*
92
115
  if (bridge.generatorr) {
93
116
  config.config.generators.unshift({
94
117
  // TODO merge response and isResponse
@@ -99,6 +122,7 @@ const handleBridgeProps = (config, bridge) => {
99
122
  property: 'generatorr',
100
123
  })
101
124
  }
125
+ */
102
126
  if (bridge.evaluator) {
103
127
  config.config.semantics.unshift({
104
128
  where: bridge.evaluator.where || bridge.where || client.where(3),
@@ -123,7 +147,7 @@ const handleBridgeProps = (config, bridge) => {
123
147
 
124
148
  const handleCalculatedProps = (baseConfig, moreConfig) => {
125
149
  for (let bridge of moreConfig.bridges) {
126
- const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
150
+ const valid = [ 'after', 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
127
151
  'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where' ]
128
152
  helpers.validProps(valid, bridge, 'bridge')
129
153
  handleBridgeProps(baseConfig, bridge)
@@ -157,7 +181,7 @@ if (runtime.process.env.DEBUG_BRIDGE) {
157
181
  if (global.entodictonDebugBridge.length !== 2) {
158
182
  console.log('Expected DEBUG_BRIDGE to be of the form "id/level"');
159
183
  }
160
- global.entodictonDebugBridge[1] = int(global.entodictonDebugBridge[1])
184
+ global.entodictonDebugBridge[1] = parseInt(global.entodictonDebugBridge[1])
161
185
  }
162
186
 
163
187
  if (runtime.process.env.DEBUG_OPERATOR) {
@@ -175,7 +199,7 @@ const hierarchyCanonical = (element) => {
175
199
 
176
200
  const isValidDef = (word, def, config) => {
177
201
  if (!def.id) {
178
- throw `In the KM "${config.name}", for the word ${word} the following definition is missing the "id" property: ${JSON.stringify(def)}`
202
+ throw new Error(`In the KM "${config.name}", for the word ${word} the following definition is missing the "id" property: ${JSON.stringify(def)}`)
179
203
  }
180
204
  /*
181
205
  if (!def.initial) {
@@ -738,7 +762,7 @@ class Config {
738
762
  "semantics",
739
763
  "associations",
740
764
  ]
741
- return !properties.find( (property) => instance[property].length > 0 )
765
+ return !properties.find( (property) => instance[property] && instance[property].length > 0 )
742
766
  }
743
767
  if (!isEmpty(instance)) {
744
768
  instance.name = this.name
@@ -813,10 +837,10 @@ class Config {
813
837
  addHierarchyProperties (edge) {
814
838
  const { child, parent } = edge
815
839
  if (typeof child !== 'string') {
816
- throw `addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`
840
+ throw new Error(`addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`)
817
841
  }
818
842
  if (typeof parent !== 'string') {
819
- throw `addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`
843
+ throw new Error(`addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`)
820
844
  }
821
845
  if (global.entodictonDebugHierarchy) {
822
846
  if (helpers.safeEquals(entodictonDebugHierarchy, [child, parent])) {
@@ -830,10 +854,10 @@ class Config {
830
854
 
831
855
  addHierarchyChildParent (child, parent) {
832
856
  if (typeof child !== 'string') {
833
- throw `addHierarchy expected child to be a string. got ${JSON.stringify(child)}`
857
+ throw new Error(`addHierarchy expected child to be a string. got ${JSON.stringify(child)}`)
834
858
  }
835
859
  if (typeof parent !== 'string') {
836
- throw `addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`
860
+ throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
837
861
  }
838
862
 
839
863
  if (global.entodictonDebugHierarchy) {
@@ -894,10 +918,10 @@ class Config {
894
918
  }
895
919
 
896
920
  if (!(typeof generator.match === 'function')) {
897
- throw 'addGenerator: Expected matcher to be a function'
921
+ throw new Error('addGenerator: Expected matcher to be a function')
898
922
  }
899
923
  if (!(typeof generator.apply === 'function')) {
900
- throw 'addGenerator: Expected action to be a function'
924
+ throw new Error('addGenerator: Expected action to be a function')
901
925
  }
902
926
 
903
927
  if (!this.config.generators) {
@@ -921,10 +945,10 @@ class Config {
921
945
  }
922
946
 
923
947
  if (!(typeof semantic.match === 'function')) {
924
- throw 'addSemantic: Expected match to be a function'
948
+ throw new Error('addSemantic: Expected match to be a function')
925
949
  }
926
950
  if (!(typeof semantic.apply === 'function')) {
927
- throw 'addSemantic: Expected apply to be a function'
951
+ throw new Error('addSemantic: Expected apply to be a function')
928
952
  }
929
953
 
930
954
  if (!this.config.semantics) {
@@ -1198,7 +1222,7 @@ class Config {
1198
1222
  // configs = [ { config, namespace } ... ]
1199
1223
  constructor (config, module) {
1200
1224
  if (config instanceof Config) {
1201
- throw 'Excepted the config argument to be a hash not a Config object'
1225
+ throw new Error('Excepted the config argument to be a hash not a Config object')
1202
1226
  }
1203
1227
 
1204
1228
  if (config) {
@@ -1279,7 +1303,7 @@ class Config {
1279
1303
  }
1280
1304
  duplicated = Array.from(duplicated)
1281
1305
  if (duplicated.length > 0) {
1282
- throw `In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`
1306
+ throw new Error(`In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`)
1283
1307
  }
1284
1308
  }
1285
1309
 
@@ -1394,13 +1418,13 @@ class Config {
1394
1418
  if (this._api && this._api.multiApi) {
1395
1419
  this._api.add(this, this._api, api)
1396
1420
  } else {
1397
- throw "Can only add apis to a multi-api";
1421
+ throw new Error("Can only add apis to a multi-api")
1398
1422
  }
1399
1423
  }
1400
1424
 
1401
1425
  set api (value) {
1402
1426
  if (!value.initialize) {
1403
- throw `Expected the API to have an initialize function for ${this.name}.`
1427
+ throw new Error(`Expected the API to have an initialize function for ${this.name}.`)
1404
1428
  }
1405
1429
 
1406
1430
  if (this._api && this._api.multiApi) {
@@ -1467,7 +1491,7 @@ class Config {
1467
1491
  }
1468
1492
 
1469
1493
  doMotivations (args, context) {
1470
- args = Object.assign({}, args, { context })
1494
+ args = Object.assign({}, args, { context, api: this.api })
1471
1495
  // console.log('src/config doMotivations this.uuid', this.uuid)
1472
1496
  // args.objects = args.getObjects(this.uuid)
1473
1497
  const motivations = this.motivations
@@ -1702,7 +1726,7 @@ class Config {
1702
1726
  for (let option of Object.keys(options)) {
1703
1727
  const validOptions = ['initAfterApi']
1704
1728
  if (!['initAfterApi'].includes(option)) {
1705
- throw `For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`
1729
+ throw new Error(`For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`)
1706
1730
  }
1707
1731
  }
1708
1732
  }
@@ -1939,7 +1963,20 @@ class Config {
1939
1963
  // TODO change name of config: to baseConfig:
1940
1964
  const kmFn = (name) => this.getConfig(name)
1941
1965
  // const hierarchy = new DigraphInternal((config.config || {}).hierarchy)
1942
- const args = { isModule, addWord: aw, km: kmFn, hierarchy: this.hierarchy, config, baseConfig: this, currentConfig: config, uuid: config._uuid, objects: namespacedObjects, namespace, api: config.api }
1966
+ const args = {
1967
+ isModule,
1968
+ addWord: aw,
1969
+ km: kmFn,
1970
+ hierarchy: this.hierarchy,
1971
+ config,
1972
+ baseConfig: this,
1973
+ currentConfig: config,
1974
+ uuid: config._uuid,
1975
+ objects: namespacedObjects,
1976
+ namespace,
1977
+ motivation: (m) => config.addMotivation(m),
1978
+ api: config.api
1979
+ }
1943
1980
  config.initializerFn(args)
1944
1981
  if (config.initAfterApi) {
1945
1982
  // reverse the list
@@ -2327,14 +2364,14 @@ class Config {
2327
2364
 
2328
2365
  set (property, value) {
2329
2366
  if (!this.config.hasOwnProperty(property)) {
2330
- throw `Setting invalid property ${property}`
2367
+ throw new Error(`Setting invalid property ${property}`)
2331
2368
  }
2332
2369
 
2333
2370
  if ('words' == property) {
2334
2371
  for (let word in value) {
2335
2372
  for (let def of value[word]) {
2336
2373
  if (!def['uuid']) {
2337
- throw `All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)} for the word '${word}'`
2374
+ throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)} for the word '${word}'`)
2338
2375
  }
2339
2376
  }
2340
2377
  }
@@ -2343,7 +2380,7 @@ class Config {
2343
2380
  if (['operators', 'bridges'].includes(property)) {
2344
2381
  for (let def of value) {
2345
2382
  if (!def['uuid']) {
2346
- throw `All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`
2383
+ throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`)
2347
2384
  }
2348
2385
  }
2349
2386
  }
@@ -2375,7 +2412,7 @@ class Config {
2375
2412
 
2376
2413
  add (more) {
2377
2414
  if (more === this) {
2378
- throw 'Cannot add an object to itself.'
2415
+ throw new Error('Cannot add an object to itself.')
2379
2416
  }
2380
2417
  if (!(more instanceof Config)) {
2381
2418
  more = new Config(more)
@@ -2543,7 +2580,7 @@ class Config {
2543
2580
  this.config[key] = this.config[key].concat(more[key])
2544
2581
  } else {
2545
2582
  if (!(key in this.config)) {
2546
- throw `Unexpected property in config ${key}`
2583
+ throw new Error(`Unexpected property in config ${key}`)
2547
2584
  }
2548
2585
  this.config[key] = more[key]
2549
2586
  }
@@ -2661,7 +2698,7 @@ class Config {
2661
2698
  this.config[key] = more[key].concat(this.config[key])
2662
2699
  } else {
2663
2700
  if (!(key in this.config)) {
2664
- throw `Unexpected property in config ${key}`
2701
+ throw new Error(`Unexpected property in config ${key}`)
2665
2702
  }
2666
2703
  this.config[key] = more[key]
2667
2704
  }
package/src/generators.js CHANGED
@@ -75,7 +75,7 @@ class Generator {
75
75
 
76
76
  apply (baseArgs, objects, g, gs, context, hierarchy, config, response, log, options = {}) {
77
77
  if (!log) {
78
- throw 'generators.apply argument log is required'
78
+ throw new Error('generators.apply argument log is required')
79
79
  }
80
80
  if (baseArgs.call && config && sbaseArgs.calls.stack.length > config.maxDepth) {
81
81
  throw new Error(`Max depth of ${config.maxDepth} for calls has been exceeded. maxDepth can be set on the config object. To see the calls run with the --dl or set the debugLoops property on the config`)
@@ -292,7 +292,7 @@ class Generators {
292
292
  lines.setElement(0, 2, JSON.stringify(context, null, 2))
293
293
  this.logs.push(lines.toString())
294
294
  }
295
- contextsPrime.push(generated)
295
+ contextsPrime.push((config || {}).parenthesized ? "(" + generated + ")" : generated)
296
296
  }
297
297
  return contextsPrime
298
298
  }
package/src/helpers.js CHANGED
@@ -54,6 +54,9 @@ const safeEquals = (v1, v2) => {
54
54
  } else if (type == 'function') {
55
55
  return v1.toString() == v2.toString()
56
56
  } else {
57
+ if (v1.length != v2.length) {
58
+ return false
59
+ }
57
60
  for (let key in v1) {
58
61
  if (!safeEquals(v1[key], v2[key])) {
59
62
  return false
@@ -235,13 +238,17 @@ const validProps = (valids, object, type) => {
235
238
  for (let prop of Object.keys(object)) {
236
239
  let okay = false
237
240
  for (valid of valids) {
238
- if (prop.match(valid)) {
239
- okay = true
241
+ if (typeof valid == 'string') {
242
+ okay = prop == valid
243
+ } else {
244
+ okay = prop.match(valid)
245
+ }
246
+ if (okay) {
240
247
  break
241
248
  }
242
249
  }
243
250
  if (!okay) {
244
- throw `Unknown property "${prop}" in the ${type}. Valid properties are ${valids}. The ${type} is ${JSON.stringify(object)}`
251
+ throw new Error(`Unknown property "${prop}" in the ${type}. Valid properties are ${valids}. The ${type} is ${JSON.stringify(object)}`)
245
252
  }
246
253
  }
247
254
  }
package/src/semantics.js CHANGED
@@ -89,7 +89,7 @@ class Semantic {
89
89
  // const ask = baseArgs.getAsk(this.uuid)
90
90
  if (!log) {
91
91
  console.trace()
92
- throw 'log is a required argument'
92
+ throw new Error('log is a required argument')
93
93
  }
94
94
  const contextPrime = Object.assign({}, context)
95
95
  let n = (id) => id