theprogrammablemind 7.5.8-beta.26 → 7.5.8-beta.28
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 +46 -30
- package/package.json +1 -1
- package/src/config.js +60 -84
- package/src/helpers.js +1 -1
- package/src/semantics.js +6 -1
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.
|
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.
|
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;
|
@@ -144,7 +146,6 @@ const setupArgs = (args, config, logs, hierarchy) => {
|
|
144
146
|
apis: getAPIs(uuid)
|
145
147
|
}
|
146
148
|
}
|
147
|
-
args.motivation = (m) => config.addMotivation(m)
|
148
149
|
args.breakOnSemantics = false
|
149
150
|
args.theDebugger = {
|
150
151
|
breakOnSemantics: (value) => args.breakOnSemantics = value
|
@@ -420,18 +421,16 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
420
421
|
}
|
421
422
|
const generateParenthesized = isTest || (commandLineArgs && commandLineArgs.save)
|
422
423
|
if (!config.get('skipSemantics')) {
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
|
431
|
-
}
|
432
|
-
// contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
|
433
|
-
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`
|
434
431
|
}
|
432
|
+
// contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
|
433
|
+
contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason })
|
435
434
|
}
|
436
435
|
}
|
437
436
|
if (contextPrime.controlRemove) {
|
@@ -767,7 +766,6 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
|
|
767
766
|
testConfigName = testConfig.testModuleName
|
768
767
|
}
|
769
768
|
config.beforeQuery({ query: test, isModule: false, objects })
|
770
|
-
// config.resetMotivations()
|
771
769
|
try {
|
772
770
|
const result = await _process(config, test, { errorHandler, isTest: true })
|
773
771
|
result.query = test
|
@@ -785,12 +783,17 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
|
|
785
783
|
delete expected_objects.nameToUUID
|
786
784
|
const actual_objects = sortJson(convertToStable(config.config.objects), { depth: 25 })
|
787
785
|
const failed_paraphrases = !matching(result.paraphrases, expected.paraphrases)
|
788
|
-
|
789
|
-
|
786
|
+
let failed_paraphrasesParenthesized = !matching(result.paraphrasesParenthesized, expected.paraphrasesParenthesized)
|
787
|
+
let failed_generatedParenthesized = !matching(result.generatedParenthesized, expected.generatedParenthesized)
|
790
788
|
const failed_responses = !matching(result.responses, expected.responses)
|
791
789
|
const failed_contexts = !matching(result.contexts, expected.contexts)
|
792
790
|
const failed_objects = !matching(actual_objects, expected_objects)
|
793
791
|
|
792
|
+
if (args.testNoParenthesized) {
|
793
|
+
failed_paraphrasesParenthesized = false
|
794
|
+
failed_generatedParenthesized = false
|
795
|
+
}
|
796
|
+
|
794
797
|
const pickEm = (getObjects) => {
|
795
798
|
const picked = {}
|
796
799
|
for (let prop of (testConfig.check || [])) {
|
@@ -816,6 +819,11 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
|
|
816
819
|
}
|
817
820
|
return expected.objects.namespaced[expected.objects.nameToUUID[name]]
|
818
821
|
}
|
822
|
+
try {
|
823
|
+
sortJson(pickEm(expectedGetObjects), { depth: 25 })
|
824
|
+
} catch ( e ) {
|
825
|
+
debugger
|
826
|
+
}
|
819
827
|
const expected_checked = sortJson(pickEm(expectedGetObjects), { depth: 25 })
|
820
828
|
const actualGetObjects = (name) => {
|
821
829
|
if (!name) {
|
@@ -942,7 +950,6 @@ const runTests = async (config, testFile, juicyBits) => {
|
|
942
950
|
const saveTest = async (testFile, config, test, expected, testConfig, saveDeveloper) => {
|
943
951
|
config.rebuild()
|
944
952
|
const objects = getObjects(config.config.objects)(config.uuid)
|
945
|
-
//config.resetMotivations()
|
946
953
|
config.beforeQuery({ query: test, isModule: false, objects })
|
947
954
|
console.log(test)
|
948
955
|
const result = await _process(config, test, { isTest: true })
|
@@ -1216,8 +1223,6 @@ entodicton.knowledgeModule( {
|
|
1216
1223
|
*/
|
1217
1224
|
|
1218
1225
|
const rebuildTemplate = async ({ config, target, template, errorHandler = defaultErrorHandler }) => {
|
1219
|
-
debugger
|
1220
|
-
// config = config.base()
|
1221
1226
|
const accumulators = {
|
1222
1227
|
resultss: [],
|
1223
1228
|
fragments: [],
|
@@ -1241,8 +1246,6 @@ const rebuildTemplate = async ({ config, target, template, errorHandler = defaul
|
|
1241
1246
|
if (property == 'fragments') {
|
1242
1247
|
global.transitoryMode = true
|
1243
1248
|
}
|
1244
|
-
// greg32
|
1245
|
-
// config.addInternal( query )
|
1246
1249
|
if (hierarchy) {
|
1247
1250
|
for (let edge of hierarchy) {
|
1248
1251
|
if (Array.isArray(edge)) {
|
@@ -1284,6 +1287,12 @@ const rebuildTemplate = async ({ config, target, template, errorHandler = defaul
|
|
1284
1287
|
// it will just get added to the config
|
1285
1288
|
const extraConfig = queryOrExtraConfig
|
1286
1289
|
console.log('config', extraConfig)
|
1290
|
+
try {
|
1291
|
+
config.addInternal(_.cloneDeep(extraConfig), { handleCalculatedProps: true } )
|
1292
|
+
} catch ( e ) {
|
1293
|
+
const where = extraConfig.where ? ` ${extraConfig.where}` : ''
|
1294
|
+
throw new Error(`Error processing extra config${where}: ${e.stack}}`)
|
1295
|
+
}
|
1287
1296
|
accumulators[property].push({ extraConfig: true, ...extraConfig })
|
1288
1297
|
await looper(queries)
|
1289
1298
|
}
|
@@ -1474,6 +1483,7 @@ const knowledgeModule = async ({
|
|
1474
1483
|
parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
|
1475
1484
|
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' })
|
1476
1485
|
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' })
|
1486
|
+
parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
|
1477
1487
|
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' })
|
1478
1488
|
// 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.' })
|
1479
1489
|
parser.add_argument('-rt', '--rebuildTemplate', { action: 'store_true', help: 'Force a template rebuild' })
|
@@ -1730,11 +1740,13 @@ const knowledgeModule = async ({
|
|
1730
1740
|
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1731
1741
|
hasError = true
|
1732
1742
|
}
|
1733
|
-
if (
|
1734
|
-
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1743
|
+
if (!args.testNoParenthesized) {
|
1744
|
+
if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
|
1745
|
+
hasError = true
|
1746
|
+
}
|
1747
|
+
if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
|
1748
|
+
hasError = true
|
1749
|
+
}
|
1738
1750
|
}
|
1739
1751
|
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1740
1752
|
hasError = true
|
@@ -1760,9 +1772,13 @@ const knowledgeModule = async ({
|
|
1760
1772
|
}
|
1761
1773
|
}
|
1762
1774
|
show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
|
1763
|
-
|
1775
|
+
if (!args.testNoParenthesized) {
|
1776
|
+
show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
|
1777
|
+
}
|
1764
1778
|
show('responses', result.expected.responses, result.actual.responses)
|
1765
|
-
|
1779
|
+
if (!args.testNoParenthesized) {
|
1780
|
+
show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
|
1781
|
+
}
|
1766
1782
|
/*
|
1767
1783
|
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1768
1784
|
if (!headerShown) {
|
package/package.json
CHANGED
package/src/config.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
// lookup = (name) => returns <config>
|
2
2
|
const { Semantics, normalizeGenerator } = require('./semantics')
|
3
3
|
const { Generators } = require('./generators')
|
4
|
-
|
4
|
+
const { v4 : uuidv4 } = require('uuid');
|
5
5
|
const client = require('../client')
|
6
6
|
const DigraphInternal = require('./digraph_internal')
|
7
7
|
const helpers = require('./helpers')
|
@@ -30,6 +30,41 @@ const config_toServer = (config) => {
|
|
30
30
|
}
|
31
31
|
}
|
32
32
|
|
33
|
+
const validConfigProps = (config) => {
|
34
|
+
const valid = [
|
35
|
+
'hierarchy',
|
36
|
+
'objects',
|
37
|
+
'bridges',
|
38
|
+
'operators',
|
39
|
+
'words',
|
40
|
+
'priorities',
|
41
|
+
'contextual_priorities',
|
42
|
+
'associations',
|
43
|
+
'name',
|
44
|
+
'version',
|
45
|
+
'generators',
|
46
|
+
'semantics',
|
47
|
+
'where',
|
48
|
+
'floaters',
|
49
|
+
'debug',
|
50
|
+
|
51
|
+
// TODO Fix these from the test app
|
52
|
+
'implicits',
|
53
|
+
'convolution',
|
54
|
+
'expected_generated',
|
55
|
+
'expected_results',
|
56
|
+
'skipSemantics',
|
57
|
+
'description',
|
58
|
+
'contexts',
|
59
|
+
'utterances',
|
60
|
+
'flatten',
|
61
|
+
|
62
|
+
'namespaces',
|
63
|
+
'eqClasses',
|
64
|
+
]
|
65
|
+
helpers.validProps(valid, config, 'config')
|
66
|
+
}
|
67
|
+
|
33
68
|
const setupInitializerFNArgs = (config, args) => {
|
34
69
|
const aw = (word, def) => config.addWord(word, def, args.uuid)
|
35
70
|
const ag = (generator) => config.addGenerator(generator, args.uuid, config.name)
|
@@ -169,7 +204,7 @@ const handleBridgeProps = (config, bridge) => {
|
|
169
204
|
config.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
|
170
205
|
} else {
|
171
206
|
const word = def.word
|
172
|
-
def = { initial: JSON.stringify(def), id: bridge.id, word
|
207
|
+
def = { initial: JSON.stringify(def), id: bridge.id, word }
|
173
208
|
config.addWordInternal(word, def)
|
174
209
|
}
|
175
210
|
}
|
@@ -249,7 +284,7 @@ const handleBridgeProps = (config, bridge) => {
|
|
249
284
|
const handleCalculatedProps = (baseConfig, moreConfig) => {
|
250
285
|
for (let bridge of moreConfig.bridges) {
|
251
286
|
const valid = [ 'after', 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
|
252
|
-
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where' ]
|
287
|
+
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where', 'uuid' ]
|
253
288
|
helpers.validProps(valid, bridge, 'bridge')
|
254
289
|
handleBridgeProps(baseConfig, bridge)
|
255
290
|
}
|
@@ -357,6 +392,14 @@ const normalizeConfig = (config) => {
|
|
357
392
|
}
|
358
393
|
}
|
359
394
|
}
|
395
|
+
|
396
|
+
if (config.semantics) {
|
397
|
+
for (let semantic of config.semantics) {
|
398
|
+
if (semantic.oneShot) {
|
399
|
+
semantic.id = uuid()
|
400
|
+
}
|
401
|
+
}
|
402
|
+
}
|
360
403
|
}
|
361
404
|
}
|
362
405
|
|
@@ -606,10 +649,9 @@ class Config {
|
|
606
649
|
if (km.isSelf) {
|
607
650
|
continue
|
608
651
|
}
|
609
|
-
console.log(km.config.name)
|
610
652
|
base.add(km.config)
|
611
653
|
}
|
612
|
-
|
654
|
+
return base
|
613
655
|
}
|
614
656
|
|
615
657
|
getPseudoConfig (uuid, config) {
|
@@ -624,6 +666,7 @@ class Config {
|
|
624
666
|
addOperator: (...args) => this.addOperator(...args, uuid),
|
625
667
|
addPriorities: (...args) => this.addPriorities(...args),
|
626
668
|
addSemantic: (...args) => this.addSemantic(...args, uuid, config.name),
|
669
|
+
removeSemantic: (...args) => this.removeSemantic(...args, uuid, config.name),
|
627
670
|
addWord: (...args) => this.addWord(...args, uuid),
|
628
671
|
|
629
672
|
getHierarchy: (...args) => this.config.hierarchy,
|
@@ -1111,6 +1154,7 @@ class Config {
|
|
1111
1154
|
if (!(typeof semantic.match === 'function')) {
|
1112
1155
|
throw new Error('addSemantic: Expected match to be a function')
|
1113
1156
|
}
|
1157
|
+
|
1114
1158
|
if (!(typeof semantic.apply === 'function')) {
|
1115
1159
|
throw new Error('addSemantic: Expected apply to be a function')
|
1116
1160
|
}
|
@@ -1124,10 +1168,17 @@ class Config {
|
|
1124
1168
|
}
|
1125
1169
|
|
1126
1170
|
const semantics = this.config.semantics
|
1127
|
-
Object.assign(semantic, { uuid: uuid || this._uuid, km: name || this.name, index: semantics.length })
|
1171
|
+
Object.assign(semantic, { uuid: uuid || semantic.uuid || this._uuid, km: name || this.name, index: semantics.length, id: semantic.id || uuidv4() })
|
1128
1172
|
semantics.unshift(semantic)
|
1129
1173
|
}
|
1130
1174
|
|
1175
|
+
removeSemantic(deleteSemantic) {
|
1176
|
+
const index = this.config.semantics.findIndex( (semantic) => semantic.id === deleteSemantic.id )
|
1177
|
+
if (index >= 0) {
|
1178
|
+
this.config.semantics.splice(index, 1)
|
1179
|
+
}
|
1180
|
+
}
|
1181
|
+
|
1131
1182
|
addOperator (objectOrPattern, uuid) {
|
1132
1183
|
if (!this.config.operators) {
|
1133
1184
|
this.config.operators = []
|
@@ -1390,34 +1441,7 @@ class Config {
|
|
1390
1441
|
}
|
1391
1442
|
|
1392
1443
|
if (config) {
|
1393
|
-
|
1394
|
-
'hierarchy',
|
1395
|
-
'objects',
|
1396
|
-
'bridges',
|
1397
|
-
'operators',
|
1398
|
-
'words',
|
1399
|
-
'priorities',
|
1400
|
-
'contextual_priorities',
|
1401
|
-
'associations',
|
1402
|
-
'name',
|
1403
|
-
'version',
|
1404
|
-
'generators',
|
1405
|
-
'semantics',
|
1406
|
-
'floaters',
|
1407
|
-
'debug',
|
1408
|
-
|
1409
|
-
// TODO Fix these from the test app
|
1410
|
-
'implicits',
|
1411
|
-
'convolution',
|
1412
|
-
'expected_generated',
|
1413
|
-
'expected_results',
|
1414
|
-
'skipSemantics',
|
1415
|
-
'description',
|
1416
|
-
'contexts',
|
1417
|
-
'utterances',
|
1418
|
-
'flatten',
|
1419
|
-
]
|
1420
|
-
helpers.validProps(valid, config, 'config')
|
1444
|
+
validConfigProps(config)
|
1421
1445
|
|
1422
1446
|
config.operators = config.operators || []
|
1423
1447
|
config.bridges = config.bridges || []
|
@@ -1500,7 +1524,6 @@ class Config {
|
|
1500
1524
|
if (config) {
|
1501
1525
|
this.name = config.name
|
1502
1526
|
}
|
1503
|
-
this.motivations = []
|
1504
1527
|
this.loadOrder = new DigraphInternal()
|
1505
1528
|
this.wasInitialized = false
|
1506
1529
|
this.configs = []
|
@@ -1654,40 +1677,6 @@ class Config {
|
|
1654
1677
|
// this.valid() init was not run because the kms are not all setup yet
|
1655
1678
|
}
|
1656
1679
|
|
1657
|
-
// motivation === { match, apply, uuid }
|
1658
|
-
addMotivation (motivation) {
|
1659
|
-
if (!motivation.uuid) {
|
1660
|
-
motivation.uuid = this.uuid
|
1661
|
-
}
|
1662
|
-
this.motivations.push(motivation)
|
1663
|
-
}
|
1664
|
-
|
1665
|
-
resetMotivations () {
|
1666
|
-
this.motivations = []
|
1667
|
-
}
|
1668
|
-
|
1669
|
-
doMotivations (args, context) {
|
1670
|
-
args = Object.assign({}, args, { context, api: this.api })
|
1671
|
-
// console.log('src/config doMotivations this.uuid', this.uuid)
|
1672
|
-
// args.objects = args.getObjects(this.uuid)
|
1673
|
-
const motivations = this.motivations
|
1674
|
-
this.motivations = []
|
1675
|
-
let done = false
|
1676
|
-
for (const motivation of motivations) {
|
1677
|
-
args.objects = args.getObjects(motivation.uuid)
|
1678
|
-
if (!done && motivation.match(args)) {
|
1679
|
-
motivation.apply(args)
|
1680
|
-
if (args.context.controlKeepMotivation || motivation.repeat) {
|
1681
|
-
this.motivations.push(motivation)
|
1682
|
-
}
|
1683
|
-
done = true
|
1684
|
-
} else {
|
1685
|
-
this.motivations.push(motivation)
|
1686
|
-
}
|
1687
|
-
}
|
1688
|
-
return done
|
1689
|
-
}
|
1690
|
-
|
1691
1680
|
// TODO add more details
|
1692
1681
|
equal(config) {
|
1693
1682
|
if (JSON.stringify(this.config) != JSON.stringify(config.config)) {
|
@@ -1721,7 +1710,6 @@ class Config {
|
|
1721
1710
|
cp.name = this.name
|
1722
1711
|
cp.description = this.description
|
1723
1712
|
cp.tests = this.tests
|
1724
|
-
cp.motivations = [...this.motivations]
|
1725
1713
|
cp.isModule = this.isModule
|
1726
1714
|
cp.loadedForTesting = this.loadedForTesting
|
1727
1715
|
cp.initInstances = this.initInstances.slice()
|
@@ -1924,16 +1912,6 @@ class Config {
|
|
1924
1912
|
// const baseConfig = args.baseConfig
|
1925
1913
|
const currentConfig = args.currentConfig
|
1926
1914
|
|
1927
|
-
/*
|
1928
|
-
if (currentConfig.api) {
|
1929
|
-
// currentConfig.api.objects = args.objects
|
1930
|
-
// GREG42 currentConfig.api.config = () => this
|
1931
|
-
// currentConfig.api.config = () => args.baseConfig
|
1932
|
-
// currentConfig.api.uuid = currentConfig._uuid
|
1933
|
-
}
|
1934
|
-
*/
|
1935
|
-
// this.instances.forEach( (instance) => client.processInstance(this, instance) )
|
1936
|
-
// greg55
|
1937
1915
|
if (args.isAfterApi) {
|
1938
1916
|
fn(args)
|
1939
1917
|
}
|
@@ -2103,7 +2081,6 @@ class Config {
|
|
2103
2081
|
}
|
2104
2082
|
this.config.objects.namespaced = {}
|
2105
2083
|
this.resetWasInitialized()
|
2106
|
-
this.resetMotivations()
|
2107
2084
|
|
2108
2085
|
// reorder configs base on load ordering
|
2109
2086
|
{
|
@@ -2164,7 +2141,6 @@ class Config {
|
|
2164
2141
|
uuid: config._uuid,
|
2165
2142
|
objects: namespacedObjects,
|
2166
2143
|
namespace,
|
2167
|
-
motivation: (m) => this.addMotivation(m),
|
2168
2144
|
api: config.api,
|
2169
2145
|
}))
|
2170
2146
|
|
@@ -2284,7 +2260,6 @@ class Config {
|
|
2284
2260
|
}
|
2285
2261
|
this.hierarchy.edges = this.config.hierarchy
|
2286
2262
|
}
|
2287
|
-
// this.instances.forEach((instance) => client.processInstance(this, instance))
|
2288
2263
|
}
|
2289
2264
|
|
2290
2265
|
if (reverseIt) {
|
@@ -2683,6 +2658,7 @@ class Config {
|
|
2683
2658
|
|
2684
2659
|
// TODO get rid of useOldVersion arg
|
2685
2660
|
addInternal (more, { useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps : hcps = false } = {}) {
|
2661
|
+
validConfigProps(more)
|
2686
2662
|
if (more instanceof Config) {
|
2687
2663
|
more.initialize({ force: false })
|
2688
2664
|
if (useOldVersion) {
|
@@ -2780,7 +2756,7 @@ class Config {
|
|
2780
2756
|
this.config[key].splice(iOldOne, 1)
|
2781
2757
|
break;
|
2782
2758
|
}
|
2783
|
-
}
|
2759
|
+
}
|
2784
2760
|
}
|
2785
2761
|
}
|
2786
2762
|
}
|
package/src/helpers.js
CHANGED
package/src/semantics.js
CHANGED
@@ -6,7 +6,7 @@ class Semantic {
|
|
6
6
|
// constructor ({match, apply, uuid, index, km, notes}) {
|
7
7
|
constructor (semantic) {
|
8
8
|
semantic = normalizeSemantic(semantic)
|
9
|
-
const { match, apply, uuid, index, km, notes, priority, debug, where, applyWrapped, property } = semantic
|
9
|
+
const { match, apply, uuid, index, km, notes, priority, debug, where, applyWrapped, property, oneShot, id } = semantic
|
10
10
|
this.matcher = match
|
11
11
|
this._apply = apply
|
12
12
|
this._applyWrapped = applyWrapped
|
@@ -18,6 +18,8 @@ class Semantic {
|
|
18
18
|
this.notes = notes
|
19
19
|
this.callId = debug
|
20
20
|
this.where = where
|
21
|
+
this.oneShot = oneShot
|
22
|
+
this.id = id
|
21
23
|
}
|
22
24
|
|
23
25
|
toLabel () {
|
@@ -197,6 +199,9 @@ class Semantics {
|
|
197
199
|
const log = (message) => { this.logs.push(message) }
|
198
200
|
try {
|
199
201
|
contextPrime = semantic.apply(args, context, s, log, options)
|
202
|
+
if (!contextPrime.controlKeepMotivation && semantic.oneShot) {
|
203
|
+
args.config.removeSemantic(semantic)
|
204
|
+
}
|
200
205
|
} catch( e ) {
|
201
206
|
contextPrime = null
|
202
207
|
let errorMessage
|