theprogrammablemind 7.5.0-beta.2 → 7.5.0-beta.20

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
@@ -78,7 +78,15 @@ const listable = (hierarchy) => (c, type) => {
78
78
  return false
79
79
  }
80
80
 
81
- const isA = (hierarchy) => (child, parent) => hierarchy.isA(child, parent)
81
+ const isA = (hierarchy) => (child, parent) => {
82
+ if (child.marker) {
83
+ child = child.marker
84
+ }
85
+ if (parent.marker) {
86
+ parent = parent.marker
87
+ }
88
+ return hierarchy.isA(child, parent)
89
+ }
82
90
 
83
91
  const asList = (context) => {
84
92
  if (context.marker === 'list') {
@@ -670,9 +678,12 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
670
678
  defaultErrorHandler(error)
671
679
  }
672
680
 
673
- const objects = getObjects(config.config.objects)(config.uuid)
681
+ let objects = getObjects(config.config.objects)(config.uuid)
682
+ if (testConfig.testModuleName) {
683
+ objects = getObjects(config.config.objects)(config.getConfigs()[testConfig.testModuleName].uuid)
684
+ }
674
685
  config.beforeQuery({ query: test, isModule: false, objects })
675
- config.resetMotivations()
686
+ // config.resetMotivations()
676
687
  try {
677
688
  const result = await _process(config, test, { errorHandler, isTest: true })
678
689
  result.query = test
@@ -783,7 +794,7 @@ const runTests = async (config, testFile, juicyBits) => {
783
794
  const saveTest = async (testFile, config, test, expected, testConfig, saveDeveloper) => {
784
795
  config.rebuild()
785
796
  const objects = getObjects(config.config.objects)(config.uuid)
786
- config.resetMotivations()
797
+ //config.resetMotivations()
787
798
  config.beforeQuery({ query: test, isModule: false, objects })
788
799
  console.log(test)
789
800
  const result = await _process(config, test, { isTest: true })
@@ -1252,7 +1263,7 @@ const knowledgeModule = async ({
1252
1263
  description: 'Entodicton knowledge module'
1253
1264
  })
1254
1265
 
1255
- parser.add_argument('-tfn', '--testFileName', { help: 'Override the test file for the module when the tests are being run' })
1266
+ parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
1256
1267
  parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
1257
1268
  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' })
1258
1269
  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' })
@@ -1267,7 +1278,7 @@ const knowledgeModule = async ({
1267
1278
  parser.add_argument('-q', '--query', { help: 'Run the specified query' })
1268
1279
  parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
1269
1280
  parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
1270
- parser.add_argument('-td', '--testDelete', { help: 'Delete the specified query from the tests file.' })
1281
+ parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
1271
1282
  parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
1272
1283
  parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
1273
1284
  parser.add_argument('-daa', '--dontAddAssociations', { action: 'store_true', help: 'Do not add associations from the tests.' })
@@ -1306,11 +1317,11 @@ const knowledgeModule = async ({
1306
1317
  return
1307
1318
  }
1308
1319
 
1309
- if (args.testDelete) {
1320
+ if (args.deleteTest) {
1310
1321
  let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
1311
- tests = tests.filter( (test) => test.query !== args.testDelete );
1322
+ tests = tests.filter( (test) => test.query !== args.deleteTest );
1312
1323
  writeTestFile(testConfig.name, tests)
1313
- console.log(`Remove the test for "${args.testDelete}"`)
1324
+ console.log(`Remove the test for "${args.deleteTest}"`)
1314
1325
  return
1315
1326
  }
1316
1327
 
@@ -1466,7 +1477,15 @@ const knowledgeModule = async ({
1466
1477
  }
1467
1478
  return
1468
1479
  }
1469
- runTests(config, args.testFileName ? `${args.testFileName}.test.json` : test, { debug: args.debug, testConfig: testConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
1480
+ let useTestConfig = testConfig
1481
+ if (args.testModuleName) {
1482
+ useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
1483
+ useTestConfig.testModuleName = args.testModuleName
1484
+ test = useTestConfig.name
1485
+
1486
+ }
1487
+ // runTests(config, args.testFileName ? `${args.testFileName}.test.json` : test, { debug: args.debug, testConfig: testConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
1488
+ runTests(config, test, { debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
1470
1489
  if (results.length > 0 && args.vimdiff) {
1471
1490
  for (const result of results) {
1472
1491
  vimdiff(result.expected, result.actual)
@@ -1515,19 +1534,25 @@ const knowledgeModule = async ({
1515
1534
  if (!headerShown) {
1516
1535
  console.log(' Failure')
1517
1536
  }
1518
- console.log(' expected checked', result.expected.checked)
1519
- console.log(' actual checked ', result.actual.checked)
1537
+ const widths = [4, 18, 72]
1538
+ const lines = new Lines(widths)
1539
+ lines.setElement(1, 1, 'expected checked')
1540
+ lines.setElement(2, 2, JSON.stringify(result.expected.checked, null, 2))
1541
+ lines.log()
1542
+ lines.setElement(1, 1, 'actual checked')
1543
+ lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
1544
+ lines.log()
1520
1545
  newError = true
1521
1546
  headerShown = true
1522
1547
  }
1523
1548
  }
1524
1549
  }
1525
1550
  if (!headerShown) {
1526
- if (!(testConfig.check && testConfig.check.length > 0)) {
1551
+ if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
1527
1552
  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.')
1528
1553
  }
1529
1554
  }
1530
- if (!(testConfig.check && testConfig.check.length > 0)) {
1555
+ if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
1531
1556
  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.')
1532
1557
  // console.log(JSON.stringify(contexts))
1533
1558
  console.log('**************************** ERRORS ************************')
@@ -1589,6 +1614,7 @@ const knowledgeModule = async ({
1589
1614
  }
1590
1615
  } else {
1591
1616
  config.addAssociationsFromTests(config.tests);
1617
+ config.setTestConfig(testConfig)
1592
1618
  //for (let query in config.tests) {
1593
1619
  // config.addAssociations(config.tests[query].associations || []);
1594
1620
  //}
package/lines.js CHANGED
@@ -12,6 +12,9 @@ class Lines {
12
12
  // will wrap to next line within the column
13
13
  setElement (row, column, value) {
14
14
  const values = value.toString().split('\n')
15
+ if (column >= this.widths.length) {
16
+ throw "Column out of range."
17
+ }
15
18
  const width = this.widths[column]
16
19
  let index = 0
17
20
  for (value of values) {
package/package.json CHANGED
@@ -61,6 +61,6 @@
61
61
  "json-stable-stringify": "^1.0.1",
62
62
  "node-fetch": "^2.6.1"
63
63
  },
64
- "version": "7.5.0-beta.2",
64
+ "version": "7.5.0-beta.20",
65
65
  "license": "ISC"
66
66
  }
package/src/config.js CHANGED
@@ -330,6 +330,17 @@ class Config {
330
330
  return `${maybeName}${counter}`
331
331
  }
332
332
 
333
+ setTestConfig(testConfig) {
334
+ if (this.name == 'ui') {
335
+ console.log('ui setting testConfig')
336
+ }
337
+ this.testConfig = testConfig
338
+ }
339
+
340
+ getTestConfig() {
341
+ return this.testConfig
342
+ }
343
+
333
344
  defaultConfig () {
334
345
  this.config = {
335
346
  operators: [], // TODO
@@ -412,11 +423,11 @@ class Config {
412
423
  }
413
424
 
414
425
  getSemantics (logs = []) {
415
- return new Semantics(this.config.semantics || [], logs, { km: this.name })
426
+ return new Semantics(this.config.semantics, logs, { km: this.name })
416
427
  }
417
428
 
418
429
  getGenerators (logs = []) {
419
- return new Generators(this.config.generators || [], logs, { km: this.name })
430
+ return new Generators(this.config.generators, logs, { km: this.name })
420
431
  }
421
432
 
422
433
  warningNotEvaluated (log, value) {
@@ -601,9 +612,6 @@ class Config {
601
612
  if (typeof parent !== 'string') {
602
613
  throw `addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`
603
614
  }
604
- if (!this.config.hierarchy) {
605
- this.config.hierarchy = []
606
- }
607
615
  if (global.entodictonDebugHierarchy) {
608
616
  if (deepEqual(global.entodictonDebugHierarchy, [child, parent])) {
609
617
  debugger; // debug hierarchy hit
@@ -622,9 +630,6 @@ class Config {
622
630
  throw `addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`
623
631
  }
624
632
 
625
- if (!this.config.hierarchy) {
626
- this.config.hierarchy = []
627
- }
628
633
  if (global.entodictonDebugHierarchy) {
629
634
  if (deepEqual(global.entodictonDebugHierarchy, [child, parent])) {
630
635
  debugger; // debug hierarchy hit
@@ -962,17 +967,11 @@ class Config {
962
967
  if (!config) {
963
968
  return
964
969
  }
965
- config.operators = config.operators || []
966
- config.bridges = config.bridges || []
967
- config.words = config.words || {}
968
- config.generators = config.generators || []
969
- config.semantics = config.semantics || []
970
-
971
970
  config.operators = config.operators.filter( (element) => !element.development )
972
971
  config.bridges = config.bridges.filter( (element) => !element.development )
973
972
  config.generators = config.generators.filter( (element) => !element.development )
974
973
  config.semantics = config.semantics.filter( (element) => !element.development )
975
- config.hierarchy = (config.hierarchy || []).filter( (element) => !element.development )
974
+ config.hierarchy = (config.hierarchy).filter( (element) => !element.development )
976
975
  for (const word in config.words) {
977
976
  const defs = config.words[word] || []
978
977
  config.words[word] = defs.filter( (def) => !def.development )
@@ -1101,17 +1100,8 @@ class Config {
1101
1100
  if (config) {
1102
1101
  config = _.cloneDeep(config)
1103
1102
  this.config = config
1104
- if (!this.config.generators) {
1105
- this.config.generators = []
1106
- }
1107
- if (!this.config.semantics) {
1108
- this.config.semantics = []
1109
- }
1110
- if (!this.config.words) {
1111
- // this.config.words = {}
1112
- }
1113
- for (let bridge of (this.config.bridges || [])) {
1114
- const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generators', 'id', 'inverted', 'isA',
1103
+ for (let bridge of this.config.bridges) {
1104
+ const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generators', 'id', 'implicit', 'inverted', 'isA', 'children', 'parents',
1115
1105
  'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy' ]
1116
1106
  helpers.validProps(valid, bridge, 'bridge')
1117
1107
  /*
@@ -1122,6 +1112,16 @@ class Config {
1122
1112
  })
1123
1113
  }
1124
1114
  */
1115
+ if (bridge.children) {
1116
+ for (let child of bridge.children) {
1117
+ this.addHierarchy(child, bridge.id)
1118
+ }
1119
+ }
1120
+ if (bridge.parents) {
1121
+ for (let parent of bridge.parents) {
1122
+ this.addHierarchy(bridge.id, parent)
1123
+ }
1124
+ }
1125
1125
  if (bridge.isA) {
1126
1126
  for (let parent of bridge.isA) {
1127
1127
  this.addHierarchy(bridge.id, parent)
@@ -1196,6 +1196,7 @@ class Config {
1196
1196
  })
1197
1197
  }
1198
1198
  }
1199
+ this.hierarchy = new Digraph(this.config.hierarchy)
1199
1200
  this.initConfig = _.cloneDeep(this.config)
1200
1201
  this.configs.push(new KM({ config: this.config, getCounter: (name) => this.config.getCounter(name), uuid: this._uuid }))
1201
1202
 
@@ -1399,12 +1400,13 @@ class Config {
1399
1400
  cp.name = this.name
1400
1401
  cp.description = this.description
1401
1402
  cp.tests = this.tests
1402
- cp.motivations = this.motivations
1403
+ cp.motivations = [...this.motivations]
1403
1404
  cp.isModule = this.isModule
1404
1405
  cp.loadedForTesting = this.loadedForTesting
1405
1406
  cp.initInstances = this.initInstances.slice()
1406
1407
  cp.instances = this.instances.slice()
1407
1408
  cp.configCounter = this.configCounter
1409
+ cp.testConfig = this.testConfig
1408
1410
 
1409
1411
  cp.initConfig = _.cloneDeep(this.initConfig)
1410
1412
  cp.defaultConfig()
@@ -1450,7 +1452,7 @@ class Config {
1450
1452
  this.config.bridges && this.config.bridges.forEach((bridge) => { bridge.uuid = this._uuid })
1451
1453
  this.config.words && setWordsUUIDs(this.config.words, this._uuid)
1452
1454
  this.config.operators && this.config.operators.forEach((operator) => { operator.uuid = this._uuid })
1453
- const ids = Array.from(new Set((this.config.bridges && this.config.bridges.map((bridge) => bridge.id)) || []))
1455
+ const ids = Array.from(new Set(this.config.bridges.map((bridge) => bridge.id)))
1454
1456
  ids.sort()
1455
1457
  this.config.namespaces = {}
1456
1458
  // if (true || ids.length > 0) {
@@ -1682,7 +1684,7 @@ class Config {
1682
1684
  }
1683
1685
 
1684
1686
  const kmsUuids = this.configs.map((km) => km.uuid)
1685
- const bridgesUuids = (this.config.bridges && this.config.bridges.map((bridge) => bridge.uuid).filter((uuid) => uuid)) || []
1687
+ const bridgesUuids = this.config.bridges.map((bridge) => bridge.uuid).filter((uuid) => uuid)
1686
1688
  let result = true
1687
1689
  bridgesUuids.forEach((buuid) => {
1688
1690
  if (!kmsUuids.includes(buuid)) {
@@ -1752,6 +1754,7 @@ class Config {
1752
1754
  this.resetDelta()
1753
1755
  const debug = this.config.debug;
1754
1756
  this.config = _.cloneDeep(this.initConfig)
1757
+ this.hierarchy = new Digraph(this.config.hierarchy)
1755
1758
  if (debug) {
1756
1759
  this.config.debug = debug
1757
1760
  }
@@ -1766,6 +1769,7 @@ class Config {
1766
1769
  }
1767
1770
  this.config.objects.namespaced = {}
1768
1771
  this.resetWasInitialized()
1772
+ this.resetMotivations()
1769
1773
 
1770
1774
  // reorder configs base on load ordering
1771
1775
  {
@@ -1811,8 +1815,8 @@ class Config {
1811
1815
  config.wasInitialized = false
1812
1816
  // TODO change name of config: to baseConfig:
1813
1817
  const kmFn = (name) => this.getConfig(name)
1814
- const hierarchy = new Digraph((config.config || {}).hierarchy || [])
1815
- const args = { isModule, addWord: aw, km: kmFn, hierarchy, config, baseConfig: this, currentConfig: config, uuid: config._uuid, objects: namespacedObjects, namespace, api: config.api }
1818
+ // const hierarchy = new Digraph((config.config || {}).hierarchy)
1819
+ const args = { isModule, addWord: aw, km: kmFn, hierarchy: this.hierarchy, config, baseConfig: this, currentConfig: config, uuid: config._uuid, objects: namespacedObjects, namespace, api: config.api }
1816
1820
  config.initializerFn(args)
1817
1821
  if (config.initAfterApi) {
1818
1822
  initAfterApis.push({ config, args })
@@ -2009,8 +2013,7 @@ class Config {
2009
2013
  }
2010
2014
 
2011
2015
  if (config.hierarchy) {
2012
- let hierarchy = config.hierarchy
2013
- hierarchy = hierarchy.map((h) => {
2016
+ helpers.mapInPlace(config.hierarchy, (h) => {
2014
2017
  if (Array.isArray(h)) {
2015
2018
  return h.map((id) => toNS(id))
2016
2019
  } else {
@@ -2019,7 +2022,6 @@ class Config {
2019
2022
  return Object.assign({}, h, { child: toNS(h.child), parent: toNS(h.parent) })
2020
2023
  }
2021
2024
  })
2022
- config.hierarchy = hierarchy
2023
2025
  }
2024
2026
 
2025
2027
  if (config.priorities) {
package/src/generators.js CHANGED
@@ -195,10 +195,12 @@ class Generators {
195
195
  } catch( e ) {
196
196
  // the next if handle this
197
197
  generated = null
198
+ e.retryCall = () => generator.apply(args, objects, g, args.gs, context, hierarchy, config, response, log)
199
+ const help = 'The error has a retryCall property that will recall the function that failed.'
198
200
  if (e.stack && e.message) {
199
- errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.toString()} stack is ${e.stack}. Generator is ${generator.toString()}`
201
+ errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.toString()} stack is ${e.stack}. Generator is ${generator.toString()}. ${help}`
200
202
  } else if (e.error) {
201
- errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.error.join()}. Generator is ${generator.toString()}`
203
+ errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.error.join()}. Generator is ${generator.toString()}. ${help}`
202
204
  } else {
203
205
  errorMessage = e.toString()
204
206
  }
package/src/helpers.js CHANGED
@@ -232,7 +232,14 @@ const validProps = (valids, object, type) => {
232
232
  }
233
233
  }
234
234
 
235
+ const mapInPlace = (list, fn) => {
236
+ for (let i = 0; i < list.length; ++i) {
237
+ list[i] =fn(list[i])
238
+ }
239
+ }
240
+
235
241
  module.exports = {
242
+ mapInPlace,
236
243
  validProps,
237
244
  args,
238
245
  safeEquals,
package/src/semantics.js CHANGED
@@ -189,10 +189,12 @@ class Semantics {
189
189
  } catch( e ) {
190
190
  contextPrime = null
191
191
  let errorMessage
192
+ e.retryCall = () => semantic.apply(args, context, s, log, options)
193
+ const help = 'The error has a retryCall property that will recall the function that failed.'
192
194
  if (e.stack && e.message) {
193
- errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.toString()} stack is ${e.stack}. Semantic is ${semantic.toString()}`
195
+ errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.toString()} stack is ${e.stack}. Semantic is ${semantic.toString()}. ${help}`
194
196
  } else if (e.error) {
195
- errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.error.join()}. Semantic is ${semantic.toString()}`
197
+ errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.error.join()}. Semantic is ${semantic.toString()}. ${help}`
196
198
  } else {
197
199
  errorMessage = e.toString();
198
200
  }