theprogrammablemind 8.0.0-beta.61 → 8.0.0-beta.62
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 +472 -462
- package/package.json +1 -1
- package/src/config.js +20 -0
    
        package/client.js
    CHANGED
    
    | @@ -1080,6 +1080,7 @@ const knowledgeModuleImpl = async ({ | |
| 1080 1080 | 
             
              config : configStruct,
         | 
| 1081 1081 | 
             
              api,
         | 
| 1082 1082 | 
             
              initializer,
         | 
| 1083 | 
            +
              terminator,
         | 
| 1083 1084 | 
             
              multiApiInitializer,
         | 
| 1084 1085 |  | 
| 1085 1086 | 
             
              module: moduleFromJSFile,
         | 
| @@ -1111,6 +1112,7 @@ const knowledgeModuleImpl = async ({ | |
| 1111 1112 |  | 
| 1112 1113 | 
             
              const createConfig = async () => {
         | 
| 1113 1114 | 
             
                const config = new Config(configStruct, moduleFromJSFile, _process)
         | 
| 1115 | 
            +
                config.setTerminator(terminator)
         | 
| 1114 1116 | 
             
                config.stop_auto_rebuild()
         | 
| 1115 1117 | 
             
                await config.add(...(includes || []))
         | 
| 1116 1118 | 
             
                if (api) {
         | 
| @@ -1158,547 +1160,555 @@ const knowledgeModuleImpl = async ({ | |
| 1158 1160 | 
             
              }
         | 
| 1159 1161 |  | 
| 1160 1162 | 
             
              if (isProcess) {
         | 
| 1161 | 
            -
                 | 
| 1162 | 
            -
             | 
| 1163 | 
            -
             | 
| 1163 | 
            +
                let config
         | 
| 1164 | 
            +
                try {
         | 
| 1165 | 
            +
                  const parser = new runtime.ArgumentParser({
         | 
| 1166 | 
            +
                    description: 'Entodicton knowledge module'
         | 
| 1167 | 
            +
                  })
         | 
| 1164 1168 |  | 
| 1165 | 
            -
             | 
| 1166 | 
            -
             | 
| 1167 | 
            -
             | 
| 1168 | 
            -
             | 
| 1169 | 
            -
             | 
| 1170 | 
            -
             | 
| 1171 | 
            -
             | 
| 1172 | 
            -
             | 
| 1173 | 
            -
             | 
| 1174 | 
            -
             | 
| 1175 | 
            -
             | 
| 1176 | 
            -
             | 
| 1177 | 
            -
             | 
| 1178 | 
            -
             | 
| 1179 | 
            -
             | 
| 1180 | 
            -
             | 
| 1181 | 
            -
             | 
| 1182 | 
            -
             | 
| 1183 | 
            -
             | 
| 1184 | 
            -
             | 
| 1185 | 
            -
             | 
| 1186 | 
            -
             | 
| 1187 | 
            -
             | 
| 1188 | 
            -
             | 
| 1189 | 
            -
             | 
| 1190 | 
            -
             | 
| 1191 | 
            -
             | 
| 1192 | 
            -
             | 
| 1193 | 
            -
             | 
| 1194 | 
            -
             | 
| 1195 | 
            -
             | 
| 1196 | 
            -
             | 
| 1197 | 
            -
             | 
| 1198 | 
            -
             | 
| 1199 | 
            -
             | 
| 1200 | 
            -
             | 
| 1201 | 
            -
             | 
| 1202 | 
            -
             | 
| 1203 | 
            -
             | 
| 1204 | 
            -
             | 
| 1205 | 
            -
             | 
| 1206 | 
            -
             | 
| 1207 | 
            -
             | 
| 1208 | 
            -
             | 
| 1209 | 
            -
             | 
| 1210 | 
            -
             | 
| 1211 | 
            -
             | 
| 1212 | 
            -
             | 
| 1213 | 
            -
             | 
| 1214 | 
            -
             | 
| 1215 | 
            -
             | 
| 1216 | 
            -
             | 
| 1169 | 
            +
                  const helpDebugWord = 'In order to get a debug break when a specific word is created set the DEBUG_WORD environment variable to the JSON of the association to break on. For example DEBUG_WORD=\'"the"\''
         | 
| 1170 | 
            +
                  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]]\''
         | 
| 1171 | 
            +
                  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]]\''
         | 
| 1172 | 
            +
                  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]]\''
         | 
| 1173 | 
            +
                  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}\''
         | 
| 1174 | 
            +
                  const helpDebugBridge = 'In order to get a debug break when a specific bridge is created set the DEBUG_BRIDGE environment variable to id to break on. For example DEBUG_BRIDGE=\'car\''
         | 
| 1175 | 
            +
                  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]))\''
         | 
| 1176 | 
            +
             | 
| 1177 | 
            +
                  parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
         | 
| 1178 | 
            +
                  parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
         | 
| 1179 | 
            +
                  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' })
         | 
| 1180 | 
            +
                  // parser.add_argument('-ttr', '--testToRun', { help: 'Only the specified test will be run' })
         | 
| 1181 | 
            +
                  parser.add_argument('-tva', '--testAllVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. All the tests will be run instead of stopping at first failure. Create tests by running with the --query or --loop with the --save flag. if -q is specified the tests will be run for just the specified query.' })
         | 
| 1182 | 
            +
                  parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
         | 
| 1183 | 
            +
                  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' })
         | 
| 1184 | 
            +
                  // 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.' })
         | 
| 1185 | 
            +
                  parser.add_argument('-rt', '--rebuildTemplate', { action: 'store_true', help: 'Force a template rebuild. Using optimization where if the query/config has not changed it will use the previous value. One there is a change all subsequence query/configs will be run.' })
         | 
| 1186 | 
            +
                  parser.add_argument('-rtf', '--rebuildTemplateFull', { action: 'store_true', help: 'Force a template rebuild. Skip the optimization' })
         | 
| 1187 | 
            +
                  parser.add_argument('-l', '--loop', { action: 'store_true', help: 'Run a loop so that multiply queries may be run' })
         | 
| 1188 | 
            +
                  parser.add_argument('-i', '--info', { action: 'store_true', help: 'Print meta-data for the module' })
         | 
| 1189 | 
            +
                  parser.add_argument('-v', '--vimdiff', { action: 'store_true', help: 'For failures run vimdiff' })
         | 
| 1190 | 
            +
                  parser.add_argument('-g', '--greg', { action: 'store_true', help: 'Set the server to be localhost so I can debug stuff' })
         | 
| 1191 | 
            +
                  parser.add_argument('-cl', '--checkForLoop', { nargs: '?', help: 'Check for loops in the priorities, Optional argument is list of operator keys to consider. For example [["banana", 0], ["food", 1]]' })
         | 
| 1192 | 
            +
                  parser.add_argument('-r', '--reset', { action: 'store_true', help: 'Get the server to bypass the cache and rebuild everything' })
         | 
| 1193 | 
            +
                  parser.add_argument('-q', '--query', { help: 'Run the specified query' })
         | 
| 1194 | 
            +
                  parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
         | 
| 1195 | 
            +
                  parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
         | 
| 1196 | 
            +
                  parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
         | 
| 1197 | 
            +
                  parser.add_argument('--parenthesized', { action: 'store_true', help: 'Show the generated phrases with parenthesis.' })
         | 
| 1198 | 
            +
                  parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
         | 
| 1199 | 
            +
                  parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
         | 
| 1200 | 
            +
                  parser.add_argument('-p', '--print', { help: 'Print the specified elements c === config, w === words, b === bridges, o === operators d === objects (d for data), h === hierarchy, g === generators, s === semantics, l === load t=tests ordering p === priorities a == associations j == JSON sent to server. for example --print wb' })
         | 
| 1201 | 
            +
                  parser.add_argument('-s', '--save', { action: 'store_true', help: 'When running with the --query flag this will save the current run to the test file. When running without the --query flag all tests will be run and resaved.' })
         | 
| 1202 | 
            +
                  parser.add_argument('-sd', '--saveDeveloper', { action: 'store_true', help: 'Same as -s but the query will not show up in the info command.' })
         | 
| 1203 | 
            +
                  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 ' })
         | 
| 1204 | 
            +
                  parser.add_argument('-d', '--debug', { action: 'store_true', help: 'When running with the --debug flag this set the debug flag in the config' })
         | 
| 1205 | 
            +
                  parser.add_argument('-da', '--debugAssociation', { action: 'store_true', help: helpDebugAssociation })
         | 
| 1206 | 
            +
                  parser.add_argument('-dw', '--debugWord', { action: 'store_true', help: helpDebugWord })
         | 
| 1207 | 
            +
                  parser.add_argument('-dh', '--debugHierarchy', { action: 'store_true', help: helpDebugHierarchy })
         | 
| 1208 | 
            +
                  parser.add_argument('-dp', '--debugPriority', { action: 'store_true', help: helpDebugPriority })
         | 
| 1209 | 
            +
                  parser.add_argument('-dcp', '--debugContextualPriority', { action: 'store_true', help: helpDebugContextualPriority })
         | 
| 1210 | 
            +
                  parser.add_argument('-db', '--debugBridge', { action: 'store_true', help: helpDebugBridge })
         | 
| 1211 | 
            +
                  parser.add_argument('-do', '--debugOperator', { action: 'store_true', help: helpDebugOperator })
         | 
| 1212 | 
            +
                  parser.add_argument('-ep', '--explainPriorities', { action: 'store_true', help: 'The server will return all priorities including the generated one along with an explanation of there they came from' })
         | 
| 1213 | 
            +
                  parser.add_argument('-dic', '--debugIncludeConvolutions', { nargs: '?', help: 'When running with the --debugIncludeConvolutions flag the logs will include convolutions which are somewhat annoyingly verbose. Default is false' })
         | 
| 1214 | 
            +
             | 
| 1215 | 
            +
                  const args = parser.parse_args()
         | 
| 1216 | 
            +
                  args.count = args.count || 1
         | 
| 1217 | 
            +
             | 
| 1218 | 
            +
                  if (args.rebuildTemplateFull) {
         | 
| 1219 | 
            +
                    args.rebuildTemplate = true
         | 
| 1220 | 
            +
                  }
         | 
| 1217 1221 |  | 
| 1218 | 
            -
             | 
| 1219 | 
            -
             | 
| 1220 | 
            -
             | 
| 1221 | 
            -
             | 
| 1222 | 
            +
                  // dont debug the load of the KM's if rebuild template is on since we want to debug the template rebuild not the load
         | 
| 1223 | 
            +
                  if (args.rebuildTemplate) {
         | 
| 1224 | 
            +
                    global.pauseDebugging = true
         | 
| 1225 | 
            +
                  }
         | 
| 1222 1226 |  | 
| 1223 | 
            -
             | 
| 1224 | 
            -
             | 
| 1225 | 
            -
             | 
| 1227 | 
            +
                  config = await createConfig()
         | 
| 1228 | 
            +
                  setupConfig(config)
         | 
| 1229 | 
            +
                  processResults = processResults({ config, errorHandler })
         | 
| 1226 1230 |  | 
| 1227 | 
            -
             | 
| 1228 | 
            -
             | 
| 1229 | 
            -
             | 
| 1231 | 
            +
                  if (args.rebuildTemplate) {
         | 
| 1232 | 
            +
                    global.pauseDebugging = false
         | 
| 1233 | 
            +
                  }
         | 
| 1230 1234 |  | 
| 1231 | 
            -
             | 
| 1235 | 
            +
                  // setup();
         | 
| 1232 1236 |  | 
| 1233 | 
            -
             | 
| 1234 | 
            -
             | 
| 1235 | 
            -
             | 
| 1236 | 
            -
             | 
| 1237 | 
            -
             | 
| 1238 | 
            -
             | 
| 1239 | 
            -
             | 
| 1240 | 
            -
             | 
| 1241 | 
            -
             | 
| 1242 | 
            -
             | 
| 1243 | 
            -
             | 
| 1244 | 
            -
             | 
| 1245 | 
            -
             | 
| 1246 | 
            -
             | 
| 1247 | 
            -
             | 
| 1237 | 
            +
                  if (args.parenthesized) {
         | 
| 1238 | 
            +
                    config.parenthesized = true
         | 
| 1239 | 
            +
                  }
         | 
| 1240 | 
            +
                  if (args.checkForLoop) {
         | 
| 1241 | 
            +
                    try {
         | 
| 1242 | 
            +
                      args.checkForLoop = JSON.parse(args.checkForLoop)
         | 
| 1243 | 
            +
                      const isKey = (what) => {
         | 
| 1244 | 
            +
                        if (!Array.isArray(what)) {
         | 
| 1245 | 
            +
                          return false
         | 
| 1246 | 
            +
                        }
         | 
| 1247 | 
            +
                        if (what.length !== 2) {
         | 
| 1248 | 
            +
                          return false
         | 
| 1249 | 
            +
                        }
         | 
| 1250 | 
            +
                        if (!typeof what[0] == 'string') {
         | 
| 1251 | 
            +
                          return false
         | 
| 1252 | 
            +
                        }
         | 
| 1253 | 
            +
                        if (!typeof what[1] == 'number') {
         | 
| 1254 | 
            +
                          return false
         | 
| 1255 | 
            +
                        }
         | 
| 1256 | 
            +
                        return true
         | 
| 1248 1257 | 
             
                      }
         | 
| 1249 | 
            -
                      if (! | 
| 1250 | 
            -
                         | 
| 1258 | 
            +
                      if (!Array.isArray(args.checkForLoop) || args.checkForLoop.some((value) => !isKey(value))) {
         | 
| 1259 | 
            +
                        throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
         | 
| 1251 1260 | 
             
                      }
         | 
| 1252 | 
            -
             | 
| 1253 | 
            -
                    }
         | 
| 1254 | 
            -
                    if (!Array.isArray(args.checkForLoop) || args.checkForLoop.some((value) => !isKey(value))) {
         | 
| 1261 | 
            +
                    } catch (e) {
         | 
| 1255 1262 | 
             
                      throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
         | 
| 1256 1263 | 
             
                    }
         | 
| 1257 | 
            -
                  }  | 
| 1258 | 
            -
                     | 
| 1264 | 
            +
                  } else {
         | 
| 1265 | 
            +
                    if (process.argv.includes('--checkForLoop') || process.argv.includes('-cl')) {
         | 
| 1266 | 
            +
                      args.checkForLoop = true
         | 
| 1267 | 
            +
                    }
         | 
| 1259 1268 | 
             
                  }
         | 
| 1260 | 
            -
             | 
| 1261 | 
            -
             | 
| 1262 | 
            -
                     | 
| 1269 | 
            +
                  if (args.debugAssociation) {
         | 
| 1270 | 
            +
                    console.log(helpDebugAssociation)
         | 
| 1271 | 
            +
                    runtime.process.exit(-1)
         | 
| 1272 | 
            +
                  }
         | 
| 1273 | 
            +
                  if (args.debugWord) {
         | 
| 1274 | 
            +
                    console.log(helpDebugWord)
         | 
| 1275 | 
            +
                    runtime.process.exit(-1)
         | 
| 1276 | 
            +
                  }
         | 
| 1277 | 
            +
                  if (args.debugHierarchy) {
         | 
| 1278 | 
            +
                    console.log(helpDebugHierarchy)
         | 
| 1279 | 
            +
                    runtime.process.exit(-1)
         | 
| 1280 | 
            +
                  }
         | 
| 1281 | 
            +
                  if (args.debugPriority) {
         | 
| 1282 | 
            +
                    console.log(helpDebugPriority)
         | 
| 1283 | 
            +
                    runtime.process.exit(-1)
         | 
| 1284 | 
            +
                  }
         | 
| 1285 | 
            +
                  if (args.debugBridge) {
         | 
| 1286 | 
            +
                    console.log(helpDebugBridge)
         | 
| 1287 | 
            +
                    runtime.process.exit(-1)
         | 
| 1288 | 
            +
                  }
         | 
| 1289 | 
            +
                  if (args.debugOperator) {
         | 
| 1290 | 
            +
                    console.log(helpDebugOperator)
         | 
| 1291 | 
            +
                    runtime.process.exit(-1)
         | 
| 1263 1292 | 
             
                  }
         | 
| 1264 | 
            -
                }
         | 
| 1265 | 
            -
                if (args.debugAssociation) {
         | 
| 1266 | 
            -
                  console.log(helpDebugAssociation)
         | 
| 1267 | 
            -
                  runtime.process.exit(-1)
         | 
| 1268 | 
            -
                }
         | 
| 1269 | 
            -
                if (args.debugWord) {
         | 
| 1270 | 
            -
                  console.log(helpDebugWord)
         | 
| 1271 | 
            -
                  runtime.process.exit(-1)
         | 
| 1272 | 
            -
                }
         | 
| 1273 | 
            -
                if (args.debugHierarchy) {
         | 
| 1274 | 
            -
                  console.log(helpDebugHierarchy)
         | 
| 1275 | 
            -
                  runtime.process.exit(-1)
         | 
| 1276 | 
            -
                }
         | 
| 1277 | 
            -
                if (args.debugPriority) {
         | 
| 1278 | 
            -
                  console.log(helpDebugPriority)
         | 
| 1279 | 
            -
                  runtime.process.exit(-1)
         | 
| 1280 | 
            -
                }
         | 
| 1281 | 
            -
                if (args.debugBridge) {
         | 
| 1282 | 
            -
                  console.log(helpDebugBridge)
         | 
| 1283 | 
            -
                  runtime.process.exit(-1)
         | 
| 1284 | 
            -
                }
         | 
| 1285 | 
            -
                if (args.debugOperator) {
         | 
| 1286 | 
            -
                  console.log(helpDebugOperator)
         | 
| 1287 | 
            -
                  runtime.process.exit(-1)
         | 
| 1288 | 
            -
                }
         | 
| 1289 1293 |  | 
| 1290 | 
            -
             | 
| 1291 | 
            -
             | 
| 1292 | 
            -
             | 
| 1293 | 
            -
             | 
| 1294 | 
            +
                  if (args.clean) {
         | 
| 1295 | 
            +
                    const tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
         | 
| 1296 | 
            +
                    for (const test of tests) {
         | 
| 1297 | 
            +
                      delete test.associations
         | 
| 1298 | 
            +
                    }
         | 
| 1299 | 
            +
                    writeTestFile(testConfig.name, tests)
         | 
| 1300 | 
            +
                    console.log(`Cleaned ${testConfig.name}`)
         | 
| 1301 | 
            +
                    return
         | 
| 1294 1302 | 
             
                  }
         | 
| 1295 | 
            -
                  writeTestFile(testConfig.name, tests)
         | 
| 1296 | 
            -
                  console.log(`Cleaned ${testConfig.name}`)
         | 
| 1297 | 
            -
                  return
         | 
| 1298 | 
            -
                }
         | 
| 1299 1303 |  | 
| 1300 | 
            -
             | 
| 1301 | 
            -
             | 
| 1302 | 
            -
             | 
| 1303 | 
            -
             | 
| 1304 | 
            -
             | 
| 1305 | 
            -
             | 
| 1306 | 
            -
             | 
| 1304 | 
            +
                  if (args.deleteTest) {
         | 
| 1305 | 
            +
                    let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
         | 
| 1306 | 
            +
                    tests = tests.filter((test) => test.query !== args.deleteTest)
         | 
| 1307 | 
            +
                    writeTestFile(testConfig.name, tests)
         | 
| 1308 | 
            +
                    console.log(`Remove the test for "${args.deleteTest}"`)
         | 
| 1309 | 
            +
                    return
         | 
| 1310 | 
            +
                  }
         | 
| 1307 1311 |  | 
| 1308 | 
            -
             | 
| 1309 | 
            -
             | 
| 1310 | 
            -
             | 
| 1311 | 
            -
             | 
| 1312 | 
            -
             | 
| 1313 | 
            -
             | 
| 1314 | 
            -
             | 
| 1315 | 
            -
             | 
| 1316 | 
            -
             | 
| 1317 | 
            -
             | 
| 1312 | 
            +
                  const options = { rebuild: false }
         | 
| 1313 | 
            +
                  if (args.rebuildTemplate) {
         | 
| 1314 | 
            +
                    options.rebuild = true
         | 
| 1315 | 
            +
                  }
         | 
| 1316 | 
            +
                  if (args.greg) {
         | 
| 1317 | 
            +
                    config.server('http://localhost:3000', '6804954f-e56d-471f-bbb8-08e3c54d9321')
         | 
| 1318 | 
            +
                  }
         | 
| 1319 | 
            +
                  if (args.server) {
         | 
| 1320 | 
            +
                    config.server(args.server)
         | 
| 1321 | 
            +
                  }
         | 
| 1318 1322 |  | 
| 1319 | 
            -
             | 
| 1320 | 
            -
             | 
| 1321 | 
            -
             | 
| 1323 | 
            +
                  if (args.queryParams) {
         | 
| 1324 | 
            +
                    config.setQueryParams(args.queryParams)
         | 
| 1325 | 
            +
                  }
         | 
| 1322 1326 |  | 
| 1323 | 
            -
             | 
| 1324 | 
            -
             | 
| 1325 | 
            -
             | 
| 1327 | 
            +
                  if (args.debug) {
         | 
| 1328 | 
            +
                    config.config.debug = true
         | 
| 1329 | 
            +
                  }
         | 
| 1326 1330 |  | 
| 1327 | 
            -
             | 
| 1328 | 
            -
             | 
| 1329 | 
            -
             | 
| 1331 | 
            +
                  if (args.reset) {
         | 
| 1332 | 
            +
                    config.config.skip_cache = true
         | 
| 1333 | 
            +
                  }
         | 
| 1330 1334 |  | 
| 1331 | 
            -
             | 
| 1332 | 
            -
             | 
| 1333 | 
            -
             | 
| 1335 | 
            +
                  if (args.explainPriorities) {
         | 
| 1336 | 
            +
                    config.config.explain_priorities = true
         | 
| 1337 | 
            +
                  }
         | 
| 1334 1338 |  | 
| 1335 | 
            -
             | 
| 1339 | 
            +
                  config.config.debugIncludeConvolutions = args.debugIncludeConvolutions || process.argv.includes('--debugIncludeConvolutions') || process.argv.includes('-dic')
         | 
| 1336 1340 |  | 
| 1337 | 
            -
             | 
| 1338 | 
            -
             | 
| 1339 | 
            -
             | 
| 1340 | 
            -
             | 
| 1341 | 
            -
                  }
         | 
| 1342 | 
            -
                  configPrinted = true
         | 
| 1343 | 
            -
                  if (args.print) {
         | 
| 1344 | 
            -
                    if (args.print.includes('t')) {
         | 
| 1345 | 
            -
                      console.log('Test queries')
         | 
| 1346 | 
            -
                      let counter = 0
         | 
| 1347 | 
            -
                      for (const test of config.tests) {
         | 
| 1348 | 
            -
                        console.log(`${counter} - ${test.query}`)
         | 
| 1349 | 
            -
                        counter += 1
         | 
| 1350 | 
            -
                      }
         | 
| 1351 | 
            -
                    }
         | 
| 1352 | 
            -
                    if (args.print.includes('c')) {
         | 
| 1353 | 
            -
                      const { data } = setupProcessB({ config })
         | 
| 1354 | 
            -
                      console.log('Config as sent to server')
         | 
| 1355 | 
            -
                      console.log(JSON.stringify(data, null, 2))
         | 
| 1341 | 
            +
                  let configPrinted = false
         | 
| 1342 | 
            +
                  const printConfig = () => {
         | 
| 1343 | 
            +
                    if (configPrinted) {
         | 
| 1344 | 
            +
                      return
         | 
| 1356 1345 | 
             
                    }
         | 
| 1346 | 
            +
                    configPrinted = true
         | 
| 1347 | 
            +
                    if (args.print) {
         | 
| 1348 | 
            +
                      if (args.print.includes('t')) {
         | 
| 1349 | 
            +
                        console.log('Test queries')
         | 
| 1350 | 
            +
                        let counter = 0
         | 
| 1351 | 
            +
                        for (const test of config.tests) {
         | 
| 1352 | 
            +
                          console.log(`${counter} - ${test.query}`)
         | 
| 1353 | 
            +
                          counter += 1
         | 
| 1354 | 
            +
                        }
         | 
| 1355 | 
            +
                      }
         | 
| 1356 | 
            +
                      if (args.print.includes('c')) {
         | 
| 1357 | 
            +
                        const { data } = setupProcessB({ config })
         | 
| 1358 | 
            +
                        console.log('Config as sent to server')
         | 
| 1359 | 
            +
                        console.log(JSON.stringify(data, null, 2))
         | 
| 1360 | 
            +
                      }
         | 
| 1357 1361 |  | 
| 1358 | 
            -
             | 
| 1359 | 
            -
             | 
| 1360 | 
            -
             | 
| 1361 | 
            -
             | 
| 1362 | 
            +
                      if (args.print.includes('l')) {
         | 
| 1363 | 
            +
                        console.log('Module load ordering')
         | 
| 1364 | 
            +
                        for (const km of config.configs) {
         | 
| 1365 | 
            +
                          console.log(`  ${km.name}`)
         | 
| 1366 | 
            +
                        }
         | 
| 1362 1367 | 
             
                      }
         | 
| 1363 | 
            -
             | 
| 1364 | 
            -
             | 
| 1365 | 
            -
             | 
| 1366 | 
            -
             | 
| 1367 | 
            -
             | 
| 1368 | 
            -
                         | 
| 1368 | 
            +
                      if (args.print.includes('w')) {
         | 
| 1369 | 
            +
                        // { literals: Object, patterns: Array(2), hierarchy: Array(97) }
         | 
| 1370 | 
            +
                        console.log('literals')
         | 
| 1371 | 
            +
                        for (const word in config.config.words.literals) {
         | 
| 1372 | 
            +
                          console.log('  ' + word.concat(...config.config.words.literals[word].map((def, i) => ((i > 0) ? ' '.repeat(4+word.length) : '  ') + JSON.stringify(def) + '\n')))
         | 
| 1373 | 
            +
                        }
         | 
| 1374 | 
            +
                        console.log('patterns')
         | 
| 1375 | 
            +
                        for (const pattern of config.config.words.patterns) {
         | 
| 1376 | 
            +
                          console.log('  ' + JSON.stringify(pattern))
         | 
| 1377 | 
            +
                        }
         | 
| 1369 1378 | 
             
                      }
         | 
| 1370 | 
            -
                       | 
| 1371 | 
            -
             | 
| 1372 | 
            -
             | 
| 1379 | 
            +
                      if (args.print.includes('b')) {
         | 
| 1380 | 
            +
                        for (const bridge of config.config.bridges) {
         | 
| 1381 | 
            +
                          console.log(JSON.stringify(bridge))
         | 
| 1382 | 
            +
                        }
         | 
| 1373 1383 | 
             
                      }
         | 
| 1374 | 
            -
             | 
| 1375 | 
            -
             | 
| 1376 | 
            -
             | 
| 1377 | 
            -
                         | 
| 1384 | 
            +
                      if (args.print.includes('o')) {
         | 
| 1385 | 
            +
                        for (const operator of config.config.operators) {
         | 
| 1386 | 
            +
                          console.log(JSON.stringify(operator))
         | 
| 1387 | 
            +
                        }
         | 
| 1378 1388 | 
             
                      }
         | 
| 1379 | 
            -
             | 
| 1380 | 
            -
             | 
| 1381 | 
            -
             | 
| 1382 | 
            -
                        console.log(JSON.stringify(operator))
         | 
| 1389 | 
            +
                      if (args.print.includes('j')) {
         | 
| 1390 | 
            +
                        const { data } = setupProcessB({ config })
         | 
| 1391 | 
            +
                        console.log(JSON.stringify(data, null, 2))
         | 
| 1383 1392 | 
             
                      }
         | 
| 1384 | 
            -
             | 
| 1385 | 
            -
             | 
| 1386 | 
            -
             | 
| 1387 | 
            -
             | 
| 1388 | 
            -
             | 
| 1389 | 
            -
             | 
| 1390 | 
            -
             | 
| 1391 | 
            -
             | 
| 1392 | 
            -
                      for (const property of properties) {
         | 
| 1393 | 
            -
                        console.log(`  ${property} ===============`)
         | 
| 1394 | 
            -
                        for (const association of config.config.associations[property]) {
         | 
| 1395 | 
            -
                          console.log(`  ${JSON.stringify(association)}`)
         | 
| 1393 | 
            +
                      if (args.print.includes('a')) {
         | 
| 1394 | 
            +
                        console.log('associations ================')
         | 
| 1395 | 
            +
                        const properties = ['negative', 'positive']
         | 
| 1396 | 
            +
                        for (const property of properties) {
         | 
| 1397 | 
            +
                          console.log(`  ${property} ===============`)
         | 
| 1398 | 
            +
                          for (const association of config.config.associations[property]) {
         | 
| 1399 | 
            +
                            console.log(`  ${JSON.stringify(association)}`)
         | 
| 1400 | 
            +
                          }
         | 
| 1396 1401 | 
             
                        }
         | 
| 1397 1402 | 
             
                      }
         | 
| 1398 | 
            -
             | 
| 1399 | 
            -
             | 
| 1400 | 
            -
                      console.log(JSON.stringify(config.config.objects, null, 2))
         | 
| 1401 | 
            -
                    }
         | 
| 1402 | 
            -
                    if (args.print.includes('p')) {
         | 
| 1403 | 
            -
                      for (const priority of config.config.priorities) {
         | 
| 1404 | 
            -
                        console.log(JSON.stringify(priority))
         | 
| 1403 | 
            +
                      if (args.print.includes('d')) {
         | 
| 1404 | 
            +
                        console.log(JSON.stringify(config.config.objects, null, 2))
         | 
| 1405 1405 | 
             
                      }
         | 
| 1406 | 
            -
             | 
| 1407 | 
            -
             | 
| 1408 | 
            -
             | 
| 1409 | 
            -
                         | 
| 1406 | 
            +
                      if (args.print.includes('p')) {
         | 
| 1407 | 
            +
                        for (const priority of config.config.priorities) {
         | 
| 1408 | 
            +
                          console.log(JSON.stringify(priority))
         | 
| 1409 | 
            +
                        }
         | 
| 1410 1410 | 
             
                      }
         | 
| 1411 | 
            -
             | 
| 1412 | 
            -
             | 
| 1413 | 
            -
             | 
| 1414 | 
            -
                      for (const semantic of easyToRead) {
         | 
| 1415 | 
            -
                        semantic.match = semantic.match.toString()
         | 
| 1416 | 
            -
                        semantic.apply = semantic.apply.toString()
         | 
| 1417 | 
            -
                        if (semantic.applyWrapped) {
         | 
| 1418 | 
            -
                          semantic.applyWrapped = semantic.applyWrapped.toString()
         | 
| 1411 | 
            +
                      if (args.print.includes('h')) {
         | 
| 1412 | 
            +
                        for (const edge of config.config.hierarchy) {
         | 
| 1413 | 
            +
                          console.log(JSON.stringify(edge))
         | 
| 1419 1414 | 
             
                        }
         | 
| 1420 1415 | 
             
                      }
         | 
| 1421 | 
            -
                       | 
| 1422 | 
            -
             | 
| 1423 | 
            -
             | 
| 1424 | 
            -
             | 
| 1425 | 
            -
             | 
| 1426 | 
            -
             | 
| 1427 | 
            -
             | 
| 1416 | 
            +
                      if (args.print.includes('g')) {
         | 
| 1417 | 
            +
                        const easyToRead = _.cloneDeep(config.config.generators)
         | 
| 1418 | 
            +
                        for (const semantic of easyToRead) {
         | 
| 1419 | 
            +
                          semantic.match = semantic.match.toString()
         | 
| 1420 | 
            +
                          semantic.apply = semantic.apply.toString()
         | 
| 1421 | 
            +
                          if (semantic.applyWrapped) {
         | 
| 1422 | 
            +
                            semantic.applyWrapped = semantic.applyWrapped.toString()
         | 
| 1423 | 
            +
                          }
         | 
| 1424 | 
            +
                        }
         | 
| 1425 | 
            +
                        console.dir(easyToRead)
         | 
| 1426 | 
            +
                      }
         | 
| 1427 | 
            +
                      if (args.print.includes('s')) {
         | 
| 1428 | 
            +
                        const easyToRead = _.cloneDeep(config.config.semantics)
         | 
| 1429 | 
            +
                        for (const semantic of easyToRead) {
         | 
| 1430 | 
            +
                          semantic.match = semantic.match.toString()
         | 
| 1431 | 
            +
                          semantic.apply = semantic.apply.toString()
         | 
| 1432 | 
            +
                        }
         | 
| 1433 | 
            +
                        console.dir(easyToRead)
         | 
| 1428 1434 | 
             
                      }
         | 
| 1429 | 
            -
                      console.dir(easyToRead)
         | 
| 1430 1435 | 
             
                    }
         | 
| 1431 1436 | 
             
                  }
         | 
| 1432 | 
            -
                }
         | 
| 1433 1437 |  | 
| 1434 | 
            -
             | 
| 1438 | 
            +
                  checkTemplate(template)
         | 
| 1435 1439 |  | 
| 1436 | 
            -
             | 
| 1437 | 
            -
             | 
| 1438 | 
            -
             | 
| 1439 | 
            -
             | 
| 1440 | 
            -
             | 
| 1441 | 
            -
             | 
| 1442 | 
            -
             | 
| 1443 | 
            -
             | 
| 1444 | 
            -
             | 
| 1440 | 
            +
                  if (template) {
         | 
| 1441 | 
            +
                    let needsRebuild
         | 
| 1442 | 
            +
                    if (args.rebuildTemplate && !args.rebuildTemplateFull) {
         | 
| 1443 | 
            +
                      // get the startOfChanges for the partial rebuild
         | 
| 1444 | 
            +
                      needsRebuild = config.needsRebuild(template.template, template.instance, { ...options, rebuild: false })
         | 
| 1445 | 
            +
                    } else {
         | 
| 1446 | 
            +
                      // do a check or full rebuild
         | 
| 1447 | 
            +
                      needsRebuild = config.needsRebuild(template.template, template.instance, options)
         | 
| 1448 | 
            +
                    }
         | 
| 1445 1449 |  | 
| 1446 | 
            -
             | 
| 1447 | 
            -
             | 
| 1448 | 
            -
             | 
| 1450 | 
            +
                    if (needsRebuild.needsRebuild) {
         | 
| 1451 | 
            +
                      if (needsRebuild.previousResultss) {
         | 
| 1452 | 
            +
                        console.log('Rebuild using the optimization to use previous results until a change is hit. For a full rebuild use -rtf')
         | 
| 1453 | 
            +
                      }
         | 
| 1454 | 
            +
                      console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
         | 
| 1455 | 
            +
                      options.rebuild = true
         | 
| 1456 | 
            +
                      config.config.rebuild = true
         | 
| 1457 | 
            +
                    }
         | 
| 1458 | 
            +
                    try {
         | 
| 1459 | 
            +
                      await config.load(rebuildTemplate, template.template, template.instance, { rebuild: needsRebuild.needsRebuild || options.rebuild, previousResultss: needsRebuild.previousResultss, startOfChanges: needsRebuild.startOfChanges })
         | 
| 1460 | 
            +
                    } catch (e) {
         | 
| 1461 | 
            +
                      console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
         | 
| 1462 | 
            +
                      runtime.process.exit(-1)
         | 
| 1463 | 
            +
                    }
         | 
| 1464 | 
            +
                    if (!args.query) {
         | 
| 1465 | 
            +
                      printConfig()
         | 
| 1466 | 
            +
                    }
         | 
| 1467 | 
            +
                    if (needsRebuild.needsRebuild) {
         | 
| 1468 | 
            +
                      return
         | 
| 1449 1469 | 
             
                    }
         | 
| 1450 | 
            -
                    console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
         | 
| 1451 | 
            -
                    options.rebuild = true
         | 
| 1452 | 
            -
                    config.config.rebuild = true
         | 
| 1453 1470 | 
             
                  }
         | 
| 1454 | 
            -
             | 
| 1455 | 
            -
             | 
| 1456 | 
            -
             | 
| 1457 | 
            -
                    console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
         | 
| 1458 | 
            -
                    runtime.process.exit(-1)
         | 
| 1471 | 
            +
             | 
| 1472 | 
            +
                  if (args.retrain) {
         | 
| 1473 | 
            +
                    config.config.retrain = true
         | 
| 1459 1474 | 
             
                  }
         | 
| 1460 | 
            -
             | 
| 1461 | 
            -
             | 
| 1475 | 
            +
             | 
| 1476 | 
            +
                  if (args.saveDeveloper) {
         | 
| 1477 | 
            +
                    args.save = true
         | 
| 1462 1478 | 
             
                  }
         | 
| 1463 | 
            -
                  if ( | 
| 1464 | 
            -
                     | 
| 1479 | 
            +
                  if (args.test || args.testVerbose || args.testAllVerbose || args.save) {
         | 
| 1480 | 
            +
                    global.transitoryMode = true
         | 
| 1465 1481 | 
             
                  }
         | 
| 1466 | 
            -
             | 
| 1467 | 
            -
             | 
| 1468 | 
            -
             | 
| 1469 | 
            -
                   | 
| 1470 | 
            -
             | 
| 1471 | 
            -
             | 
| 1472 | 
            -
             | 
| 1473 | 
            -
             | 
| 1474 | 
            -
             | 
| 1475 | 
            -
             | 
| 1476 | 
            -
             | 
| 1477 | 
            -
             | 
| 1478 | 
            -
             | 
| 1479 | 
            -
             | 
| 1480 | 
            -
             | 
| 1481 | 
            -
                // } else if (args.build) {
         | 
| 1482 | 
            -
                } else if (args.info) {
         | 
| 1483 | 
            -
                  showInfo(description, section, config)
         | 
| 1484 | 
            -
                } else if (args.test || args.testVerbose || args.testAllVerbose) {
         | 
| 1485 | 
            -
                  // TODO make test always a string
         | 
| 1486 | 
            -
                  if (typeof test === 'string') {
         | 
| 1487 | 
            -
                    const l = (n, hasError) => {
         | 
| 1488 | 
            -
                      if (n === 0) {
         | 
| 1489 | 
            -
                        if (hasError) {
         | 
| 1490 | 
            -
                          runtime.process.exit(-1)
         | 
| 1482 | 
            +
                  if (!args.query && !args.test && !args.info && (args.save || args.saveDeveloper)) {
         | 
| 1483 | 
            +
                    global.transitoryMode = true
         | 
| 1484 | 
            +
                    saveTests(config, test, testConfig, args.saveDeveloper)
         | 
| 1485 | 
            +
                  // } else if (args.build) {
         | 
| 1486 | 
            +
                  } else if (args.info) {
         | 
| 1487 | 
            +
                    showInfo(description, section, config)
         | 
| 1488 | 
            +
                  } else if (args.test || args.testVerbose || args.testAllVerbose) {
         | 
| 1489 | 
            +
                    // TODO make test always a string
         | 
| 1490 | 
            +
                    if (typeof test === 'string') {
         | 
| 1491 | 
            +
                      const l = async (n, hasError) => {
         | 
| 1492 | 
            +
                        if (n === 0) {
         | 
| 1493 | 
            +
                          if (hasError) {
         | 
| 1494 | 
            +
                            runtime.process.exit(-1)
         | 
| 1495 | 
            +
                          }
         | 
| 1496 | 
            +
                          return
         | 
| 1491 1497 | 
             
                        }
         | 
| 1492 | 
            -
                         | 
| 1493 | 
            -
             | 
| 1494 | 
            -
             | 
| 1495 | 
            -
             | 
| 1496 | 
            -
             | 
| 1497 | 
            -
                         | 
| 1498 | 
            -
                        test  | 
| 1499 | 
            -
             | 
| 1500 | 
            -
             | 
| 1501 | 
            -
             | 
| 1502 | 
            -
             | 
| 1503 | 
            -
             | 
| 1504 | 
            -
             | 
| 1505 | 
            -
             | 
| 1506 | 
            -
                          for (const result of results) {
         | 
| 1507 | 
            -
                            if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
         | 
| 1508 | 
            -
                              result.hasError = true
         | 
| 1509 | 
            -
                            }
         | 
| 1510 | 
            -
                            if (!args.testNoParenthesized) {
         | 
| 1511 | 
            -
                              if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
         | 
| 1498 | 
            +
                        let useTestConfig = testConfig
         | 
| 1499 | 
            +
                        if (args.testModuleName) {
         | 
| 1500 | 
            +
                          useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
         | 
| 1501 | 
            +
                          useTestConfig.testModuleName = args.testModuleName
         | 
| 1502 | 
            +
                          test = useTestConfig.name
         | 
| 1503 | 
            +
                        }
         | 
| 1504 | 
            +
                        await runTests(config, test, { args, debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
         | 
| 1505 | 
            +
                          let newError = false
         | 
| 1506 | 
            +
                          if (results.length > 0) {
         | 
| 1507 | 
            +
                            let headerShown = false
         | 
| 1508 | 
            +
             | 
| 1509 | 
            +
                            let hasError = false
         | 
| 1510 | 
            +
                            for (const result of results) {
         | 
| 1511 | 
            +
                              if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
         | 
| 1512 1512 | 
             
                                result.hasError = true
         | 
| 1513 1513 | 
             
                              }
         | 
| 1514 | 
            -
                              if ( | 
| 1514 | 
            +
                              if (!args.testNoParenthesized) {
         | 
| 1515 | 
            +
                                if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
         | 
| 1516 | 
            +
                                  result.hasError = true
         | 
| 1517 | 
            +
                                }
         | 
| 1518 | 
            +
                                if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
         | 
| 1519 | 
            +
                                  result.hasError = true
         | 
| 1520 | 
            +
                                }
         | 
| 1521 | 
            +
                              }
         | 
| 1522 | 
            +
                              if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
         | 
| 1515 1523 | 
             
                                result.hasError = true
         | 
| 1516 1524 | 
             
                              }
         | 
| 1525 | 
            +
                              if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
         | 
| 1526 | 
            +
                                result.hasError = true
         | 
| 1527 | 
            +
                              }
         | 
| 1528 | 
            +
                              if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
         | 
| 1529 | 
            +
                                result.hasError = true
         | 
| 1530 | 
            +
                              }
         | 
| 1531 | 
            +
                              if (result.hasError) {
         | 
| 1532 | 
            +
                                hasError = true
         | 
| 1533 | 
            +
                              }
         | 
| 1517 1534 | 
             
                            }
         | 
| 1518 | 
            -
                            if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
         | 
| 1519 | 
            -
                              result.hasError = true
         | 
| 1520 | 
            -
                            }
         | 
| 1521 | 
            -
                            if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
         | 
| 1522 | 
            -
                              result.hasError = true
         | 
| 1523 | 
            -
                            }
         | 
| 1524 | 
            -
                            if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
         | 
| 1525 | 
            -
                              result.hasError = true
         | 
| 1526 | 
            -
                            }
         | 
| 1527 | 
            -
                            if (result.hasError) {
         | 
| 1528 | 
            -
                              hasError = true
         | 
| 1529 | 
            -
                            }
         | 
| 1530 | 
            -
                          }
         | 
| 1531 1535 |  | 
| 1532 | 
            -
             | 
| 1533 | 
            -
             | 
| 1534 | 
            -
             | 
| 1535 | 
            -
             | 
| 1536 | 
            -
             | 
| 1537 | 
            -
             | 
| 1536 | 
            +
                            if (hasError) {
         | 
| 1537 | 
            +
                              console.log('**************************** ERRORS ************************')
         | 
| 1538 | 
            +
                              for (const result of results) {
         | 
| 1539 | 
            +
                                console.log('Utterance: ', result.utterance)
         | 
| 1540 | 
            +
                                const show = (label, expected, actual) => {
         | 
| 1541 | 
            +
                                  if (JSON.stringify(expected) !== JSON.stringify(actual)) {
         | 
| 1542 | 
            +
                                    if (!headerShown) {
         | 
| 1543 | 
            +
                                      console.log('  Failure')
         | 
| 1544 | 
            +
                                    }
         | 
| 1545 | 
            +
                                    console.log(`    expected ${label}`, expected)
         | 
| 1546 | 
            +
                                    console.log(`    actual ${label}  `, actual)
         | 
| 1547 | 
            +
                                    newError = true
         | 
| 1548 | 
            +
                                    headerShown = true
         | 
| 1549 | 
            +
                                    if (args.vimdiff) {
         | 
| 1550 | 
            +
                                      vimdiff(actual, expected, `"${result.utterance}" - ${label}`)
         | 
| 1551 | 
            +
                                    }
         | 
| 1552 | 
            +
                                    result.hasError = true
         | 
| 1553 | 
            +
                                  }
         | 
| 1554 | 
            +
                                }
         | 
| 1555 | 
            +
                                show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
         | 
| 1556 | 
            +
                                if (!args.testNoParenthesized) {
         | 
| 1557 | 
            +
                                  show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
         | 
| 1558 | 
            +
                                }
         | 
| 1559 | 
            +
                                show('responses', result.expected.responses, result.actual.responses)
         | 
| 1560 | 
            +
                                if (!args.testNoParenthesized) {
         | 
| 1561 | 
            +
                                  show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
         | 
| 1562 | 
            +
                                }
         | 
| 1563 | 
            +
                                /*
         | 
| 1564 | 
            +
                                if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
         | 
| 1538 1565 | 
             
                                  if (!headerShown) {
         | 
| 1539 1566 | 
             
                                    console.log('  Failure')
         | 
| 1540 1567 | 
             
                                  }
         | 
| 1541 | 
            -
                                  console.log( | 
| 1542 | 
            -
                                  console.log( | 
| 1568 | 
            +
                                  console.log('    expected paraphrases', result.expected.paraphrases)
         | 
| 1569 | 
            +
                                  console.log('    actual paraphrases  ', result.actual.paraphrases)
         | 
| 1543 1570 | 
             
                                  newError = true
         | 
| 1544 1571 | 
             
                                  headerShown = true
         | 
| 1545 | 
            -
                                  if (args.vimdiff) {
         | 
| 1546 | 
            -
                                    vimdiff(actual, expected, `"${result.utterance}" - ${label}`)
         | 
| 1547 | 
            -
                                  }
         | 
| 1548 | 
            -
                                  result.hasError = true
         | 
| 1549 | 
            -
                                }
         | 
| 1550 | 
            -
                              }
         | 
| 1551 | 
            -
                              show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
         | 
| 1552 | 
            -
                              if (!args.testNoParenthesized) {
         | 
| 1553 | 
            -
                                show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
         | 
| 1554 | 
            -
                              }
         | 
| 1555 | 
            -
                              show('responses', result.expected.responses, result.actual.responses)
         | 
| 1556 | 
            -
                              if (!args.testNoParenthesized) {
         | 
| 1557 | 
            -
                                show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
         | 
| 1558 | 
            -
                              }
         | 
| 1559 | 
            -
                              /*
         | 
| 1560 | 
            -
                              if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
         | 
| 1561 | 
            -
                                if (!headerShown) {
         | 
| 1562 | 
            -
                                  console.log('  Failure')
         | 
| 1563 1572 | 
             
                                }
         | 
| 1564 | 
            -
                                 | 
| 1565 | 
            -
             | 
| 1566 | 
            -
             | 
| 1567 | 
            -
             | 
| 1568 | 
            -
             | 
| 1569 | 
            -
             | 
| 1570 | 
            -
             | 
| 1571 | 
            -
                                   | 
| 1573 | 
            +
                                if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
         | 
| 1574 | 
            +
                                  if (!headerShown) {
         | 
| 1575 | 
            +
                                    console.log('  Failure')
         | 
| 1576 | 
            +
                                  }
         | 
| 1577 | 
            +
                                  console.log('    expected responses  ', result.expected.responses)
         | 
| 1578 | 
            +
                                  console.log('    actual responses    ', result.actual.responses)
         | 
| 1579 | 
            +
                                  newError = true
         | 
| 1580 | 
            +
                                  headerShown = true
         | 
| 1572 1581 | 
             
                                }
         | 
| 1573 | 
            -
                                 | 
| 1574 | 
            -
                                 | 
| 1575 | 
            -
             | 
| 1576 | 
            -
             | 
| 1577 | 
            -
             | 
| 1578 | 
            -
             | 
| 1579 | 
            -
             | 
| 1580 | 
            -
             | 
| 1581 | 
            -
                                   | 
| 1582 | 
            +
                                */
         | 
| 1583 | 
            +
                                if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
         | 
| 1584 | 
            +
                                  if (!headerShown) {
         | 
| 1585 | 
            +
                                    console.log('  Failure')
         | 
| 1586 | 
            +
                                  }
         | 
| 1587 | 
            +
                                  const widths = [4, 18, 72]
         | 
| 1588 | 
            +
                                  const lines = new Lines(widths)
         | 
| 1589 | 
            +
                                  lines.setElement(1, 1, 'expected checked objects')
         | 
| 1590 | 
            +
                                  lines.setElement(2, 2, JSON.stringify(result.expected.checked, null, 2))
         | 
| 1591 | 
            +
                                  lines.log()
         | 
| 1592 | 
            +
                                  lines.setElement(1, 1, 'actual checked objects')
         | 
| 1593 | 
            +
                                  lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
         | 
| 1594 | 
            +
                                  lines.log()
         | 
| 1595 | 
            +
                                  if (args.vimdiff) {
         | 
| 1596 | 
            +
                                    show('checked properties for objects', result.expected.checked, result.actual.checked)
         | 
| 1597 | 
            +
                                  }
         | 
| 1598 | 
            +
                                  newError = true
         | 
| 1599 | 
            +
                                  headerShown = true
         | 
| 1582 1600 | 
             
                                }
         | 
| 1583 | 
            -
                                 | 
| 1584 | 
            -
             | 
| 1585 | 
            -
             | 
| 1586 | 
            -
             | 
| 1587 | 
            -
             | 
| 1588 | 
            -
             | 
| 1589 | 
            -
             | 
| 1590 | 
            -
             | 
| 1591 | 
            -
             | 
| 1592 | 
            -
                                   | 
| 1601 | 
            +
                                if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
         | 
| 1602 | 
            +
                                  if (!headerShown) {
         | 
| 1603 | 
            +
                                    console.log('  Failure')
         | 
| 1604 | 
            +
                                  }
         | 
| 1605 | 
            +
                                  const widths = [4, 18, 72]
         | 
| 1606 | 
            +
                                  const lines = new Lines(widths)
         | 
| 1607 | 
            +
                                  lines.setElement(1, 1, 'expected checked contexts', true)
         | 
| 1608 | 
            +
                                  lines.setElement(2, 2, JSON.stringify(result.expected.checkedContexts, null, 2))
         | 
| 1609 | 
            +
                                  lines.log()
         | 
| 1610 | 
            +
                                  lines.setElement(1, 1, 'actual checked contexts', true)
         | 
| 1611 | 
            +
                                  lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
         | 
| 1612 | 
            +
                                  lines.log()
         | 
| 1613 | 
            +
                                  if (args.vimdiff) {
         | 
| 1614 | 
            +
                                    show('checked properties for context', result.expected.checkedContexts, result.actual.checkedContexts)
         | 
| 1615 | 
            +
                                  }
         | 
| 1616 | 
            +
                                  newError = true
         | 
| 1617 | 
            +
                                  headerShown = true
         | 
| 1593 1618 | 
             
                                }
         | 
| 1594 | 
            -
                                newError = true
         | 
| 1595 | 
            -
                                headerShown = true
         | 
| 1596 1619 | 
             
                              }
         | 
| 1597 | 
            -
             | 
| 1598 | 
            -
             | 
| 1599 | 
            -
             | 
| 1620 | 
            +
                            } else {
         | 
| 1621 | 
            +
                              if (results.length > 0 && args.vimdiff) {
         | 
| 1622 | 
            +
                                for (const result of results) {
         | 
| 1623 | 
            +
                                  vimdiff(result.actual, result.expected)
         | 
| 1600 1624 | 
             
                                }
         | 
| 1601 | 
            -
                                const widths = [4, 18, 72]
         | 
| 1602 | 
            -
                                const lines = new Lines(widths)
         | 
| 1603 | 
            -
                                lines.setElement(1, 1, 'expected checked contexts', true)
         | 
| 1604 | 
            -
                                lines.setElement(2, 2, JSON.stringify(result.expected.checkedContexts, null, 2))
         | 
| 1605 | 
            -
                                lines.log()
         | 
| 1606 | 
            -
                                lines.setElement(1, 1, 'actual checked contexts', true)
         | 
| 1607 | 
            -
                                lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
         | 
| 1608 | 
            -
                                lines.log()
         | 
| 1609 | 
            -
                                if (args.vimdiff) {
         | 
| 1610 | 
            -
                                  show('checked properties for context', result.expected.checkedContexts, result.actual.checkedContexts)
         | 
| 1611 | 
            -
                                }
         | 
| 1612 | 
            -
                                newError = true
         | 
| 1613 | 
            -
                                headerShown = true
         | 
| 1614 1625 | 
             
                              }
         | 
| 1615 1626 | 
             
                            }
         | 
| 1616 | 
            -
             | 
| 1617 | 
            -
             | 
| 1618 | 
            -
             | 
| 1619 | 
            -
             | 
| 1627 | 
            +
                            if (hasError) {
         | 
| 1628 | 
            +
                              if (!headerShown) {
         | 
| 1629 | 
            +
                                if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
         | 
| 1630 | 
            +
                                  console.log('There are failures due to things other than paraphrases, responses and checked properties being different. They are not shown because you ran -tv or -tva which only shows difference in paraphrase and results. Usually what I do is -s and do a diff to make sure there are no other problems. If the paraphrases or results were different they would have shown here.')
         | 
| 1631 | 
            +
                                }
         | 
| 1620 1632 | 
             
                              }
         | 
| 1621 | 
            -
                            }
         | 
| 1622 | 
            -
                          }
         | 
| 1623 | 
            -
                          if (hasError) {
         | 
| 1624 | 
            -
                            if (!headerShown) {
         | 
| 1625 1633 | 
             
                              if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
         | 
| 1626 | 
            -
                                console.log(' | 
| 1627 | 
            -
             | 
| 1628 | 
            -
             | 
| 1629 | 
            -
             | 
| 1630 | 
            -
             | 
| 1631 | 
            -
             | 
| 1632 | 
            -
             | 
| 1633 | 
            -
                              for (const result of results) {
         | 
| 1634 | 
            -
                                if (result.hasError) {
         | 
| 1635 | 
            -
                                  errorCount += 1
         | 
| 1634 | 
            +
                                console.log('use -v arg to write files expected.json and actual.json in the current directory for detailed comparison. Or do -s and then git diff the changes.')
         | 
| 1635 | 
            +
                                // console.log(JSON.stringify(contexts))
         | 
| 1636 | 
            +
                                let errorCount = 0
         | 
| 1637 | 
            +
                                for (const result of results) {
         | 
| 1638 | 
            +
                                  if (result.hasError) {
         | 
| 1639 | 
            +
                                    errorCount += 1
         | 
| 1640 | 
            +
                                  }
         | 
| 1636 1641 | 
             
                                }
         | 
| 1642 | 
            +
                                console.log(`**************************** THERE WERE ${errorCount} TEST FAILURES ************************`)
         | 
| 1637 1643 | 
             
                              }
         | 
| 1638 | 
            -
                              console.log(`**************************** THERE WERE ${errorCount} TEST FAILURES ************************`)
         | 
| 1639 1644 | 
             
                            }
         | 
| 1640 1645 | 
             
                          }
         | 
| 1641 | 
            -
             | 
| 1642 | 
            -
             | 
| 1643 | 
            -
                         | 
| 1644 | 
            -
             | 
| 1645 | 
            -
             | 
| 1646 | 
            -
             | 
| 1647 | 
            -
                         | 
| 1646 | 
            +
                          // const contexts = { failures: results }
         | 
| 1647 | 
            +
                          l(n - 1, hasError || newError)
         | 
| 1648 | 
            +
                        }).catch((error) => {
         | 
| 1649 | 
            +
                          console.error(error)
         | 
| 1650 | 
            +
                          runtime.process.exit(-1)
         | 
| 1651 | 
            +
                          errorHandler(error)
         | 
| 1652 | 
            +
                        })
         | 
| 1653 | 
            +
                      }
         | 
| 1654 | 
            +
                      await l(args.count, false)
         | 
| 1655 | 
            +
                    } else {
         | 
| 1656 | 
            +
                      test()
         | 
| 1657 | 
            +
                    }
         | 
| 1658 | 
            +
                  } else if (args.loop) {
         | 
| 1659 | 
            +
                    const readline = runtime.readline.createInterface({ input: runtime.process.stdin, output: runtime.process.stdout })
         | 
| 1660 | 
            +
                    const f = () => readline.question('Enter query? (newline to quit) ', query => {
         | 
| 1661 | 
            +
                      query = query.trim()
         | 
| 1662 | 
            +
                      if (query.length === 0) {
         | 
| 1663 | 
            +
                        return readline.close()
         | 
| 1664 | 
            +
                      }
         | 
| 1665 | 
            +
                      const promise = _process(config, query, { testsFN: test }).then((results) => {
         | 
| 1666 | 
            +
                        console.log(results.responses.join(' '))
         | 
| 1648 1667 | 
             
                      })
         | 
| 1668 | 
            +
                      if (!('then' in promise)) {
         | 
| 1669 | 
            +
                        throw new Error('Return a promise from process in the definition of knowledgeModule')
         | 
| 1670 | 
            +
                      }
         | 
| 1671 | 
            +
                      promise
         | 
| 1672 | 
            +
                        .then(() => {
         | 
| 1673 | 
            +
                          f()
         | 
| 1674 | 
            +
                        })
         | 
| 1675 | 
            +
                        .catch((e) => {
         | 
| 1676 | 
            +
                          if (e.errno == 'ECONNREFUSED') {
         | 
| 1677 | 
            +
                            console.log(e)
         | 
| 1678 | 
            +
                            readline.close()
         | 
| 1679 | 
            +
                          } else {
         | 
| 1680 | 
            +
                            console.log(e)
         | 
| 1681 | 
            +
                            f()
         | 
| 1682 | 
            +
                          }
         | 
| 1683 | 
            +
                        })
         | 
| 1684 | 
            +
                    })
         | 
| 1685 | 
            +
                    f()
         | 
| 1686 | 
            +
                  } else if (args.query) {
         | 
| 1687 | 
            +
                    let useTestConfig = testConfig
         | 
| 1688 | 
            +
                    if (args.testModuleName) {
         | 
| 1689 | 
            +
                      config.testConfig.testModuleName = args.testModuleName
         | 
| 1690 | 
            +
                      config.testConfig.checks = config.getConfigs()[args.testModuleName].getTestConfig().checks
         | 
| 1691 | 
            +
                      // useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
         | 
| 1692 | 
            +
                      // useTestConfig.testModuleName = args.testModuleName
         | 
| 1649 1693 | 
             
                    }
         | 
| 1650 | 
            -
                     | 
| 1651 | 
            -
             | 
| 1652 | 
            -
                     | 
| 1653 | 
            -
             | 
| 1654 | 
            -
                } else if (args.loop) {
         | 
| 1655 | 
            -
                  const readline = runtime.readline.createInterface({ input: runtime.process.stdin, output: runtime.process.stdout })
         | 
| 1656 | 
            -
                  const f = () => readline.question('Enter query? (newline to quit) ', query => {
         | 
| 1657 | 
            -
                    query = query.trim()
         | 
| 1658 | 
            -
                    if (query.length === 0) {
         | 
| 1659 | 
            -
                      return readline.close()
         | 
| 1694 | 
            +
                    const objects = getObjects(config.config.objects)(config.uuid)
         | 
| 1695 | 
            +
                    // for the compare
         | 
| 1696 | 
            +
                    if (args.objectDiff) {
         | 
| 1697 | 
            +
                      global.beforeObjects = _.cloneDeep(objects)
         | 
| 1660 1698 | 
             
                    }
         | 
| 1661 | 
            -
                     | 
| 1662 | 
            -
                       | 
| 1663 | 
            -
                    })
         | 
| 1664 | 
            -
             | 
| 1665 | 
            -
                      throw new Error('Return a promise from process in the definition of knowledgeModule')
         | 
| 1699 | 
            +
                    try {
         | 
| 1700 | 
            +
                      await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
         | 
| 1701 | 
            +
                    } catch (error) {
         | 
| 1702 | 
            +
                      console.log('Error', error)
         | 
| 1666 1703 | 
             
                    }
         | 
| 1667 | 
            -
                    promise
         | 
| 1668 | 
            -
                      .then(() => {
         | 
| 1669 | 
            -
                        f()
         | 
| 1670 | 
            -
                      })
         | 
| 1671 | 
            -
                      .catch((e) => {
         | 
| 1672 | 
            -
                        if (e.errno == 'ECONNREFUSED') {
         | 
| 1673 | 
            -
                          console.log(e)
         | 
| 1674 | 
            -
                          readline.close()
         | 
| 1675 | 
            -
                        } else {
         | 
| 1676 | 
            -
                          console.log(e)
         | 
| 1677 | 
            -
                          f()
         | 
| 1678 | 
            -
                        }
         | 
| 1679 | 
            -
                      })
         | 
| 1680 | 
            -
                  })
         | 
| 1681 | 
            -
                  f()
         | 
| 1682 | 
            -
                } else if (args.query) {
         | 
| 1683 | 
            -
                  let useTestConfig = testConfig
         | 
| 1684 | 
            -
                  if (args.testModuleName) {
         | 
| 1685 | 
            -
                    config.testConfig.testModuleName = args.testModuleName
         | 
| 1686 | 
            -
                    config.testConfig.checks = config.getConfigs()[args.testModuleName].getTestConfig().checks
         | 
| 1687 | 
            -
                    // useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
         | 
| 1688 | 
            -
                    // useTestConfig.testModuleName = args.testModuleName
         | 
| 1689 1704 | 
             
                  }
         | 
| 1690 | 
            -
                   | 
| 1691 | 
            -
             | 
| 1692 | 
            -
                   | 
| 1693 | 
            -
             | 
| 1694 | 
            -
             | 
| 1695 | 
            -
                  try {
         | 
| 1696 | 
            -
                    await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
         | 
| 1697 | 
            -
                  } catch (error) {
         | 
| 1698 | 
            -
                    console.log('Error', error)
         | 
| 1705 | 
            +
                  printConfig()
         | 
| 1706 | 
            +
                } finally {
         | 
| 1707 | 
            +
                  debugger
         | 
| 1708 | 
            +
                  if (config) {
         | 
| 1709 | 
            +
                    config.terminate()
         | 
| 1699 1710 | 
             
                  }
         | 
| 1700 1711 | 
             
                }
         | 
| 1701 | 
            -
                printConfig()
         | 
| 1702 1712 | 
             
              } else {
         | 
| 1703 1713 | 
             
                const initConfig = async (config) => {
         | 
| 1704 1714 | 
             
                  if (template) {
         | 
    
        package/package.json
    CHANGED
    
    
    
        package/src/config.js
    CHANGED
    
    | @@ -1807,6 +1807,24 @@ class Config { | |
| 1807 1807 | 
             
                config.words.hierarchy = hierarchyPrime
         | 
| 1808 1808 | 
             
              }
         | 
| 1809 1809 |  | 
| 1810 | 
            +
              terminate() {
         | 
| 1811 | 
            +
                this.configs.forEach((km) => {
         | 
| 1812 | 
            +
                  const config = km.config
         | 
| 1813 | 
            +
                  debugger
         | 
| 1814 | 
            +
                  if (!config.terminatorFn) {
         | 
| 1815 | 
            +
                    this.terminatorFn(this)
         | 
| 1816 | 
            +
                  } else {
         | 
| 1817 | 
            +
                    config.terminatorFn(this)
         | 
| 1818 | 
            +
                  }
         | 
| 1819 | 
            +
                })
         | 
| 1820 | 
            +
              }
         | 
| 1821 | 
            +
             | 
| 1822 | 
            +
              setTerminator(terminatorFn) {
         | 
| 1823 | 
            +
                if (terminatorFn) {
         | 
| 1824 | 
            +
                  this.terminatorFn = terminatorFn
         | 
| 1825 | 
            +
                }
         | 
| 1826 | 
            +
              }
         | 
| 1827 | 
            +
             | 
| 1810 1828 | 
             
              // configs = [ { config, namespace } ... ]
         | 
| 1811 1829 | 
             
              constructor (config, module, clientProcess) {
         | 
| 1812 1830 | 
             
                if (config instanceof Config) {
         | 
| @@ -1873,6 +1891,7 @@ class Config { | |
| 1873 1891 | 
             
                    currentConfig.wasInitialized = true
         | 
| 1874 1892 | 
             
                  }
         | 
| 1875 1893 | 
             
                }
         | 
| 1894 | 
            +
                this.terminatorFn = () => {}
         | 
| 1876 1895 | 
             
                if (config) {
         | 
| 1877 1896 | 
             
                  this.name = config.name
         | 
| 1878 1897 | 
             
                }
         | 
| @@ -2080,6 +2099,7 @@ class Config { | |
| 2080 2099 | 
             
                cp._uuid = cp.configs[0]._uuid
         | 
| 2081 2100 | 
             
                // update uuid here set the uuid in the objects and add error checking
         | 
| 2082 2101 | 
             
                cp.initializerFn = this.initializerFn
         | 
| 2102 | 
            +
                cp.terminatorFn = this.terminatorFn
         | 
| 2083 2103 | 
             
                // cp._api = _.cloneDeep(this._api)
         | 
| 2084 2104 | 
             
                if (this._apiConstructor) {
         | 
| 2085 2105 | 
             
                  cp._api = this._apiConstructor(cp)
         |