theprogrammablemind 7.5.8-beta.1 → 7.5.8-beta.3
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 +239 -113
- package/lines.js +1 -1
- package/package.json +1 -1
- package/src/config.js +172 -117
- package/src/generators.js +2 -2
- package/src/helpers.js +19 -3
- package/src/semantics.js +1 -1
package/client.js
CHANGED
@@ -288,7 +288,7 @@ const writeTestFile = (fn, tests) => {
|
|
288
288
|
runtime.fs.writeFileSync(fn, stringify(tests, { space: 2 }), { encoding: 'utf8', flag: 'w+' })
|
289
289
|
}
|
290
290
|
|
291
|
-
const writeTest = (fn, query, objects, generated, paraphrases, responses, contexts, associations, metadata, config, saveDeveloper) => {
|
291
|
+
const writeTest = (fn, query, objects, generated, paraphrases, responses, contexts, associations, metadata, config, saveDeveloper, paraphrasesParenthesized, generatedParenthesized) => {
|
292
292
|
let tests = []
|
293
293
|
if (runtime.fs.existsSync(fn)) {
|
294
294
|
tests = JSON.parse(runtime.fs.readFileSync(fn))
|
@@ -298,7 +298,19 @@ const writeTest = (fn, query, objects, generated, paraphrases, responses, contex
|
|
298
298
|
}
|
299
299
|
associations.sort()
|
300
300
|
// tests[query] = sortJson({ paraphrases, responses, contexts, objects: convertToStable(objects), associations, metadata, config, developerTest: saveDeveloper }, { depth: 25 })
|
301
|
-
|
301
|
+
debugger
|
302
|
+
results = sortJson({
|
303
|
+
query,
|
304
|
+
paraphrases,
|
305
|
+
responses,
|
306
|
+
contexts,
|
307
|
+
objects: convertToStable(objects),
|
308
|
+
associations,
|
309
|
+
metadata,
|
310
|
+
config,
|
311
|
+
developerTest: saveDeveloper,
|
312
|
+
paraphrasesParenthesized,
|
313
|
+
generatedParenthesized }, { depth: 25 })
|
302
314
|
let wasSet = false;
|
303
315
|
tests.forEach( (test, index) => {
|
304
316
|
if (test.query == query) {
|
@@ -360,6 +372,8 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
360
372
|
const contextsPrime = []
|
361
373
|
const generatedPrime = []
|
362
374
|
const paraphrasesPrime = []
|
375
|
+
const paraphrasesParenthesizedPrime = []
|
376
|
+
const generatedParenthesizedPrime = []
|
363
377
|
const responsesPrime = []
|
364
378
|
const contexts = setupContexts(json.contexts)
|
365
379
|
|
@@ -423,7 +437,13 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
423
437
|
continue
|
424
438
|
}
|
425
439
|
let assumed = { isResponse: true };
|
426
|
-
const generated = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
|
440
|
+
const generated = contextPrime.isResponse ? config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0] : ''
|
441
|
+
let generatedParenthesized = []
|
442
|
+
if (isTest) {
|
443
|
+
config.parenthesized = true
|
444
|
+
generatedParenthesized = contextPrime.isResponse ? config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0] : ''
|
445
|
+
config.parenthesized = false
|
446
|
+
}
|
427
447
|
// assumed = { paraphrase: true, response: false };
|
428
448
|
assumed = { paraphrase: true };
|
429
449
|
args.g = (c) => config.getGenerators(json.logs).apply(args, c, assumed)
|
@@ -432,7 +452,16 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
432
452
|
args.gs = gs(args.g)
|
433
453
|
args.gsp = gs(args.gsp)
|
434
454
|
args.gsr = gs(args.gr)
|
455
|
+
if (isTest) {
|
456
|
+
config.parenthesized = false
|
457
|
+
}
|
435
458
|
const paraphrases = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
|
459
|
+
let paraphrasesParenthesized = []
|
460
|
+
if (isTest) {
|
461
|
+
config.parenthesized = true
|
462
|
+
paraphrasesParenthesized = config.getGenerators(json.logs).apply(args, contextPrime, assumed)[0]
|
463
|
+
config.parenthesized = false
|
464
|
+
}
|
436
465
|
args.g = (c) => config.getGenerators(json.logs).apply(args, c)
|
437
466
|
args.gp = (c) => config.getGenerators(json.logs).apply(args, {...c, paraphrase: true, isResponse: false, response: false })
|
438
467
|
args.gr = (c) => config.getGenerators(json.logs).apply(args, {...c, paraphrase: false })
|
@@ -442,6 +471,10 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
442
471
|
contextsPrime.push(contextPrime)
|
443
472
|
generatedPrime.push(generated)
|
444
473
|
paraphrasesPrime.push(paraphrases)
|
474
|
+
if (isTest) {
|
475
|
+
paraphrasesParenthesizedPrime.push(paraphrasesParenthesized)
|
476
|
+
generatedParenthesizedPrime.push(generatedParenthesized)
|
477
|
+
}
|
445
478
|
if (contextPrime.isResponse) {
|
446
479
|
responsesPrime.push(generated)
|
447
480
|
} else {
|
@@ -451,7 +484,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
451
484
|
// add results to processed list
|
452
485
|
config.config.objects.processed = config.config.objects.processed || []
|
453
486
|
config.config.objects.processed = config.config.objects.processed.slice(0, 5)
|
454
|
-
config.config.objects.processed.unshift({ context: contextPrime, paraphrases: paraphrases, responses: responsesPrime })
|
487
|
+
config.config.objects.processed.unshift({ context: contextPrime, paraphrases: paraphrases, paraphrasesParenthesized, generatedParenthesized, responses: responsesPrime })
|
455
488
|
} catch (e) {
|
456
489
|
if (Array.isArray(e)) {
|
457
490
|
e = {
|
@@ -471,7 +504,7 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
471
504
|
throw e
|
472
505
|
}
|
473
506
|
}
|
474
|
-
return { contextsPrime, generatedPrime, paraphrasesPrime, responsesPrime }
|
507
|
+
return { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime }
|
475
508
|
}
|
476
509
|
|
477
510
|
const doWithRetries = async (n, url, queryParams, data) => {
|
@@ -493,17 +526,17 @@ const doWithRetries = async (n, url, queryParams, data) => {
|
|
493
526
|
}
|
494
527
|
if (result.status === 504) {
|
495
528
|
if (n === 0) {
|
496
|
-
throw `Error ${result.status} - ${result.statusText}`
|
529
|
+
throw new Error(`Error ${result.status} - ${result.statusText}`)
|
497
530
|
} else {
|
498
531
|
continue
|
499
532
|
}
|
500
533
|
}
|
501
534
|
if (result.status >= 500 && result.status < 600) {
|
502
|
-
throw `Error ${result.status} - ${result.statusText}.`
|
535
|
+
throw new Error(`Error ${result.status} - ${result.statusText}.`)
|
503
536
|
} if (result.status >= 404) {
|
504
|
-
throw `Error ${result.status} - ${result.statusText} - Trying it connect to ${url}`
|
537
|
+
throw new Error(`Error ${result.status} - ${result.statusText} - Trying it connect to ${url}`)
|
505
538
|
} else {
|
506
|
-
throw `Error ${result.status} - ${result.statusText}`
|
539
|
+
throw new Error(`Error ${result.status} - ${result.statusText}`)
|
507
540
|
}
|
508
541
|
}
|
509
542
|
}
|
@@ -598,6 +631,8 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
|
|
598
631
|
contexts: [],
|
599
632
|
generated: [],
|
600
633
|
paraphrases: [],
|
634
|
+
paraphrasesParenthesized: [],
|
635
|
+
generatedParenthesized: [],
|
601
636
|
responses: [],
|
602
637
|
associations: [],
|
603
638
|
}
|
@@ -633,7 +668,7 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
|
|
633
668
|
if (json.status !== 200) {
|
634
669
|
throw json
|
635
670
|
} else {
|
636
|
-
const { contextsPrime, generatedPrime, paraphrasesPrime, responsesPrime } =
|
671
|
+
const { contextsPrime, generatedPrime, paraphrasesPrime, paraphrasesParenthesizedPrime, generatedParenthesizedPrime, responsesPrime } =
|
637
672
|
processContextsB({ isTest, config, hierarchy, json, commandLineArgs /*, generators, semantics */ })
|
638
673
|
response.associations = json.associations
|
639
674
|
response.hierarchy = json.hierarchy
|
@@ -650,6 +685,8 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
|
|
650
685
|
response.contexts = response.contexts.concat(contextsPrime)
|
651
686
|
response.generated = response.generated.concat(generatedPrime)
|
652
687
|
response.paraphrases = response.paraphrases.concat(paraphrasesPrime)
|
688
|
+
response.paraphrasesParenthesized = response.paraphrasesParenthesized.concat(paraphrasesParenthesizedPrime)
|
689
|
+
response.generatedParenthesized = response.generatedParenthesized.concat(generatedParenthesizedPrime)
|
653
690
|
response.responses = response.responses.concat(responsesPrime)
|
654
691
|
queries = queries.slice(1)
|
655
692
|
}
|
@@ -657,13 +694,13 @@ const _process = async (config, query, { initializer, commandLineArgs, credentia
|
|
657
694
|
|
658
695
|
if (writeTests) {
|
659
696
|
const actual_config = getConfigForTest(config, testConfig)
|
660
|
-
writeTest(testsFN, query, config.config.objects, response.generated, response.paraphrases, response.responses, response.contexts, response.associations, response.metadata, actual_config, saveDeveloper)
|
697
|
+
writeTest(testsFN, query, config.config.objects, response.generated, response.paraphrases, response.responses, response.contexts, response.associations, response.metadata, actual_config, saveDeveloper, response.paraphrasesParenthesized, response.generatedParenthesized)
|
661
698
|
}
|
662
699
|
|
663
700
|
return response
|
664
701
|
} catch(error) {
|
665
702
|
error.query = query
|
666
|
-
|
703
|
+
errorHandler(error)
|
667
704
|
}
|
668
705
|
}
|
669
706
|
|
@@ -697,11 +734,13 @@ const getConfigForTest = (config, testConfig) => {
|
|
697
734
|
return configForTest
|
698
735
|
}
|
699
736
|
|
700
|
-
const runTest = async (config, expected, { verbose, afterTest, testConfig, debug }) => {
|
737
|
+
const runTest = async (config, expected, { args, verbose, afterTest, testConfig, debug }) => {
|
701
738
|
const test = expected.query
|
702
739
|
// initialize in between test so state is not preserved since the test was adding without state
|
703
740
|
config.rebuild()
|
704
|
-
|
741
|
+
if (!args.dontAddAssociations) {
|
742
|
+
config.addAssociationsFromTests(config.tests)
|
743
|
+
}
|
705
744
|
// config.addAssocationsFromTests(
|
706
745
|
const errorHandler = (error) => {
|
707
746
|
if (error.metadata) {
|
@@ -736,8 +775,11 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
736
775
|
lines.log()
|
737
776
|
}
|
738
777
|
const expected_objects = sortJson(convertToStable(expected.objects), { depth: 25 })
|
778
|
+
delete expected_objects.nameToUUID
|
739
779
|
const actual_objects = sortJson(convertToStable(config.config.objects), { depth: 25 })
|
740
780
|
const failed_paraphrases = !matching(result.paraphrases, expected.paraphrases)
|
781
|
+
const failed_paraphrasesParenthesized = !matching(result.paraphrasesParenthesized, expected.paraphrasesParenthesized)
|
782
|
+
const failed_generatedParenthesized = !matching(result.generatedParenthesized, expected.generatedParenthesized)
|
741
783
|
const failed_responses = !matching(result.responses, expected.responses)
|
742
784
|
const failed_contexts = !matching(result.contexts, expected.contexts)
|
743
785
|
const failed_objects = !matching(actual_objects, expected_objects)
|
@@ -782,7 +824,7 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
782
824
|
const actual_config = sortJson(convertToStable(getConfigForTest(config, testConfig)), { depth: 25 })
|
783
825
|
const expected_config = sortJson(convertToStable(expected.config), { depth: 25 })
|
784
826
|
const failed_config = !matching(actual_config, expected_config)
|
785
|
-
let failed = failed_paraphrases || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked
|
827
|
+
let failed = failed_paraphrases || failed_paraphrasesParenthesized || failed_generatedParenthesized || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked
|
786
828
|
if (!failed) {
|
787
829
|
if (config.afterTest) {
|
788
830
|
failed = config.afterTest({ query: test, expected, actual: result, config })
|
@@ -790,8 +832,26 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
790
832
|
return {
|
791
833
|
utterance: test,
|
792
834
|
errorFromAfterTest: failed,
|
793
|
-
expected: {
|
794
|
-
|
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
|
+
}
|
795
855
|
}
|
796
856
|
}
|
797
857
|
}
|
@@ -807,8 +867,26 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
807
867
|
if (failed) {
|
808
868
|
return {
|
809
869
|
utterance: test,
|
810
|
-
expected: {
|
811
|
-
|
870
|
+
expected: {
|
871
|
+
responses: expected.responses,
|
872
|
+
paraphrases: expected.paraphrases,
|
873
|
+
paraphrasesParenthesized: expected.paraphrasesParenthesized,
|
874
|
+
generatedParenthesized: expected.generatedParenthesized,
|
875
|
+
results: expected.contexts,
|
876
|
+
checked: expected_checked,
|
877
|
+
objects: expected_objects,
|
878
|
+
config: expected.config
|
879
|
+
},
|
880
|
+
actual: {
|
881
|
+
responses: result.responses,
|
882
|
+
paraphrases: result.paraphrases,
|
883
|
+
paraphrasesParenthesized: result.paraphrasesParenthesized,
|
884
|
+
generatedParenthesized: result.generatedParenthesized,
|
885
|
+
results: result.contexts,
|
886
|
+
checked: actual_checked,
|
887
|
+
objects: actual_objects,
|
888
|
+
config: actual_config
|
889
|
+
}
|
812
890
|
}
|
813
891
|
}
|
814
892
|
} catch(error) {
|
@@ -866,13 +944,11 @@ const saveTest = async (testFile, config, test, expected, testConfig, saveDevelo
|
|
866
944
|
const args = {
|
867
945
|
}
|
868
946
|
const saveObjects = {...config.config.objects}
|
869
|
-
/*
|
870
947
|
saveObjects.nameToUUID = {}
|
871
948
|
for (let km of config.configs) {
|
872
949
|
saveObjects.nameToUUID[km.name] = km.uuid
|
873
950
|
}
|
874
|
-
|
875
|
-
writeTest(testFile, test, saveObjects, result.generated, result.paraphrases, result.responses, result.contexts, result.associations, result.metadata, actualConfig, saveDeveloper)
|
951
|
+
writeTest(testFile, test, saveObjects, result.generated, result.paraphrases, result.responses, result.contexts, result.associations, result.metadata, actualConfig, saveDeveloper, result.paraphrasesParenthesized, result.generatedParenthesized)
|
876
952
|
}
|
877
953
|
|
878
954
|
const saveTestsHelper = async (testFile, config, tests, todo, testConfig, saveDeveloper) => {
|
@@ -1174,7 +1250,9 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
|
|
1174
1250
|
defaultInnerProcess(config, defaultErrorHandler, results)
|
1175
1251
|
}
|
1176
1252
|
if (results.contexts.length > 1) {
|
1177
|
-
console.log(`query ${query.query}. There is ${results.contexts.length} contexts in the results. Make sure its producing the results that you expect.`)
|
1253
|
+
console.log(`query "${query.query}". There is ${results.contexts.length} contexts in the results. Make sure its producing the results that you expect.`)
|
1254
|
+
} else if (results.paraphrases[0] != query.query) {
|
1255
|
+
console.log(`query "${query.query}". The paraphrase is different from the query "${results.paraphrases[0]}".`)
|
1178
1256
|
} else {
|
1179
1257
|
console.log(`query ${query.query}`)
|
1180
1258
|
}
|
@@ -1283,19 +1361,19 @@ const knowledgeModule = async ({
|
|
1283
1361
|
const testConfig = test
|
1284
1362
|
|
1285
1363
|
if (!moduleFromJSFile) {
|
1286
|
-
throw "'module' is a required parameter. The value should be either 'module' or a lambda that will be called when the file is acting as a module."
|
1364
|
+
throw new Error("'module' is a required parameter. The value should be either 'module' or a lambda that will be called when the file is acting as a module.")
|
1287
1365
|
}
|
1288
1366
|
if (!config) {
|
1289
|
-
throw "'config' is a required parameter. The value should the config that defines the knowledge module."
|
1367
|
+
throw new Error("'config' is a required parameter. The value should the config that defines the knowledge module.")
|
1290
1368
|
}
|
1291
1369
|
if (!config.name) {
|
1292
|
-
throw "config must have 'name' set to the knowledge module name."
|
1370
|
+
throw new Error("config must have 'name' set to the knowledge module name.")
|
1293
1371
|
}
|
1294
1372
|
if (!description) {
|
1295
|
-
throw "'description' is a required parameter. The value should the description of the knowledge module."
|
1373
|
+
throw new Error("'description' is a required parameter. The value should the description of the knowledge module.")
|
1296
1374
|
}
|
1297
1375
|
if (!test) {
|
1298
|
-
throw "'test' is a required parameter. The value should the path to the file used to store the tests of the knowledge module and the contents of the file in the form { name: <filePath>, contexts: <json> }."
|
1376
|
+
throw new Error("'test' is a required parameter. The value should the path to the file used to store the tests of the knowledge module and the contents of the file in the form { name: <filePath>, contexts: <json> }.")
|
1299
1377
|
}
|
1300
1378
|
|
1301
1379
|
const isProcess = require.main === moduleFromJSFile
|
@@ -1353,7 +1431,7 @@ const knowledgeModule = async ({
|
|
1353
1431
|
if (!isProcess) {
|
1354
1432
|
if (template) {
|
1355
1433
|
if (config.needsRebuild(template.template, template.instance)) {
|
1356
|
-
throw `This module "${config.name}" cannot be used because the instance file needs rebuilding. Run on the command line with no arguements or the -rt argument to rebuild.`
|
1434
|
+
throw new Error(`This module "${config.name}" cannot be used because the instance file needs rebuilding. Run on the command line with no arguements or the -rt argument to rebuild.`)
|
1357
1435
|
}
|
1358
1436
|
try {
|
1359
1437
|
config.load(template.template, template.instance)
|
@@ -1368,6 +1446,13 @@ const knowledgeModule = async ({
|
|
1368
1446
|
description: 'Entodicton knowledge module'
|
1369
1447
|
})
|
1370
1448
|
|
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]))\' })'
|
1454
|
+
|
1455
|
+
|
1371
1456
|
parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
|
1372
1457
|
parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
|
1373
1458
|
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' })
|
@@ -1385,6 +1470,7 @@ const knowledgeModule = async ({
|
|
1385
1470
|
parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
|
1386
1471
|
parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
|
1387
1472
|
parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
|
1473
|
+
parser.add_argument('--parenthesized', { action: 'store_true', help: 'Show the generated phrases with parenthesis.' })
|
1388
1474
|
parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
|
1389
1475
|
parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
|
1390
1476
|
parser.add_argument('-daa', '--dontAddAssociations', { action: 'store_true', help: 'Do not add associations from the tests.' })
|
@@ -1394,30 +1480,38 @@ const knowledgeModule = async ({
|
|
1394
1480
|
parser.add_argument('-dic', '--debugIncludeConvolutions', { action: 'store_true', help: 'When running with the --debugIncludeConvolutions flag the logs will include convolutions which are somewhat annoying verbose. Default is false' })
|
1395
1481
|
parser.add_argument('-dl', '--debugLoops', { action: 'store_true', help: 'When running with the --debugLoops flag the logs calls to semantics and generators will be immediately written to the console '})
|
1396
1482
|
parser.add_argument('-d', '--debug', { action: 'store_true', help: 'When running with the --debug flag this set the debug flag in the config' })
|
1397
|
-
parser.add_argument('-da', '--debugAssociation', { help:
|
1398
|
-
parser.add_argument('-dh', '--debugHierarchy', { help:
|
1399
|
-
parser.add_argument('-
|
1400
|
-
parser.add_argument('-
|
1483
|
+
parser.add_argument('-da', '--debugAssociation', { help: helpDebugAssociation })
|
1484
|
+
parser.add_argument('-dh', '--debugHierarchy', { help: helpDebugHierarchy })
|
1485
|
+
parser.add_argument('-dp', '--debugPriority', { help: helpDebugPriority })
|
1486
|
+
parser.add_argument('-db', '--debugBridge', { help: helpDebugBridge })
|
1487
|
+
parser.add_argument('-do', '--debugOperator', { help: helpDebugOperator })
|
1401
1488
|
|
1402
1489
|
const args = parser.parse_args()
|
1403
1490
|
args.count = args.count || 1
|
1404
1491
|
|
1492
|
+
if (args.parenthesized) {
|
1493
|
+
config.parenthesized = true
|
1494
|
+
}
|
1495
|
+
|
1405
1496
|
if (args.debugAssociation) {
|
1406
|
-
|
1497
|
+
console.log(helpDebugAssociation)
|
1498
|
+
runtime.process.exit(-1)
|
1407
1499
|
}
|
1408
1500
|
if (args.debugHierarchy) {
|
1409
|
-
|
1501
|
+
console.log(helpDebugHierarchy)
|
1502
|
+
runtime.process.exit(-1)
|
1503
|
+
}
|
1504
|
+
if (args.debugPriority) {
|
1505
|
+
console.log(helpDebugPriority)
|
1506
|
+
runtime.process.exit(-1)
|
1410
1507
|
}
|
1411
1508
|
if (args.debugBridge) {
|
1412
|
-
|
1413
|
-
|
1414
|
-
if (global.entodictonDebugBridge.length !== 2) {
|
1415
|
-
console.log('Expected DEBUG_BRIDGE to be of the form "id/level"');
|
1416
|
-
}
|
1509
|
+
console.log(helpDebugBridge)
|
1510
|
+
runtime.process.exit(-1)
|
1417
1511
|
}
|
1418
1512
|
if (args.debugOperator) {
|
1419
|
-
|
1420
|
-
|
1513
|
+
console.log(helpDebugOperator)
|
1514
|
+
runtime.process.exit(-1)
|
1421
1515
|
}
|
1422
1516
|
|
1423
1517
|
if (args.clean) {
|
@@ -1486,87 +1580,94 @@ const knowledgeModule = async ({
|
|
1486
1580
|
}
|
1487
1581
|
*/
|
1488
1582
|
|
1489
|
-
|
1490
|
-
|
1491
|
-
|
1492
|
-
|
1493
|
-
for (const test of config.tests) {
|
1494
|
-
console.log(`${counter} - ${test.query}`)
|
1495
|
-
counter += 1
|
1496
|
-
}
|
1497
|
-
}
|
1498
|
-
if (args.print.includes('c')) {
|
1499
|
-
const { data } = setupProcessB({ config })
|
1500
|
-
console.log("Config as sent to server")
|
1501
|
-
console.log(JSON.stringify(data, null, 2));
|
1583
|
+
let configPrinted = false
|
1584
|
+
const printConfig = () => {
|
1585
|
+
if (configPrinted) {
|
1586
|
+
return
|
1502
1587
|
}
|
1588
|
+
configPrinted = true
|
1589
|
+
if (args.print) {
|
1590
|
+
if (args.print.includes('t')) {
|
1591
|
+
console.log("Test queries")
|
1592
|
+
let counter = 0
|
1593
|
+
for (const test of config.tests) {
|
1594
|
+
console.log(`${counter} - ${test.query}`)
|
1595
|
+
counter += 1
|
1596
|
+
}
|
1597
|
+
}
|
1598
|
+
if (args.print.includes('c')) {
|
1599
|
+
const { data } = setupProcessB({ config })
|
1600
|
+
console.log("Config as sent to server")
|
1601
|
+
console.log(JSON.stringify(data, null, 2));
|
1602
|
+
}
|
1503
1603
|
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1507
|
-
|
1604
|
+
if (args.print.includes('l')) {
|
1605
|
+
console.log('Module load ordering')
|
1606
|
+
for (const km of config.configs) {
|
1607
|
+
console.log(` ${km.name}`)
|
1608
|
+
}
|
1508
1609
|
}
|
1509
|
-
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1610
|
+
if (args.print.includes('w')) {
|
1611
|
+
for (const word in config.config.words) {
|
1612
|
+
console.log(word.concat(' ', ...config.config.words[word].map((def) => JSON.stringify(def))))
|
1613
|
+
}
|
1513
1614
|
}
|
1514
|
-
|
1515
|
-
|
1516
|
-
|
1517
|
-
|
1615
|
+
if (args.print.includes('b')) {
|
1616
|
+
for (const bridge of config.config.bridges) {
|
1617
|
+
console.log(JSON.stringify(bridge))
|
1618
|
+
}
|
1518
1619
|
}
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1620
|
+
if (args.print.includes('o')) {
|
1621
|
+
for (const operator of config.config.operators) {
|
1622
|
+
console.log(JSON.stringify(operator))
|
1623
|
+
}
|
1523
1624
|
}
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1530
|
-
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1625
|
+
if (args.print.includes('j')) {
|
1626
|
+
const { data } = setupProcessB( { config } )
|
1627
|
+
console.log(JSON.stringify(data, null, 2))
|
1628
|
+
}
|
1629
|
+
if (args.print.includes('a')) {
|
1630
|
+
console.log('associations ================')
|
1631
|
+
const properties = ['negative', 'positive']
|
1632
|
+
for (let property of properties) {
|
1633
|
+
console.log(` ${property} ===============`)
|
1634
|
+
for (let association of config.config.associations[property]) {
|
1635
|
+
console.log(` ${JSON.stringify(association)}`)
|
1636
|
+
}
|
1536
1637
|
}
|
1537
1638
|
}
|
1538
|
-
|
1539
|
-
|
1540
|
-
console.log(JSON.stringify(config.config.objects, null, 2))
|
1541
|
-
}
|
1542
|
-
if (args.print.includes('p')) {
|
1543
|
-
for (let priority of config.config.priorities) {
|
1544
|
-
console.log(JSON.stringify(priority))
|
1639
|
+
if (args.print.includes('d')) {
|
1640
|
+
console.log(JSON.stringify(config.config.objects, null, 2))
|
1545
1641
|
}
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1549
|
-
|
1642
|
+
if (args.print.includes('p')) {
|
1643
|
+
for (let priority of config.config.priorities) {
|
1644
|
+
console.log(JSON.stringify(priority))
|
1645
|
+
}
|
1550
1646
|
}
|
1551
|
-
|
1552
|
-
|
1553
|
-
|
1554
|
-
for (const semantic of easyToRead) {
|
1555
|
-
semantic.match = semantic.match.toString()
|
1556
|
-
semantic.apply = semantic.apply.toString()
|
1557
|
-
if (semantic.applyWrapped) {
|
1558
|
-
semantic.applyWrapped = semantic.applyWrapped.toString()
|
1647
|
+
if (args.print.includes('h')) {
|
1648
|
+
for (let edge of config.config.hierarchy) {
|
1649
|
+
console.log(JSON.stringify(edge))
|
1559
1650
|
}
|
1560
1651
|
}
|
1561
|
-
|
1562
|
-
|
1563
|
-
|
1564
|
-
|
1565
|
-
|
1566
|
-
|
1567
|
-
|
1652
|
+
if (args.print.includes('g')) {
|
1653
|
+
const easyToRead = _.cloneDeep(config.config.generators)
|
1654
|
+
for (const semantic of easyToRead) {
|
1655
|
+
semantic.match = semantic.match.toString()
|
1656
|
+
semantic.apply = semantic.apply.toString()
|
1657
|
+
if (semantic.applyWrapped) {
|
1658
|
+
semantic.applyWrapped = semantic.applyWrapped.toString()
|
1659
|
+
}
|
1660
|
+
}
|
1661
|
+
console.dir(easyToRead)
|
1662
|
+
}
|
1663
|
+
if (args.print.includes('s')) {
|
1664
|
+
const easyToRead = _.cloneDeep(config.config.semantics)
|
1665
|
+
for (const semantic of easyToRead) {
|
1666
|
+
semantic.match = semantic.match.toString()
|
1667
|
+
semantic.apply = semantic.apply.toString()
|
1668
|
+
}
|
1669
|
+
console.dir(easyToRead)
|
1568
1670
|
}
|
1569
|
-
console.dir(easyToRead)
|
1570
1671
|
}
|
1571
1672
|
}
|
1572
1673
|
|
@@ -1601,7 +1702,7 @@ const knowledgeModule = async ({
|
|
1601
1702
|
test = useTestConfig.name
|
1602
1703
|
|
1603
1704
|
}
|
1604
|
-
runTests(config, test, { debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
|
1705
|
+
runTests(config, test, { args, debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
|
1605
1706
|
let newError = false
|
1606
1707
|
if (results.length > 0) {
|
1607
1708
|
let headerShown = false
|
@@ -1611,6 +1712,12 @@ const knowledgeModule = async ({
|
|
1611
1712
|
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1612
1713
|
hasError = true
|
1613
1714
|
}
|
1715
|
+
if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
|
1716
|
+
hasError = true
|
1717
|
+
}
|
1718
|
+
if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
|
1719
|
+
hasError = true
|
1720
|
+
}
|
1614
1721
|
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1615
1722
|
hasError = true
|
1616
1723
|
}
|
@@ -1623,6 +1730,22 @@ const knowledgeModule = async ({
|
|
1623
1730
|
console.log('**************************** ERRORS ************************')
|
1624
1731
|
for (const result of results) {
|
1625
1732
|
console.log('Utterance: ', result.utterance)
|
1733
|
+
const show = (label, expected, actual) => {
|
1734
|
+
if (JSON.stringify(expected) !== JSON.stringify(actual)) {
|
1735
|
+
if (!headerShown) {
|
1736
|
+
console.log(' Failure')
|
1737
|
+
}
|
1738
|
+
console.log(` expected ${label}`, expected)
|
1739
|
+
console.log(` actual ${label} `, actual)
|
1740
|
+
newError = true
|
1741
|
+
headerShown = true
|
1742
|
+
}
|
1743
|
+
}
|
1744
|
+
show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
|
1745
|
+
show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
|
1746
|
+
show('responses', result.expected.responses, result.actual.responses)
|
1747
|
+
show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
|
1748
|
+
/*
|
1626
1749
|
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1627
1750
|
if (!headerShown) {
|
1628
1751
|
console.log(' Failure')
|
@@ -1641,6 +1764,7 @@ const knowledgeModule = async ({
|
|
1641
1764
|
newError = true
|
1642
1765
|
headerShown = true
|
1643
1766
|
}
|
1767
|
+
*/
|
1644
1768
|
if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
|
1645
1769
|
if (!headerShown) {
|
1646
1770
|
console.log(' Failure')
|
@@ -1702,7 +1826,7 @@ const knowledgeModule = async ({
|
|
1702
1826
|
console.log(results.responses.join(' '))
|
1703
1827
|
})
|
1704
1828
|
if (!('then' in promise)) {
|
1705
|
-
throw 'Return a promise from process in the definition of knowledgeModule'
|
1829
|
+
throw new Error('Return a promise from process in the definition of knowledgeModule')
|
1706
1830
|
}
|
1707
1831
|
promise
|
1708
1832
|
.then(() => {
|
@@ -1727,11 +1851,12 @@ const knowledgeModule = async ({
|
|
1727
1851
|
}
|
1728
1852
|
config.beforeQuery({ query: args.query, isModule: false, objects })
|
1729
1853
|
try {
|
1730
|
-
processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
|
1854
|
+
await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
|
1731
1855
|
} catch( error ) {
|
1732
1856
|
console.log('Error', error);
|
1733
1857
|
}
|
1734
1858
|
}
|
1859
|
+
printConfig()
|
1735
1860
|
} else {
|
1736
1861
|
config.addAssociationsFromTests(config.tests);
|
1737
1862
|
//for (let query in config.tests) {
|
@@ -1739,6 +1864,7 @@ const knowledgeModule = async ({
|
|
1739
1864
|
//}
|
1740
1865
|
module()
|
1741
1866
|
}
|
1867
|
+
|
1742
1868
|
}
|
1743
1869
|
|
1744
1870
|
/*
|
package/lines.js
CHANGED
@@ -13,7 +13,7 @@ class Lines {
|
|
13
13
|
setElement (row, column, value) {
|
14
14
|
const values = value.toString().split('\n')
|
15
15
|
if (column >= this.widths.length) {
|
16
|
-
throw "Column out of range."
|
16
|
+
throw new Error("Column out of range.")
|
17
17
|
}
|
18
18
|
const width = this.widths[column]
|
19
19
|
let index = 0
|
package/package.json
CHANGED
package/src/config.js
CHANGED
@@ -5,6 +5,7 @@ const { Generators } = require('./generators')
|
|
5
5
|
const client = require('../client')
|
6
6
|
const DigraphInternal = require('./digraph_internal')
|
7
7
|
const helpers = require('./helpers')
|
8
|
+
const { ecatch } = require('./helpers')
|
8
9
|
const runtime = require('../runtime')
|
9
10
|
const _ = require('lodash')
|
10
11
|
|
@@ -22,103 +23,131 @@ const indent = (string, indent) => {
|
|
22
23
|
}
|
23
24
|
|
24
25
|
const handleBridgeProps = (config, bridge) => {
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
bridge.level = 0
|
30
|
-
}
|
31
|
-
if (bridge.children) {
|
32
|
-
for (let child of bridge.children) {
|
33
|
-
config.addHierarchy(child, bridge.id)
|
34
|
-
}
|
35
|
-
}
|
36
|
-
if (bridge.parents) {
|
37
|
-
for (let parent of bridge.parents) {
|
38
|
-
config.addHierarchy(bridge.id, parent)
|
39
|
-
}
|
40
|
-
}
|
41
|
-
if (bridge.isA) {
|
42
|
-
for (let parent of bridge.isA) {
|
43
|
-
config.addHierarchy(bridge.id, parent)
|
44
|
-
}
|
45
|
-
}
|
46
|
-
if (bridge.before) {
|
47
|
-
for (let after of bridge.before) {
|
48
|
-
if (typeof after == 'string') {
|
49
|
-
after = [after, 0]
|
26
|
+
ecatch(`While processing the bridge for ${bridge.id}#${bridge.level}`,
|
27
|
+
() => {
|
28
|
+
if (!bridge.bridge) {
|
29
|
+
bridge.bridge = "{ ...next(operator) }"
|
50
30
|
}
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
}
|
59
|
-
|
60
|
-
|
61
|
-
|
31
|
+
if (!bridge.level) {
|
32
|
+
bridge.level = 0
|
33
|
+
}
|
34
|
+
if (bridge.children) {
|
35
|
+
for (let child of bridge.children) {
|
36
|
+
config.addHierarchy(child, bridge.id)
|
37
|
+
}
|
38
|
+
}
|
39
|
+
if (bridge.parents) {
|
40
|
+
for (let parent of bridge.parents) {
|
41
|
+
config.addHierarchy(bridge.id, parent)
|
42
|
+
}
|
43
|
+
}
|
44
|
+
if (bridge.isA) {
|
45
|
+
for (let parent of bridge.isA) {
|
46
|
+
config.addHierarchy(bridge.id, parent)
|
47
|
+
}
|
48
|
+
}
|
49
|
+
if (bridge.before) {
|
50
|
+
for (let after of bridge.before) {
|
51
|
+
if (typeof after == 'string') {
|
52
|
+
after = [after, 0]
|
53
|
+
}
|
54
|
+
config.addPriorities([after, [bridge.id, bridge.level]])
|
55
|
+
}
|
56
|
+
}
|
57
|
+
if (bridge.after) {
|
58
|
+
for (let before of bridge.after) {
|
59
|
+
if (typeof before == 'string') {
|
60
|
+
before = [before, 0]
|
61
|
+
}
|
62
|
+
config.addPriorities([[bridge.id, bridge.level], before])
|
63
|
+
}
|
64
|
+
}
|
65
|
+
if (bridge.words) {
|
66
|
+
for (let def of bridge.words) {
|
67
|
+
if (typeof def == 'string') {
|
68
|
+
config.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
|
69
|
+
} else {
|
70
|
+
const word = def.word
|
71
|
+
def = { initial: JSON.stringify(def), id: bridge.id, word: undefined }
|
72
|
+
config.addWordInternal(word, def)
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
if (bridge.generator) {
|
77
|
+
config.config.generators.unshift(bridge.generator)
|
78
|
+
}
|
79
|
+
if (bridge.generators) {
|
80
|
+
const generators = [...bridge.generators]
|
81
|
+
generators.reverse()
|
82
|
+
for (let generator of generators) {
|
83
|
+
config.config.generators.unshift(generator)
|
84
|
+
}
|
85
|
+
}
|
86
|
+
if (bridge.generatorpr) {
|
87
|
+
bridge.generatorp = bridge.generatorpr
|
88
|
+
bridge.generatorr = bridge.generatorpr
|
89
|
+
}
|
90
|
+
if (bridge.generatorp) {
|
91
|
+
const match = bridge.generatorp.match || (() => true)
|
92
|
+
const apply = typeof bridge.generatorp == 'function' ? bridge.generatorp : bridge.generatorp.apply || bridge.generatorp
|
93
|
+
const level = bridge.generatorp.level >= 0 ? bridge.generatorp.level : bridge.level + 1
|
94
|
+
config.config.generators.unshift({
|
95
|
+
where: bridge.generatorp.where || bridge.where || client.where(4),
|
96
|
+
match: (args) => bridge.id == args.context.marker && args.context.level == level && args.context.paraphrase && match(args),
|
97
|
+
apply: (args) => apply(args),
|
98
|
+
applyWrapped: apply,
|
99
|
+
property: 'generatorp',
|
100
|
+
})
|
101
|
+
}
|
102
|
+
if (bridge.generatorr) {
|
103
|
+
const match = bridge.generatorr.match || (() => true)
|
104
|
+
const apply = typeof bridge.generatorr == 'function' ? bridge.generatorr : bridge.generatorr.apply || bridge.generatorr
|
105
|
+
const level = bridge.generatorr.level >= 0 ? bridge.generatorr.level : bridge.level + 1
|
106
|
+
config.config.generators.unshift({
|
107
|
+
where: bridge.generatorr.where || bridge.where || client.where(4),
|
108
|
+
match: (args) => bridge.id == args.context.marker && args.context.level == level && !args.context.paraphrase && (args.context.response || args.context.isResponse) && match(args),
|
109
|
+
apply: (args) => apply(args),
|
110
|
+
applyWrapped: apply,
|
111
|
+
property: 'generatorr',
|
112
|
+
})
|
113
|
+
}
|
114
|
+
/*
|
115
|
+
if (bridge.generatorr) {
|
116
|
+
config.config.generators.unshift({
|
117
|
+
// TODO merge response and isResponse
|
118
|
+
where: bridge.generatorr.where || bridge.where || client.where(3),
|
119
|
+
match: ({context}) => bridge.id == context.marker && !context.paraphrase && (context.response || context.isResponse),
|
120
|
+
apply: (args) => bridge.generatorr(args),
|
121
|
+
applyWrapped: bridge.generatorr,
|
122
|
+
property: 'generatorr',
|
123
|
+
})
|
124
|
+
}
|
125
|
+
*/
|
126
|
+
if (bridge.evaluator) {
|
127
|
+
config.config.semantics.unshift({
|
128
|
+
where: bridge.evaluator.where || bridge.where || client.where(3),
|
129
|
+
match: ({context}) => bridge.id == context.marker && context.evaluate,
|
130
|
+
apply: (args) => bridge.evaluator(args),
|
131
|
+
applyWrapped: bridge.evaluator,
|
132
|
+
property: 'evaluator',
|
133
|
+
})
|
134
|
+
}
|
135
|
+
if (bridge.semantic) {
|
136
|
+
config.config.semantics.unshift({
|
137
|
+
where: bridge.semantic.where || bridge.where || client.where(3),
|
138
|
+
match: ({context}) => bridge.id == context.marker,
|
139
|
+
apply: (args) => bridge.semantic(args),
|
140
|
+
applyWrapped: bridge.semantic,
|
141
|
+
property: 'semantic',
|
142
|
+
})
|
62
143
|
}
|
63
144
|
}
|
64
|
-
|
65
|
-
if (bridge.generator) {
|
66
|
-
config.config.generators.unshift(bridge.generator)
|
67
|
-
}
|
68
|
-
if (bridge.generators) {
|
69
|
-
const generators = [...bridge.generators]
|
70
|
-
generators.reverse()
|
71
|
-
for (let generator of generators) {
|
72
|
-
config.config.generators.unshift(generator)
|
73
|
-
}
|
74
|
-
}
|
75
|
-
if (bridge.generatorpr) {
|
76
|
-
bridge.generatorp = bridge.generatorpr
|
77
|
-
bridge.generatorr = bridge.generatorpr
|
78
|
-
}
|
79
|
-
if (bridge.generatorp) {
|
80
|
-
config.config.generators.unshift({
|
81
|
-
where: bridge.generatorp.where || bridge.where || client.where(4),
|
82
|
-
// match: ({context}) => bridge.id == context.marker && context.paraphrase,
|
83
|
-
match: ({context}) => bridge.id == context.marker && context.level == bridge.level + 1 && context.paraphrase,
|
84
|
-
apply: (args) => bridge.generatorp(args),
|
85
|
-
applyWrapped: bridge.generatorp,
|
86
|
-
property: 'generatorp',
|
87
|
-
})
|
88
|
-
}
|
89
|
-
if (bridge.generatorr) {
|
90
|
-
config.config.generators.unshift({
|
91
|
-
// TODO merge response and isResponse
|
92
|
-
where: bridge.generatorr.where || bridge.where || client.where(3),
|
93
|
-
match: ({context}) => bridge.id == context.marker && !context.paraphrase && (context.response || context.isResponse),
|
94
|
-
apply: (args) => bridge.generatorr(args),
|
95
|
-
applyWrapped: bridge.generatorr,
|
96
|
-
property: 'generatorr',
|
97
|
-
})
|
98
|
-
}
|
99
|
-
if (bridge.evaluator) {
|
100
|
-
config.config.semantics.unshift({
|
101
|
-
where: bridge.evaluator.where || bridge.where || client.where(3),
|
102
|
-
match: ({context}) => bridge.id == context.marker && context.evaluate,
|
103
|
-
apply: (args) => bridge.evaluator(args),
|
104
|
-
applyWrapped: bridge.evaluator,
|
105
|
-
property: 'evaluator',
|
106
|
-
})
|
107
|
-
}
|
108
|
-
if (bridge.semantic) {
|
109
|
-
config.config.semantics.unshift({
|
110
|
-
where: bridge.semantic.where || bridge.where || client.where(3),
|
111
|
-
match: ({context}) => bridge.id == context.marker,
|
112
|
-
apply: (args) => bridge.semantic(args),
|
113
|
-
applyWrapped: bridge.semantic,
|
114
|
-
property: 'semantic',
|
115
|
-
})
|
116
|
-
}
|
145
|
+
)
|
117
146
|
}
|
118
147
|
|
119
148
|
const handleCalculatedProps = (baseConfig, moreConfig) => {
|
120
149
|
for (let bridge of moreConfig.bridges) {
|
121
|
-
const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
|
150
|
+
const valid = [ 'after', 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
|
122
151
|
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where' ]
|
123
152
|
helpers.validProps(valid, bridge, 'bridge')
|
124
153
|
handleBridgeProps(baseConfig, bridge)
|
@@ -138,13 +167,21 @@ if (runtime.process.env.DEBUG_HIERARCHY) {
|
|
138
167
|
global.entodictonDebugHierarchy = JSON.parse(runtime.process.env.DEBUG_HIERARCHY)
|
139
168
|
}
|
140
169
|
|
170
|
+
if (runtime.process.env.DEBUG_PRIORITY) {
|
171
|
+
global.entodictonDebugPriority = JSON.parse(runtime.process.env.DEBUG_PRIORITY)
|
172
|
+
}
|
173
|
+
|
174
|
+
if (runtime.process.env.DEBUG_ASSOCIATION) {
|
175
|
+
global.entodictonDebugAssociation = JSON.parse(runtime.process.env.DEBUG_ASSOCIATION)
|
176
|
+
}
|
177
|
+
|
141
178
|
if (runtime.process.env.DEBUG_BRIDGE) {
|
142
179
|
// id/level
|
143
180
|
global.entodictonDebugBridge = runtime.process.env.DEBUG_BRIDGE.split('/')
|
144
181
|
if (global.entodictonDebugBridge.length !== 2) {
|
145
182
|
console.log('Expected DEBUG_BRIDGE to be of the form "id/level"');
|
146
183
|
}
|
147
|
-
global.entodictonDebugBridge[1] =
|
184
|
+
global.entodictonDebugBridge[1] = parseInt(global.entodictonDebugBridge[1])
|
148
185
|
}
|
149
186
|
|
150
187
|
if (runtime.process.env.DEBUG_OPERATOR) {
|
@@ -162,7 +199,7 @@ const hierarchyCanonical = (element) => {
|
|
162
199
|
|
163
200
|
const isValidDef = (word, def, config) => {
|
164
201
|
if (!def.id) {
|
165
|
-
throw `In the KM "${config.name}", for the word ${word} the following definition is missing the "id" property: ${JSON.stringify(def)}`
|
202
|
+
throw new Error(`In the KM "${config.name}", for the word ${word} the following definition is missing the "id" property: ${JSON.stringify(def)}`)
|
166
203
|
}
|
167
204
|
/*
|
168
205
|
if (!def.initial) {
|
@@ -725,7 +762,7 @@ class Config {
|
|
725
762
|
"semantics",
|
726
763
|
"associations",
|
727
764
|
]
|
728
|
-
return !properties.find( (property) => instance[property].length > 0 )
|
765
|
+
return !properties.find( (property) => instance[property] && instance[property].length > 0 )
|
729
766
|
}
|
730
767
|
if (!isEmpty(instance)) {
|
731
768
|
instance.name = this.name
|
@@ -779,10 +816,15 @@ class Config {
|
|
779
816
|
if (!this.config.priorities) {
|
780
817
|
this.config.priorities = []
|
781
818
|
}
|
819
|
+
if (global.entodictonDebugPriority) {
|
820
|
+
if (helpers.safeEquals(entodictonDebugPriority, priorities)) {
|
821
|
+
debugger; // debug hierarchy hit
|
822
|
+
}
|
823
|
+
}
|
782
824
|
this.config.priorities.push(priorities)
|
783
825
|
this._delta.json.priorities.push({ action: 'add', priorities })
|
784
826
|
}
|
785
|
-
|
827
|
+
|
786
828
|
addHierarchy (child, parent) {
|
787
829
|
if (child && parent || !child || Array.isArray(child) || (typeof child == 'string' && !parent)) {
|
788
830
|
this.addHierarchyChildParent(child, parent)
|
@@ -795,13 +837,13 @@ class Config {
|
|
795
837
|
addHierarchyProperties (edge) {
|
796
838
|
const { child, parent } = edge
|
797
839
|
if (typeof child !== 'string') {
|
798
|
-
throw `addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`
|
840
|
+
throw new Error(`addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`)
|
799
841
|
}
|
800
842
|
if (typeof parent !== 'string') {
|
801
|
-
throw `addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`
|
843
|
+
throw new Error(`addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`)
|
802
844
|
}
|
803
845
|
if (global.entodictonDebugHierarchy) {
|
804
|
-
if (
|
846
|
+
if (helpers.safeEquals(entodictonDebugHierarchy, [child, parent])) {
|
805
847
|
debugger; // debug hierarchy hit
|
806
848
|
}
|
807
849
|
}
|
@@ -812,10 +854,10 @@ class Config {
|
|
812
854
|
|
813
855
|
addHierarchyChildParent (child, parent) {
|
814
856
|
if (typeof child !== 'string') {
|
815
|
-
throw `addHierarchy expected child to be a string. got ${JSON.stringify(child)}`
|
857
|
+
throw new Error(`addHierarchy expected child to be a string. got ${JSON.stringify(child)}`)
|
816
858
|
}
|
817
859
|
if (typeof parent !== 'string') {
|
818
|
-
throw `addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`
|
860
|
+
throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
|
819
861
|
}
|
820
862
|
|
821
863
|
if (global.entodictonDebugHierarchy) {
|
@@ -848,7 +890,7 @@ class Config {
|
|
848
890
|
}
|
849
891
|
const bridges = this.config.bridges
|
850
892
|
const def = Object.assign({}, bridge, { uuid: this._uuid })
|
851
|
-
|
893
|
+
|
852
894
|
if (global.entodictonDebugBridge) {
|
853
895
|
if (global.entodictonDebugBridge[0] == bridge.id && global.entodictonDebugBridge[1] == bridge.level) {
|
854
896
|
debugger; // debug hierarchy hit
|
@@ -876,10 +918,10 @@ class Config {
|
|
876
918
|
}
|
877
919
|
|
878
920
|
if (!(typeof generator.match === 'function')) {
|
879
|
-
throw 'addGenerator: Expected matcher to be a function'
|
921
|
+
throw new Error('addGenerator: Expected matcher to be a function')
|
880
922
|
}
|
881
923
|
if (!(typeof generator.apply === 'function')) {
|
882
|
-
throw 'addGenerator: Expected action to be a function'
|
924
|
+
throw new Error('addGenerator: Expected action to be a function')
|
883
925
|
}
|
884
926
|
|
885
927
|
if (!this.config.generators) {
|
@@ -903,10 +945,10 @@ class Config {
|
|
903
945
|
}
|
904
946
|
|
905
947
|
if (!(typeof semantic.match === 'function')) {
|
906
|
-
throw 'addSemantic: Expected match to be a function'
|
948
|
+
throw new Error('addSemantic: Expected match to be a function')
|
907
949
|
}
|
908
950
|
if (!(typeof semantic.apply === 'function')) {
|
909
|
-
throw 'addSemantic: Expected apply to be a function'
|
951
|
+
throw new Error('addSemantic: Expected apply to be a function')
|
910
952
|
}
|
911
953
|
|
912
954
|
if (!this.config.semantics) {
|
@@ -1180,7 +1222,7 @@ class Config {
|
|
1180
1222
|
// configs = [ { config, namespace } ... ]
|
1181
1223
|
constructor (config, module) {
|
1182
1224
|
if (config instanceof Config) {
|
1183
|
-
throw 'Excepted the config argument to be a hash not a Config object'
|
1225
|
+
throw new Error('Excepted the config argument to be a hash not a Config object')
|
1184
1226
|
}
|
1185
1227
|
|
1186
1228
|
if (config) {
|
@@ -1261,7 +1303,7 @@ class Config {
|
|
1261
1303
|
}
|
1262
1304
|
duplicated = Array.from(duplicated)
|
1263
1305
|
if (duplicated.length > 0) {
|
1264
|
-
throw `In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`
|
1306
|
+
throw new Error(`In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`)
|
1265
1307
|
}
|
1266
1308
|
}
|
1267
1309
|
|
@@ -1376,13 +1418,13 @@ class Config {
|
|
1376
1418
|
if (this._api && this._api.multiApi) {
|
1377
1419
|
this._api.add(this, this._api, api)
|
1378
1420
|
} else {
|
1379
|
-
throw "Can only add apis to a multi-api"
|
1421
|
+
throw new Error("Can only add apis to a multi-api")
|
1380
1422
|
}
|
1381
1423
|
}
|
1382
1424
|
|
1383
1425
|
set api (value) {
|
1384
1426
|
if (!value.initialize) {
|
1385
|
-
throw `Expected the API to have an initialize function for ${this.name}.`
|
1427
|
+
throw new Error(`Expected the API to have an initialize function for ${this.name}.`)
|
1386
1428
|
}
|
1387
1429
|
|
1388
1430
|
if (this._api && this._api.multiApi) {
|
@@ -1449,7 +1491,7 @@ class Config {
|
|
1449
1491
|
}
|
1450
1492
|
|
1451
1493
|
doMotivations (args, context) {
|
1452
|
-
args = Object.assign({}, args, { context })
|
1494
|
+
args = Object.assign({}, args, { context, api: this.api })
|
1453
1495
|
// console.log('src/config doMotivations this.uuid', this.uuid)
|
1454
1496
|
// args.objects = args.getObjects(this.uuid)
|
1455
1497
|
const motivations = this.motivations
|
@@ -1684,7 +1726,7 @@ class Config {
|
|
1684
1726
|
for (let option of Object.keys(options)) {
|
1685
1727
|
const validOptions = ['initAfterApi']
|
1686
1728
|
if (!['initAfterApi'].includes(option)) {
|
1687
|
-
throw `For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`
|
1729
|
+
throw new Error(`For Config.initializer, unrecognized option ${option}. The valid options are ${validOptions}`)
|
1688
1730
|
}
|
1689
1731
|
}
|
1690
1732
|
}
|
@@ -1921,7 +1963,20 @@ class Config {
|
|
1921
1963
|
// TODO change name of config: to baseConfig:
|
1922
1964
|
const kmFn = (name) => this.getConfig(name)
|
1923
1965
|
// const hierarchy = new DigraphInternal((config.config || {}).hierarchy)
|
1924
|
-
const args = {
|
1966
|
+
const args = {
|
1967
|
+
isModule,
|
1968
|
+
addWord: aw,
|
1969
|
+
km: kmFn,
|
1970
|
+
hierarchy: this.hierarchy,
|
1971
|
+
config,
|
1972
|
+
baseConfig: this,
|
1973
|
+
currentConfig: config,
|
1974
|
+
uuid: config._uuid,
|
1975
|
+
objects: namespacedObjects,
|
1976
|
+
namespace,
|
1977
|
+
motivation: (m) => config.addMotivation(m),
|
1978
|
+
api: config.api
|
1979
|
+
}
|
1925
1980
|
config.initializerFn(args)
|
1926
1981
|
if (config.initAfterApi) {
|
1927
1982
|
// reverse the list
|
@@ -2309,14 +2364,14 @@ class Config {
|
|
2309
2364
|
|
2310
2365
|
set (property, value) {
|
2311
2366
|
if (!this.config.hasOwnProperty(property)) {
|
2312
|
-
throw `Setting invalid property ${property}`
|
2367
|
+
throw new Error(`Setting invalid property ${property}`)
|
2313
2368
|
}
|
2314
2369
|
|
2315
2370
|
if ('words' == property) {
|
2316
2371
|
for (let word in value) {
|
2317
2372
|
for (let def of value[word]) {
|
2318
2373
|
if (!def['uuid']) {
|
2319
|
-
throw `All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)} for the word '${word}'`
|
2374
|
+
throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)} for the word '${word}'`)
|
2320
2375
|
}
|
2321
2376
|
}
|
2322
2377
|
}
|
@@ -2325,7 +2380,7 @@ class Config {
|
|
2325
2380
|
if (['operators', 'bridges'].includes(property)) {
|
2326
2381
|
for (let def of value) {
|
2327
2382
|
if (!def['uuid']) {
|
2328
|
-
throw `All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`
|
2383
|
+
throw new Error(`All definitions for '${property}' must have the uuid property set (config.uuid). uuid is missing from ${JSON.stringify(def)}`)
|
2329
2384
|
}
|
2330
2385
|
}
|
2331
2386
|
}
|
@@ -2357,7 +2412,7 @@ class Config {
|
|
2357
2412
|
|
2358
2413
|
add (more) {
|
2359
2414
|
if (more === this) {
|
2360
|
-
throw 'Cannot add an object to itself.'
|
2415
|
+
throw new Error('Cannot add an object to itself.')
|
2361
2416
|
}
|
2362
2417
|
if (!(more instanceof Config)) {
|
2363
2418
|
more = new Config(more)
|
@@ -2525,7 +2580,7 @@ class Config {
|
|
2525
2580
|
this.config[key] = this.config[key].concat(more[key])
|
2526
2581
|
} else {
|
2527
2582
|
if (!(key in this.config)) {
|
2528
|
-
throw `Unexpected property in config ${key}`
|
2583
|
+
throw new Error(`Unexpected property in config ${key}`)
|
2529
2584
|
}
|
2530
2585
|
this.config[key] = more[key]
|
2531
2586
|
}
|
@@ -2643,7 +2698,7 @@ class Config {
|
|
2643
2698
|
this.config[key] = more[key].concat(this.config[key])
|
2644
2699
|
} else {
|
2645
2700
|
if (!(key in this.config)) {
|
2646
|
-
throw `Unexpected property in config ${key}`
|
2701
|
+
throw new Error(`Unexpected property in config ${key}`)
|
2647
2702
|
}
|
2648
2703
|
this.config[key] = more[key]
|
2649
2704
|
}
|
package/src/generators.js
CHANGED
@@ -75,7 +75,7 @@ class Generator {
|
|
75
75
|
|
76
76
|
apply (baseArgs, objects, g, gs, context, hierarchy, config, response, log, options = {}) {
|
77
77
|
if (!log) {
|
78
|
-
throw 'generators.apply argument log is required'
|
78
|
+
throw new Error('generators.apply argument log is required')
|
79
79
|
}
|
80
80
|
if (baseArgs.call && config && sbaseArgs.calls.stack.length > config.maxDepth) {
|
81
81
|
throw new Error(`Max depth of ${config.maxDepth} for calls has been exceeded. maxDepth can be set on the config object. To see the calls run with the --dl or set the debugLoops property on the config`)
|
@@ -292,7 +292,7 @@ class Generators {
|
|
292
292
|
lines.setElement(0, 2, JSON.stringify(context, null, 2))
|
293
293
|
this.logs.push(lines.toString())
|
294
294
|
}
|
295
|
-
contextsPrime.push(generated)
|
295
|
+
contextsPrime.push((config || {}).parenthesized ? "(" + generated + ")" : generated)
|
296
296
|
}
|
297
297
|
return contextsPrime
|
298
298
|
}
|
package/src/helpers.js
CHANGED
@@ -54,6 +54,9 @@ const safeEquals = (v1, v2) => {
|
|
54
54
|
} else if (type == 'function') {
|
55
55
|
return v1.toString() == v2.toString()
|
56
56
|
} else {
|
57
|
+
if (v1.length != v2.length) {
|
58
|
+
return false
|
59
|
+
}
|
57
60
|
for (let key in v1) {
|
58
61
|
if (!safeEquals(v1[key], v2[key])) {
|
59
62
|
return false
|
@@ -235,13 +238,17 @@ const validProps = (valids, object, type) => {
|
|
235
238
|
for (let prop of Object.keys(object)) {
|
236
239
|
let okay = false
|
237
240
|
for (valid of valids) {
|
238
|
-
if (
|
239
|
-
okay =
|
241
|
+
if (typeof valid == 'string') {
|
242
|
+
okay = prop == valid
|
243
|
+
} else {
|
244
|
+
okay = prop.match(valid)
|
245
|
+
}
|
246
|
+
if (okay) {
|
240
247
|
break
|
241
248
|
}
|
242
249
|
}
|
243
250
|
if (!okay) {
|
244
|
-
throw `Unknown property "${prop}" in the ${type}. Valid properties are ${valids}. The ${type} is ${JSON.stringify(object)}`
|
251
|
+
throw new Error(`Unknown property "${prop}" in the ${type}. Valid properties are ${valids}. The ${type} is ${JSON.stringify(object)}`)
|
245
252
|
}
|
246
253
|
}
|
247
254
|
}
|
@@ -309,7 +316,16 @@ const functionsToStrings = (config) => {
|
|
309
316
|
return config
|
310
317
|
}
|
311
318
|
|
319
|
+
const ecatch = (where, call) => {
|
320
|
+
try {
|
321
|
+
return call()
|
322
|
+
} catch( e ) {
|
323
|
+
throw new Error(`${where} ${e}`)
|
324
|
+
}
|
325
|
+
}
|
326
|
+
|
312
327
|
module.exports = {
|
328
|
+
ecatch,
|
313
329
|
functionsToStrings,
|
314
330
|
updateQueries,
|
315
331
|
mapInPlace,
|
package/src/semantics.js
CHANGED
@@ -89,7 +89,7 @@ class Semantic {
|
|
89
89
|
// const ask = baseArgs.getAsk(this.uuid)
|
90
90
|
if (!log) {
|
91
91
|
console.trace()
|
92
|
-
throw 'log is a required argument'
|
92
|
+
throw new Error('log is a required argument')
|
93
93
|
}
|
94
94
|
const contextPrime = Object.assign({}, context)
|
95
95
|
let n = (id) => id
|