theprogrammablemind_4wp 7.5.8-beta.6 → 7.5.8-beta.61

Sign up to get free protection for your applications and to get access to all the features.
package/client.js CHANGED
@@ -15,14 +15,16 @@ const sortJson = runtime.sortJson
15
15
 
16
16
  const getAsk = (config) => (uuid) => (asks) => {
17
17
  for (let ask of asks) {
18
- config.addMotivation({
18
+ config.addSemantic({
19
19
  uuid,
20
+ oneShot: true,
20
21
  match: (args) => ask.matchr(args),
21
22
  apply: (args) => ask.applyr(args)
22
23
  })
23
24
  }
24
- config.addMotivation({
25
+ config.addSemantic({
25
26
  uuid,
27
+ oneShot: true,
26
28
  match: ({context}) => context.marker == 'controlEnd' || context.marker == 'controlBetween',
27
29
  apply: (args) => {
28
30
  for (let ask of asks) {
@@ -37,7 +39,7 @@ const getAsk = (config) => (uuid) => (asks) => {
37
39
  }
38
40
  }
39
41
  if (matchq(args)) {
40
- args.context.motivationKeep = true
42
+ // args.context.motivationKeep = true
41
43
  args.context.verbatim = applyq(args)
42
44
  args.context.isResponse = true;
43
45
  delete args.context.controlRemove;
@@ -58,7 +60,6 @@ const vimdiff = (actualJSON, expectedJSON) => {
58
60
  // console.log(`vimdiff ${path}/actual.json ${path}/expected.json`)
59
61
  {
60
62
  const editor = runtime.process.env.EDITOR || 'vimdiff'
61
- debugger
62
63
  // const child = runtime.child_process.spawn(editor, [`${path}/expected.json`, `${path}/actual.json`], { stdio: 'inherit' })
63
64
  console.log(`${editor} ${path}/expected.json ${path}/actual.json`)
64
65
  runtime.child_process.execSync(`${editor} ${path}/expected.json ${path}/actual.json`, {stdio: 'inherit'})
@@ -109,11 +110,12 @@ class ErrorReason extends Error {
109
110
 
110
111
  const setupArgs = (args, config, logs, hierarchy) => {
111
112
  config.setArgs(args)
112
- args.calls = new InitCalls(config.name)
113
+ args.calls = new InitCalls(args.isInstance ? `${args.isInstance}#${config.name}` : config.name)
113
114
  if (global.theprogrammablemind && global.theprogrammablemind.loadForTesting) {
114
115
  args.calls = new InitCalls(Object.keys(global.theprogrammablemind.loadForTesting)[0])
115
116
  }
116
117
  args.km = (name) => config.getConfig(name)
118
+ args.api = (name) => config.getConfig(name).api
117
119
  args.error = (context) => {
118
120
  throw new ErrorReason(context)
119
121
  }
@@ -124,6 +126,7 @@ const setupArgs = (args, config, logs, hierarchy) => {
124
126
  args.listable = listable(hierarchy)
125
127
  args.asList = asList
126
128
  args.retry = () => { throw new RetryError() }
129
+ args.fragments = (query) => config.fragment(query)
127
130
  const scopedAsk = getAsk(config)
128
131
 
129
132
  const getAPI = (uuid) => {
@@ -143,7 +146,6 @@ const setupArgs = (args, config, logs, hierarchy) => {
143
146
  apis: getAPIs(uuid)
144
147
  }
145
148
  }
146
- args.motivation = (m) => config.addMotivation(m)
147
149
  args.breakOnSemantics = false
148
150
  args.theDebugger = {
149
151
  breakOnSemantics: (value) => args.breakOnSemantics = value
@@ -157,10 +159,10 @@ const setupArgs = (args, config, logs, hierarchy) => {
157
159
  }
158
160
  args.e = (c) => config.getEvaluator(args.s, args.calls, logs, c)
159
161
  args.log = (message) => logs.push(message)
160
- // config.getAddedArgs(args)
161
162
  args.gs = gs(args.g)
162
163
  args.gsp = gs(args.gp)
163
164
  args.gsr = gs(args.gr)
165
+ config.getAddedArgs(args)
164
166
  }
165
167
 
166
168
  const gs = (g) => (contexts, separator, lastSeparator) => {
@@ -298,7 +300,6 @@ const writeTest = (fn, query, objects, generated, paraphrases, responses, contex
298
300
  }
299
301
  associations.sort()
300
302
  // tests[query] = sortJson({ paraphrases, responses, contexts, objects: convertToStable(objects), associations, metadata, config, developerTest: saveDeveloper }, { depth: 25 })
301
- debugger
302
303
  results = sortJson({
303
304
  query,
304
305
  paraphrases,
@@ -367,7 +368,7 @@ const setupContexts = (rawContexts) => {
367
368
  return contexts
368
369
  }
369
370
 
370
- const processContextsB = ({ config, hierarchy, semantics, generators, json, isTest, query, data, retries, url, commandLineArgs }) => {
371
+ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTest, isInstance, query, data, retries, url, commandLineArgs }) => {
371
372
  // TODO fix this name to contextsPrime
372
373
  const contextsPrime = []
373
374
  const generatedPrime = []
@@ -378,7 +379,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
378
379
  const contexts = setupContexts(json.contexts)
379
380
 
380
381
  const objects = config.get('objects')
381
- const args = { objects, isResponse: true, response: json, isTest, getObjects: getObjects(objects) }
382
+ const args = { objects, isResponse: true, response: json, isTest, isInstance, getObjects: getObjects(objects), isInstance }
382
383
  if (!json.logs) {
383
384
  json.logs = []
384
385
  }
@@ -418,19 +419,18 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
418
419
  if (json.has_errors) {
419
420
  throw new Error('There are errors in the logs. Run with the -d flag and grep for Error')
420
421
  }
422
+ const generateParenthesized = isTest || (commandLineArgs && commandLineArgs.save)
421
423
  if (!config.get('skipSemantics')) {
422
- if (!config.doMotivations(args, context)) {
423
- const semantics = config.getSemantics(json.logs)
424
- try {
425
- contextPrime = semantics.apply(args, context)
426
- } catch( e ) {
427
- if (e.message == 'Maximum call stack size exceeded') {
428
- const mostCalled = semantics.getMostCalled()
429
- e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
430
- }
431
- // contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
432
- contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason })
424
+ const semantics = config.getSemantics(json.logs)
425
+ try {
426
+ contextPrime = semantics.apply(args, context)
427
+ } catch( e ) {
428
+ if (e.message == 'Maximum call stack size exceeded') {
429
+ const mostCalled = semantics.getMostCalled()
430
+ e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
433
431
  }
432
+ // contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
433
+ contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason })
434
434
  }
435
435
  }
436
436
  if (contextPrime.controlRemove) {
@@ -439,7 +439,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
439
439
  let assumed = { isResponse: true };
440
440
  const generated = contextPrime.isResponse ? config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0] : ''
441
441
  let generatedParenthesized = []
442
- if (isTest) {
442
+ if (generateParenthesized) {
443
443
  config.parenthesized = true
444
444
  generatedParenthesized = contextPrime.isResponse ? config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0] : ''
445
445
  config.parenthesized = false
@@ -452,12 +452,12 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
452
452
  args.gs = gs(args.g)
453
453
  args.gsp = gs(args.gsp)
454
454
  args.gsr = gs(args.gr)
455
- if (isTest) {
455
+ if (generateParenthesized) {
456
456
  config.parenthesized = false
457
457
  }
458
458
  const paraphrases = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
459
459
  let paraphrasesParenthesized = []
460
- if (isTest) {
460
+ if (generateParenthesized) {
461
461
  config.parenthesized = true
462
462
  paraphrasesParenthesized = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
463
463
  config.parenthesized = false
@@ -471,7 +471,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
471
471
  contextsPrime.push(contextPrime)
472
472
  generatedPrime.push(generated)
473
473
  paraphrasesPrime.push(paraphrases)
474
- if (isTest) {
474
+ if (generateParenthesized) {
475
475
  paraphrasesParenthesizedPrime.push(paraphrasesParenthesized)
476
476
  generatedParenthesizedPrime.push(generatedParenthesized)
477
477
  }
@@ -549,8 +549,11 @@ const setupProcessB = ({ config, initializer, allowDelta=false } = {}) => {
549
549
  // console.log('config', config)
550
550
  data.delta = config.delta()
551
551
  } else {
552
- Object.assign(data, config.config)
552
+ config.toData(data)
553
+ // Object.assign(data, config.config)
553
554
  }
555
+
556
+ // config.toServer(data)
554
557
 
555
558
  if (data.namespaces) {
556
559
  for (const uuid of Object.keys(data.namespaces)) {
@@ -574,7 +577,7 @@ const setupProcessB = ({ config, initializer, allowDelta=false } = {}) => {
574
577
  }
575
578
 
576
579
  // instance template
577
- const processInstance = (config, instance) => {
580
+ const loadInstance = (config, instance) => {
578
581
  const transitoryMode = global.transitoryMode
579
582
  global.transitoryMode = false
580
583
  const { /* data, generators, semantics, */ hierarchy } = setupProcessB({ config })
@@ -584,15 +587,15 @@ const processInstance = (config, instance) => {
584
587
  if (results.extraConfig) {
585
588
  // config.addInternal(results, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false)
586
589
  // config.addInternal(config.template.queries[i], { handleCalculatedProps: true } )
587
- config.addInternal(instance.template.queries[i], { handleCalculatedProps: true } )
590
+ config.addInternal(instance.template.queries[i], { addFirst: true, handleCalculatedProps: true } )
588
591
  } else {
589
- processContextsB({ config, hierarchy, json: results/*, generators, semantics */, commandLineArgs: {} })
592
+ processContextsB({ config, hierarchy, json: results/*, generators, semantics */, commandLineArgs: {}, isInstance: `instance${i}` })
590
593
  }
591
594
  }
592
595
  global.transitoryMode = transitoryMode
593
596
  }
594
597
 
595
- const _process = async (config, query, { initializer, commandLineArgs, credentials, writeTests, isTest, saveDeveloper, testConfig, testsFN, errorHandler = defaultErrorHandler } = {}) => {
598
+ const _process = async (config, query, { initializer, commandLineArgs, credentials, writeTests, isTest, saveDeveloper, rebuildingTemplate, testConfig, testsFN, errorHandler = defaultErrorHandler } = {}) => {
596
599
  if (credentials) {
597
600
  config.server(credentials.server, credentials.key)
598
601
  }
@@ -606,7 +609,6 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
606
609
  if (writeTests) {
607
610
  config.rebuild()
608
611
  const objects = getObjects(config.config.objects)(config.uuid)
609
- config.beforeQuery({ query, isModule: false, objects })
610
612
  }
611
613
  } catch(error) {
612
614
  throw error
@@ -616,6 +618,9 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
616
618
  if (commandLineArgs && commandLineArgs.checkForLoop) {
617
619
  data.checkForLoop = true
618
620
  }
621
+ if (rebuildingTemplate) {
622
+ data.errors_ignore_contextual_priorities_non_existant_ops = true
623
+ }
619
624
  let queries = query.split('\\n')
620
625
 
621
626
  try {
@@ -694,7 +699,12 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
694
699
 
695
700
  if (writeTests) {
696
701
  const actual_config = getConfigForTest(config, testConfig)
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)
702
+ const saveObjects = {...config.config.objects}
703
+ saveObjects.nameToUUID = {}
704
+ for (let km of config.configs) {
705
+ saveObjects.nameToUUID[km.name] = km.uuid
706
+ }
707
+ writeTest(testsFN, query, saveObjects, response.generated, response.paraphrases, response.responses, response.contexts, response.associations, response.metadata, actual_config, saveDeveloper, response.paraphrasesParenthesized, response.generatedParenthesized)
698
708
  }
699
709
 
700
710
  return response
@@ -734,7 +744,7 @@ const getConfigForTest = (config, testConfig) => {
734
744
  return configForTest
735
745
  }
736
746
 
737
- const runTest = async (config, expected, { args, verbose, afterTest, testConfig, debug }) => {
747
+ const runTest = async (config, expected, { args, verbose, testConfig, debug }) => {
738
748
  const test = expected.query
739
749
  // initialize in between test so state is not preserved since the test was adding without state
740
750
  config.rebuild()
@@ -759,8 +769,6 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
759
769
  objects = getObjects(config.config.objects)(config.getConfigs()[testConfig.testModuleName].uuid)
760
770
  testConfigName = testConfig.testModuleName
761
771
  }
762
- config.beforeQuery({ query: test, isModule: false, objects })
763
- // config.resetMotivations()
764
772
  try {
765
773
  const result = await _process(config, test, { errorHandler, isTest: true })
766
774
  result.query = test
@@ -778,12 +786,17 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
778
786
  delete expected_objects.nameToUUID
779
787
  const actual_objects = sortJson(convertToStable(config.config.objects), { depth: 25 })
780
788
  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)
789
+ let failed_paraphrasesParenthesized = !matching(result.paraphrasesParenthesized, expected.paraphrasesParenthesized)
790
+ let failed_generatedParenthesized = !matching(result.generatedParenthesized, expected.generatedParenthesized)
783
791
  const failed_responses = !matching(result.responses, expected.responses)
784
792
  const failed_contexts = !matching(result.contexts, expected.contexts)
785
793
  const failed_objects = !matching(actual_objects, expected_objects)
786
794
 
795
+ if (args.testNoParenthesized) {
796
+ failed_paraphrasesParenthesized = false
797
+ failed_generatedParenthesized = false
798
+ }
799
+
787
800
  const pickEm = (getObjects) => {
788
801
  const picked = {}
789
802
  for (let prop of (testConfig.check || [])) {
@@ -809,6 +822,11 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
809
822
  }
810
823
  return expected.objects.namespaced[expected.objects.nameToUUID[name]]
811
824
  }
825
+ try {
826
+ sortJson(pickEm(expectedGetObjects), { depth: 25 })
827
+ } catch ( e ) {
828
+ debugger
829
+ }
812
830
  const expected_checked = sortJson(pickEm(expectedGetObjects), { depth: 25 })
813
831
  const actualGetObjects = (name) => {
814
832
  if (!name) {
@@ -825,37 +843,6 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
825
843
  const expected_config = sortJson(convertToStable(expected.config), { depth: 25 })
826
844
  const failed_config = !matching(actual_config, expected_config)
827
845
  let failed = failed_paraphrases || failed_paraphrasesParenthesized || failed_generatedParenthesized || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked
828
- if (!failed) {
829
- if (config.afterTest) {
830
- failed = config.afterTest({ query: test, expected, actual: result, config })
831
- if (failed) {
832
- return {
833
- utterance: test,
834
- errorFromAfterTest: failed,
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
- }
855
- }
856
- }
857
- }
858
- }
859
846
 
860
847
  if (expected.metadata && result.metadata && failed) {
861
848
  const priorities = analyzeMetaData(expected.metadata, result.metadata)
@@ -923,20 +910,16 @@ const runTestsHelper = async (config, tests, failed, juicyBits) => {
923
910
 
924
911
  const runTests = async (config, testFile, juicyBits) => {
925
912
  const tests = JSON.parse(runtime.fs.readFileSync(testFile))
926
- config.beforeTests()
927
913
  if (juicyBits.verbose) {
928
914
  console.log('\n', testFile, '-----------------------------------------------', '\n')
929
915
  }
930
916
  const v = await runTestsHelper(config, [...tests], [], juicyBits)
931
- config.afterTests()
932
917
  return v
933
918
  }
934
919
 
935
920
  const saveTest = async (testFile, config, test, expected, testConfig, saveDeveloper) => {
936
921
  config.rebuild()
937
922
  const objects = getObjects(config.config.objects)(config.uuid)
938
- //config.resetMotivations()
939
- config.beforeQuery({ query: test, isModule: false, objects })
940
923
  console.log(test)
941
924
  const result = await _process(config, test, { isTest: true })
942
925
  // const actualObjects = config.config.objects
@@ -1118,10 +1101,11 @@ const defaultErrorHandler = async (error) => {
1118
1101
  doErrorExit = true
1119
1102
  }
1120
1103
 
1121
- if (doErrorExit) {
1104
+ if (typeof runtime.process.exit == 'function' && doErrorExit) {
1122
1105
  runtime.process.exit(-1)
1123
1106
  }
1124
- // throw error
1107
+
1108
+ throw error
1125
1109
  }
1126
1110
 
1127
1111
  const defaultInnerProcess = (config, errorHandler, responses) => {
@@ -1142,6 +1126,37 @@ const defaultInnerProcess = (config, errorHandler, responses) => {
1142
1126
  } else {
1143
1127
  console.log('objects', runtime.util.inspect(config.get('objects'), { depth: Infinity, sorted: true }))
1144
1128
  }
1129
+
1130
+ const pickEm = () => {
1131
+ const picked = {}
1132
+ const namespaced = config.get('objects')['namespaced']
1133
+ for (let prop of (config.testConfig.check || [])) {
1134
+ if (prop.km) {
1135
+ /*
1136
+ const objects = namespaced[prop.km]]
1137
+ picked[prop.km] = {}
1138
+ for (let p of c.testConfig.check) {
1139
+ if (p.km) {
1140
+ continue
1141
+ }
1142
+ picked[p] = objects[p]
1143
+ }
1144
+ */
1145
+ console.log('TODO implement this if needed')
1146
+ } else {
1147
+ const objects = namespaced[config.uuid]
1148
+ picked[prop] = objects[prop]
1149
+ }
1150
+ }
1151
+ return picked
1152
+ }
1153
+
1154
+ const picked = pickEm()
1155
+ if (!_.isEmpty(picked)) {
1156
+ console.log('--- checked object properties ---')
1157
+ console.log(JSON.stringify(picked, null, 2))
1158
+ }
1159
+
1145
1160
  console.log('--- The contexts are ----------')
1146
1161
  console.log(JSON.stringify(sortJson(responses.contexts, { depth: 25 }), null, 2))
1147
1162
  console.log('')
@@ -1182,32 +1197,8 @@ const defaultProcess = ({ config, errorHandler }) => async (promise) => {
1182
1197
  }
1183
1198
  }
1184
1199
 
1185
- /*
1186
- const kmFileTemplate = (kmBaseName, kmName) =>
1187
- `const entodicton = require('entodicton')
1188
- const base = require('./${kmBaseName}').copy()
1189
- const ${kmName}_tests = require('./${kmName}.test.json')
1190
- const ${kmName}_instance = require('./${kmBaseName}.${kmName}.instance.json')
1191
-
1192
- const config = new entodicton.Config({ name: '${kmName}' })
1193
- config.add(base)
1194
- kirk_instance.base = '${kmBaseName}'
1195
- config.load(${kmName}_instance)
1196
-
1197
- entodicton.knowledgeModule( {
1198
- module,
1199
- description: '${kmName} related concepts',
1200
- section,
1201
- config,
1202
- test: {
1203
- name: './${kmName}.test.json',
1204
- contents: ${kmName}_tests
1205
- },
1206
- })
1207
- `
1208
- */
1209
-
1210
- const build = async ({ config, target, template, errorHandler = defaultErrorHandler }) => {
1200
+ // loadTemplate BuiltTemplate
1201
+ const rebuildTemplate = async ({ config, target, template, errorHandler = defaultErrorHandler }) => {
1211
1202
  const accumulators = {
1212
1203
  resultss: [],
1213
1204
  fragments: [],
@@ -1231,8 +1222,6 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
1231
1222
  if (property == 'fragments') {
1232
1223
  global.transitoryMode = true
1233
1224
  }
1234
- // greg32
1235
- // config.addInternal( query )
1236
1225
  if (hierarchy) {
1237
1226
  for (let edge of hierarchy) {
1238
1227
  if (Array.isArray(edge)) {
@@ -1244,7 +1233,7 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
1244
1233
  }
1245
1234
 
1246
1235
  try {
1247
- const results = await _process(config, query.query, {initializer})
1236
+ const results = await _process(config, query.query, {initializer, rebuildingTemplate: true})
1248
1237
  if (config.config.debug) {
1249
1238
  // TODO pass in the error handler like the other ones
1250
1239
  defaultInnerProcess(config, defaultErrorHandler, results)
@@ -1274,6 +1263,12 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
1274
1263
  // it will just get added to the config
1275
1264
  const extraConfig = queryOrExtraConfig
1276
1265
  console.log('config', extraConfig)
1266
+ try {
1267
+ config.addInternal(_.cloneDeep(extraConfig), { handleCalculatedProps: true } )
1268
+ } catch ( e ) {
1269
+ const where = extraConfig.where ? ` ${extraConfig.where}` : ''
1270
+ throw new Error(`Error processing extra config${where}: ${e.stack}}`)
1271
+ }
1277
1272
  accumulators[property].push({ extraConfig: true, ...extraConfig })
1278
1273
  await looper(queries)
1279
1274
  }
@@ -1338,36 +1333,31 @@ const knowledgeModule = async ({
1338
1333
  module: moduleFromJSFile,
1339
1334
  description,
1340
1335
  section,
1341
- config,
1336
+ // config, createConfig,
1337
+ createConfig,
1338
+ newWay,
1342
1339
  demo,
1343
1340
  test,
1344
1341
  template,
1345
1342
  errorHandler = defaultErrorHandler,
1346
1343
  process: processResults = defaultProcess,
1347
1344
  stopAtFirstFailure = true,
1348
- beforeQuery = () => {},
1349
- beforeTests = () => {},
1350
- afterTests = () => {},
1351
- beforeTest = () => {},
1352
- afterTest = () => {}
1345
+ ...rest
1353
1346
  } = {}) => {
1354
1347
 
1355
- config.beforeQuery = beforeQuery
1356
- config.beforeTests = beforeTests
1357
- config.afterTests = afterTests
1358
- config.beforeTest = beforeTest
1359
- config.afterTest = afterTest
1348
+ const unknownArgs = Object.keys(rest)
1349
+ if (unknownArgs.length > 0) {
1350
+ throw new Error(`Unknown arguments to knowledgeModule: ${unknownArgs.join()}`)
1351
+ }
1360
1352
 
1361
1353
  const testConfig = test
1362
1354
 
1363
1355
  if (!moduleFromJSFile) {
1364
1356
  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.")
1365
1357
  }
1366
- if (!config) {
1367
- throw new Error("'config' is a required parameter. The value should the config that defines the knowledge module.")
1368
- }
1369
- if (!config.name) {
1370
- throw new Error("config must have 'name' set to the knowledge module name.")
1358
+ // if (!config && !createConfig) {
1359
+ if (!createConfig) {
1360
+ throw new Error("'config' or 'createConfig' is a required parameter. The value should the config that defines the knowledge module.")
1371
1361
  }
1372
1362
  if (!description) {
1373
1363
  throw new Error("'description' is a required parameter. The value should the description of the knowledge module.")
@@ -1377,86 +1367,51 @@ const knowledgeModule = async ({
1377
1367
  }
1378
1368
 
1379
1369
  const isProcess = require.main === moduleFromJSFile
1380
- let loadForTesting = false
1381
- if (global.theprogrammablemind) {
1382
- if (global.theprogrammablemind.loadForTesting[config.name]) {
1383
- loadForTesting = true
1370
+
1371
+ const setupConfig = (config) => {
1372
+ if (!config.name) {
1373
+ throw new Error("config must have 'name' set to the knowledge module name.")
1384
1374
  }
1385
- }
1386
1375
 
1387
- // remove test only stuff
1388
- if (!isProcess && !loadForTesting) {
1389
- config.config.operators = config.config.operators.filter( (operator) => {
1390
- if (operator.development) {
1391
- return false
1392
- } else {
1393
- return true
1394
- }
1395
- })
1396
- config.config.bridges = config.config.bridges.filter( (bridge) => {
1397
- if (bridge.development) {
1398
- return false
1399
- } else {
1400
- return true
1376
+ config.description = description
1377
+ if (typeof test === 'object') {
1378
+ if (test.contents) {
1379
+ config.tests = test.contents
1380
+ test = test.name
1401
1381
  }
1402
- })
1403
- }
1404
-
1405
- let module
1406
- if (_.isFunction(moduleFromJSFile)) {
1407
- module = moduleFromJSFile
1408
- } else {
1409
- module = () => {
1410
- config.rebuild({ isModule: true })
1411
- moduleFromJSFile.exports = config
1412
- }
1413
- }
1414
- processResults = processResults({ config, errorHandler })
1415
- config.description = description
1416
- config.demo = demo
1417
- if (typeof test === 'object') {
1418
- if (test.contents) {
1419
- config.tests = test.contents
1420
- test = test.name
1421
- }
1422
- } else {
1423
- if (runtime.fs && runtime.fs.existsSync(test)) {
1424
- config.tests = JSON.parse(runtime.fs.readFileSync(test))
1425
1382
  } else {
1426
- config.tests = {}
1427
- }
1428
- }
1429
- config.setTestConfig(testConfig)
1430
-
1431
- if (!isProcess) {
1432
- if (template) {
1433
- if (config.needsRebuild(template.template, template.instance)) {
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.`)
1435
- }
1436
- try {
1437
- config.load(template.template, template.instance)
1438
- } catch( e ) {
1439
- errorHandler(e)
1383
+ if (runtime.fs && runtime.fs.existsSync(test)) {
1384
+ config.tests = JSON.parse(runtime.fs.readFileSync(test))
1385
+ } else {
1386
+ config.tests = []
1440
1387
  }
1441
1388
  }
1389
+ config.setTestConfig(testConfig)
1442
1390
  }
1391
+
1392
+
1443
1393
  if (isProcess) {
1394
+ const config = createConfig()
1395
+ setupConfig(config)
1396
+ processResults = processResults({ config, errorHandler })
1444
1397
  // setup();
1445
1398
  const parser = new runtime.ArgumentParser({
1446
1399
  description: 'Entodicton knowledge module'
1447
1400
  })
1448
1401
 
1449
- const helpDebugAssociation = 'In order to get a debug break when a specific association is created set the DEBUG_ASSOCIATION environment variable to the JSON of the association to break on. For example DEBUG_ASSOCIATION=\'["the#0", "mammel#0"]\' })'
1450
- const helpDebugHierarchy = 'In order to get a debug break when a specific hierarchy is created set the DEBUG_HIERARCHY environment variable to the JSON of the child-parent pair to break on. For example DEBUG_HIERARCHY=\'["cat#1", "mammel#1"]\' })'
1451
- const helpDebugPriority = 'In order to get a debug break when a specific set of priorities is created set set DEBUG_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_PRIORITY=\'["verb#0", "article#0"]\' })'
1452
- const helpDebugBridge = 'In order to get a debug break when a specific bridge is created set the DEBUG_BRIDGE environment variable to id/level to break on. For example DEBUG_BRIDGE=\'id#level\' })'
1453
- const helpDebugOperator = 'In order to get a debug break when a specific hierarcy is created set the DEBUG_OPERATOR environment variable to debug any config loaded. For example DEBUG_OPERATOR=\'([operator] ([arg]))\' })'
1402
+ const helpDebugAssociation = 'In order to get a debug break when a specific association is created set the DEBUG_ASSOCIATION environment variable to the JSON of the association to break on. For example DEBUG_ASSOCIATION=\'[["the", 0], ["mammal", 1]]\''
1403
+ const helpDebugHierarchy = 'In order to get a debug break when a specific hierarchy is created set the DEBUG_HIERARCHY environment variable to the JSON of the child-parent pair to break on. For example DEBUG_HIERARCHY=\'[["cat", 1], ["mammel", 1]]\''
1404
+ const helpDebugPriority = 'In order to get a debug break when a specific set of priorities is created set set DEBUG_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_PRIORITY=\'[["verb", 0], ["article", 0]]\''
1405
+ const helpDebugContextualPriority = 'In order to get a debug break when a specific set of contextual priorities is created set set DEBUG_CONTEXTUAL_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_CONTEXTUAL_PRIORITY=\'{ context: [["verb", 0], ["article", 0], select: 1}\''
1406
+ const helpDebugBridge = 'In order to get a debug break when a specific bridge is created set the DEBUG_BRIDGE environment variable to id/level to break on. For example DEBUG_BRIDGE=\'id#level\''
1407
+ const helpDebugOperator = 'In order to get a debug break when a specific hierarcy is created set the DEBUG_OPERATOR environment variable to debug any config loaded. For example DEBUG_OPERATOR=\'([operator] ([arg]))\''
1454
1408
 
1455
1409
 
1456
1410
  parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
1457
1411
  parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
1458
1412
  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' })
1459
1413
  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' })
1414
+ parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
1460
1415
  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' })
1461
1416
  // 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.' })
1462
1417
  parser.add_argument('-rt', '--rebuildTemplate', { action: 'store_true', help: 'Force a template rebuild' })
@@ -1483,6 +1438,7 @@ const knowledgeModule = async ({
1483
1438
  parser.add_argument('-da', '--debugAssociation', { help: helpDebugAssociation })
1484
1439
  parser.add_argument('-dh', '--debugHierarchy', { help: helpDebugHierarchy })
1485
1440
  parser.add_argument('-dp', '--debugPriority', { help: helpDebugPriority })
1441
+ parser.add_argument('-dcp', '--debugContextualPriority', { help: helpDebugContextualPriority })
1486
1442
  parser.add_argument('-db', '--debugBridge', { help: helpDebugBridge })
1487
1443
  parser.add_argument('-do', '--debugOperator', { help: helpDebugOperator })
1488
1444
 
@@ -1559,6 +1515,10 @@ const knowledgeModule = async ({
1559
1515
 
1560
1516
  }
1561
1517
  config.load(template.template, template.instance, { rebuild: needsRebuild })
1518
+ if (config.name == 'ui') {
1519
+ console.log('config.COUNTER', config.COUNTER)
1520
+ debugger
1521
+ }
1562
1522
  if (needsRebuild) {
1563
1523
  return
1564
1524
  }
@@ -1566,20 +1526,8 @@ const knowledgeModule = async ({
1566
1526
 
1567
1527
  if (!args.save && !args.rebuildTemplate && !args.dontAddAssociations) {
1568
1528
  config.addAssociationsFromTests(config.tests);
1569
- //for (let query in config.tests) {
1570
- // config.addAssociations(config.tests[query].associations || []);
1571
- //}
1572
1529
  }
1573
1530
 
1574
- /*
1575
- if (args.buildTemplate) {
1576
- if (template) {
1577
- config.rebuild()
1578
- config.load(template.template, template.instance, { rebuild: true })
1579
- }
1580
- }
1581
- */
1582
-
1583
1531
  let configPrinted = false
1584
1532
  const printConfig = () => {
1585
1533
  if (configPrinted) {
@@ -1712,11 +1660,13 @@ const knowledgeModule = async ({
1712
1660
  if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1713
1661
  hasError = true
1714
1662
  }
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
1663
+ if (!args.testNoParenthesized) {
1664
+ if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
1665
+ hasError = true
1666
+ }
1667
+ if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
1668
+ hasError = true
1669
+ }
1720
1670
  }
1721
1671
  if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
1722
1672
  hasError = true
@@ -1742,9 +1692,13 @@ const knowledgeModule = async ({
1742
1692
  }
1743
1693
  }
1744
1694
  show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
1745
- show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
1695
+ if (!args.testNoParenthesized) {
1696
+ show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
1697
+ }
1746
1698
  show('responses', result.expected.responses, result.actual.responses)
1747
- show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
1699
+ if (!args.testNoParenthesized) {
1700
+ show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
1701
+ }
1748
1702
  /*
1749
1703
  if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
1750
1704
  if (!headerShown) {
@@ -1821,7 +1775,6 @@ const knowledgeModule = async ({
1821
1775
  if (query.length === 0) {
1822
1776
  return readline.close()
1823
1777
  }
1824
- // const promise = processResults(_process(config, query, { testsFN: test }))
1825
1778
  const promise = _process(config, query, { testsFN: test }).then((results) => {
1826
1779
  console.log(results.responses.join(' '))
1827
1780
  })
@@ -1849,7 +1802,6 @@ const knowledgeModule = async ({
1849
1802
  if (args.objectDiff) {
1850
1803
  global.beforeObjects = _.cloneDeep(objects)
1851
1804
  }
1852
- config.beforeQuery({ query: args.query, isModule: false, objects })
1853
1805
  try {
1854
1806
  await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
1855
1807
  } catch( error ) {
@@ -1858,11 +1810,55 @@ const knowledgeModule = async ({
1858
1810
  }
1859
1811
  printConfig()
1860
1812
  } else {
1861
- config.addAssociationsFromTests(config.tests);
1862
- //for (let query in config.tests) {
1863
- // config.addAssociations(config.tests[query].associations || []);
1864
- //}
1865
- module()
1813
+ const initConfig = (config) => {
1814
+ setupConfig(config)
1815
+
1816
+ let loadForTesting = false
1817
+ if (global.theprogrammablemind) {
1818
+ if (global.theprogrammablemind.loadForTesting[config.name]) {
1819
+ loadForTesting = true
1820
+ }
1821
+ }
1822
+ // remove test only stuff
1823
+ if (!isProcess && !loadForTesting) {
1824
+ config.config.operators = config.config.operators.filter( (operator) => {
1825
+ if (operator.development) {
1826
+ return false
1827
+ } else {
1828
+ return true
1829
+ }
1830
+ })
1831
+ config.config.bridges = config.config.bridges.filter( (bridge) => {
1832
+ if (bridge.development) {
1833
+ return false
1834
+ } else {
1835
+ return true
1836
+ }
1837
+ })
1838
+ }
1839
+
1840
+ if (template) {
1841
+ if (config.needsRebuild(template.template, template.instance, { isModule: !isProcess })) {
1842
+ 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.`
1843
+ throw new Error(error)
1844
+ }
1845
+ try {
1846
+ config.load(template.template, template.instance)
1847
+ } catch( e ) {
1848
+ errorHandler(e)
1849
+ }
1850
+ }
1851
+
1852
+ config.addAssociationsFromTests(config.tests);
1853
+ }
1854
+
1855
+ createConfigExport = () => {
1856
+ const config = createConfig()
1857
+ initConfig(config)
1858
+ config.rebuild({ isModule: true })
1859
+ return config
1860
+ }
1861
+ moduleFromJSFile.exports = createConfigExport
1866
1862
  }
1867
1863
 
1868
1864
  }
@@ -1918,7 +1914,7 @@ module.exports = {
1918
1914
  w,
1919
1915
  // submitBug,
1920
1916
  ensureTestFile,
1921
- build,
1917
+ rebuildTemplate,
1922
1918
  processContext,
1923
1919
  processContexts,
1924
1920
  runTests,
@@ -1930,8 +1926,9 @@ module.exports = {
1930
1926
  Digraph,
1931
1927
  analyzeMetaData,
1932
1928
  processContextsB,
1933
- processInstance,
1929
+ loadInstance,
1934
1930
  gs,
1935
1931
  flattens,
1936
1932
  writeTest
1937
1933
  }
1934
+