theprogrammablemind 8.0.0-beta.4 → 8.0.0-beta.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client.js CHANGED
@@ -237,9 +237,8 @@ const setupArgs = (args, config, logs, hierarchy, uuidForScoping) => {
237
237
  config.setArgs(args)
238
238
  }
239
239
 
240
- const gs = (g) => (contexts, separator, lastSeparator) => {
240
+ const gs = (g) => async (contexts, separator, lastSeparator) => {
241
241
  if (!Array.isArray(contexts)) {
242
- debugger
243
242
  throw new Error('Expected a list')
244
243
  }
245
244
 
@@ -253,7 +252,7 @@ const gs = (g) => (contexts, separator, lastSeparator) => {
253
252
  let nextSeparator = ''
254
253
  for (let i = 0; i < contexts.length; ++i) {
255
254
  const context = contexts[i]
256
- const value = g(context)
255
+ const value = await g(context)
257
256
  if (i > 0) {
258
257
  if (i === contexts.length - 1) {
259
258
  nextSeparator = lastSeparator
@@ -290,12 +289,12 @@ const analyzeMetaData = (right, wrong) => {
290
289
  return []
291
290
  }
292
291
 
293
- const processContexts = (contexts, params) => {
292
+ const processContexts = async (contexts, params) => {
294
293
  const contextsPrime = []
295
294
  const generated = []
296
295
  const logs = []
297
296
  for (const context of contexts) {
298
- const result = processContext(context, Object.assign({}, params, { logs }))
297
+ const result = await processContext(context, Object.assign({}, params, { logs }))
299
298
  contextsPrime.push(result.context)
300
299
  generated.push(result.generated)
301
300
  }
@@ -311,7 +310,7 @@ const getObjects = (objects) => {
311
310
  }
312
311
  }
313
312
 
314
- const processContext = (context, { objects = {}, config, logs = [] }) => {
313
+ const processContext = async (context, { objects = {}, config, logs = [] }) => {
315
314
  const generators = config.getGenerators(logs)
316
315
  const semantics = config.getSemantics(logs)
317
316
 
@@ -329,10 +328,10 @@ const processContext = (context, { objects = {}, config, logs = [] }) => {
329
328
  const args = { objects, response, getObjects: getObjects(objects) }
330
329
  setupArgs(args, config, logs, hierarchy)
331
330
 
332
- context = semantics.apply(args, context)
333
- const generated = generators.apply(args, context)
331
+ context = await semantics.apply(args, context)
332
+ const generated = await generators.apply(args, context)
334
333
  const assumed = { paraphrase: true, response: false, isResponse: false }
335
- const paraphrases = generators.apply({ ...args, assumed }, context, { paraphrase: true, response: false, isResponse: false })
334
+ const paraphrases = await generators.apply({ ...args, assumed }, context, { paraphrase: true, response: false, isResponse: false })
336
335
  let responses = []
337
336
  if (context.isResponse) {
338
337
  responses = generated
@@ -447,7 +446,7 @@ const setupContexts = (rawContexts) => {
447
446
  return contexts
448
447
  }
449
448
 
450
- const processContextsB = ({ config, hierarchy, semantics, generators, json, isTest, rebuildingTemplate, isInstance, instance, query, data, retries, url, commandLineArgs }) => {
449
+ const processContextsB = async ({ config, hierarchy, semantics, generators, json, isTest, rebuildingTemplate, isInstance, instance, query, data, retries, url, commandLineArgs }) => {
451
450
  // TODO fix this name to contextsPrime
452
451
  const contextsPrime = []
453
452
  const generatedPrime = []
@@ -480,7 +479,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
480
479
  if (!config.get('skipSemantics')) {
481
480
  const semantics = config.getSemantics(json.logs)
482
481
  try {
483
- contextPrime = semantics.apply(args, context)
482
+ contextPrime = await semantics.apply(args, context)
484
483
  } catch (e) {
485
484
  if (e.message == 'Maximum call stack size exceeded') {
486
485
  const mostCalled = semantics.getMostCalled()
@@ -490,7 +489,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
490
489
  if (isInstance) {
491
490
  console.log('error', e.error)
492
491
  }
493
- contextPrime = semantics.apply(args, {
492
+ contextPrime = await semantics.apply(args, {
494
493
  marker: 'error',
495
494
  context,
496
495
  text: e ? e.toString() : 'not available',
@@ -506,11 +505,11 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
506
505
  continue
507
506
  }
508
507
  let assumed = { isResponse: true }
509
- const generated = contextPrime.isResponse ? config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
508
+ const generated = contextPrime.isResponse ? await config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
510
509
  let generatedParenthesized = []
511
510
  if (generateParenthesized) {
512
511
  config.parenthesized = true
513
- generatedParenthesized = contextPrime.isResponse ? config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
512
+ generatedParenthesized = contextPrime.isResponse ? await config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed) : ''
514
513
  config.parenthesized = false
515
514
  }
516
515
  // assumed = { paraphrase: true, response: false };
@@ -518,11 +517,11 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
518
517
  if (generateParenthesized) {
519
518
  config.parenthesized = false
520
519
  }
521
- const paraphrases = config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
520
+ const paraphrases = await config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
522
521
  let paraphrasesParenthesized = []
523
522
  if (generateParenthesized) {
524
523
  config.parenthesized = true
525
- paraphrasesParenthesized = config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
524
+ paraphrasesParenthesized = await config.getGenerators(json.logs).apply({ ...args, assumed }, contextPrime, assumed)
526
525
  config.parenthesized = false
527
526
  }
528
527
  contextsPrime.push(contextPrime)
@@ -634,7 +633,7 @@ const setupProcessB = ({ config, initializer, allowDelta = false } = {}) => {
634
633
  }
635
634
 
636
635
  // instance template loadTemplate
637
- const loadInstance = (config, instance) => {
636
+ const loadInstance = async (config, instance) => {
638
637
  const transitoryMode = global.transitoryMode
639
638
  global.transitoryMode = false
640
639
 
@@ -668,7 +667,7 @@ const loadInstance = (config, instance) => {
668
667
 
669
668
  const uuid = config.nameToUUID(instance.name)
670
669
  setupArgs(args, config, config.logs, hierarchy, uuid)
671
- results.apply(args)
670
+ await results.apply(args)
672
671
  } else {
673
672
  if (results.skipSemantics) {
674
673
  config.config.skipSemantics = results.skipSemantics
@@ -676,7 +675,7 @@ const loadInstance = (config, instance) => {
676
675
  const args = { config, hierarchy, json: results, commandLineArgs: {} }
677
676
  args.isInstance = `instance${i}`
678
677
  args.instance = ''
679
- processContextsB(args)
678
+ await processContextsB(args)
680
679
  if (results.skipSemantics) {
681
680
  config.config.skipSemantics = null
682
681
  }
@@ -701,7 +700,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
701
700
  // ensure same start state
702
701
  try {
703
702
  if (writeTests) {
704
- config.rebuild()
703
+ await config.rebuild()
705
704
  const objects = getObjects(config.config.objects)(config.uuid)
706
705
  }
707
706
  } catch (error) {
@@ -773,7 +772,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
773
772
  start = runtime.performance.performance.now()
774
773
  }
775
774
  const { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime } =
776
- processContextsB({ isTest, rebuildingTemplate, config, hierarchy, json, commandLineArgs /*, generators, semantics */ })
775
+ await processContextsB({ isTest, rebuildingTemplate, config, hierarchy, json, commandLineArgs /*, generators, semantics */ })
777
776
  if (isTest) {
778
777
  end = runtime.performance.performance.now()
779
778
  clientSideTime = end - start
@@ -865,8 +864,12 @@ const getConfigForTest = (config, testConfig) => {
865
864
 
866
865
  const runTest = async (config, expected, { args, verbose, testConfig, debug }) => {
867
866
  const test = expected.query
867
+ if (args.query && args.query != test) {
868
+ // no run this
869
+ return
870
+ }
868
871
  // initialize in between test so state is not preserved since the test was adding without state
869
- config.rebuild()
872
+ await config.rebuild()
870
873
  const errorHandler = (error) => {
871
874
  if (error.metadata) {
872
875
  const priorities = analyzeMetaData(expected.metadata, error.metadata)
@@ -1012,7 +1015,7 @@ const runTests = async (config, testFile, juicyBits) => {
1012
1015
  }
1013
1016
 
1014
1017
  const saveTest = async (testFile, config, test, expected, testConfig, saveDeveloper) => {
1015
- config.rebuild()
1018
+ await config.rebuild()
1016
1019
  const objects = getObjects(config.config.objects)(config.uuid)
1017
1020
  console.log(test)
1018
1021
  const result = await _process(config, test, { isTest: true })
@@ -1033,11 +1036,11 @@ const saveTestsHelper = async (testFile, config, tests, todo, testConfig, saveDe
1033
1036
  return
1034
1037
  }
1035
1038
  const test = todo.pop()
1036
- config.rebuild()
1039
+ await config.rebuild()
1037
1040
  const result = await saveTest(testFile, config, test, tests[test], testConfig, saveDeveloper)
1038
1041
  // initialize in between test so state is not preserved since the test was adding without state
1039
1042
  // config.initialize({force: true})
1040
- config.rebuild()
1043
+ await config.rebuild()
1041
1044
  return saveTestsHelper(testFile, config, tests, todo, testConfig, saveDeveloper)
1042
1045
  }
1043
1046
 
@@ -1356,7 +1359,7 @@ const rebuildTemplate = async ({ config, target, previousResultss, startOfChange
1356
1359
  if (previousResults && previousResults.query == query.query) {
1357
1360
  results = previousResults
1358
1361
  prMessage = ' Using previous results. use -rtf for a hard rebuild of everything on the server side.'
1359
- loadInstance(config, { resultss: [results] })
1362
+ await loadInstance(config, { resultss: [results] })
1360
1363
  } else {
1361
1364
  results = await _process(config, query.query, { initializer, rebuildingTemplate: true })
1362
1365
  }
@@ -1582,7 +1585,7 @@ const knowledgeModuleImpl = async ({
1582
1585
  parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
1583
1586
  parser.add_argument('-tv', '--testVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. Create tests by running with the --query or --loop with the --save flag' })
1584
1587
  // parser.add_argument('-ttr', '--testToRun', { help: 'Only the specified test will be run' })
1585
- parser.add_argument('-tva', '--testAllVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. All the tests will be run instead of stopping at first failure. Create tests by running with the --query or --loop with the --save flag' })
1588
+ parser.add_argument('-tva', '--testAllVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. All the tests will be run instead of stopping at first failure. Create tests by running with the --query or --loop with the --save flag. if -q is specified the tests will be run for just the specified query.' })
1586
1589
  parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
1587
1590
  parser.add_argument('-n', '--count', { help: 'Number of times to run the tests. Default is one. Use this to check for flakey test. If possible the system will print out a message with the word "hint" suggesting how to fix the problem' })
1588
1591
  // parser.add_argument('-b', '--build', { help: 'Specify the template file name of the form <kmName>. There should be a file called <baseKmName>.<kmName>.template.json with the queries to run. For example { queries: [...] }. The template file will be run and generate an instantiation called <baseKmName>.<kmName>.instance.json and a file called <kmName>.js that will load the template file (this is file generated only if not already existing) and a test file called <KmName>.tests.json. This can then be loaded into an instance of the current knowledge module to setup initial conditions.' })
@@ -1628,7 +1631,7 @@ const knowledgeModuleImpl = async ({
1628
1631
  global.pauseDebugging = true
1629
1632
  }
1630
1633
 
1631
- const config = createConfig()
1634
+ const config = await createConfig()
1632
1635
  setupConfig(config)
1633
1636
  processResults = processResults({ config, errorHandler })
1634
1637
 
@@ -1663,7 +1666,7 @@ const knowledgeModuleImpl = async ({
1663
1666
  throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
1664
1667
  }
1665
1668
  } catch (e) {
1666
- throw new Error(`Error parsing JSON of the checkForLoop argument. ${e}`)
1669
+ throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
1667
1670
  }
1668
1671
  } else {
1669
1672
  if (process.argv.includes('--checkForLoop') || process.argv.includes('-cl')) {
@@ -1860,7 +1863,7 @@ const knowledgeModuleImpl = async ({
1860
1863
  config.config.rebuild = true
1861
1864
  }
1862
1865
  try {
1863
- config.load(template.template, template.instance, { rebuild: needsRebuild.needsRebuild || options.rebuild, previousResultss: needsRebuild.previousResultss, startOfChanges: needsRebuild.startOfChanges })
1866
+ await config.load(template.template, template.instance, { rebuild: needsRebuild.needsRebuild || options.rebuild, previousResultss: needsRebuild.previousResultss, startOfChanges: needsRebuild.startOfChanges })
1864
1867
  } catch (e) {
1865
1868
  console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
1866
1869
  runtime.process.exit(-1)
@@ -1877,6 +1880,9 @@ const knowledgeModuleImpl = async ({
1877
1880
  config.config.retrain = true
1878
1881
  }
1879
1882
 
1883
+ if (args.saveDeveloper) {
1884
+ args.save = true
1885
+ }
1880
1886
  if (args.test || args.testVerbose || args.testAllVerbose || args.save) {
1881
1887
  global.transitoryMode = true
1882
1888
  }
@@ -1994,7 +2000,7 @@ const knowledgeModuleImpl = async ({
1994
2000
  lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
1995
2001
  lines.log()
1996
2002
  if (args.vimdiff) {
1997
- vimdiff(result.actual.checked, result.expected.checked)
2003
+ show('checked properties for objects', result.expected.checked, result.actual.checked)
1998
2004
  }
1999
2005
  newError = true
2000
2006
  headerShown = true
@@ -2012,7 +2018,7 @@ const knowledgeModuleImpl = async ({
2012
2018
  lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
2013
2019
  lines.log()
2014
2020
  if (args.vimdiff) {
2015
- vimdiff(result.actual.checkedContexts, result.expected.checkedContexts)
2021
+ show('checked properties for context', result.expected.checkedContexts, result.actual.checkedContexts)
2016
2022
  }
2017
2023
  newError = true
2018
2024
  headerShown = true
@@ -2105,7 +2111,7 @@ const knowledgeModuleImpl = async ({
2105
2111
  }
2106
2112
  printConfig()
2107
2113
  } else {
2108
- const initConfig = (config) => {
2114
+ const initConfig = async (config) => {
2109
2115
  if (template) {
2110
2116
  if (config.needsRebuild(template.template, template.instance, { isModule: !isProcess }).needsRebuild) {
2111
2117
  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.`
@@ -2140,24 +2146,19 @@ const knowledgeModuleImpl = async ({
2140
2146
 
2141
2147
  if (template) {
2142
2148
  try {
2143
- config.load(template.template, template.instance)
2149
+ await config.load(template.template, template.instance)
2144
2150
  } catch (e) {
2145
2151
  errorHandler(e)
2146
2152
  }
2147
2153
  }
2148
2154
  }
2149
2155
 
2150
- createConfigExport = (additionalConfig) => {
2156
+ createConfigExport = async () => {
2151
2157
  if (createConfig.cached) {
2152
2158
  return createConfig.cached
2153
2159
  }
2154
- const config = createConfig(acceptsAdditionalConfig ? additionalConfig : null)
2155
- if (!acceptsAdditionalConfig && additionalConfig) {
2156
- config.stop_auto_rebuild()
2157
- additionalConfig(config)
2158
- config.restart_auto_rebuild()
2159
- }
2160
- initConfig(config)
2160
+ const config = await createConfig()
2161
+ await initConfig(config)
2161
2162
  // config.rebuild({ isModule: true })
2162
2163
  createConfig.cached = config
2163
2164
  return createConfig.cached
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "devDependencies": {
3
- "eslint-plugin-import": "^2.23.4",
4
- "jest": "^29.7.0",
5
- "@typescript-eslint/parser": "^4.28.4",
6
3
  "@typescript-eslint/eslint-plugin": "^4.28.4",
7
- "eslint-plugin-node": "^11.1.0",
4
+ "@typescript-eslint/parser": "^4.28.4",
5
+ "eslint": "^7.31.0",
8
6
  "eslint-config-standard": "^16.0.3",
7
+ "eslint-plugin-import": "^2.23.4",
8
+ "eslint-plugin-node": "^11.1.0",
9
9
  "eslint-plugin-promise": "^5.1.0",
10
- "eslint": "^7.31.0"
10
+ "jest": "^29.7.0"
11
11
  },
12
12
  "scripts": {
13
13
  "to:debug": "node inspect node_modules/.bin/jest --runInBand -t NEO23",
@@ -52,19 +52,18 @@
52
52
  ],
53
53
  "author": "dev@thinktelligence.com",
54
54
  "dependencies": {
55
+ "base-64": "^1.0.0",
55
56
  "deep-equal": "^2.0.4",
56
- "uuid": "^8.3.2",
57
+ "fs": "0.0.1-security",
57
58
  "json-diff": "^1.0.3",
59
+ "json-stable-stringify": "^1.0.1",
58
60
  "lodash": "^4.17.20",
59
- "fs": "0.0.1-security",
60
- "base-64": "^1.0.0",
61
- "sort-json": "^2.0.0",
61
+ "node-fetch": "^2.6.1",
62
62
  "readline": "^1.3.0",
63
63
  "scriptjs": "^2.5.9",
64
- "underscore": "^1.13.1",
65
- "json-stable-stringify": "^1.0.1",
66
- "node-fetch": "^2.6.1"
64
+ "sort-json": "^2.0.0",
65
+ "uuid": "^8.3.2"
67
66
  },
68
- "version": "8.0.0-beta.4",
67
+ "version": "8.0.0-beta.40",
69
68
  "license": "UNLICENSED"
70
69
  }
package/src/config.js CHANGED
@@ -262,7 +262,12 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
262
262
  }
263
263
  if (bridge.children) {
264
264
  for (const child of bridge.children) {
265
- config.addHierarchy(child, bridge.id)
265
+ // config.addHierarchy(child, bridge.id)
266
+ if (child.child) {
267
+ config.addHierarchy(child.child, bridge.id, child.instance)
268
+ } else {
269
+ config.addHierarchy(child, bridge.id)
270
+ }
266
271
  }
267
272
  }
268
273
  if (bridge.operator) {
@@ -270,12 +275,20 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
270
275
  }
271
276
  if (bridge.parents) {
272
277
  for (const parent of bridge.parents) {
273
- config.addHierarchy(bridge.id, parent)
278
+ if (parent.parent) {
279
+ config.addHierarchy(bridge.id, parent.parent, parent.instance)
280
+ } else {
281
+ config.addHierarchy(bridge.id, parent)
282
+ }
274
283
  }
275
284
  }
276
285
  if (bridge.isA) {
277
286
  for (const parent of bridge.isA) {
278
- config.addHierarchy(bridge.id, parent)
287
+ if (parent.parent) {
288
+ config.addHierarchy(bridge.id, parent.parent, parent.instance)
289
+ } else {
290
+ config.addHierarchy(bridge.id, parent)
291
+ }
279
292
  }
280
293
  }
281
294
  if (bridge.before) {
@@ -339,7 +352,7 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
339
352
 
340
353
  const generator = {
341
354
  where: bridge.generatorp.where || bridge.where || client.where(4),
342
- match: (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && match(args),
355
+ match: async (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && await match(args),
343
356
  apply: (args) => apply(args),
344
357
  applyWrapped: apply,
345
358
  property: 'generatorp'
@@ -356,7 +369,7 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
356
369
  const level = bridge.generatorr.level >= 0 ? bridge.generatorr.level : bridge.level + 1
357
370
  const generator = {
358
371
  where: bridge.generatorr.where || bridge.where || client.where(4),
359
- match: (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && match(args),
372
+ match: async (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && await match(args),
360
373
  apply: (args) => apply(args),
361
374
  applyWrapped: apply,
362
375
  property: 'generatorr'
@@ -551,7 +564,7 @@ function isLetter (char) {
551
564
  }
552
565
  */
553
566
 
554
- function configDup (config, options) {
567
+ async function configDup (config, options) {
555
568
  if (config instanceof Config) {
556
569
  return config.copy(options)
557
570
  }
@@ -691,9 +704,9 @@ class KM {
691
704
  return true
692
705
  }
693
706
 
694
- copy2 (options) {
707
+ async copy2 (options) {
695
708
  // greg -> add a flag to say don't init the api's
696
- const config = configDup(this._config, options)
709
+ const config = await configDup(this._config, options)
697
710
  const km = new KM({
698
711
  config,
699
712
  getCounter: options.getCounter,
@@ -705,10 +718,10 @@ class KM {
705
718
  return km // copy2()
706
719
  }
707
720
 
708
- copy () {
721
+ async copy () {
709
722
  const km = new KM({
710
723
  name: this._name,
711
- config: configDup(this._config),
724
+ config: await configDup(this._config),
712
725
  // _uuid: uuidv4(),
713
726
  _uuid: this._config.getCounter(this._config._name),
714
727
  getCounter: (name) => this._config.getCounter(name),
@@ -760,7 +773,7 @@ const multiApiImpl = (initializer) => {
760
773
  multiApi: true,
761
774
 
762
775
  // multi functions
763
- add: (config, multiApi, api) => {
776
+ add: async (config, multiApi, api) => {
764
777
  initializer(config, api)
765
778
  const name = api.getName()
766
779
  multiApi.apis[name] = api
@@ -798,17 +811,6 @@ class Config {
798
811
  return config_toServer(config)
799
812
  }
800
813
 
801
- base () {
802
- const base = new Config()
803
- for (const km of this.configs.reverse()) {
804
- if (km.isSelf) {
805
- continue
806
- }
807
- base.add(km.config)
808
- }
809
- return base
810
- }
811
-
812
814
  getInfo () {
813
815
  const name = this.name
814
816
  const includes = this.configs.slice(1).map((km) => km.config.name)
@@ -1003,8 +1005,8 @@ class Config {
1003
1005
  return instance
1004
1006
  }
1005
1007
  */
1006
- getEvaluator (s, calls, log, context) {
1007
- const instance = s({ ...context, evaluate: true })
1008
+ async getEvaluator (s, calls, log, context) {
1009
+ const instance = await s({ ...context, evaluate: true })
1008
1010
  calls.touch(instance)
1009
1011
  if (!instance.evalue && !instance.verbatim && !instance.value) {
1010
1012
  this.warningNotEvaluated(log, context)
@@ -1021,7 +1023,7 @@ class Config {
1021
1023
  fragmentInstantiator (contexts) {
1022
1024
  return new Object({
1023
1025
  contexts: () => contexts,
1024
- instantiate: (mappings) => {
1026
+ instantiate: async (mappings) => {
1025
1027
  const instantiated = _.cloneDeep(contexts)
1026
1028
  // const todo = [...instantiated]
1027
1029
  // const todo = [...instantiated]
@@ -1029,8 +1031,8 @@ class Config {
1029
1031
  while (todo.length > 0) {
1030
1032
  const context = todo.pop()
1031
1033
  for (const mapping of mappings) {
1032
- if (mapping.match({ context })) {
1033
- mapping.apply({ context })
1034
+ if (await mapping.match({ context })) {
1035
+ await mapping.apply({ context })
1034
1036
  }
1035
1037
  }
1036
1038
  for (const key of Object.keys(context)) {
@@ -1197,7 +1199,9 @@ class Config {
1197
1199
  // console.log("instanceFragments", instanceFragments)
1198
1200
  }
1199
1201
  }
1200
- if (startOfChanges || instance.resultss) {
1202
+ if (startOfChanges) {
1203
+ return { needsRebuild: true, startOfChanges, previousResultss: instance.resultss }
1204
+ } else if (startOfChanges || instance.resultss) {
1201
1205
  return { needsRebuild: !(instance && sameQueries && sameFragments), startOfChanges, previousResultss: instance.resultss }
1202
1206
  } else {
1203
1207
  return { needsRebuild: !(instance && sameQueries && sameFragments) }
@@ -1222,7 +1226,7 @@ class Config {
1222
1226
  }
1223
1227
 
1224
1228
  // loadTemplate
1225
- load (template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }) {
1229
+ async load (template, instance, options = { rebuild: false, previousResultss: undefined, startOfChanges: undefined }) {
1226
1230
  this.validifyTemplate(template)
1227
1231
  instance.template = template
1228
1232
  this.logs.push(`loading template for ${this.name}`)
@@ -1255,7 +1259,7 @@ class Config {
1255
1259
  instance.name = this.name
1256
1260
  this.initInstances.push(instance)
1257
1261
  this.instances.push(instance)
1258
- client.loadInstance(this, instance)
1262
+ await client.loadInstance(this, instance)
1259
1263
  }
1260
1264
  }
1261
1265
  }
@@ -1309,9 +1313,9 @@ class Config {
1309
1313
  }
1310
1314
  }
1311
1315
 
1312
- addHierarchy (child, parent) {
1316
+ addHierarchy (child, parent, instance) {
1313
1317
  if (child && parent || !child || Array.isArray(child) || (typeof child === 'string' && !parent)) {
1314
- this.addHierarchyChildParent(child, parent)
1318
+ this.addHierarchyChildParent(child, parent, instance)
1315
1319
  // this.addHierarchyProperties ({ child, parent })
1316
1320
  } else {
1317
1321
  this.addHierarchyProperties(child)
@@ -1319,26 +1323,32 @@ class Config {
1319
1323
  }
1320
1324
 
1321
1325
  addHierarchyProperties (edge) {
1322
- const { child, parent } = edge
1326
+ const { child, parent, instance } = edge
1323
1327
  if (typeof child !== 'string') {
1324
1328
  throw new Error(`addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`)
1325
1329
  }
1326
1330
  if (typeof parent !== 'string') {
1327
1331
  throw new Error(`addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`)
1328
1332
  }
1333
+ if (instance && typeof instance !== 'boolean') {
1334
+ throw new Error(`addHierarchy expected instance property to be a boolean or undefined. got ${JSON.stringify(instance)}`)
1335
+ }
1329
1336
  debugHierarchy([child, parent])
1330
1337
  this.config.hierarchy.push(edge)
1331
1338
  // TODO greg11 this.hierarchy.addEdge(edge)
1332
- this._delta.json.hierarchy.push([child, parent])
1339
+ this._delta.json.hierarchy.push([child, parent, instance || false])
1333
1340
  }
1334
1341
 
1335
- addHierarchyChildParent (child, parent) {
1342
+ addHierarchyChildParent (child, parent, instance) {
1336
1343
  if (typeof child !== 'string') {
1337
1344
  throw new Error(`addHierarchy expected child to be a string. got ${JSON.stringify(child)}`)
1338
1345
  }
1339
1346
  if (typeof parent !== 'string') {
1340
1347
  throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
1341
1348
  }
1349
+ if (instance && typeof instance !== 'boolean') {
1350
+ throw new Error(`addHierarchy expected instance property to be a boolean or undefined. got ${JSON.stringify(instance)}`)
1351
+ }
1342
1352
  debugHierarchy([child, parent])
1343
1353
  if (this.config.hierarchy.find((element) => {
1344
1354
  const hc = hierarchyCanonical(element)
@@ -1349,9 +1359,9 @@ class Config {
1349
1359
  return
1350
1360
  }
1351
1361
 
1352
- this.config.hierarchy.push([child, parent])
1362
+ this.config.hierarchy.push([child, parent, instance || false])
1353
1363
  // this.hierarchy.addEdge([child, parent])
1354
- this._delta.json.hierarchy.push([child, parent])
1364
+ this._delta.json.hierarchy.push([child, parent, instance || false])
1355
1365
  }
1356
1366
 
1357
1367
  getBridge (id, level) {
@@ -1608,18 +1618,18 @@ class Config {
1608
1618
  return params
1609
1619
  }
1610
1620
 
1611
- processContexts (contexts, params) {
1612
- client.processContexts(contexts, this.getParams())
1613
- }
1614
-
1615
- processContext (context) {
1616
- return client.processContext(context, this.getParams())
1621
+ async processContext (context) {
1622
+ return await client.processContext(context, this.getParams())
1617
1623
  }
1618
1624
 
1619
1625
  process (query, options) {
1620
1626
  return client.process(this, query, options)
1621
1627
  }
1622
1628
 
1629
+ query (query, options) {
1630
+ return this.process(query, options)
1631
+ }
1632
+
1623
1633
  processQuery (query, options) {
1624
1634
  return this.process(query, options)
1625
1635
  }
@@ -1797,24 +1807,6 @@ class Config {
1797
1807
  // when running configs any bridges added are marked as transitory so that the associated will ignore those op's
1798
1808
  this.transitoryMode = false
1799
1809
 
1800
- // check for duplicate bridges
1801
- if (config && config.bridges) {
1802
- let duplicated = new Set()
1803
- const seen = new Set()
1804
- for (const bridge of config.bridges) {
1805
- const id = `${bridge.id}/${bridge.level}`
1806
- if (seen.has(id)) {
1807
- duplicated.add(id)
1808
- } else {
1809
- seen.add(id)
1810
- }
1811
- }
1812
- duplicated = Array.from(duplicated)
1813
- if (duplicated.length > 0) {
1814
- throw new Error(`In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`)
1815
- }
1816
- }
1817
-
1818
1810
  if (config && config.words) {
1819
1811
  initWords(config.words)
1820
1812
  isValidWordDef(config.words)
@@ -1863,6 +1855,7 @@ class Config {
1863
1855
  }
1864
1856
  this.get('objects').namespaced[this._uuid] = {}
1865
1857
  this.valid()
1858
+ this.checks()
1866
1859
  debugConfigProps(this.config)
1867
1860
  }
1868
1861
 
@@ -1874,9 +1867,9 @@ class Config {
1874
1867
  this._stop_auto_rebuild = true
1875
1868
  }
1876
1869
 
1877
- restart_auto_rebuild() {
1870
+ async restart_auto_rebuild() {
1878
1871
  this._stop_auto_rebuild = false
1879
- this.rebuild()
1872
+ await this.rebuild()
1880
1873
  }
1881
1874
 
1882
1875
  getAddedArgs (args) {
@@ -1895,8 +1888,8 @@ class Config {
1895
1888
  }
1896
1889
  }
1897
1890
 
1898
- set multiApi (initializer) {
1899
- this.api = multiApiImpl(initializer)
1891
+ async setMultiApi (initializer) {
1892
+ await this.setApi(multiApiImpl(initializer))
1900
1893
  }
1901
1894
 
1902
1895
  get multiApi () {
@@ -1944,31 +1937,26 @@ class Config {
1944
1937
  }
1945
1938
  }
1946
1939
 
1947
- addAPI (api) {
1940
+ async addAPI (api) {
1941
+ // console.trace()
1942
+ // throw "addAPI"
1948
1943
  if (this._api && this._api.multiApi) {
1949
- this._api.add(this, this._api, api)
1944
+ await this._api.add(this, this._api, api)
1950
1945
  } else {
1951
1946
  throw new Error('Can only add apis to a multi-api')
1952
1947
  }
1953
1948
  }
1954
1949
 
1955
- set api (value) {
1950
+ async setApi (value) {
1956
1951
  if (!value.initialize) {
1957
1952
  throw new Error(`Expected the API to have an initialize function for ${this.name}.`)
1958
1953
  }
1959
1954
 
1960
1955
  if (this._api && this._api.multiApi) {
1961
- this._api.add(this, this._api, value)
1956
+ await this._api.add(this, this._api, value)
1962
1957
  } else {
1963
1958
  this._api = _.cloneDeep(value)
1964
- /*
1965
- if (this._api) {
1966
- // this._api.objects = this.config.objects
1967
- // this._api.config = () => this
1968
- // this._api.uuid = this._uuid
1969
- }
1970
- */
1971
- this.rebuild()
1959
+ await this.rebuild()
1972
1960
  }
1973
1961
  }
1974
1962
 
@@ -1988,7 +1976,7 @@ class Config {
1988
1976
  }
1989
1977
 
1990
1978
  // remove all added modules and initialize with the init config
1991
- resetToOne () {
1979
+ async resetToOne () {
1992
1980
  /*
1993
1981
  this.config = _.cloneDeep(this.initConfig)
1994
1982
  this.configs = [this.configs[0]]
@@ -1997,11 +1985,8 @@ class Config {
1997
1985
  */
1998
1986
  this.configs = [this.configs[0]]
1999
1987
  this.defaultConfig()
2000
- if (!this.initializeFn) {
2001
- // TODO move this to the default initializer
2002
- Object.assign(this.config.objects, _.cloneDeep(this.initConfig.objects || {}))
2003
- }
2004
- this.initializeConfigFromConfigs({ others: [], objects: this.config.objects.namespaced, moreNames: [], callInitializers: false })
1988
+ Object.assign(this.config.objects, _.cloneDeep(this.initConfig.objects || {}))
1989
+ await this.initializeConfigFromConfigs({ others: [], objects: this.config.objects.namespaced, moreNames: [], callInitializers: false })
2005
1990
  const map = {}
2006
1991
  for (let i = 0; i < this.configs.length; ++i) {
2007
1992
  map[this.configs[i].uuid] = this.configs[i].uuid
@@ -2023,17 +2008,18 @@ class Config {
2023
2008
  runtime.fs.writeFileSync(fn, JSON.stringify(this.config, 0, 2))
2024
2009
  }
2025
2010
 
2026
- copy (options = { callInitializers: true }) {
2027
- }
2028
-
2029
- copy (options = { callInitializers: true }) {
2011
+ async copy (options = { callInitializers: true }) {
2030
2012
  this.valid()
2031
2013
  const cp = new Config()
2032
2014
  cp.logs = []
2033
2015
  cp.maxDepth = this.maxDepth
2034
2016
  cp.debugLoops = this.debugLoops
2035
2017
  cp.transitoryMode = this.transitoryMode
2036
- cp.configs = this.configs.map((km) => km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
2018
+ // cp.configs = this.configs.map((km) => await km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
2019
+ cp.configs = []
2020
+ for (const km of this.configs) {
2021
+ cp.configs.push(await km.copy2(Object.assign({}, options, { getCounter: (name) => cp.getCounter(name), callInitializers: false })))
2022
+ }
2037
2023
  cp._uuid = cp.configs[0]._uuid
2038
2024
  // update uuid here set the uuid in the objects and add error checking
2039
2025
  cp.initializerFn = this.initializerFn
@@ -2054,13 +2040,8 @@ class Config {
2054
2040
  cp.defaultConfig()
2055
2041
  // cp.wasInitialized = false; // since default config GREG
2056
2042
  cp.resetWasInitialized()
2057
- if (!this.initializeFn) {
2058
- // TODO move this to the default initializer
2059
- Object.assign(cp.config.objects, _.cloneDeep(this.initConfig.objects || {}))
2060
- }
2061
- // cp.initializeConfigFromConfigs({ others: [], objects: cp.config.objects.namespaced, moreNames: [], ...options })
2062
- // cp.initializeConfigFromConfigs(Object.assign({ others: [], objects: cp.config.objects.namespaced, moreNames: [] }, { callInitializers: false }))
2063
- cp.initializeConfigFromConfigs(Object.assign({ others: [], objects: cp.config.objects.namespaced, moreNames: [] }, options))
2043
+ Object.assign(cp.config.objects, _.cloneDeep(this.initConfig.objects || {}))
2044
+ await cp.initializeConfigFromConfigs(Object.assign({ others: [], objects: cp.config.objects.namespaced, moreNames: [] }, options))
2064
2045
  const map = {}
2065
2046
  for (let i = 0; i < this.configs.length; ++i) {
2066
2047
  map[this.configs[i].uuid] = cp.configs[i].uuid
@@ -2071,33 +2052,16 @@ class Config {
2071
2052
  // debugger
2072
2053
  }
2073
2054
  if (options.callInitializers) {
2074
- cp.rebuild(options)
2055
+ await cp.rebuild(options) // in copy
2075
2056
  } else {
2076
- // this mess is for duplicate into a KM after resetToOne was called
2077
- /*
2078
- if (cp._api) {
2079
- // cp._api.objects = cp.config.objects
2080
- // cp._api.config = () => (cp instanceof Config) ? cp : cp.config
2081
- // cp._api.uuid = cp._uuid
2082
- }
2083
- */
2084
-
2085
2057
  if (!cp.config.objects) {
2086
2058
  cp.config.objects = { namespaced: {} }
2087
2059
  } else if (!cp.config.objects.namespaced) {
2088
2060
  cp.config.objects.namespaced = {}
2089
2061
  }
2090
2062
  cp.configs.forEach((km) => {
2091
- // const namespace = km.namespace
2092
2063
  cp.config.objects.namespaced[km._uuid] = {}
2093
2064
  })
2094
- /*
2095
- if (cp._uuid == 'concept2') {
2096
- if (!cp.api.objects.defaultTypesForHierarchy) {
2097
- debugger
2098
- }
2099
- }
2100
- */
2101
2065
  }
2102
2066
  cp.valid()
2103
2067
  return cp
@@ -2221,41 +2185,7 @@ class Config {
2221
2185
  }
2222
2186
  }
2223
2187
 
2224
- initializeFromConfigs () {
2225
- // [...this.configs].reverse().forEach(({ config, namespace, uuid }) => {
2226
- [...this.configs].reverse().forEach(({ config, namespace, uuid }) => {
2227
- /*
2228
- let objects = this.get('objects')
2229
- if (namespace) {
2230
- objects = {}
2231
- this.get('objects')['namespaced'][namespace] = objects
2232
- }
2233
- */
2234
- const objects = {}
2235
- if (config instanceof Config) {
2236
- this.get('objects').namespaced[config._uuid] = objects
2237
- /*
2238
- if (config._api) {
2239
- // config._api.objects = objects
2240
- // config._api.config = () => this
2241
- }
2242
- */
2243
- config.initializerFn(setupInitializerFNArgs(this, { testConfig: config, currentConfig: config, objects, namespace, uuid }))
2244
- } else {
2245
- this.get('objects').namespaced[this._uuid] = objects
2246
- /*
2247
- if (config._api) {
2248
- // config._api.objects = objects
2249
- // config._api.config = () => this
2250
- }
2251
- */
2252
- this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, namespace, uuid }))
2253
- }
2254
- })
2255
- this.instances.forEach((instance) => client.loadInstance(this, instance))
2256
- }
2257
-
2258
- initialize ({ force = true } = {}) {
2188
+ initialize23 ({ force = true } = {}) {
2259
2189
  if (force || !this.wasInitialized) {
2260
2190
  const objects = this.config.objects.namespaced[this._uuid]
2261
2191
  this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, uuid: this._uuid, namespace: '' }))
@@ -2263,7 +2193,7 @@ class Config {
2263
2193
  }
2264
2194
  }
2265
2195
 
2266
- initializer (fn, options = {}) {
2196
+ async initializer (fn, options = {}) {
2267
2197
  if (options) {
2268
2198
  for (const option of Object.keys(options)) {
2269
2199
  const validOptions = []
@@ -2285,8 +2215,7 @@ class Config {
2285
2215
  currentConfig.wasInitialized = true
2286
2216
  global.transitoryMode = transitoryMode
2287
2217
  }
2288
- // this.initializeFromConfigs()
2289
- this.rebuild()
2218
+ await this.rebuild()
2290
2219
  }
2291
2220
 
2292
2221
  nsToString (id) {
@@ -2432,7 +2361,7 @@ class Config {
2432
2361
  }
2433
2362
 
2434
2363
  // rebuild ({ isModule: mainIsModule = false } = {}) {
2435
- rebuild ({ isModule: mainIsModule } = {}) {
2364
+ async rebuild ({ isModule: mainIsModule } = {}) {
2436
2365
  if (this._stop_auto_rebuild) {
2437
2366
  return
2438
2367
  }
@@ -2600,7 +2529,7 @@ class Config {
2600
2529
  }
2601
2530
  const instance = this.instances.find((instance) => instance.name == name)
2602
2531
  if (instance) {
2603
- client.loadInstance(this, instance)
2532
+ await client.loadInstance(this, instance)
2604
2533
  }
2605
2534
  this.hierarchy.edges = this.config.hierarchy
2606
2535
  }
@@ -2608,7 +2537,7 @@ class Config {
2608
2537
 
2609
2538
  this.hierarchy.edges = this.config.hierarchy
2610
2539
  this.valid()
2611
- this.checkBridges()
2540
+ this.checks()
2612
2541
  }
2613
2542
 
2614
2543
  nameToUUID (name) {
@@ -2620,6 +2549,7 @@ class Config {
2620
2549
  // if undefined namespace applies to first loaded config
2621
2550
  // if list of name then namespace applied only to those configs
2622
2551
  // if true then namespace applies to all loaded configs
2552
+ /*
2623
2553
  namespace (moreNames, others) {
2624
2554
  const config = this.copy()
2625
2555
  if (!Array.isArray(moreNames)) {
@@ -2655,6 +2585,7 @@ class Config {
2655
2585
  config.rebuild()
2656
2586
  return config
2657
2587
  }
2588
+ */
2658
2589
 
2659
2590
  setupNamespace (km) {
2660
2591
  let config = km.config
@@ -2673,7 +2604,7 @@ class Config {
2673
2604
 
2674
2605
  // config.initializerFn({ config: this, objects, namespace })
2675
2606
  // this goes through all the configs and sets up this.config
2676
- initializeConfigFromConfigs ({ others, objects, moreNames, callInitializers = true }) {
2607
+ async initializeConfigFromConfigs ({ others, objects, moreNames, callInitializers = true }) {
2677
2608
  // setup the namespace in the configs
2678
2609
  let first = true
2679
2610
  this.configs.forEach((km) => {
@@ -2822,6 +2753,11 @@ class Config {
2822
2753
  }
2823
2754
  }
2824
2755
 
2756
+ checks () {
2757
+ this.checkOperators()
2758
+ this.checkBridges()
2759
+ }
2760
+
2825
2761
  checkOperators () {
2826
2762
  if (!this.config.operators) {
2827
2763
  return
@@ -2842,53 +2778,19 @@ class Config {
2842
2778
  return
2843
2779
  }
2844
2780
 
2845
- /*
2846
- "namespaces": {
2847
- "634a678b-8d92-4464-bf65-943a82f404d8": {
2848
- "ids": [ "tankConcept" ],
2849
- "namespace": [ "ns1" ]
2850
- },
2851
- console.log('before check', JSON.stringify(this._eqClasses, null, 2))
2852
- */
2853
-
2854
- const errors = []
2855
- /*
2856
- const namespaces = this.config.namespaces
2857
- const nsToIds = {}
2858
- for (const uuid in namespaces) {
2859
- const namespace = namespaces[uuid].namespace
2860
- const ns = namespace.join('#')
2861
- if (!nsToIds[ns]) {
2862
- nsToIds[ns] = new Set()
2863
- }
2864
- const ids = nsToIds[ns]
2865
- for (const id of namespaces[uuid].ids) {
2866
- if (ids.has(id)) {
2867
- if (ns === '') {
2868
- const dups = this.config.bridges.filter( (bridge) => bridge.id == id )
2869
- errors.push(`Id '${id}' is defined more than once in the bridges of the base namespace of the KM ${this.name}, Dups are ${JSON.stringify(dups)}`)
2870
- } else {
2871
- errors.push(`Id '${id}' is defined more than once in the bridges of the ${ns} namespace of the KM ${this.name}`)
2872
- }
2873
- } else {
2874
- ids.add(id)
2875
- }
2876
- }
2877
- }
2878
- */
2879
-
2880
- const keyIsPresent = {}
2781
+ let duplicated = new Set()
2782
+ const seen = new Set()
2881
2783
  for (const bridge of this.config.bridges) {
2882
- const key = `${bridge.id}/${bridge.level} (namespace: ${bridge.uuid})`
2883
- if (keyIsPresent[key]) {
2884
- errors.push(new Error(`Id '${key}' is defined more than once in bridges of the base namespace of the KM ${this.name}`))
2784
+ const id = `${bridge.id}/${bridge.level} (namespace: ${bridge.uuid || this.uuid})`
2785
+ if (seen.has(id)) {
2786
+ duplicated.add(id)
2885
2787
  } else {
2886
- keyIsPresent[key] = key
2788
+ seen.add(id)
2887
2789
  }
2888
2790
  }
2889
-
2890
- if (errors.length > 0) {
2891
- throw errors
2791
+ duplicated = Array.from(duplicated)
2792
+ if (duplicated.length > 0) {
2793
+ throw new Error(`In the KM ${this.name}, the following operators are duplicated in the bridges: ${duplicated}`)
2892
2794
  }
2893
2795
  };
2894
2796
 
@@ -2945,25 +2847,29 @@ class Config {
2945
2847
  }
2946
2848
  }
2947
2849
 
2948
- add (...mores) {
2949
- mores.forEach((km) => {
2950
- if (km === this) {
2951
- throw new Error('Cannot add an object to itself.')
2850
+ async add (...createConfigs) {
2851
+ createConfigs.forEach((createConfig, index) => {
2852
+ if (typeof createConfig !== 'function') {
2853
+ throw new Error(`Expected add argument number ${index+1} to be a function that constructs the config.`)
2952
2854
  }
2953
2855
  })
2954
2856
 
2955
- mores = mores.map((km) => {
2956
- if (!(km instanceof Config)) {
2957
- km = new Config(km)
2857
+ const mores = []
2858
+ for (const createConfig of createConfigs) {
2859
+ const more = await createConfig()
2860
+ if (this.name && this.name == more.name) {
2861
+ throw new Error('Cannot add an object to itself for argument number ${index+1}.')
2958
2862
  }
2959
- return km
2960
- })
2961
-
2962
- mores.forEach((more) => {
2863
+ if (this === more) {
2864
+ throw new Error('Cannot add an object to itself.')
2865
+ }
2866
+ mores.push(more)
2867
+ }
2868
+ for (let more of mores) {
2963
2869
  this.valid()
2964
2870
  more.valid()
2965
2871
  // copy so i don't have to copy later
2966
- more = more.copy()
2872
+ more = await more.copy()
2967
2873
  more.server(this._server, this._key, this._queryParams)
2968
2874
 
2969
2875
  const moreConfigs = more.configs.map((km) => km.name || km.uuid)
@@ -2978,9 +2884,6 @@ class Config {
2978
2884
  const moreKMs1 = [new KM({ config: more, getCounter: (name) => this.getCounter(name), uuid: more.uuid, namespace })]
2979
2885
  const moreKMs2 = more.configs.slice(1).map((km) => {
2980
2886
  return km
2981
- // const cp = km.copy()
2982
- // cp.namespace = namespace
2983
- // return cp;
2984
2887
  })
2985
2888
  const moreKMs = moreKMs1.concat(moreKMs2)
2986
2889
  const eqClass = moreKMs.map((km) => km.uuid)
@@ -2994,7 +2897,7 @@ class Config {
2994
2897
  this.configs.push(moreKM)
2995
2898
  }
2996
2899
  }
2997
- more.resetToOne()
2900
+ await more.resetToOne()
2998
2901
  this.config.eqClasses = this._eqClasses
2999
2902
  // greg
3000
2903
  // setup instances
@@ -3009,8 +2912,8 @@ class Config {
3009
2912
  }
3010
2913
  }
3011
2914
  this.instances = noDups
3012
- })
3013
- this.rebuild()
2915
+ }
2916
+ await this.rebuild() // in add(
3014
2917
  this.valid()
3015
2918
  return this
3016
2919
  }
@@ -3166,7 +3069,7 @@ class Config {
3166
3069
  // assumes this is called in reverse order
3167
3070
  addInternalR (more, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false) {
3168
3071
  if (more instanceof Config) {
3169
- more.initialize({ force: false })
3072
+ more.initialize23({ force: false })
3170
3073
  if (useOldVersion) {
3171
3074
  more = more.config
3172
3075
  } else {
package/src/generators.js CHANGED
@@ -44,7 +44,7 @@ class Generator {
44
44
  return `Generator(${this.match}, ${this._applyWrapped || this._apply})${this.property ? `\nsee the ${this.property} property` : ''}`
45
45
  }
46
46
 
47
- matches (baseArgs, objects, context, hierarchy, config, options = {}) {
47
+ async matches (baseArgs, objects, context, hierarchy, config, options = {}) {
48
48
  if (objects && objects.namespaced) {
49
49
  objects = objects.namespaced[this.uuid]
50
50
  }
@@ -63,17 +63,17 @@ class Generator {
63
63
  }
64
64
  const args = Object.assign({}, baseArgs, moreArgs, (baseArgs.getUUIDScoped || (() => { return {} }))(this.uuid))
65
65
  // return this.match(args)
66
- const matches = this.match(args)
66
+ const matches = await this.match(args)
67
67
  if ((matches && (options.debug || {}).match) ||
68
68
  callId == this.callId) {
69
69
  debugger // next line is the matcher
70
- this.match(args)
70
+ await this.match(args)
71
71
  }
72
72
  return matches
73
73
  }
74
74
 
75
75
  // apply (baseArgs, objects, g, gs, context, hierarchy, config, response, log, options = {}) {
76
- apply (baseArgs, objects, context, hierarchy, config, response, log, options = {}) {
76
+ async apply (baseArgs, objects, context, hierarchy, config, response, log, options = {}) {
77
77
  if (!log) {
78
78
  throw new Error('generators.apply argument log is required')
79
79
  }
@@ -129,7 +129,7 @@ class Generator {
129
129
  callId == this.callId) {
130
130
  debugger
131
131
  }
132
- return this._apply(args)
132
+ return await this._apply(args)
133
133
  }
134
134
  }
135
135
 
@@ -165,7 +165,7 @@ class Generators {
165
165
  };
166
166
 
167
167
  // assumed - properties added to context before the generators are called. For setting paraphrase property
168
- apply (args, context, assumed = {}, options = {}) {
168
+ async apply (args, context, assumed = {}, options = {}) {
169
169
  if (Array.isArray(context)) {
170
170
  throw new Error('Expected a context not an array')
171
171
  }
@@ -186,12 +186,12 @@ class Generators {
186
186
  const stack = args.calls.push()
187
187
  for (let igenerator = 0; igenerator < this.generators.length; ++igenerator) {
188
188
  const generator = this.generators[igenerator]
189
- if (generator.matches(args, objects, context, hierarchy, config, options)) {
189
+ if (await generator.matches(args, objects, context, hierarchy, config, options)) {
190
190
  const log = (message) => { this.logs.push(message) }
191
191
  // this.logs.push(`Generators: applied ${generator.toString()}\n to\n ${JSON.stringify(context)}`)
192
192
  let errorMessage = 'The apply function did not return a value'
193
193
  try {
194
- generated = generator.apply(args, objects, context, hierarchy, config, response, log)
194
+ generated = await generator.apply(args, objects, context, hierarchy, config, response, log)
195
195
  } catch (e) {
196
196
  // the next if handle this
197
197
  generated = null
package/src/semantics.js CHANGED
@@ -49,7 +49,7 @@ class Semantic {
49
49
  }
50
50
  }
51
51
 
52
- matches (baseArgs, context, options = {}) {
52
+ async matches (baseArgs, context, options = {}) {
53
53
  const hierarchy = baseArgs.hierarchy
54
54
  const config = baseArgs.config
55
55
 
@@ -71,16 +71,16 @@ class Semantic {
71
71
  }
72
72
  const args = Object.assign({}, baseArgs, moreArgs, (baseArgs.getUUIDScoped || (() => { return {} }))(this.uuid))
73
73
 
74
- const matches = this.matcher(args)
74
+ const matches = await this.matcher(args)
75
75
  if (matches && (options.debug || {}).match ||
76
76
  callId == this.callId) {
77
77
  debugger // next line is the matcher
78
- this.matcher(args)
78
+ await this.matcher(args)
79
79
  }
80
80
  return matches
81
81
  }
82
82
 
83
- apply (baseArgs, context, s, log, options = {}) {
83
+ async apply (baseArgs, context, s, log, options = {}) {
84
84
  const { hierarchy, config, response } = baseArgs
85
85
  const objects = baseArgs.getObjects(this.uuid)
86
86
  if (config && config.debugLoops) {
@@ -124,7 +124,7 @@ class Semantic {
124
124
  if (args.breakOnSemantics) {
125
125
  debugger
126
126
  }
127
- this._apply(args)
127
+ await this._apply(args)
128
128
  return contextPrime
129
129
  }
130
130
  }
@@ -176,7 +176,7 @@ class Semantics {
176
176
  return this.semantics[maxOrdinal]
177
177
  }
178
178
 
179
- applyToContext (args, context, options) {
179
+ async applyToContext (args, context, options) {
180
180
  // let context_prime = {}
181
181
  if (!(context instanceof Array || context instanceof Object)) {
182
182
  return context
@@ -197,14 +197,14 @@ class Semantics {
197
197
  if (semantic.isQuestion && seenQuestion) {
198
198
  continue
199
199
  }
200
- if (semantic.matches(args, context, options)) {
200
+ if (await semantic.matches(args, context, options)) {
201
201
  if (!this.calls[counter]) {
202
202
  this.calls[counter] = 0
203
203
  }
204
204
  this.calls[counter] += 1
205
205
  const log = (message) => { this.logs.push(message) }
206
206
  try {
207
- contextPrime = semantic.apply(args, context, s, log, options)
207
+ contextPrime = await semantic.apply(args, context, s, log, options)
208
208
  if (!contextPrime.controlKeepMotivation && semantic.oneShot) {
209
209
  // semantic.tied_ids.forEach((tied_id) => args.config.removeSemantic(tied_id))
210
210
  args.config.removeSemantic(semantic)
@@ -310,19 +310,19 @@ class Semantics {
310
310
  return contextPrime
311
311
  }
312
312
 
313
- applyToContexts (args, contexts, options) {
313
+ async applyToContexts (args, contexts, options) {
314
314
  const contextsPrime = []
315
- contexts.forEach((context) => {
316
- contextsPrime.push(this.applyToContext(args, context, options))
317
- })
315
+ for (const context of contexts) {
316
+ contextsPrime.push(await this.applyToContext(args, context, options))
317
+ }
318
318
  return contextsPrime
319
319
  }
320
320
 
321
- apply (args, context, options) {
321
+ async apply (args, context, options) {
322
322
  if (Array.isArray(context)) {
323
- return this.applyToContexts(args, context, options)
323
+ return await this.applyToContexts(args, context, options)
324
324
  } else if (context instanceof Object) {
325
- return this.applyToContext(args, context, options)
325
+ return await this.applyToContext(args, context, options)
326
326
  } else {
327
327
  return context
328
328
  }